jhdf-2.9/0000755000175000017500000000000012057622651013167 5ustar sylvestresylvestrejhdf-2.9/bin/0000755000175000017500000000000012051203650013723 5ustar sylvestresylvestrejhdf-2.9/bin/hdfview.sh.in0000755000175000017500000000474112050301077016332 0ustar sylvestresylvestre#!/bin/sh # Set up default variable values if not supplied by the user. # where the HDFView is installed, e.g. /home/user1/hdfview HDFJAVA=@JH45INST@ export HDFJAVA # where Java is installed (requires jdk1.4.x or above), e.g. /usr/jdk1.4.2/bin JAVAHOME=@JAVABIN@ export JAVAHOME ############################################################################### # DO NOT MODIFY BELOW THIS LINE ############################################################################### CPATH=$HDFJAVA"/lib/jhdf.jar:"$HDFJAVA"/lib/jhdf5.jar:"$HDFJAVA"/lib/jhdfobj.jar" CPATH=$CPATH":"$HDFJAVA"/lib/netcdf.jar:"$HDFJAVA"/lib/fits.jar:"$HDFJAVA"/lib/h5srb.jar" CPATH=$CPATH":"$HDFJAVA"/lib/jhdf4obj.jar:"$HDFJAVA"/lib/jhdf5obj.jar:"$HDFJAVA"/lib/jhdfview.jar" CPATH=$CPATH":"$HDFJAVA"/lib/jgraph.jar:"$HDFJAVA"/lib/ext/*" TEST=/usr/bin/test if [ ! -x /usr/bin/test ] then TEST=`which test` fi if [ ! -d $JAVAHOME ]; then JAVALOC=`which java` LASTSLASH=`perl -e "print rindex(\"${JAVALOC}\", '/')"` JAVAHOME=`perl -e "print substr(\"${JAVALOC}\", 0, $LASTSLASH)"` fi if $TEST -z "$CLASSPATH"; then CLASSPATH="" fi CLASSPATH=$CPATH":"$CLASSPATH export CLASSPATH if $TEST -n "$JAVAHOME" ; then PATH=$JAVAHOME":"$PATH export PATH fi if $TEST -e /bin/uname; then os_name=`/bin/uname -s` elif $TEST -e /usr/bin/uname; then os_name=`/usr/bin/uname -s` else os_name=unknown fi if $TEST -z "$LD_LIBRARY_PATH" ; then LD_LIBRARY_PATH="" fi case $os_name in SunOS) LD_LIBRARY_PATH=$HDFJAVA/lib/solaris:$HDFJAVA/lib/ext:$LD_LIBRARY_PATH ;; Linux) LD_LIBRARY_PATH=$HDFJAVA"/lib/linux:"$HDFJAVA"/lib/ext:"$LD_LIBRARY_PATH ;; IRIX*) OSREV=`/bin/uname -r` LD_LIBRARY_PATH=$HDFJAVA"/lib/irix-6.5:"$HDFJAVA"/lib/ext:"$LD_LIBRARY_PATH LD_LIBRARYN32_PATH=$HDFJAVA"/lib/irix-6.5:"$HDFJAVA"/lib/ext":$LD_LIBRARY_PATH export LD_LIBRARYN32_PATH ;; OSF1) LD_LIBRARY_PATH=$HDFJAVA"/lib/alpha:"$HDFJAVA"/lib/ext:"$LD_LIBRARY_PATH ;; AIX) LD_LIBRARY_PATH=$HDFJAVA"/lib/aix:"$HDFJAVA"/lib/ext:"$LD_LIBRARY_PATH ;; Darwin) DYLD_LIBRARY_PATH=$HDFJAVA"/lib/macosx:"$HDFJAVA"/lib/ext:"$DYLD_LIBRARY_PATH export DYLD_LIBRARY_PATH LD_LIBRARY_PATH=$DYLD_LIBRARY_PATH ;; FreeBSD) LD_LIBRARY_PATH=$HDFJAVA"/lib/freebsd:"$HDFJAVA"/lib/ext:"$LD_LIBRARY_PATH ;; *) echo "Unknown Operating System: HDFView may not work correctly" ;; esac export LD_LIBRARY_PATH $JAVAHOME/java @JAVAX@ -Djava.library.path=$LD_LIBRARY_PATH ncsa.hdf.view.HDFView -root $HDFJAVA $* jhdf-2.9/bin/hdfview.bat0000755000175000017500000000533712050301077016063 0ustar sylvestresylvestre@ECHO OFF rem Copyright by The HDF Group. rem Copyright by the Board of Trustees of the University of Illinois. rem All rights reserved. rem rem This file is part of HDF-JAVA. The full HDF-JAVA copyright notice, including rem terms governing use, modification, and redistribution, is contained in rem the files COPYING and Copyright.html. COPYING can be found at the root rem of the source code distribution tree; Copyright.html can be found at the rem root level of an installed copy of the electronic HDF-JAVA document set and rem is linked from the top-level documents page. It can also be found at rem http://hdfgroup.org/HDF-JAVA/doc/Copyright.html. If you do not have rem access to either file, you may request a copy from helphdfgroup.org. rem File Name: hdfview.bat rem This batch file is used to execute the hdfview utility rem setlocal enabledelayedexpansion pushd %~dp0 set nerrors=0 if "%1"=="/?" goto help goto main rem Print a help message :help echo.Executes HDFVIEW echo. echo.Usage: %~nx0 [OPTION] echo. echo. /? Help Information exit /b 0 rem Parse through the parameters sent to file, and set appropriate variables :parse_params for %%a in (%*) do ( if "%%a"=="/?" ( rem Set errorlevel 1 and send to help call :help exit /b 1 ) ) exit /b 0 rem Setup our environment :setup echo.Setting environment if !%JAVAHOME%!"\bin\java.exe"=="\bin\java.exe" ( echo.%JAVAHOME%\bin\java.exe not found, echo.please check your java home directory. goto error ) set java_run=%JAVAHOME%\bin\java.exe set INSTALLDIR=%CD% set CLASSPATH=%INSTALLDIR%\*;%INSTALLDIR%\ext\* set PATH=%INSTALLDIR%;%INSTALLDIR%\ext exit /b 0 rem Handle errors :error rem For now, our error handling consists of setting nerrors and quitting echo.HDF check failed. set /a nerrors=%nerrors%+1 goto end rem We'll never really get here, but we keep this line for consistency. exit /b rem This is where the magic happens :main call :parse_params %* if %errorlevel% neq 0 ( if %errorlevel% equ 1 ( rem This isn't an error case-- this means /? was specified. Simply rem quit. goto end ) else ( rem Error case. echo.Error parsing parameters! goto error ) ) call :setup if %errorlevel% neq 0 ( echo.Error setting up build environment. goto error ) if "%nerrors%"=="0" ( %JAVAHOME%\bin\java -Xmx1024m -Djava.library.path=%PATH% -Dhdfview.root=%INSTALLDIR% -classpath %CLASSPATH% ncsa.hdf.view.HDFView -root %INSTALLDIR% ) rem Fall through to end :end popd endlocal & exit /b %nerrors% jhdf-2.9/CMakeLists.txt0000644000175000017500000005604412050301103015713 0ustar sylvestresylvestrecmake_minimum_required(VERSION 2.8.6) PROJECT ( HDFJAVA C Java ) #----------------------------------------------------------------------------- # Instructions for use : Normal Build # # For standard build of HDFJAVA libraries,tests and tools. # Run cmake using the HDFJAVA source tree to generate a build tree. # Enable/Disable options according to requirements and # set CMAKE_INSTALL_PREFIX to the required install path. # Make install can be used to install all components for system-wide use. # #----------------------------------------------------------------------------- # Instructions for use : Sub-Project Build # # To include HDFJAVA as a sub-project within another project. # Set HDFJAVA_EXTERNALLY_CONFIGURED to 1 in the parent project and # supply values for the following variables... # # HDFJAVA_EXPORTED_TARGETS : # Set this to the name of the targets variable which controls exports # If unset (because parent project does not support/use the # INSTALL (EXPORT target...) syntax), then targets are not configured # for export during install. # # HDFJAVA_LIB_DEPENDENCIES : # If the build of HDFJAVA libs is being customized, then rules for the # dependencies of the HDFJAVA libs may be 'incomplete', add additional # dependencies to this variable so that external projects pick them up # # HDFJAVA_EXTERNAL_LIB_PREFIX : # If the parent project needs to install hdf libraries, but avoid # name conflicts with system versions, then a prefix may be added # to ensure that the correct versions configured are used. # #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Set the core names of all the libraries #----------------------------------------------------------------------------- SET (HDFJAVA_JNI_HDF_LIB_CORENAME "jhdf") SET (HDFJAVA_JNI_HDF5_LIB_CORENAME "jhdf5") SET (HDFJAVA_NCSA_HDF_LIB_CORENAME "jarhdf") SET (HDFJAVA_NCSA_HDF5_LIB_CORENAME "jarhdf5") SET (HDFJAVA_NCSA_OBJECT_LIB_CORENAME "jarhdfobj") SET (HDFJAVA_NCSA_FITS_LIB_CORENAME "jarfitsobj") SET (HDFJAVA_NCSA_H4_LIB_CORENAME "jarh4obj") SET (HDFJAVA_NCSA_H5_LIB_CORENAME "jarh5obj") SET (HDFJAVA_NCSA_NC2_LIB_CORENAME "jarnc2obj") SET (HDFJAVA_TEST_HDF5_LIB_CORENAME "jartest5") SET (HDFJAVA_TEST_OBJECT_LIB_CORENAME "jartestobj") SET (HDFJAVA_TEST_UITEST_CORENAME "jaruitest") SET (HDFJAVA_NCSA_VIEW_LIB_CORENAME "jhdfview") #----------------------------------------------------------------------------- # Set the true names of all the libraries if customized by external project #----------------------------------------------------------------------------- SET (HDFJAVA_JNI_HDF_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_JNI_HDF_LIB_CORENAME}") SET (HDFJAVA_JNI_HDF5_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_JNI_HDF5_LIB_CORENAME}") SET (HDFJAVA_NCSA_HDF_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_NCSA_HDF_LIB_CORENAME}") SET (HDFJAVA_NCSA_HDF5_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_NCSA_HDF5_LIB_CORENAME}") SET (HDFJAVA_NCSA_OBJECT_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_NCSA_OBJECT_LIB_CORENAME}") SET (HDFJAVA_NCSA_FITS_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_NCSA_FITS_LIB_CORENAME}") SET (HDFJAVA_NCSA_H4_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_NCSA_H4_LIB_CORENAME}") SET (HDFJAVA_NCSA_H5_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_NCSA_H5_LIB_CORENAME}") SET (HDFJAVA_NCSA_NC2_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_NCSA_NC2_LIB_CORENAME}") SET (HDFJAVA_TEST_HDF5_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_TEST_HDF5_LIB_CORENAME}") SET (HDFJAVA_TEST_OBJECT_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_TEST_OBJECT_LIB_CORENAME}") SET (HDFJAVA_TEST_UITEST_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_TEST_UITEST_CORENAME}") SET (HDFJAVA_NCSA_VIEW_LIB_NAME "${HDFJAVA_EXTERNAL_LIB_PREFIX}${HDFJAVA_NCSA_VIEW_LIB_CORENAME}") #----------------------------------------------------------------------------- # Set the target names of all the libraries #----------------------------------------------------------------------------- SET (HDFJAVA_JNI_HDF_LIB_TARGET ${HDFJAVA_JNI_HDF_LIB_CORENAME}) SET (HDFJAVA_JNI_HDF5_LIB_TARGET ${HDFJAVA_JNI_HDF5_LIB_CORENAME}) SET (HDFJAVA_NCSA_HDF_LIB_TARGET ${HDFJAVA_NCSA_HDF_LIB_CORENAME}) SET (HDFJAVA_NCSA_HDF5_LIB_TARGET ${HDFJAVA_NCSA_HDF5_LIB_CORENAME}) SET (HDFJAVA_NCSA_OBJECT_LIB_TARGET ${HDFJAVA_NCSA_OBJECT_LIB_CORENAME}) SET (HDFJAVA_NCSA_FITS_LIB_TARGET ${HDFJAVA_NCSA_FITS_LIB_CORENAME}) SET (HDFJAVA_NCSA_H4_LIB_TARGET ${HDFJAVA_NCSA_H4_LIB_CORENAME}) SET (HDFJAVA_NCSA_H5_LIB_TARGET ${HDFJAVA_NCSA_H5_LIB_CORENAME}) SET (HDFJAVA_NCSA_NC2_LIB_TARGET ${HDFJAVA_NCSA_NC2_LIB_CORENAME}) SET (HDFJAVA_TEST_HDF5_LIB_TARGET ${HDFJAVA_TEST_HDF5_LIB_CORENAME}) SET (HDFJAVA_TEST_OBJECT_LIB_TARGET ${HDFJAVA_TEST_OBJECT_LIB_CORENAME}) SET (HDFJAVA_TEST_UITEST_TARGET ${HDFJAVA_TEST_UITEST_CORENAME}) SET (HDFJAVA_NCSA_VIEW_LIB_TARGET ${HDFJAVA_NCSA_VIEW_LIB_CORENAME}) #----------------------------------------------------------------------------- # Define some CMake variables for use later in the project #----------------------------------------------------------------------------- SET (HDFJAVA_RESOURCES_DIR ${HDFJAVA_SOURCE_DIR}/config/cmake) SET (HDFJAVA_JNI_SRC_DIR ${HDFJAVA_SOURCE_DIR}/native) SET (HDFJAVA_JAVA_SRC_DIR ${HDFJAVA_SOURCE_DIR}/ncsa/hdf) SET (HDFJAVA_JAVA_OBJECT_SRC_DIR ${HDFJAVA_SOURCE_DIR}/ncsa/hdf/object) SET (HDFJAVA_TEST_SRC_DIR ${HDFJAVA_SOURCE_DIR}/test) SET (HDFJAVA_EXAMPLES_SOURCE_DIR ${HDFJAVA_SOURCE_DIR}/examples) SET (HDFJAVA_LIB_DIR ${HDFJAVA_SOURCE_DIR}/lib) IF (NOT HJAVA_INSTALL_BIN_DIR) SET (HJAVA_INSTALL_BIN_DIR bin) ENDIF (NOT HJAVA_INSTALL_BIN_DIR) IF (NOT HJAVA_INSTALL_LIB_DIR) SET (HJAVA_INSTALL_LIB_DIR lib) ENDIF (NOT HJAVA_INSTALL_LIB_DIR) IF (NOT HJAVA_INSTALL_INCLUDE_DIR) SET (HJAVA_INSTALL_INCLUDE_DIR include) ENDIF (NOT HJAVA_INSTALL_INCLUDE_DIR) IF (NOT HJAVA_INSTALL_DATA_DIR) IF (NOT WIN32) SET (HJAVA_INSTALL_DATA_DIR share) SET (HJAVA_INSTALL_CMAKE_DIR share/cmake) ELSE (NOT WIN32) SET (HJAVA_INSTALL_DATA_DIR ".") SET (HJAVA_INSTALL_CMAKE_DIR cmake) ENDIF (NOT WIN32) ENDIF (NOT HJAVA_INSTALL_DATA_DIR) #----------------------------------------------------------------------------- # parse the full version number from hjava.h and include in HJAVA_VERS_INFO #----------------------------------------------------------------------------- FILE (READ ${HDFJAVA_SOURCE_DIR}/VERSION _hjava_version_contents) STRING (REGEX REPLACE ".*VERSION=hdf-java-([0-9]*.[0-9]*).*$" "\\1" HJAVA_FULL_VERSION ${_hjava_version_contents}) STRING (REGEX REPLACE ".*VERSION=hdf-java-([0-9]*).*$" "\\1" HJAVA_VERS_MAJOR ${_hjava_version_contents}) STRING (REGEX REPLACE ".*VERSION=hdf-java-[0-9]*.([0-9]*).*$" "\\1" HJAVA_VERS_MINOR ${_hjava_version_contents}) #STRING (REGEX REPLACE ".*#define[ \t]+HJAVA_LIBVER_RELEASE[ \t]+([0-9]*).*$" # "\\1" HJAVA_VERS_RELEASE ${_hjava_version_contents}) #MESSAGE (STATUS "VERSION: ${HJAVA_FULL_VERSION}") #MESSAGE (STATUS "VERSION MAJOR: ${HJAVA_VERS_MAJOR}") #MESSAGE (STATUS "VERSION MINOR: ${HJAVA_VERS_MINOR}") #SET (HJAVA_VERS_MAJOR 2) #SET (HJAVA_VERS_MAJOR 7) SET (HJAVA_VERS_RELEASE 0) #----------------------------------------------------------------------------- # Basic HDFJAVA stuff here #----------------------------------------------------------------------------- SET (HDFJAVA_PACKAGE "hdf-java") SET (HDFJAVA_PACKAGE_NAME "HDF-JAVA") SET (HDFJAVA_PACKAGE_VERSION "${HJAVA_VERS_MAJOR}.${HJAVA_VERS_MINOR}.${HJAVA_VERS_RELEASE}") SET (HDFJAVA_PACKAGE_VERSION_MAJOR "${HJAVA_VERS_MAJOR}") SET (HDFJAVA_PACKAGE_VERSION_MINOR "${HJAVA_VERS_MINOR}") SET (HDFJAVA_PACKAGE_STRING "${HDFJAVA_PACKAGE_NAME}") SET (HDFJAVA_PACKAGE_TARNAME "hdf-java") SET (HDFJAVA_PACKAGE_URL "http://www.hdfgroup.org/hdfjava") SET (HDFJAVA_PACKAGE_BUGREPORT "help@hdfgroup.org") #----------------------------------------------------------------------------- # Set Install folder value #----------------------------------------------------------------------------- IF (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) IF(CMAKE_HOST_UNIX) SET(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "Install path prefix, prepended onto install directories." FORCE) ELSE(CMAKE_HOST_UNIX) GetDefaultWindowsPrefixBase(CMAKE_GENERIC_PROGRAM_FILES) SET(CMAKE_INSTALL_PREFIX "${CMAKE_GENERIC_PROGRAM_FILES}/HDF_Group/${HDFJAVA_PACKAGE_NAME}/${HDFJAVA_PACKAGE_VERSION}" CACHE PATH "Install path prefix, prepended onto install directories." FORCE) SET(CMAKE_GENERIC_PROGRAM_FILES) ENDIF(CMAKE_HOST_UNIX) ENDIF (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) FIND_PACKAGE(Java) #----------------------------------------------------------------------------- # Include some macros for reusable code #----------------------------------------------------------------------------- SET (CMAKE_MODULE_PATH ${HDFJAVA_RESOURCES_DIR}) INCLUDE (${HDFJAVA_RESOURCES_DIR}/UseJava.cmake) INCLUDE (${HDFJAVA_RESOURCES_DIR}/HDFMacros.cmake) INCLUDE (${HDFJAVA_RESOURCES_DIR}/HDF45Macros.cmake) INCLUDE (${HDFJAVA_RESOURCES_DIR}/HDFJavaMacros.cmake) #----------------------------------------------------------------------------- # Setup output Directories #----------------------------------------------------------------------------- IF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all Executables." ) SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all Libraries" ) SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all static libraries." ) SET (CMAKE_JAVA_TARGET_OUTPUT_DIR ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all java jars." ) ELSE (NOT HDFJAVA_EXTERNALLY_CONFIGURED) # if we are externally configured, but the project uses old cmake scripts # this may not be set and utilities like Hdetect will fail IF (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) ENDIF (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) ENDIF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) #----------------------------------------------------------------------------- # Targets built within this project are exported at Install time for use # by other projects using FindHDFJAVA. #----------------------------------------------------------------------------- IF (NOT HDFJAVA_EXPORTED_TARGETS) SET (HDFJAVA_EXPORTED_TARGETS "HDFJAVA-targets") ENDIF (NOT HDFJAVA_EXPORTED_TARGETS) #----------------------------------------------------------------------------- # To include a library in the list exported by the project AT BUILD TIME, # add it to this variable. This is NOT used by Make Install, but for projects # which include HDFJAVA as a sub-project within their build tree #----------------------------------------------------------------------------- SET_GLOBAL_VARIABLE (HDFJAVA_LIBRARIES_TO_EXPORT "") SET_GLOBAL_VARIABLE (HDFJAVA_JARS_TO_EXPORT "") SET_GLOBAL_VARIABLE (HDFJAVA_HDFVIEWJAR_TO_EXPORT "") #----------------------------------------------------------------------------- # Run all the CMake configuration tests for our build environment #----------------------------------------------------------------------------- INCLUDE (${HDFJAVA_RESOURCES_DIR}/ConfigureChecks.cmake) #----------------------------------------------------------------------------- # Option to use code coverage #----------------------------------------------------------------------------- OPTION (HDF_ENABLE_COVERAGE "Enable code coverage for Libraries and Programs" OFF) IF (HDF_ENABLE_COVERAGE) SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage") SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage") SET (LDFLAGS "${LDFLAGS} -fprofile-arcs -ftest-coverage") ENDIF (HDF_ENABLE_COVERAGE) #----------------------------------------------------------------------------- # Include the main src and config directories #----------------------------------------------------------------------------- SET (HDFJAVA_INCLUDE_DIRECTORIES ${HDFJAVA_JNI_SRC_DIR}/hdflib ${HDFJAVA_JNI_SRC_DIR}/hdf5lib ${HDFJAVA_BINARY_DIR} ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2} ) INCLUDE_DIRECTORIES (${HDFJAVA_INCLUDE_DIRECTORIES}) SET (CMAKE_JAVA_INCLUDE_PATH "") SET (HDFVIEW_OPTIONS_INCLUDE_PATH "") SET (MAKE_SYSTEM) IF (CMAKE_BUILD_TOOL MATCHES "make") SET (MAKE_SYSTEM 1) ENDIF (CMAKE_BUILD_TOOL MATCHES "make") SET (CFG_INIT "/${CMAKE_CFG_INTDIR}") IF (MAKE_SYSTEM) SET (CFG_INIT "") ENDIF (MAKE_SYSTEM) #----------------------------------------------------------------------------- # Build utility to copy and strip X lines of file #----------------------------------------------------------------------------- IF (HDF_BUILD_EXAMPLES AND BUILD_TESTING) SET (XLATE_UTILITY "xlatefile") ADD_EXECUTABLE(${XLATE_UTILITY} ${HDFJAVA_RESOURCES_DIR}/xlatefile.c) ENDIF (HDF_BUILD_EXAMPLES AND BUILD_TESTING) #----------------------------------------------------------------------------- # Dashboard and Testing Settings #----------------------------------------------------------------------------- OPTION (BUILD_TESTING "Build HDFJAVA Unit Testing" OFF) IF (BUILD_TESTING) SET (DART_TESTING_TIMEOUT 1200 CACHE INTEGER "Timeout in seconds for each test (default 1200=20minutes)" ) ENABLE_TESTING () INCLUDE (CTest) INCLUDE (${HDFJAVA_SOURCE_DIR}/CTestConfig.cmake) CONFIGURE_FILE (${HDFJAVA_RESOURCES_DIR}/CTestCustom.cmake ${HDFJAVA_BINARY_DIR}/CTestCustom.ctest @ONLY) ENDIF (BUILD_TESTING) #----------------------------------------------------------------------------- # Add the HDFJAVA Library Target to the build #----------------------------------------------------------------------------- ADD_SUBDIRECTORY(${HDFJAVA_SOURCE_DIR}/native native) ADD_SUBDIRECTORY(${HDFJAVA_SOURCE_DIR}/ncsa ncsa) IF (BUILD_TESTING) IF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) ADD_SUBDIRECTORY(${HDFJAVA_SOURCE_DIR}/test ${PROJECT_BINARY_DIR}/test) ENDIF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) ENDIF (BUILD_TESTING) #----------------------------------------------------------------------------- # Option to build HDFJAVA Examples #----------------------------------------------------------------------------- IF (HDF_BUILD_EXAMPLES) ADD_SUBDIRECTORY(${HDFJAVA_SOURCE_DIR}/examples examples) ENDIF (HDF_BUILD_EXAMPLES) #----------------------------------------------------------------------------- # Add Required Jar(s) #----------------------------------------------------------------------------- INSTALL ( FILES ${HDFJAVA_LIB_DIR}/fits.jar ${HDFJAVA_LIB_DIR}/netcdf.jar DESTINATION ${HJAVA_INSTALL_LIB_DIR} COMPONENT libraries ) #----------------------------------------------------------------------------- # Add Required Document(s) #----------------------------------------------------------------------------- INSTALL ( DIRECTORY ${HDFJAVA_SOURCE_DIR}/docs DESTINATION ${HJAVA_INSTALL_DATA_DIR} USE_SOURCE_PERMISSIONS COMPONENT docs PATTERN ".svn" EXCLUDE ) #----------------------------------------------------------------------------- # Add Target(s) to CMake Install for import into other projects #----------------------------------------------------------------------------- IF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) INSTALL ( EXPORT ${HDFJAVA_EXPORTED_TARGETS} DESTINATION ${HJAVA_INSTALL_CMAKE_DIR}/${HDFJAVA_PACKAGE} FILE ${HDFJAVA_PACKAGE}${HDF_PACKAGE_EXT}-targets.cmake ) ENDIF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) #----------------------------------------------------------------------------- # Export all exported targets to the build tree for use by parent project #----------------------------------------------------------------------------- IF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) EXPORT ( TARGETS ${HDFJAVA_LIBRARIES_TO_EXPORT} ${HDFJAVA_LIB_DEPENDENCIES} FILE ${HDFJAVA_PACKAGE}${HDF_PACKAGE_EXT}-targets.cmake ) ENDIF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) #----------------------------------------------------------------------------- # Configure the HDFJAVA-config.cmake file for the build directory #----------------------------------------------------------------------------- SET (HDFJAVA_INCLUDES_BUILD_TIME ${HDFJAVA_JNI_SRC_DIR} ${HDFJAVA_JAVA_SRC_DIR} ${HDFJAVA_BINARY_DIR} ) CONFIGURE_FILE ( ${HDFJAVA_RESOURCES_DIR}/HDFJAVA-config.cmake.build.in ${HDFJAVA_BINARY_DIR}/${HDFJAVA_PACKAGE}${HDF_PACKAGE_EXT}-config.cmake @ONLY ) #----------------------------------------------------------------------------- # Configure the FindJAVA.cmake file for the install directory #----------------------------------------------------------------------------- IF (NOT H4H5_EXTERNALLY_CONFIGURED) CONFIGURE_FILE ( ${HDFJAVA_RESOURCES_DIR}/FindHDFJAVA.cmake.in ${HDFJAVA_BINARY_DIR}/CMakeFiles/FindHDFJAVA${HDF_PACKAGE_EXT}.cmake @ONLY ) INSTALL ( FILES ${HDFJAVA_BINARY_DIR}/CMakeFiles/FindHDFJAVA${HDF_PACKAGE_EXT}.cmake DESTINATION ${HDFJAVA_INSTALL_CMAKE_DIR}/${HDFJAVA_PACKAGE} COMPONENT configinstall ) ENDIF (NOT H4H5_EXTERNALLY_CONFIGURED) #----------------------------------------------------------------------------- # Configure the HDFJAVA-config.cmake file for the install directory #----------------------------------------------------------------------------- IF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) CONFIGURE_FILE ( ${HDFJAVA_RESOURCES_DIR}/HDFJAVA-config.cmake.install.in ${HDFJAVA_BINARY_DIR}/CMakeFiles/${HDFJAVA_PACKAGE}${HDF_PACKAGE_EXT}-config.cmake @ONLY ) INSTALL ( FILES ${HDFJAVA_BINARY_DIR}/CMakeFiles/${HDFJAVA_PACKAGE}${HDF_PACKAGE_EXT}-config.cmake DESTINATION ${HJAVA_INSTALL_CMAKE_DIR}/${HDFJAVA_PACKAGE} ) ENDIF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) #----------------------------------------------------------------------------- # Configure the HDFJAVA-config-version .cmake file for the install directory #----------------------------------------------------------------------------- IF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) CONFIGURE_FILE ( ${HDFJAVA_RESOURCES_DIR}/HDFJAVA-config-version.cmake.in ${HDFJAVA_BINARY_DIR}/CMakeFiles/${HDFJAVA_PACKAGE}${HDF_PACKAGE_EXT}-config-version.cmake @ONLY ) INSTALL ( FILES ${HDFJAVA_BINARY_DIR}/CMakeFiles/${HDFJAVA_PACKAGE}${HDF_PACKAGE_EXT}-config-version.cmake DESTINATION ${HJAVA_INSTALL_CMAKE_DIR}/${HDFJAVA_PACKAGE} ) ENDIF (NOT HDFJAVA_EXTERNALLY_CONFIGURED) #----------------------------------------------------------------------------- # Option to include jre #----------------------------------------------------------------------------- IF (HDFJAVA_PACK_JREFILE) INSTALL ( FILES ${HDFJAVA_PACK_JREPATH}/${HDFJAVA_PACK_JREFILE} DESTINATION ${HJAVA_INSTALL_CMAKE_DIR}/${HDFJAVA_PACKAGE}/JRE ) IF (WIN32) SET (CPACK_NSIS_EXTRA_INSTALL_COMMANDS " SetOutPath \\\"$INSTDIR\\\\bin\\\\JRE\\\" ExecWait \\\"$INSTDIR\\\\${HJAVA_INSTALL_CMAKE_DIR}\\\\${HDFJAVA_PACKAGE}\\\\JRE\\\\${HDFJAVA_PACK_JREFILE}\\\" ") SET (CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS " RMDir \\\"/r\\\" \\\"$INSTDIR\\\\bin\\\\JRE\\\" ") ENDIF (WIN32) ENDIF (HDFJAVA_PACK_JREFILE) #----------------------------------------------------------------------------- # Set the cpack variables #----------------------------------------------------------------------------- SET (CPACK_PACKAGE_VENDOR "HDF_Group") SET (CPACK_PACKAGE_DESCRIPTION_SUMMARY "HDF-JAVA Installation") SET (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/Readme.txt") SET (CPACK_PACKAGE_NAME "${HDFJAVA_PACKAGE_NAME}") SET (CPACK_PACKAGE_VERSION "${HDFJAVA_PACKAGE_VERSION}") SET (CPACK_PACKAGE_VERSION_MAJOR "${HDFJAVA_PACKAGE_VERSION_MAJOR}") SET (CPACK_PACKAGE_VERSION_MINOR "${HDFJAVA_PACKAGE_VERSION_MINOR}") SET (CPACK_PACKAGE_VERSION_PATCH "") SET (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") SET (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/Readme.txt") SET (CPACK_PACKAGE_RELOCATABLE TRUE) SET (CPACK_PACKAGE_INSTALL_DIRECTORY "${HDFJAVA_PACKAGE_STRING}") IF (WIN32) SET (CPACK_MONOLITHIC_INSTALL ON) SET (CPACK_NSIS_CONTACT "${HDFJAVA_PACKAGE_BUGREPORT}") SET (CPACK_NSIS_MODIFY_PATH ON) SET (CPACK_NSIS_PACKAGE_NAME "${HDFJAVA_PACKAGE_STRING}-${HDFJAVA_PACKAGE_VERSION}") ELSE (WIN32) SET (CPACK_PACKAGING_INSTALL_PREFIX "/usr") SET (CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE ON) SET (CPACK_DEBIAN_PACKAGE_SECTION "Science") SET (CPACK_DEBIAN_PACKAGE_MAINTAINER "${HDFJAVA_PACKAGE_BUGREPORT}") SET (CPACK_RPM_COMPONENT_INSTALL ON) SET (CPACK_RPM_PACKAGE_RELOCATABLE ON) SET (CPACK_RPM_PACKAGE_GROUP "Development/Tools") SET (CPACK_RPM_PACKAGE_LICENSE "BSD-style") SET (CPACK_RPM_PACKAGE_URL "${HDFJAVA_PACKAGE_URL}") SET (CPACK_STRIP_FILES "${HDFJAVA_LIBRARIES_TO_EXPORT};${HDFJAVA_JARS_TO_EXPORT};${HDFJAVA_HDFVIEWJAR_TO_EXPORT};${EXTERNAL_LIBRARY_LIST}") ENDIF (WIN32) SET (CPACK_NSIS_MUI_FINISHPAGE_RUN ${HDFVIEW_SCRIPT}) #INCLUDE(InstallRequiredSystemLibraries) SET (CPACK_INSTALL_CMAKE_PROJECTS "${HDFJAVA_BINARY_DIR};HDFJAVA;ALL;/") IF (HDF_PACKAGE_EXTLIBS) IF (HDF_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ") IF (JPEG_FOUND AND HDF4_USE_EXTERNAL) SET (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${JPEG_INCLUDE_DIR_GEN};JPEG;libraries;/") ENDIF (JPEG_FOUND AND HDF4_USE_EXTERNAL) IF (ZLIB_FOUND AND HDF4_USE_EXTERNAL) SET (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ZLIB_INCLUDE_DIR_GEN};ZLIB;libraries;/") ENDIF (ZLIB_FOUND AND HDF4_USE_EXTERNAL) IF (SZIP_FOUND AND HDF4_USE_EXTERNAL) SET (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SZIP_INCLUDE_DIR_GEN};SZIP;libraries;/") ENDIF (SZIP_FOUND AND HDF4_USE_EXTERNAL) IF (HDF4_FOUND AND HDF4_USE_EXTERNAL) SET (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${HDF4_INCLUDE_DIR_GEN};HDF4;libraries;/") ENDIF (HDF4_FOUND AND HDF4_USE_EXTERNAL) IF (HDF5_FOUND AND HDF5_USE_EXTERNAL) SET (CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${HDF5_INCLUDE_DIR_GEN};HDF5;libraries;/") ENDIF (HDF5_FOUND AND HDF5_USE_EXTERNAL) ENDIF (HDF_ALLOW_EXTERNAL_SUPPORT MATCHES "SVN" OR HDF_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ") ENDIF (HDF_PACKAGE_EXTLIBS) INCLUDE (CPack) #----------------------------------------------------------------------------- # Now list the cpack commands #----------------------------------------------------------------------------- CPACK_ADD_COMPONENT (apps DISPLAY_NAME "HDFJAVA Applications" DEPENDS libraries GROUP Applications ) CPACK_ADD_COMPONENT (libraries DISPLAY_NAME "HDFJAVA Libraries" GROUP Runtime ) CPACK_ADD_COMPONENT (headers DISPLAY_NAME "HDFJAVA Headers" DEPENDS libraries GROUP Development ) CPACK_ADD_COMPONENT (docs DISPLAY_NAME "HDFJAVA Documents" DEPENDS libraries GROUP Documents ) jhdf-2.9/config/0000755000175000017500000000000012051203650014420 5ustar sylvestresylvestrejhdf-2.9/config/config.guess0000755000175000017500000004763012050301076016752 0ustar sylvestresylvestre#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc. # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Written by Per Bothner . # The master version of this file is at the FSF in /home/gd/gnu/lib. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit system type (host/target name). # # Only a few systems have been added to this list; please add others # (but try to keep the structure clean). # # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@@noc.rutgers.edu 8/24/94.) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15 # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in alpha:OSF1:*:*) # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'` exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-cbm-sysv4 exit 0;; amiga:NetBSD:*:*) echo m68k-cbm-netbsd${UNAME_RELEASE} exit 0 ;; amiga:OpenBSD:*:*) echo m68k-cbm-openbsd${UNAME_RELEASE} exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; Pyramid*:OSx*:*:*|MIS*:OSx*:*:*) # akee@@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; atari*:NetBSD:*:*) echo m68k-atari-netbsd${UNAME_RELEASE} exit 0 ;; atari*:OpenBSD:*:*) echo m68k-atari-openbsd${UNAME_RELEASE} exit 0 ;; sun3*:NetBSD:*:*) echo m68k-sun-netbsd${UNAME_RELEASE} exit 0 ;; sun3*:OpenBSD:*:*) echo m68k-sun-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:NetBSD:*:*) echo m68k-apple-netbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-apple-openbsd${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) sed 's/^ //' << EOF >dummy.c int main (argc, argv) int argc; char **argv; { #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF ${CC-cc} dummy.c -o dummy \ && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && rm dummy.c dummy && exit 0 rm -f dummy.c dummy echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \ -o ${TARGET_BINARY_INTERFACE}x = x ] ; then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i?86:AIX:*:*) echo i386-ibm-aix exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then sed 's/^ //' << EOF >dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 rm -f dummy.c dummy echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:4) if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=4.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[3478]??:HP-UX:*:*) case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;; 9000/8?? ) HP_ARCH=hppa1.0 ;; esac HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) sed 's/^ //' << EOF >dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 rm -f dummy.c dummy echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i?86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*X-MP:*:*:*) echo xmp-cray-unicos exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} exit 0 ;; CRAY-2:*:*:*) echo cray2-cray-unicos exit 0 ;; F300:UNIX_System_V:*:*) FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; F301:UNIX_System_V:*:*) echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` exit 0 ;; hp3[0-9][05]:NetBSD:*:*) echo m68k-hp-netbsd${UNAME_RELEASE} exit 0 ;; hp3[0-9][05]:OpenBSD:*:*) echo m68k-hp-openbsd${UNAME_RELEASE} exit 0 ;; i?86:BSD/386:*:* | *:BSD/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:NetBSD:*:*) echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; i*:CYGWIN*:*) echo i386-pc-cygwin32 exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin32 exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. ld_help_string=`ld --help 2>&1` if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then echo "powerpc-unknown-linux-gnu" ; exit 0 elif test "${UNAME_MACHINE}" = "alpha" ; then echo alpha-unknown-linux-gnu ; exit 0 elif test "${UNAME_MACHINE}" = "sparc" ; then echo sparc-unknown-linux-gnu ; exit 0 else # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us # useful --help. Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout. test ! -d /usr/lib/ldscripts/. \ && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 # Determine whether the default compiler is a.out or elf cat >dummy.c </dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0 rm -f dummy.c dummy fi ;; # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions # are messed up and put the nodename in both sysname and nodename. i?86:DYNIX/ptx:4*:*) echo i386-sequent-sysv4 exit 0 ;; i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} fi exit 0 ;; i?86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; i?86:LynxOS:2.*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 cat >dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) printf ("vax-dec-bsd\n"); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0 rm -f dummy.c dummy # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi #echo '(Unable to guess system type)' 1>&2 exit 1 jhdf-2.9/config/config.sub0000755000175000017500000004612112050301076016407 0ustar sylvestresylvestre#! /bin/sh # Configuration validation subroutine script, version 1.1. # Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. if [ x$1 = x ] then echo Configuration name missing. 1>&2 echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 echo "or $0 ALIAS" 1>&2 echo where ALIAS is a recognized configuration type. 1>&2 exit 1 fi # First pass through any local machine types. case $1 in *local*) echo $1 exit 0 ;; *) ;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in linux-gnu*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple) os= basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \ | arme[lb] | pyramid \ | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \ | alpha | we32k | ns16k | clipper | i370 | sh \ | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \ | pdp11 | mips64el | mips64orion | mips64orionel \ | sparc | sparclet | sparclite | sparc64) basic_machine=$basic_machine-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i[3456]86) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \ | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \ | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \ | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \ | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \ | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \ | mips64el-* | mips64orion-* | mips64orionel-* | f301-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-cbm ;; amigados) basic_machine=m68k-cbm os=-amigados ;; amigaunix | amix) basic_machine=m68k-cbm os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | ymp) basic_machine=ymp-cray os=-unicos ;; cray2) basic_machine=cray2-cray os=-unicos ;; [ctj]90-cray) basic_machine=c90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; i370-ibm* | ibm*) basic_machine=i370-ibm os=-mvs ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i[3456]86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i[3456]86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i[3456]86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i[3456]86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; miniframe) basic_machine=m68000-convergent ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; np1) basic_machine=np1-gould ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5) basic_machine=i586-intel ;; pentiumpro | p6) basic_machine=i686-intel ;; pentium-* | p5-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; k5) # We don't have specific support for AMD's K5 yet, so just call it a Pentium basic_machine=i586-amd ;; nexen) # We don't have specific support for Nexgen yet, so just call it a Pentium basic_machine=i586-nexgen ;; pn) basic_machine=pn-gould ;; power) basic_machine=rs6000-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; symmetry) basic_machine=i386-sequent os=-dynix ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; xmp) basic_machine=xmp-cray os=-unicos ;; xps | xps100) basic_machine=xps100-honeywell ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. mips) basic_machine=mips-mips ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sparc) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; # Added for the case of a 64-bit architecture machine # -- Stephen Aiken 2005.08.29 x86_64-pc) basic_machine=x86_64-pc ;; # Added for the case of a 64-bit IA architecture machine # -- Peter Cao 2006.03.02 ia64-pc) basic_machine=ia64-pc ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -unixware* | svr4*) os=-sysv4 ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -linux-gnu* | -uxpv*) # Remember, each alternative MUST END IN *, to match a version number. ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -ctix* | -uts*) os=-sysv ;; -ns2 ) os=-nextstep2 ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -xenix) os=-xenix ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-semi) os=-aout ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-ibm) os=-aix ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigados ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f301-fujitsu) os=-uxpv ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -hpux*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks*) vendor=wrs ;; -aux*) vendor=apple ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os jhdf-2.9/config/Rules.mk0000644000175000017500000000612712050301076016051 0ustar sylvestresylvestre# A line that starts with a # is a comment SRCDIR=. JAVADOC_FLAGS = -version -author #make this relative to the source root... LIBDIR=$(JH45INSTALLDIR)/lib BINDIR=$(JH45INSTALLDIR)/bin DOCDIR= $(JH45INSTALLDIR)/docs UGDIR= $(JH45INSTALLDIR)/UsersGuide CLASS_DIR=$(TOP)/lib CP="$(CLASSPATH):$(CLASS_DIR):. " RM = rm -f # New suffixes .SUFFIXES: .java .class .h # Temp file for list of files to compile COMPILEME = .compileme$(USER) COPYME = .copyme$(USER) CURRENTDIR = . JAR_DIR=$(CLASS_DIR) OUT_DIR=$(CLASS_DIR)/$(DIR) JFLAGS= -g -deprecation -d $(CLASS_DIR) -classpath $(CP) RMICFLAGS= -g -d $(CLASS_DIR) JARFLAGS = cfm JAVAH = $(JAVAH) -jni RMIC = rmic $(RMICFLAGS) JC = $(JAVAC) $(JFLAGS) PACKAGE = $(subst /,.,$(DIR)) JAVA_OBJS = $(JAVA_SRCS:%.java=$(OUT_DIR)/%.class) RMI_OBJS = $(RMI_SRCS:%.java=$(OUT_DIR)/%.class) STUB_OBJS = $(RMI_OBJS:%.class=%_Stub.class) SKEL_OBJS = $(RMI_OBJS:%.class=%_Skel.class) H_FILES = $(JNI_SRCS:%.java=$(JNI_DIR)/%.h) # Notice that each line that starts with an @ is ONE LONG LINE # It may not show up or print out like that in the FAQ # Walk down the SUBDIRS first all:: @echo "subdirs is " $(SUBDIRS); \ if test "$(SUBDIRS)" != "NULL" ; then \ for i in $(SUBDIRS) ; do \ (cd $$i ; echo "making" all "in $(CURRENTDIR)/$$i"; \ $(MAKE) CURRENTDIR=$(CURRENTDIR)/$$i all); \ done \ fi # Then compile each file in each subdir all:: $(JAVA_OBJS) $(RMI_OBJS) $(JNI_OBJS) @if test -r ${COMPILEME}; then CFF=`cat ${COMPILEME}`; fi; \ $(RM) ${COMPILEME}; if test "$${CFF}" != ""; then \ echo $(JC) $${CFF}; fi; if test "$${CFF}" != ""; then \ $(JC) $${CFF}; fi @$(RM) ${COMPILEME} # "make clean" will delete all your class files to start fresh clean:: $(RM) $(OUT_DIR)/*.class *~ $(COMPILEME) $(RM) $(OUT_DIR)/*.gif *~ $(COMPILEME) $(RM) $(OUT_DIR)/*.jpg *~ $(COMPILEME) $(RM) $(OUT_DIR)/*.py *~ $(COMPILEME) # SUBDIRS clean:: @echo "2nd check: subdirs is " $(SUBDIRS); \ if test "$(SUBDIRS)" != "NULL"; then \ echo "Past the 2nd if then"; \ for i in $(SUBDIRS) ;\ do \ (cd $$i ; echo "making" clean "in $(CURRENTDIR)/$$i"; \ $(MAKE) CURRENTDIR=$(CURRENTDIR)/$$i clean); \ done \ fi clean:: @if [ "$(H_FILES)" != "/" ] && [ "$(H_FILES)" != "" ]; then \ echo $(RM) $(H_FILES); \ $(RM) $(H_FILES); \ fi @if [ "$(RMI_OBJS)" != "/" ] && [ "$(RMI_OBJS)" != "" ]; then \ echo $(RM) $(RMI_OBJS); \ $(RM) $(RMI_OBJS); \ fi @if [ "$(STUB_OBJS)" != "/" ] && [ "$(STUB_OBJS)" != "" ]; then \ echo $(RM) $(STUB_OBJS); \ $(RM) $(STUB_OBJS); \ fi @if [ "$(SKEL_OBJS)" != "/" ] && [ "$(SKEL_OBJS)" != "" ]; then \ echo $(RM) $(SKEL_OBJS); \ $(RM) $(SKEL_OBJS); \ fi all:: $(STUB_OBJS) $(SKEL_OBJS) $(H_FILES) ### Rules # .class.java rule, add file to list $(OUT_DIR)/%.class : %.java @echo $< >> $(COMPILEME) # Rule for compiling a Stub/Skel files $(OUT_DIR)/%_Skel.class :: $(OUT_DIR)/%_Stub.class $(OUT_DIR)/%_Stub.class:: %.java $(RMIC) $(PACKAGE).$(notdir $(basename $(/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="native/hdflib/hdfImp.c" ac_default_prefix="" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS VERSSTRING JH5INST JHVINST JH45INST CLASSPATH JAVATARG TARGET H45INC H45LIB HDF4INC HDF5INC JAVAINC2 JAVAINC JAVAX JAVABIN COPTNOSHARE COPT JSLEXT SLEXT LLEXT LDOPT2 LDOPT LD JAR JAVADOC JAVAC JAVA javabin JAVALIB jdkclasses LIBH45 HDF5LIB HDF4LIB SZLIB JPEGLIB ZLIB target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build FIND RM EGREP GREP CPP INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM SET_MAKE OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AWK target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='VERSION' ac_user_opts=' enable_option_checking with_libz with_libjpeg with_libsz with_hdf4 with_hdf5 with_h4toh5 with_jdkclasses with_jdk with_javax with_javabin with_jhdf4 with_jhdf5 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-libz=LIB Path to the gzip library (required if not in default path) --with-libjpeg=LIB Path to the jpeg library (required if not in default path) --with-libsz=LIB Path to the szip library (required if not in default path) --with-hdf4=LIB Path to the hdf library (required if not in default path) --with-hdf5=LIB Path to the hdf5 library (required if not in default path) --with-h4toh5=INC,LIB Path to the HDF 4 to 5 library (optional feature, if selected then path required is not in default path) --with-classpath=LIB --with-jdk=INC,LIB Path to the JDK (required if not in default path) --with-javax=LIB --with-javabin=LIB --with-jhdf4=LIB Path to the jhdf4,jar (optional override, used only by H4 to H5) --with-jhdf5=LIB Path to the jhdf45.jar (optional override, used only by the H4 to H5 library) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in ./config "$srcdir"/./config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in ./config \"$srcdir\"/./config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if tr works" >&5 $as_echo_n "checking if tr works... " >&6; } TR_TEST="`echo Test | tr 'a-z,' 'A-Z '`" if test $TR_TEST != "TEST"; then as_fn_error $? "tr program doesn't work" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking if expr works" >&5 $as_echo_n "checking if expr works... " >&6; } yyy_ok="yes" yyy_option="$*" for yyy_option do yyy_opt=`expr "x$yyy_option" : 'x.*=.*'` if test "$yyy_opt" != "0"; then zzz_opt=`echo x$yyy_option | awk '{print index($0,"=")}'` if test "$yyy_opt" != "$zzz_opt"; then yyy_optarg=`expr "x$yyy_option" : 'x[^=]*=\(.*\)'` if test -z "$yyy_optarg"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: option $yyy_option too long, configure will fail" >&5 $as_echo "option $yyy_option too long, configure will fail" >&6; } yyy_ok="no" fi fi fi done if test "$yyy_ok" != "yes"; then echo $yyy_ok as_fn_error $? "expr program doesn't work" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ceil in -lm" >&5 $as_echo_n "checking for ceil in -lm... " >&6; } if ${ac_cv_lib_m_ceil+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ceil (); int main () { return ceil (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_ceil=yes else ac_cv_lib_m_ceil=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_ceil" >&5 $as_echo "$ac_cv_lib_m_ceil" >&6; } if test "x$ac_cv_lib_m_ceil" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi if test "`uname`" = "SunOS" -o "`uname -sr`" = "HP-UX B.11.00"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_int in -lnsl" >&5 $as_echo_n "checking for xdr_int in -lnsl... " >&6; } if ${ac_cv_lib_nsl_xdr_int+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char xdr_int (); int main () { return xdr_int (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_xdr_int=yes else ac_cv_lib_nsl_xdr_int=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_xdr_int" >&5 $as_echo "$ac_cv_lib_nsl_xdr_int" >&6; } if test "x$ac_cv_lib_nsl_xdr_int" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNSL 1 _ACEOF LIBS="-lnsl $LIBS" fi fi # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RM+:} false; then : $as_echo_n "(cached) " >&6 else case $RM in [\\/]* | ?:[\\/]*) ac_cv_path_RM="$RM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_RM" && ac_cv_path_RM="\"\"" ;; esac fi RM=$ac_cv_path_RM if test -n "$RM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 $as_echo "$RM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "find", so it can be a program name with args. set dummy find; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FIND+:} false; then : $as_echo_n "(cached) " >&6 else case $FIND in [\\/]* | ?:[\\/]*) ac_cv_path_FIND="$FIND" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_FIND="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_FIND" && ac_cv_path_FIND="\"\"" ;; esac fi FIND=$ac_cv_path_FIND if test -n "$FIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIND" >&5 $as_echo "$FIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- TARGET=$target echo "FYI the target here is: "$target case $target in alpha-dec-osf*.*) TARGETLIB="alpha" LD=$CC; LDOPT="-pthread -shared"; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT="-pthread -shared"; COPTNOSHARED=; ;; *aix*) TARGETLIB="aix" LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT=-G; COPTNOSHARED=; ;; *-*-solaris2*) TARGETLIB="solaris" LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT=-G; COPTNOSHARED=; ;; mips*-sgi-irix6*) TARGETLIB="irix" LD=ld; LLEXT="a"; JSLEXT="so"; ;; x86_64-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; TARGETLIB="linux" SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT="-shared -Dx86_64 -fPIC" ; ;; ia64-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; TARGETLIB="linux" SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT="-shared -Dia64 -fPIC" ; ;; *-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; TARGETLIB="linux" SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT="-shared -DUNIX386" ; ;; *-freebsd*) LD=$CC; LDOPT=-shared; TARGETLIB="freebsd" SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT="-shared" ; ;; *powerpc-apple*) LD=$CC; LDOPT=-bundle; JSLEXT="jnilib"; LLEXT="a"; SLEXT="dylib"; ;; *) LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; TARGETLIB="$target" esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking gzip compression" >&5 $as_echo_n "checking gzip compression... " >&6; } HAVE_ZLIB="no" withval=""; ZLIB="" # Check whether --with-libz was given. if test "${with_libz+set}" = set; then : withval=$with_libz; fi case "$withval" in yes) ZLIB="" HAVE_ZLIB="no" ;; no) ZLIB="" HAVE_ZLIB="suppressed" ;; *) if test -n "$withval" ; then z_lib="`echo $withval |cut -f2 -d, -s`" ZLIB=$z_lib"/libz."$LLEXT HAVE_ZLIB="yes" else ZLIB="" HAVE_ZLIB="no" fi ;; esac if test -n "$ZLIB"; then LIBS="$LIBS $ZLIB" HAVE_ZLIB="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_ZLIB" >&5 $as_echo "$HAVE_ZLIB" >&6; } if test $HAVE_ZLIB = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: zlib found: $ZLIB" >&5 $as_echo "zlib found: $ZLIB" >&6; }; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking jpeg compression" >&5 $as_echo_n "checking jpeg compression... " >&6; } HAVE_JPEG="no" withval=""; JPEGLIB="" # Check whether --with-libjpeg was given. if test "${with_libjpeg+set}" = set; then : withval=$with_libjpeg; fi case "$withval" in yes) HAVE_JPEG="no" ;; no) JPEGLIB="" HAVE_JPEG="suppressed" ;; *) if test -n "$withval" ; then jpeg_lib="`echo $withval |cut -f2 -d, -s`" JPEGLIB=$jpeg_lib"/libjpeg."$LLEXT HAVE_JPEG="yes" else HAVE_JPEG="no" fi ;; esac if test -n "$JPEGLIB"; then LIBS="$LIBS $JPEGLIB" HAVE_JPEG="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_JPEG" >&5 $as_echo "$HAVE_JPEG" >&6; } if test $HAVE_JPEG = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: jpeg found: $JPEGLIB" >&5 $as_echo "jpeg found: $JPEGLIB" >&6; }; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking szip compression" >&5 $as_echo_n "checking szip compression... " >&6; } HAVE_SZIP="no" withval=""; SZLIB="" # Check whether --with-libsz was given. if test "${with_libsz+set}" = set; then : withval=$with_libsz; fi case "$withval" in yes) SZLIB="" HAVE_SZIP="no" ;; no) SZLIB="" HAVE_SZIP="suppressed" ;; *) if test -n "$withval" ; then sz_lib="`echo $withval |cut -f2 -d, -s`" SZLIB=$sz_lib"/libsz."$LLEXT HAVE_SZIP="yes" else SZLIB="" HAVE_SZIP="no" fi ;; esac if test -n "$SZLIB"; then LIBS="$LIBS $SZLIB" HAVE_SZIP="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_SZIP" >&5 $as_echo "$HAVE_SZIP" >&6; } if test $HAVE_SZIP = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: szlib found: $SZLIB" >&5 $as_echo "szlib found: $SZLIB" >&6; }; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking HDF4 library" >&5 $as_echo_n "checking HDF4 library... " >&6; } HAVE_HDF4="no" withval=""; HDF4LIB="" # Check whether --with-hdf4 was given. if test "${with_hdf4+set}" = set; then : withval=$with_hdf4; fi case "$withval" in yes) HDF4LIB="" HAVE_HDF4="no" ;; no) HDF4LIB="" HAVE_HDF4="suppressed" ;; *) if test -n "$withval" ; then hdf4_inc="`echo $withval |cut -f1 -d,`" if test -n "$hdf4_inc"; then HDF4INC="$hdf4_inc" fi hdf4_lib="`echo $withval |cut -f2 -d, -s`" if test -n "$hdf4_lib"; then HDF4LIB=$hdf4_lib fi HAVE_HDF4="yes" else HDF4LIB="" HAVE_HDF4="no" fi ;; esac if test -n "$HDF4LIB"; then LIBS="$HDF4LIB/libdf.$LLEXT $HDF4LIB/libmfhdf.$LLEXT $LIBS" HAVE_HDF4="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_HDF4" >&5 $as_echo "$HAVE_HDF4" >&6; } if test $HAVE_HDF4 = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: HDF4 found: $HDF4LIB" >&5 $as_echo "HDF4 found: $HDF4LIB" >&6; }; fi if test "$HAVE_HDF4" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependencies for HDF4 library" >&5 $as_echo_n "checking dependencies for HDF4 library... " >&6; } needjpg=`grep 'define H4_HAVE_LIBJPEG 1' $HDF4INC/h4config.h` needgzip=`grep 'define H4_HAVE_LIBZ 1' $HDF4INC/h4config.h` needszip=`grep 'define H4_HAVE_LIBSZ 1' $HDF4INC/h4config.h` if test -n "$needjpg"; then if test "$HAVE_JPEG" != "yes"; then as_fn_error $? " HDF4 library needs JPEG, JPEG not defined." "$LINENO" 5 fi fi if test -n "$needgzip"; then if test "$HAVE_ZLIB" != "yes"; then as_fn_error $? " HDF4 library needs GZIP, GZIP not defined." "$LINENO" 5 fi fi if test -n "$needszip"; then if test "$HAVE_SZIP" != "yes"; then as_fn_error $? " HDF4 library needs SZIP, SZIP not defined." "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: OK" >&5 $as_echo "OK" >&6; } fi ac_cv_lib_HDF4=$HDF4LIB ac_cv_lib_HDF4INC=$HDF4INC { $as_echo "$as_me:${as_lineno-$LINENO}: checking HDF5 library" >&5 $as_echo_n "checking HDF5 library... " >&6; } HAVE_HDF5="no" withval=""; HDF5LIB="" # Check whether --with-hdf5 was given. if test "${with_hdf5+set}" = set; then : withval=$with_hdf5; fi case "$withval" in yes) HDF5LIB="" HAVE_HDF5="no" ;; no) HDF5LIB="" HAVE_HDF5="suppressed" ;; *) if test -n "$withval" ; then hdf5_lib="`echo $withval |cut -f2 -d, -s`" HDF5LIB=$hdf5_lib"/libhdf.$LLEXT" hdf5_inc="`echo $withval |cut -f1 -d,`" if test -n "$hdf5_inc"; then HDF5INC="$hdf5_inc" fi hdf5_lib="`echo $withval |cut -f2 -d, -s`" if test -n "$hdf5_lib"; then HDF5LIB=$hdf5_lib fi HAVE_HDF5="yes" else HDF5LIB="" HAVE_HDF5="no" fi ;; esac if test -n "$HDF5LIB"; then LIBS="$HDF5LIB/libhdf5.$LLEXT $LIBS" HAVE_HDF5="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_HDF5" >&5 $as_echo "$HAVE_HDF5" >&6; } if test $HAVE_HDF5 = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: HDF5 found: $HDF5LIB" >&5 $as_echo "HDF5 found: $HDF5LIB" >&6; }; fi if test -n "$HDF5LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependencies for HDF5 library" >&5 $as_echo_n "checking dependencies for HDF5 library... " >&6; } DFL=`grep 'filters (external)' $HDF5LIB"/libhdf5.settings" | grep deflate` SZP=`grep 'filters (external)' $HDF5LIB"/libhdf5.settings" | grep szip` if test -n "$DFL"; then if test "$HAVE_ZLIB" != "yes"; then as_fn_error $? " HDF5 library needs GZIP, GZIP not defined." "$LINENO" 5 fi fi if test -n "$SZP"; then if test "$HAVE_SZIP" != "yes"; then as_fn_error $? " HDF5 library needs SZIP, SZIP not defined." "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: OK" >&5 $as_echo "OK" >&6; } fi ac_cv_lib_HDF5=$HDF5LIB ac_cv_lib_HDF5INC=$HDF5INC { $as_echo "$as_me:${as_lineno-$LINENO}: checking HDF4to5 library" >&5 $as_echo_n "checking HDF4to5 library... " >&6; } USEH45="no" withval=""; LIBH45="" # Check whether --with-h4toh5 was given. if test "${with_h4toh5+set}" = set; then : withval=$with_h4toh5; fi case "$withval" in yes) USEH45="no" ;; no) H45LIB="" H45INC="" USEH45="suppressed" ;; *) if test -n "$withval"; then hdf45_inc="`echo $withval |cut -f1 -d,`" if test -n "$hdf45_inc"; then HDF45INC="$hdf45_inc" saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I$hdf45_inc" fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in h4toh5.h do : ac_fn_c_check_header_mongrel "$LINENO" "h4toh5.h" "ac_cv_header_h4toh5_h" "$ac_includes_default" if test "x$ac_cv_header_h4toh5_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_H4TOH5_H 1 _ACEOF else CPPFLAGS="$saved_CPPFLAGS" as_fn_error $? "cannot find HDF45 header files!" "$LINENO" 5 fi done hdf45_lib="`echo $withval | cut -f2 -d, -s`" if test -n "$hdf45_lib"; then HDF45LIB="$hdf45_lib" saved_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -L$hdf45_lib" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for H4toh5open in -lh4toh5" >&5 $as_echo_n "checking for H4toh5open in -lh4toh5... " >&6; } if ${ac_cv_lib_h4toh5_H4toh5open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lh4toh5 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char H4toh5open (); int main () { return H4toh5open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_h4toh5_H4toh5open=yes else ac_cv_lib_h4toh5_H4toh5open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_h4toh5_H4toh5open" >&5 $as_echo "$ac_cv_lib_h4toh5_H4toh5open" >&6; } if test "x$ac_cv_lib_h4toh5_H4toh5open" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBH4TOH5 1 _ACEOF LIBS="-lh4toh5 $LIBS" else LDFLAGS="$saved_LDFLAGS" as_fn_error $? "cannot find HDF45 library." "$LINENO" 5 fi else as_fn_error $? "cannot find HDF45 library path." "$LINENO" 5 fi USEH45="yes" fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USEH45" >&5 $as_echo "$USEH45" >&6; } if test -n "$H45LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: h4toh5 library found at: $HDF45LIB" >&5 $as_echo "h4toh5 library found at: $HDF45LIB" >&6; } fi H45LIB=$HDF45LIB H45INC=$HDF45INC ac_cv_lib_HDF45=$HDF45LIB ac_cv_lib_HDF45INC=$HDF45INC withval=""; jdkclasses="" # Check whether --with-jdkclasses was given. if test "${with_jdkclasses+set}" = set; then : withval=$with_jdkclasses; fi jdkclasses=$withval withval=""; JAVALIB="" # Check whether --with-jdk was given. if test "${with_jdk+set}" = set; then : withval=$with_jdk; fi case "$withval" in yes) as_fn_error $? "JDK needed for compilation." "$LINENO" 5 ;; no) as_fn_error $? "JDK needed for compilation." "$LINENO" 5 ;; *) jdk_inc="`echo $withval |cut -f1 -d,`" if test -n "$jdk_inc"; then JAVAINC="$jdk_inc" saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $COPT -I$jdk_inc -I$jdk_inc/$TARGETLIB" fi for ac_header in jni.h do : ac_fn_c_check_header_mongrel "$LINENO" "jni.h" "ac_cv_header_jni_h" "$ac_includes_default" if test "x$ac_cv_header_jni_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_JNI_H 1 _ACEOF else CPPFLAGS="$saved_CPPFLAGS" as_fn_error $? "cannot find JDK header files!" "$LINENO" 5 fi done jdk_lib="`echo $withval | cut -f2 -d, -s`" if test -n "$jdk_lib"; then JAVALIB="$jdk_lib" else as_fn_error $? "cannot find jdk library path." "$LINENO" 5 fi ;; esac if test -n "$jdkclasses"; then if test -f $jdkclasses/classes.jar ; then JAVACLASSES=$jdkclasses/classes.jar JAVACLASSPATH_FOUND=1 else as_fn_error $? "cannot find jdk classes in JDK lib path." "$LINENO" 5 fi else if test -f $JAVALIB/classes.zip ; then JAVACLASSES=$JAVALIB/classes.zip JAVACLASSPATH_FOUND=1 elif test -f $JAVALIB/core.jar ; then JAVACLASSES=$JAVALIB/rt.jar JAVACLASSPATH_FOUND=1 elif test -f $JAVALIB/rt.jar ; then JAVACLASSES=$JAVALIB/rt.jar JAVACLASSPATH_FOUND=1 elif test -d $JAVALIB/classes ; then JAVACLASSES=$JAVALIB/classes JAVACLASSPATH_FOUND=1 else JL=`dirname $JAVALIB` if test -f $JL/jre/lib/rt.jar; then JAVACLASSES=$JL/jre/lib/rt.jar JAVACLASSPATH_FOUND=1 JAVALIB=$JL/jre/lib JAVALIB="" else as_fn_error $? "cannot find jdk classes in JDK lib path." "$LINENO" 5 fi fi fi HERE=`pwd` CLASSPATH="$JAVACLASSES"":""$HERE" withval=""; javax="" # Check whether --with-javax was given. if test "${with_javax+set}" = set; then : withval=$with_javax; fi javax=$withval if test -n "$javax" ; then JAVAX=$javax fi withval=""; javabin="" # Check whether --with-javabin was given. if test "${with_javabin+set}" = set; then : withval=$with_javabin; fi javabin=$withval if test -n "$javabin" ; then JAVABIN=$javabin else JAVABIN=`dirname $JAVAINC` JAVABIN="$JAVABIN/bin" fi # Extract the first word of "java", so it can be a program name with args. set dummy java; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVA+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVA in [\\/]* | ?:[\\/]*) ac_cv_path_JAVA="$JAVA" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $JAVABIN do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_JAVA="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVA=$ac_cv_path_JAVA if test -n "$JAVA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5 $as_echo "$JAVA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "javac", so it can be a program name with args. set dummy javac; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVAC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $JAVABIN do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVAC=$ac_cv_path_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "javadoc", so it can be a program name with args. set dummy javadoc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVADOC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVADOC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVADOC="$JAVADOC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $JAVABIN do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_JAVADOC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVADOC=$ac_cv_path_JAVADOC if test -n "$JAVADOC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVADOC" >&5 $as_echo "$JAVADOC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "jar", so it can be a program name with args. set dummy jar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAR+:} false; then : $as_echo_n "(cached) " >&6 else case $JAR in [\\/]* | ?:[\\/]*) ac_cv_path_JAR="$JAR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $JAVABIN do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_JAR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAR=$ac_cv_path_JAR if test -n "$JAR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5 $as_echo "$JAR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi withval=""; # Check whether --with-jhdf4 was given. if test "${with_jhdf4+set}" = set; then : withval=$with_jhdf4; fi case "$withval" in yes) as_fn_error $? "jhdf4 path needed for compilation." "$LINENO" 5 ;; no) ;; *) jhdf_jar="`echo $withval |cut -f1 -d,`" if test -n "$jhdf_jar"; then CLASSPATH="$CLASSPATH"":""$jhdf_jar""/jhdf.jar" fi ;; esac withval=""; # Check whether --with-jhdf5 was given. if test "${with_jhdf5+set}" = set; then : withval=$with_jhdf5; fi case "$withval" in yes) as_fn_error $? "jhdf5 path needed for compilation." "$LINENO" 5 ;; no) #AC_MSG_ERROR( jhdf5 needed for compilation.) # use default path ;; *) jhdf5_jar="`echo $withval |cut -f1 -d,`" if test -n "$jhdf5_jar"; then CLASSPATH="$CLASSPATH"":""$jhdf5_jar""/jhdf5.jar" #else # AC_MSG_ERROR(jhdf5.jar needed for compilation.) # use default path... fi ;; esac ac_cv_lib_JAVAINC=$JAVAINC if test "$prefix" != "NONE" ; then JH45INST="$prefix" else JH45INST="" fi JH45INST_FOUND=1 if test -z "$JH45INST" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking \"JH45 install directory\"" >&5 $as_echo_n "checking \"JH45 install directory\"... " >&6; } if ${ac_cv_lib_JH45INST+:} false; then : $as_echo_n "(cached) " >&6 else JH45INST_FOUND=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_JH45INST" >&5 $as_echo "$ac_cv_lib_JH45INST" >&6; } fi if test $JH45INST_FOUND -eq 1; then if test -z "$JH45INST" ; then JH45INST=$ac_cv_lib_JH45INST; fi if test \( ! -d "$JH45INST" \); then JH45INST_FOUND=0 fi if test \( ! -w "$JH45INST" \); then as_fn_error $? " $JH45INST : not writable " "$LINENO" 5 JH45INST_FOUND=0 fi fi until test $JH45INST_FOUND -eq 1; do echo "Please type the directory in which to install the JH45" read JH45INST JH45INST_FOUND=1 if test \( ! -d "$JH45INST" \); then JH45INST_FOUND=0 fi if test \( ! -w "$JH45INST" \); then as_fn_error $? " $JH45INST : not writable " "$LINENO" 5 JH45INST_FOUND=0 fi done ac_cv_lib_JH45INST=$JH45INST JHVINST=$JH45INST JH5INST=$JH45INST case $target in alpha-dec-osf*.*) LD=$CC; LDOPT="-pthread -shared"; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT="-pthread -shared"; COPTNOSHARED=; JAVAINC2=$JAVAINC/alpha ; JAVATARG=alpha; ;; *aix*) LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT=-G; COPTNOSHARED=; JAVAINC2=$JAVAINC/aix ; JAVATARG=aix; ;; *-*-solaris2*) LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT=-G; COPTNOSHARED=; JAVAINC2=$JAVAINC/solaris ; JAVATARG=solaris; ;; mips*-sgi-irix6*) LD=ld; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; OS=`uname -r`; SYS=`uname -s` if test "$SYS" = "IRIX"; then LDOPT2="-check_registry /usr/lib/so_locations"; SLEXT="so"; if test "$GCC" = "yes" ; then LDOPT="-shared"; COPT="-shared" ; COPTNOSHARED=""; else LDOPT="-n32 -shared"; COPT="-n32 -shared" ; COPTNOSHARED="-n32"; fi elif test "$SYS" = "IRIX64"; then LDOPT2="-check_registry /usr/lib/so_locations"; SLEXT="so"; if test "$GCC" = "yes" ; then LDOPT="-shared"; COPT="-shared" ; COPTNOSHARED=""; else LDOPT="-n32 -shared"; COPT="-n32 -shared" ; COPTNOSHARED="-n32"; fi else echo "No such system: "$SYS fi JSLEXT="so"; JAVAINC2=$JAVAINC/irix; JAVATARG=irix-$OS; ;; x86_64-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared -Dx86_64 -fPIC" ; JAVAINC2=$JAVAINC/linux; JAVATARG=linux; ;; ia64-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared -Dia64 -fPIC" ; JAVAINC2=$JAVAINC/linux; JAVATARG=linux; ;; *-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared -DUNIX386" ; JAVAINC2=$JAVAINC/linux; JAVATARG=linux; ;; *-freebsd*) LD=$CC; LDOPT=-shared; SLEXT="so"; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared" ; JAVAINC2=$JAVAINC/freebsd; JAVATARG=freebsd; ;; *powerpc-apple*) LD=$CC; LDOPT=-bundle; JSLEXT="jnilib"; LLEXT="a"; SLEXT="dylib"; JAVAINC2=$JAVAINC/macosx; JAVATARG=macosx; ;; *) LD=$CC; LDOPT=-G; SLEXT="so"; JSLEXT="so"; LLEXT="a"; COPT=-shared; COPTNOSHSARED=; JAVAINC2=$JAVAINC/$target; JAVATARG=$TARGET ;; esac VERSION=./VERSION VERSSTRING=`/bin/cat ./VERSION | sed -e 's/VERSION=HDF-JAVA-//' ` ## ## Select one of the following, depending on what is being distributed. ## OUTPUT_FILES="Makefile native/Makefile native/hdflib/Makefile native/hdf5lib/Makefile ncsa/Makefile ncsa/hdf/Makefile ncsa/hdf/hdflib/Makefile ncsa/hdf/hdf5lib/Makefile ncsa/hdf/hdf5lib/exceptions/Makefile ncsa/hdf/hdf5lib/callbacks/Makefile ncsa/hdf/hdf5lib/structs/Makefile ncsa/hdf/object/Makefile ncsa/hdf/object/fits/Makefile ncsa/hdf/object/h4/Makefile ncsa/hdf/object/h5/Makefile ncsa/hdf/object/nc2/Makefile ncsa/hdf/view/Makefile bin/hdfview.sh" if test "$USEH45" = "yes"; then ## want H4toH5 configured if test -d "./test"; then ## ## Everything ## # OUTPUT_FILES="$OUTPUT_FILES test/Makefile test/object/misc/testh4file.sh test/object/misc/testh5file.sh test/object/misc/Makefile test/object/misc/runtests.sh test/hdf5lib/junit.sh test/hdf5lib/Makefile test/uitest/junit.sh test/uitest/Makefile examples/Makefile examples/intro/Makefile examples/datasets/Makefile examples/datatypes/Makefile examples/groups/Makefile" OUTPUT_FILES="$OUTPUT_FILES test/Makefile test/object/misc/testh4file.sh test/object/misc/testh5file.sh test/object/misc/Makefile test/object/misc/runtests.sh test/hdf5lib/junit.sh test/hdf5lib/Makefile examples/Makefile examples/intro/Makefile examples/datasets/Makefile examples/datatypes/Makefile examples/groups/Makefile" else ## ## H4, H5, H45, but NO tests ## OUTPUT_FILES="Makefile native/Makefile native/hdflib/Makefile native/hdf5lib/Makefile ncsa/Makefile ncsa/hdf/Makefile ncsa/hdf/hdflib/Makefile ncsa/hdf/hdf5lib/Makefile ncsa/hdf/hdf5lib/exceptions/Makefile ncsa/hdf/hdf5lib/callbacks/Makefile ncsa/hdf/hdf5lib/structs/Makefile ncsa/hdf/object/Makefile ncsa/hdf/object/fits/Makefile ncsa/hdf/object/h4/Makefile ncsa/hdf/object/h5/Makefile ncsa/hdf/object/nc2/Makefile ncsa/hdf/view/Makefile" fi else if test -d "./test"; then ## Don't use H4toH5 (but do include some tests) #OUTPUT_FILES="$OUTPUT_FILES test/Makefile test/object/misc/Makefile test/object/misc/testh4file.sh test/object/misc/testh5file.sh test/object/misc/runtests.sh test/object/misc/TestH5Object.sh test/object/misc/TestH5Table.sh test/object/misc/TestH5MemoryLeak.sh test/object/Makefile test/object/unittests.sh test/hdf5lib/junit.sh test/hdf5lib/Makefile test/uitest/junit.sh test/uitest/Makefile examples/Makefile examples/intro/Makefile examples/datasets/Makefile examples/datatypes/Makefile examples/groups/Makefile examples/runExample.sh" OUTPUT_FILES="$OUTPUT_FILES test/Makefile test/object/misc/Makefile test/object/misc/testh4file.sh test/object/misc/testh5file.sh test/object/misc/runtests.sh test/object/misc/TestH5Object.sh test/object/misc/TestH5Table.sh test/object/misc/TestH5MemoryLeak.sh test/object/Makefile test/object/unittests.sh test/hdf5lib/junit.sh test/hdf5lib/Makefile examples/Makefile examples/intro/Makefile examples/datasets/Makefile examples/datatypes/Makefile examples/groups/Makefile examples/runExample.sh" else ## Don't use H4toH5 (no tests) OUTPUT_FILES="$OUTPUT_FILES" fi fi ac_config_files="$ac_config_files $OUTPUT_FILES" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "$OUTPUT_FILES") CONFIG_FILES="$CONFIG_FILES $OUTPUT_FILES" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then if $AWK 'BEGIN { getline <"/dev/null" }' /dev/null; then ac_cs_awk_getline=: ac_cs_awk_pipe_init= ac_cs_awk_read_file=' while ((getline aline < (F[key])) > 0) print(aline) close(F[key])' ac_cs_awk_pipe_fini= else ac_cs_awk_getline=false ac_cs_awk_pipe_init="print \"cat <<'|#_!!_#|' &&\"" ac_cs_awk_read_file=' print "|#_!!_#|" print "cat " F[key] " &&" '$ac_cs_awk_pipe_init # The final `:' finishes the AND list. ac_cs_awk_pipe_fini='END { print "|#_!!_#|"; print ":" }' fi ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF # Create commands to substitute file output variables. { echo "cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1" && echo 'cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&' && echo "$ac_subst_files" | sed 's/.*/F["&"]="$&"/' && echo "_ACAWK" && echo "_ACEOF" } >conf$$files.sh && . ./conf$$files.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 rm -f conf$$files.sh { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" \$ac_cs_awk_pipe_init } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } if (nfields == 3 && !substed) { key = field[2] if (F[key] != "" && line ~ /^[ ]*@.*@[ ]*$/) { \$ac_cs_awk_read_file next } } print line } \$ac_cs_awk_pipe_fini _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | if $ac_cs_awk_getline; then $AWK -f "$ac_tmp/subs.awk" else $AWK -f "$ac_tmp/subs.awk" | $SHELL fi \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if test -d "./test"; then chmod +x test/object/misc/TestH5Object.sh chmod +x test/object/misc/TestH5Table.sh chmod +x test/object/misc/TestH5MemoryLeak.sh chmod +x test/object/unittests.sh chmod +x test/hdf5lib/junit.sh fi jhdf-2.9/configure.in0000755000175000017500000005364012050301103015466 0ustar sylvestresylvestrednl****************************************************************************/ dnl* NCSA HDF * dnl* National Comptational Science Alliance * dnl* University of Illinois at Urbana-Champaign * dnl* 605 E. Springfield, Champaign IL 61820 * dnl* * dnl* For conditions of distribution and use, see the accompanying * dnl* hdf-java/COPYING file. * dnl* * dnl****************************************************************************/ dnl Process this file with autoconf to produce a configure script. AC_INIT(native/hdflib/hdfImp.c) AC_CONFIG_AUX_DIR(./config) dnl ---------------------------------------------------------------------- dnl Some platforms have broken tr, basename, and/or xargs programs. Check dnl that it actually does what it's supposed to do. Catch this early dnl since configure relies upon tr heavily and there's no use continuing dnl if it's broken. dnl AC_MSG_CHECKING([if tr works]) TR_TEST="`echo Test | tr 'a-z,' 'A-Z '`" if test $TR_TEST != "TEST"; then AC_MSG_ERROR([tr program doesn't work]) else AC_MSG_RESULT([yes]) fi AC_PROG_AWK dnl ---------------------------------------------------------------------- dnl Some platforms have broken 'expr' programs. Check dnl that it actually does what it's supposed to do. Catch this early dnl since configure relies upon 'expr' to process its arguments, and dnl there isn't much use continuging if it's broken. dnl AC_MSG_CHECKING([if expr works]) yyy_ok="yes" yyy_option="$*" for yyy_option do yyy_opt=`expr "x$yyy_option" : 'x.*=.*'` if test "$yyy_opt" != "0"; then zzz_opt=`echo x$yyy_option | awk '{print [index($0,"=")]}'` if test "$yyy_opt" != "$zzz_opt"; then dnl AC_MSG_WARN([$yyy_option: option is empty?]) dnl yyy_ok="maybe" dnl else yyy_optarg=`expr "x$yyy_option" : 'x[[^=]]*=\(.*\)'` if test -z "$yyy_optarg"; then AC_MSG_RESULT([option $yyy_option too long, configure will fail]) yyy_ok="no" fi fi fi done if test "$yyy_ok" != "yes"; then echo $yyy_ok AC_MSG_ERROR([expr program doesn't work]) else AC_MSG_RESULT([yes]) fi dnl Checks for programs. AC_PROG_CC AC_PROG_MAKE_SET AC_PROG_INSTALL AC_HEADER_STDC AC_CHECK_LIB(m,ceil) if test "`uname`" = "SunOS" -o "`uname -sr`" = "HP-UX B.11.00"; then dnl ...for Solaris and hdf4 AC_CHECK_LIB(nsl, xdr_int) fi AC_PREFIX_DEFAULT("") AC_PATH_PROG(RM,rm,\"\",,) AC_PATH_PROG(FIND,find,\"\",,) dnl dnl Some platform specific settings for different Java implementations dnl AC_CANONICAL_SYSTEM TARGET=$target echo "FYI the target here is: "$target case $target in alpha-dec-osf*.*) TARGETLIB="alpha" LD=$CC; LDOPT="-pthread -shared"; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT="-pthread -shared"; COPTNOSHARED=; ;; *aix*) TARGETLIB="aix" LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT=-G; COPTNOSHARED=; ;; *-*-solaris2*) TARGETLIB="solaris" LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT=-G; COPTNOSHARED=; ;; mips*-sgi-irix6*) TARGETLIB="irix" LD=ld; LLEXT="a"; JSLEXT="so"; ;; x86_64-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; TARGETLIB="linux" SLEXT="so"; LLEXT="a"; dnl the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared -Dx86_64 -fPIC" ; ;; ia64-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; TARGETLIB="linux" SLEXT="so"; LLEXT="a"; dnl the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared -Dia64 -fPIC" ; ;; *-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; TARGETLIB="linux" SLEXT="so"; LLEXT="a"; dnl the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared -DUNIX386" ; ;; *-freebsd*) LD=$CC; LDOPT=-shared; TARGETLIB="freebsd" SLEXT="so"; LLEXT="a"; dnl the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared" ; ;; *powerpc-apple*) LD=$CC; LDOPT=-bundle; JSLEXT="jnilib"; LLEXT="a"; SLEXT="dylib"; ;; *) LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; TARGETLIB="$target" esac dnl ---------------- dnl Check for the external compression libraries required by the dnl HDF libraries. dnl dnl Note: we need to find static libraries, so we can't rely on dnl autoconf for these detections. dnl AC_MSG_CHECKING([gzip compression]) HAVE_ZLIB="no" withval=""; AC_SUBST(ZLIB) ZLIB="" AC_ARG_WITH(libz,[ --with-libz=LIB Path to the gzip library (required if not in default path)],,) case "$withval" in yes) ZLIB="" HAVE_ZLIB="no" ;; no) ZLIB="" HAVE_ZLIB="suppressed" ;; *) if test -n "$withval" ; then z_lib="`echo $withval |cut -f2 -d, -s`" ZLIB=$z_lib"/libz."$LLEXT HAVE_ZLIB="yes" else ZLIB="" HAVE_ZLIB="no" fi ;; esac if test -n "$ZLIB"; then LIBS="$LIBS $ZLIB" HAVE_ZLIB="yes" fi AC_MSG_RESULT([$HAVE_ZLIB]) if test $HAVE_ZLIB = "yes"; then AC_MSG_RESULT([zlib found: $ZLIB]); fi AC_MSG_CHECKING([jpeg compression]) HAVE_JPEG="no" withval=""; AC_SUBST(JPEGLIB) JPEGLIB="" AC_ARG_WITH(libjpeg,[ --with-libjpeg=LIB Path to the jpeg library (required if not in default path)],,) case "$withval" in yes) HAVE_JPEG="no" ;; no) JPEGLIB="" HAVE_JPEG="suppressed" ;; *) if test -n "$withval" ; then jpeg_lib="`echo $withval |cut -f2 -d, -s`" JPEGLIB=$jpeg_lib"/libjpeg."$LLEXT dnl AC_MSG_RESULT([jpeg found: $JPEGLIB]); HAVE_JPEG="yes" else HAVE_JPEG="no" fi ;; esac if test -n "$JPEGLIB"; then LIBS="$LIBS $JPEGLIB" HAVE_JPEG="yes" fi AC_MSG_RESULT([$HAVE_JPEG]) if test $HAVE_JPEG = "yes"; then AC_MSG_RESULT([jpeg found: $JPEGLIB]); fi AC_MSG_CHECKING([szip compression]) HAVE_SZIP="no" withval=""; AC_SUBST(SZLIB) SZLIB="" AC_ARG_WITH(libsz,[ --with-libsz=LIB Path to the szip library (required if not in default path)],,) case "$withval" in yes) SZLIB="" HAVE_SZIP="no" ;; no) SZLIB="" HAVE_SZIP="suppressed" ;; *) if test -n "$withval" ; then sz_lib="`echo $withval |cut -f2 -d, -s`" SZLIB=$sz_lib"/libsz."$LLEXT dnl AC_MSG_RESULT([szlib found: $SZLIB]); HAVE_SZIP="yes" else SZLIB="" HAVE_SZIP="no" fi ;; esac if test -n "$SZLIB"; then LIBS="$LIBS $SZLIB" HAVE_SZIP="yes" fi AC_MSG_RESULT([$HAVE_SZIP]) if test $HAVE_SZIP = "yes"; then AC_MSG_RESULT([szlib found: $SZLIB]); fi dnl dnl Look for HDF4 library, if selected. dnl Must find static libraries. dnl AC_MSG_CHECKING([HDF4 library]) HAVE_HDF4="no" withval=""; AC_SUBST(HDF4LIB) HDF4LIB="" AC_ARG_WITH(hdf4,[ --with-hdf4=LIB Path to the hdf library (required if not in default path)],,) case "$withval" in yes) dnl AC_MSG_ERROR(HDF4 library needed for compilation.) HDF4LIB="" HAVE_HDF4="no" ;; no) HDF4LIB="" HAVE_HDF4="suppressed" ;; *) if test -n "$withval" ; then hdf4_inc="`echo $withval |cut -f1 -d,`" if test -n "$hdf4_inc"; then HDF4INC="$hdf4_inc" fi hdf4_lib="`echo $withval |cut -f2 -d, -s`" if test -n "$hdf4_lib"; then HDF4LIB=$hdf4_lib fi HAVE_HDF4="yes" else HDF4LIB="" HAVE_HDF4="no" fi ;; esac if test -n "$HDF4LIB"; then LIBS="$HDF4LIB/libdf.$LLEXT $HDF4LIB/libmfhdf.$LLEXT $LIBS" HAVE_HDF4="yes" fi AC_MSG_RESULT([$HAVE_HDF4]) if test $HAVE_HDF4 = "yes"; then AC_MSG_RESULT([HDF4 found: $HDF4LIB]); fi dnl dnl Check that the libraries that HDF4 needs have been found dnl dnl Must stop here if something is missing. dnl if test "$HAVE_HDF4" = "yes"; then AC_MSG_CHECKING([dependencies for HDF4 library]) needjpg=`grep 'define H4_HAVE_LIBJPEG 1' $HDF4INC/h4config.h` needgzip=`grep 'define H4_HAVE_LIBZ 1' $HDF4INC/h4config.h` needszip=`grep 'define H4_HAVE_LIBSZ 1' $HDF4INC/h4config.h` if test -n "$needjpg"; then if test "$HAVE_JPEG" != "yes"; then AC_MSG_ERROR([ HDF4 library needs JPEG, JPEG not defined.]) fi fi if test -n "$needgzip"; then if test "$HAVE_ZLIB" != "yes"; then AC_MSG_ERROR([ HDF4 library needs GZIP, GZIP not defined.]) fi fi if test -n "$needszip"; then if test "$HAVE_SZIP" != "yes"; then AC_MSG_ERROR([ HDF4 library needs SZIP, SZIP not defined.]) fi fi AC_MSG_RESULT([OK]) fi ac_cv_lib_HDF4=$HDF4LIB ac_cv_lib_HDF4INC=$HDF4INC AC_MSG_CHECKING([HDF5 library]) HAVE_HDF5="no" withval=""; AC_SUBST(HDF5LIB) HDF5LIB="" AC_ARG_WITH(hdf5,[ --with-hdf5=LIB Path to the hdf5 library (required if not in default path)],,) case "$withval" in yes) HDF5LIB="" HAVE_HDF5="no" ;; no) HDF5LIB="" HAVE_HDF5="suppressed" ;; *) if test -n "$withval" ; then hdf5_lib="`echo $withval |cut -f2 -d, -s`" HDF5LIB=$hdf5_lib"/libhdf.$LLEXT" hdf5_inc="`echo $withval |cut -f1 -d,`" if test -n "$hdf5_inc"; then HDF5INC="$hdf5_inc" fi hdf5_lib="`echo $withval |cut -f2 -d, -s`" if test -n "$hdf5_lib"; then HDF5LIB=$hdf5_lib fi HAVE_HDF5="yes" else HDF5LIB="" HAVE_HDF5="no" fi ;; esac if test -n "$HDF5LIB"; then LIBS="$HDF5LIB/libhdf5.$LLEXT $LIBS" HAVE_HDF5="yes" fi AC_MSG_RESULT([$HAVE_HDF5]) if test $HAVE_HDF5 = "yes"; then AC_MSG_RESULT([HDF5 found: $HDF5LIB]); fi dnl dnl Check that the libraries that HDF4 needs have been found dnl dnl Must stop here if something is missing. dnl if test -n "$HDF5LIB"; then AC_MSG_CHECKING([dependencies for HDF5 library]) DFL=`grep 'filters (external)' $HDF5LIB"/libhdf5.settings" | grep deflate` SZP=`grep 'filters (external)' $HDF5LIB"/libhdf5.settings" | grep szip` if test -n "$DFL"; then if test "$HAVE_ZLIB" != "yes"; then AC_MSG_ERROR([ HDF5 library needs GZIP, GZIP not defined.]) fi fi if test -n "$SZP"; then if test "$HAVE_SZIP" != "yes"; then AC_MSG_ERROR([ HDF5 library needs SZIP, SZIP not defined.]) fi fi AC_MSG_RESULT([OK]) fi ac_cv_lib_HDF5=$HDF5LIB ac_cv_lib_HDF5INC=$HDF5INC dnl check for libh4toh5 == if with-h4toh5 is not set, then can dnl only build hdf and hdf5 separately. dnl dnl This code need to be updated to check all the dependencies, dnl as for H4 and H5 libs above. AC_MSG_CHECKING([HDF4to5 library]) USEH45="no" withval=""; AC_SUBST(LIBH45) LIBH45="" AC_ARG_WITH(h4toh5,[ --with-h4toh5=INC,LIB Path to the HDF 4 to 5 library (optional feature, if selected then path required is not in default path)],,) case "$withval" in yes) USEH45="no" ;; no) H45LIB="" H45INC="" USEH45="suppressed" ;; *) if test -n "$withval"; then hdf45_inc="`echo $withval |cut -f1 -d,`" if test -n "$hdf45_inc"; then HDF45INC="$hdf45_inc" saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I$hdf45_inc" fi AC_CHECK_HEADERS(h4toh5.h,, CPPFLAGS="$saved_CPPFLAGS" AC_MSG_ERROR(cannot find HDF45 header files!)) hdf45_lib="`echo $withval | cut -f2 -d, -s`" if test -n "$hdf45_lib"; then HDF45LIB="$hdf45_lib" saved_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -L$hdf45_lib" AC_CHECK_LIB(h4toh5, H4toh5open,, LDFLAGS="$saved_LDFLAGS" AC_MSG_ERROR(cannot find HDF45 library.)) else AC_MSG_ERROR(cannot find HDF45 library path.) fi USEH45="yes" fi ;; esac AC_MSG_RESULT([$USEH45]) if test -n "$H45LIB"; then AC_MSG_RESULT([h4toh5 library found at: $HDF45LIB]) fi H45LIB=$HDF45LIB H45INC=$HDF45INC ac_cv_lib_HDF45=$HDF45LIB ac_cv_lib_HDF45INC=$HDF45INC dnl find java stuff: use -with-jdk withval=""; AC_SUBST(jdkclasses) jdkclasses="" AC_ARG_WITH(jdkclasses,[ --with-classpath=LIB],,) jdkclasses=$withval withval=""; AC_SUBST(JAVALIB) JAVALIB="" AC_ARG_WITH(jdk,[ --with-jdk=INC,LIB Path to the JDK (required if not in default path)],,) case "$withval" in yes) AC_MSG_ERROR(JDK needed for compilation.) ;; no) AC_MSG_ERROR(JDK needed for compilation.) ;; *) jdk_inc="`echo $withval |cut -f1 -d,`" if test -n "$jdk_inc"; then JAVAINC="$jdk_inc" saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $COPT -I$jdk_inc -I$jdk_inc/$TARGETLIB" fi AC_CHECK_HEADERS(jni.h,, CPPFLAGS="$saved_CPPFLAGS" AC_MSG_ERROR(cannot find JDK header files!)) jdk_lib="`echo $withval | cut -f2 -d, -s`" if test -n "$jdk_lib"; then JAVALIB="$jdk_lib" else AC_MSG_ERROR(cannot find jdk library path.) fi ;; esac if test -n "$jdkclasses"; then if test -f $jdkclasses/classes.jar ; then JAVACLASSES=$jdkclasses/classes.jar JAVACLASSPATH_FOUND=1 else AC_MSG_ERROR(cannot find jdk classes in JDK lib path.) fi else if test -f $JAVALIB/classes.zip ; then JAVACLASSES=$JAVALIB/classes.zip JAVACLASSPATH_FOUND=1 elif test -f $JAVALIB/core.jar ; then JAVACLASSES=$JAVALIB/rt.jar JAVACLASSPATH_FOUND=1 elif test -f $JAVALIB/rt.jar ; then JAVACLASSES=$JAVALIB/rt.jar JAVACLASSPATH_FOUND=1 elif test -d $JAVALIB/classes ; then JAVACLASSES=$JAVALIB/classes JAVACLASSPATH_FOUND=1 else JL=`dirname $JAVALIB` if test -f $JL/jre/lib/rt.jar; then JAVACLASSES=$JL/jre/lib/rt.jar JAVACLASSPATH_FOUND=1 JAVALIB=$JL/jre/lib AC_SUBST(JAVALIB) JAVALIB="" else AC_MSG_ERROR(cannot find jdk classes in JDK lib path.) fi fi fi HERE=`pwd` CLASSPATH="$JAVACLASSES"":""$HERE" withval=""; AC_SUBST(javabin) javax="" AC_ARG_WITH(javax,[ --with-javax=LIB],,) javax=$withval if test -n "$javax" ; then JAVAX=$javax fi withval=""; AC_SUBST(javabin) javabin="" AC_ARG_WITH(javabin,[ --with-javabin=LIB],,) javabin=$withval if test -n "$javabin" ; then JAVABIN=$javabin else JAVABIN=`dirname $JAVAINC` JAVABIN="$JAVABIN/bin" fi AC_PATH_PROG(JAVA,java,,$JAVABIN,) AC_PATH_PROG(JAVAC,javac,,$JAVABIN,) AC_PATH_PROG(JAVADOC,javadoc,,$JAVABIN,) AC_PATH_PROG(JAR,jar,,$JAVABIN,) dnl optional find the jhdf wrappers withval=""; AC_ARG_WITH(jhdf4,[ --with-jhdf4=LIB Path to the jhdf4,jar (optional override, used only by H4 to H5) ],,) case "$withval" in yes) AC_MSG_ERROR(jhdf4 path needed for compilation.) ;; no) dnl use default path ;; *) jhdf_jar="`echo $withval |cut -f1 -d,`" if test -n "$jhdf_jar"; then CLASSPATH="$CLASSPATH"":""$jhdf_jar""/jhdf.jar" fi ;; esac withval=""; AC_ARG_WITH(jhdf5,[ --with-jhdf5=LIB Path to the jhdf45.jar (optional override, used only by the H4 to H5 library) ],,) case "$withval" in yes) AC_MSG_ERROR( jhdf5 path needed for compilation.) ;; no) #AC_MSG_ERROR( jhdf5 needed for compilation.) # use default path ;; *) jhdf5_jar="`echo $withval |cut -f1 -d,`" if test -n "$jhdf5_jar"; then CLASSPATH="$CLASSPATH"":""$jhdf5_jar""/jhdf5.jar" #else # AC_MSG_ERROR(jhdf5.jar needed for compilation.) # use default path... fi ;; esac ac_cv_lib_JAVAINC=$JAVAINC if test "$prefix" != "NONE" ; then JH45INST="$prefix" else JH45INST="" fi JH45INST_FOUND=1 if test -z "$JH45INST" ; then AC_CACHE_CHECK("JH45 install directory",ac_cv_lib_JH45INST,JH45INST_FOUND=0) fi if test $JH45INST_FOUND -eq 1; then if test -z "$JH45INST" ; then JH45INST=$ac_cv_lib_JH45INST; fi if test \( ! -d "$JH45INST" \); then JH45INST_FOUND=0 fi if test \( ! -w "$JH45INST" \); then AC_MSG_ERROR( [ $JH45INST : not writable ]) JH45INST_FOUND=0 fi fi until test $JH45INST_FOUND -eq 1; do echo "Please type the directory in which to install the JH45" read JH45INST JH45INST_FOUND=1 if test \( ! -d "$JH45INST" \); then JH45INST_FOUND=0 fi if test \( ! -w "$JH45INST" \); then AC_MSG_ERROR( [ $JH45INST : not writable ]) JH45INST_FOUND=0 fi done ac_cv_lib_JH45INST=$JH45INST JHVINST=$JH45INST JH5INST=$JH45INST case $target in alpha-dec-osf*.*) LD=$CC; LDOPT="-pthread -shared"; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT="-pthread -shared"; COPTNOSHARED=; JAVAINC2=$JAVAINC/alpha ; JAVATARG=alpha; ;; *aix*) LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT=-G; COPTNOSHARED=; JAVAINC2=$JAVAINC/aix ; JAVATARG=aix; ;; *-*-solaris2*) LD=$CC; LDOPT=-G; SLEXT="so"; LLEXT="a"; JSLEXT="so"; COPT=-G; COPTNOSHARED=; JAVAINC2=$JAVAINC/solaris ; JAVATARG=solaris; ;; mips*-sgi-irix6*) LD=ld; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; OS=`uname -r`; SYS=`uname -s` if test "$SYS" = "IRIX"; then LDOPT2="-check_registry /usr/lib/so_locations"; SLEXT="so"; if test "$GCC" = "yes" ; then LDOPT="-shared"; COPT="-shared" ; COPTNOSHARED=""; else LDOPT="-n32 -shared"; COPT="-n32 -shared" ; COPTNOSHARED="-n32"; fi elif test "$SYS" = "IRIX64"; then LDOPT2="-check_registry /usr/lib/so_locations"; SLEXT="so"; if test "$GCC" = "yes" ; then LDOPT="-shared"; COPT="-shared" ; COPTNOSHARED=""; else LDOPT="-n32 -shared"; COPT="-n32 -shared" ; COPTNOSHARED="-n32"; fi else echo "No such system: "$SYS fi JSLEXT="so"; JAVAINC2=$JAVAINC/irix; JAVATARG=irix-$OS; ;; x86_64-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared -Dx86_64 -fPIC" ; JAVAINC2=$JAVAINC/linux; JAVATARG=linux; ;; ia64-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared -Dia64 -fPIC" ; JAVAINC2=$JAVAINC/linux; JAVATARG=linux; ;; *-pc-linux*) LD=$CC; LDOPT=-shared; SLEXT="so"; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared -DUNIX386" ; JAVAINC2=$JAVAINC/linux; JAVATARG=linux; ;; *-freebsd*) LD=$CC; LDOPT=-shared; SLEXT="so"; LLEXT="a"; # the extension for the HDF and other libraries to link to JSLEXT="so"; COPT="-shared" ; JAVAINC2=$JAVAINC/freebsd; JAVATARG=freebsd; ;; *powerpc-apple*) LD=$CC; LDOPT=-bundle; JSLEXT="jnilib"; LLEXT="a"; SLEXT="dylib"; JAVAINC2=$JAVAINC/macosx; JAVATARG=macosx; ;; *) LD=$CC; LDOPT=-G; SLEXT="so"; JSLEXT="so"; LLEXT="a"; COPT=-shared; COPTNOSHSARED=; JAVAINC2=$JAVAINC/$target; JAVATARG=$TARGET ;; esac AC_SUBST(LD) AC_SUBST(LDOPT) AC_SUBST(LDOPT2) AC_SUBST(LLEXT) AC_SUBST(SLEXT) AC_SUBST(JSLEXT) AC_SUBST(COPT) AC_SUBST(COPTNOSHARE) AC_SUBST(RM) AC_SUBST(AWK) AC_SUBST(FIND) AC_SUBST(JAVA) AC_SUBST(JAVABIN) AC_SUBST(JAVAX) AC_SUBST(JAVAC) AC_SUBST(JAVADOC) AC_SUBST(JAVAINC) AC_SUBST(JAVAINC2) AC_SUBST(HDF5LIB) AC_SUBST(HDF5INC) AC_SUBST(HDF4LIB) AC_SUBST(HDF4INC) AC_SUBST(H45LIB) AC_SUBST(H45INC) AC_SUBST(TARGET) AC_SUBST(JAVATARG) AC_SUBST(JAR) AC_SUBST(CLASSPATH) AC_SUBST(JH45INST) AC_SUBST(JHVINST) AC_SUBST(JH5INST) AC_SUBST(ZLIB) AC_SUBST(SZLIB) AC_SUBST_FILE(VERSION) VERSION=./VERSION VERSSTRING=`/bin/cat ./VERSION | sed -e 's/VERSION=HDF-JAVA-//' ` AC_SUBST(VERSSTRING) ## ## Select one of the following, depending on what is being distributed. ## OUTPUT_FILES="Makefile native/Makefile native/hdflib/Makefile native/hdf5lib/Makefile ncsa/Makefile ncsa/hdf/Makefile ncsa/hdf/hdflib/Makefile ncsa/hdf/hdf5lib/Makefile ncsa/hdf/hdf5lib/exceptions/Makefile ncsa/hdf/hdf5lib/callbacks/Makefile ncsa/hdf/hdf5lib/structs/Makefile ncsa/hdf/object/Makefile ncsa/hdf/object/fits/Makefile ncsa/hdf/object/h4/Makefile ncsa/hdf/object/h5/Makefile ncsa/hdf/object/nc2/Makefile ncsa/hdf/view/Makefile bin/hdfview.sh" if test "$USEH45" = "yes"; then ## want H4toH5 configured if test -d "./test"; then ## ## Everything ## # OUTPUT_FILES="$OUTPUT_FILES test/Makefile test/object/misc/testh4file.sh test/object/misc/testh5file.sh test/object/misc/Makefile test/object/misc/runtests.sh test/hdf5lib/junit.sh test/hdf5lib/Makefile test/uitest/junit.sh test/uitest/Makefile examples/Makefile examples/intro/Makefile examples/datasets/Makefile examples/datatypes/Makefile examples/groups/Makefile" OUTPUT_FILES="$OUTPUT_FILES test/Makefile test/object/misc/testh4file.sh test/object/misc/testh5file.sh test/object/misc/Makefile test/object/misc/runtests.sh test/hdf5lib/junit.sh test/hdf5lib/Makefile examples/Makefile examples/intro/Makefile examples/datasets/Makefile examples/datatypes/Makefile examples/groups/Makefile" else ## ## H4, H5, H45, but NO tests ## OUTPUT_FILES="Makefile native/Makefile native/hdflib/Makefile native/hdf5lib/Makefile ncsa/Makefile ncsa/hdf/Makefile ncsa/hdf/hdflib/Makefile ncsa/hdf/hdf5lib/Makefile ncsa/hdf/hdf5lib/exceptions/Makefile ncsa/hdf/hdf5lib/callbacks/Makefile ncsa/hdf/hdf5lib/structs/Makefile ncsa/hdf/object/Makefile ncsa/hdf/object/fits/Makefile ncsa/hdf/object/h4/Makefile ncsa/hdf/object/h5/Makefile ncsa/hdf/object/nc2/Makefile ncsa/hdf/view/Makefile" fi else if test -d "./test"; then ## Don't use H4toH5 (but do include some tests) #OUTPUT_FILES="$OUTPUT_FILES test/Makefile test/object/misc/Makefile test/object/misc/testh4file.sh test/object/misc/testh5file.sh test/object/misc/runtests.sh test/object/misc/TestH5Object.sh test/object/misc/TestH5Table.sh test/object/misc/TestH5MemoryLeak.sh test/object/Makefile test/object/unittests.sh test/hdf5lib/junit.sh test/hdf5lib/Makefile test/uitest/junit.sh test/uitest/Makefile examples/Makefile examples/intro/Makefile examples/datasets/Makefile examples/datatypes/Makefile examples/groups/Makefile examples/runExample.sh" OUTPUT_FILES="$OUTPUT_FILES test/Makefile test/object/misc/Makefile test/object/misc/testh4file.sh test/object/misc/testh5file.sh test/object/misc/runtests.sh test/object/misc/TestH5Object.sh test/object/misc/TestH5Table.sh test/object/misc/TestH5MemoryLeak.sh test/object/Makefile test/object/unittests.sh test/hdf5lib/junit.sh test/hdf5lib/Makefile examples/Makefile examples/intro/Makefile examples/datasets/Makefile examples/datatypes/Makefile examples/groups/Makefile examples/runExample.sh" else ## Don't use H4toH5 (no tests) OUTPUT_FILES="$OUTPUT_FILES" fi fi AC_OUTPUT($OUTPUT_FILES) if test -d "./test"; then chmod +x test/object/misc/TestH5Object.sh chmod +x test/object/misc/TestH5Table.sh chmod +x test/object/misc/TestH5MemoryLeak.sh chmod +x test/object/unittests.sh chmod +x test/hdf5lib/junit.sh fi jhdf-2.9/COPYING0000644000175000017500000001047012050543763014223 0ustar sylvestresylvestreCopyright Notice and License Terms for HDF Java Products ----------------------------------------------------------------------------- HDF Java Products Copyright 2006-2012 by The HDF Group. NCSA HDF Java Products Copyright 1988-2006 by the Board of Trustees of the University of Illinois. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted for any purpose (including commercial purposes) provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or materials provided with the distribution. 3. In addition, redistributions of modified forms of the source or binary code must carry prominent notices stating that the original code was changed and the date of the change. 4. All publications or advertising materials mentioning features or use of this software are asked, but not required, to acknowledge that it was developed by The HDF Group and by the National Center for Supercomputing Applications at the University of Illinois at Urbana-Champaign and credit the contributors. 5. Neither the name of The HDF Group, the name of the University, nor the name of any Contributor may be used to endorse or promote products derived from this software without specific prior written permission from The HDF Group, the University, or the Contributor, respectively. DISCLAIMER: THIS SOFTWARE IS PROVIDED BY THE HDF GROUP AND THE CONTRIBUTORS "AS IS" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. In no event shall The HDF Group or the Contributors be liable for any damages suffered by the users arising out of the use of this software, even if advised of the possibility of such damage. -------------------------------------------------------------------------- -------------------------------------------------------------------------- Contributors: National Center for Supercomputing Applications (NCSA) at the University of Illinois, Lawrence Livermore National Laboratory (LLNL), Sandia National Laboratories (SNL), Los Alamos National Laboratory (LANL), Fortner Software, Unidata Program Center (netCDF), The Independent JPEG Group (JPEG), Jean-loup Gailly and Mark Adler (gzip), and Digital Equipment Corporation (DEC). -------------------------------------------------------------------------- Portions of the HDF Java Products were developed with support from the University of California, Lawrence Livermore National Laboratory (UC LLNL). The following statement applies to those portions of the product and must be retained in any redistribution of source code, binaries, documentation, and/or accompanying materials: This work was partially produced at the University of California, Lawrence Livermore National Laboratory (UC LLNL) under contract no. W-7405-ENG-48 (Contract 48) between the U.S. Department of Energy (DOE) and The Regents of the University of California (University) for the operation of UC LLNL. DISCLAIMER: This work was prepared as an account of work sponsored by an agency of the United States Government. Neither the United States Government nor the University of California nor any of their employees, makes any warranty, express or implied, or assumes any liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately- owned rights. Reference herein to any specific commercial products, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or favoring by the United States Government or the University of California. The views and opinions of authors expressed herein do not necessarily state or reflect those of the United States Government or the University of California, and shall not be used for advertising or product endorsement purposes. -------------------------------------------------------------------------- jhdf-2.9/CTestConfig.cmake0000644000175000017500000000216212050301103016315 0ustar sylvestresylvestre## This file should be placed in the root directory of your project. ## Then modify the CMakeLists.txt file in the root directory of your ## project to incorporate the testing dashboard. ## # The following are required to uses Dart and the Cdash dashboard ## ENABLE_TESTING() ## INCLUDE(CTest) SET (CTEST_PROJECT_NAME "HDFJAVA") SET (CTEST_NIGHTLY_START_TIME "17:00:00 CST") SET (CTEST_DROP_METHOD "http") SET (CTEST_DROP_SITE "nei.hdfgroup.uiuc.edu") SET (CTEST_DROP_LOCATION "/cdash/submit.php?project=HDFJAVA") SET (CTEST_DROP_SITE_CDASH TRUE) SET (UPDATE_TYPE svn) SET (VALGRIND_COMMAND "/usr/bin/valgrind") SET (VALGRIND_COMMAND_OPTIONS "-v --trace-children=yes --tool=memcheck --leak-check=full --track-fds=yes --num-callers=50 --show-reachable=yes --track-origins=yes --malloc-fill=0xff --free-fill=0xfe") SET (CTEST_TEST_TIMEOUT 3600 CACHE STRING "Maximum time allowed before CTest will kill the test.") SET (DART_TESTING_TIMEOUT 3600 CACHE STRING "Maximum time allowed before CTest will kill the test.") SET(CTEST_SUBMIT_RETRY_DELAY 20 CACHE STRING "How long to wait between timed-out CTest submissions.") jhdf-2.9/docs/0000755000175000017500000000000012051203651014104 5ustar sylvestresylvestrejhdf-2.9/docs/index.html0000755000175000017500000001045012050301074016101 0ustar sylvestresylvestre

HDF Java Products

The HDF Java Products include HDFView, Java HDF Object Package, and Java HDF4 and HDF5 Interfaces. For basic instructions on the installation and use of HDF Java Products, please read the guide, Installing and Using HDF Java Products.

Product Description
HDFView A visual tool for browsing and editing HDF4 and HDF5 files.
Java HDF Object Package A Java package that implements HDF4 and HDF5 data objects in an object-oriented form.
Java HDF Interface (JHI) The Java Native Interface to the standard HDF4 library.
Java HDF5 Interface (JHI5) The Java Native Interface to the standard HDF5 library.

Current Release


Download HDF Java Products

HDFView

hdfview downloads HDFView is packaged with an installer for easy download and installation on a variety of platforms.

Old releases are also available at http://www.hdfgroup.org/ftp/HDF5/prev-releases/HDF-JAVA/

Source Distribution

The source distribution is available from http://www.hdfgroup.org/ftp/HDF5/hdf-java/src.

The source distribution includes the Java code to build HDFView, the Java HDF Object Package, and related HDF4 and HDF5 Object Packages. The source distribution also includes Java classes that declare the native methods for Java HDF Interface (JHI) and Java HDF5 Interface (JHI5) and C code that implements the native methods.

JHI requires the HDF4 library (binary), and JHI5 requires the HDF5 library (binary). These are not included in the HDF Java Products source distribution. The HDF libraries can be obtained from the HDF Downloads page.

Building the HDF Java Products from the source distribution is not an easy endeavor. Refer to the following the instructions for more details:

Pre-Built Binaries

Pre-built binaries are available from http://www.hdfgroup.org/ftp/HDF5/hdf-java/bin.

The pre-built binaries include all of the HDF Java Products listed in the table above and the HDF4 and HDF5 libraries required by JHI and JHI5. Binaries are provided for Linux, Mac OS X, Solaris, and Windows in the corresponding platform subdirectories of the ftp site.


jhdf-2.9/docs/title.gif0000755000175000017500000001106112050301074015713 0ustar sylvestresylvestreGIF89a<-9,<,;*>(B)A'E%I&G#L$K"O!QZY]`_dchfikloqtruwyz  w y u s n p l g i j d ` b VRTPNJLFHBD@:<>68402&$"     - . 1 3 5 7 : < >@CDGIKMORTW_adfhj|myouqrsovkwhze|a~][WSQLH"E&D*B.A1@5?9>;=?С 0dp A 0PA  yT`:9MT\fWe agjFYk[Ndʐ3v0aՋ.]rKo~ @! "H V\AS8XD&a 1 .XcE[eevD"k<装#;Dc[C8`hUhw wݥtT^|շbx- P - , +R)2('p&`r%  $8#(" G|!qƊlhae1a|]XTSDOL&K$FQDD?N5pVar{cIFiih8nb|/Bf&r vcVB bL"ɡ6R 6H٥n駡*mQ'$RH",B+m-Wrx@@d٢"g&ijٻXK0|{暩i-@y矁د*ʨqמzGyq*jo \-̼ l>X.褗n騧zAx.;yUOBXiUOWSLmd3hA@Ńd\-#Mn;m{PP:b!3=gOt^JܬLKP y\S.|>QToYH1!et|P U/ J"G7FH e؆ QI_6(Bݝ$!2*D%?gM <*EtQ+6V#} .ͥKnN%68unv0.xK;:ĭk1%dN3?!-z̀haRu3t7%1ul]WdY ^!;$pݰMlJW2db{S I6)NX6>eKZ@i2|.nUzU< u\iW ֹVyl}@$"(GEG1CkG|aT:T aGJTq RL+"2,^&8ɚLHHRFR^ M*f2d$y2P*UfQOUaT QHA9`_U5fi̅ 7xea|x.xt!5#0tq!_!q_3_xцءSr}?1Ad\XDeADJ(txFYF>t&Lem׆1XB+_E0d_c_A`WC6(D8Ƶme#(drsyXԑ4!V('/&Vbob$$c(Bۀ!e1S 8cri #p IV(dk Ypl##wa#9J#{Aȗ]sJK#&mw2OCR$GJҕ%/P"TWCD@DHy2iHV&ujd@Tv@.e!sJs"vf9loWK%gbTge%Ж⎄^hܡhi%D#& f0kiG&'uxT(d())Y&ozN){ug+ws2|#'-ҙTIgdtg踝}ƙph#`Qr |mmv.i9r EMM),jek#c8]w +k$,=3,'ʗcdgt֝#%'Rk9HFH\0'',*n1zDqgs qH|fI]ةgjĝwVslqC00&nSCi'CBs,3DLYU I©%Xv$m!59 #O;pKPڹ4XYaQ GqZ6*Q?vLP#C Wj8$Jj?8k"zoO>7|WtDJ7MGX|-TG{qdCY#;yy oI7 v'IGwZ& F !4z"twzi|Ǯ\{y #<_(-jtSe4-v="s%v X !fB Ѣ:% W@ 6|EԮSC=MۘCPQKMK;X:;yz;;[{;jhdf-2.9/docs/hdf-data-links.html0000755000175000017500000000421412050301074017561 0ustar sylvestresylvestre

Links to public HDF data

Sample HDF5 Programs and Files


Mirador Data Access

Mirador is a new search and order Web interface being developed at the GES DISC for our data users. It has a drastically simplified, clean interface and employs the Google mini appliance for metadata keyword searches. Other features include quick response, data file hit estimator, Gazetteer (geographic search by feature name capability), and an interactive shopping cart.
Mirador Data Access

LP DAAC Data Pool

The Data Pool is the publicly available portion of the LP DAAC online holdings. Data Pool provides a more direct way to access files by foregoing their retrieval from the nearline tape storage devices. All Data Pool holdings are available at no cost to the user.
LP DAAC Data Pool

jhdf-2.9/docs/build_src_unix.html0000755000175000017500000003162212050301074020007 0ustar sylvestresylvestre

Compiling HDF-JAVA Source on Unix

Source Files

After you download and extract the source package, you will have the HDF Java native C code and the Java source code for JNI, HDF-Object package and HDFView. You need to compile the C source and Java source separately. The following instructions tell you how to build the C source in Visual C++ and the Java source from batch file.

HDF Java Product Source
Source directory Description
hdf-java/native/hdflib/ C header files and C source files for HDF4 Java Native Interface
hdf-java/native/hdf5lib/ C header files and C source files for HDF5 Java Native Interface
hdf-java/ncsa/hdf/hdflib/ Java source files for HDF4 Java Native Interface
hdf-java/ncsa/hdf/hdf5lib/ Java source files for HDF5 Java Native Interface
hdf-java/ncsa/hdf/object/ Java source files for HDF-Object package
hdf-java/ncsa/hdf/view/ Java source files for HDFView


Requirements

You need the following libraries in order to compile the HDF Java products.

Unix

The HDF Java products source includes configure and make files to build the Java products. The source code includes the Java code for the HDF native interface to HDF4 and HDF5, the ncsa.hdf.objects package, ncsa.hdf.io packages, and the HDFView packages. HDF4 and HDF5 can be selected or deselected. The source does not include the HDF4 or HDF5 libraries or any dependent libraries.

To build from source requires a C compiler and a Java compiler, JDK1.5.x or above. The autoconf and make files work with Gnu tools and gmake.

Configure script

The first step is to run the configure script. The configure script checks the dependent libraries and other requirements, and generates Makefiles.

The C code for the native interface requires the static HDF libraries and the external filters for HDF.  It is difficult to autodetect these libraries, so the configure requires that the paths be specified. The configure script checks and reports any missing libraries.

The source distribution includes the file "runconfig_example.sh".  This file shows an example for how to set the paths and call configure. (Figure 1). In many cases, this script can be edited to fill in the paths, and then used to configure.


#!/bin/sh

## This is an example script to set the configure parameters for
## the HDF Java products.
##
## The paths need to be set according to the local configuration
##
## May need to adjust the arguments to configure
##
##

##
## IMPORTANT NOTE: The make files require 'gmake'
##
## Be sure to 'setenv MAKE gmake' if necessary
##

INSTDIR= # FILL IN where to install the hdfview.

JAVAINC= # FILL IN path to java includes (jni.h, etc.)
JAVALIB= # FILL IN path to java lib (the rt.jar, etc.)

HDF5= # path to HDF5 installation, e.g., /usr/local/hdf5-1.6.2
HDF4= # path to HDF4 installation (if used)
HDF45= # path to HDF4 to HDF5 installation (if used)


## Autoconf detects shared libraries, but we need static versions
## must set these paths for external libraries needed for HDF libraries.

# JPEG is required by HDF4. If HDF4 is used, _must_ set JPEG
JPEG= # FILL IN path to JPEG installation (the path to libjpeg.a is needed)

# GZIP is required by HDF4 and optional for HDF5.
# If HDF4 is used, _must_ set GZIP
# If HDF5 is used and zlib is used, _must_ set GZIP
GZIP= # FILL IN path to GZIP installation (the path to libz.a is needed)

# SZIP is optional for HDF4 and HDF5.
# If szip is used in one or both HDF libraries, _must_ set SZIP
SZIP= # FILL IN path to SZIP installation (the path to libsz.a is needed)

####

./configure --prefix=$INSTDIR --with-jdk=$JAVAINC,$JAVALIB \
--with-hdf5=$HDF5/include,$HDF5/lib \
--with-hdf4=$HDF4/include,$HDF4/lib \
--with-libsz=$SZIP/include,$SZIP/lib \
--with-libz=$GZIP/include,$GZIP/lib \
--with-libjpeg=$JPEG/include,$JPEG/lib

# other options
#
# --without-hdf4 -- omit HDF4
# --without-hdf5 -- omit HDF5
# --without-libsz -- omit SZIP
# --without-libz -- omit GZIP
# --without-libsz -- omit GZIP
#

#
# Some options required only for macOSX
#
# -build=powerpc-apple
# --with-jdkclasses= # path to classes if not in 'jdk/lib'
# --with-javabin= # path to java bin, if not in 'jdk/bin'

Figure 1.

Build

After configure runs successfully, the source is build with 'make'.

By default make builds all the Java classes and all the C code for the HDF4 and/or HDF5 library if selected. The Java classes are organized into six jar files:

jhdf.jar
The Java interface to the HDF4 Library (requires libhdf.so)
jhdf5.jar
The Java interface to the HDF4 Library (requires libhdf5.so)
jhdfobj.jar
The Generic Data Object package (interfaces), ncsa.hdf.object (See <pointer>)
jhdf4obj.jar
The implementation of the object package for HDF4 (requires jhdf.jar)
jhdf5obj.jar
The implementation of the object package for HDF5 (requires jhdf5.jar)
jhdfview.jar
The Java GUI, requires all jars and C libs.


The C code is organized into two libraries:

libjhdf.so
The JNI wrapper for HDF4, plus the HDF4 library (implements native calls for jhdf.jar)
libjhdf5
The JNI wrapper for HDF45 plus the HDF4 library (implements native calls for jhdf5.jar)

By default, the 'make' builds the C and Java code to create all the jars and libraries.

Optionally, HDF4 or HDF5 may be omitted (--without-hdf4, --without-hdf5). In this case, the corresponding library and jar files will not be built.

The 'make install' installs the jar files and the C libraries in the directory specified by "--prefix" parameter in configure.

See the Makefile for other options.

Running the HDF Java code


The Java HDF has two parts, the Java classes and the C libraries. The Java classes are executed with a Java VM, just as any Java classes. The C libraries are loaded when the Java classes for the JNI are initialized. The C libraries must be in the library search path for the JVM.

Note that while the Java classes are the same for all platforms, there is a different C library for each platform.

Figure 2 shows an example shell script for running the hdfview on linux.  The search paths are set, and then the program is invoked with the correct paths.  Other Unix systems, macosx, and windows would have similar procedure, with details differing for each platform.


#!/bin/sh

# where the HDFView is installed
HDFVIEW_HOME=/programs/java/hdf
export HDFVIEW_HOME

# where Java is installed (requires jdk1.5.0 or above)
JAVAPATH=/opt/jdk1.5.0/bin
export JAVAPATH

# all the jar files
CPATH=$HDFVIEW_HOME"/lib/jhdf.jar"
CPATH=$CPATH":"$HDFVIEW_HOME"/lib/jhdf5.jar"
CPATH=$CPATH":"$HDFVIEW_HOME"/lib/jhdfobj.jar"
CPATH=$CPATH":"$HDFVIEW_HOME"/lib/jhdf4obj.jar"
CPATH=$CPATH":"$HDFVIEW_HOME"/lib/jhdf5obj.jar"
CPATH=$CPATH":"$HDFVIEW_HOME"/lib/jhdfview.jar"

# Example: includes netcdf and fits support
CPATH=$CPATH":""$HDFVIEW_HOME"/lib/netcdf.jar:"$HDFVIEW_HOME"/lib/fits.jar"


if test -z "$CLASSPATH" ; then
CLASSPATH=""
fi
CLASSPATH=$CPATH":"$CLASSPATH
export CLASSPATH


if test -n "$JAVAPATH" ; then
PATH=$JAVAPATH":"$PATH
export PATH
fi


if test -z "$LD_LIBRARY_PATH" ; then
LD_LIBRARY_PATH=""
fi

# example: set path for linux

LD_LIBRARY_PATH=$HDFVIEW_HOME/lib/linux:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH


$JAVAPATH/java -mx512m ncsa.hdf.view.HDFView -root $HDFVIEW_HOME

Figure 2. Example shell script to launch the hdfview

In order to use the JNI interfaces in other products, the jhdf.jar and/or jhdf5.jar (HDF4, HDF5) archives must be in the class path for the Java compilation and run time.  The libjhdf.so and/or libjhdf5.so must be in the LD_LIBRARY_PATH for running.

Problems

The configure and make process has many dependencies, so it is prone to problems.

First, compiling the C into the libjhdf and libhdf5 must use the correct parameters to the C compiler. This depends on the Java Virtual Machine that will be used, as well as the platform. The C code is very portable, but different JVMs have different requirements for how to build loadable libraries. See the documentation for your JVM.

Second, there are many different versions of Java, some may not compile. The HDF Java products have been tested with Sun's Java Development Kit 1.3.1 and 1.4.1.

The most common problem is difficulty running the code after compilation. This is usually caused by problems with the class path or library path. When one of the jar files is missing from the class path, the program will encounter a "Class not found" exception.  A similar error will occur if the library with the native implementation is not found in the LD_LIBRARY_PATH.

The source distribution includes two small test programs that test the link paths (using the install directory specified in the configure). These are in the directory test/linktest. To check the installation, change to the directory, type 'make'. The 'testlink' program runs the TestHDF5Link.java program, and 'testlink4' runs TestHDF5Link.java. These Java program check the loading and invokation of the HDF library. If the link test succeeds, the paths in the script are correct for using the Java HDF products.
jhdf-2.9/docs/header.js0000755000175000017500000000773612050301074015707 0ustar sylvestresylvestredocument.write("\n") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n HDF Java Products") document.write("\n") document.write("\n ") document.write("\n") document.write("\n") document.write("\n") document.write("\n") document.write("\n") document.write("\n") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n
  ") document.write("\n \"www.hdfgroup.org\"") document.write("\n   ") document.write("\n ") document.write("\n
") document.write("\n") document.write("\n") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n ") document.write("\n
  ") document.write("\n") document.write("\n
 ") document.write("\n

") document.write("\nHDFView") document.write("\n

") document.write("\n") document.write("\n

") document.write("\nJNI Libraries") document.write("\n

") document.write("\n") document.write("\n

") document.write("\nHDF-Object") document.write("\n

") document.write("\n") document.write("\n

") document.write("\nJava Docs") document.write("\n

") document.write("\n") document.write("\n

") document.write("\nHDF Data") document.write("\n

") document.write("\n") document.write("\n

") document.write("\nDownload All") document.write("\n

") document.write("\n") document.write("\n") document.write("\n
   ") document.write("\n") jhdf-2.9/docs/hdfview/0000755000175000017500000000000012051203651015540 5ustar sylvestresylvestrejhdf-2.9/docs/hdfview/UsersGuide/0000755000175000017500000000000012051203651017617 5ustar sylvestresylvestrejhdf-2.9/docs/hdfview/UsersGuide/index.html0000755000175000017500000001615512050301073021623 0ustar sylvestresylvestre

[Index] [1] [2] [3] [4] [5] [6] [7]

HDFView User's Guide

This document is a user's guide on how to use HDFView. For information on implementing an HDFView module, please read A User's Guide on How to Implement HDFView Modules


HDFView is a graphic utility designed for viewing and editing the contents of HDF4 and HDF5 files. This document provides the following information:

  • User instructions for HDFView
  • A brief discussion of the HDF object model (Details of the HDF object model are available from HDF Object Package.)

Table of Contents


[Index] [1] [2] [3] [4] [5] [6] [7]

jhdf-2.9/docs/hdfview/UsersGuide/ug05spreadsheet.html0000755000175000017500000005131112050301073023515 0ustar sylvestresylvestre

[Index] [1] [2] [3] [4] [5] [6] [7]

Chapter 5: Table Viewer

HDFView displays datasets in a two-dimensional table, the TableView. The TableView allows you to view and change the values of an image's dataset. You can select rows and columns and plot the row/cloumn data in a line plot. The current version of HDFView does not allow you to change data values of an HDF4 Vdata or an HDF5 compound dataset.

If a dataset has three or more dimensions you can only view two dimensions at a time. Using the Dataset Selection Dialog , you may select any two dimensions of the dataset to display and a third dimension to flip the two-dimension table along that dimension.


5.1 Open Dataset

To open the entire contents of a dataset, double-click on the dataset or select the dataset, then choose the “Open” command from the Object menu or popup menu. A new spreadsheet is created in the content panel of HDFView.

HDFView displays numerical datasets in a “spreadsheet”, which shows the data values in a grid. A one-dimensional dataset is displayed as a single column and a number of rows of dimension size. A two-dimensional dataset is displayed as a number of columns of the first dimension size and a number of rows of the second dimension size, i.e. dim[0]=height and dim[1]=width by default. You can change the order of the dimensions using the “Open As” command.


Spreadsheet with a 2-D dataset

5.2 Subset and Dimension Selection

Opening an entire large dataset may cause an ‘Out Of Memory Error’ because the Java Virtual Machine cannot create the required objects. HDFView provides options to select a subset of a dataset for display. You can also select dimensions and the order of dimensions to display, e.g., to switch the columns and rows.

To make a selection, select a dataset from the tree and choose the “Open As” command from the Object menu or the popup menu. The selection dialog box appears. You can make a selection by dragging the mouse on the preview image or entering the values of start, end, and stride. The figure below shows that a subset is selected from a true color image with the size of 3796 x 3720.


The Dataset Selection dialog box

By default, a scalar dataset (e.g., a dataset or SDS of numbers) is displayed in a spreadsheet. You can also display a dataset as an image. To display a dataset as an image, click the Image radio button in the Dataset Selection dialog box and select a predefined color table for the dataset. This operation takes the data values of the dataset as values of an indexed array, i.e., as indexes into a palette. The default palette will be used to create the image from the dataset if it does not have an attached palette. If the data values are not integers or have a range outside 0 to 255: they are binned into 256 equally spaced intervals.

5.2.1 Dimension Size

A subset is determined by the start and end locations, and the stride. The “Start” array determines the starting coordinates of the subset to select. The “End” array determines the ending coordinates of the subset to select. The “Stride” array chooses array locations from the dataspace with each value in the stride array determining how many elements to move in each dimension. Setting a value in the stride array to 1 moves to each element in that dimension of the dataspace; setting a value of 2 in a location in the stride array moves to every other element in that dimension of the dataspace. In other words, the stride determines the number of elements to move from the start location in each dimension.

HDFView GUI uses a common-sense indexing scheme for selecting rows and columns. If the user wants a subset that begins at i,j the START coordinates will start at j, j instead of i-1, j-1.

The following is an example of a 2-D integer dataset of size 8 X 9.

2-D int array of size 8X9
111213141516171819
212223242526272829
313233343536373839
414243444546474849
515253545556575859
616263646566676869
717273747576777879
818283848586878889

The following are a few examples of subsets of the 2-D int array.


The whole dataset -- start=(0, 0), end=(7, 8) and stride=(1, 1)


Subset -- start=(2, 3), end=(6, 7) and stride=(1, 1)


Subset with stride -- start=(2, 3), end=(7, 8) and stride=(2, 2)

5.2.2 Three or More Dimensions

For a three or more dimensional dataset, the first two dimensions are displayed as a 2-D spreadsheet, and the third dimension is chosen as the page number of the 2-D spreadsheet, i.e. dim[0]=height, dim[1]=width and dim[2]=depth by default. Using the “Open As” option to change the default order of dimensions, the user can flip the page forward or backward to look at the 2D data values at different positions along the third dimension. The current page number is displayed in the status bar of the HDFView.

To flip a data sheet of a 3-D dataset, use the “First”, “Previous”, “Next” or “Last” command on the tool bar.

The following figure shows how a 4-D integer dataset of size 5 x 4 x 3 x 2 is displayed. The data is displayed in a spreadsheet of 5 X 4 (dim0 by dim1), of page 2 (dim2), cutting locations 2 at dim3.


Spreadsheet with 4-D dataset

5.2.3 Swap Dimension and Data Transpose

By default, HDFView chooses the first coordinate, dim[0], as the ROW index and the second coordinate, dim[1], as the COLUMN index. For example, a 2-D dataset of 8 X 9 (dim0=8, dim1=9) is displayed as eight rows and nine columns by default.

You can also swap the dimension order. However, swapping the dimension order does not change the data order. To change the data order, use the “Transpose” option. Swapping and transposing only apply to the data in the display and not to the data in the file.

Let us use the previous example to demonstrate this procedure.

2-D int array of size 8X9
111213141516171819
212223242526272829
313233343536373839
414243444546474849
515253545556575859
616263646566676869
717273747576777879
818283848586878889

By default, the dataset is displayed at eight rows and nine columns.


Default dimension order -- row index = dim[0], column index = dim[1]

Swap row and column dimensions to display the dataset as nine rows and eight columns. The order of data stays the same (counting from the location [0, 0], [0, 1], ... [2, 0], [2, 1], ...).


Swap row/column dimensions -- row index = dim[1], column index = dim[0]

In some cases, we also want to transpose the data (changing the data order) when we swap the row and column dimensions. To transpose the data, select the “Transpose” option from the drop-down menu. For example, transpose the data to display the dataset as nine rows and eight columns. The order of the data is also changed


Transpose data -- row index = dim[1], column index = dim[0]

5.2.4 Compound Dataset Options

HDFView displays HDF4 Vdata and a simple, one-dimension HDF5 compound dataset (without a nested compound) as a 2-D table with rows as records and columns as fields/members.


Compound dataset

You can also select fields/members to display. For a contiguous selection, hold down the “Shift” key while clicking the first and last fields/members of your selection. For a discontiguous selection, hold down the “Ctrl” key while clicking the fileds/members that you want to select.


Field/Member selection of a compound dataset

HDFView displays a nested HDF5 compound dataset as a flat list of members. The nested names are separated by “.” (a period). For example, if a compound dataset “A” has the following nested structure:

    A --> a_name
    A --> b_name
    A --> c_name
    A --> nested_name --> a_name
    A --> nested_name --> c_name
    i.e.
    A = {a_name, b_name, c_name, nested_name{a_name, c_name}}

The flat list of members of the compound dataset “A” will be {a_name, b_name, c_name, nested_name->a_name, nested_name->c_name}}.


Nested compound dataset

HDFView displays multi-dimension compound datasets as a 2-D table with nested sub-columns. The members are shown in the sub-columns.


2-D compound dataset

5.3 Display a Column/Row Line Plot

Column or row data of numerical values can be displayed in a simple line plot. Select rows or columns by dragging the mouse on the rows or columns that you want to plot; then click the chart icon: . The row or column data is plotted against a column or row index, respectively.

The following figure shows that data of five columns are displayed in five lines of different colors. The horizontal labels are the row index of the 100 data points. The vertical labels are the ten points of equal data range with the maximum and minimum of the column data. The line legend is drawn at the right of the line plot with column names and line colors.


Line plot

5.4 Change Data Value

You can change the values of a dataset in two ways: type data into the table cell or paste data from the system clipboard. HDFView rejects invalid data values. For example, it does not accept a floating point number into an integer dataset. The table below lists the rules for entering data. Any changes of data values only exist in memory. They are not saved to file until you choose “Update File” from the Object menu, or, when you dismiss the table, you will be asked if you want to save the change to the file.

Data type Acceptable formats
byte -127 to 128
short -32768 to 32767
int -2147483648 to 2147483647
float, double Numbers of the form “99.9” or “8”, and “-9.9” or “-9”, and “.9” or “-.9” Numeric overflow or underflow will be detected.
string A string longer than the stored value will be silently truncated when written to the file.
unsigned byte 0 to 255
unsigned short 0 to 65535
unsigned int 0 to 4294967295
Data formats for entering data

Data values can be copied with “Copy” and “Paste”. Data can be copied within a spreadsheet or between two spreadsheets. To copy data, select the data cells to copy, then choose the “Copy Data” command from the Object menu. Then select the cells to paste into and select the “Paste Data“ command from the Object menu.

You can also copy and paste between HDFView and other applications. To copy external data from other applications such as a text editor or Microsoft Excel, select and copy data from the application, then paste the data into the HDFView TableView, and vice versa.

You can also change values by using predefined math functions. To change table values, select the data area and choose the “Math conversion” command from the Table menu. A list of predefined mathematic functions are provided. Select a function and enter the function parameters. The values of the selected data cells will be changed based on the mathematic function.

5.5 Save Data Values to a Text File

Writing table data into an ASCII file is nearly transparent. Select “Export data to Text File” from the Table menu, and the Save Current Data to Text File dialog box pops up for you to enter the name of the file. The data values of the current table will be written to the file. The data values are separated by the data delimiter specified by the user options. The text file does not contain any datatype and dataspace information..


Save current data to text file

5.6 Import Data from a Text File

You can fill the table cells directly from a text file. Choose the “Import Data From Text File” command from the Table menu and select the text file to import. The data values must be separated by a space or the delimiter specified in “User Options”. The cells of the table are filled row by row starting with the selected cell. The line breaks in the text file are not important. For example,

10 11 12 13 14 15
16 17 18 19 20 21

and

10 11 12 13
14 15 16 17
18 19
20 21

are the same.

5.7 Dataset storing references

A dataset can store reference values of other datasets in the same file.

5.7.1 Dataset Storing Object References

A dataset can store object references of other datasets. You can open a dataset containing object references. You can then right click on any value in the dataset and it will give two options, to either open as a table or an image.


Dataset storing object references

If opened as a table, then the dataset of reference value “7428” is opened as shown below.


Dataset pointed by object reference

5.7.2 Dataset Storing Dataset Region References

A dataset can store dataset region reference values. You can right click on any value to either show the dataset as a table or a image.


Dataset pointed by region reference

5.8 Save Data Values to a Binary File

The table data can be written to a binary file. Select “Export Data to Binary File” from the Table menu. Select the order in which you want the bytes to be. The Save Current Data to Binary File dialog box pops up for you to enter the name of the file. The data values of the current table will be written to the file. The binary file does not contain any datatype and dataspace information. Currently, only the entire contents of the table are wrriten to a binary file..


Save current data to binary file

5.9 Import Data from a Binary File

You can fill the table directly from a binary file. Choose the “Import Data From Binary File” command from the Table menu and select the byte order. It is assumed that the user should know the data type in the binary file and the byte order. Select the binary file to import. The cells of the table are filled with the corresponding values.


[Index] [1] [2] [3] [4] [5] [6] [7]

jhdf-2.9/docs/hdfview/UsersGuide/ug02start.html0000755000175000017500000002540112050301073022341 0ustar sylvestresylvestre

[Index] [1] [2] [3] [4] [5] [6] [7]

Chapter 2: Getting Started

This chapter assumes that you have installed HDFView and, along with “Chapter 3: The HDF Object Model,” is designed to help you get to the point where you are actually looking at HDF datasets.


2.1 The Main Window

When you first open HDFView, the HDFView window appears with an empty tree and data panel. After you open an HDF file, the structure of the file is displayed in the Tree Panel. The content of a data object is displayed in the Data panel by opening the data object.

The main window consists of five components: Menu bar, Tool bar, File bar, Tree panel, Data Panel, Info panel.


The main window

  • Menu bar
    The Menu bar is where you choose menu commands: “File”, “Window”, “Tools”, and “Help”.
  • Tool bar
    The Tool bar is located under the menu bar and displays buttons with icons that are shortcuts for commonly performed tasks, such as opening and closing a file zooming in or out of an image, or flipping forward and backward through data pages.
  • File bar
    The File bar consists of a File/URL text field in which you enter information that leads or points to a file that you want to open. Valid file names include an absolute file name, a file path, and a URL to a remote file, such as /hdf-java-html/hdf5_test.h5.
  • Tree panel
    The Tree panel is the left panel in the HDFView window. It displays the group structure of an HDF file as a tree of “folders.” Other objects, such as dataset and image, are displayed as leaf objects in the tree.
  • Data panel
    The data panel is the right panel in the HDFView window where the content of data objects is displayed. All the data windows are laid out in the data panel. You can display more one documents in the data panel.
  • Info panel
    The Info panel is the bottom panel that spans the width of the HDFView window. It displays status information or metadata. Click the tab “Log Info” or the tab “Metadata” to view status information or metadata information, respectively. A status message includes file or data information, warning or error messages and the status of data processing. The Info panel can also be used as a quick way to view metadata of the selected object in the tree view when “Metadata” tab is selected.

Menu bar

The Menu bar is at the top of the HDFView window. You can select a menu command from menu items or press key combinations from the keyboard to invoke the menu item's action without navigating through the menu hierarchy. For example, to exit HDFView, you can either press “Ctrl+Q” on the keyboard or select the “Exit” item from the “File” menu.

File menu
The File menu contains commands to open and close files, create and save files, and exit HDFView. It also displays a list of recently opened files from which you may selcct to reopen.


File menu

Window menu
The Window menu displays a list of data windows along with close, tile, and cascade window commands. You can bring a data window to the front by choosing the data name from the Window menu. The “Cascade” and “Tile” commands cascade or tile all open windows. The “Close” command closes the active data window. The “Close All” command closes all open windows. All open data windows are listed at the bottom of the Window menu. Select one of the items on the list to bring that window to the front.


Window menu

Tools menu
The Tools menu contains a list of commands to launch tools such as image conversion, and user options. The current version has only one item: “User Options”. The “User Options” command launches a dialog box that allows you to change user preferences: the path of the User's Guide, font size, and delimiter. When you launch the User's Guide command from the Help menu, the help tool opens the User's Guide specified by the path. The font size will be used to specify the display font size of the tree view and elsewhere. The data delimiter determines the separator used when you save data values into text files or paste data values from other applications to an HDFView spreadsheet.


Tools menu

Help menu
The Help menu displays the User's Guide, the version of the HDF4 and HDF5 libraries, and the About box.


Help menu

2.2 Opening a File

Select the “Open” command from file menu or click the “Open” icon in the tool bar to invoke the local file manager, and select a file to open from the local file manager. Selecting “Open Read-Only” opens a file with read-only permission, which means that editing functions are disabled and changes are not allowed.


Local file manager (Windows)

2.3 Tree View of File Hierarchy

An HDF file contains one or more objects, optionally grouped in a hierarchy. For general information about the structure and contents of HDF files, see the HDF documentation at HDF5 Documentation and HDF4 Documentation.

The structure of the file is displayed in the Tree panel, which is the left panel in the HDFView window. Data objects are represented as icons, and groups are represented by folders. An HDF file may contain groups, datasets (arrays), committed datatypes, and links.

The hierarchy of the file can be navigated by selecting folders to “open” a group, which displays the objects contained by the group. When an object is selected, the data is displayed appropriately in the data panel on the right.

You can open multiple files at one time. Files are listed as root objects in the tree. The following figure illustrates that an HDF5 file, hdf5_test.h5, and an HDF4 file, annras.hdf, are currently open.


Tree view

2.4 Viewing Status Information

Short status information and feedback messages are displayed in the information panel. Such information includes error messages and feedback from user's actions. Click on the “Log Info” and “Metadata” tabs to switch between viewing status information and viewing metadata.

2.5 Viewing HDF Metadata

To see the metadata of a data object, right-click the data object. The Properties dialog box opens and displays metadata information such as name, type, attributes, datatype, dataspace, and members.


Properties dialog box

To view a user block in text, right-click the file node (the root group) to open the Properties dialog box. Click the “User Block” tab in the dialog box to show the user block information in text.


User block in text

2.6 Selecting GUI Modules

HDFView displays data with a default GUI module when opening a dataset by default. You can set default modules from the Tools menu: click on “Tools” --> “User Options” --> “Default Module”. The new default Tree View takes effect only after you restart HDFView.


Set default modules

By default, data or attribute is displayed with default modules. You can also select a specific module for display. To select a module, use the “Open As” option from the popup menu from the TreeView to choose an optional TableView or ImageView.


Select an ImageView


[Index] [1] [2] [3] [4] [5] [6] [7]

jhdf-2.9/docs/hdfview/UsersGuide/RELEASE.txt0000644000175000017500000001154412050543762021456 0ustar sylvestresylvestreThe current HDF-Java products can be downloaded at http://www.hdfgroup.org/downloads/ Files included in the release: /src -- include all source files /bin/$platform -- pre-built binaries for specific platforms (limited platforms) /hdfview -- HDFView installation program (limited platforms) HDF Libraries ============================================================================================== This release was built and tested with HDF 4.2.8 and HDF5 1.8.10. $YOUR-HDF-JAVA-HOME/lib//*.settings files include information on the platform version and compiler used to build HDF4 and HDF5. JDK ============================================================================================== This release was built and tested with JDK 1.7. Platforms ============================================================================================== This release was built and tested for the following platforms: 64-bit distribution -- runs on 64-bit systems with 64-bit JRE only * Linux * Mac Intel * Solaris * Windows 32-bit distribution -- runs on 32-bit systems or 64-bit systems with 32-bit JRE * Linux * Mac Intel * Solaris * Windows Changes to the Java HDF5 Interface(JHI5) ============================================================================================== * Added options to sort file objects by index * Fixed native method, h5str_sprintf(), for incorrect doubles (floats) and a crash * Fixed a segmentation fault on null datasets of variable-length string type Major Enhancements ============================================================================================== * Added a feature to show groups/attributes in creation order * Excluded fill values from data calculations * Added a 'reload' option to quickly close and reopen a file Major Bug Fixes ============================================================================================== * Fixed HDFView to display 64-bit unsigned integers * Fixed HDFView to display SCALAR arrays * Fixed a fill value problem on Macs * Fixed ImageView showing the wrong values for 3D arrays Limitations / Known Problems ============================================================================================== * HDFView does not support undo operations; the editing results go to files and cannot be recovered. * HDFView does not support conversion between HDF4 and HDF5. * HDFView supports only indexed images with RGB color model or 24-bit true color images. * Directly using multiple dimensional arrays causes a performance problem because there is no direct mapping for multiple dimensional arrays between Java and C. * HDF (4&5) APIs with function pointers are not supported in HDF-Java. * HDF-Java does not support any filter/feature that is not compiled and distributed with the HDF4/5 libraries. For example, HDFView will not be able to show data that requires a compression filter that is not in the HDF4 or HDF5 library. * Specific to HDF4: -- Deleting an object or attribute from an HDF4 file is not supported. Deleting objects in HDF4 may leave dangling objects or corrupt the file. -- HDFView cannot modify compressed HDF4 SDS if the rank is greater than two because the existing compression algorithms supported by HDF do not allow partial modification to a compressed data stream. -- HDFView cannot modify HDF4 vdata. HDF4 only writes vdata by records. HDF-Java reads data by vdata fields because HDF-Java does not support the data structure of a vdata record. * Specific to HDF5: -- Writing compound data is limited to simple cases. For example, base compound fields that have primitive types such as integers, floats, or characters can be written. HDFView does not write complex compound data. For example, HDFView cannot write a dataset that has a compound datatype with a region reference. -- Writing variable-length data is not supported except for datasets where each data point is a single variable-length string. -- There is no single JNI function that can handle HDF5 library functions that have different return types for version 1.6 and version 1.8. An additional function has been added to the JNI. For example, * public synchronized static native int H5Tget_size(int type_id) * public synchronized static native long H5Tget_size_long(int type_id) Other Notes ============================================================================================== Made changes to Examples to eliminate deprecated functions. jhdf-2.9/docs/hdfview/UsersGuide/ug03objects.html0000755000175000017500000003266712050301073022652 0ustar sylvestresylvestre

[Index] [1] [2] [3] [4] [5] [6] [7]

Chapter 3: HDF Object Model

This chapter provides basic information of about the HDF object model. For more details of the object model, visit the HDF Object Model website at /hdf-java-html/hdf-object/

3.1 Overview

HDF files may contain many types of data objects that a scientist might need. HDFView displays the data objects appropriately according to their types. For example, a two-dimension dataset with an associated palette will be displayed as an image. When you open an HDF file with HDFView, you see the tree structure of an HDF file, showing the objects and their groupings. You can select an object from the tree to view its content.

HDF4 (i.e. HDF version 4) is based on the original 1988 version of HDF. Versions 1, 2, 3, and 4 of HDF were all backward compatible, and HDF4 can access files created by all earlier versions. HDF5 is a completely new format and library. Although they are conceptually related, HDF5 files cannot be read by the HDF4 library and vice versa. HDF5 was designed to address some of the limitations of HDF4 and to address and exploit current and anticipated requirements of modern systems and applications.

HDFView is built on a common HDF object model and suports both versions of HDF. The HDF object model was designed in such a way that the HDF4 and HDF5 objects interact with users through a common object layer so the user interface design will be independent of the file format (HDF4 or HDF5). Such a design allows the HDFView to support and convert objects of different formats (HDF4 and HDF5).


3.2 The HDF Object Package

The HDF Object Package is a Java package that implements HDF4 and HDF5 data objects in an object-oriented form. The HDF Java Object Package provides common standard Java APIs to access both HDF4 and HDF5 files.

The HDF Object Package is NOT a “wrapper” for the native HDF libraries, and it requires the HDF4 and HDF5 wrappers. The HDF4 and HDF5 wrappers are separate HDF Java products. For details about the HDF4 and HDF5 native interfaces, read Java HDF Interface (JHI) and Java HDF5 Interface (JHI5).

The HDF Object Package implements higher level APIs and encapsulates HDF library calls into an object-oriented fashion for easy access to HDF files. For example, to retrieve data content from an HDF5 dataset by using the HDF5 library APIs directly, you have to make many calls, such as, get the datatype information (datatype class, size, sign, and etc), get the dataspace information (number of dimension, dimension sizes), and allocate the data buffer. The HDF Object Package puts all these calls into a single call - read().

The HDF Object Package, ncsa.hdf.object, provides classes that reflect fundamental concepts to the design of HDF objects. Objects of HDF5 (group and dataset) and HDF4 (group, multi-dimension array, raster image, vdata and annotation) are presented as Java classes.

The HDF Object Package has two major goals. First, it simplifies the process of reading information from or writing data to a file because the details of accessing the HDF library are encapsulated into respective classes. Second, HDF4 and HDF5 objects are inherited from the same common object and interface. Applications can use the HDF Object Package to access objects from either HDF4 or HDF5 in a uniform way, without accessing the libraries directly. The following diagram explains the relationship of the object package, HDF JNI, and application.

HDF Applications <==> HDF Object Package <==> HDF4/5 Java Wrapper (JNI4/5) <==> HDF File

3.3 Class Hierarchy

The HDF Object Package implements an abstract data model, and the objects of the HDF4 and HDF5 data models are represented as instances of the abstract objects. The abstract class HObject has two fundamental abstract classes, Group and Dataset, and all HDF5 and HDF4 objects are a sub-type of one of these abstract classes.

The following figure shows the class hierarchy of the HDF Object Package. In the following, we give a brief description of these Java classes of HDF objects. For details, see the Java docs at javadocs .

The classes at the top of the class hierarchy are interfaces and abstract classes. These interfaces and abstract classes define all the necessary public APIs to retrieve information and data from HDF files. The classes at the bottom are the implementing classes, which implement the public APIs defined by the top classes.


The class hierarchy of HDF objects


Interface Summary

DataFormat DataFormat describes general I/O operations of a data object, such as read data content or data attributes into memory, write data content or data attributes onto disk.
FileFormat FileFormat defines general I/O accessing interface to file resources, such as open/close a file, and retrieve the file structure.
Metadata Metadata is a general interface about supporting data.

Class Summary

Attribute Attribute holds a (name, value) pair of an HDF4/5 attribute.
CompoundDS CompoundDS is the superclass for HDF4 and HDF5 Compound Dataset.
Dataset Dataset is the superclass for HDF4/5 Dataset, inheriting the HObject.
Datatype Datatype holds a (name, value) pair of an HDF4/5 attribute.
Group Group is the superclass for HDF4 and HDF5 group, inheriting the HObject.
H4Datatype H4Datatype holds a (name, value) pair of an HDF4/5 attribute.
H4File H4File provides file level APIs.
H4GRImage H4GRImage describes a HDF4 general raster(GR) image and operations performed on the GR image.
H4Group H4Group is a vgroup in HDF4, inheriting from Group.
H4SDS H4SDS describes HDF4 Scientific Data Sets (SDS) and operations performed on the SDS.
H4Vdata H4Vdata describes a multi-dimension array of HDF4 vdata, inheriting CompoundDS.
H5CompoundDS H5CompoundDS describes a multi-dimension array of HDF5 compound dataset, inheriting CompoundDS.
H5Datatype H5Datatype holds a (name, value) pair of an HDF4/5 attribute.
H5File H4File provides file level APIs.
H5Group H5Group represents a HDF5 group, inheriting from Group.
H5ScalarDS H5ScalarDS describes a multi-dimension array of HDF5 scalar or atomic data types and operations performed on the scalar dataset, such as byte, int, short, long, float, double, and string.
HObject HObject is the superclass for the HDF data hierarchy, inheriting the DataFormat interface.
ScalarDS ScalarDS is the superclass for HDF4/5 ScalarDS, inheriting Dataset.

3.4 Using the HDF Object Package

The HDF Object Package is used by Java applications to access HDF4 and HDF5 files without directly calling the HDF4 and HDF5 library APIs. Library calls are encapsulated into respective classes. The HDF Object Package requires the Java HDF Interface (JHI) and the Java HDF5 Interface (JHI5).


The software packages


The following examples show how to retrieve file hierarchy using the HDF Object Package.

Example 3.1: Retrieve and print HDF5 objects

import ncsa.hdf.object.*;     // include the common HDF object package
import ncsa.hdf.object.h5.*;  // include the HDF5 object package
import ncsa.hdf.hdf5lib.*;    // include the Java HDF5 interface

/**
 * Retreve and print HDF5 objects from file hdf5_test.h5
 * @version 1.3.0 10/26/2001
 * @author Peter X. Cao
 *
 */
public class TestH5File
{
    public static void main(String[] argv)
    {
        // create an H5File object
        H5File h5file = new H5File("hdf5_test.h5", HDF5Constants.H5F_ACC_RDONLY);

        try
        {
            // open file and retrieve the file structure
            h5file.open();
        }
        catch (Exception ex)
        {
            System.out.println(ex);
        }

        javax.swing.tree.MutableTreeNode root = h5file.getRootNode();
        if (root != null)
        {
            printNode(root, "    ");
        }

        try { h5file.close(); }
        catch (Exception ex ) {}
    }

    // print out the data object recusively
    private static void printNode(javax.swing.tree.TreeNode node, String indent)
    {
        System.out.println(indent+node);

        int n = node.getChildCount();
        for (int i=0; i<n; i++)
        {
            printNode(node.getChildAt(i), indent+"    ");
        }
    }
}

Example 3.2: Retrieve and print HDF4 objects

import ncsa.hdf.object.*;    // include the common HDF object package
import ncsa.hdf.object.h4.*; // include the HDF4 object package
import ncsa.hdf.hdflib.*;    // include the Java HDF5 interface

/**
 * Retreve and print HDF4 objects from file annras.hdf.
 * @version 1.3.0 10/26/2001
 * @author Peter X. Cao
 *
 */

public class TestH4File
{
    public static void main(String[] argv)
    {
        // create an H4File object
        H4File h4file = new H4File("annras.hdf", HDFConstants.DFACC_READ);

        try
        {
            // open file and retrieve the file structure
            h4file.open();
        }
        catch (Exception ex)
        {
            System.out.println(ex);
        }

        javax.swing.tree.MutableTreeNode root = h4file.getRootNode();
        if (root != null)
        {
            printNode(root, "    ");
        }

        try { h4file.close(); }
        catch (Exception ex ) {}
    }

    // print out the data object recusively
    private static void printNode(javax.swing.tree.TreeNode node, String indent)
    {
        System.out.println(indent+node);

        int n = node.getChildCount();
        for (int i=0; i<n; i++)
        {
            printNode(node.getChildAt(i), indent+"    ");
        }
    }
}


[Index] [1] [2] [3] [4] [5] [6] [7]

jhdf-2.9/docs/hdfview/UsersGuide/ug06imageview.html0000755000175000017500000003320512050301073023166 0ustar sylvestresylvestre

[Index] [1] [2] [3] [4] [5] [6] [7]

Chapter 6: Image Viewer

Image Viewer is a graphical window that displays HDF images. HDFView is a simple image viewer for HDF4/5 and has a limited function for processing an image.

An HDF4 image is a raster image of 8-bit pixels with an indexed RGB color table, or a 24-bit true color image. The HDF4 library provides image APIs to access image data and color tables.

An HDF5 image is a dataset that conforms to the HDF5 Image Specification. HDFView supports two types of images: indexed and true color. Both indexed image and true color image have predefined attributes and data layout according to the HDF5 image specification. For more details about HDF5 image, see the HDF5 Image Specification.


6.1 Display a 2-D or 3-D Image

HDFView displays HDF4 raster images or HDF5 datasets that follow the HDF5 Image and Palette Specification for indexed images with an 8-bit standard RGB color model palette or three-dimensional true color images. Other image formats supported by the Image and Palette Specification are not supported by this tool.

If an image is larger than the visible area of the image viewer, users can grab and move the image by mouse-drag. Users can also use the side scroller bar to move the image to a desirable view area. Use Shift+Mouse-drag to select a subset of an image in the image viewer.

Fill values are displayed as the color black. Fill values are also excluded from calculating the minimum, maximum and other statistics.

6.1.1 Indexed Image (8-Bit)

An indexed image is one of the following:

  • An HDF4 RI8 image
  • An HDF5 dataset that conforms to the HDF5 Image specification, and is an “IMAGE_SUBCLASS=IMAGE_INDEXED”
  • An SDS or HDF5 dataset with data that can be interpreted as an image

The dataset is displayed as a Java image using IndexColorModel. The dataset is converted to a raster image using the first palette specified by the PALETTE attribute, or the default palette for HDF4. Multiple user-defined palettes (i.e., the PALETTE attribute may be a list) are not supported in version 1.0.

The dataset of an indexed image holds the values of indices of the color look-up table (palette). The dataset is converted into image pixels by looking up the index in the color table. The following figure is an example of mapping dataset values into pixels.


Mapping of dataset values to image pixels

For a two-dimensional indexed image, HDFView assumes that the width of the image is the size of the second dimension and the height of the image is the size of the first dimension, i.e. dim[0]=height and dim[1]=width.

Although HDFView displays the entire image by the order of (dim[0], dim[1], dim[2])=(depth, height, width) by default, you can always change the order and select a subset for the display as discussed in Chapter 5.

HDFView also displays a three-dimensional array as an array of 2-D images arranged along the third dimension, i.e. dim[0]=depth, dim[1]=height and dim[2]=width. You can flip back and forth to look at images at a different position of the depth dimension. For instance, if the dataset is 20 x 400 x 600 (dim[0]=20, dim[1]=400, and dim[2]=600), HDFView will display it as 20 images each with the size of 600 x 400 (width is 600, height is 400). However, a three-dimension image of [1][height][width] or [height][width][1] is treated as a two-dimension indexed image of [height][width].

A 2-D or 3-D SDS or HDF5 dataset with integer or float data can be displayed as an indexed image using the “Open As” selection from the Object menu. Since the dataset does not have a palette, a default palette is used. The palette is chosen from the “Select Palette” menu in the “Dataset Selection” window. The predefined palettes include:

  • gray
  • rainbow
  • nature
  • wave
If no palette is selected, a gray scale will be used.

Converting non-byte data to byte data

Non-byte data will be converted to image byte data in one of the two algorithms: simple linear conversion or auto gain conversion.

Simple linear conversion
y = [(x - min)/(max-min)]*255.
Where,
x is the original value;
y is the byte value.
Auto gain conversion
y = (x + bias) * gain.
Where,
x is the original value;
y is the byte value;
gain = MAX_VALUE / (max-min);
bias = -min;
MAX_VALUE is the max value of original data type, e.g. USHRT_MAX for unsigned short integers.

Auto gain algorithm will be used only if Auto gain is selected from “Tools” ==> “User Options”, and the original dataset does not have any attached palette and you did not selected any palette from “Open As” windows. Simple linear conversion will be applied to all other cases. The image values will be different and the image will look different if different algorithm is used.

6.1.2 True Color Image

In the case of an image with more than one component per pixel (e.g., red, green, and blue), the data may be arranged in one of two ways. HDFView only supports three color components: red, green and blue.

Following HDF4 terminology, the data may be interlaced by pixel or by plane. For an HDF5 Image dataset the interlace should be indicated by the INTERLACE_MODE attribute. In both cases, the dataset will have a dataspace with three dimensions, height, width, and components. For pixel interlace, the data is arranged in the following order: [height][width][pixel components]. For plane interlace, the data is arranged in the following order: [pixel components][height][width].

The translation from pixel values to color components for display or processing purposes is a one-to-one correspondence of data values to components. Data of RGB color components is converted into byte data, which is packed into a single int pixel. The Java Image is created with a DirectColorModel, with masks to define packed samples. This color model is similar to an X11 TrueColor visual. The default RGB ColorModel is specified with the following parameters:

 Number of bits:        32
 Red mask:              0x00ff0000
 Green mask:            0x0000ff00
 Blue mask:             0x000000ff
 Alpha mask:            0xff000000
 Color space:           sRGB
 isAlphaPremultiplied:  False
 Transparency:          Transparency.TRANSLUCENT
 transferType:          DataBuffer.TYPE_INT

The following figure shows examples of true color images. The image on the left is pixel interleaving with dimensions of [149][227][3]. The image on the right is plane interleaving with dimensions of [3][149][227].


True color image displayed in the Image View

6.2 Zoom/Flip/Contour Image

HDFView supports only limited image manipulation such as zooming, flipping, and contour. You can zoom in and out of an image. The minimum zoom factor is 1/8 (reduced to 1/8 the size) and the maximum is 8 (magnified to 8 times the size). Reduction (zoom out) is done by sampling pixels, for example, a 1/2-size image is created by selecting every second pixel. Magnification (zoom in) is done by replicating pixels.

You can also flip an image horizontally or vertically. Flipping an image will change the coordinates of the image. This technique can be used to adjust images that may have been created with different origins from the defaults.

Manipulating the “contour” creates a contour plot of the pixel values. The contour can have from three to nine contour levels. Level three provides less details of contour and level nine provides more. Repeated contour operations show a cumulative effect of contouring. For example, if you contour an image with level 3 and then contour that resulting image with level 4, the final image shows the cumulative effect of applying a level 4 to the level 3–contoured image.

The following figure shows a contour image of level 9.


Contour image (level 9)

6.3 View and Modify Image Palette/Values

A palette (or color lookup table) is the means by which color is applied to an image. It is a table in which every row contains the numerical representation of a particular color. In the example of an 8-bit standard RGB color model palette, this numerical representation of a color is presented as a triplet specifying the intensity of the red, green, and blue components that make up each color.

Although the HDF5 palette specification allows for variable color length, different look-up methods, and color models beyond RGB, HDFView only supports the indexed RGB color model of 256 colors. To view the image palette, click the palette icon on the tool bar or select the palette command from the image menu. The red, green, and blue components of the color table are plotted in a line plot.


Image palette (256 colors)

To view the pixel values of each individual point, check the “Show value” item in the “Image” menu. When you move the mouse over the image, the pixel values of the mouse point are shown at the bottom of the image.

You can modify the values of the color table. Select the color (red, green, or blue) in the palette view and drag the line of the selected color. The value of the selected color changes as you move the color line. In the following figure, the image on the left is the orginal image, and the image on the right is the image with a modified color table.


Modified image palette (256 colors)

6.4 Show Histogram of Pixel Values

The frequency of pixel values of a selected area, or the whole image, can be displayed in a histogram chart. The horizontal axis of the histogram chart depicts the 256 pixel values. The vertical axis shows the frequency of the pixel values.


Histogram of pixel values

6.5 Import JPEG, GIF, PNG, or BMP Image to HDF4/5

Using HDFView, you can convert a JPEG, GIF, PNG, or BMP image into an HDF4 or HDF5 image. Select the “Convert Image To” command in the Tools menu, a popup window prompts you to choose the image file that you want to convert. The image is converted into a 24-bit HDF4 or HDF5 image. The current conversion does not support an image with indexed color model or an image with less than two color components. The image data is saved as an 8-bit unsigned integer regardless of the data type of the original image.

6.6 Save HDF Image to JPEG, GIF, PNG, or BMP File

Using the “Save Image As” command in the “Image” menu, you can save the current HDF image as a JPEG, GIF, PNG, or BMP file.

[Index] [1] [2] [3] [4] [5] [6] [7]

jhdf-2.9/docs/hdfview/UsersGuide/images/0000755000175000017500000000000012051203651021064 5ustar sylvestresylvestrejhdf-2.9/docs/hdfview/UsersGuide/images/tree_view.gif0000755000175000017500000004726712050301073023563 0ustar sylvestresylvestreGIF89aa 3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,a Ioپh<ӫߜ 솨F|ZAGW_jl"R(% 6Vhзt5Tw AwBV}X)((4i:dcChH.ObqZPF)唍AX^eY(bڦ%bbJ]¶OiGpƹ^{B(YᩘyVv*oVJn袌9О-Y#zdf*磨(W|"HߒjFwj*-v_b(|d"&iƲ8ڨkq/* BHB  Fvei 'Z4pqJCj{ p0.j ihkd#(<*9b gYD>āq eg1/±96ɑ >´,c8LA󨛘09D4j^g| }J_If`vB -n]ɓ@Ջt.qT0otqsb`Cvfmbܚ-ۓwcu߽.w˽ޔWy>UxJT.hɌq䳅<WBF̷s9r&3Fcp>|<a|U?d B[p73 gn8,G!{L~c /0&Qb@z=aիA>]}c @1I`t/a dI\+!;.rEc@KƢ,4A=u\@P[D(a`a0@""5Ml0]Q 8,"E eӅ1!(a8{YlTy\x /􀥶B1-dQ*aS,# CY C]ӄT7-@xȵpS|b;2^ M0[EٕS78nۅaȈRB&o_[ ץMqL]-d׾j[u 򵳛,Hж1Y]ı#,6i7f%cփ$ӌXrh-K2 -ϷT.[;x8v~q,މLnyHxbn>w$h!l\.?jSi!F 5|ŗb1Y\ ,"hшDh("ĕ2"C)#]0UDx>9}A{beXz _yl|Zu$KsK11Ƃi/:hkr30]3C_wW)cN"m!Va51E !%uu;EzLqN2)[+(4qaI͓0ϞեE`]OV2bZL>㴈eVq[ ˈOb;[)v@he%ƈ^1AĶKۥpv7O|X09+|>d;rcjqͬh a".Tv]P\[5"E9:tIr5%]f{:zԠc@c,\IATE(z$f:^ܮK],LXҢ P= 㸟,aY$7c"OS bm;-T$F:Iw(؂Sn[Y'9ԭ{bמhfؠ.+ROK/zۃVNuMϾ/yCr}3={Oje<Wzȗ~W{W !&$u|Wxzx~&ǀ"{y+؂"@ #Xۇ#8EQ56aM<{- 6R&Gw9 RFGD؅G#1^DŽd)*qP.1ntY]؆?X2Ge؇iwh=?21VQ3 XS. %ʰ 8(芡  0&Q(Hkɸ8#QH8Ȉ؋*ድ8X0&&؎騎8XhooXM& 9 9^I嘐qɐyl"ɑ yh  )X)H!=l\$YI؏MДEɓJIKIJ$Pɔ㕓Ȏ_i. `ْ,9+fٖjdil9gYnitri9ueɏQh }pi VNY[i iYF TɕM$y!ٛY5 MII9cُ" yɓQ9Q)@zIoy꩙牗y&甗y xٞ)ٖT&4?hh؈J8qx~b4яQ0؉&18 nH 8x1^>%T1J*o0pxʠ-)Ej ;i 62Tڍ XX:P8XJ5tsxjd+_*HJq# pD!89̘T:اd*ё#$Z8Q1l)Qr. :Х!0 ʪaڢ*J:؊ڊ#ᩈa*a*@9``ʮ p a/%X؆:m8  - nwAa:ڮ PڮTD6 R>o(' \p PxO9>vX cXz}k+K(ʮ!˪Zh# o0;ps =M%=#o@pbNچd)!BEvɚ L/4I?pnʦ(`L6\`ˀ#lj09 ˶@3auf: H۱`};8Ӥ qpk%0 DC%qO9K*!::غ ~봯cJ/2 3wdkj_N0˻0?{!c${  ڴAྡ A |,MJ;,UJ-B J{yz ;[ @ ˿ø@๞ @C>${j%"cG5bP}S&cAaq >3>(~rY ^M  {䑂;@MBݬWnҠ؉lRD~R)ADb6.ڐAo0矞:&t !穮^m+Aފ潽ޅa~,uo=3n*5n㿮OM mmx޾ D[Nk~҂t}V UXZA!nK_h#>qԁa 4qJƍak.Z!ѳ"* MN/N! Oק:?Naj`ِMM?LRռb^QΔZi^8 pv_w12S1qg|&U q\yo-I$RqI@Jpvo$np}skCI p9t]?ֹqs[[.qe Zk$m*jUo66O &6 ! pcOپeԗ&A >QD-^Ę4>LEH,2F|\'#T̗4avyO|[B퓗%;ET)H RU^ň#BjDLi+ Ǣ;p|/Xڵw2zoWyǧ(XbŤy3NJʦ|y_}Ӆ N ZQ1)7lڵZ j+o)DqU>z_cқ aު}Т8\hC\^ 1/!yn#ps,A;Jй *6$*4ʹ42)ZQ4'jC!1 y$Kd/1`|hƌdJ+/4:t ȣ]D]>I62,* 4DƊvyhzx%Rs=,RFL:0WӨ!!ԡLwg" h[T8 */Z5}h;(S ",8GȉxԊ./Cc.ZjyZL!vb &O=hvٌNs %YT8=0#q'YwQцvrxܢI-@"Ya!`ؕqU&)J5^-5?}ȭү)9\by})j)# ӏ%M^ŧe@AWkZҩ&.NaHF'hj)'%}g/4u[+y@Zh|=n!j)|v֭Sd 1bdr<U,4'Wkߌ`t"!v7V{o"OL M]>lwuZ5~K-J{ qtٕ)Yec-V.XOru'yK@27y%ދcTQ췘fUJ#;"8č!aT IaD/PɛA%la`PO2Ԥı3G2A|:'f^! FfXE`;8lQ"x$QA8wJcUS24Rpqdeh88ãU&†#||-LJHׁN7}FA,i:~8DWhʪHucPDžpEQV$o.<Bvj1[!*0(ռ&qzsT z+(˔6lCy3c*K"btU$a&ANg̅6E Pr/-ˆ[Bsi,|0DG .~$>[ZP#<σTb;sk 27_ & D+]c2X6ԕ}0APi[.zSrђ4 3TYv z-Zwݱ[uvQ[-,zmCcOȷrK=u99L83JdS]e }aV +30[L -sT[N5ԈuC|lo(&p(X5wR,^]ow0RG%_DU{hݛpdCvK͐rW uNV?4B}ahD (5u͕O8mm|u(EʐR~6p?ϛd2J LisSR{;9a}L*;b5WGRU@.8Qio!g5SE7|>±+ԉ 75^?"AyZq/BY.]? 1b@YE9.o%(N|:-a|--(pN;i ~4Z"^":"Xo/\2MnERW3*ٲ-,ڮ񪑖[&R6^>ɱț>SثX011q#<{)ȧ3+S2;/ ۫2!}0*(vi@ʒ 6?QAɲS2;霚z;,d"\k;R*B=ʢ!ɛcG[[BB8~ ßZ.,)z8Qbj>_3H8ᳶv3ī/)37v)gDP6hJ9p@Na<{FA{vrӢqT+L8ƚv7_L;@X|!98{dIDÁ0@#sGs}D{b†Ԉ -@Oqz7ȃB0y&qڹh&0`F逸>Ɩ"Q Ku6oo}bdIhRF;/:5b lh:iAD1D<"Դ Z#h7"8pCXFuR\ANSE9jCktՋȤ}(2:YKL m\(bTsNb5aҰ%#Gt֊ hN<=l$:)xQ[ՉYED;-K0#H^U7,܇Kg*XT"Ղ+)'N;k3[qu}(AM=s̴һ 3iشkz L1A/ c&. ,ELKM=h?bγEӛB08Z](HcĈe))Ԓ9i8[e|*FZa`6C|KWT+Э`%]Rah1e%Õ.bˑ JX\UK'9*^`cC&\`W\[Ƀ'jAƦvke ă''ڦ(c@?^?=m 0Ex'@'`Q EmH kZx 'HD&?C]tW+)#*H GHea ğ X!ȑ0+ۻ+ݫ+ޣ;hH2CP( 9 *H 1d|0hm1of-a}@GX B(-d8Qѓ ļx-[ gv;D] .(!^ߪN9Z9Ea>9@//yPXiht_4DAҚ\%6%&V'䚬ތ\!4PcA 3;3B@%n ♴e :ZTJ-ũgF,Ka`g%-(B3̗ Upd~=~r)4c _.?!@& V'gnڅ h8o'@&5ۧZ]hLîOC7049=v &tA{g1]hx71ňGc9I1`5H #AvZTHZK;UM/a3ijh>?>Jx<+K&V'GOdcrSu+6,n|hX'׋R7^jc=CfpViqA%9Vo 8/"t6fڧ=&T.so<܊ЂqDvRژK8ܓ=w\ P }v>[vgLH #DlZ`ЁEsE܈+H1+8辂h]ݦۢFdmN3B͒}Ta +=˙9yz1hxb߇"p2*N& vzj3se .}\jz|$}LQijLW 'ѬB^O#|(|(}ՃG,8h 6ϹQ͋.hg]ʴ\uRB(8<-CK> * 3ApQaPǷƥۑaK (04j,k޼% mYH#ʹkV.)}AԷ,$gӮmi1St"0a%)6얢5[H1/a*<]ḋ<i@OkyYT:m23BW)2)EԤ U[6*BFxc*Ӎxɮ"Uh,a*U*,Dyhj RYԐzB> *eƚeUEyh.*I)ƙnޙMzֻo*먢[˔W^ Lk ׹i6<ϓ0_IpK+٪Ug܎-gqQD܂+l2xk9j+2%3w2]?ZFXs*JBCFFߴ"6j/q 7Huu3H&奏%]Ќ vsj jwqTJ{oCEO[P>uN\Ď$L+E>Zh,2( 1$ldc#4>cDK}+nP4JVʵ&cmٮm Zv1.A1`IbF$.GiB σJbF4ssa$ Ct%Zb  3`Z>FB9J;jbB@n't9dn)/ x3IcNr0 Y@'m' S.4ϊsa n 7XtFҟhd' R4 ɋ@V&u4!bE@ BPCՊ\2,S0>b!SD Q( Ǥ Ʀg֋x:4iĘT*U89 iNo'#G YśU2mi",:TSټ iaxJbNRlI$&B9>ѤbXiHsF6)U @orh)"^N-.e&J Y* נ ҢeE)FFLeIē)e )M&eG`U"SR2V;S)JMoXx KR2A{Vi;)B`9H ǎ!ә,eYy\0s&[T[ OD] mPaTiuV2gZ#($FZRc57|Vj@:ѹ J`o#TjHAU$~KMT Ea(G%uK "0^` ֆ'lJ_fGo_h}Bd/+VQ @\qtuW)=Ɍ;\"/~Su)E1@ (KY_p@tPh8J%1y.xb󰃋-* ;}%ZDc9αʖڣշE4I`EU3Ȑ\X눃ad7 3wތMx6~`CE "#-O&w2ȥ_|b|1%F$C T^;gTU$ghCBRQz `wa]0Ffp apG-B̂x#0Sj ' _9yS@UE$rZ܎40;qANaF#MJ]stg.V6RN`ق9QO`+ԧa2$-g oA^ch:&M>(I:h/) rE' X=em:[FK&IP-&:PKg*mWhH-nMަӝsJ͔v$oqyuz<ݔSն %Iz1#Ikas맊Pvh _N\tˋWSN?WKiuMjڽyi KHnJ>J4Ne~"@?£B7iD*쓬#~ ! tA&_0Zh<Ot@ӬxU4pdԤhD>AXOE 8D Fe9uOHH M(E`yzċ ND]E1SDAPQ/)"#E*4geDZQMQ a,ImI"#f ֡ u&S>8QW-C]Ş*݀MT1\RXURQ'M[3)ɬxTP`Ui#A^ ?/Fx⭐-"FCEӅd1$]A !E D2J$D >dJM#- Tm]Sd$A&I0LUn$$ă@@:`㑊>OW}_=O< E2h܃=it/Ne&ZA3[*El<=& ``B>*0\H|]au9<ɝLR1=t%A@@e* ֞ yqؤVb"OVE&HB3 @8 %ă<QFě h-\ E<ٻMY$@Y(wA<1rH ߝ0{&3)D]SRd v4'Q,pqOaQ Br $XRh "@ @՗^YgsWDh.FNdJ|rRH @[+z)GuDG^ȃvQ HM!$S 4*vuǂĠpI,!F1 \ L'x‘*I:5ߧ}1@3 A$|,JvTl*R\e źrIW^$H!K\JO`X]Blrb͍>$&kFNj"mT)- <_Fm4lMkPj aem_9\-N+lݨj7,5HlLnmL+RLB&X%ʝk震ljmL'Id:YeeaMO@:نD^P & 1C& Y [΅k#Z-P' CFpkSt,K,Nq3$YcNsHImd225lVL3l>qlszl$s˿S}Q%UiFC tBrmXe֪%]G9:V3S^e`HN3b;7Tcb<eVN_>lQP7P/[ 60GnlfmpneW]5h/ت`y@)Euz0ngw~g'u\fZ`2P,#@$ZPiׁ6 gU]FC\BhuG_jGtfB$gg}JM DڽEPd.^Qׄݬ&E-p:$hFc8doi 'lrAۧ2LYM1c~(1pp'ل6zdoL%N%E\t$~!؛Xb^";|"A;5$@f^'/]u& 5De5qU¨MrۛKExѳ-0T#P(I4m|Yi w 'F%Kp냕HXyu6`@ K`{u_#SvB4HWqjwrnx4FhDؽ ]܌Ez+mKC r\h|[\wJ8RrRSgv| ڣy=#&`.;/_5f75y,R?>8@]܊ϫcK;,3H<)8'T@ MvxM5E!uS:OoCCk.z  P\k 0p Fb|lň}']اD$Вcv0HBRl'-܌Dl!Lkz~"/"LR)7r.$4XDötJ+(4fS-͡LL3Hpcn=M*/R .}+(TR/e2 ;2Q O3ITK'"(ARY(" gϮm7Pk5ɆPDVY)yһ0(.pͶKh8b W9+kqMWQctERXϊ6{YU+∃/)M5Y#jB&m8crXdety)Ve2y!~}W Yg08w^S^h9s7$12jׅk LZX:ڢI#4pHu0;^1hf}[[󒕢1€a4{[]zњoU72a8-Z"ɴM")b]C |l1,/{aFdLĐƊGZ-L+Qmr4B^)" {:0CഭI2~ 摃HX&M!0nBĀ)gϽisjwU$hFp`6D>U0O$Lt *2Bъ㡗[)Xme3GկO>Bn- M/XY $EFa ,gD,S,jVDNcU[C۳XaAf+6r oͅE۷ OLt])eҺ/5{hvӄFKW[f9_W^1!ob9b5uїSVx .F2}q㰀R!ɯu#RۉNax[nVOq 9`G!:H9u2͉]FS1*Cȃ{-wC@*q@"?ǁT (٤Au4jh ڲ y:Mv"`nyx}XfHP@)ċQ'EQd 쇈F:V ^),uE#Hf|#3B3]N b$f# 91iH|Qhp('e)tgT{G O1 h{pegx'Cz҂W_Cɾan;X< cq8f 9N}hbW s8;8t3-5Y7ŮlR* @TrQLG2]dh,rUNLQ=!:u; ]jR *z`7UC bEO%IwhVYu9SIʞUR}EuYDvV9BWڀk3;mIW>&_nQ7p,d# 3>[>Hibl3mRS5n!"7gbRq 7  e!p8k%.>i$8:F=l{ bO~8$n8kK0[븄>)[pY/Z 9IbI!&s2p*O KLūT@6Pp9UF@P/ pAM#x %R e\0R/! {1Beo"0 f!BƐ #19-fp qn_4Iւ) !!j "@ >IdNF蒑AF i1ͰQh 0c.֫qG-lqqimq7d&B2/0_4l {8$!/b0\"!Qt 1"2ȑ1<KU[lL7뻸  j/ 6Z2{# B( r3+"'p.0P B&Rq!p$H+i!,%2@ľ-GB˕1p-7R].r-Qq0q0+.#n)/J.2OE,|W/:5]5a36es6i6m6q37us7y63Pfl788{B@I` .ڢ8.JУ@"])ReIA j(R2=ʵί<)֫ϞhϪ]˶[5lI]x!nذnG$bpL2$‚KF/FŎ" #ϊq9tAң ܜkϞ6-4խ/W=[ˡkP9uzjD uTحf.&eBiI/Ӵ>T16E]Im~-uJuQ()s`4PAc8`R .t-sY`mf/=N/891E(#8丏3%#3be[E]đn+5m(喙CM2YO%SnYm)o)tRs 2p&GreO%V%^(tCI}aeWAޡY %U ՜YrS naQg%Svi\riE0"/>#ۋ93l8ee9&^nY+n[a-FLm:wTYn5VTy櫝AUUyCWyYW UBl{V>{\S~2!#K7u+݆!X3+]A1mN/+L[$4 Mt;M&ѹXk%Yg=.r-HE`[k洩@Ir;*De !&LIZPy{-Z((#ZsR/}o1:!OQgXqK뫡P*ڲËQ59H>.,Q<~YRf(JjuPDHڃI  ~bmJy륂 E (%a,?H"2B X>U&@|0Tzd}6mIk-{եY@|Ad ] X:)9_eέc}K8eHJ9Qa|0!Goz@ē(XWTE+zJdCptb5+;>TЋZ˜81_Q f6Sх -™l5^Pq$"=q-#{4hqt~[0Srү$`v.Ħ`Qf.N%hx'c4J –!VU"֞Q:d|>zA]RB>7ёs~N? c]e`gA f.]H]AzXE☶pfLѣV!2󇶸M!0>aЃ S:'Dc+@s@9u?#_U!H>W$[lBBX$8qE2FMw۠G9B!Z}v4`avk_ [BGrl(qS.[DYtP=mZ` + dUs:$R 8%]u[Hv jWK9 IP-va"x8yONr'g˝ ibPqzQ;'V$voYӢ 50C*٘ 52)r.| B GȐ.eO3smIPTݟ''C%E*ҟlvLEBgo^}m?\èY}:GheοcfvYR֗~EB#.ṔlC!|@ialqӗ@ RymLd&K([^J'er80eo)x0wPf9gKxopg/1';y2P%60 " {'{r°{@H4>qP-WuXEXyX dףt6OF^RtaaVN^WZN6bUvAWmb' vՅ@a >mwTrdy"E]p)KQemwn#1U1 Rx etHmoCe ]H?!CBJ37r9Gz;^8@ Đ @ @ `"ԄHX0 xluXCfb EhEGRjU=&aORhdy?JR'EwASV:xKWgS48BI-4x0f@QUf)8[؊{vH!w]y2rsQ'y1s[f[1<0;[; ZCiI ? GI"a-Q?9&MrݒNfGW9G^ GV%3چH&DH0rJJӁQoHTVQ10AUnh/ZFnTӊ*TYCz\'*y9v">K#ǣ 8Q-Tb-xk]5f^d"ds&-^)L^>ehm$BL'-!7R[|T 4(c'A f fɁ[ۥHYK(o,B-t gC4z/a;kL3C zcP&q)qZ&5a#-zaCxh*\Q[@{vhyfS}@9Vx!WI1v]"y'󉈝B uK#sJ->Ֆ5C ʠkG*%ZOz"ʼn;i&wZgj8RinH"=II4\ fG &葓yBae~J5K<Ѩ[&::Tqڧ1O&&mz"QK2&j'ҡWSZqº&a3GPŜ{bٺ W)9S0B ]IIR(,%]yK)'fE䝦RP>1z ;4ƪ6\#:T:C; Gvd۱c!^vāhsJNƏ'o70eρwr[VxIBH:(CJۅe:uAQ2;^ zd٠ :gj! "7Pu:HgG2J2nŜzedB7yQ 2w؈iAF)%RzxBHdCy ,HhK(lyqΪ8d" :!{eSл4y;b/zPgbSdd:v"XjQ5k]{Mwc8 R0'Ey [{igɵABw)$I+(2h;* . #%\}9lEL%fE$#%\%|>$ka&?SYj.A` Lû`^jۡ2!}8 .]b+-M1=F/ G-eMр#9\MMns<|]\#L^}ڣ^-&->Č-(NѮn쵝1“%씮il>Nk?=z>'n]ە槑=n܍qe>h+ nV ۳}炾}~^=݇Bn;մ,_^VdMT~Wn;nIxR<\.N0~woE="+iP.4>~"/El%NPCe^u½Mem79R]s2~>N]?L_m_ ?hUOau^ϝ#M?>rN]t&_Mv/Z=h)WO W0z+R޾e86Էl_HmbōE+ңB!G*h1eGO&HG)̸QŇU!P5R<ɐ)Ճ]iF5#Ev) LC? Y1*¹ "e3f׮z&}WfǁTz5oτ +d'19!pYc ˑal.+ \rivuƝm0-D⌻wn}ԙ4mS:ER ks86E"HOM '}}|}ҵXSԝ"d龛 $҃K+6 ² ;<ۤG $I1{LjRKPB l?O6B jO"ZC /67R*F";@3'GXTΦ"ʯ$"/&C0&?{sQ4 _"P0Ҳ 1Dl23̶% 09J<fk2%Բ< .ԼT@I֌r/ ebU IHkHrAqHRmGC233LrZB/eSRA\ 2Y)CHzl+ozo㩫cm,*WJQD{iE9.41|#@ğ֤K㹫;뿑݉ƒZ̏HSXT§E=s8O+aZdk-QZpEDgL=]ɵT vhߚuC"}܄Ax'ȯo/џTqZB~UdƢ}P2&;rP4 ~5UUߺf%0}a`fҏ) $qLEdc̐>3T Y9S04 7j.0J7ɥ-Z ŧAZɯNd"8lu Nδ+.׬6E6抢n@6tC!.W<Շ eND;p~3ЬG>p:eNPYt/nGa LPE no1C7o:g zY-C#Ƚyͨ̓"peY9Jr)Ti슲k2Uʗ+sPGtt3ʵCUs閵pG ylXbuܚMszYTCj >evLGq[+022Za 2Pg䩿jz C )*^p.CC_€*d!IFd-BQ̅ڵuRs,R^|Ndd7:/ÏK^ۯ"jƱ W= -Hb#fL~ '2 w)"oAy ꒮w*8©(Zx2=Iz=} 7h[}[-:9}@01H3[X= 1[A&5Т 0?ҖRnӏQ%ri#) 4кɏS)6ɬ bE#9CH3vXË@̫(KDQS=hp҄hC\v/) =#E{(9+A2+ 9PxC) zcc\&@.D-: }ػwZ .}PE03 N`F `a >`(ؓl)ꡓB d "\= _B'2= 4O2S;a"pU6@_wX'jKjD  ["!7 $w @ %aSz"`ɘV0a`6`^8`@]C.dFd EV .JbBӗ9ZZ¤5ybu\]׎Rrk<àk5ЁWUF:At:h?jzB"[GGGN`^>B؄E?``ctu``=`-dc_> k ̊a mºC:9<Ex00x`.LHգ ?r(鰠iZV+ee!I]i˔0aF`ΑևM j&uF`F>x`XsV|Vc?": REs&PX芝 `J.Rg-b ;XE *C.33H0 ME`ʁ68L sK.d@P]s&ȁdx׺= ܺقÃ3aNLg_YY^RKQR_eL[c_-?f?C ޯx0㭾j vj.nC6a?&sdtn o:?hhڦ t@Q&9Y-tzz'!ItcHtBo2bl4z4@'&8y[Ih M@bwe2zH-0J[I`P8 ).8x/2 Vifܭ,+u_ \dA {R 9hȺ 6j.Mڑopuc`;s s8o5X2X5P??tBMp(詟mE +p;@9c& * y'e0pJ<4>PM,.u-K l13 yKD0P 4̼+&KSNܼ7j^tIOIゆ3_Tg.<+J讍ˊ#>iӱdY~&F~:~ NIX9e8o^ȪMhbM'o8j;pjP5h |\˛ | L ixł\,Y>y`@z'zOfJʠ劆 @-4"l7uHeڅ8Ily8@AY4)2 *OBW~b%h0}1 xƷsL),;sT㈆x vx` ^فp lXE8".D@ClѦ@=b ]ُO ;IvHh20k04Z ?{--xAtSȇ-TYBD]jmtzۧoپzE!}<(qe)ۧ1!G-G; “FDi"J-!d mߘ}aaǐ(ԩ QD8QӦ4:QMN>ݪCٳ 4ҥʍV TXkHmd2f.l;">qMűЂ ѭ(F}tXToQȧCʡeSlQ0Vg$'G tSj\V|pCweSZcGW.5 #vv?NE8Ծ]p3dՁe>&D FM(}U[8C)ՑKt~]FvIEobx4BINV SB)Sg9LIZMx;!OSyD">DMI94!fx%awY=bAU>]b]#k"cFe4 јY|2(C@"04U4@O$j|" M G#\($*g=O&ŢBywWJ!B D ~?5g,EVy5SN!H-!Q$RJZԫCRHp)Y&UdV9KCatF萀 [~[Fjx-&M]|96k}'=Ids%]%h4s %S &=)9! Fj^Pc-]lgPg1iLdb \PpFigm!)lAXJp$ `eL#@vАG] M9ē}wHUI ޮ(KwKBcĒ\@p:FDJh&$ACmi& zOEfDmIe -C2)CYq c3í&?Qvٲ49 ,k Z,!Mݥ巹-9kW3J{"43mHRFP1,\$rQCrEzQ~R'1pJ7ښP7Ď},L-4Τ boI`(4$ؑDg&2<X:BBR LE]Ŗ,Hi"9lZ2ҳ"v7HP<9%c p>6kjq'ԉ~0Mrjqiքy9 L1Ba'qbavFC^nB8%APfÉ x rC1eDk'Ah(4 "0|H7"u[ L Ȳy[W"p˜23Ct괧rЙDఐ@qmh(źPAVNJ*9yF*n3ţttIP\$( HF٬=HF-MqN Ӗ((RI27Atp'*5%~ҩ1Ep0}g*i3 Gv QRC\vyUmj3 #Fص-%uvVbtny߽ilPZ"lX lAzҟr>LgFI (#@P}K%FaU@03eBaK b|0)ҐM~(Sm=H>k82@`)rQ9~c!`C.2;d"Eh=p V-oZ~49[l 4y* .ZNB-L[ {0Asu2-HciIěF2.>uBےKtb Yl Å(-tIͬgD" œP"$>x(_?Tp{mN6}@eq8 *0nk.b!f*w"sLlI"+xՌȦ{:Fn bO,mhk ؎Ԟ5 eg|gZڒ<>XZvsf6)c2# @8}sfM$)t]3 FFRF"MJ&d{]*בdkZaTՍٗu@ULim Nx* RGkՅ/`tNx @fV~0dNV)y -IۑaXkMYǭ3،\Mz @]!q9\8Hna=yU yRэڐ,G.ߑpl,Ӷތ, ` rR$W-D G)C/ݰUC-iTnYM4H4yDL^ ^ &V *_R b%r'ᷠFSǁI⥑aɚgU C-P5!!9~ey؅ a<%5+bŗY)}<MDQM%NM@Q;#:;N&)=(;"b<:ʣ<A!{" Pc8Y|MiBf${JѤФe6HaٍDFbUcIa4o$QtMs4IvWDEJ|rLL0&Zei<\ e-I?fȣ, Gt^e^cİL@EĢnālA(;T pˈAp B h$O.kZ@_'p2D$CDi"qf @!Qpb8<Ɓ`BF&P<"d)=O( J2`3ĩ Ɛ2NCDꙖ昦"HB Cn|*(Ef)1\ ix=di@^D]`JKd@eg ky) *DC0 ;gWLijGh^"BxD`荄ɸF9,H{ `Uh۹eɉ)'|zE%A@ (\ʱm 6"$6T[nV62D$Gb<Ǣf2HOrB!F*G0@ u0nbLv P 4xh vHOveW^qX)r q&=$vxM4 DVi>쒌F3pbpl@#>k |L4$Fl?UZ/[,2>_Ex*M!^oI:$ Si.--:aFD!IEc 1&t}Gn7{} >/.o5#]J'..=0(h:*:o/Q5:=\h*T x'/@_2'E-b&٥tLXOzÊΌjشĴF4uqcgVJ28lJȏM\ĐͬtlJ65=8'lE>uR&ʔRs 3ȩڇ> (k5J.i1xR%|p!aj\|^o}FW7t4eC;AC&`@ζ$mj"a2<I5ڼ`d]G) 4I! GL>t%tόt j(..o0 V6Ğ$)T>{蟚gO]jhsSƧ1ڜi O 87}sPR23jF  Tjl3?ixh|ƘM0a^NY'jT~]4^!}_H4D/'l 2y89Nō Qt́ބ䗀N)Fy ^Q(RIxb~-?#DQQyS\(ꍹ7G /GtaU}j [2ɅFhGАCv.١& |BI-(7CC,GًeqD!^ SaT⾆QعKj*D׳ s{EȴagU"cK&02s+J*װɥp*tݺAob{)'kK6AJ geT,1 *ᬗCSJ&\IMr9PT26۱K#NN"a{YRE:դ<ָnYxhnBTumh*k lʬK{tn̅,zlK^;*( j$m}[NB2ȯe*)/g!c+178̳ #,,Cl& -̍ƻo;&)ĪFN')rB\RxNJK+(j>Kq'S/>&J:X-,* :2H)dz#ڎR˜}MKKp 0;C!:.+lEэ̲ H,I!p̃p*62! KK>MI*:; J!2jvLוVY}[S(]o~ JR*t%<-Y!_LߴJ8rW݈OB+>q746ްW7J."o ?>H-Hf;M"j[;+κ%D<8=80xHrIMxU `#`ƱѠ*41TkM L8 T>1K"g+3ۨ@N*ȱ[P /1t UxS nvΫ|$S]xӛvα^ԃ"|j`E|2}I . Zq܊+y½[&/gΓ!P5hENGP6n(&,zF5ɰօnm!α@@ ."4)T e d[ ]0ERbJ4͊@’>:%hRdF!4 T.]Q҅TZ#;XkOԗEktՓ$j.(U>i *|>x5Y|'Ѡ} \+#A1eF!\8 ƀhbc1kY [.uZPa " 5-* 0a 1`"+hx0K Ef1Hl`pxe{u#>oKC5a [8qa d؅d+hg3().L?! r&CDIK| /wc"JXTl !dw=2tyT[Rv|394h@q/2х 6p15j@Lj;qC"[#Z\3]arRXa|3Vx%|'=b fr50cAB5FusVY #=DGBna΄K ӏur-XV[dr63X'x6 hlJBtTyUwQyaPoN bi7/V,J1h041ȐPWi('n[+E\|bI^Xǹ{aQ knM,G( >2 '."a8-܆GыͲ2$MSi8pwAQ 荦pm.2 #R.M$F*ojQ4UhgXxsoޣnJڑ瑪[d) Dӕ.IO5۴dk4>f# '&;(w6cAEJR K |TA0ȡzD~qS(< G2{(YÐ1LjD}0"byCN# ݢįqGlk>1ZWmGʮbLԣ7f3% lj=KA*"&]BSwC66YEHF.kdl`R ;A- /|.fȫ@ H!8p@@bPP\ܔrzm /*N}M Xj " )HBκvp |n. | ςAp k$)(0B))lTVJ# X6&]q+*$0WbBath/&mn R)nQ QBaPBVMJ܃[gBo7+&6""&~7&\|InUK3! w]2d)fLC-e_"Fzz|%8B6E8)ZɕO(]:"UDD-^C-L|cpq#hgP43tGQ\2?H} FXF$ڰJf!OGmp*]ǿF[n"S2;HQGK̃~g@$vƳ4xJ=(-g]|cP/#S6bCMR;F4~sxuTxhnS&5Bnrk !O4LL _NPh#A"Rm rZMN"ǃrZ:#xP$`y4>dN$lQ#B4^5S#QDycKJ0I uR҅nP,KM2MH6f2N)b5n<#Djcׅj[b1s FGb9Jɡ"lBf!5u62mPC0S@8A<Ԡj&O7hAm^!KH uL iyTjS(j Cd2`%'aϣ=lgnXq>f[GP&ujNXhf1•LsuNg"ebQ)]B<(Ue܇ sKDo˂\maV 5NxVdȰ\[x6ꨳftD|X>>bDסKv}0g1u 6v!ˈk#,\+>I*D/|[t7]P*D" w}Qn+)LAv PczѬDs[f1.hTv*/Uo^j*yV/u2IB(yV;F-fΕ&~A+i%)j&R'$zhRP!(i͎BRMBpWĞg0f*dI]ihfUI]v߶ӊfKp*_ +WPxsBE|DAʽ<}Ö9ۤ(`?މ$>(ڭʉJOad"0Nn!,Їf#{&y"k4<+Dkvː`paS`)ˉ֜a)o ?B%:*Bk Hrdܳ`kNCBtJT&:bQ'4^J\ff6$.T3F#NNm/.!r J"~{ޞHi+"IΠI․|$# |{L;޼ƌvA ~q%l͌ Bi }Heb{mҶ" "lhR^fК$^{#mtʚTF^vp¶6ucٳMztP߆?{9 gHY4=!v0:"HLfd܇vzP*6O: &z숮H,%p:dk`+hqͪ75P ʨ'ɬI-*O5W\MO l# Ŷjc r!8Ȧ>vwp[Ύ}oLu%:8d)XJܫ'x[bm ,!shX}z +ߐ**i4W=oh2"cۙ0Xfz L>Aܑ/ &H(5rh”-1 5ϊzd(6Mq902}r UQF4h%(r" )30P&YDh`=}d2Am!lndiIDžRE>1Ci&fh;7ݧoYصKWad˗]F,l Zyg/n4zlha idnƺ%=)3`zWˈW"޽5\FDˡ8] 35,7.ReVŰE"Bz|]HVUNp C42-cFlr\DG4VTiaFrZ5_XQV2ACOGWEfu2EXYWzڏdy9d\1FK}W]J[)JvViy%$Iui٩iOUPfNf؊uu!d X A󕞀 Ҋ[p|5K>T)RwQC@Q4AsU'HSK8@>,s* Ԭ;Sv:ZvH vY(=4l4υҩ#%N fL̠fm2ŧ\mkY`iVe]a'^/I[],Zd%Yj^N1q\>wKʰh\N0l"48>k2\0:- ɈσmJu(n"^7-XPQՅq3;L%FCѓէXZݭ)c1w\G tH^r9H<Y;dl8_ZRf)lA8ݝ |,sJQdE&cX&(SL^\V%f{mCKi72+s0j>bnEsEZxj-Fcra&_frWa5}Ϸo~qqMR&(1vc0Ҭ)>!"+e1{}$hfhp頒Ƶ a\Rȇ2Y):L>vB@ -J!aa4ƒL;UZFEL5d)yCs&;Pda&mr_\;WMre,5y&c7yFLe 1H0|4aOdOB2!.%mj)164NxJYJ<*11RӫXƒN@YKThj1a3:4/RC= S\i4EU_<:oLK5Cu0h<Ϊv2~=3@ps`(>c$9Fv%h WƦڦBMt82xk˔-G]Q{iUQFGfa|eX>K?mp)IԜ),RRFedAGz"T%`XM1F*LPܒ&-`wP#UtrZxBa. 8.7U+b6dވ/1^IK%'zakl'#E.2Fڿ"p(D2Q6֬hXѱmx_9@*B5fxՋܻhSRf6l<&0'>TKcCC֣,{~)(QwJ|aG,^9f1/] 3ddJ[^T 0$(p/{qLsFKkMQ:l0$"6:bi ;L'UL)'nӃ9[ G;y 3x9;aٯEvd\0fjoK56 R>ґאitыRD6nH: .ř0v5,dtۈ̳VeY8S7cu!J[#^M3YJ7!.d 29{e]$Zə@IxeO5J1 /S*c1tVQDB"z+L忼[lI"#qhQREˢ}ܺ`Nw،i}P̶eGX.̐Tr_4xe۸Z.Ǹ:oXZ|Lvy>۟+鯳] (:gnOSG)fHza'$e>'VP |VN4|=F4KHUz_arDsc̓l\l0H$W]Ŗgއn#5Ip%x@zK*CJwu>veEKVhAHgH $J6&}MvyIcG12]8p̵$UQFyE=kCeXxcg1cysx2CN.F_>w=B|FSNFhF%eIO&PeyvCQ1yCWo[{19hw9t3E74@c5CU_ˆiNI dlF0gYbgTDYypZq$Gi GeRTwEj)d:GG("kK Hbm%U(ewhaXZQV^͵OqNvQ+2"tZ~ TU;`uE _RY AS4dsLhDWޔW)>\}6m FM '@U(ox#uu$'S&E}ʠةI[@ *F`S՛ ySk})4l$hcFaj_"p*$,E&;EF)N>]cA ^6hE|HwEh{] p;<U-f%QEtjf0%hyTP-Ot槨OwrF/AYk~>wz>Q_W'w%xXyf*|ZgpRWaʪPJF!nWKx2%[N璮T='yq,%\_>m'vg[_18oU`i;9`'VzG>cO;+#{2(7s4RȆPn"|ka]8m|GFh7ay2*Q/.(pi!TW`'QGWe{ESz$vnj^ 뛆`f&g×$&(cE袲7xjexCh(Nj<~[|xbiEJv,lWVOik([]g'I8*UhQ1&hLd ZJ$"5<2g A$öH!6K>$rV>PKJSXZbFhi4`/E}vkaY )7YV/gn0 Wk5|GF<MѝhĒ#g=ȿ<(ˠ Q,ܭO+EoYidJYg#H%jM]E*\pԋtɢgbN}gDF70G0gqʫƚs kmlg9wf=egK@8 vH&B[",9ijvdhC2#0թqH`6i]Kb5_c͛馛X;EvMT!g KzSGkJVľ.mLdd XLc1̼6hEy팱ws%ۥ0\mոyihˋWg0(MXFAGws*ȤXiXlVT_II4o`'fh3I>ͥ{%T_TYđ7fKɶ!2J0;"&Ba8 B :TP73Pa/\#U#.ǣItvj1z~+UjeC<g]W˷*%,` q1i"()z~{z}yoj+Muxdf[La-qPT@+9Q !Eʰ@ /rZ˜䇌T h(yڵs]uW}sqL&CeEAQs+N%gM?_ɐh+rxo˳dn[opE?l 3y3 k  L2RA"/.&#!7?gkӫq >?T8>f #eX5g4t)Ȅ9x3v*Ԇ;4hmE/A$O-Rzi0̦q5=cڿ_/v\xx[,_Lq'15T Bo% $/Oqb4A@N>",Q^#` v &%MQzYeJ'qӳ<"` h?%ؗlK}dD(>zBу%TPp>.޾ӷ ɖSyƑ2f=3drPh4YeϚD%K7ulI'Г3WtiUؕS9lvΡW]YҰOn=T&JK++7Һ?f­Ɋnb7~%lsp غ LDV 'tz R+6ѲcP{hIC*3lK.#PL,l#Z6Tki2wcMdre[[ i{ٓ4=SZ`;tWJInnhQ~&lRF`rOV7WKC2 k2ֻqm+CȅjŁɼhڮp~ݢĒ_ۗKf!᳻#M#Ȯ[hYz\tujȯ*娳6yqFIWr[WǴ,"p+X{=.]QQdL NuJUeOTHiAPb⬧pKg+1t3`@@P)h]vM=H O&`eue=!T O*OFlfJ%g[ o] f^ŴnTMS&+xn["a8Deϊ$57RnW`ZyEhm{^XWdd 4--&He#wO~Q q(jkv651VQ6H-{G"I6eh'9GRSLXU׫fL/g醙h$]AC=@5 oB#7+4Fr $Ҳ`Pw -Ȇ* 5+,[DSѠEV s@ǘ 1w$92|P̝^񈏜HFo&ZX4jrV@XE:]թltr ?ė@[%B8| z@QE 4c 2PxdT>9:s*hh!v* 8ub''"ӎ[D4iOt pGMwӴ]YH\IdZoZ:D4bg< ]<`ax!) °nb#J $#=P"}0R WPM{!.fQ' 0 )$|JыۺB$C9A>A( Sxyka8B稇!>:%}89S؎H˓,'J80#Ap?FPhDXE`A`(]Lxe@BEM\N<H87H8Jc L (B#%Ye(4Q (ZY|z-zQ\z8C.;9p8tduTyhXz5؇` ;GI*KNJ ; 3<}}*,XX?;y܇ap+:}hh䰀 0#P倏;ZhIvxhPXHaIH(ɨ%؂aE#чX K҈Ly+CR *⏌Q+R%u<-$l58HExuAlLEC8Qi;Sh CNLUFTY-hQH fUNJ;HBZ ÔSM[E8NX: Q}V?Ol @ HC+՟;YIԇBaHZL9Ά SA8q ڥxybprSFq".920. cH@y KJ}u ӯ c;.( e8LB{9DGzhn4`(kO> [C].ŕǣEIHz`x#\6-TuDOEPR}@Z;qO Ӷ}׭% w+Zep&MBQ!қS8S1  /4'(}jC!=BD ?C!܁;=B4C;a88TDŽ(ML`_->7- JMAI`(xOn_]BHӥEa@T-]==al _ ac[8ބdxb`] -%CuJL7IA#,, I3Q%$ ecF I?A6%ڧw ɵ3%3Ә Xy%;^{4P>yI3&y#⍪W×_/. d!.jC&z҇H"ٙqFi VaQ *5 CiZҨ& rkn . _;C"V!#,d_^N1I7ӨcF64螵4k)Y &*֧̽y,"K@fyMHSt l>%"B&<(in((3pN W+`$0Qg2cQhiK%TګR8jB5;rɱYk"3^p֋µG m1W5鏌GBmRs96U%~A! ۰6A/$k^ѪG&)gk- qф>}ZUT-5¼d(*,k~8$qL40C љWi +W0 5ʫ)wttlYz/1&|?5b1 g0F_Oɡ% rӐ%k)$o`9hv2r7ll똝m6'#,7gwԊ/ﲨq)o{.k6 ''Gwhepo FfF7T0crO7*g |Kq &A B D|'q|L 0!;^Q6TsvI 4v'VP0cxs .>lpuEwyx$K";Yvɰ\a#N8́GCm@.Cjɀ!ma(T=}S/>$EGOe,U4 }c&jlԗ3Z-$1 ure,ɈQ\NA&R`}кB[HhP9rފhr}):&갫 H51ɻvT<㔀=GBqDLt1'DlSh4B 9fN#Jֻ1 t%eIr2 kOMqIxeAb,ye)v.5Qa9u,uԒn-CD_<,Bn$I˕J%xF_l#IUIWm#AVGcT7I F] S096 uAۅ6V#F4ńL(hIPpbbsu6J$)Vw=]S&uvvb^$qSE Q% (gVC<]al3Nj2(`2?2$>pA"vNGeՓX\eгE(F`T  ;5l pܶLa0l=HF&ŠJ D#5q+>2bP&{l  raJȒVp>nDL)Zz 'ƭ {OJvW[-h(V2=G\]Yt}B`\ F͘ pT;94jM(.Tct_dѿ8c si"$[a,2H}QadD } ^4c֢ߍ[DDJUTYNqD,>Jc5q7!WW9JDcGao_]U{WXޙ&m KZnшa $ whM"V\nLKɲW9+lj3ƒ*-"D*GIF(ye$Ib(.YCP+*KVL/٧+mVx]xPYS@j J$6!;)ˊn$+#IATStESNWak(1VP TSGJ1Yk\61/znҠ{RP(#JoF'=H.$IAr\S<7=ӓẒ ꉶZ]hd3!Q$*" RJDTIiJ@Amw5*k%ì1'#Z J1^\V 8h H(m0j j@&V3Upy FQ5]DPhS6dh:[e)\ir"Lh8 fJ.(Qh\:5ۜv1f+ZPS"e{kR`PIL{2SlN'0A(gTQQ:i$`cC&N$SPD@93}lmnQaZ/P"~Hh! 0ht$T2=m 7­ 0:A1S)Do$`а}D;ݴD6R4 wR* (QHTAAd|´6}Yg$q4ђPNv=ڴus)ǟdC߇V8M#ɂf뒑L9]"(0L*~R'S,xY%' u+I h/uv$XKf{H H>:rLQl+&aG+:˦C?[:ZjR,ԗ03ײ*4cZt"E<iaașq @ROaIt}W` budb\&]E-c5 Lj<ZO]Tka)j#Ѥa-^ &ЌJs1!ɖIݠ>ܜ@ SfR%2FP%QN}jDPF^g!FUj_M^J]IJ`gHEr>N-QD!M_HJHqdbNTQ"Lr܌ex5 Ɩ%M M4&f"‰f1L[& ߠfrHHAƙ 52&tcV!gTruIrMd76D~54KBm`5T8Х"I E[Q "Ж>j WvmG l4lU$d I@gO+~HF(†!GuDf}vILšSH:fQ\bH: IVm8fE> ֑vLw Ĭo`HQTGBYWW$䘩EUUbɆ92H 1 beI=M)ɩؑ>%(n-Xny&#άI&%x-]LG[Q^IQxRw}Vȧ)hTNj*ŀbX"`Ψj' ȣ qRɍ]xMxsg $9†0&rԗUr{b!"a\_8@P"^Q5J"-og1ZNcb)AcTGɈ<{Ljdd&E뗺 +%L T+J'1I\Wj@*LivudI*-NA,-|fpmPoR43u'mRj{ތujN(ѡ֞8=WJ"9UZL )܃ iԍ~n.#bIbb'k`/5F$-Ndf\u]UвtqP,N^"&-+n*#Jj<w+&z>f\h>QgL6[ncCl FR$%a_. dP8z5&BdG^u様0!F`"tiMF$Ӳ,.)}*p(fu'}!eh5&*E,~xRm|fgNgvqZV2tqae'Z\gbT '/ޅ/`r"Վ,^mjop-<ɔ)~R,&aFra=df]1&dK0FeTzJlf~l4r3r XB]0%!no=\-"*̖ta^o4f%o/Q/""clcʞI 4)&xOa ['>F2$R-q3/3Iqy^ڲ'#8O\҉d "0 M[4 R>*]xrR$jU(f%q.M%s)nt?e"[٨!J*'VS쎺OތS桗I2Fk>,yty\ O]!F4YG/(,r4&PꛢEZ<"WmN"SgIZf\OolSilEٳ&F%9`Iq~<ZuȯN[S]{5ȡ+j'6[wt^H^vE%R3I&jx5 2&+0bAZfLdʌK\ȸpot2݃[g .OO3Xr4/ҏ6.5J'eY~ivDuP0e2 bMut6*'N!:~rU6rW(>#Eh(w.gO.Gc"s4Gp?OvEp*F j^ d*.aGvimBgVR[dn"{Fρ %*c֫6NWJ#taٮA-6er.y>f+uϡ^Cp*5)tq߳$emR+egȕHUNXw,.9z lf謁oY6f2perO⶘ ުj"1"7s=FOT$go&*xQ`W$vPYW-+ g%! }ERAzю_p9O7]b4b6]`2]:g(kkTǤ bZ{4>uNwT#BoiNS2]7ęsxLt5`%KĻ6-5=Aͧ$<߼|||} =$#}#C=G7 =s}ק?S=Ӈ}ؗ==ΫЗ}ճ}Տѣ}TF֊Υ3{ s9aA~KS~[c~ks~{~~Gd '܌:8v{uȔ+'x #+?PK Yr Ii[Iw%|0{??~maIwk;=Fv}E^zm2.xqD}EۗpF >(0A6/;hִygN;yhPC5ziRFc#1іZ,[&rdʅmaYzm)^HMvL8W/͐1g.5|qbŋ7vtRA ܇ca^˗h7^48r$_ -Ӎ 2VbX x1uC27~yr}tcG1TbEspamr6l٧+o5h#oYJv}t.6P.So ~# Ȼȷj[)&jڛ& !#?]|e䩩^CP3Xkq,닽ߠ:/,[r&3HJHJH-Z. E 3 Uz$ 0^**I4{GzzD]4'6Lk.j җF qN%OAbmL6$o2j?Zcl"ʤsVrЀkϷ:DERT,uϰӋ nuL̑[0RkZDq/N=DC^fD)6MM(ۂ >xk@^)5.e[ma8?{HD<_Od?NN."+ ]~&\c+}B 1է7u,4MFdVl\Te޺[Gl̪:<հO_5_֮DV1'{h}7:% Ѧ]H̖Qƪs.m5!<~N*ɣ NSCŚU2ܧ% [A(/B?=Nί:Uu[kdeU)4&iyo~詗뵷Ͼ{~7O}_ Y*TY407ȩT.f:yHBŒȝ*"u"' U:~E(K}dP ]ǫB'2w-I"'I$NlMaz!DdbD N\ID(&ThE&V1Q(0b_ܢˈ)1d&nމZ]?dԮtA]AuzRo+iMo^n{&QLO1l-3 YRZx.k[gBX6ҍ$b%i$S.0ĚᭅD/Sf,fv#ı$62 sd oF\e";R2Eo -Z=S>2ʖLOSO(S/ 3Z5))aO xٵ2``,.vU rYpe.bm-wjvߌ.{OӾ'n>_27\3p *vp bۖFO0(Ajk)++Wj3UTn<6|Jw[~M݈>2qt;osk3\s WTn~*k|ZW/bDd*W)v*=*K'k*zq+ ǁq(Z6}K;ʛ=?_=C̳)yGͅK)ycA=89"; 9F7.[^]Ev'a%eg%$To*:Pذz D1rgL[Dr}\#IC&???Ͽ?_oo6b#$& j!j"P $p&X"$# +ro<2Ɔd N4IHh|oF%),d>Nʘ `'`fR /F,)6f%^iStg6Fd>y ; )yC[ "X"/)`!\ +!6PbPp8gJg]@c...$  J3k$ $.1g":,瘆rv༎=(G &lG E2g BqQQ]q<yT# s P"GGc&!2BQ(!(hl2fq %һFv΂\fDA .ãh(dDG>>%hLRRmPRTQ%5 ʑ ,BȐ&='''+Q(2 Ld80DޣDh.:, 0-7h&ʀj-tM\$.ѷK$ʐ5p?i55?n&2*mAoAoA'3ˣ&@N|o#8sF u/kGkbq ̼t#TsSjmP4j :ZKW2d"'ݼvHI+yopN=,)JS1 cjmSm8Ayf845B3)41m>m.Ti"&6+Q̀v52&t5RPIT&z o2F݊K("\E%zO6$_q5fd9P$Ad@``/ R51-mj5 RLOْ.$lcMrJ( /騒v$iK|L9HRuH^M8}0+^IIb2bzU\(<'VO%!``Oaض^,v(bQ"VAmab|5`bua wZ `p3O,f tc$X4|Q&D'\*MTϤ:w_+^W=Ŋ֮DP= >Oҭ%caUN5А*B*V66ؖc+ @y5&8)Nb W~`xzxv|_oph8Ci.J7j7QD4 Giv3eDԅ#te'v,N) S844XAto$9wGPPn48Ҙt! m  /q O) b&B/rUB26my=* |C"`!`0'Q\F]Yő7g2B(ux%[0Eӹ<,΀hchpg7N2iۆ$!L&I5őP.,*t"'"nC+i>eo8TW[b pA}cc},6j)c`wl$r1fGߊ97>Nfh1&;*J;>c"y&D(GSX+yNIV'#_ d\Bbç=z_qq8{xA~@8"ܧ8ƒ:bzG$ |:Ra#!2yZm@jA:=+&!]vB"Ghѳ2/.`6ADd ,ZFQtԬW,Y|+E_찼oSāY m:" $76>li&%0A6 "%|iAs 1#ܳ4* cҩ@ aW4c*! F9ۘ%SB6eŢ;ޢE299z=5Ԅg  r*d|FlKgYQͬ Z>n*.]%f>e߃E0v?U1];~;%<Pt,C JKwİ[8 W31҈F 2̏BIRlP{9E ߝU'FyS^23gO P<=ѳ~^AzSl1{}%,Cxަ.MAZk231s P=)«2xztirǏ)gt+;U8Ol <,+g}= j>^]_~ch\19XFW]gۓJQeۦr;<#Y+SDjh E'P2-G/Z}AăU0ZÉ0ƇAF4ҡG7.Ê>,ȳ"4o-:hF&thD.UJZI3L+ӧ˼N- -lYUeFɄ'GeFrn9ƻ}-xХ߄a}uc/-ciȓ?hR8"]M K>PNyT)mN(5 9]~5^˓޼Hk$MϊEV-S~WR_7MO?y6r:gM \i4Hp:Ŧ߀tNtʹrvCpQ`5dVƒHL(>Ԟ]ڱcDE$K)V␌d REI-W`]L(B2`n)&xicgP@URcf*%\kmH^i&!vta =4bDr蜌yV@Nu)1AʈWS$B6Y8QdM_dޱ9E `&j'gr@]Uiwߝ T즑n;ɸ+nj_ ۩~d ~F岻 r7&utDfОydMvE~g/h{v֫-Ox=o-/jƩH6^Kg;c2H:ص勶Ь&i4I;g-] ^vF "RьV%hN+=iLEOn=锓dtfꘗ WlТd ?DI&QB=u%QݛJdg-dݣj7FDBӀA@^eǁR`}:4k[1Ԉc3(5=9& \*@z#Őj ڮ#-gX֨&}ryQܫXEA*c CҦ}ҔfNRWb) lliz4qE--{(!XJ܈!&G`D%%( fd3;z@!ˠUk ؜DX~t#mf#H8Z4Ѵ4IU.S#G! wn$ :L.2U}3K/ h|b+w#0k !+ypT/9IyMhȤ 4vcOlr9La$%hg.bgӾBw L=w9i Ed(&MVacFCIJfs.[!iZzr\+S&k,Oz3Nt.Ɍa2{H)-P2.9VxN U\n㾝\ \OE At&h=jD>A, P|W\+t-;bpDU 8X%>茽3$M)$ 4ۖ,iq,"x)nr%qm <rua9\HY ksTK׭NA$V:1pL* 蟚SWଡf:.kڗ cE.չC.\lđLݭ9c4RlvK+lc.:mQX]d*6RHSjkH7y}g3mi=xThR3.+!8Ơ 7Rq2MR/~uDM؛α5gXK9oR)*0i0}οw9¹CXZvXimJ/0[fdSB Ri,ڦ^ 8$)(zN1iZM"8T5t[26٩0Z5LN|9"jU˅2>4v˗4nWR})Eo@R髞d2u4yҚq^6#F׃h%QЌgV`zW68L{D!J.rc ^WGlXLC Ak^"AY,pLZOa7O'SJ CT$Qsp q2,@=uNzJCaa b08 bh;x?b@988؃FE(>`b9J8>5(P87XhcNHXhD؄]axHȄAMbjQ8vlGXU88nh7XSy\XJxfgX8_R(Ibd؇]N(?9xhB`th]芩R8](@芿whD*(ѣF"])ӧNB**իVbݪ+ׯ^Â+,ٳfӢ]-[vI.͛-ś߿ LÈ+^̸ǐ#KL˘3׮go-hEӷlz)s [6س_m[wڹ7Ņ|sГKGNѫc~9ڽޝ<ţ޼wO}_??ڡi@}fjSO=#[=框rX2"x)-rb$h"5x#9V8#=b>Hc?)J&H dC>)eWZY%Lj%'beP%8ɣG9gazY'Sҙk&c̒%F3i4Yhjf[4HO&ͤYj2)f8ib*z)驡J꭮ֺk묹)ڊƲJ,> K-NJㆋ nK/6ʛF{~[o+p.[n;FjueakfK"Z 'Gr,1<7\#5|3&3AL!E|4Э걏 GBҐc!yHF&d#%H;V2̤#5IINZғܤRL*W;RF2&O$$)c`/fyMT9D C7L-Aa8+f:Ќ4IjZ|and&LMof:NsSG8q3=I~́) BKzPt1`IBČ0GE08@ Cqhh98FL0lAx"Fn]p]&J2alp27 %5:Z*raB(mễ[^wH+QCo*fdsB@DE<.1oc EX8xλAq`yXq%v*,Y ?^5K}УKX9< 7ǑD09 qLټwI18̃ -b!ٽDB/Q.Hd64OEGяQ hLzҐ47M!LWқVt#PkZԧ43R:ՠ~ FadbrUY&>~R 'Q/QDkX"Ckv o*4ږʔ]ArӚhL"f8Y UO!S'.l>+BqFl-hqY+} @M d 2 A@@5쐝!-k8ӴHn>(SBU1vo!꧈SQÎܾ-A Tu+Oi;F3ΰpluڅX,>bG]v,zk1G j !"!R- Y5P>RGcu! t:(R,(=D5 At% c$os7g-5W>#q ]n’Ai3\-TC?$蒗1Efc y4f@!gpV t2sh  pa h` 1Rmt'p_ X!p_yPmq_`p2%(%6lgp|_Nv`?f^ooѰwDS# _ hP $9*b ѰQXsR!haDW4^y9 T(^(U$8 $( vd_Mh ȈMx 8- BGK X?G[s+s'Txg0k`P(cv7ruo Qw,7# 6) (*d~(!Bވ츎 ਎x؎ BHhA!G\.E5*2#P#P  Ȧ#cFiQ0Q` ^ **mHvpV 4)V?hBtEV :{w*QpPمZ%d ``qP`w5-z҇ؕMӓ0 惖BX@!.Pia!* bmcHYp zOw_?4Ksbp/7 yp f^&>nϐ]RX0)*r'ӓW?I" tx_Gs"Y荾NJГ X(y藧ᖛsO(n^>ȝ"p!&*ח]"%s3R2"87fXb3`v3 " f)Y)_72Q2E1'b*R li +FǔLu hy2tzPřiax晘 ``mp6(y1VV`'2 w!?7 Ńbz PpEWg&V htu4ppa T9Jq p2r0 8 r?7"וbU`sA] VOx )ÐrXtoK2Vѣ]xDʊƣڅu"%Vz`P w : 8:"f Z!W'ՕQzw "5a!12 \bڸ pKC(1KC ;*"[Q\j(ێƍ-5 %k#~ z!`[ب\ZqP!\PrPlqQL` ≩Bc聼WXeJ4XЧI'^Ⴕ~y%Py*_6sP`Qʕ20 ipA!)2: ^Gc)U9P+ ht+ 8 Vx*ARQqpa :)e5wqЇNoo) ֯ȸi>G9] i+Rڷ{_xѐ `Ft+!g Z[pܩ y:+" ž&R+(e K[aLD K#ǨrBI8L2:|Z0`a0ڻ(¨Vf{ 8ܧ :9zB+PXe'9ˢkù iʓlaZ㪗i%Kˀ 2 pt(Bkr;hi@ :x̱XΖyɜ&ZJc x{0\p* K@`4qLc\'m8 ,¤ gu8)V,朷*U!ʨ۸ @9Pm 7!hBkSԛ2]}*@ɨU(!eMimfWdMr! hpb]!xR6s};GUPK[$@]gtuL'9ʃ,Լp'gXmv7Y1ڠhm< :l Kk2 mQ0 1)gNJ6j 0 q < wam:( FF-ʔ[wopL!ћ۪'abgRۦmҽ6;QG7cZb4܌q ࡰb1pn'<@:gieٰtzΊ ܩ! {͟ROܽO=Li&B&gcm>+5i+\nMrѹ칖<}PVэsͥfKfKKE\H]v|@h/QǙ^ͼ̨VK>6yn豮 nؼƷn8ݹ.Ξ餍k]\ *~켜^쩎Ԩn쮮~^غn^8y+Υue .2!mԬݹ>טy갞.ΨBܺŞՌ[^C !cm[H} F y)13_,7O&o/O=?2?<(o+}1!MPYJ\ 'pL<mN.nʮ~mt٠/oԼ vˉ_ӹ?o%lHNvl2 CPBˠQCS-*Jh fEaƣAeH#54QJtQATS83E3QCݔT+I(OSRY3T?|5Sl,tthSS2Zla,Z_)Jy=N=#{]HzwQ|ẗFS\ ]Z1wˀ>`:9vH=TT`ueg~mfo9Gxbiލ/ ;N 4hۨ:j:묯kzk;l:l Bxm6k0"ɆHn\Λmãfpl5[\p)?CtEZnێ=oq=ss}iǼFpΕone"{Ә4(gi߇?~秿~?`8o@tAHR*#!>z#tE8…03 B^-D! e8C 凝 /?D !Df.y]A&e G64쏈WLG-f"Z+Eчb,aň0fτf/0cȑilܣ ј: R $"I6 ц`V "%20JEqB$Xh胕98z, qN(MHʊ@c$fic/$#wdї%/RH2R e.H_r!e3)$03:9MoƳ'"N}sl6SxsO::4DȐcvЃF?@ BԡsL ~P)BIh0)X`C h8_frG'ќ %]9DRpdER 4RSOt bR[G >T8mJOJ&GszRUѤ3*VaUlf^-ӯ63*'_ ұ4IIOդ]FUQNv4j:ѩR]hL% Իt!5udSʕ]JԦbd'LqmmKY`u)UHEHW]T?D&䯠U1zSY]T: K P*4'yz_P.g Tf-ps`x}E%%O >X!^X _׭޵ab,_Gf.W% 6X,EvN/; e)}#d^Y얭e!93قrDأߝf.:K^P[.epAPT:mT`9F#;gE3/xN}1ʒۨOsFaݶ[~e[[:d~|Wi?HE'8o]( :tˍ.ӊ=̊959Q»h,DܛT +Z[C%TdгVs{kS\z}4c2ZHd (00 JҨ]\Z@40ˠ3*<ü¼) Q҇EX\ZiK.{Pl[%9}`)NS*S>SsPL3 k3W(;\"+Tǣ2G=+#@+C)B s3+ũ;ܬ'c$ ȦU>n:3:2lWzZ˳AVñ:<ɦC#*;:벭 5IJ- 2ҫ<}`?#4 I*¨yhhD].:a|cINc)*M"4H|EL_kȣ>E*IU>K=LW|| J 3ISBL| D DFD"Y[NtB+<6YMZLPI<62N/c<3C3)4,,#ϥ:rOj+Ό+ḑ OLKNɵN8 6'%4, -0r*@7,&75rc|EÔK AC6Sy\H@]}(FӇ-Qr,5Le?b)̄%l<3 3@ ,ĺTPWuS+CcM,S9:dQst ڂP؇݇ZLP]}5o}r ̴/c h8@&r;J;4ԣ-ֻEuU ٙػb[$؍},N}ܼ[!޽UE["w[&")}إ[5>)nY[)ީzی]$YX8(Ph\|M`b:6 \"H_.Y.e%  إ|QO^T_<`z]UZFeeޞD>2}3vȥc7ۼMdu#S3_ee`h^~Ik&F]RU9c\ug\-~7bjMib5g]chZcN%t ^ Sg2X0_ZYe^gb Vy`R-HꥇEЄ#ZS̀'~ M6X-%Q޴zMÉ-;J}Je^;uܫ 0tf \ãejܷE1H-ggxhFNZ3~UVzl_N&Zٕh7_pX VE fv翞S0V1.lYj`El-.kG >ayƾ]NRf&c^[gt 7rU,F]~rWF`VuWgbiTvkiv'|NmoW-?^:vYt7fhE`._Lhp̚L>>oe(e{w[Y5OtYwu7녗uzxyGx.ww_zx?x)r{GȎyLuĎwWhzzo;+ʣWZzOzyWRy?̴ŻşG{guO{IO)o8VuIuy|Vx̏z|xɏ{G}'xxGէyG}Aw_'kO6yJtxֿs)w}Gzp~'з~?vٟy{}U2i5|j}?zׇ|w Me~,S&hT gYhi[F/=-bx1cŏ=v YH&Ax2dK+[r̜1+ԩrM})7t(45j)R2-TRB}Zի֯QfYh հmUۼcv=zl߳|kXa|DXɟ.옱Ț3sYکjФfԪWG4Z]im˒6 .F-,X0IV%c<(.e I2ZKjHZ]52P剂\k*Uu_ _})QgUyuTUUtb&l]'b[iF$daͧ ~Du$VGpHUb4VzmWGm߉>LPw2aGbeN":A>O&[dUVmYAiikj)A$T0 XQ x$pp(*AM疃B_x[ZJb`"ghgVQꑧT ( UuRQ]P"yKt}j_|N:,x"z("}T>xTfI %P9kA.QR%{ҍn5c҇yf^K :e9iUK%TGZЏ;b 1zU6,m t{jbf)~K,k[]6VZo il~-`xwIaze (Aup\/24 x2#2j󆇰Mw)N]FԾiMi-wz7ŬoHߩ42o8$ޮR~7oﳜ>,Ʈ4;XE3:W꺟d_Z!Ծ*L텉# ,ݭΣҬM3NV5ǰ1~c@ujtsZM!A_3BjmEG:뵴6շiR*Y#{ui%+GnNDl\]*YTkMkyVQ#UF4@g©4jX>h#G=eHjqZ" j.K}0mdczvd!^1n7zlVf5{ً5nn}K}0t–%s[Y֎M.fWk\N•,di]md+[jֹmjk\ϞW5En;M eoKHWy;w,U֎|anD!3;_cW$F%`;7mk\n5ni]_7ujb 풱ů,PYVsuO-Qs:֡U=jehbׯu] ՓuI-F#аnv#VK[ٷ~k]c˞le mL[fw-ob{7]R#;%tk xs<)w< d8͉v.7x>g W8yw&\ Wr<9)ΚV#Ia6"54b7aբ7i;j94:7#<;"?#>#78c?c9ckt>nc@#8"dP- 1 umbJVQEddPdFh=xF\>|DzPS$N$edN%Zc5"*JdC&*% B$F$6)4e*N"6*#&%T%6b%>b$)Je;b&#R%EFe+V?b)U."D%YZe8&aFUazXg9QS0smVu%Yb.fA##vb:Pʣ^n%6eAcZf=#h%5bR#%fWf#n86fEf;^dpffih>erekgirks&s>gVfV<> R؋}dfWigybAVQXmY'yS@]r*9^Ws^cnoޥEnoRglFdY6 O'&^csJ^hEpbrn%=n"zhq&hf'EV΢բ0Tva&j S8iev*Wk=j]a$S#C(v&'hZ(&#r~i)&tbiQf'qeҨ2uJ灞Vi^%WN_ޢ€i@a0ާ}bXF bju'F'h袺f)ijiuFcf)j*u! u4竦("h֨%zf#wƉ*e}|ZVu{*exvfv(X(c+棵hZlrl\"hlvSk_nkʥisn+&j%F,b, INjpY#S$dQ)i}vFi=J쯾*j'.Z+ǂ+e*'rhȮn,fk +Ğ&n-v%-gF,:V.:eh}n䋙І*bWmaRiFhئέmz-鳲2j'~k~&&ɒijmN+ܦlݺ%P/2,).eڡ4md t$dEiaSP}VkeagJiή-ź./7 lm/VtRmvnޭ(Fo6赎)&Dޮ.n3M`ym.jNlE*Qמl=Sپlb螪l"%- V,@2+/:-Zl%Vc+r ?az2Ҟb"F\G0 Ąnk 0_V훦^~m%S1-j٪'R0$Fgqoƪ>qn0܎r$/.bP`6N׋ -mE˜vɗ|gI)5N3b+%nȾn/. {sƮ7j#*n0j*?v2.+c:sҮ>ܱNA!m0muVG>4>fb:r 3@#{k//W122/n*Ms2Zn93oqΥgWFr5pU0yE5)fkX䆵ڶ^&;Vofi,[2>Ŷ)r&w0q֬&ײf'p+kw(K5e_'??0>uj⬲7o/lݱ&w+ac2kVXgVbv2WdgFʥs&6|wO,Cl3t>u@1&7;Vg6{7_pf,K9oD'FRj"sX A\xbkVy5d4xF6B[0TB34-3ݲN$tGCwft^zNg#G/t|? Ka (y%PEmgNkz3ZW>$yy[$Fr@Sxnb{wx7c7RrC#vw0'x^5ccxc9N8G$ tmǥK&Y5Cg]3Uw_wxv,Kp:5n5~־y~nU+r棗>c2擾k?@@oAe փp`C(A9$(q!}J$H rL8#h.#0L5 W— ZG:Ci&N}(ը)GWf(̨AP$+Ɨhmu3/ہwecYOhe6 .Q+&'XY6\ѐs sobgmbn.\s 4T<{JTo 8eULT)\ͫVGANЎT_PIPUsX[-JIS7QE%CU\`UZv2muTdMSZ5̣ V1upOfg=4rS[e7_us] /Rˍ*I(ꠑB#MK&YeB}^.٭kgbî SY!o:)htneP¨Ӹ骆Ni|Ev..:lMiFcZfw[de;lm.z6Ȯkh Zzi>;1:\j\䩵~[͵N}qoǡZ7sCw/љ>xvI=xt˾[I4L]9d:)DcŃpD! }*Vk3H$cs%TE U]&K|\_j2Q'e$(#IJ4Œ6$1djI[L&e/GĨ 1أ҃JCLqC l !Cm̔=ˮR&k% 1` HllQU81eְ,'BrR~bD&, @F@~j#$IMM'Ր@0 ۂ493)6#' 1UM B3'6Ă">FIK@2s-.3-fRQtEÊI2Ѐ"6 ,|Q"+E>ӄd18-A!("}l>b"e'1= q(8RW4 B`r`>t7?s Z9⭔r؁Je@HkK73kQ6JlZMrJ63 Є"lvJcLa#sp`28GժK4JJ 7a4>MIF#Q(d2ΎTQ :9 ӽ&cJ4N#W/)ɬ/B(Uf J1~b7+}"Q!Ar@LD+;3[P5+P>d@RĈ3/EԂ?+7BJCata 32%!0+R>WM_~#?%0Db5B(DݑQc 2H ,"fU006>*dU>61D:㲉Q7+#\4K^,O5=+kĀ~`Lj۳C$+m71,%ؒo :͕N /KO,Fά1TzӾWk#rH#(0 >CV.;C$"d  R17V%?4U"T(AB=5,sfUZ2HsD @)a38#Ife5*bp u"y+tmpmӰq42.A1B۶8tP&rFy0r#z_yB,T@cW`a%6(sL4LV 27UjM~ 44NBuMMkWvT (4UqA{2fWuԩc,7 1#0= -BIse ,yO#pL6E%Q@$d 1' G6{u9 4)5؊d.x38TC7TvdbBaOۖfה&6&iȖ5jQA bbv _"cG2{-nI' 1li!D5BaGOyP~#i;N6vwcmG=l"v+"ז ծ* 1^;zpuikGR--ϖ"`=u/q"bxd`CPL&`)e9A#)<YGl<K}+1!d Z0Hf4Y1hBUf{8C(k}e,5!yaC59m RA j@wR ,a `rjM )S9Z q9<:հp"n8Z9%)>ړob`iڬq- q~b5mV#;tH@~tJSWJC'W 5DlSR榩/4z_D"a ^-ҟeL-M y,jA1,2PЁSF!lPsj4l8YISQlA9?"Z oM;?I<Òj`ф}[L2TKN9_NI)cBBglq9=/@* MSVXQ9A̹ε{bMmqŽfPF/dkW7#JIzˣ}wVԁD3Kh28"acZ楹L: "f"Gl]MLta)ݜƢhb|#mPe*պx 6G16yBqx'<,p_YKʯ-Wc"TdHy\?0fHG<WLQeM %dz;~uۡJwٓL#ڣ=pSU tS3RԞCxc6_̞ь*62TS%%"!Q$IUI,Һ+j;UĦ@oCUgH1uoc[pS3bZVÎ" .%~rv/!gր4!!KU``!NU;rz9qLd*] D k5XF{8J8R(FrxM))c}CaL0lrC"TOUL8'ZNѬB4byL20,!Y@6nLloUrE(z+.7-X9X `)3SQM#*OE8S=^ҭkb}[O AzS޾42}2ۈǑ 7:!SvdXھL!hѧǜ j%ˈ dI3E22:Gs.l8jƂEÁ M:tmWt_RРΘ3enxƖ F Jvʎ7Bz&/ Q$M(QTh%YpH,aǢY#5!]l%zUcP )Y!,b(`[WNԭC7)fΕһFM Mj?~4դI>›5+܉ZDd՗e7 T5kagc\ ZRlIH4cƽt]TmZ%V^G754_0v]Yab V]r`Id}mZw X nv=BDhWyx%%J DV& ]|ݶHPCLDQEUX]өa3]\A$BtM#QPRd\ h jeF>jJ{iLcBE)DIRDaRv x}{_rn+.ݒ ; /kn鶋/;I4+ph /p=L=qwn {L} L2\>Go"s%CL7|3#~m'7o//-ɅEAJ1Dg:(': ʼ:۟ +þcNяuK(ޗ>b!zS[x6Bnd+6a4;51+K BH^dg%.* !'9YcwCЀÈsk A>Mt}>Dv<̃ NIoAs,yA d0Q"F*= XE51Wn4)5Ďw} xd"7@p2ԵFƙ-1h9$}BپԅʈDIᮇ=LI:qrG."! )4C@%0ż #df Mޥ_O3]|9p/YLsLqGaӛ#4!I*ծ+ + C"p'tLa K.lN2kPbEJ]φ]]pJY֍L)_Rt'871x)"X7}0i<H;f7Ⱥc e#VHԄMƴ%qe,QCt+!Lp p(Fm[b.~l{)Ei&v1y(a89^m,f;ADbf1DŒ4-h!ut4Ɏ}b UҐ]~, Kѐ熱[ˍhJ a 9byEm PȞwuK+^O2R!;l\V(`1.Ϫ;Mp֊aO6ԄHCV_MVϱix@NwQ$?'Q-[= k|la왭(O?ͩT^ԢE lQ疮tШ20zפaIo(R8I>4WmrN$R O?e)+);y⢥*="d[Z\Rtap\uYאύ? n{Fv i)["&{n#`DۍڢuÈv?^f;&+]3 )LR Qfa |-_\9]78PCEP5"b<|.d JMAy5\+c0(AlM|,^cpSqZ%('iB5}Vqn]rX/$7c탂[F÷MI٢QR"4kɲ=έwQS.;F]/\?1^Բ'^C{W|_\.!Ё(xO#EPnkȕP?rG-s_'?xogB_x ^iK*HB8yIے}"~W}9}-w}\r X # sip#X x$-H+x03X5h:H?8,()*؃9,EG(IHM. HJhJ[DhKNȄaHVY%Gqhr؄gUT(gm؄؂(m0j؃\h7Q|n(8\(ǎ@Վx(}،({xxwhu!x(_VFDQGDSby)rّwՈ~x؈^8 #R)B')Gm>y@z)gFI\tsh6nfTNPibDFfXVuiftYtG'M\)nGgMfG=qt`9Qy] T7".!ClwvK}VC;FKUKbpFbv)zJ=6o߄kifeɴf Vp3PeT۴LkN%`6N9f陸©Od9Gc`+F)6"HW(J(o kJ:w>Q$U6[nОF 49GTC)nR eP5ږmd*QesD60r-&af85Fb uYi6?Dz9?ÑmR`-YdfdA}mf5eE6aI [Z2 p=J >AƴneYH%*X!a-|ĵg{:h  Q]H?ɧJ$iEnDk^wA _e  oE5tK%AQ`iUڨPt1𥅪tI!)ag B<6K CbI@F7GF6z8 fOtH:itZ]uD$B4aSL<$b#y CnrjQrOQ]')~8jԩ~w\_ xidsERTixn``ԱnTx'1+[r"9cvaI^]&JbpQz}'sf#SF +nTt*8oeoXe`Jk69of'gYVJ7k:,\v(GzQ/j<הV$Go)DFHuuL{FdsP@YsL{FH[{Ws&(V0 abK)XYzMrU;]%Zg,iH6*p)8Vz\lʧ믾\v>c e(ی[&Hc!)-=QqTPC}/~8#4G@ʾAپ%C>$}{Lºܿ㌿~a|BD2:h%f93m/ J3X-z#Y{|<̷[*$xA"̱Ր\lۓIi24 w:l9(m@FKtƓ6PYN.i4dZ{OEFwGdөRAˤFotJ $*y]^cK0c[1|1JПsUəivA@6Epk4nmz=Mw | +>~-b˛P}95`ؓLt52y'#,|P;/ %uJJ^NdvDR\<* GŸ/-<Aa딎T%TG% 6=͠&:H+r#mҍ 9\6HbA >K?5]ˍ=%_dmGZN٣]=fTJo^L1'QI!2\[q79^EZw&CuJ9<͑uTj8Z* pPUF کZJaC㡺vv,2)'}=V j؆]z8I:}7ʺRs9Jaf.Mp^V.F庛cYM1#.'g/毧ΧJ4HQ  똳րF iiV֭yӵ u+Ҿ $y B 6>nGGK^]bN@y m? m]Wɀ]GVUhKaAEUn^ n@ieQFpd]*one$b8egǦ1hIYҰZ֫ɓ(D\F;oPp9oGT=1e8swTFoXBQ!&e ̧{[VHdި>Dd/zFX~$ XcU!#$N\&yzKbʻqr$,R*yx\ΘJaXQg-V L.<<}?~πz{x ]{Y(="ˠ}}*#(՗ o9-JQ,ǶtL3ůym(08D)8*X xb$A#iLAFI#NXbD b|"+:)2H&KVqC_jDX3Ǝ0Tcϕ1u)SǓir,qҚL>m:%J#5Hb!FaTP@4P@L@ a0C+,pѵF8GD1c_.Fs$:2c<mQVN3b>!(r*e4Q&.K+L+A!M*єL2|FJ3=s:=L.PA XԳ 3# >F4b58+)tA ;̐# bLEETQk0Mh\g8-yh_7iU^[5eaqdֵih-Uv[PP%}6m]W6]Vyq4*+|C65`XIҘ ӌLT+AF/#ɡ/rd4)d0I6y0nM6w}vM4o|fU \| Zoomz袨G}׸ys"]anm雙2R6LH~/{ˏM8ʈ%5;LpV٘Ju5}vy# d-MӺͫ&vVso^umY|aj]KwRS=k|-m1zyuoNC3Iwzk[RVsY1-r6d3V,yCNYd[^9e=4}lgXD( ضװdGs,UoiKs tflM0Bg(Dء6Ui1Of( 2?jTf.Lmo 4R*r"&\yiBR h]V0EVLjQq1:^ x7~q\gьZ> !4a.6.b:{=y[fu6@>T}`b%&-hBJT ?/2z+G:Tᠫ*!C_==K9̲j\沈$ WWMi2sT ꭈaC_#)FE CH~vX#ĕ | c50ĺ*AIarkz*VS<20VR%3yKur^;Q6mm`*Esh{;ܺ>v-jV#s{v<[о cCk;)v8U] /fwn>Bيˡj~-4"7͟lX#I.N>C=bySnTꈻu\8D%@zM.b*GQǰ+l ?]̎6(ȴ7>瑯^\>)30 )#|sS 7$+▯\ZprGT>3ܼnb|Q*֠AO8 =A'Zhߚu?kftcZ!m=퓋{Ͼ Y/e}S,3Eq{8H3fc_z&םM_ӊ`&3љ.:[a-?̺l!4^Ya4ᙴy@G0+PIג(=PK=L<0(^A{ABA!bBFZ_BB>zBBƋ9Ҹ'{]jCL0+)* u C V@oz A1t1Dx I JD KtD0!j+ġI21ò+-K[SA|Hb=b00ӫ"Z ߚ;r eD>tٕ;u)B8rdBa itBdDkT>B`gi9$]qOTbF뚦9ڌ 񌉋$i/x5L5Y4/!ۻҥi%mBDDc &+ĝTqzLTI,o z\IGrIqi=D1h/I!.3Ű#!(R!``ܼ+-?AbA]>],C) ,4ɗʩ 2IܓCمɺēBKEII>̂ٸ K+L"^/!CI?r2,gRMd9i!Ӝ>ÊtD jd9,'ql1 >K^MHI[l٥a5NY)=+*mBl>溽LrzϟbDϔ?O7ٌN }44lq+-_dj"̭B4$Ŵ ;UQS9 yP,KEXHLt1&PI04R ?<4«0E*$9,M© 1>T8 1k3S1UӳPk5sQ3@Uc84Su*uM<y2́ 'St"QʢQsS^5KTS#5NN7}PT:4Yf;#8W8@}fC8 WU_U`UbUaS 8p h@֝8e g n{7~Voo V^ i# քVVp VV7|~W~X[Wl pw eu(1` XPءUr6H@58 X4د u :LbT3T;G- E3Tu-TJ041| CF T5p_$Pѱ:$٠E:.%9eQ+۟G[/"!3 6үR[\Rk̷LRk->ZT=4E4BEBNQHYL9}$JփܺA[X3h9|I$ՅLE(>+e]=@Oܵu#ߘU۸N[[aE!Kȶɕ MuI M4c_`!ir _f3Lz\C1Wt1FZa1=5]aZb-a@ ; +`]9v# K(G⫣& .eNܶ H ?5*3߷RE8+$8c!?,`@Ɛzlyg@Air~ƓtvcN ͆g}hhǵ'&v`oEO.X1bhdPZSԵdb)Mjieta}d$)i ].j>zj:iKi!fB誆ju ~,h3 %%P1Wy@{,eMh&Մ_Z=4lM@#VeiIy,F'I%"䦜AVb/ ƒZ#&VyK.7O:y.UnEF*n"nn"Pijn9s4}Z3lk ޥ`R̉e\@[[n}Jł'K$iލއZtMO E0%ۖC۔;Oq-mZl桀l ~bг=S=q:M52;59Gr-$1FyPd H}pˋNT.NT;0N5Q54׉z[U78s99\7ns=wA'BWsv FU\m}Us%Evört{V m%Dw6PIOtؠPWWJWTtGZgh3< l>A\!.گ%qfgﳟiqy!Q"9e<,S<9#Ttww(=4eWbggz[T +kr+\NlvwAʈ8ِT}Nͳl)Vqo5]UaBpCC\Fl)^G >%.ΠzNޝEZ_G ?p4E>/,Nx?A=$x/dDl"bg9yn2?dY<4UDTȧL^GK/ ZM Nty59w}-/eLJn@Η"\p}F~ڏB.g?@a᧽+k,cț)H WyO4R3clu|uAC #ξ1p!ÆB|f߼1baĎ?Fhp]%ALr-fʚ6 ޾eS>z~VOR}i QJf>e ddώMvmZa1(ٺtٲ ;ٲ@Mzjp^qhu1H1ϐbƖ!r-8oKʓ+_0s80IcƟBZxH7s26QEG-R$.B"7MO(5}B>H>6O$J-R@TFyǓO-%XT7hRMX1g쩕&^i*ȅp]s1zV&ʠa5 YjbĠ5n$J\%@F*)J&*)H\3aiz$\jD\C*+Diev=9>QFR@e^ ]ZƲ=Zz2{b{d`"&!X.^XĤ!E\#t-$/&Li/}j;Cӭȿ +ܐH0 $dGPND43P*D,@9UySqVI.}gQ{?~Wvvc$T0 DdSS/]>)JM6THZ*6T+ّ,6ʍ g֎@8(OrOHd,4EyV`Wx'hK. V.Wj{(=Yzk2VyΗ'Z YEkҏc"=YBQl%+9H9K/uX^gR< hHBj>vmtv1@w?өx:IxLJbDy*Ur0`֗+ukrt?jVӵe[ggP Z!IDEvdϨ,QTyX씦M(4g```B+gb(΍jb@YF]IgɖJE"r”(] /6զvYns cqSQhe$ S>*Y"LH>Zt:ւ# q1"MGp qa^){U!n Xy۱j8[;Ey,`.cá{ z ʈa_^ϓ,I_\Lŀ=a}] p.$0GozA5F,d=61 LFeET;D2c*ʬzJwhGRj})ZۊD?iDķg?Wχ !$qڛ$qJ%ΥҒDc)qzE2BHYTcR40U'Mb\"#浩YЂ'gOV2b\>h5T9yN#p7֚rdGt -ŭnI+6 ǭla7LgmT^r}wU\qQ(2Xƾ=.Yn=KuWȏҒ@{N,9#6l\A)Y<}|J2QoN3%k5QБ>t HjUz4_C"qt,]y24o2 M+e1ψ ]@.q[z ~0({(Ckd Df.թ@ V<ͼyT^Nw(?̔[.sFtP=g.aSTe4pjy_ } ȧ/D(W2ˇOnd6?uExȘ՟HRDu=, RQ<͔Ubi[O^D”gXm ؤ ^L LHgՠ|( KVnM؆`%![D[XQ(ʳt[K_}ŹtZXH1| TCUZP[?)=NPPuM䌘^VXNX{OOΠp0 ! ސOTN ubUTqwxXp%׳|\FP-9.bP"/b?PO)Z D Q ]ODh]mP8n/V9R8b ]}!*)=c>> R@@7eAdBBR4!.dDDJdEREZ4Y$1A$&u$2 $HH2Cd7dJJdKBK$KdLAn$FM$FMDdAeHJAjd#SNTIDJ42O%cB#)2a T ON˓87>O)YE޽TI]^؜8W~b4( a(Uw8X2QP=_Vͳ4WteΙpft&(ȜX!V&U2VdJXVa\ [!%X#%\bJ% Y#IK (c am" liEg繗\gVHw^u>yfuXAhOOBe,Z#_'GDgnHcx nXF}i؆JJׄBXy`PdZ_q2B8X( W. m QP SD7jݍIl\&VAѸIE ᘎDEلiu u}pI)אj o院^YXW!gS5SU5h}E2,f\ibj_Y% y"J~%DֽAF*䗩e͐HWEj>Į"ykuITP؞eGKfTeޅpK% EI%$EMK0ث{f g|  ʛi뿚lƾ-G쿩njR'\sdH:AK9qfRJjT")0x zaYjUYKaX4F ʐpFq[(틞Ӂ^m. mb]^(F8*k@DB n 5LA r!bzP <__䀂(%nᝅW f|[qJCt"Jmna[X.xr*nH. ntHZt(n5ڦ.OfJSR"%@0 z ΐ&]-EIKI<,* o=u/6QZ!̩ʆg^}/[%c PXe=.6 #varz`&6ߊ.%a W `  @V ۮMn0`z!+cV\4 ~kvJ ހOT%řL_Wi2dޡjOW(!Bp1r\x!Dq$UghK-Ǐ`Ok&L5.0a,,ȥDc c;0~G* #.-&BaG2W$C m y#or-(3,"9:s`*SP2ã;2{P!YB.S7;7C27R99:s)dIj;_s@="$) ?W*)#/d=[CsEEsF# q7{44}4=^%v XVTw#'/WXV)6)OP52~SMXtYihSDZX>u/;T'OSWuT7E<5 Q3XPZuXXuUnh\T;\5]u]7] Xo\Pa?fX66 b#6 5_S\SSIS7euaT_rvfwfSfXrd E/^[5Tv= _%V6}vovp'\pumc#0r;7e3wr.Je+[i%ZvwnDQ2[m.q @pwWГ֕K=7J> x%4}oGY z<8뷄w[?x~>yc7)xx8& e xdwIG wx yx"= S jDI85 34,œ7y4H9+]Rg9gO6Q /y{STm7Nݦ~D5ڰz 9%yǹcw9\kݶo9vszz:/C'ŀϸczw9Sz8u8y> E7zg?::wWz:[{;:{{ߺ{xN0z[H> Q\BPw7=w=73+ [G?>ueGs=#|7wk9_<ߓNW}_|>_w7?y2}ˠыLz FMCh JE3r Ð ye'K"$haH11[ҔSʖʆ\92(4=/~!ŧQ!҄jAe!B42@3CuYPiƒj d2mDrŶ%3ܭ(]w_ - -ыfgZV.޸\ag3+[3ą BICӘ}R9fr럾zOM PjҤ(Q.WLT(B?C7=}[N]S 2¼ ]||C[u7޾?N:֫.:=kB C3An@TNH|:k %qtѿZ )n?#L2C<*,A.L".41& 8؊KcϴoIGtPC4tC}tDoBLHd9MAR.AԺTDSUK]UceVVOU@EqUIuU 6Qb)=uVHOT[}M4gf#vJ9o.[>Gm_qӎ)1{5` s#pU&1́S8'T;b2Far]w}$M~ޏ/>O]ߥ^ޛ^x{W~>7?~˗ŗw˄W?]x;?΁)8eyDȧ;N`A= Ѓ+'@` SBP*L gAPy)$! HULC'.Og@6Q9(@m IioQuVk`G?fb` YHCvT"6$iBZ~F"3IO~(=IRҔL GLl 9$1{a $I_D$cJ"t4Li&f4LnVs'3INs"sb '2O{Z3Th=Mz6)c߼E+Nbf4hA }r,@W*N|4D5ZS}:ʜMҀs25HQ*O:h:]ԇ>թQT́6/h=ZΑ(mVzhjR&@ l$1J̹ޕvė)0+`c@X+b %,c'V1_!{F5@e[ִMj)J6ll_{ZےV-ka[np)[vumok.%fK[:W̥-na` Ὦk:WծtQ^Wuo|; p\f%mm `opz CCa3 _9a!I۔'VqOb 7-c-Clx"qc<1Ld&xI^=hGt=sJ_Π2i;sZCjN/cV&AjPԨ6&Z] P&BM]ض7Wء]zDmkW6mo6M;FϭPݚ3 z[٭nwkfܩmoNu[]x8-]O;8ǭqn[Gbs[nv1틧66/~q7m}u_]j^H ~z wx>Q3Tdzg=Gy101vxQwxw{;^wb}—l1Aw^SӂA(A+t\'Z.I<;oyʋ^t!ICγ=k_tj_]'իpMvo7ɏ7g{s!;հDMLᴏno8M0onO/Pޞ>4m  V TPn p.9pnmNPz,4-P2-s8S9M|m q Pӓ^}C ^n]'TB/]2j`ڏD)e vaHR+r"4,5bòƂb/Gs.3eK'%E/-A %X#rxQ 429SV-j6 $PÖԞ5Q5pSߜ5R߭~QN9)nM*2PI|~icM6d7}A ]**ӲF %Yj-4Wţ{JAOfY}s<פsov9uVDXo=mW=W*Q)mM 8us1el7Z};W29s9viET ڔ.r )SSSi-8su;MWɸ>?ARaN8xa teA /z9Ā{Zw5{Eq |!-76 ր ׺ *!.OpIIaɲ7VG5@LW+aXcWG9+V!Petaò*2H;O @ A R^V N>K0;3U} Tiqj}բydp`w]W |s :E{@|C\tԠ$|C.~`II=[i~qyI%VuTOIId!SO I7qԗ+QCsd#b; P.{:Q ZYl!Q]sY\5#G j;}<3qQ![v jܴW?-t)wN6#@Q}kѲΜy!w/#yyi| Aȉ )&طlqD;}pphˠՃh"CzUB ҂>*,!@r@4eZFz0XP"@loej~NP 2>2LHh?  eɬOpt'֐~ƄxHl:uhe@fήɨ èI*j&՛Ş *P4ᮭ &ޡ@ob{-6n׫}׾leczu {_>nO{{Vo^wp=257tPg(ao :Xpņk`q1[w9(ap`zIW sb]py|ΑZ{}מjq}CB22 9tC = ZEjXD}P4* S",b"R+nY˜8(S28,"Cʈ1gjgً Md2FbL" 2>d)P>%} 4VrNw0O41MDJ4(]j4#%E*wDGVGX k$S:PZH~贱QA43=Vo0(YPILA&QR2;p>"G(Z䐭Eo4*Zt!s n6p-!s .} 3J6kJskAJ~^E{睎O7|Jw)tZr`֜Y{ܛk'-]ako] ׵mѵv3vt7&z;&4B|aNsx1ZCc֮TB>*2* .Fn砶> /&9C&iİeYn0QCHDգ24ꫩVW;=^,2*E?Ug󎤯N! Rm-c1iiK@c:-r, VYIL,`!Wx4+`-l^q(E#2/k#MlHb{J2G9DЀȠ=2F ȯNEZlFxkbn?9Dr>3"'k,1ҶsSʥ2C\(Ύ`Dry:sKCyK^A 4`W0Іr CȢ !)v% 0+ `&A:XB&G bLkh0V /Sb7]RX& V흅~V3Ep( =8~ "n HjNPf @f ›M4|4Qh,4J jݳ&hS~ЂipmnF#\ؿ̉HXUCg5@DZ$}sh±FavFmK%7r}'-5K+Y tY$ы67E-l_;W$Map$Ɂи(d,Ҷ59. L!![,ш$ b ;Av(=11v Ab. bB*בvZOYP4QV  #OcDX)cCūaUbcp)CI1\SKe0Q"K[1Y2EHWwc3DI4w)CXz"x[xdtC5bf4h6Jw@8EiZWVWw7"PvF(E,2jCoWU?Gt1D6wYe}s"X0g;8QEUevA KI#R8uqj[kSK8$vyKz[Z1Hh(0 [0?o(& tkq}QW:. "20"i  }h!r 800Q%x)8\6(&h0#[V!fCDGJwwG4D[hz(R#52ua65w%fEkZm$JFc8$dx12XhTVt/XYUYc"|#D&HEH"q#^xXi^61o$f#hV#7JNc9][z5yQKK=PL*N QLI$JYI|}PKѓ^ׇwrQ.,6= aD%m Xv}Ѩ(XPH\WKŕpyKHaic)Tb*G}ѕJ527yd]s!sTeaEbJW39`Cu)f5FZwuEVg;R[hSH!D2Pdgec"qY2#hQ H%jv26d%$nƒ9yNw!$y&cL2:Vb0X2(b򌞹 q5b˜wc`0)Uzrj/b0b?C|+jQ@0GGϨ30arK6Z9Ň?%y[8NN15!D,2t21t s2QeĒt$BBՃ4[7jtf$iJW#QD] 27e9XhgX' 9Ya*}u2h)GeL8c8fR3v9<4k^#&hH*x)q (M7 N3NZvr)ԗ !*Z.9 ƌzZ8H飲*Ku}خDK}HJh'YvgH}*㨔D]37HIfdS8n65, !6RZ3m7wYXTjyxit,E6{Iwxp2V#XoZ'jjLIA9AJ\ǚ[w 7% ?c'Qʚ 5*IdK$s٭H)H^F:y KJsX$ ) :Oʡ#겒H=wvXTzBWexX$mڏ{W#4#:#f:x/(:VvY"Áȑ!"nh?}j{X"kY <2JX\4JWX`J%:5S֦ SR8=2jc!<}c<љ\ro[r1ژ85:8[Uӣdm4@JZötk i[bj1gaXϩdXQz0å)ۧ;d_T9[uxgth#)ylHvxU{ZCWUPU,Gwf t!gСhh$I5G۫GTk}74ZY6Iġjue9dK{zDPR,9Vȡ ŀKZs( mb}yO[r7 E3صظT%0vJy`3ʐatj7xHhVIRܼW3HvWE;Zۛm4t+ȱ+4fE1Ik3!CXɥvF3/ۄ/k!}ꨂ4tJҩc#yi5d%cdf2yW4vqfuAKTeJd,Ly221hu'bNV nBni-Q9}U}U;b+<`;>;.>.8뷮~n3봎>n.~3.~>nԮNnnNN.>;1^/?nnǮo^8}~!~* |oi0mhN bߦHRIMGSYIHILOSYohHo_)n}bH_f_yeO ׷EKKa{KyK_|/TloN\/[O/W|_E/rcPٔ`o.{wXS/eoPO߉_R__L/ Nh(ʳ9B o_џ=+ݏ=,/ ,gϿoL_=h T^ 2HP>e EGQcBzj2e 1zQH}'3&idÙ$E྆&| 'Ρ4B#O?ܩ4hF"5IA saS8Ct6hU(J|W˲Q7hҳy I]' wME ,,Ϻ|SnAi} P떎;v,GʸfVA9MZmMmٲhc hJ3G&I(OE it龉jF*.{w/wb+&1xFwr挾";v.JҩLR„n쩯LL6܏v&+$ CƑZL0ZŮtD4 -9R/ ;Ϻ4GmBTG.I" Q˜ nВ o1l1TBR(KL qIhԈ!c4'eF4n,KݞYh,Jvp:t0YK3*1[JRl֠VQ5\7BV4X%YPlrQư+A~1Kmh|6ܔڲFp3RT7 !8@h)H˸P7{ƕqᙕ}LQ NnϮSj>hw=cld Tx\1?zZ?Nt8I5RR33rJp6X/!Mrcuf˲kFTz{D*=]ߨ.\bEZŮ-R)O=ӎŴ ՗SM2Il ޚr=I͎WvJѐiæ40/x?q+TDG:v5E#"{j??,BM(v1mi{&3[Թ-}lH~Wzl'K`%eV9H2W̅g^y7 m)t7=aZlH>'dY DMa꒝m )- !?Mrg0<̍P,/~ 0v7E0HAz(Hq"v$LUZ27 qKWw,vQJH$Ո>–9PMK9"f6!v/JжסC}|v@a"qM 8Ds _P?IuJ vIVvش 2X#VLr=my Zg50iCN#'SE[!Z d>Bja]$U!H^[e1oxJ 9EJsw1&w;C4?a1I#b EDSK6?0L[2.B+[*i c8ZhS%/kd&HRrJLMOyLvu|)ڕ/: eAnn RLQ0DAjcӨ55uy{ZۡU_W`vS%yjdвifa, ?Fof1HvZ_ւY-I?R-m҂6T)T@nn9ylΔ[Bs^0CEX\a:9UevcSWVg%c$8OW4"m&D7zJ_I\㣀#!op&4Ge(w|l!閯gͅS;1r$J5|DBM44u.ιGࡗGS'9zbKa8es!Rmڏ83ܺ9-u瓖v ;МBuc^ZOI5jt7zV}Oe/ҴH皡jsZ2A ]=(V`С,PqAT |T5QJk4#h Ɏ@6&P#\ׇa؂W}XK1(}`P*W5;;i1JZz/"˪ʽ1#ؒ24J;)c%w$@š;9x :1y:K#^/m r6&4b8Rt3-9{ⶖrn.LAɃȞ_ў V1%j"q leBxj1P `ȇ`Sa؂cZSh6S vP4q?h؅8XC8}ȼ)d m",$ѪqÚ'}YA0aGA, 8[ &s  =a u,A#3R k[,~bО$S3qz:Ё6Yۢ #2 :K.~%sp8Aɲ Aq9 9 ۘL!'RX3ɽg6 /*VH.Y1eMWzAiV5qOMN)&]V^Ti%.f2Ѥ% (gEyßWo Z5`!J1P] R* PpFPŨDT|?` Pz1p9[MU5>,!:1?m ;<"hl#L, W7!SxIaZ *,W rֱ80ۨګo#LaaiBjD=)&B*9 e@2 (PQ*>#b"g/+HZ{\(xRi09lV9G; 5>҇""5]9\5سS3Q<?WÁ0(@e`[F@S Z@ӏpvJz`֙DF$-4V䂛_jvTe3ڡCzM6niA)2Nv!ašU/}QF$N>W%B{IA0,A934Q%HRWҪ;3EٚDyg`$)0E@tf8ORKHLl:D'{oR U#2 @름{:60/N4ľ퉓aUG8i2DQeZ2RfǠr2!̤&Kբƪ;iA*̈6!j3DgSr=r8bI0tKǢþגF!g<D]陈R:4NB,/i,N jUfaꨂiBc}- ox@Q:.mfN3 6+_d ٯ!-.b**G626!MK^&h8m,D s!4ۨ_9J (>3.xB*Ic<џGcD)]=I+j p+!g1WZ/8ADS:!]߮UQƐ.: _:(oeikik18&bc͍r)F {GƛA5b 0G:~l*@jY.fŪ8KCO*=I͚he/7Ina˲P_3 S0(vAi G(Uo}+@ʦSJl Eow\Hnf8k_$\;4ړ"+ٮV!ARJh A}[o}.@ >\Ƒ#Ɓ1^4XϡDOn$mIOX3eȗ1gF#Jp"̃2]ͣ&aјKY^( GH#tiU/GfD:cUQMu!ócI|[L\<))Z+z5豬^s3ֻntR1`R˳>uc+G1 =.S"S48&9 Q28D.1Xhì>EMjD6nv4ѯ[i߱\Ŋ8:CoݔiYtSB& &hS,EVVG$7W@9&_tuYGYz4ٴRGau=8^+z%xU%(V!y\e giVXYR`!6!CC.^u^%X\o!6YH6C7ʼntcA{HaAQe]1LnD0mF^hf6Y~8nPBb|&agg64`r&ndfx@EE#k5L]iOlE[R:Utzhŗʘ$ChEb~[ V.#-jWg={%TՑ큩gh97)m2kz:ڥYYCnki{+:G.Wn:G~ṏ.=?=c{mhSxCOx[ Cg}ݎ=ĥ-Aۇn,u5d*h$0PK9"n+١E^HAL!٩P,0rX=CHi?q%9ĆC̥)-YH5)OqKPNl:,']D&ʂ|%<%#MK*<"yS.&RlDT63!dzِ`rI3L֬U$J,N$jP#I[fY-JMRlf͆k1q99As9%Kdk*AAggLK;=$*IV 锤#YYbɳ<2jpT_KC 211MPM5p O.’9JH*4S-aI?Ё tf׋Ad#SF#~ubAcLըUcVA']ؓW*W2ֽd/YÑU]KC$5A G\S1ڎWDZK[zI5*٘ sˠH•5l$=#Up='έJbz %O | H:PkUW)jBW;YlgV7DYDeSB\E-C,ba\f>ɣעGM1+$rB!ZeFC혚j6$gdu_|+w,=k-ס쫖HFK^IlZm:(1-"T*R,U$UtֵtNJ' HW:aV,ɓPj~$zyHe_"ɀdRKOd+%@1i&]f,(2h -1 2d2Jt= R mKǕ̐xRˣ U F )ѵ -ZMxGͤȗ9# `d FE jLJˌU_^޵ḥ rT$~̟pCfQ4-8٠؋t1LDXDOJ5T} IbGD.2ũ+:^QdnԌ0 eU9$̼I-$`dȕ٘AZ@Z O4] 0ȞHȜ54I FΌY!R&Uٻ$!z| fi\Wf0r-ڪ4"r>Dּ%]u!AK$fBdOOKC@ )#\ܳx-Bd ̃ xM01xnzJcWP͕YBH yT W W ّ d ]Ma0c8bL Lj߃LSdl#(Lwz'rpg@v)0Jm΀8ۻ⒊|e}^Cn n6_pQ +yu`Mlh_e&!u Eb, T#( F病AJϥrĕH1%!D jY r*AMDc^ddV>X*h`J=*#5ƺIa@~@dppH'"Ge1Cp CdB"4@4 F0o>p(D;,4)o/;@D/b/kjh Vg f:Ehpމ FPߙ b"J~Z*Jq,^pڝp\r+v!4xlR"J;} ǜcVEhۡmkcJfKܥcaJJTz4hVZf׽ (Y]k0Y#F SY<_`dFcv]Jؑ}X(P C"G֭O.r@"K20w4W0B(d)2lI*2DCF"2rl*g3rC.gJP$XWNX1`jxEeqb$#2EW g}іaLu aSicX0G! P,3.AC&-MCZW#0w* 'yK- c%?j ’e05i1v [1*VBhX]ƮILmvAYHc*CՌI9תa!WzNk&EڞNC1$dlP$A|JM4PNB쭤y@T{ *^2h<@@0}uBA^BC3Tr.z*2@23|jmIԍ1.4[lޜLd5 ?w+ `x6kB3#m"*ɃHmtd0B44p&k"z*<ʒ-|Xh|Ț8sYƔ_L*A2 YR<CD\!kxZRCqzD[WMMzDtM`1>%cwlcȲpKC-A=,2r*ǀ/A;8EO*g4Ѣ>,@;j*M|`g@&[l&-C%2.0UsfZ`A`NT fG)}|tW޹J}{nל.ԉvWz@}!) ՈL}I4$^h Xddmݹc!K'ss ۩E7rLM%&$rФ)K4X ;23B-CϢ>wy"ĀC-$+>5^S2, FĝwPM0ɤc!S6*GpE4y^ȟc|< UH'1n&bk01^a. o>qE{judLE릒KqʓՈ, Źށ& lgim`D:~}XRQ>a~"o [Y/@D[l`41!ܗh-W/b4FO#}1|B&}/YRh_T SBXMؑfz4w3fhcE8q>zOr\pȘZn,yTGe }2}+pT&iTBUԬ,Cu3u3ȧԥʴ8 ֬Fu02;$+&5*9>/iY7Cs4!4Xhe pxf3D ;J=3RI}5u9M|4nɷ4)iyVʈD3k3Vufis|Ni m&qeȪ:QҏGCF SAt(|4=s+px@ :M5.NVE'Ml%/CK(rA[] ?O,YJ,#PnCӈaE<4d~V驯^(RO6OR:pk,q ]G|DsٞL"OwMΤ 'p4Kt//;nF [a6)EZΉsA .qCZnxF(5SӖQ-?d"J]ԴebG05gp\lv.TBJhbUIi & )wlKVbhTAsu&cTʐH&@jďo[Ԙb$CC05ĀD&ʄFUܕ9eLJLfChnbt:Ca>ԁ[ΙdL=)!JVn=Θ\T0MTt(y87ap:I Zg'}RbX -R{ ePjRPzU̦70WI1eH,PK'KU':jq6hO!PQ6.# +xCƀIQ`iQQ(U|RE-=DнHkiR+A ƫFqc'g:DvdA ~fUƒT]yź\N1LӬɔX| !V]B rШSKawks٭QN#/PrPpLJ99qMlK `ɮ$-Y|M@%% ob}fEfk$b!iHъ bn'bV:|ʊZ3/ªิ4zuS d\U 1LAOkOi-bجV>\Y,1L^qm|k'YgRc Εz>pf'ǖWPkubմVt\?z\YɔR=P4]>-.@ƀLEˈ F˜P܎|R*<.Fv5M$5{f'awR) )Z'NN(Se,$qs/ږxM,YL'}lvL}yUJ+vW9\Kbf.ޯ-/hli곝%G,'cK'C@d Lxb@ E-*hn͏A$'֘b*+(Dlib&j& ~)Ě0$կ0hK0Rd6c@8HNdѪ}vZj2蛌d|`.mŞcmgkžf #,"(B-C5TC/4C1#.BCB;">D7CQTEO4EG4Ea4F9tF[FI L4GeD]EWGWGEtG7EKCFGuITFFs4I4JmIJE}TJOGC4LtJFJ4MKtLєH4CC#%1& D'.z!PBFnPtQ) ,7'RCA.u`@hS R(SGUHTCSUKUU5TES5S7S5UV=uVmulR}5WW5XgT3Wk5WO5UY5VUYu `W?UZWwUWTWUVQXk5\}5ZW?\ZZZO[i^u\Uu]R͕UVmT^]5_]_]VuX`^_bu`o5bY^ fⳢ$J%J%@a;Cxj\d76 ؖB7Mh5uxPn"'! r#)˦h)(=Z֥3"KtcXh! Tfd(S(‚OЩbFvßl0if\k:؂0_09Zp?LP!W#nIk7mf@qSN&rl3.Ol%@WALtcB`L(3OdRRmĉi^# Nb+'}hLxM/q=Lvȅ9:k(Ah|*qHv2B#d9R(*E!_@XCZ O0~9'9}4-d.fXS MN#у7SzDF* T llQh/ gE+w$^n;RԊp6;YUvl/~s|2ݙ8 v /\ȆVh 2#mR1*4xt丞w$)k$$H#f2*D`D_gEMwR1v϶ey> k6iWR"XtWHN&9vwu%z6Arө#_rDُNj-\]˚w;'7;z:{x9 OVQQ=tɂnksMo\Qpwy 9!uf2QWXO0ga`%xEX;DGbr@䎢0ANa(! cflNisl;=(X`xh`cJdCu*aG`Gׁ%Aߡa]sd$#O l]pjK{}ќ YedžO,oNeKp~O8teg$8n&O%k+luXnfH-U0#;?ɱB&Г|S==|z)bl+d̬͒E0 Qکyu!^(' $]$v0#W4]|ܯ]#C#p="a }}}/P>54i/"?%G(A bcvmi0>]c(Z@ni82dRoo+X#^VPjY=+kͣ6ƙ _xeB>}.}H/zAgQaAchXe0ZA52@#&S # 񱥾}NHzVĈc$FO蛧4ڼ-1d7/GBhB%SOє-:K}r$rJ!ň,ǢC> OSm% Ļa GL\eRVL^+ݼјƆZ)16{#>Š;5{? ³% vEfY\t[_![BAccI+=q4}:hĂ+Xz'_=%D{ J_| d{R|:4wEd2TP%T`.tG#@!E-!{h"`HuPv_D4aFE4H_F,"ҋ)D" rx&F~~D yPyDQxPA xtS0(UP;52iIc0$ȧ^AbHٗ2%C<3(S>\f>5\ I&W7k4>Lda 2[ z@V9@cIu Vr- T>)&pc$m4ܽp+bm-Q)6+Vź\#k V][ xcDͺO$nkbl!tBNtsŨ=&I"*$sL/ޜ5i#Q\#=uDWve;c bzatKOa'g'U杸A&6ONB}Kxi6|jYPL\14TJCmRc0Ŵ؄S&b2E#z J|qjBDM-w<]$ DuM;1eYPqPu+2/Bp6)=qWOD03}KkXja1]YzЏq1@ =D*2&X=BC!m[Cⷶ2HB\&5nJF%ɵGJ Ӹ;"bNȖX!"ikCX)IEKk#;(@}l8%BpsȖ̘/"c6N=ٗ0Ak|ciFih$)HJ8 mGp@z>ƿiW,IFDBZ" `%lNcٴ㟦 7he ꕁr"8#K`H–]o >gARB"#émhtCV2B F"M8[Z㸆-kӐ;'$KǣRiKKR5(p2%5J8"Z~?#lW2ױq_;VAGN{aMD4(e2bTe!&%% dBd/Š$FAE^dXetC`Iεt$U^T1Qg}-Y?*0+[LzӈbԠǤ抁#"}eOA>" UV ڂ׼ఖh_ 4\١vӋP# YL!a!ݩbҐcCWŌ1zhmWB+@-)Ob.dZK鳪UoSH>hN*IB,/K {Th(9ʂ7M{cO쇪X!KףS+XXDBh6$Sg@3Ytb011E։<#7τgLB0 ɿ3L Ō> x\'7!NZ ׷*y)~: DO{0"z+t 0 2P')jX:e #QijKjH88)Eog34e8%8CY Rr`>EL4CF`3 2j6T$4#Wm7U4 BH{SV>$&%".b[&o4&c2:UZuD`&cGB7$T3fEn҄hFSV6*TQ.26SVcJU3S&8UGee'QxfASEWtoC|%@7b6hbHD}&SWEx|:942cGh9fiˀx&Ɇ J:%#:4;9ytLB3R@L?UD#4~LƒyF~RE|r>N$wc;kEi"Ґ|'Lg\4H:vqU3i! i4]8uGDx"dw#_%8UGnS :vd=҄g'us$(wVdfv9m5;rcTeC9Q%l3fi7'%V鎍IeN'sBoshd8jd>8hp#ucpd"1"@sxub2!*0 ) hSD01 ?p)Kt~ h g>b$kIʐ5ct&sbGXxE&Z EsG^8+#3*x^49 &AImB7mGd:_Ӕ;9SlmXo`L,g7y6;Q aLdrLVwf8iyG4edIԘY) r6lsUf]sYsj'ISEE Y,7CIq%c[8wuc9vI9_vWY5hDcXΕ93ZBJmOADX0r`&(7{|Q3\)igf)`wZwsHi@_usbӖdӠyr()1e#c`# cBjI7Q)\vSo(X!`wiP=ec4+6c#;8A*fgUhst{9?5(98#rI%ɚeYh" E0(.$hWV!8ud'9trS(IM`48;g!BX".U|B&٪I+uXWW*s^fkב U,ٹY*C)4+`bRK$.y%FZi 裵!!ǕXk"[䚥H7iTSCDH;vk!;VѕU7$v_'d9#hhtIWY>C%{[t:HEXg].W>I3bVSksXrceRDD>j|VTsI"pIato6sFRUY2 W{9Y>~qKRLd(m$4\#n@\)G *@ ˠ Y ~\2Ň, }  P2ɐLɁ|Ȏ\ əș ş,ȓʫʙȎLȆʥʱ ɖLȂʷ<ˬȆʵ|¬ȳʓ<~ˠ˴ɀȗȘ͙̤ W|Θ ,ɕ,˔ |ȴΓ|Ň\ < ίl˄|͗f̓<Чͻ,-ʑ\-μ,ж̣Ɏ Ρ 9|г<|L,ә>W͋xwZD- )V'4 ɺIԖX`wf$oi0 o o}[uqx}׷5w׷} vxoMׄr=؆؆׊Mwu،]׀}؁ٌmٓM؟mؠ-٦}ڇ=}Mדר-؂-zٯiٗ-٥wMڛۦ:a}ڙںښ]ۖM۷ڷحע} ܍}x]ݣ݋]ۉڨ|Mޛ=ۅqM]mҭ܇}ٚmҭB6c0c;-m&0 Ġ N@ ȟ@ Đ  Đ @ !"3>P5&7)A@D>>nF~!>KQN@IKGK>NJ^S]~dR7 .p Ipf~ir.i^X>wIqM~N@.lRloFnh{Nnc)e.UN>N맮z~e>AnYC`J!>80d&fIՖ34 ]I5gCb \Ċ@C7|qELu2.qDxo%gAB/L &#'Bx !cuD׏X"&r Eo@`e- z$.è!2bQG $!Ƃ-G2tI'W dhp_ǍQ&pF!+ԩ͌C|gJ Ժbϐ ص}тʸ)Y)ЬHK(܁]5lNćT˱dIVN.81Ӄ_myFà+z8zeVNpdhzLk>Kl3~ⶌ!ޏEtܥ4ρ؋V:.똦-}pGx{[xq12#->*L$Sm$B-3:-;"|#-Ԉ1c4Nʸo'JQA>5f I;\ ;&4˳w'RtH;Fz9z(PkM2C*:ߢҩ&̢DG̣2UOSJD$Ä3Zg7WlCH<)"eHH2{F U)j[ۻD͒tѴVKկbM Rz9{w5pJчZZU浘k2a 1k}mߖͬB\MEKdU=׵ 2}ES}L9ޖHWx46*ST]yGh,kMi,ˢ[+>H%H͈YV Q[\8>_Lj'Oe_6+7MóT+M-0۴gObI C;9|m3 Qɨ{\])΄7V# &:H —Y"bIFb%韏^e^dde$3!&?|1w}wz$_zO{g?vXGݏ;_5=mP{$_xB牐a '}l^@ؼB A5/^X0$ Uxj< WB}S"BE5o !xfI {8A%Pm_ph"֯z{ +B{;l!>7ύE&d!W@-}Mc/IAfc 'J.O(l`59J0۟ 5y ,?ʐlQ}(F3Yab@C&%8bV!BQ0NM4,Er餣MDF07!>.4?Ѓtd@|'@JPӢ gC'j}n,E Њ3eF3ZRUiMY ћ*mGIRKhC S/'Q}P NzU%iHըR(EI%*U[%+I*QU+LmzՏӫ#ݫEӵVNJ}՞y-Oq:XvT,aWV,g'fⳠ%IQ ]ҀI!Š}):@[,qJPVc25u.tN7Нv]RW͕nu]J skΕ.|+^nWůw뫌旽.1{ny |Lay _ W CX+z'XPtA!׼/EaؽBVpJNg<]w^)Xj!J4E wI`lg6e2pKN5:naĕũtiXӼensO˙x̡t#B*ZZЩ:,~D]= )0fb.tc14VTf%6:ȭڅlՋqTnv5MRɨ,9) jQ!_cvP1]E V4Z~k?[-Y>j>τ<)S (2A{;&` EC17.H* [B jqCph)OÛdmRXl'˙L%8_ZW'SN٨^ZH"15Ef`un"ݜ5]OTdECW^i-ƛʤ~/ =;Uݓ ˙eV[%dXlQШ9TeLBsIP8S:HQ,Ys*-<1hC-ݡd6]ґZܒe\=؝}7C'prh ]?Mv$7a;SF̡iz;\$Ğ kaj2v۸r:W{J^A6ᨿs1Љ鎘588qVp4PiQN;S=4Ɂ;>X1A!<2 q WCL }@38Ȓ-AlZh(هahE ;U!;48q/ ; a>Q3𐔔4j BCѵ0pe)ơ:Q> Kfٚ: 1Io#61!+⁕aiQ4 1  Y;c9sÑD8 f[CTa|li 3 H W72h uB3 Q-mj1+Qǿ4Hy` \ :,IHzM8|䋓ԻMqG6Kd:\I4$#xyyCVûƫ;@)7SD;JͤT3]:1F1A&)YKNW 0R4I2 DMɴ>m;K;Y=#orߌ5p@N>tK1)Ο@SD T]lO[IbϯLD  ֣E>@V UIA TL J3E>cR8$쓛k3Dkc|ڄ?j9OgAP2EQFdFFid{x<{BWǴ`QQ'[V ЈE#`H-P1d؂[ E}@>H>(8Pp1+ 1){.R9抎ӄYX/}.=}X/5:)ݮȦ4U:KdIS=CFmD8ධMԴ7ɻ Vy㔻{?h>#6Y3Z|M:~ΧZ1}ORߒ叫u,Yn5 q$烛+ʄ]b1sSm҄ sTᠳۺ1'QYyV|؂PV.Z0}[ aϴ3T%%L*ʽG]cP\< ")c0rXޮyhTӂPlOS!HM\85߂TZj,ؗxʖD,̈́ALX8m ܀ґ- ށIEBZH2|ݼtDU;->59{i)d4<P7pj¾+nr)\]vGQ TM8TCk=z`r^SB".g犀gb}P|; Rݕݣb`]\2t0Έ` ۩ Ԧ+x#>E5XYAY=:ߚ-8q̔xQx);Υ[1^^WRe8R^9m-WyMW:?Ek|Pq&2>@n-=̳9JE›d'͋ G|DQO^6>+ -^BX= IMC_K{@[nOE4A^^ =EtW4 K^RTt_VN;˥\=tؔ4Ew9WG6ќT?o݂_G͟@ LK!I7wFl+OSgY5uUk홂~]W(75Q{Uy!VQM=3 . YY L(%pbfkfQؒVQ>BcA4EnlmPVSyPHPh/.behpIvu ΥWΝb2\ VW O;jԔ9ZAtpKԹ銜~d?3uQ UّySOӏ/pm|Q.ߵ9ne8ȏ=I5:VJ_?v!׹}v ǴIT!d{D}lv惩=8:ەL'UvF/Ł0}׎maPe@* ܲ.f./. (0>] tovKاlh-'pB } J]M (Qk.t. ~8X GbF I&1a2(=,m7nZ  "FڄG}[f.5lߥaX`0[ӻ4mS2TDEbKyb'Sh)_1[9ȏTi=28}.yt3EˡA;qV1<thFP3Weޕ$ ?AxeY8sKRBAM,sF>Yfzw ٱMđ$% DVPL:>*y;ݍc26%ZnL+67 L4!S/ ڪa ͙ ZΎd$#n: &QA $JTuU3$ Ⰺe. 奉b#(UלPg2BMvkL8Vm"<. $6~'q̐w%Tn Ԙ֚%(%#hG2@(ͦ@呛"!9k*]Y2Ǩ!5 %C ypn86RIy9RMJ=-'KIvn 5mdT&'ʘD$#9M^APP:"g)&DLj.򰷧R"kT&:gg^&7sĈNt,ewŜC̹o\A!A͝s;gρbО3lfJcy2UEWzp6t}2VִIMf7{g3,ECװ^ykC{|3shCCzv2gb;כ.tlX:^ a{&& Qŭ c541 >B08Y(DJVKy H΄CRLpތĄDk܄}IIjh(`:BL *rB(`/`E( vT`sĠhhHr* ƇvF> T Q!Q܌܌E : : E_D!aJ@afv᎘*[ `:hBHY Shv Z0j^:jE- G Z``fa"!!2āAGi9ν_& T-kGh SYMtXҕlZŕ5RsNA %O L,P[ B|JqA6=xJ a@[4 >ʒjcOvP\J7QYLLrU̎>Ȍ͔-rz]D׋ E=c>H8.EP,C('yDBBCxJLDEaTSOVLQvYcBPZ@ JYL9 ?9&%c")PUɭ$ZtSL9VLdAЃ@AM$]`i~Y‹t Oq`L`kE"QeIm"؆G<¸Utm#b&ia<` TeRcE|mݤ @ cՉJE}J"U=VrUkVdlxZ% 0X.oUI5h+IWb-UueΕNȎԢͩΡAExI= ѐ ͐(R,hU_(y)NjeɅfJclg-ŨP~om>E/o_gXǨ0U)Hqb< \0)b>4#g'O."XP^DfCDuO]Ege)W:b&URh0ҍX#x8 -0s @\0NȥM:gXTIU0GkEj.C)M }DՐ8 m@h*p!WǐF5dxDj`x *DƠvR:=Os2HqX6VEEg KD͕"4k$^U1bQʐg* TQl,u&y}BЃ/~/O/i)o 0 o c p ۰pp  o G0o0fIUUĴf1l,`֜u@/VGYH*°l Fљlbj TDnD '4FWmE% ]NKT|lD~̞P##9UYHuqMמ,,*HJ2+Xg{irbvqS ()rrJ4RFFSRjd~0'O. |{^KɦHL+`}ЗMh˫Q8$$ԁz*>hۗFC} NoƐXB4rY4eBUdh0dL!EZi2!>LɞCP3D9,ӅF49qШ&>SƐ6C&-.qjς`;zܡyD+nĐU뺴l0Uɑ mJ ^-#&-7-O#S-"PI:|0nމoO,t=9rDKr4G4h(]Ĉ2D4v}%Y&11,#e1^}#FˆA! 5& p TH+Y&ݍn NxҤ8Q;, a@h & IϾFA#!YƓm!|H4QH( V9HYEVnܹlrR' GRSXpDG,Px(%'EPIV Ihg[&-j$Ғ:ZhFsqOt7;# O J݊pl~o*J]TV Z{ BҰ~+c 1BN'[Y"(aD(atp!/E[`; F` t.ƹhp5rʼn;4#9d-U*l#5_VE%s \zE*$m[HӺI%\ tpU;"*T` JEi*^ڧ J2TS%۽gyMxbY4JQ&iiQ S(\ViG!|qX.AI=qԊe8bd !D"0bԦg$gXl~OhjF.j^BH0*kfgbk8nIfeAV>E!BQlf`C[걈MJĜpR$I2 32s%0C҂.SO㪲^IgKxT`ϾQvE8Ih˛8c3hʱ)T'Ox'o0NҦ.# TvǸ 0r)1N18^Y*uC4P]i ᾄrԌWn˖t `gܧ!cC6a֦ :^e^E `_')3HO2ծzxBtLF@.<L!qKp 3+riP#R,M"c@)dBL`BPΑ~*)4W2A F2c $M (KS@p>tK#.TZJ){i4@jK$BYj+PUCҜ':"qWD j'$tNt ZHh%DzHnL)i2ʇ1.4TiFGܱRi'x <[ش9NθQl!6rU3"?BQ[^uEqr>挴;ʢEUgօ `` * eA=c:VY3Z #9+kQ$spI9ӧ<MW<^4[$s'@ ˔ֆS6yG ¹<N?%M9K3"C{.+"Jg}Ȕ3Q[&ͤϊ$1,.nuUg"?'=TsV)IKQ6f/픥Stg-AuN; v(ԃ0,[Qt:+1*q7ط/d];G\LK*Q0]64U}+w6Z e~/t(xF+(~`B,$P_ 6]aʓXlnqGp%g'ofCnAs8; ZAi8_zBpFCipLZ0ZCFmln&hnT( z/ Z#pSFo&f(pơ%n;5Zkb:U4(4ī纊չZ&:^C::ʺg°:Qڧ{Bi s:{mڱ|Z,dh8^OBĠ:K >a<9T!Mv49W]`\2[Rۻ;{ۻۻ[] ̻;۾[{{+{] |; [; {)M<{8\[<73[Ź۽wk<;?O?c/ (2VA-]-2ޚ ^~0h#ގÞ>#Gd-~#~>1^2$r0~?~2!) G~ɾt.?^>+_yi?[?_魩n+_3,\?cYte_>Ӿ![?^x,"ޥAh~^(/C:J ۧih!ܷLhA'>ӷ,ƃd>e&Q!=XȗSR%Ȓ9\ &dSÐGi9ihW#ШϏL '’ rŜBA>ZnKnyyǾtKST ux[K?\XrCVI֠FV1¢/34[`Etq]>YvoKa[.3ǢCN$zv]!-s[ uvǮ[5>ͳuv_\wDљB1!b2mфjĐIb +2ԃC`-h!L $8hX2a.!(%8ᆚx'*c"#1 #,bF$>$(!(N8$A8#2jɄQ~a#lz/xc%3f٢U^`8B2z.ᇆ.%L$BG,>ꑤ^"TC2a{RM:##$6JV %ʔidNINh##y*rj&(֘)^jjfƚij{>.6k. tL+F8L2# BɔX[=EYOKU4#YU m|rUIq sZν2K˅[]@I@c(4Fݼ_L/ mE$'C-4t$5Hi\;6QQL9[vftwY+K4e6 uW\us'$T@‰߆O>{&]Ι@]Tncgyϭ[GŎ:N!W6Tsճ~F]EN<-cNlsI}{?sd\i5ea۽.<b&,Cpc?e\A440+eeLjXƬA82YIP'1!3L4 ?qOUh#.4{"X.4B!\bBv-aC j24!`tHސfVY`PHxE&^I$#erƴ%|/ 9-($JEC!sCÁr$[# q?#rЇɘUH*l! @bND#=C7^E b4HBJr"Nπ8çebh2r8a 8xP6ѢU$'ĬbZgn09aNfG+)SP(DPo9dvq^ۙY^B4޼M&m"i27< `B9 t\d*~qLgAK wژ~ϧ$CRBfPD%EHN|18&Eh)m(c}ib}`fr-@Q)git#N9A1E[(Crʹō)v3CRsO[jj!Tڲ=Tbc#C(;v cZ<\TOwa^6√]9K'ie 7G$basFT28qa_9^tG߿sfH((U*:y)zVfs Ygę,wWbHB`qf5 z1fi2u>7-5 ݂RrRNe҄s&K{k݁Vs%Q#1=aGf4?m\mq9Fa>[} rV}8ēPIrKdp."vjI8ȵe._IRr۹SIJt쳔E*Ģg5d-z<3ȹEgl<>u"%w|L[trA. )T%hgZߤI+ ];f58!ߑzӛ8_A]6Ľ㿟M6"6O D0׺n.lч(3:7p֡D?pHSL|fTwDKQ|Z8Z[F6qZ%fKThf6VKC7#w&mh6[5:H\[maUt mEw\;5ye\q8&tQ1\Jo%KZs[UkD:d@KgEz^gKBc>(7u]nYvpYjQJ@DrW{g2Dg w$qd&MnS> k"Fb& pdFI+ZsV=:Fw4OGttZ5kLAd`U-FqxJS$gG&48YhVc gLW{OICTT]$v!jL"Ve4Vop`SGU{bV6ddl$yk\Q^GF].cW P$xFL4&UK@JEISUtY,;>u)%^ybP!j klYW#GSvLn7GM{K6ehq9̴]Hg>TQqqhmVfr&JceRQQ5ċg\?8#a5g`wYMbg5GLd6%W[2Wtwuc'x'h܃CFPXmFfC;|Ph4e8($FefxEA&\HhQRHဌsğp)rmGyr]d~no3vUg xu ut?M@g~fYK@]dFt]UC9cCuwh^vӄ dxu 7?هUN7U71x SFVhN8ivo!hiA=۵q2@Xڔw,wTP7T$YTd6]'WGYNVMTYOR F{ȹ pVÕSUfCG{lg3>?CWv!x| [1'12 N*UDYp^Fю_W3գp0p11IG \p AvFF WBlˀ tDl~NzJ㟬QJEIשIVKaRxNvqH'Vp ď9wSw4gPuląv>@f9ZOT^Y]2ԐGKl"$m߅U72nyszp{Cxrԗ45?^VH> ca&$  (F3\ [YRx<,ɪu^Fw)8 95 p x]`   90,K1S%aP:~_rki=<)Ypj}|U@T }wʕl3P5'Q6mz:Rhh${YZu>b4SA(:i8>%inDyxtNA5Jc4U_MfB9dKјIo 'mej b !'F0D*1c j ZjW* cZ ZJ1@09[Jk0[ 8\:_*pK^*@W ;uj0*`P{iJ[3` AX Û ׫sړ!J9zH[&Nw~<|GP1w#ElS~'k'|q_QsP-z|iH&\@SzhCa*UKwS'Jm77C̙| &a*:Nh=eH K 2 !dZŲ`ȋ5l[ + 9PD9 \,  Vʰ˲k 325lXQ ̳ ?rZHU1`˔Ԍ ˲  |G̺U1.k'{ڕJlVT'xNTo84]-igqƶԝϹ7dmdq['׹nmdd7JهH@i\ȅGMX#Ŋ6(M@öȒl&ՎU J^a+0V!'6о @W ۲iX ;c} hJN3 P  "+#3\>j޼=ɮ|@ p 12Umѥ0C?A\ Ed77ZL4NQS:d73 y;5td1WNspc\5Q:t,Cj79;Sk'3Gacc@j1qX.;Qc3ȣ:i7I[A胾N4w6"~ä0bLk?Tn9ʁZ qL~[ < j\iMlMk_*v- }]; ثDAA`:]m2 430 b[ׂjϳRKWG:a=jOR]@$'f8)φr=FCsAicbl^dq](~1wK!!rF%QBh}@0|detBKWH9ev~H @ˀ+ ?kY!T!tm)/ `PM@| <˲ ε<Л S.iؾ L͞sT{ +\,!,Gecc<.-Phm U  A3hٗ'+<[f@hZ֛Ge)۷^ɡ>#>hBohT*+PUa)zV k٠H~VnɰGcZjܮQقͻmV+Ċ\ҥa!Z:'>mz4!_9۪5W5ޮKA =mէJ-:TsRMhP{&-:kl帺G/V omk.72GO(hWLrÇLЈaMdhm.0:FB0BPg 3RÜBNѧzQ$zrv0xQfD).h.eC4VԪb "hXEf-"|rPzQJ}XQ3?s$n:+-m>|4Ɋʱ3˩.M([;SP4.Mh{ѵd 0]= - C˰k-k* g_Wëռí0Uub¢pTҸ#wyqswn7+u RH,૗]f1(kQp d4ĘDY}@w4! Ւnw(nF'ҪV{8YGJ_}r;z0-ﰢԯRVa$ mt*>LS.)S#\mԬyR.S #n\z{fk>'X]۬jTK,|'DSRjLϯ@T G-5wɇ#wSK;k"5 '{N/2،=/bE*m!f[Ͽ4Є@]eLAtU*D!؂|Z1,xS^n&m->s|(OpvFӗ";kUc[ v4(fjlU(gMqx8b2'vަ#+!'yP/ J J_JVܤgqRUnǓ?b0XfB f]F1N38$MטT-Q"I٬4yiޒu1zNj@K% 9mCܺQ7,cQo{B i ++Buul(pUFux!ziٙQ|֧5EfGEvz*/^r{-Fb(Yt9 y ltYg|l!]`}C9! ch$ P(AqJ/jiz\(TC1^wvzbescacP^{ M+dkKdp=٦J~}BX͐9C _Eq ʚlƇ$WsDy!!ܙMߩ U== 3IAJ{R[gzL*@q$-rU;sS/cRZˀ3Kļh·~*#0_/R;܉J0;ቐz镔JJ.M !۰?[[.q+z(5}:,H+#7rr2zJQ8=/3T/گq/8mFɶ𱕨'x)Y -+҉R&4   7`0MY1L`I`LЄGII|DGLMDLDODPlDKNa ENDNUtK|XQ|EQ,Y\I]EQD_`TEb\EaDNEddFZtEclFeFW\F\DEYe@ڪ YU+18韎s}Ȅxyz{|}~lǀȁ$Ȃ4ȃDȄTȅdȆtȇȈȃ|Gȏ\*1AB P hD$zxG1L ꖝIIɛI٩IɠI$ɡ<-4h04ȟMhaNq9e?RucT?4*C*PʶHOP&7C2՛T`㻩4 20;u){Yեه408`KKRec:e%DuVq:@7Z;#$+jVf}lݔk 2TVjVrr=UcUtm Wl5 DyǪzzeX? K4pD!tA:Wo+;ȒrLEW@J@Tf* -#$ n4i=A$z_M y2iUT Y= ݿ}<8HD$8e2/p2B? R%C42u-Vvuٕ*" xǥ8]э4Su5HX10Ǘԉ5']1ZMU[XbYNI:hXMZ͈c W%&S.Y%Q#EUVYBJ'ce7'F]Ȳգo3E#8U]u H܋s[}]P^@XЂxGaCWr Xh?kڠ]؆}[gޝXS]XEd6* 0׈%\ Nٻ$1iUx ` Ta`+#b9$79De]%v`Ze`߈(u 8Y ]8Y-.qګC^3U`(9Є\B[ʈ ;L1 tZ}!6.ZG6Zw]MZ#(Kv^ چb"W(2(sPP xxLX,c%*<05ޛ&^)׵TJ&ff~b6YbC"ɝS#Ƞ&d֧VfϢy," ^nTӅqs܇rYh\CfXey6coN5n[je)۱4lEYJ߭C$ecp6P\VcB߁$zea@jUQڢl)TzՊ.[ՍUda&&mFhr*pU`'..8%snZ5Q.H2>Zj)ӔTG?.֨έp%bplk) ǥؑ=Z&\0m#7 JXZ:~^_>kvߨ./(*reh@QF kckW&@Ά^ʾmCt'xGɉUR5ADy^hhhN]bsXlf^oenߣuɺ$V !u6I[˾jk^OG`]Z-HMP9"pbem#v+7+V v;nBcl7mE-&qJ|9a ֊I]: 10:ұ& bjنr%Ni*'su[N ˥[.pU'4(ſA59|O.n#~"Anvl`jqq޻æ6btu79_io鰵z7v[&[(ve_tۀoD0cb Ht[^ BGo~s>~^ޑme])vn#!4y 9iםZf  ơ5 `-roZqiv{CEI}( h-bbp>xJ΍EJrj^~ msҫױ8Õm."V]M':(]9Aֱie-z}{yo̹okcFp/rBZOzevpSȹX= rSIoԯ5x(eFO.EaÇmm_o!A3xGe)WһXAG2D1Ӿ:SQ>PB-K#S482 T1ʀ6%8atՈ3r)٘fIFWҭZ\A^]GlK^kĂ ݰ6QڇS&ͳ= \*ގtv3޷hc1svd2.$͓1ٖ2Czwqq$|2wsb8cӒSS=q\Fvf7Ȑ ckeɕփq6ZUrc,Bs a! Yv"_v&YZm&b XAॏ 2d>sw =bn`t%aiI[Er!B$<"p, v4U" bE.yOw%Mv"ftJ~5F4C 5F pH>>8vh=˨tY^*YUH"[pZk-Ʀf:%b66cؕUjIRL8tD(bjŘLW*a[zk(zxPLL409Dd0:3#o>\d5B+ bD=R 2`i0d$B)l KTm^}N8kM^ AgѾ*q, e弘Vfy!xaO\ oyJ#Y,&ӛ0q#̐P)A s2A&Dnd9mM-^fyY>;d>b QjK52, PEC gLi tVl¦>]_1:.bjCNa}ueNmifY}}^"lk%aݪ>@X uasPoAFc- E6 4*V aG 0,ىe /9E齌|`!BMO4OUEY#f`P8B0'@C>`2s*9<9fW꒛d@jHUG^a5q zpMqB ժ*@LZM IL (?]Li"T}r1qLbIPriM !D5mfqۂ'Zb$$D K%Kї@)P|F&& h%DeyK09o>kWG<(r%8N9\04L= aj-1$B |caFJcey_H!C%f5r)yXA>YFn淏]SZ* (oh,5M24Vy(K+JO%yVXx+QP"bsh& 5̣ =襬#`gY2Zъ4w5C &Da% ATP}04(ZȕאhU=J$IBz{hNmJWxܦRnvs zHN,*K#=ܮZm@!G(w}Q,ԯ 8ە 3 D}$8NU WVx2jgl!q)ߚ4,*Z:zQ]qׅ쐛@a~b:E"mM7uE 7JU2hB&N dP tdDQkP)\fa5i_UPRAal-έ.RҘJ35pˮ$ h`\k׆SNF[J axHx>Y_DK0,CMEAOTzQcDm=UH uIE"W XԚi8Saآ X򄄵p"̊4EGQpiЎ`hq$Q H\HxĨH$ !iffGx2lQ hLN샡IjAٌ}ωimX}$튉f5aF/.C楑߰PcWP7фI fy$tubhou]zjBpӹ1'û]IG\ŜHC*ҫF2н.=Nșzf)y]\MJq!jFPJ[HPV}L p]_0ЩVu)0ħ܅ԡb= !;9JQ$aiR$荊N M5i0K}e`K2 Z8#M3}SrU4k0.c hw:cLAV$MV,PS\Q 4'2Z蹝"ZXe-D &HKXXvE8VUje&vyDnTBk!? \|#>r2RQ. &9,vDh^`̈́|MiՃ1ΦabဥTY}x,!cӵ8)#Oyjʖm֧] ݊)K ͧ[ldOz` #5ZƛdNdqtO)b.UKehm1dÀb)蹭wv>[dS]"JQEޭTPzH7iUyg6D.kbmz .TUጪ%*̀Ub,A"~F^䝕JPdi$ d|*5s&iԸ(6K S@E!{>2HQ^>%TXO.Fj xb,aRt@i-2-f6zԞi+ʌ#wojdHX(ъw&(fi "E)JBͭH/ҢqI!=mjRSG3Z-ْf۪U%͕qޑFje9LiԲŃ ,EmcmEPdԃ& &Nਿқ竸.Ɩ&ꕛkH'Œ-6ħBEi<L$ݜ~*åzu\Jm`gP)axњ*h(BPj %afNUhe 1gC(h8兹 /QMk:)6sH`ՄܺDՎX[Q Ɗj8ܭ.$Pn6V4$2cFrgIk\Ƥ菎O̬ouRqZ4qqr[\>Jق(UmI*ADRHabvmqQO k@ 'MrLK\ocK  i Q/i+'Jy=.dod(%NQRd#x@.N胡\.y-+uf(k6襚,^yFJ&: sfOϡb쐶Gm,框*+ҊiKXXe(/zR(*g uHGNPbi9ChJ$qNj-CLF[s]4n]%- $hu*fؖN&"W.`k hp&ZcB1LEDg)fҠ(.%b.W{$#*R17j*!>Ȭi"`BkdEKO#"aǧq)m<4v(6ʴRK_. xXQ#58%=##%fad!K*1;V̨$R >Že EnV*Hr NWF*rDhCq+]!N.Ad¤lnv'Q9]\sV$vZO U*lq#8*eP Pw3z,rd,i}#oCWS1fsRd3z2 P82DoCyc &4;{ml4(J'q4}VG DX#M)Y?eIjHlYjVuQ`+ZP,56#0 7ηj2dwEu4)}2QAnp4)E I}OZ͎֒F1I d#f^츭ԡ'= !6-ӭb{+bA;;;;zoib8hHc[>rUu`_ډVTcsF ^TxP 'voC -#pĔRVYʅ]6lpߤ}LN|iңz]o@}' -eQGlI֕GEUJe\\PS:?j6.N/K6, u`Ĩ$ 4wKM&W]]ZJscQz5YB62-YI$T9"mJD,"DyED}lMg#|eXfT<:m V:,Q9*_-=ЬQ #>n;&NԄ>1BQ&eԈ!!4bGe\?^JJJ:K@˷2(E"+=$<¬+l4;<:% {o'ǐ^$>`3j$-2H3ZZck>k'TJFVۉÑ` 1V3fh?k8GN98eK*DCt)jR.5HEDÅ*#q!Ђ-к&\jRŶk/:Ҽ3"F$0WhSZi=4sP!;r\oC!McI'PCm&, dU?N5F2^wk+4C|+#4jt)[1e$B$ 'Әe]Ycnykymeס{螁F矙:j;$uF蟏Vkuzj^;SنZ춓~mxKBJ3Ճi㈽vˊ^=뉰}y*1v4 ! tpP|z,+2g+b6MO󼳻$Mdm*I>AG7qTQaLD-7<J|XuB! bCë~ kVU0aOT3shV%hvȓ ~]/HcF*ru)欇O4H@!55OXΈN!e,[K`d"4)(@g)D+_)T*o-C('uBCA'Y^E_FJ ԉ"P 5h n KZ2p1 h%B"74&iOs 쨇D <;&(abkWSByLr*B <&xdeLRclĬN"8<[$PL‘[HQ8GM1(@Je8 誨xE}Ec6!Q HȤWy?Q%DJt@ŭ iUM(rAOCeTwR:&贫u񰳥B.c K$)dtGaLZQ EFoܐ S<ğ y&ޤmO S &('/llsQ@UC5 qBϦ-*y'F;!yT4LyϤEp`.][Z Oڳ`7OcDUNCBX8*2) t[R1aUUZvaH3ާ|K31*Hxs ^K/֦TOcKg4̄ss (W58M2&RZT]1QRVP)n7;,,wUp& pHZ7 'BQȑU#`>uı3pp-ڼH"1Ys?5(t3; fy(ysN18L"Ш[}E2iL2K !i$)'JMOhu0.*$1CʩZYΠY"(1kMی^6tYjj۔7Jl*#BI[!T2>'4U@qQ|aBY~`W(幬OcBTZd&{$*>PB8{N7©>tcG^G().TLB)v7ЛcW&DϭՉT5ן섵BFC êk4>N/DOXx6/3IR̪n{9j1ّEh!rnt<{w3<ː0 Q~KUFc 8G5^*UWFJʠdÀʏrLr$}l®ꪦ tlf" 007%zK.w;)ѴoʤNC%2LLKTFC3:q4$+:Nr:DG^{2&I ,^]cc{dlDbfg a`ɶf=6dhjD0CadcdWo:V(,j\Bpq"WLDv#VfJFJu0랴DFP.VUF. Mm6l$ L*Ewdx*f׾ȈD*.r,H(Bv7S6me Kqb)وV i0Tv{6LH'4r@V@sp!ߺ*1mdz-yŘ2V)OE+f{Cj2.y0H;"6"(Rτ;'"!Gq B"!bʓ(g*8j)r F"a$HՀ @4kD%4RHҔH, 7K)ók{j㾴N# hdNTq!aOʻJ[vld`eI\,  t Aaĉ#oL(ITj 8&NO>bJb8uhQF4+zHBDb1XeVVz36 "[a3t5A6*R(`!37"Ϣ֕` J7i*GczA#R8r# C%,M!6%HO HB QSl(J(7cIyT5U*#S`f X -*,g4'i qDsL00i/_(Kѣ+`=J$pQZHE O-0XM!b2 ,D n426CFO $g§GR%a$7R!wrF4bVqP1L:se{jОP0w(vt8d)ws7!M*3,\CD:3EBu4,("[~.sHN*%VGΟ*lFmO%jzA+*"'Өo -> ibObRDDĒ^!DS5 vDsS"^FqMI!v wJХlyH"{3@\\B\] {,td`znDMܗ<#`:ch+(D-m%N^"[:AXB(p7r,v[5p!s10[ObN*$!-,UuP9Us{4{*s{WvhfdK&CR:3P*M^:JJ~՜Al"&?Q 0Td@קZ2ӒNdH4A*쀤hlhKgqXv04Ax),6Q"QY! !7*_p#ad`C`"G%w4}ٗy,\4* !'ٙB("oW< t瘱WsJv=oHK90dٜ,2}T1\Ap`BPi[*Ш:nC6"h߲5Tdu0UdH;*8 X# +e4+H2`q@ZR):<_ی~[">,E]wgqWbyۘ\eG<ՠ髸W…ƐPQ,w|%aC4; "lu-`f(W GMG/H|G|ꡉdOu aBo~<]9Rk' >􏫷/XSZ1Ȅ?s@G@NJސ% _R(h,27qMD Y],cxpVWjEZ2CQC"<QUcš'ܹa6O۽6엿(ݥe5!#)؅ Me(-'V zAZ]d]4 gKeMzF/Z} 3HQ}-VHDh4hrʐ %ǃ8U$/SPBTifK 3$(1ËHO\鳪}!n8fҮkK F1-:U%\Wƌ(֣ei-[p~wVi.:~ 9ɔ+[d 6 :'=-3լWבavTZqWJl2˚]IU8CNB5{}UW#S4b2OS(eMRSn^%PY&L:*ĹNoYF@IfVKDM-RU/&@J$Ul1uSS,`rAhByCJALsERuŕR6x¡2i_J&2utYMIe9$NVe^&_ qei6oowD_nx]L6s4m4P)'ob u?c$J(Ę7 baԣH=JHh KhE.fj:aMĖH'XC Qٵl Qxީ!OPbܴD҃!L}ꄫNR OK16PM*’ifTR̰hTf OgDha%tz!Dj/ֺ%gvvPTw]vu lB2EBaFYJ*F{RoVЎ;ܞ?[-Q e(.F.z %{d!zp| e ^ ۿ*V71G62u9 x4Q d硟Fh:kp56IZɷٕ7 8Q 2h Fh28LF5~*TmR@yܠֽFʟfLR_zXmݼWN"'Eɍxeh)qkLE+vT tJWAR sk$tu)\G6Æ]IIYXA܎C=_!tY]^qD"F;بlbIAh<':Ou`1t фus#"QQ y? bGO(Ln훐h M%UşޔlSv¶<]"#,^ #$d 8ǾɦB!yb4Qy Masİ*-G(Ì\*U `zQWIr1o"BqUp"YgюА 2#"XC(lV*Y[H#)Y Vb7n͸WHǶH TsgS*mɖT#\hԀvUEoA w8|rI*r+r{Rv_&r 1"b;@RE'YZ*wz+Uz"/;FAij1w~#"?R840 u`9XO霕;1>HE:%dIGT%\4{H 1G($3(s3ԑKqs) v5V1`qVgD1$AD >a M#kB2U\4Qq7yIhe7\E5L)egGQa]jq\Sqg ؑlgҢJz0d'ƉaeL-utTi}2.DazH8/;gZS4=IfJe!RB1*,J{Q?'cw#TTZIh3dʖ(<3?ee:U| &XJ5v4HGX+uv_y/]2 渢}6JkTdq[A;zSġ%!tgc us~fu:gtYP{$Iˈ  8+%~r> Add2^: k~1%X.e+ ?#4iF6'Yi;b򕋁Z>óڋ ]士 ISuY*ճLCiFoԩY6a2KDN5Iuѐhj([)3hYJtt6ԷV}/R+Y51iHkcYV|pX-`XX5I<;t8Ar"1 "b1?e)\j2s#q#Azl~ .9u2*r1;7ȡ=ӎ(RK%8wď#&Aspfȸ\YS 7G1ԇOZwSVYukkooĢDz-aUDg-X%_s[Ez%SH+27+ɖ02\t;l7K}K:X{1ݓ[UkXK)eF?T;:*|6{>x,7j9TE˥u'Ruw F/0qs ,zT$1$:02 P$ Aq$pk5[90J.ÈƲ(k=# 1`؆}M݂\2\:&`2p p6utd4^x};Q1ɡ-iKdMCp q?rIS`,ĮÓWVB}/4\zJRE<O|"BW~1YQsiQF0€p9 p(ՙ"L]) ? }ۧ3_4D`@؋}+.Cq:,q$[0z@},ArY }_^:c-rbjp[ueOAlF>DMu0P7ԙԬr,iD!5!W/P c  UϠ8p2 2p&KaՃ0, `p mMDn*$+͋+]}Ly24_A:T 2 >g-ΟE<*zaUR~4,!| ?3\+7|ᘽZ\EdkT4MC% {T>?2k}ht9ɵV 5+#x  jX9%ا?!0\YyE UWR`1p-C?]¯┏Q.1c+ndT*^! \V=tT2$HR+) l(us Fc1"iDXFtߴ%>g#CFfMWu%% ?:[8 LmϙmX[MPX 0*~ZS ous@7b,=k4~_N M WZ}E۷!Ce#haDz 3.1‡|Ƃ iBP/ɬc_e8FLiTD[iYL ːLFṕ/JxpCSQւ3-q%Ȍ*dtdեVzU2-Ռt-Яũ$su)]S+e{HRr:8]qi/#汈K̓6y\b1hCIG8EAcI-9,Z>JSac1b0,׫7>C%p@&IhO"vr`@#p} DgA;BCp>3ˌa )P ob hH }ƖQ1 *eBQ#LrÇIЈaM %1H$b䡭. ,Ch$*I.ri!4-Xrͬ8 ͳ:s0=9CR#7zP}\*GZ=RN!cPq|`s86U8eBJczB!fA!R'^ _ Kl.%RF4( 8t]QHtUaETw͈P6v׽ 2 9^G>W  f1bM< bwH`z nib1$,x!ˢr $tFZ+%EFfRg`Ԩ.6sĭ7ʨqهMz= Բb AhdսqjaOb0>/z[C/}j#~u_أ$rƊ}2h^DY&T.4H}L R&/˄ K!9܇w!FeTb@rf%5փz_ǀ0 )$<e/"A}N=^LB?17OYl-L >bаNGíȑjJdL8N"v, bɓE1>iK3=E[0)5a,dIwme'>%K\r)h.zK c԰xk*4+*Z&CG䛈K\w_wXxT6qdsܶc]iSrV` ג^IhaMeGPFJæд[lAel/*;$"2wYIN +pj?ZDyoNi*2b'QjYU]B/I%c&l#t zj_B#~dQWygvW|=K`gl팞{е r}ZNܶ?zy/I lʣqFwm h)9k|";GeߋD t1@U`DQO%ht]ILg:eH%o1a$Jf&)"E" pc_ M5S,D69*w4*Dr) ]1tj'#m)A#\Op8!6x"09n)9AilcGA4v.EK!M3}B0".֠ݹY SL9T̋& ޗCWtܢYKjXg%,o7 S4rƳn 2& h]vD!0_C3mbx/ˡQRi[YXN]SJC 3ra0 ˓p!H̘QExCJu·BK775jIhW:@":hAalr:~ xSvh+7=$' LfQjHK#:k6 1%b$ A$'$I{ӊ1B &>x.cm3xĵQI Z&jė W#& y{A3/M bx"E+”ӭ*«1;$ޡٻCB7*'mˤF>khA.iQt[ 7hYz*M}{H.D  yJNb`%. SyjQ Az9;rKĔ`s5.7 ˼ÉeP{?)&FrC8:ꔽ[yj52t˲4X4zID1m{'LˡmP; O؏_ :ᩚrfUcmVȶ ֙ ekVVnVkn WlWrWx}WyWzW{=)ڗ{zW Xx̋IJŅd T-PJeuS7`7[KeG+8GXKSs 2|LR-!PV!202Lqa!QšYb  JiIiz82 YKe`ٌhچ1o U˄MLz` ^,p9] 5X۷5۾ۅ[ma/9o58" ײ,ȵ\\5}ܗJ} ^aZu֍#X]^Iم]ۥueݝ=WI8 CP9 LPU*[>*')AAP?j2D׃B rɷqboS?P6u@Hm1PR8R1L񙹊PIB89= UHP38'Qb902گ͘'a @΋>E$ɮ~ " ne4XaeDa~Bb|&$vLE =-JS4-Qf TTR@8.̈!!|Z@Z SFZOJ9ރ=LLSu5;)oQ尷_FKi٫;!S*@'TN(}%me,NZIe]e^MU-`aք\ f ҜMbafePjffh> dPgn^ifk\ʥ (ĥk?ifguƥv&j6g&Aufvf}Mw۴gex.ePgf6MlggufhbphfpNV6hbkR52}ZwB>3cV"3,6 4"$YNu,޳`+[V@ ` ֕ĸQa@'LMEcLZ8U(̓:ܼM:}Tl _"'5i6$?uCiI.J9,FZћTzi.-jiydY3cun_tr dr)lK^Jo-ʭFR bh L4eH0iwp C!hw. lBr4ޤ [ +7 ֮tWNv\Mk/cr#Br@.8ڶ>SZqzo6c= WṆ:tEa6f So׶98W%Ժz]@Dcm<dZ+ճp3+? @z-ى87;jsTj\KSy EUֳ|ߒXy!Xh DHp2} kÈ]ܧlAh3X5DyJ8~D1}(zDq†$ (qI|ҌpC7m u!hsԧs`D]$jӎ,=f2+w.ݺv jԫ5 ,x0a7NP_ŽC{eB^7F\/h.nZC'=x`eznjǾP|9)1ا)T(bPrƋ;dtb='X%Fuo)*k̉mIbQҤA" F"&PNTYn.zY,yH,'Tei8Ǒ,WمB8M Ǘ@Dt>LUNRҋPՌGk OB^U+TdWI]J'ڊ6i`h(IYOyVK(薋h;tB tˀ[1d28d"I>8Y1eqvf ii@/`Tu%UCj|leW(u5{YMr GQY#rn!.U-BSS9ѓv?MX~ SD+nbM:JZQ 9LBV>r[ؽ!wާQȔFsrn^~u8dE(E$h(1o?Co,s*E/N{ThNLFywWCNnz꙱5tQX"Iu -}&V2ngTKh+mbYإB@Qn629\V~9]ʘ^ANJ9oj١U#c-=SWWlDͣuoʄF oC&b sˈA*IieJ*OH [ٛJdMJZIM)lvVg0cF  Fb)!PZ}l}{2S P $Ut":zK4Qguo.+U J5 2M 0F2/!>5XƪNT4r*liY(՟R bdYF`21!i@o@EE)HFL<|0X>GSq1T[c GBJvT]HKN3Y`֤n<`yȀ QRXrpZcJÅJM&cQn #"h̩TӤ&C̷XI#B3iKⳠ$"WUGLEJ@줜O"y|(4`Ḧ(Fu 7F0VS{wLY%f@T8zblUr i%!Y[!XM$AP 1A2dp!C9a'ʵ*mS" Q0OIJJIlb QF4Aט 4K䖈 GҘci$ 0&2=R4* #ʠĪFTpd$RSjEO020FQ04a؄)'n@-2S&$@̑R5يjo`?٢;RY0{x 2ۅ,#[ *;Wr0o5IM#ڔxoUn8#^3ԀLwyO3yy+D `gjP 3.\7}J:4ֱhq9 <نR({9_e G  -#26q=r-*Rm3%èa݅o!C!o8hl\z%I넛4 SRaT/F#[n8 ˽Fue(na;E]?y5S"GNs(!B!x4*8;lǠU '`Ybsa DYll"-ĖĒ}KӬ^ Ȗ1DИI\N]ܥ闗˚ajBd8ީ2l?R\4zbVΎ5BIjH+U-@u 18SM9}("54+D* hR=ÔJ57Ў>SPꪛO)RTmM"5\~vI?>MЙ3D|"JRy=t Or"}b+ ]yLiiI)oH%-v*up/S :yutQ.݋;{@dE"͹(h@7713117Ib.A:C2QV:\=,Ccׅ>K1\D\8[E$y2Kl@Z֜ H\G&%_DUԃɐ nŒA d!I@j_ å| XN  knjJ>R)"2D3BÀA)aR !S[|E4ҘM[臖ED ~^Q( T A\tD=<`&k Fd"]‹b4/@\{Iƶ9R`~G!O4,A푴ybkMI (M &iEy"(M̚8 e ]pJI ME9YsCaUbRB=U@"'X> NKHbHQI}R"CO(dxH%V F bbAod* A[XLF`D HxgVbhZUYdz<}Q5AM$sʭ9DF "UӛzLybWYXBbaW JXhVM̠ _kL}]cN(]GKQMMRj:XcnʾV(\ưD8f]Enϕ՝Vx:ϣqkJ#FjPs >h@Ÿ oD͊ZNޭHWt.^)rv)X^p%.޼E?ZL\@<ڼU_hp_cj0VѐP8$9g\&g\B{MlS|T$hFHz ZgpyVsD(&B)Trl2sT nP)BMvч8T^p[\ O=IEȎ~4e! giSޝ&v\M Fˉc,CMƫhF+~V.fra ڌG-"1J p[&ȠT ECF4jʓiaY MJ]bn yȥ&"hP ltS a9hvy_jeRet&%r(tZJ%)ej`Fj\MtȒlSh)MԄGM؜[ lH MD Eoq$T%o٢OC))EK"irT = ^Vgq%KRq9HFѓR`:$ʅ e ">(G'bnHMLVT&ON&ضPDª7=V`NX'ή>Y!e2V,i7m^{'А$Z"ƍKbkyjym4 O6_Mx!Lּ{~ɲ;ɎU$Z+V\q 6DcLP$DOUJH,"^m(%i0ݙRe区 h':@(AhB ʗ(܍Qc5L2`gI-2{6""aj%m߱ƕyh܍\b3_=Nyp,Ih;AR4'dfRpڅjnRXWbN@"umܤyyGn4p.O(̌x[c>v ,9Ru"1ݭyT>ʇ- lt.T.㣰,@3 AV|vx $],gIRjBXhIFyc^a-D2@~N}44θա>34@ 0J1 ʼqe^"+߽%" "i͹-AmV%̔X+0g-pG_}ۦ% U mA|Hnu暕g=ƘV(`4%1džܵ.sO\c,"YQ miҪ `C-Jf~*7]hf- AILbx_0MO6JaLhۇJ Հ}#ZQc:6ue u̐ 61C)Pr(doo3_-jDg<[ΧTȱk`eֽőeP! rڲ\OwOWBhh_Md&]e+:,%_(y߀6AN*85kT0ɰJ >tAXRcD쇶5qi8qZ2$˸x9x 91:9y?$l.()]w 7skyw9y7njv]Uoӕn9(9v̌]yɟys|ƔWn9oUs1gjDYK4"JGȴ"QGH\NP_&~>s)i t0*ф'Þ%5ƬiףZzef!2iY5FIH*PF@Ìvwv)\9t>eӴoY}ыVZhE"Á!l8"Ç}8P"E^̨o$ȇ!&ǒ r,J1F[Mƣ;9rʕi*ScA!-RcЇ<7 uHĨL:,Qq,mɳJ,(̠%KJH% nqe`2-)x%cH^԰h;;qIgQܲ1۱ goƒnJ˴r/u' /TQ"%󽲬$3 TRV r ʖΒj&cRkRQI:wZ9$QzR-IzeӎX-=FHu.)Σ0f*WS%@#TRBu?Y64.ɨ_ܨ/Ƀq3|sFtYkF^xRbVN*OIB#zMCM~C4 @P7ϣe"RHh[4}qHlQ:+lȅcFQI˒\J=wL̀M?XRetHF[ SꑪC?iۓWI .(Jh$R3$$_ , ffpvQs"qc 70mpgMV!}bndD#JK1CYFJ->`Ԣ(F0f _H jj>X*hvCqvEya2e(B2pL@]&U &GH$ 옯Y?[A^%8D'K#JB#%f^UF-k2%4dI '26MG],u,_F8h*eifNcN0RF"X3%(iDo|RhK 2^gp: ta]M|uH}2|O"2Q$=ǾGmDi7Fo[>$`D]'s o+hc_\&QEPri Ódq4Rf=7VO/> `4]MP(!_&uf: Ώ#pFȆXa^$# f>co(v$mF@hIt(z Tm #. 8B'ƭ&nctSB;{\JR>TtdIiIǁ.FO@ 0h j.f|bz8 {غ$cb L '⽴nkA*)B& kd. V )TK,Gzv1pvZ̎ >bDh iVEpjF Ê{Z+Fhf͈Q_pmHOn̯Qge˼fuR%U z(1X v6ff"+( M6솕4 I8 !R!!rX n~ d*Ck9 uCaV@]РB.$CZupDxJD<E'oNmCm~hi#fN! g*e]'K2FcqR hJ)1VG(,e C)J(2aN'6fT`HW)水(9̈́i$D.P,DPBK Fv~?;;?'C\J4sD'd`bq$DQbg!f rr|uq/5]ZV3w55KbN2eUƌ?eH>Z)"0KRK f˱:b_ޫ85# Y+:I}̉QA8p d,8 $>EZ1fBV3In,djJ&/ƛB/D2A4aL4*&ALf…8T#&gCšg|=f8'BoWJf&Y0I*r*P#GC`daZbdr6w$ 8&He$b`T t&p.HFO?0V˕20ev$!&$'8-&%d9"a nGG+BR9|K)ZKFKoJI3Hc>+ü:zhI zbKVKlP- lAC̖Avx"2 聱iBF/ HdgiL!;pކ3F F{oeƇK/Z^QYwb|*_ <"^ߵ` Tuj8s?>kvCK)Ȅ#KdaQҶesJɟwӴD HS† Ȇ'lFq ]hjHN-`#V:89"@b@+#aB؀'n<Ś~}@rr/1hhrjtّpcSd&l5aAlvÕAÇagl+n Jf$f~.8c ZԩYd^gU. R3}Jb Ȋ$yUOw"!`:K{ \{XĥHz\"`|772p7Em#NZ,wVw 3CJd!`MZ~˒9jͪU4 Ao>}-a} PC5TAMaQ⾘1$h!L}7Yϫ&`h4>b2b&"-rc:b@3j9d[Mf jfjF7aJ!-F"Jdl$(SdC3)Jbm%{zkzSmi[ھt)Mڇ1zCl3 ]dKTjf40^U> dJVAvbI":4grùbweaA7ƺ"-^b ,V)`PuJlRfl<7VwQׄ7! D@ ePoJNRr*v،JԴ8 kr^dЅ8 *㭣<` 3g4 n)to :_TLn5AR(ÔG2`JٝJUX{ȇ#ReFXTXd`V( 2P0)1J{z'-̭XdiEs[DcEhBOjRSFVH;% DZS'J bj%M@ ʃP%CA}y+gjĔE"8$C*ᰞߪTȰ9=s\8%icI:(>꛷Zi6]zEQhpSKYٴM Mh+K"XEca&D$ ׻'xd>9ʔpB?#L햚%Rpuèr'Ѥ=sh7a3e;RS3(0 Tjf~%( ’o @&ƀL" %#b!BLU+8gL+gqO&\+0aܚVr ~mz(*&EЦ{+(&)-ӌd0ZeHPNYV(C+M++(MP#glҗ ck4\;Qg1*ŇA rD eE܏s^DnEI\TT!l4+v?"8csϳtkI B4}7RC 42OJYYLB}SsqCܪ-y>v+ ?ʦ0-Us%ǖZϥ*ԍ{Ww5[ E9+n ɬN^H6w#(iGg[i?-Ib,MGnJ ᫹Lrk, -@78^ ܀\7EMA1僆VMÉF걚kéR>'³Dh8 ! h$߻$Z 3fؾ=s yNm1!ffdiS[NI6SAvĉ1}F5O#`>jf=q[3:4F'ᐰRdHNL̨uWv/m_y5KnZ79ohfS>1u1lC~}wC97@Ab@ _蕸 ?7Ƒ1_v>f8pS#ԆG4'Zh3#bc!2VC[BQ6,Vc:g"e656&b:2FpZD5'kn=3= &ULux p*4~3.D^T& yݦ{_G&%{#?Pp6DQc$LXbrX 8'׆|r)!rЇr1prׂ!%=BXgy"nLO6YZ(C?=Uw1/% ?pH/@< 8k&@f*VTW$KgxW=bxUp#Y2HV'GtSV?L2OpqdcJ~ES6R~s0 xؘ֘ ۨވoX8(GVWc'sgs5yDBy%U2'6jHSX o685A%3p q_i)I)Y "o>'.\?:zuCW66~Uw$i`=Pj iR* sWOACCOWJ4k]4ke*w$n fQK|`$7qNui%lxa{$C7^z-jhNxN5@$A'S0C^$"?gP@HF'Ri5n)k2J@T)sB3%dA~"^ 8Mb~@#5X("$ SfQa)YI "A8Vb=w>K']=O)!:PH iI IBS=+mƤĈ"zy Uem)\~늤ÂD&LGPt2TDBT"߉0EQ/ P 2ɍ (((*'k+02+-; /۲+k@ [3??6;B G>;L۴N,ˍK O([$V˴[˵*;(۵1 Td[P+h+g{) & $jfjC Ѓٷ~;[{۸;[{۹ j/ 9/ zB&+daKSۻk;[+OƻUa&6KSk-̻;[sI +k1ĻǛ[ۻKd˾;q;{K[{kkUI| 1 +?>F Sɳc}`! \ADA1! +  !1 .\,<697L\Ѧ>^@</l‰%|SU&<H3Q@Oŏrf*8a)ljl?lKst,F`!1u 2Ull<7ƶkX\¼aȏ,ō|ŅLŔlȗƓ|őLmɡ|Ǫ ~NJʋ\*,4l+L,gw H,|"OBV Һ1/j+@ Gr0˷ڬgI|sv ,|7}\ <҇}|RΗ}кaqx} q LL˧< zh=}q<r &$4$M3%-- l(M3}H匇%T-}MܺwUK'ƣ  ЉRu (|DGtGPWѩp%5׶4L~M؃ׇMpz;{}XuvMٖDx*!}giv؀,$MF# g6څ<%pE:wMa68ie-QjڻG;]rڬ1R7d`K-ڠ@!p! Z=r=یރMνn R֤hTc@bОR  K*f،XD;杈AxW > pPË3YċNw?ڪ[~=So%zBǩ )>]x#o'Dsx2[AZ*^jG.yHN꥜5?4~M{n6堊1D((r< b0e}2o2"~%ckO":8y苃.RʫoGy*dN{Hy 릜>+cysȴBu鍉&^?6rD~jJ}@Z.2b~7;m5X 뜥^'?cM~.mA=A7 E~c`;jhdf-2.9/docs/hdfview/UsersGuide/images/image_palette.gif0000755000175000017500000035446112050301073024367 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,dmY"\!Ç%LDH 5e)MIo&4rK"':V|4p;W};[[AW&ewE^c]mn]+=EFqI2Mʹ>2a3̅΅v"bHLITD+ sDYME22xt`&^eJ5[Hf2؂ d%O6NZyXTSi9jjPO)1^ᴓg@֞a18W\# (i~WIO*O)榛Of9vuٕ v*fUeRaebCjIZj1+[+ ƐnmvpN \QKܶu lD WIZ7vFnvGtDw._}E\[o}mF_"(7^T{HffIIn1 :8 29ø23l34S1,a ѸGKt4$$4BB -c=;2dQBhDQGs-%Q61ٚQ&v;ژ6`3?(*t&IH9`s:'LX!6QAȴ; b`z<1N}C?lb`D_G")4B#ƁՑ«X}qnK_F"uglb_9D/rދF8)C"GI{hPOx+eU㵪k0=L1-k;݈μ/Oz5g2Et:SNK:0QFCyRxA?0!uxWt XCh.! ’`%F$< IBE`F\bw= Ib"b}5jG=pj1~'kڱ.wHDvAv#>&fKa*RqhQ!j=[1P[,ʴ$ p,YqDB??W?*pK4:25a9\ysR[1W]F@>WIElTl~DL"Dmːb5W7$Wm5B% '4 o`} |n| 0˰ 0aPk@k@X`@~ #o;R41~8E% `@5q ŎXdUhY ]6 T*rـU%r9$pqd(4'5ATU'U@4e"94>хTuSWu: `Z2.%Mpz3I( z^ZPqP)0Pmk1 e2jm}Q I@p@p0~'[ @yZ j@J4a*Fp~ YTt-0G501sg#iE5מYUWF#G$ "Zdq$G5]ce$szU0ȏat#q w0LwXEOIa+R`g;1IZv7 7&>2L[P-[ǵ-NY]9\Pjc)sV5Jct)ksՒxlFI $l" #HۘDs5E 73mem%Р@ɪ y bp1b9Kݘ9NJ=TOCT Рi@``hL  h#0׭ xp PhPy + ݫÀ s>6 XEHhE0 p 87  )+'<$н @0 #(4tv'xX)(^f'faYJij0 4YHB67<'2^Tlzlz0qt_Ko{32222* Y P ʴ  +Tb@˧iD>>o0a`ɜJ :xy   @  #G P< ( )F `qqU(AE@ #! P诊PKzEk ,w  辬\U# p 3-& [5@#w '9t d')CTQ15bd'Y19ULdY3KũqD,~I QBzշ)_ DqeBQ 9 Mܽ>Íѭ^` o+ _C $6~0C@bD G@5-~Ϯ}Up pG S< =ADw5@(6rrr\S N 0Jrj M$H<$ qmx"Zt1$9: ?zk!aYӦx8-uu(iS23,=}^yiHѳYɕ}\\Z>=֏siQ8qtL?ɨw Xe?ENA"@.Q&Am'c" àh n_ hͽn ɯ D>au nb^ҡ w0~DΑq+p0 k l2b4))L$i@L*6F1S&DC4Ib¤"`hBMk:dH1PTSa&HL6ĤL*4X(e,,Ba ,jY(P464p4ܳqК)&P&j2xΤ4iФ3Fh dcpɑf̈ьh͇y1Ŏ_V .8ba[w 1nă`|V?>[߹~mt&5QIӼ!"p k1DQPXTKQ1Ł2Iؚ?772 42A#%424Yda$^"%.Ŗ/w1m4K,F>f}}N;zQB=ce eBd r0g&aE?:cRUBITR##9S5N2 ؋jXLXd4,Z!aiRp&0:!`z(S8֝*lK:}`H8VCxΐ,zCCˎMhbˤ{ͱ&#Y2:0rϴӐB21rX쇐#cL1;۶.fi~+z7vl4 %@d^ίm fA,/3ˬ7=P$d>PFbЯG4YlDK|QQGM jZ?TI7D%%&af=e``dww]w=D?gfT飩>z@f/5zp'^h_ti#c5HI8zFG&Ex"&4QĂ#("h, Pv4hb+;*K,vD-#Ѐ24Yd(4TcA9vFfKO2d"Cp-h87@qĨ4%GYNx}h8Bӝy͋MdF7 m> ԖmO{ Tpg$"pX"Jf*e ̇$ ar{Q2P(y,D"@&"=)uߓtRb@e@ [P3l[4@h|#Ȏ*P @w~CSl"@$eHď zXD~`& P A /e?i"F-P@Q6-/K((%?eaOuجAL5:c 'sP1,c|p $UƇj ;[r8mkxӜ jEppCuj[4G=  $`|so-TVn#Q0 = jMS\?S^.c%4 H%.$%rc/z+_v{]^a׺?EOd^!hhϽjg;IE9~Q>ɡtCEe5mяŒMЃ/=[zoĤ{MGs ·= {^VXf" J)Oh2(s1WTcF]#☱R;f/X ZvF4?< A mb' 3,f R 񅔣@iL&Cy唕:67Q˲Ԝ@rX\ #Lt3Wte0a%E /lX,fj1P4ܩ^ Fk=x~ y2n$*2he7_Kx;Țď=@tt%>L T}}%V^T'*@[YF7T(b'8 Z%ebY<-Mr%Fgy,hiNt>ᘹhu6NM# >KJ9Hh$7(]fȠVe}Ғ>\(H 8NK:(fRvzs K>F\Ĺ'cWk kY)͵+]ֻua/?[9Ո7'V @D'owΞJҸUU*`~c= e47]<G_#&EP${)G$wҒ%og F-#)E#7(E379عx %Zۏ(;c:H1P2@;B:+55 A+6c/@27ݐ0 Jp A @:1 Bj qA$&#) P+y=Ó*cW3. X3C&q.#֑Z9C06;4xWBSqD9D/bP7gDg9 q ^;=4 b#+y>#Px#Qs>;E{; q?\K?"* z<`s*+Ǩ+CZ@'3 ImA 9ڀp *%3y9JG2:"wd,/;RGH;qA4zH$Er-Y" d»qBiݢ2%SkDĜW-;(.%Qσ< {fg#Znd.Me"fFF \2~SYֈ=&+Z h#k !X*f Mԡ:JDf3C伺gyNeIffF#H48%1h]Ytzꦖ?]@zݬݰeM꯶,./.V+trݹ]:k0j]jn륎jfk^ujl˖ꩮ=j~j͞fꥮ:yj־E/v]mn]n'.ln]߆~Vjlzmf'.ݞkGvmj؝]n~@lfknξnlonejNvmʎoGnn}߽ʵ uZ = ߧ=1q,Rkjgy.Gl)Fq!zr.Jp('gr"=% }q@pp r,3ׯuq"Wq'}M- Or.gn 7_ z]-~A1ps6B]:ws> nt4/s*rxtE'Ro+JD(VG}Zr;rGs$qY]SbtuAs&' '$XrL.p>udqg &cFg"o uQrA e`l69W2n_>x-s:k|,VtvNitbjr^_'sY7XTp|OkxglL_7vxteuv6?rH_8znzS_OlTtgl#{ƽGx}Şy~z7|w{_L_q3|HOwU굆^ڝ`gxׇs76vCgnȇGy7}{ouyE_v~ߧr}oo}/w/G/uis]/^y?geE޾ BWZ}ӧp>J0De )ZD“"lh È+l̚,Af}":Li(LJ1hӌV%Zq6CFphˇ1qkDJ/@jp‚j Kgۊu'Ds7J kaVhHiELMTkM `2eˢa{1+^Dqܓi[̓rU ӭF! W#M*u+R$T]K z'apE=R2^%64^0ЙYYF)Ze]~ۇ=t]\WX+ W̟42&Z;"7>8ٯ-q{_๝<=8ܢKS?pusmITPCI*, 9@kRY¹*NA NmA[,xKDe±5D~Ƴ5 !RaKH0b>N)XŘT=f3ł!P2kJ1JC!fLR(S89ԗWT%oD]ŷg[,deh4:$&*4̽1O盠Bd*Hːt NQER`R}h#^,RdC AHJZBٕ<#W$zEsJ׾'kt\D1@H $ޠ1ROKN51Eg{*( Kor{+09TXh T{k8IAwwAe &H `;|MX,K0mh2ǹMSXDAL= zgC1Fٷ&MtJp@\p4}Xե֢#4_[,i4e(Ag^P%rcS̰R\Ѩ%ܦKɱ[*0goqim&/[3Y1jr3|rwpCb0PF*0`ɄeK}U & \`Pt#dUXc,NYܷ`!QIUiJJ,R1y%,ɒAC.NĤ?6ᬼmtMTn!?H_ר8%wőXK kVbW.BmNI@ |JJI?TXG_(7! NyjDAeLx R7F6P,! ??X  bMY7̣O@z7/^м֨Şj)-G僖INbU!iDo ShvņB s @ wTv :+cTrjFnwՏf&awKj͍J#|y^숡RZ}>})00a#+!Al<3(nu8BagHvHeP zTDC% YD[`H`RU_M`x :LF CT_PB ]X%Y L. [/ \l% !pXқCLQ 51q<GYZ#tYVE~לm9nY8gRܦe!5Is(H .Ĺg[u\eBInMV5e">!`P `юmĘdU(~lDɭRH=hF`ljDdEXNX\gA1h$TPkLȍPUu`JٓyƦ!^T#pEqTVzڴؙ`KL'(0RNjRBVߪ]`[ UrͰ6셆Ep']_J_'W >b*-So\Na[A=Q,X:N1R8b$ZD$`2 2$vi=Gy b2i y0b܍* W(0l$EɨIst% wZHUTM~JnY&HE^Q]@a}^k5d!}T]ɯA h^tM5MMBF4ĬH4]>LR(ǠABek%>ܬcgړ;Б l\TsN>1,KQЩXRhUTD !Q91)rr[n5UX%i"[Q+aӃMQŸ_և!]Bu8(EӲ&%̇Ț!mlB$^N(F4pF=< '۝MFȡ>DeTW }R*Y~;APA1QJ-] >ETYp"ސ i 5I% PCNĐTbzS fI"*,PLP]jJ`|΄. b%Vϋ xXS-L8-4,Sl*JQPƄJL`fТ)tEi^1DH8ލUA ct)<Њ@ι6&iϽ bpjxBH~>| FזxrFd@b`eN`ӂݍ]ܡ¥c1.*k i,{ڑ 7zoe/J(Phakg$ > ֒0H$Pb 3*rq^,- َzdy^8ݲTA<2&޾~-튄\rf+v${WXgZ.LM괔R}rZ($A1+'[XRO {f ~,BШVGmV>Dнƽli$/kEuZY}tpOS> OUE1-bES !(g훓2D9([!0!ϜODݠ']fW*Gt %0jx1,r-.+2|v2#va1dzD˝xu@Z:Lia k%4TU[3DxЌfELH= XFCw IYlXӃ,s=HtWd^o4o=r%AI*(yj/c^iSކ}ưb؉P-!ˁ-if":\>ZKUKy*j&V~՚r8+oxBZx>1Mn=|Z-V\^L Iq S@ϫj-We7-.ODWiRHcw@)4Rkֽ**-j/M ߀ WqҜSكj2˦+(\u7)cvɆG؝1yU̎vyiBw).޺XMf ]srVT IHICwDx7@ 1r\wʀ)5kPdgOqJ̚Gpo o"%9ms}Y*G`ڙrOe m+C8}Q;D7Hy[}SQnO:[ taswM~ }R]p:qně"~pЗT E}|lS^}ʍTJO"s@luXsS`T qW+N. c!i: "t_y'{G.mUIgLW!(M5m'InX{'{dw:LFZtL ںs='R(T7J;o zY^ $jnP7bdĵjeIHx-w @D/z;P߲}D[,Z41[@E{OF5k/Z=!]:,q4%7n4P#zP&a=AM.TX˖+[B;(F15:0&GOn)ȏ(X)aRP*˱M͎LnI1;b'ʃ0yr-ݭ$& XYZrdN#Y8Ѫ'|Ʉ!"^ituIK۱f<&whICo:uV%WTѹ syȆ Zԁ03Mpv[4Gv{NK#hVh}P3Ozo*$i⌳NJʈClRi7)j#k8nԐ#4$w9'TNT/LI+=> l)d[ƕO4N;ȴº43¯ <+ s+-ܳ.HÏʬ7Yԧ lAf+l)TL?k -}(U8W WTZ.,4bpٴ#v",:,^,\YZIVԏR #騻J9;JEբ1;3X"Rx!8\mL)Zެ՘]-rkg#d܈ ,p 4k:W% l$Ohl1 !mu^%/QSnܒf1_.1!wbsx#[ g`R>:{:Hɨ; C8(Lw*;B &u +JJ)c:Vǔ{vdACG+h4yٌ38n]t>R:pr%-6hF@Vȁ./J[elz$ݯ46=8߈I?u|=1KWV.d1^->`ջӼoZRJ J7y-[8Be#+\ EP[ wJt"V!׋,A|9K !ؤn; Ѹu:N~IzBKxEu\)1q ǔ&=f*MuaxFA6JJfI( JvlTh"ɝԘ}p<o&YRcQSŜ$ Q^" 9G^,+ b x3mC*ZS¨g; DNZ8QFq2K\9E< , +u~ޫK Rͳ#֗. ¡ OW$N4N!a!{[L݄(;+=sYժT 5zcWI d:ZEd" lh<&D&#ӥT 8D]3 ylTIA?R9[\m$Їt++V Kё[`>} FݰXJԏvIV,Mp {jԊA,KӜ$ SNc]qgJ+""j*BĤYcEW ɢ}6TK1N2ydq ֙MlXnBζIcnLB!A7lb/s?ǘ2@_&϶TБJ(iGFrJxyWwö3c3b+Vc~Š^,]DdՖfUiH{SΔM_VMɪ9S;jST Ju^ɣAZr^1ݶ}UNH$.8Ww l+[4x҉ 7fK V`ybANTeGHRRɲjagUpg*w REoGJvzݠPmwH^Q!5Ft*=pc.RmŞ=P;| ڲ.CAut,p J8Qсޝo Be,e;7NBc 2ܒߊ\۸'E Gw@@;BD+fdStoa7x2J޶aJoi#fAMDSvwo}ZĐ){΃>T3^|ku7~&+PɍT 6 d#\h;·Gfy:LJ 0K黻:{f[9$o0NPb0jf{od3ej%ۢ[^fj/"x@NnrUQm'5) S1}!mwc w]e>eeQGlJl 6` T)yv*{O6Jz&ZXhV,.j<"~~f~1 A%.M:KZtBX-poP tloYrǿAg*do|K|<[УhO :L]Hȫ rpgW$>nLc! ߤn4*JSJR.Ⱥ(ll;=&$kD)@HqMp@ZGh]RH!sIfTJBQVծiD$`!s$!+Ӑ u2xP'zM'%:lYRj|Ү\I}4A2ϘBqW(d~ghfRXKt /*%K8ŶhT%v!;|9GJ>w!A9)/v7X 0hSm*S w&ϢFJ,oBUW+uQ6…bC!ixo A8!2iBa\S E=dLPܡٖ *~lIT>Zj NIr>qtnm֨7 "iY,qjFV~ Ko~}IWRa7Կ$xl:!VN;rϻ"W ə{p@4!"R >ZB Έj#2j#.VvyڮkK^<GS)d1Pzj֗Mū^>U&He)3JNp˕I1ſ Tw$XU, 7MfkJ#] +]!x۾ƾ!YMWM*AAAATbe;"Y4]DA(/>6o59$-YݐKbz-L_4S4Kxaĉ7VbË a!FsrȐ KKq"5vDѠ•91%Ni"N8?jTR#ȈAiB=℘4+Zb;r\cOI+šd[Wčj)ēV"CNDaypoF2Tph=@E..n+6׃5-bC2Pˢ`$ YJf\BKJ#yЩGr4sk$ٙsG9ZwUvu~uUM)UgS]Q=!YXV2yD:A~4_wFfUtġN9K"՗H ՘PHY8bH$_2y'!P9>"N# dbF\/'#N}!Y4N_yn3 eaQ!U'LsnW!|=6&IݶLvx15D12샃zzqt@`qP fMm_ aLҜYŕd`8JY}M&ifgF閲m&JSi/Y6Ղ5)h^aRD}tTYkRR"LBše2Ke(E&ٞ UytdG15g]5Ycm)XI2QǔыyHpd'w1Kt\ze$E'O#Vnv" &c2XuXȪm [BFU ( ԙbpm7߹J72yFS^35 lMDBE Y\ـ*0O`Av-*;/G֩Q7C-J:_Edv^5F66q%Hua%/P&Xހ:O=L[J%r:[Yy`>HkL}qӺ`$ʒ/1T%-ckIhd; $e:4^(IE(H~khNe&|u!6QғvR0iiczNXJV .8~ݤ)ґboE$sjC`I1N5bSǸČ6ʙbZ̍!X»eQZ /jMɋᗓ-p.d;OeZ0$>jSJkgd9PI#X9%i(S̈C:(_(3aDkNyo-%^ អ@_wc  ~2ᙾ8]Eif35!q'Qs:8|j2Qh'TZGgVd\"7+Y udJ.yX? I*ccj>]+iO]bf$ N."1 h9@s\; {K`0ǁC2JBÊHcV sJl av$]xU&UĔz=0$[jxAfCmpI*% .PzeɋC떈򙲒 0kv*L$ wf8Q=ߨ6;z?\K(I`q>0v˥AvgZAHRJ7ᙗhb19 Ap@j (KAb )mR`>uBq{"5O JM: /c" $mraz4ؔ,r] 5%yH> Yv˲P,@ro1<$67˲Ւ4=. -z9~P3̠2~^>e0JgZ2t琦L:9+FyT!] xER;BFʖ*HxA} _C#>pO;He@9bP\AB.xwnҲi%>lڍU#?_|#RDF&[o'; t{YzB!Y L#*Ē}̂Pz%W= Ey($6-v. 4$&CF2}UtOj_x/ 7"6TߙFSAکg"~#}; [UY0{v v՝A+ԉ;f)m-ݖ5 p3NDY9H&E>+M.O wyqBbKc=4yJ9$:+ QfrFe^R/6U!Ur4b qq+T6W`UNrͱ-7W3Q'ˣeRt.1B<~iIϴ}0Dd8Cǧ*$aHe2HHo}J'[h;=SM+gS}H"bR".CUTJ9EpgFARh_tg)&wHC92wb(W9sT4Jo%1!/%Qr'RF\+ܑd$b[i;AZ-Sv&(4JXhg6 r{OQgQ#rgX T*^ԅ/#3uxu*[! 2kʰv#1WB]r%*R;Fu5|v7(7]weYeR$0u4!q2t1EEgY[]dz;,OBVCPF$uUWB[`x2ޡby;a2m!#C!_C+qlstd8Uׂ3)7]Ɗ14yo15_q q=UK;1o=16gt&DҐbC`,;jX}5W-m(%S˶@bZP'$36gM6ԗ/kT$Gu:#xz/9Nu4e޲WAEJql4M"'/CK>?jW)m)n{iՙp(Ĕ{hs,!:ڥ9m/dj9SPoUeԣ -gGhIS7G\F[\@B9nE$D ?fja^vy/x$.C}TwKTC/t3CBtum9}yh9Fy,#GyfZ~ϲn}T2OHE5bрqwSNcfȅymaCH'?@NL!@)H1bQYꏡqrIC7$)SW59R`Xn!LK7zyUM+BV0Z'"E C}&9LPB+PittjBF1v9zGUG㉅&^&N8vooCD{ Q7dY:3 7vBNWV/h 1)6vq@NotσWx7Qq?A'Vge͈ e8Bf^&?C@xf`3(AԳ%਑!J`?YM m.OwUw^E7^!JZbc -!f,b&ClՄ:L-3$Ǐ*=5O@*:;8O(|R?S2[acD"<_ɏ9vW Z[p=e^Fkyx'+tY^9pgr[u&GAEZTZiKQRhBas|Cz1RsĘ\ {d 1JyCJb0#n,sZP& èjV&(:tDTV4=fFK4cOgR*C du{aH^L%\j"QX_Ò_0ehDzHXฑpg{wo#tzńSEPڲLrlO#@4f! :v^L'ƾK^q9Hex:ҧ9VR?}Y0PU&O~FvHRY)-WD ;1siXv1,u>9HhDN{ȯ,DžML8RSF1:5561D3#f) :Ʃ` 1վŽe@7At$U-{G\0,=Am07"B䘔$Z6ZVgKn>ʹyt,K~Na֦!I@7PLfSąO{rJrRFe"3 Y` ']067&7m@8H%mvƉ:u/M*NbC"++Wa|X'=]8EI7ٝ'@ E(1#:Yy[n)e}ň5v2'OJ&РA,:OҌ) ag8r-xcm5Izq=Ms wMWF9a6)«C`oR'ԫ[BY02g/AuCaһrfQ.〰eΌr+Eo-Q{3cXԸZ =x(ql{"{ϔr\!@ VXQExw 1m?d2d 97z2hc'"x,?lGu!4;: s8A3)!+!:Г̲ [Wuj}1 -G/z p`h >OaD}!ܧl_=h-Vq>"Ï!9rDbq!K{ِψ@&9`B.f< 5$HUSӞ8$c K)ddDd#>}[Q!K& Zd `p/ƖM݊bq}0BG͓%W&Wҧ^TKa[T ls3OuR+2D]Exc[dm!bd}rQFFQ`&V>Ǽ5^?N279"Bhz**j)*(Ï j %8⓫+!;l3 .iD*ľIn[)~3P>$.쩋VBP'57.EahS zκ>D h6,z&>I P܍ϠHH=ëH= ' ҏːZpQnjlH/jC"R]iSޢS\>qC5+lԣ$̤/ 9[-K^CO33Ɗ1oOƽRH.R[UR*w/ G[J+)E)ն4H MtKB̒T0 - g}πâH-K+i#ؚw3nG5%idD`١2[>H7AHhǩPQ4Q,a+%Ϧye=p n%TQVw2<: Ucou'^,w`Tz6[$[;0NקWXmV&ɶ}27/{zo3D8@p˷ -u WS2-j4zŌ&2Uo˻ D8ͲqI>eNCrOh;g&EP$(uwIb r7\MEɑ ⠊m$R#v"hFё#J$Q[泜lС`li8KHe+Jq.ܙS^AfM^~B"°Ђ4̌6K{\@s%gݨJ6Oo]%q`́~)Ԥul[ Eyd>Ġ;d<5S.cb+V/Ie3Tw֢=!EDQpӍ^"#REqٚU +LĎU@qKϚN)Z2d=`:>\%;2O e˶𑘀{/{q) Iv -qD7M$66 e(TF+qC:c)%+Uʅ#0~ۃw$T^\Q;-e62`jD< raa̠IC!AUDs@b͔ļb“8sMUTSE .seZepQ'%O(!5$؏(|谋@ᏐPL :Z|({kBW:hO!թ3LlbJ[1 F#5*/BtÄI'd_"đXŻ(WG&eDh..Q@MUeZ}TyR&ĕ7s 9g".`@C tZ9XbCPeaJ'0&Fʓ'2SU=n:VT'bQUICcF0ђ6٨~ڳ ՘:o*`o'!SN[̀tӜv+0A$0T CH2.Z`i+rJiUĄ9K PvXK5!,*.jgDn8ٯ[Z*)eqKU[4i%/JA$|%*F?W+_;Cd(bѥ"KIT<^lғ'${JK.B7SWmQ5˝G}L{Ƽa!z *cR#+]L3Jɘ~1\RlsrLdYfWS0.ڔֲ46=|Jgnk-KǶVB -(b{^d[㌂TJ$"{ W%^qIat #w7v1Hd`<Ȋ`i,  X-:y4E˒Sa[ڍ6`F jҲ @;_b94ҔrA@x3\! *KәXA} B1ذSb838c =˝kQ7sn K}wzFZk6 -߻6(j2Y3:9y@KQ (q!80 ;;tX+ ) 񏣺e:÷;S#k/T‚}@c%4iZ /Ah7Ԛ%jH*aB|ٓ  aZ2׉BS+,p좦Z0Ms s;=َ_)7٪aK*tObR3&k)} "GHxڗqܑȠ@1\/2frگˌaiF+)15% 23Q\%.CxCp+j/5{A@.`14)'wq%2}X@RbNѱw (dgʵP7)O:/0:9 d):Jud k4 8??ES&_ٱ(6 K5:y΁$H 5lVU8ڎH֪:7w݌^¡ɫj:Ѽaq 4d* .k15 K;}0;E"k+ۗ)#ƩbB MU[44);4o%R sS(ʖDѷo32,8ӳ]mm]CQ:ñ3oG\!181:2nsN5XѶ8.A"X99#*z}2Y&-+y9-=*3CBQiM $Np`V9Y>}rݲT5)K(1'єBÓЙ| oM]( & AzD'%2Hՠ\3P݉ "՞A$z RsJ{.M5H`I< Չ+}`_zH,hDJyK8T\N cH_Fnd`dhH֝FdF6񘉺N*Q2֑V V7JACY3;}BQŇә,N-sj B M㕵MFB1B*9eVcHldZ6;aS $՚eXRbK ,nҿX˪ %;ZMY#q^ޚ(( ,Q&M %Q)%`d7H @0zj hI>HW|4ɬˊ.d<\nV5WT A3,K=a3jΊ)'vRV; s1#lvH9V(l|ؽE V*tg _z'Y? 5H:\ϭ mH\Yg8eZ !<*%Sap>՛ (37hemh e &ig&9;;4ԝ^{l##z0&Ӯ\[uҝd fzee< lTB ̚n>B3d̈A$ -v8&s%Bj$+$#s'2}^/i]Aƌ8y;)z^ MV&Pz;[d/܇Pv}(x)@P^kϕZvWܧ`3` ej-!UUۇYxCߜlx0̱E_0CQm!JKGY [dKE+ ww77Ǒ>>{萃Ծt?a@sa›ANzfѿD!MmMlj.7'J7@ g#eA*)Ne c :vsP"zJKDӈP<6;;k،|1vkbBIQ\G>zC"xZՈ贕hMD} -cbza\!A6,I#eWÉ.Qe}+=tHE>{eG$I`ӓbu_"F)--_*,(ƴܚjkO,d£$HޫmJGeYSDjy;%L+gz40;;4J1gE`ogfMSmPRHIv_3_"$‡6_QSaih4f*u u5IJjmtܷ +%$`NSxl2V#[+Rbv5IS8Մ -@i*)Ϊ"M12۟QP2DKYb)g~M@3.l Vv#Ċu"q%+W8hQ+J40fEl`rJ!!Bt܃CT$"-#NZ$+xNC zXƯH? 9@SlR#QcP Lu4!O䭮PV(R_d32 -w)t34`UJ2]I̍ᙔNnHBK08j9XL4[LS)(K7YF=뒴bF%w!Xz(9s(ג5}$ j<RR4H ޴@!SʁJņ-R+TUF:(X!z+}i l(B] :%v1u(X@S5ATflcĆ%Xk?Ma6jx3\^+UM YS-ԉL&DUۀ@^ pTO׏U z$0n #u:ԒqR2l׿$MjyJjk{գIfTҕXcrn.LVt-t5at6fIm|ѤπBيd95q7Crꇹ9ՖU[F/Sҫp$!t,pJ:)1G+P)Gd+}q#J[ǃ(̊W2+ V(UѢ2 h%wz멒ʱoѢKa9O]v!&-oyGZN VLCإlIu)F$1Gh~\L kCjyCT+-hi,6}!̇{׉RRum2{gtJ]$8Y)EDXZ"rEI ؑM4%w?CuZv]e٘ўؔ]X{P¬ ϖC.ԋΝ*n6붊V cnB[tIZb/kuzSzy%+2bbܜ 4?˒-!wY#RQ!qwNDU!n_'S=Wx{~: ŤE4V X1gPfH SA"icS$~G+|e%"ݲ3S3Y{j'숪kP&,UhN5v4e ĸђ c*@CvB=J׃s]#K /1J2g*NUDg^A8gƖ&h0_ɪTi>r3k<^CjMNtI^9έEEq YU ^0Tm9^Cd^l]]NDdM\\]TN.\xц~9IL׵ * *Wva90VbLT=7MQ4dTKa^Tl@S MPh`Q3*qM@D1y N4Z QDHRU M= ,Lʬa sުTReF[]W~DJLȔ slW}njKF᥁5n M_"F֝Oѓ,CJQLyp MF{ bQ\cC <k6DM̶pe`bbbstQ\c8Fp Ge1^)>fdyQbS2l1BтԊS^ţ:-cjN+F`{2_KQ[%=VPdBD T(xxT<ey c2X) u^J =7\4& ݏZ'YaFTnD~=M+J TeqG[h'\ht)W<mͬH%YjSӕI̖mfvΆXNבDBIPFH&_ $&*G䒕OQhUfϭWjc(ǡ4%M21Z\Dc̚S h%NHkblͬM 넱+Ec*E}Nm<QȉLʔfKO0[YRR%ՠM&.eĢY "!\D ,ي!5RlP`)Lemv2V|`_߸Z3eZXKRc+!Y[-RQ>}%&G ނ*WƵd\hfJG˾kP+eaNPmcYR%iQJ :]. (Ԡ.kxTPf*egb/T-r1&=ɋ蟨ci0fT AJV$&%%l5gmIύprQsEM15Q\"~2cjߤG@MzY$ lǾ.PݙnA }9Am~PQ*ߴ0MKaG :('ͺFB[W )W5M֦E2 0Ȳ$ q &dVd6R֫ - N\/P GmXBfRj(  ն2eZj՛PJE -14Z۩L |D~>r$hg0֕KR=js|:P˧jP4,g$˙)[Zpe(@gBͨpٙ^mj[-b ֲlԫ}InYޔyN0V*MZk~_tP/{١/v=gr7łC&`&(Cd@`EV ZPjysnCV!n]-5W%izOנK%jb'PΘܱӂL)  f+ ?$d j*r(,3_YXQeך K\[ɔ7m] 4rjMRf!<D AC42HUNAYZ#AhB(t2ɛnquUsMmqm'or{rdSiS(= zj_Ngs|a|t/v~kϸB 9\ƀ9 k*]IQuɩapץ`TEb(/ذA *]i ki! :Mp Ղ݌/Gk*cz !`CcC(h׌^C/yONIˤRr.KD8Kr&|˄p7jF  8ӗ6Hǥ!՞ NJOqHW,SZ1+:OpLSRU[XϑȦX:$d7]RҰ-Crp`8P1zսGCOԝ\Oal((]u'8Pj,63e,M{R"O aKt E3avDC?.a]9G [v/lˁFpr6iYs\xv.|Srnz-,śk<_}H{۳R?d*َvѺN*Cw;И'"Dh2B(D$27vJH@! uy6|ǎRӎLs6 p`a_#Hp2/2jh`r@8BqهBCۧ`0f6-ڎ'!h9D=hӷl}EpD g1ƃ /*D8 F-F|hA}h@ E. p_ˉ@i(Ě'7ڲ$‹ $p.\yRkˢ)FХV}mًPJ˒kޗ2z̙qzTPJ"F%XBlժ¡#g;*ȴ)vXy@5, ^/sB].Lξ ٖFx͢\AEXwQRo_/Җ1&;2PBE#sq9{ksrjk 0NJR 6i.rALۍ} (J%sfRA*-vZ'ƒ&S$`1>Mޓɰ*R7 .Z<+$ͦFż29:Jp:+2/&&к,0E)Kq0[lAʬ4ӊѢsS%BN䖤,kZS5~Lq"=3(@ 7k4 OČG,0e4Yf1#ԯl^ot9μ!#ـŒUjϽFrL: . R45 $zwF(:PZ"/4Q%"NR3D"-+OцbNA A2JBh&U3Hzw19úTR *}K*-/ɢTNʛkS缓Q!T<.JDᵢU5zn0\k4r?sQWP&Pf D:a8m !.@ I[hR&s]Z"=Ne>lqjz)cp7,+ h F*>1Ζ5J2m|2eym6uujj{yMmMYRR܌BSqP? Y(E3&| IŝC   :e5M9@1|c-FY^3!FqUX;ѣ!%i\=Kqq+EԴQI{<5*%d0Shs lji^.[c1nNNٲ@]eqsL\kњsD8ay@Og}ʔE[W GD( Kb.Є~*Iͮajɀ!l B6&Dj5k(^|S@>p0L@6fJ)s&r͑_ RH4N 7$Ar")% C+-{vAHC~t4Q'!FFf\O&5oj B dB$f.k"Thl4 "ϝjQrp;LAy5iMO&0)5{W=3A"';eO"Xa\r!NÖ(FRE,ȎL~t`,V4-t=tE:R}gf/M>@Lsy`sUfzqkWg!M* kD(^:Uv4WM3@fd.i7!^U&\H=xQ& cBMsؗgВʆ]v%#՝aQ!KKs<3QlgCIW\K&0hϐ@*))$Sn֨o(S=lN yp]`㪸5/Z{10dF !]YyiR v}5q–=0{qiʓ94nITҘ>+.^aml(6! =ᳳcm?eo].-[F>&'盎kŢqgMJ+ˆj$5P&ΨUNkƴ>-ǼPdGI8w~'l'CXUeUzC`Xe쒪Yʕ=~bf&M.xqЌp伧7ZbAH*EDIvAƠh!NJ<`* ):V/HB(z3f v3bϏ0h"GFc.hE8܃]jNLVdP IIs,rbGvC>h|$Ajߦ E"=.)NnV0ybMFZ">@!X 6X%6 Ֆ(, dP`⢤%"J,<j*P.(WL&Pm j łch4l<U+Gr.+2)DkEBT"G/rkYF hkɔϛNHBŜjSJMLY𮐨|G}:(Dnt8͖VPIb0lQmM#RE]'OoZ(b̗f.@ڰc,ZEo+9cp!s 2JKPGCƤ_'ާЪ~R؆dtdV<|-MD/uPGد,k@62 CRlń碭 1$qR¾l(oϝn.]ǺPB"*X1FBb;xGF4mddR/&#F+o". T*cQ d4F&fȊHpI!)Orsi)o4 1qTbsTZ%7IVr@ gjs W Jt>ԊbJN 'HQr&&K _ 7BQ0 mb&V~4'2&%䳄D{ܨ\U-j !3zRkT2$s]qT#Y&N"⌋Ũ)cdP|Ph*eCHܐ5b)vb+6$wTCd(KS ]Ip~D75$sF*lJrP x$SvΚN/C>5)`kjEx멀Bjq50WH~5& >A^+LVnЉL0lcl)T+(;h^*DHf&H,)ZA3j6#PP/ RD^dH G`.#޶TjKҶʀK .E)0/ED-&$T l ##4D7/Yf j$F(D R^ RfcXKœ4xzPsܢQ"23gt>)"ꎯQv4Nn}=>(b>|eXvǦ I0},0G-.--Qt* fpZΣr8BHbgD8TYn.3Ӛgc&*QOTj!uP^ ٤F=񓺰"S[" x~CeSC$8GnJƗrV5PcP*d" rǣ0fؼJ辘mXȅ4ڶ(4YC_7Lqpl)cR4%5&'J 1M]GUfLنX%8w̒ v8tIb8F+ vRbeTmh SvqގYf," jTx(L?r-\'^\㔐 IsXGIlM/ [$]dz+4K/czd.DNf 31߃Ȓ?lbpЮ=mYTk3 =tn,?'':Gݗ z :dhK M5I7.шn cD>ЧK!^s}/Qx+ 2u6)'øQkiAʃj5VV}mHlwȽ/~8c?:a*pQ(ZRv_^:uZ"s ͤvE^]gmqpZH`/8I,if#IG02shD0c- .KVe$23 @SBP]8W(b^'(ܙ+D#4S:{/"J;͹6;pk} j&&s;cw;vw.>1&u}c73׺/xy, D!<Ϥ8ϙ'?:N<^G ٓvܕ\d%n[j۳dKJ7)8pf-܉uRSi ڨM!Wb<.?Kۘ9jˏ%S!".QG\6QoY+.yOk!d֠JE xaj$V8^MܷT^)FY$B> U "bLQ-0u+ud CT<ɰ3N'XP:%5:tB^@AV5i )1 tGۼq'ֵe]]bޟAZ  U,>ۧ!ho />ԷL_}.G1 (qa‰$#N I$È'΋uy}?>,q>)B0O>̩5iC.v4f} I%ԏ!zֳ̄8eϛ$ikC>7xtB!}*{bЊy̬S,ߒN:8קTg$&Ħ8cbZνVwgmMB"mLaN$Qhªu斫;׋U%ypk .x+HfѲ}1I$͋2WjGS#R<s E2(2bSyQW_R=LJIQ4^14 H#jUr5UrG)6V͕fa^_ EȘpʐpTlT4*:DFaiWUK"SzS ]v:͛;]w"btSGhK-c|J5%@fi9cjlZ)=Oɑ!}6`=ZU.Sd h T]S$bճB r/Rx% fuQ@F~) Fyi\R)|]UCҜ4_wyA'oq}UX啙eū:,X\,eښ\bmmʔTnZ毛)gmE$LY(jz\xfttEHgf oӡ2roԖݕ%MTϪhzjRBZhF(j}-T_ʼ cWe>@2cv!xezn1N$UnuXzO@@d8rgeGfv٢Y֚i[fF4RK27sz ;':mMŢg<9ZؖX~ u WOX)K'c ʳda$MgOR.SY.{ي`YF4Pʧ]=K˦0yP D^97-D0 ͂7'&[;3vF M*h``ëUI MG,#aBx6qn_!t/Gh05Pk'4eS, (;vH6 T[Ҧo3q8ըrIkQ=^"X/P $}ɕX%2ya;N@k856ёРjib2cmᄧh:`3c93]U,b%P%X!j edոD`Ӓ{DiO9+LzV`jH]n ȜYHB1Q hP xڈ3{{bШ:MhRI #5+)$yQ"DS]TS 5`lF*"z$#$RhMdŴ-rJJÈ^Z~aYQHjdS.=aHW(ũػ\HӜJ0Õwi!v';a͑>:3Lu=)StYXld. ˀyB6訣c):e<.N #d8S#Y&&k>P!ݑаlPel 2w4fe-7Bf$P!ENsn"$;O\N'm28a%'q=1%mN%A#5+RMfGBT?|BJY':E^'58E:qm"LQ 8(az> @Agf#JGnL]c1Ca@QEe2\4='b0&/Uh1!bpvh>dա5^wrCdw"P6Mbq:cAGb-uYH VFZ NJ+]*qsBGf}#%z%Ph W6$^~ 7:sw?R{h!T7@Mn2qK3c|RjI?V3,${4HR>AL;*}aiMb+S,6jNMDh:!2&\tGlKd)9AT$$0)q|AZvwD7"A&`h$&gTZ׍kX6lFg /@`[;q8~d{?mG+33w=YVB:KZb^7h4$$+~3Vfbɷ;q :.8kYJ0$nr'6&$A_(enu6~(B|SjQR)Qi26HXD=AJ#et?bb _BYJщWhdӨGXȘPr8rgpx/a7r&E#7JjDrdJ1 Q\)B(0#mst>WHG%O7nzx (2I}%ItH'e0=צ(S՚\v_i]υ b%dE& %]Dd|U%,j9rŞr`&pCObpF>~_CuKGJ-$:dFnJYfxidwX0e3h6*Q9#Yru& 2FGuFE?-79)4 $R}~8~qR>YUH=!C2cRrkva@9+]&1*&!j\#vbxyw My7{,'iE!,NWF\$3ć-*af;HsW4A}Cl &>idoánb 6b v6W8*';Xqg}{G?q*a@Tf 8V@2]us")F(A.C@vbUӬ!or0K%'] 1}=2qkvbu6=IcBc)?:Ewnʌ]=p  cBx5ʴYU^J[ڬ/t %Oq' 56xA$dP=VvQ&[3}iYAr2zƨy .BH=dsorC)$H(pu7)TWH@ѡS e+cԻ}^F2Yɀ:2>()4{jWvii#-jA)\F*$ETqaIt|p"&Ep$0"uec0̻~j^88birR'fsO$# fdRPBK0^&6K~%ɧ )Q5R%)U"Ft2sȑ8df4O9uZ)ZdX.S:/7ŗSJܖJ3}cVBqdds&*6AEĉ8{72ax FlU>y) x4': 7LAPߺOyTK$D9‚AIGxuHkL@9*JN49^Zr#'zGa*<({c:أw4]#c\yeN|ɺ~lzeʇMESq]՜)"csJ4C X7v$ oGuo ی+W8 3Ed΁ņS1nu:T=NF_$#ў*̠uoȞc2TSk?'!/zQ.8yxr9AP?HÖUajXΊ-~DJz'o%r_T7Mb7U0kN0+Rµ&;WA̍AIb|J=2W<;m8LJ30p80J֌h86S1{-I:a;zh+&ɅԾsrEI?G[ ;PcgcdCNӟ\bL=t@;wg9$WR&>cmJyI4(W]k-%Tx ]-~}3U3=JGN<;I~%1ЇFH!k8dj aK32j̲VeR;U5b昁hBYe8 j@-T"'[cCRlpll⮡uu&h+{ZvCXF5G]f,$>X㹉rvY*fꤱ[wT0ZէWLQO¤ip'IMzR +Ns](@ M4?8+^ kV"f(w [Vo$BP# zݟw+"Dvfu"Q ߤ ޢ:g]uߚtSѩTe1C߮V%鱋ѧrK߉X[XTÏCQaZd~={PDIYV<܋ws-ޥ7Zv7=]Xc `1B^7$U![ǡYd "b6sU[7]jNh-)\sR)apDkf OyrV*&e-[˕q,ɍs ߬W0P\2G1#p6 as> K9=#~c'Id\̨afxTtBe!aF (MxnNqhK1޾e h[ CAw^}&r,D#D8!H}BdB, FB=^hpF`NY!+DV|xFT:*Ҙ1^x#}0 =jP@-[&fG0*7FN1L܊ChR%؂dJ|qSI{ѧBHqzi5Pw%zZ1gΩW.'RЀsbkA%J,z$J>czY:fF!JK uQ֫K1W?9v5)pnS<7Ԣ3{}N:jd)"H8<)3ξ J??$LIDKO 」IZ#?`ivk'h w#o:[s쩙/2eB}rPͣg/$rJBܯz̫m+5 ;0bV[G3̉$ڳK:k t 30(Ko*#* Ǹ" JbۉZzl jtu !ur=tT9A Rۊ@5J{E i]@cѦ" *\ >%5rT" -m {͍;jlMqto P@X9#"R?͉-BDڋ^.N×TF|soզ$, .0Q; +WB:iPY)M/)'[uPILST&f˵ :r ͉DŽJhy_iroFmͻ.S}yFU<Ú:k+:ܞ 4c.)\&hxh2nLZ,8)Zomp{=Sݫ]՛S![Jf(V1.iGJd,mhΔxSuOS\Qsf8ѓC0PjZ\QvtT]K 'I;y9)U e$S؃, xK\Ýih/HV00l̚n7 V#@qvakr^QVIlDBdsh#uwh!).BJu$-&;\S0J6ݻT-*WAeMlw`bוR+S"t$:M3stZ?딫bq'x(>B9H"ΥH{t)̀k^UAO!XɕZU{9;&v,E/e[RGʤ-J;YѮr;*GQ,7<@ Pq 3!t56U׬h\\4, ȡĨTŊc\'=Jw˘ WZ!jI=kSئ?yau٩# z^ޞ[ eZuM@v\eiZPe0usķf~YȚ9+ Ҏl1rسUD9"lZ b?ٙI6ɷaWA"€x0$h"*r-یФQrSzá_*;]g&ڨ6lb;Nkܑ( +!(1$܉ +.oIJ!(`l -'Z01O"o:9.}Iۨ7=$faZ@9)#P V XSrb9HR#Xjrr,=B˚Y.4#ӖcCm(`F-8U|ɳBG'FuAlۛ}ނ//C9ʵ Ӄܲ>䕵ڟ'C >fy/7 P07ãfɡ+Ԑe3Fb0 Ē:|{ ?36ѓ9Libt  LXЈ, L\MAHydI5S; :Ʌ+H3/*đ$J"@f7óyK˲S#CA9J; Kh=b#0c#-c4:s,DnD1VM C\*xK ,`+ F18]z5q? JY.F["qŒ!97\>{'DM1$2K>9 l#CoZ*ڤ%D{ Gp ;z=04L'+O$ ʊ"8ԯm锯jћ*%Gʔaru9هz܊Ȟ2 "JUʹai =-KIct?K/zy;"+jЁo)N@ø-kKRŪEIʛCu㽂0Tʿ*c¬;|t|XU%yrQG֙J,b4}<<I8 Sߺ!5M0Fr3b-G{!?#SPbFoǹ04Eƽc)2#DXQ}*zĉQˆI/Y_)YĒ04 8 \ѠB*2 s=a 8ePPMZ,<+܌kԳp?M L2ވrL6]Kc,Ȓ )_J"` 6y*~d% 4:50,z] Z eo$X eދŜu ,r2 ̲͙3+GWM>iKQ/!t68KƄ:-E ׄ3#JH!L ( lϡ&TQ94rC)ɾ㥠ڳ0|=4Q;}#?i1U¿MMZ?&!ғrG]b#$ѿ? ̠BeTߓI9m|e1u"|M>鍚`pe:^( "r2h~=kmGeHְq?!!Ra~2a/E5c{]XLq#퀞eEۧleܷp=^CՃbB}uA)^dÄ2lE0ly'BFhΖorwdÃ$xԂDwD)OXc9ͱ cHIqhF!-FzQ: [` (rbYeD8Bq)I0W`$S('O>h3ȹn}M!&K{9]HIzdZ\u=+}C]Ĉ;dWNW 07q]s!X*0u }&KҼBBlMJ7A15_m >ٵt`GK mU`YIvMy]C'G!v5לF7AgC;^Q.WGw1xp}DH)jdjyd[31@}5w@(ʄRL4bBʄelI6bmMO"RIythAtnuYZs'"4 jD3xU\TbԞ%R&xJCWn۵4A}GNgm9%8q5YIM^4E_atԠ%\\gf(r٥of넶Uu5mrud5plr+/Rbd.׫Il]O)NeV-MlW+RL(5"\_^b hA3f5?WtSYU5CipWfia͌Ya[,X^Kmxv0F(rTOwF Ŭ(Rvtsl$"jmU ksp]!C+ɲgpd~.[׏4zdX]A5) vƹq,+P6〷L;\Ua mkYA1 1mfՀ38[}- p G\{w%ծk E$z zf1'9Q5LEJ(\,sRƲ2H)P󑠚~ D4 ѥU[Sr1 -jGE5]ȡjcel"c>r9'YKʒ!} dBI Uh`Qnh1BĈaF3+ tIm+8Fo֚Y)IrW$TM X+X$VS KuXj*6$.Ienxd٦| X##tc E,b$_F4 T,F'`t =%Wejp|9 $Lѹj9|ӏ㲖͑T7]ь9[b<e \x&;AӏسΪH1ǰr:Ihڌ+Iֹ՗-QUYϟ UR~3O jӇs4O|ATVÚhM9ABg)ctiCzr~'ӀC69i(EΖv{!s 3pvhLkVe1gm) 8=4ʘɩ`-=p0G"iI-Ĵ=̡xXkܠѶ iJ#59WTEBJ#&kv-)(I"q=dZ`tQIXV/ARM~\;y$Muu!!u}{\T"lkZˆWJ*6:[tt׋QeZD!mٍ@ 0 a.fAcrcVi4A*;ZA'..;vKthl\AP#h"V3xPQᲫԨ0o"6 KK.Rf(1E#FNKnM(!.幙Lt_{ITJǐozjrX2ٴ>byփTIoM]NƑ} ƒ4'Ms^-陳XuW"JN:V7rSåPAUE]jRә^7 {zudXOf =iA_p`ɘKo&, ۝"ɄB@\8Wަ19 IGo$\R}p@d+@!xQAĔӜR qLp߬` ͑XŷW$vUWL.QHa4\۬SlȞ}ؗ\ӥu4 u7UYUm%I %ܔm4Ch ]eT4tj[6#Z{)WBN 1T1b)PM8"ae! _`BD(Iۦ\y\ 'wTiUDR7t  TՀeS6!2 v1>UxGLIabUݹ4fh<$}NE|"Mt 756@ $KK$LƤLJd=H)6|Z9#}23P1 L&L1o YBL)a_?JxDXBD ´Ymb=X TFE\V=NTXн :_FA, T_ OatQ4JGکrQttV#]^ȈBQb4HF =!ibL,jS̄G q.؂FCK'p]YoϤute}Oy Z)&|bbP)م_R|X֔T@J yֈMn8Jabv2DFyCЄX'eR1e=t] 1Z| r%L2xGԥ\i5\(U͌Sb9Wh@eHbM0 GJЃod-P$e=$TѨ B=!YPz$)D0h`Q9(_Nwu )NX! ;JWEtT=\݀ &A lUR"]OYhWqQꆎj4S4'ST<_Jf5 p,QܩW`Z- WtJ$8XZIS\Z4{`6!r[x#rCZH (2܄C#2q4ѭh襙CU1Yҙ߫c@ ,z9W1!%伙„nܠ>-OF\6Y= }xWP +6l@]O k:2SYA>K5WgÆN)a^(]mu^dx(}> UE+_iR\ayD (c*`[Yē :Ri35V0 O`\XIA%%YYٙn[b+ӠĈmah̎ed Vn$&@eX=͈4-єUՃcΊ_x`*2೾yyӧf`MeNoeуVRٻn]\kb,2F%>KTio{!_ڜȊWFOldbNS02hf ?JQ4PǩDV.zbjgHw C…ܞӬvPE!H qnJ%fHaUҽ+T=а5ޛe_ (-mx,rh2)]ھ2ELłc&e] ^A  X琦dkDG" dU8 ;\: *l|ZPUI@\c ʍrFb.:/j6,> j^ [>͡E8-G RLHq ݔҙ$.LX6{ Ih" j]4Q9pb ՔI=bNzFp<'%a.[lNV]!Z:^Zn"6愠x R{T p> |,>Z4fk͢FL!av1#^[Pw@F "+_&,z1M_jPYFDnOqȿ5͔Շ^ۍ[@3EenǽGHDJLM\XT*Ɛ ݉i'_gr/E$Pvy-cX '7Ձ ( vİzyMBb@2lD%efݐJr)A F7EϱHt‰osX,Lo fE8M}$d~&VeQL~OI/EtFĀW4ma MO"Y9)jhv{3&Ֆ ,3/D_Vk 9AkERSr'[H:Nef85Gg.\6b5ىg)8T>NXB8EɅbN@lwUfIxA!vQDWbPկؘm.IN}B# ㊧'iLņ8rY™go Fuk G+HKvb;w]FY{ž[ab|Ϣ!QMoXhyD1Ev|v}91TGzϙ>h繾r-&\Ən$Z!w?M[zH=@죷eL`h{p> PÁ+āuņ,|C4W91&F S6#M#K&H!R-!.9T>iW]2B-QrAbV*KO*ĉ(*}+ S,̉z+r0Vivz#´}bXpafQ4;"K  9oW zKu}Z,!к"Fsɛ\HW+ q`䢡Dɵŧkδ(d>oB,J'\n{:52u-b,5 @ͬj *?^r<SzZ 7@rp .سh6f*hNz,2e*+"W"i?p5.p]UB9ePEع%@x'diT"'Ul~(BݶΆ(;N4[DH+rκ`l#e;[Rc0GtUtM2îAˏR4#q*KWCE Cg}Ak@X Q̻θޱb E%OSdM xui@1n)PW$x0m8h1#W4M)(F]:"q=ZKOXD9۱[ t"QJ`Z4"M+,&\%B8;abj"90)MOZׄkDe\5}`cEcB2:OD4H8*)NZ ^WJϘL,RTADcUK=je4Qf+OF'6pe伊:ij-I(O1epQ䖓u;7l}Zvȑld-~_A=jĜEkYT虩SBwVVP$Fɾ>)V;;0 R+~Ra^ <eq8" ӿrFsYFr{1GVu\}$0c; :yyGӄ~Zն&W:^+E11qyb!ykL1 I&2'!EDcPFr߈q*߅dϋ@:KqtR4bΈɯuAjN0;-Y Ğ)G9T֩ЌcP))|x-׳%im$c;DmosV$/I x \bMo+*~Q|A*i8Ӡ%.3XﲸW(3N8+(Jrw"b 6sdraIs,mfVIlΊq sw7+>1tc4XTā-YP):UJh슗 4f&'`Vx%jNU*(Fr%4Bǜ'ǭ b'DjG$a6WL,3n%H7RjRDRJhᎫ`x߂f$*bx8Ď-ƦPn"[GzEǜM.Tc+C8#%nF D&!o..f&6NAl7 , 3d~vXiQ*?h2&`OThE2"s2j4FcIh Gvd'K V6|#Wxgd*3F2+>[<~fK\ L$ kl"GEnK0ə+r|cO2о+q 4a2 詋օx̣&cb` nG$x-Ybp cQ% 1s`bCGgLlFF]Tms;b XpBbE|K@ˎxJ@$4dWRfd,vh#"4񞬂VSnIׄz Apmƫˬm3.Q2E*'JǑ>FRX"0%84͍.š/L9&n殈;lw"-'{ML@L\Q;|PIh&E02f-DBg˜bJ|llbײ$b&:hPvF hbFѤ^*XADBWk/(J< c:O8gl1Ϯ"MG_QhPif&,E;rӒ0EHFJm0fĘhpl^ HG&S/ք>kE%{bh,XZo?¸,fpH๔Qdt'n#$5q2s˦BaPj\ AJL&d%D?>V /`P-9CrP,)䓠"ea0D(4і3t~f'Iҋ5DJ#O2me-O ib끨h&dNp"Q7@8POqipT 'ȐMYOfIP2(ҵ/xi.Njb(Bbà "/QSu%8 e&4YqtE[UCg1m]b\Ҕ#0TRBtTD@pC ^/I i\jɒ̵p$4>5‘6hFh*PWu.q1mMhbRkoߪ|"tf|f)L"x@%fPj'",PQ|V@dZF%WDx4{L(ݢjh**"O©c;BF1Hfh\OY m^8wIaCIz"20c9/ 0A'U2I"1w:Ϗk0y..7c')- s8Pic6:ijZGD~v}CձHE 7TG[jlg2p4nT+ Y (f^ÝL7nqYټ H4,jfF/_O8E3j@dekQd`Fxb򢰓4A hlo&s,o)g qfKmGb1a7jW-fOaNU,!i'{2\ U!$=._U -=*} /J72"S A2}FLJL{[P=htUB#P#ƌ_Av$FfF~( ge%CѭDr-g.&Mkje91)K-1rD>yT{kLv"NEeح|j O1j Pj|T " @g`XӃy%®wZ m`yNJؔ>f4Zإ<4?-3kԍI*S7KhXADzC|'\ q揜P)"d,QBk#K,&1~\o`b-=G CՒ)P!e:RoP( nv)u9S5#XAxI ͕ܲm"OۘTT+ݺh\Qf1g=-QfSPinyA"f X[伺H׭ͲGWȅqzdzo/f/lHt,*/ Bp=Fw܍Hrh,1o(ՙsh,];^Eh쌪E2mj~ 1jE$Z/8Ƈϓ(Wi*qv ̡4d%[8YnS,pDJE)I*cFWvxo럢qeapmɵAM~0jjF5Wz\")ҮJ=U{[< =~"9u~S+"hzW^4.V|yc)s Z;g ׅk4;r#-‡Ю$ or[Xz8BDK.]C> 1$_ kIq"{h$m3˺*eZw4{5 ˴IF(]0taYB,9~&*Cp 1U]iwve CS0=j)zZszHE Q]bk2\Z3kI=h9(ZLST_E0Bc0xTRQ:m[PTlIB ]dШ΁-N6hφF4[3lX:-Uۗ|2-yJ 4ZYȫM-Ges̅LڝX{Y1SK4ޔG222z=8fϾmZ0Xq`?&t4_y7\asz[5[|Bld}_eZ4GhhQ=EPBkEwENxG~UgύS`1UUH>$g\#X}wfiEcx=`kKSR=)WI ֞h~QH"pɕ#Wn+U%JUU>1,s2샃P"ىϹ$XYU=1U9fiRډPB}MOߙئfHL1L1isbjF6~T?i`GdEdnVf"tTu+Ws5JMdUXXYإgX hTa`).-UrneR{ah# EV+^N;+L]"%R)ywԥ|- u5T'݆& k )1, >Ŧ{\fҎ*A=|Z!DlOr_˖Muqi;azHu&/V>D|D ]'mlT$_^TeLƔ0ϋRh)O8Z!]?V/LETGKƥʍ& ]QBxPCv=NIijc*ܸE!'-z U=G䬫v 0Hٌ!&jXH(Ll52ɞ4SijRCXԖ@bU ;վ0:O#6z>ĝDsJԧ?TZ/ Eb|TK"HG 숗E^]'mF񕙤cIFqu~^ +M`l@6aM|R72|/WW΁hٻQXH/C=p=jD\01ZȁBYLfKy1rf[>)#uH|{&3[:Mb2СuO~MlfN[s$7@fon"t"!njVЁd;lݫ67ggfC]+.*3!)J]m s>+/y];֧F;y7-.>2`R':SSoVol&Og0h92EVչWŢ霬lЍs=mB!v_ʣG >q84ŐHu='~o`ќ=fdYF'aid-\X %'܋ ERR9gaw࡛9#N25 Otnky$)տiE]IWXv$ ŝv$<\y]퐭N;33VƂErqo!H!>"׀fqx (Bxzvqcw(+Uc2&FCNbF3HF7y43yfPmqE]5'pWh8^ԁ##Ar7gYSJnvjA5xD,wt3&q= :~Dz)U8[WMr"V{fQ_'c<P#v.\NXRI"b'زHeGf:k#Khz=aw([щFxES3z$U#IU$HaQ((]4iF$ FaPrc65"!2CGHrSa(o+;ȂF'm.iXRW{)F,BJb^h7*S9ɂ`+gL>'v%BsGɳ#3Yfl1d(id:kvkrX9הcejkVGy7}6w=y >:C!QHBwjhc7vNa) 'G7S=ccrO.&4'^!e'ȪU`VMt2ܱpyC)5d՟듮G7.'cD$XE"7UIr9Eym~֧wM9#X830vh?igkCS«tB#81(U9HPa( %z"; 4Z[ !HǎuuF~6[cr70GÔ"ҋ󥬨E}pkKb| N{jS/sPC|YUu]+-)vh:!*/Umakn){wd}EYl 9%\8ϑe9.~y IGz'Kc.tSA ~xS·C6c,Zz?`ua4QQڒ6af&z[5;UkD`&v;@㉣BB{DGP.u?!Cagf]ҺUt!4mfh&yc !;Na8BőVbFRUfNj#Od"WjAD:.*^SqSP23JzdHB(9HW4u$I;=a,JnbSa<&ʦ%7Ji.4޲̩]C~.Ľnt_^p{/ $fy儨Zu}DU8"!Bd8H6xIŽsrE4_O[xzYfZl$MwZQ)"7`ڎ ;cZV$Hѫ}F"˴b}qs\X+>=UggbDW`[w)pso;xYtLstCv$i#&uL9d34fP rzhy7MЋ_&<^T-Oq̗Op(\5HDka]Xlh"RY0TC's8t92F'#{~Y \&0"WemcWfyTa͑}wE 4B//Y-K7(k!U|9Z2͔Rg%'}leT';!FhORW9iȚҵv YTk&Wvx!jQpd1'| VK22#]؇,3+Ia^| :h3O/9F@ѴL9sg> br8ySg$,St\ hMBFcZA\O\ۼCi5}ԉuO[6GA<A0+h6ѽM;ZL}*bu@q<\.6|LqS "9 _|14 [Y5s@u*Qs芥3%GV+==Ӑ\SCΆbbHSw8R7((T,FSHʊ$X;ˆK&ӶRw/eX821mK8i¡)?wSz[>/qiZKLd7ÃȺreB<%"V)M#7oZd}%ʏNǨ4mJZo72uq?֬q!Eg&Ǽ@1a7 m2} >XC)ۨ޾E )JlHĂ$#,ٱ#GY,@NDXĕKٰC%:yNO4QaǢ3)0P QJ\&Dh.A(qZhURMN >*%ӹ@e0&J(_~iH%1#k?sP0Vj%vdK, rD Bl2I=faoMw^S/GW>u 9FeB#{gX7ƃ!")19 <0'>.S 5 3;"*3hzːAr?2<C0"O>*- MFN R 0Xp7r 2~%&j.@ b2F *M#*)́A.+/[sEoVZ%i;1m9՚kW1$SviUT5H#0IxzR3_,A4b] b6 H4 f#{TLC)sDdIݽ$Zc ( rQSZvyG!ř)&ސX jØӒǞ,B94i|ĻRMUPF:rvRc$9x!$wJ+Ft6a R{HU4le/!)!ȘK#)<=:ZIC䓔Ud.ag(U4uyU*`X}rcOq:4,c(R"Z*6ffBN[Ht͌[[̚DN4ј9\2>}a y/}͕&fZٚ6}č)4לI`+&dⵁDH]YuӮ7 wErNcq MB0E#DՁT潕 -<d}2";x2Wܻ(v,/~薖oUa"WeDhaOIϐj8"eũ[I(4 vt`l_Jkq-5hjERl La>l4@4m%&{n5)h&gJjʧ")/(J4.A6S}G3F<59b1Bҽ J7:{k.2aX7Ö˶ꏻ50Z9s#x&oa6A*3 +^c,1X#h" 8r0D"r9)BsjB7sV0r[-*=:8J.'1$ʓz#z}<7٠4:tyaY,=˙M#&(iة;#Rm5@Y!AܡE {/3"MaFڏ/ǃ0Ph+ Xs:C[AU1><]K*p|d+R@Gk,>jQ\)w!ϱ" ZT $58P4IYZ"OĶR3%R>\+ѹS+$d i'1aB Ǜ:<#+_YK ~p${/ \߁ z C)f=23!CIrIZMqz|69/ͫ kq0KLR}Pw5y̨Hx/P >HCYj$R#8K !X26*B y)EJ|;ԑ3+s"˻7n.2? &)/s)CƿT^1Zr {79#0-R,)6ѧ[H|/"T%0)ԑ E<s*LjʄC+}gsS(h@hRۧ Jl8JM,QQMLj|xsOʡ '%b7J;@05bÐiP& B#;В( |I@ʈĩw!/ )v1U8Ak:M9 ; Rk|/Cv)rz8!Dz.\0I[ - 7/:72TF@a"Ʊ9 H#.K+#,dRKH"ZDڦ ȳ"J!%@YKS;?ꊁ2Ԥ*fݦF; KN5* 72*8ɱQ'; F&]:U :ZBԳ3448)8&*uڠ;Z)܇9}GzZYa5=֎RHQ3WL@} z:,_zحM0!bQԯ/ $[5EV Ӫb#UJQ-ؾua>Z&=ǃXIEX X=&bRh'D>긣xqŭq ?\;=ݜ1j< koONb6K3192d%iRh =TCY%ߩCE-9~[ajBFx33GlWnLC"ZkJC_U^cCB>iᅰ >]:?;XA"BB11w !ԖޣS+AppRH )##4hJIZZ ~0JYO/ KD,jZJ,%08^գt+eH1=fKJθBhD5юFro. 0# j\)`o/ )$&@m6\5)X d̂ ;qcx 둋!f(8m7*QQ%_[@YRV[D:@`*$3'36~@ĖaV|5&7qN?At #{&rQ174BWQc1Oꕢ$d)햂i5B\;td~:HXC8"=@#Mְ*%+m Πd^3cژNˈ͘#Y&%8%|)[J豽xe%UN18uI/&;l5,ZdXeY=6"K5쐐 {^aBZ,PSL9&ynD|1}T)*U 2jc@_: l*;P GAæ?pѼ|Nk5*aBbm <3NxD26B&a$F "V(: 23 B힉;.e;pC8_ºlhrsW2cݬ.;*e!WǛ_v 'ȝhǼLI# P:ְ$ּ| UJe`?޺\:LSW!f6".(-O߫%!!#] {T]ȿՓmm9"b>JQe{ dr3GT,外hB>u0G"~qMt1EKM n@gz~Z,,72X*BWƴ4pzVѯon|Ddt :00FN]=\;mqZFmj34Y7h <'DZyb@F EJ,͡YY?)s!^W7<~#O1]D9@6fMӅK 4& h yϧ-3i#/3>~Bq5;GI9'Op,Z>7Hb@[I6W; @{$imxt!hS%Uf~Y̯J.V=OT Ι|ABcvT+PfDUJyݚ]I;tZLUPI[/ D- ڇFy;Wg#Īwbاl2}[!<A xXbz2(!C-%ĕ_K^}3Qp '1Δ/zyEI-IS!Е*\Z0Q~71­5B$93† F#AkΎN<;]ujlDR$<¼o6+ż[y'NMaA('EضW<߆>1BimlѩPy6ySmXj_mN8-UW^&X1ZJb@7KŸ,<}q{ٰZbnT_9`A!@k)Uu)&CTZD)61VvwjMh[i1HYefaE!G[Y和E .Vކ"F:RT=$XV`nG*ZIW "M! EBq|%&ӊl]%ZDtCR\gQUr.N&J|N!ՖtB2v(v%c)$sbFb'} x!UĐWz09'h]]6zlGrVQSJj`lM,UרCJVb͔)xr^>[`O]aBv%KipWyxIW"[h\i$Zϝg=ZHKaTuQhV:C?g\Z\Hn P+0'O'L.daWTk6X4^ҵgɬhYCxEPP4ŰB1VC]D>Pmt'ʼnE՘0MolRm$fV-[*r4'*nE2w9K, [ablpۜ[6zvG۔ܼ-t1!\ Mg#F"ssu/W$9ޤO^Vjjro:e㌖j|AƅuZ} us<"\>(3˒]*Z`LVj>ʸKRVeg(, +!&#':RF,!uA:4`ш[yQ͒֩/I6tե\3n!Դ'oDSL6:}MK_ҿ9fCr[Zs ɯDKp&](3QFU<q:Wc0u! 6qc@լ(7 ce)! |unSzMgK؈?$ *Q~r""w(;y畗Khf3&["= 'ȡ-W!ȉPv45)-Zdגؼ@|܋F1H/Oł Q (aF4hƗ..-; '9}ތFFZXmxOtΦFΎE3w;<hZF4UIvRZ >u'aS&x.Y&EġjD7(khhlSOP*#-^k0 nAbWt4bNF YIP&dl Iìoћ 4Ȩt,WX_٢zFOIBGb/d?+KA~\xK t<ӥ%*ۡ9Y(YJ,bM B>}:Qz]1{A=@bO]ZYۺ`APPJ@g,=Z_H Ҋ펏^oZAT7=OqwUP$vPKbIi>"ET#\!k$DU@(ICA&V7]rD /L^%T8&ZbFaVԮ^`, FE%jCl:d噜P.P IJV<|Dd0MZ v ]:6- VMi29"+k^!ab%e k?Ib%Z!^OTrÏU˗]sd޵ȆRq w.]M6b^VWnB]JPl۝ )3*5oa&2>]U=)*p,x%0ZQ@G'J5e㷃[4I5\W:̓N \|;7zx:N2&~}!~5ܑa V̲z8P׫1el& mvQAc %=X)^! bzR= >d8ytP.bweМF¡Aj5KT{Hmk:]Ʋ{s TuĻ9L%fCӲLW!%a&/VU. XmZ%qbtj.g&[42vS%"TׄWZU×]Sm,c:G5eXHŸѓ\B -LYAI8 ) x!Ж$ȧt) xF Y/}ɑxt[G CaL}E4m=8 W/`A\H(AlTiGvu:ѕ,ND|N`Sc`%ż^eiքYP"iH (Q܌ݐUˑ7阎țmϢhEOOI ZFEYEqo!Ke꜅_Q`P9qSUYQG`Rč|ȓ4,Q)©J8!\TQL.|@aO\na= i uEʵ܊V:>\ >"A ϲkWE20PI8Rt[$N2-lT:`pE\X_y aMPHPNG=&]\؆d9] 4 M .䪭"U SJ]x#4–~(7j(g 2'qU WK]a ̬,SyvG4L\xyT]Љg2iP)Zd-[miLޣG"fE_؛AMF 6)tVbge=驸(Yv$paиG 9_NhfʅZnRPZ`%A $(錤fSX&Z\ I9jX% V$ K"bMv2v`$!f$1U(kUMD@EV t ɑV r ЫucKEDtC"͠%GI,ն>E%5d =!\NN9َoLҏۉT)d1QP.$5AYe| D8nXjE cyǸFm=m: fRL]PiVJ Ix1P HNӼy<͜F+2}۵LlD$ j7J6&w=ӏZ]rqܖTNy[aOHT ᐇJ-[p(W"@N В(m&G|ed&–R ME~Խ) |B}\QU fE5stۢ&O}Y 6@]R9sŴN1 e20D%e͛~`I#TF5 |PG(ι, IR(-LLDV)DF[ӠE&))⩇8ՔG{^-9Ԅj X 0!U>WǶT W!eI#XjFF \\ٳb@uJ5܆x( uc}&$=U \ꗘxt'G; C~1 )iRn6gFo2XPT(nx)^^<%#'@ݥrfpEj!3>LvOB+itH45C%TH4˷ ֆ2JC&{)f ^!Hl\AM]^r7Py$S_ .K#!ך]JF ll0ؚx.W;E +UJU"1YTlPx"rǓLoK>K0&$. ~7 !xjx/iTw_4qbO'][K[G .Bzf,U#U\}#.=.C ]1Ĉ#wmKpS-AfV3zOS&bLY`[p2c+ [X[Hi>qbZ|"J7T'Q"Ɠ:>C ?Xv3>1'C@*<#FINX/FQ.;2x0a4< TGLИ=+:JpIa2TfkJf-LHS.A[cN/\*G3ňD˦ ™ Zg1"۬jc<:Uէfk9z}-a(;Jw⟎bL>5>Ns񕇑5aX-vF wV;nbuAFzNLQJO Cͻ: zH-n-2=$R6m %ea/!ŊN[ [mÊ&r4 l&\4JC`5jRJ1 }$1ta*"9 Kаl Aє-&jTf/°FrIClB)BNQհ$ 1A'H4S2 -M(UG4NɰҤ,.겏_=d1*~Ln.l4U&1-R Eŝ%W w oD]F),ڎ^]ik*92"J# 3b2m׍KwBZCքe r)Q;lYEDdh޻LË_4bzÐ"خ{^aA4I )IrbTQ.rXKZ6~Pɦn)rg\"rLStP6ےގN)&j)"DDS*mZsE/TycJ3pPs sԾkËaěD"s^SR% 9ffjOL7.{#f|+pIMAx87Y[iޓIldxw$W Yx,TiAke-T~Pd3`Z[dh+s \c,u OlY\$>4MǟH%J : .JL܇`~X 7 B*6RjUr=E5z 0]XB8qZ`l`0I3 D# hz F)K v&Ր ?eQ`S9\,*PZ钓IbaWh)HR`j|t˵+W3^ƣ9$:Q Ƃ5e"ౌE%q%6j,wKbi\ tU%j\ Ckx!$c\Fo;qeLIf=pgZ )t^`!]yQ-f*:43PʄOx@jNnI2ypL) s)yˋs+ω=U{vӌUwYA\M>Gl*q_.tZ8 O7+K|FR4dN]ieH9jvZ D>rdũ\tCq򖜺Xt>S`jt# n0U^i5 =L/A@jPS` GQ']+$fCĀ]8X9iQ{rD,1 ۛK JL+NXCC:a+5&$WWJ9Ҹ/8I60d#= |U䛓:뙎)TdMV-hael"s.Vz7j*8MTj4|(u=yp ry Be!AAo\.!2/>ä7㶖\T9h pd܉TZCf/@k 99f'F&Ɉۖl`dsPpNҒdgBJ~/ꮶgℾvog"vBAr(LȘ# (&8Pc#N5vmFl?FCgL. ʨ)@ .H9fyK*%~ϧNhA>P:F^m7dD>ǵE7hC*,2Ue풼*,Jfm D%Nzh5e&MrjjڈB$0c.ڮ1*~p {bPs [tNOe>o)"&5`9N¸ bphVܮwPe˘ŌHY<DC*DZBJ} Ї류Ų)0przz**Z0|B8lB1TkD,b#X-6ˑnL02_ HS,Xփ߮ͦ'ㆮ hLV/3*gI-7s`n)/]JF8h2,El'Ĩ0 c̉Ts$I qR$[Dxr,XD.{#_Pc3I6aX͜/jd/J`#o]*V'vѶie~, obp 0R4BF%˦@lpS+0B"s0g,L@&!#R8S(85_lƇ'$,q;?KÒ,T: 2:qb$X"A:pmQ\'EXLb4 uC u.|1r7.nMMNbHN63͈hfXGg3\kA!d.I.MFѮZPPaMF.-nN_l&vTi#J?KnTǤ1zJ7 &B%tƃ,IJ*M`T<_m_U\7fBUҌ>|e,Gװ\nH .fQC JrϘb``Ob 4dNm>gDs8 i 򕀵'#$/y$o6]{qh]Q4Ҩp(錤iʑ0*[Es,BǴ32}\zCR[Xjfc{Xj̬)mOC,$Êdm&cXǷԈEo61j$R:OKT]0a6% +u7̕DK(a'Rjk"2u.]#GDT]Nb8AY30MpU8IIVrK{)w;Ɲ&p (5-$QOKB%sfФCEipBf&oj (vi(1t?" $%(TjQKJ~cl\|lg&G{JXXϩ gvCd}-NE-,jH$%f?Ju Zkr!rH=cT[K;{gdK3@+^SퟧU+b4!!s|**"7!$jn=:'U&ng+O3&}Eٺɚ^n'KNYf'|)`i/G fК"DT'MWF@M.dcDV|U\3} h+k:|/cZ^؞?뷀ȇ+Xfc, -`U3/GC 5A!yE"eN+V5b9=:Wj{=$_ذ:po|>hDE >TPHMxB azB")O8 ~JM)Rgp%͇*,?,|6OYSfZ/0&/&d(S!b EY>x#5/E@: R/U'%nk)zpBz_u<ZX]NX/RzLD9#Z 9:}/rGdKJA4 KmT%Jc`aQ0KiNO_btx ^]' -'4"JNc(LpLڌhmgcv'!.-Iƹ~&\ Ú!-] 6!={{b@0HqB^1C!;_6*.,mUs.Ϫ,ɜ,(somOK:k:cO: ?p yn _hdRULR<*$̧9#Nƒ1VJDVv6y3qeAXT-el~W4*ۡHs G_&Gɗc' `"ae[n˳G*N_F0ʲ'J˸\ ='2DmĎ(/a wD3@c]TG> ڲ'TٲO/O_%sECDKWM&c@O1Mt{,MۉRFpA-ݵg_Ԧa-o=ń '| QaB7:;}h(ϾMm9iҦIjvw[+&jxlT>63w;.&z&lN.޳l-}K?Z9.Q]eh>щyg )f4 m2}!Go>Bgp_hpčXOcIzVK ?x2ȚQRp RԩfACMjdF"2LrE.]]-RuHbƼbS3/_̇~5fq8"Ļvn~fEFwXґUKK>dәًF][v#[ j(Af_~!ZjD%tT:y{Eg ԐK] D]{C!']XOuV, ^2YPEMOci 48$FQwbi(gpVW7xEpY'j {4@MQ(rfBA]|Wf~"*IJ'Om&kS9%ށS$MumMtoHr `xtJU} h~mh!Uyڐs!y"Eu6hUaZZ(UEB}g|Ғ! `0%@PG~yyfZu$U\TkC%KjYذ;m Y]Z6lb7zuC\15Qxa%F]ԭHо&C|%IkS xDq:&En8)gfnORqfaAWK*y,W4H(R[D3|q-Ru 1UUQ؄JVvH*x;YB (D#Ʀƭcq-fjb=A숯F^d|%^"+]q!ʴɟvr݆j;(CV-x*_F}\s7op*f"mL-e(8IQfq@9 r@4Jv}owg2!uI5B_L3 HןyJHƃۍYHgZ"+Et@5Y/Ѳ2y;Ɯ97 )/W Bh#1NNMU,%4F]8җQ9f?\U<Tx;Κļ4U7e̗#F܁mYv/L뫉bJhC-Edb@xq# G ZhyP8=TMCPP@*M$M*^*f&iHk@$%4xj>(iNb]2Q#Ƹ`B,+µ݉]iR=\b,ID(ꖼu&ΜmZg"xJ&ʫk:KccUKtyC ݰ2AZllfUL}H٩zF kNxdRƕ+ք̲5Py@TF#j(Ͽt>{;2z.7 *1z뀓-k^1V~\?0Rc,xKƊm:go|ᾼ餲'+â_AM^J2GcA,K!Vj+aX78ݕ‹ʩYIBS-R1&V"ZP۠P8H<) 1:N;;΢F5 (2muJ9uJ;sE͊F>)1`=f ))G} -B~(M*4]Ku%M6+BF72VUv3aG+y3)UU(m[#~װ׌D+If E5J, Il3O|JfݘcU&{/BUzj28 ri϶g0u6qS:u*6,_'_z>fKv]X&ԅAZwV9qqO+$7=e"FLr/1x1pjt6s[c8tU3ZWC'L)'#@j/kC>tWg8Or0R5/XWVҀ6r?4łfe#nsvj&PyWo.gC}WHsqHi4*Ӄ)nyf|D|uH-"aV׀/}>R(Àu].4HaC`pDe/$l6W2 >H);[r}WmqZwV-V7/5=Og[QR(ubL6iJ_.~yW{tHk7QcF zʗX"\rPfVG3vyRWK'6qh>d?XdT*RԢZY!3OӃ'F[97[?vv6PA`wP.9(M{t5N5Q*iPMrO؉D hwҒK)D8Ji5ϒ8]nI+|5h]Qh<3V\ o4#+.0d+QXQ@g>"GA qʦC3t9uZA~8tI€д0qVEpBIQ)'U\(x1`pv)h7SrՃN"-tAwU_WwvQ2+-db$=:4m 3d”rT{5c9\{32xj*sZ^> 6OagYaD pjɕ*+%&x Nf# N.D'#bV9lyyBDeH">Z)qn 2ݘi$3rRn`7dbKhHMN=_7q^q!>FZ ,}ـCSCQgqtSzpi} p*U){y@'P1X)TC`)CfIe5%Tp97IjG:esjXoxHFj[UX j@)f)ؙ.XR*K2s<֢P8u,҈8R '< لG|jLjcsrgY'pL",+ʼnH$ry*RDm-!](,B&FPD\ы9S?TȣVpDrʰ aZNfdb03CnB#u䧇3jk'}O#zD2Óe*נ<%h2QCUkh7M](W;IH0xׂ!z94)6ah-k8}]xrMjT?_[:qvF 6g7h;‡$Wei8BƜ3A=~5Npj,|1(^ʡ2;`9;VyB)\!ƷG_k'.ңԄJ:t%VDsB$(C5Ȳ&GOFyH_fm&V{K7#8^]~9O7o&St$wѤj=bV, R=hWgA [ԧU*gҐ[GvRs^4r](?BSD;2esMm@HZE2bI+\%zo%I\bE"nb+a4VtexVp2x|8e9(},BxX캟t(L ys7!,4PS,2/oCZ6xYⵞw"#u=U˕@I1ZC|OUb(U@mD Pf>B(%>W5NrXt:S\U?)+Dhzc;7ꄚpzտ&):SY ξ[<ᐿ:lJjTTn8x$DZO(l*u9wΉ"DvŁ{籋lUqd[kP-S)%fB{w8֪MIg| &>괠˘N32բQvG> J=XJ ):?Q>63гS׋4 IiYֱ:=F\"CIS00 ~}Q>e%٧ f7H-F9WUdckyw6s8#Lֲ-jśOjuvFžzJ:I"e1"[>m .[:CTu(Wyda3S8ehD)<夑c,6ɬ[^([gd<=*_o߲5z|p>2XA ai~V1NR\1tmFfš=cr!Q/e>&dZ=I\x`F1(}Z$9Bh+$̏sSfB +jGС›3!ܧcDI)攸`DB;|xQgS-G^xfef(Ͳ_buۖG1,ύJX͞U{A llQ8Xq#͙YVLxE蹴勢VL3˿/ܰmKԀ뾄ͶĢ*i-'ӋIz8"gF{ed8qZ=)fA_#YdQE,p&{| 68:sN:$tK2z<&/S-fc/L'Ī꿧>+kA!#c9@4ν@B-nL-eTl&H7*5FӰkį>|A"ˬ6J?J-6(ۋ1{#gKh#0K%4oLK7Ɗi=aS/J$KH ͢eLJ)tjIj3DsZŲ<-JR K-6= RlMb59fm'A t5Ʋi+]r{Vxؖ㫨͝4gupc=bsi/3喣 Y«eEʑ?ĩfn~xr+y9{kUFqSJ =.2U6֨1s`) TQ?j'$FD3$x@=l3HŦFg'-hj6EUVl"/#ؕV"H.S$=LY:\ bpiXh\ mUNw vʵQqn${USLf\ UfUDMU6V>M[ņF|uKĆsƊ"4%HوZVJXj$7 xA{5FԔeVB`+lZHr$HF:`K`{"8 dһ׬Zz(Gfag ;:vK^YB%m唞IZd_Tlzfmltb5A IBk]_ʣ{̺f;<k805Y!Z'; ²'ZOA.zS) a 5KzDT%ac*1a!mI("9J|R A7 D~)q0f#AI."d1336J0B*8Rኙ˗; lñ:{%R ^I#{Riì#yK+ !z#頇b@e"P S  zL  x)wkhZ'q1,zdڋ#iҶ\ o)y@2,4!9Zjh\;!w, ؗȭs2()@A?bC5" rü8_i '{,ߒ!Y+TɒaE)LE3іK4Y8829)9$%Ez$fD S +8L隽b[0,64ߒSBiEv[={Ndd D΋;ζԦbᚰ4 :=eRd+9,^´crs?),!*qCUe.Hжs-b} J(lhK1є`+g鿷R.]S}0+: ,T١!.Gt8OCYՎׂ2aYQ19ǁ\a:(E<5Zb2cIlӄe2ƺ);\X9lk>M6GŐ!%mUZ Ih c KNqLK,5JK[T 1jK0\+"OB>*ۿzp%.;C%SƜDm;﬒AMC9ۥjO1))$X) Lko,Ēw%݄Y{Zq]GPHWZdI"X+Yckh: hMC>ùYT ܯ KWV O Ft3j_D&jeS{y_jݍYP, fpTe4a/bӁ"SenpħXL1Pﱥ3Y8҄P < %ta. d)C=0'2؉G֓AӤrHwh|T5NAUL+)J{&m` Z\MFv^+idL4T!7Q]𡒊z,51.Wrl{mAzs;[ >*28.$-T7J`[`Amr$D8T lF"ȦAʲqp3c"Zjb/_w3GQh*9D˙z#,wz:f~qF0;Z$ m[7竡D:u.BB]oۖM"x+^ԣktP(2(Dd뒐Z\ۦs{TӨYzf`\&UXDD`)p&2WGڶiIoU}"ߟoGuՇo:}c屁 }ՋozۧaBh$BMÃ,FyqD m$%ŇcFGYz|rI@`Jt.IZM ti#M&/. ʈ^Ir ç 2<4MU(5mW OG[Jϖ T*C\K?-+$[~=&hH5L)G)GH}ڶeʑ#d|$t 'uH^ Wԃ.vG6״p3-U7|Ѿgm8;smx[qRN%4`jpR[ۥכ=dDűtՄd4"޹GyE|RlCB-UAv d =v[JdF!&szL!V8D1#_ PeyGdqzXq'V%U>vk) ՎeLۅCyۜe6UIg"zݏf y5ZvLIYt;fJX$Tg<(~jڐXǦ?‡Lyx`oy[fVЈy("kh kl]tmWR `"d ,& TŻ\)c ش[P-\zކmpCE2ukpye+[Z!ՐLEFޣ.ꌜ\v%e:tori!Sՠ[w! %W ګ֚U> o Woj͖_dnufluѪ]nK=^VQEl~fb$J7WsVXJIL8- Iڝ7phHۭl.In4IrSDB_:h>5ٶgY(Ү Vm"{\[Ԓ9 pB*,!#VwtUL;Qf&Eh H9\*OP";+P3)Kŏ0V;ƴl}Fcd4ىRB2LXNƵ/(02:u+PnE- YHlJo\\P%,NObpyOǡ jkKdEە 1zuˎA#*"bP00%SF7jjg2PSQp彝-iNLPN'-ZPYc,>+ifbTz7]W@/IJ=͗U]LWH#h1hSh+dF1R4˜fYY֊䷨0ci6/-*Zēdݡ'`'uͪ1]ܖ!U4$e\x}r9 52}λT*̰-4)r 7HC q8e{փjXAƲ`(=fJV8LT kUZ%[Pd#!lyVYDV>W+m7ݖZ;JoZ3UD LCkaYM7A%-S4A/25"ASopA51D B,oiY:f(\S ٰL!r &} .'z{=FRbzK, mX꙲] eD ErGX^"+2RJil_REMl*bENA^զ4V!y+UT. Y>KdzKqk H's/ S&;;J&(=%Ex& hr2vɆ|kݐvZTO|AYBnU )g]xZ ҾR*hoxL_0.b`osIeFQ,|x6oAVlI#h'eS~'Έ]֔ojZj tE3;а['-n2bSiU\CqYKa@tMSsD&6c /'Ŷ.RfBv|CH7h<$S5J J{7sJTCCIϳ[Lh"ZCABcnڎ{D7<ʺ +U{`2 I[TaP1y>48.'}MDMZrBͭc/TlLreAzWxyff-sFoC.Iqt~k@DSaD̵sNޠYV6<Ǟ%ԙȰ5IsĢ]}d(a.\lulmyʤ_j@uM. ]^,>!H'EyTLԒɒЊO]ϐdJ7Jn,^J^ѸN*Q! iԆZ7 PT\Vu޳||كOIX ISl] \~lG|ȌhHنȓh9  DSlW -fqf]Ef4`i8)φERtqεGK ^MPst}HV%Q_5\ۭRhAPPACP{؁W.Owxl#V-a_gFIS(o0йu\u_YK h(p rh>[ޕ :#0]ȏO&9 IwUخR ^2AShǘOEUsQ Q8[Wau!zY9j9vI9 #pX- 3Pehx}Rkٙz W2? Ҁ՜ I" ɜҖD WeMI ^4P]5HALH?m>d1YWGiS!' 幱F բ4Kҙ0 &(|SₔL =y %ݰ/2#q%g(ՠ]l:֘qy gZH-GP& DL!/ez)`]dK If;h08)@Z3X~|L\AUQ 9:|b UhdPq8um DG* {X"!<&d2, ͤ,ѐ'vUTY\qikĠ>K|b9[`)Uͨ@Gd vy(LӨ" ]Kndzm榮dD>7$]pVlA*aIZf)c(RD^)U}ΉUΈY#ƇWˣcʶ~61dprzf%ة2|KyY>\̸0hM㹌Rs UdGی)\gXbfb9ڔ$_t<kKFچy*P >W%ܕ)_xɌњϲIƎϜ {ПY !`db%EuwXߐAZ%bQe~VfC_P[A wPֽLTV9JԦK`)AĀ*OSllLōN\ZޟM hP •JHQfX,ڌ^bҎH-=i !W(#qL uHGՠ ͠'jKPlZkVЙ̥42Nd( LL{&H10˲2cɮզdtYNƍP-EkXU)G\fYuŽIM kQAE`kf->h_n lyd1DРpiDm玱ɡc8 Ӑ|X GRiK~VR& ]> ;Zq*&6bԡXJ0z)YfB {Dּ2*:/'=a̋%їlEFm%Ѽaj"'͙x2^kLwj~ ^\vP@VZep)C\R i˘l-* ; ̔^Ӹ.DEOHRD\ʋrDu Ar-@% S%ʊUA Lr7iə@ 225Qd$IS̽AŰѸD4ʾauaT feTGea[ e Rk/(U FwPLY""4! bt%!X8bƋJ$v0>Ԕ0W%4z#zb:+BlZuth)@ QyiQ "1DI8/%A|_,|T@ū밬;QYCW܊7DxDBګ/ĭ(;Pٯı{zo@ǫEzE;Az{SW؋ yAzC(;H;gzX;{{WGխ뻴;Igﻯ:È'7JU|C e_W۟_laCDp8LtⓄ+ZsJwAHXZ2~rKCԃ}nH_KQRw>@,W/z*#X Bh,3ì.DH/I0)#€r%)-fðk(!8Ӓ9s#Cvב!_{<2wߪ: 2 Ã"yO G>SF:v-  YMcIJJM8Vl7sֻGฑs}KЧTPW%W]$XdbjMy'4r3T5nr5ˌV!Of5*I/M?,Qe# Z>[n4mUI `xþd0ĀgrD#O% Gy&z),R](' y(n!}4QNݴNoQ!<z\QkXI)Q!~gčimz#Wj4 [0`h8ѥy;]99H ҐI"˜ UAiU?"PV5gϝC dd';O>dSRՓ|MC{Ʈ$!Ew(QtInQ*V# ^1<5%T.['Zjw܅_ Ǭ5[qSw)ty^A)\"U 2;**B[D$H} (PRgÖǔ?@f;dDa.p-(aЬg_[\#7Bn%ԈQs+ B bBȫaJw B&Rō8]i;x*O34b3KqJVEz-iJ\z 9ɥfXVxtKd%9NwoG7d ֩NeࠟUL0?ehLVJbE|-5ofV(@sr6B/͈ޢqs64;.$YXiʼn%jX;Q 6 mSbmK3bXX%^"`5L(6 웢HgP VݜUb.OGRJPdFgbWC$U)S@LPOP}/%T2((Zd o)Q#q5VlM"7@c^kW7)Eʉ9XPEeSc񘶦3nb:vn9pOSʲk Jo%#%Ɩs~ ]Q5S@xyH-XŤ#Q;@n^lcE9)Gl-KY&-duBXF,V&ʇ(^td垄 "u8"[Q H3Y h`yю+'x4V@Ju><5Ć$' &WNAEJI%B"ls rh"qe+97Jvѓ&.ebO찻;& W_}uS~= &I^|!m.Yд;B ܹwYS 1S{I?VT=tLP`E d[h`)+̭bcH$I\Gڨև{؇.$`G\{||`evJ'D ;b2 F (vMNGmu#h.,[x4,P93M2,Y<*0>p%LFP#rL,"Jn*ETnf~*"o$brP8A{BH0! - 2oQ&mP0&AVGNւ"6'HBHcd0'bn($2^j#\@ hDF*6/QHCE6I; D3F-4 7li %Fk,bHVhnD$Y\\*HFn@8/t(Tl6Dz:FZfv"b܊j!¦bU`(=%HՆhl'MR;NvG?DH0Hq(18pBF$4*n+Q'FNkrv:!||enS~B/AM%ХBF'Cjd&?"`%vGf B/ M& 'Mbb1svЋN+89%jibRL2O*OZl"G4i.G$Hմ)v^dag J.~fDw8ݰOheKr%ʆ ߪ s홨r`f*(L`*܌̮Bxh}>nb'Hd%|ɘvhE~ Ro 2:cI0zo CD $K4@چ0~2d4Y,b#Jld@",F$͔PǂDQt|1$jDXӣ</!ѓmQI#$&H1͖D4;;b`4Frj4^bLx01+HfqA 6ʇRK$~nޯl,@YEjBV=~zS6n@g;Mj ̦6rOx0,>ntR/岐>DE| 8!taQ=JP$^E3 Q+EXIPզ02T @+i咆BLO;VBFf6e`.S,Z u5S35^'& /gg12i?\>(,3vb_YN OXgN?8B3o : LhHv4Ot "49&KiBPV#6pHb*<r=gf2)r͂@G#KA q<..hnb&I&EjHFM k+IyNa[nR땰(Tt hB׀ B( 8Q-/BLfkEp *5BɈFgK&BH/-*sBJN&<{WFR>n6x{ Ɖ$[AT_mZp~Bb檨cv#DgEҳkA"Uxy g,˧nevgaz)%@H lPJE=i#ISيvWyLpnD؏Q"d',UОzx@,ͮ(,PܗxHL0YZhx|TWN(2mfYSH&ޠf~q+t4L7'Eb1C((W26yEГoAn1@;ԨVIN\(Lֵ,>knlZf$FHvUX(-Il UhFxaqHĬCPuєU|օ e[+5CEe̓! mH#h§v|m_BSV;8{Z3Jud'n%cM[7n8i6s[>q2+OY)kG:(+6?~aowK[JWu/mrzy(zyX^O3ekj?Q$0G3oԤnlX֋)\;cl'LK!;̇sΞ/EW9:kOԦFHW:6*Un/?g!mqsSGRM\4kex1y!Rn tG4[6BN= Y9j]ha9J lHr5p[hsVYgIvfjzt=KkHD0t-;Fw.Y asa4wL8+xH`zɭb AZ甇 a\/wFFxIx&;+3A(*@ eEb'A = E &ࡢ^#!@7>_0=_9^ [~ ǀ#~]; ]5xqG'<57>^3u'^%}Ӏ R~e^Ǟ둾>绾aK>S~w*^ x9/*>*~Sޟ_T˾zg^蛾޵s^''5^>s~qC=;S >}~G9Ωc$.GH(3+X#h% 0hNȎ3xf%+L޾z ܷ/BG ׼ H!频~7p&lJޛ0 r|ɎkmrJoMW*^<^xő(2'2 Ex-UIˈ2=TἹ^1zKl2.Mff0#^J/ء:GPf3F:q|1p{1BO:"~o߀W7'ԟ)0]IxJ(IӚdst)!VJ(Fde˟]zG D[c5< p^aC(goӖ$D ;ENW˕wIbTCĄdzUCi4@#¸[>Gv7ܢ8 1q$6E5!!3yFT ]g$jEsu3Ӆ9-zڛ&12Z42 }+CiXt3& ¦ƸuB%@*!Dp_b^24/{B:׃pK#;Hs5ӽȀdKr1n\PZ5E:aUZ˕v>ko;׾VJlyen\ꖶ]s{ݹdؑ2VF2қ"EqoYw?[ek׭~BT=.E1 @&*GG+ؔ(qˆ/ xJ 24Vb $=^*d& j{yȟT؜+\0X*]OsӼA #O87*P@#aEsdW2 "J̎d-?XQ +#JI. t,Y6fi :7s^l47ܝ ZN>V0cș}xQ5TVy1gI ly dW$(_XIj{#6Eɐ3EM>FP m-K&gƝ>74Om r1p*r44Ҳ.-j.%bɥ Z1fk&UV5-0EpgF`eu^"qXBcЈa3jeE*'[$~QSFlҊ45. jA}׷PNGlowd|klM\kaW2BdD)аCߡ z!(w's#mǡzazy%xte-Q8zbA{*1g:1WAcM*Zi<=gfT/~MBxYjy͡g qmH2%!09TB-ȴ%:3b8qlV:QdwD:&Dl<JT1"fdIx)&@QѠ A1Q" VgxJA SWOGFWS7vÔJ<juk`:z(Hho/v#LzŃ7nʱW1mDin񆒁yȁ3_e3wF8#Smtv2rv<T&VOT.(N/ؘ:ZU31t!bdC,>Qb"l،֔ dE|CT!ile6]=BT(:wsIP&9m憗CY'{yBgBc[fQ9AY{1g{Xʦ0ig'=4ESthq,3J -Ѣ5dӑ(%Y]rt2`l4bbC MڤpJ\0ʀ (L?|h $'`@‰PQ. <i @/p 7Ӌx%r8CK [1 {*012q/ JL[VШz UK-5胑:0Sbnw.THX Y7櫈8(8 8.^* 䈗z)>H:hzK(*?J}8+"dDXnR@ UڐV4iCU J&@_"ot2% )RoaEs,S7We v u@=HE93kPq4 xb.`{*WDr@V"аTYa'ƪ ڪB᠊,%X:Wp0~Qoѵ-}1|iphR/V*~z+q2a )-؄ev>f@{;N7W)BN1 A ~02[p014VAcffgsbTAYJ' -8tbAgm,1p P M U r(J}p P& $`k@;& `꾦%˱8!(k_ yz y ,sZ( ̋xӔ#ϰZ+`4 +J{çZP,YR차P\p> <".\J`P : ?:杊ԈMWǖ+$[=N*3B(q_n; ; n˸8 G=gc<3pکP`  :`NϷv.2a3h)UbX,- "R$,cScBQAoNMZاjhsp A @pO!>8L:cMDzQˡ01жѰ'];n ͒%E"JW- B˪;0<ٛ'<&C 0_ *At"! L%``)^PB˳% 1`>&}_ =fN7 所=hɳwPwb2.9N>k>\,YBF݋*R?7 ut[iNZS*)<&,P#ĻZ)N :9]`Z%m\` ~po[|C /{<}q ʰ7 "3/u85`o Jۨ>? nnԃ;3ӂBn4p= ֧ Zq 5/G4Fr@cJپeE{qbE}i&۷/d"9iYh^}/y\,ZMibKO5Q (LhQ ۻ@FUgeЖTLgՖK/)dPN)jLhvgP ;@c qSgLX+Ŧ޽0zYLY*_м/)I>v:Z'<#x;y2Kbޡ*ߖ8/ ~wǗiE٩B\Y}t.4ƍ7%KY!g_1*{).*Pei8h SHa`莘d0N@:g b:B(lꏢ( I^∣F#k4(J)"*FX'Hc Z^tQb ,h9Ȗ\S!8CLhт06)N;"nj=s έdHY7tPO(Ŋ`"2/f󖩱aM&DfzhIP1jh&Av}ؑ杗h61؛l4))|)焇DyLX&(@''KM.L#2Kh̪,X츊Sy$zY z".IG zvbv*ծHPgc; JxzN17ug ag(gL2u`.h0)eCQ>>T8Te$ լɤҬ pyXiUloLa "S"'oA{C[׶lRfe~̽Sn&Se flwkr!ʊ Pv4eC8S&ۑ1. /wQX̮ Ȯh n0.АKM,s)\ GF [-C Y %Ĭ&i z$"g@>! iLCWp4$%@`-K4 V(Gc@[K3&ı5 gDe" cP㪅$R)28eC,D2X )},B8d$b ccCI\pI帐# nTPEMSWI?v>{J!Ȣ豧H0bh2Z/c}J‹-Cg2:j"zҔV[08(#J7_*8WɽT+Wb$Q3/ tn83A#S24=`Ec$LG+2.bwHD10L N ԣKf4.0qՍ+!I_Yyi<"`~“/ x#* IVziB W) l\B=}ht_֩hu v:ܕ#t4hs,:". -ۋ~X\=,<ó0T7\񺏤$;z?NVKmfW.p#)bFĽ}ґQxXɖ'|<(ȍ݇' ODCFhVRxTf~GfgWd ד~B},YWgiwviX[[-jNe9׾5(φϳVT<[^aKXVq#*v=k1s]`i<".M 㔧&9qT^_D#NϮ/Q$(j+UQs%w~mþX&4A#`y:;ZKUrZB@*;'H3 @ !b"C: `y,M@ @@Q(@$LHJk<1#+5H*:XÛxSn+_B#鋸]"J0s?<6i 7 >pC1rA!H7hÏB).t9sCJ 8>!%l@K‡`8H4DK a) ܉4`f [B8Es@t@Թ%\ TK4еϢ c$Fb,dTE:HyE3$p{4TlAV#B* P7B C:I=,48 B 4[+^ b4t;7Ca#, Y   K5lg2#꠨`7(Èө[cd˃1C^ ,B}JLD!aG)7D̋B7G7C>Nj MCE}`IBICt<v\мɮMMk!L@tNΕLdIҐ@R aɕH;J4}4G{ͮ#@tdO4ż3 ~$_Կ] K) h: ۟٨#V ƛE#   Y $"I|\M=D& 49|>a|BH|NǸA4$P -3V[QXҮtҚexR%R`%R-RbABR%S1-S253-*5R3-a9R6US(]R76S7]<=*]7z3P"VaC.]4-dϱTLW[Y$Yjd^475 L,̣`|:ȝ9X4$R^żM1"M { CH2\>I0EGIB4mMIȩ:CC4t[].mBBטcR= AYC4Ε$} tN{ $ AEX~̈́uXWL $L* 4ee; L{ʨT[ F^%r` ѱ-?A385 sՑIJ(LT"UA`jDQE:%jկ29zba?\($̻̓-0OY8<:\]\%Ca4+zM\Eĥa\ϵ\˭7ȭ\]`z\Eֵڭ\, ]߽Z@jԐq [:+ZWIT̑S<۪ ГmȠ$"a:3lWIhsɂ[ uMSڲZ`W ,O`3 Vb[G~%TSMA}S2R NM 6#S^~'Wc>[anR{E(AkNVP@FKlr~Ie$~ȫOE]s&g[o'=+:\eX@a]dWT|=Q?+5L,[ y^ӫDW=Z4Kϼb!óh\YeFYG{Fˍ.7Cd_hu@`$ e?Uecj{`XNX}Tb⤑jMU t Љ.fK- _`Ϯ$HWea 6 _EkArC3|eU읮T+9v.SLPsE#n|Pfb'3+L^l|\MEm}ލs]e:?;ޥӍ]֥sm]>g!ލs\47=G]Ft]AI@]^i;lUKZQ;]V^+ah{ dT/oul] +WUmu5.Y#aLԝlC6HӁ41@k74`אvAlowpjv)0iguOSC1kvkozv1(0ә1vm?wGwz/mmoqvxlxihvrzkMryx)?r/IHyOyWyZywyyy/z?zy-z?h?zyb=< G|own?hw'wtgv_o{uolwOwGOwv§vO{mxWw7{r{lwwʗuzs|7|׈O|6Fb*F(ުjj,#bX}ַ>40`܏ןSJ<%EA0p%.d[ 2 (ƚ ad-~IubO2a# vd&;$}зo`}8Pa}.tpaA-"B!NLȑDA ,X!ʕAgPՄ2L; )t`OofY/Q 6%RVG`O*:sԛP-'Rjߢ tVV:T_WgUJvI_LJf.sΚ7k*3/͘EҜ7L]3fh1KN zvkچj2eͭnmr39SMїSWZ["׸q.{w )qõG^^i.%ΙuL^u'kZ}S=]g j| k_=-Tg`ktq <z|qfXn5`VaPivZdS&y"eUg%YАnhd:OBxTIy]ԉeibcI 4vZMf$zXk*jX)V)5 TA&jXzAiRB m/}&Ad޺jIRFz) )_,j5W$q׭uSj֒1j]9mzUU,2뤅F+gz4[njFr6,T7m]'K-Vnm:3Locipmܱ\9t xlWr1MՊ{Z ݦM$HLcY=m驌[ncF*ZhMMWnPthem;n YNzlHk۸":>qZN ~M)^>J7D*kKfXϾ?>@^!ٞSvHqAUz^g(W~M:kr=mj;jhdf-2.9/docs/hdfview/UsersGuide/images/menu_image.gif0000755000175000017500000017257112050301073023675 0ustar sylvestresylvestreGIF89a13f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,1Hp&P"T`ÅJHŇ'^ԘbǍ9 Iɏ(GTd˕.Yʌ&M͛6sɳϟ@ JѣH*]ʴ@-&T}Eê֬_JvYhê-ڳouKw]x꭛޻K4SOqeփ^4˓#cLysʗ9ksgҧ1 Zh׭Y~-5Ҷc=[ݵyM|qȃ+&h,Lھkv޵Cf:߱N~![g|d^;~מ}州]|{ A Mȟ{E!}e tetPu2BG#d3B:Fc.#7$BK9dI2iJN%R>i%\B^ ZYD-Bgc&1 &.xwI#{iuF}32z.*i>Zifjni2>*ꢢi3Fi=й뭺믻뫰kl&FR+m^붪iN&o Ϸ+ko63I #h0ɪ&c)([\Vq<9$toLhɈ*:AfL#xܲ$r)#Ȁ6sC+*L 1<+0ݴB+ #G3SLwR :cjM6*s1 8!$8@^ D`}4BNy6U^WN._e䅃N9БܣKz刻m8َ 볈y4hN ]C{,|B@!3 t҆3 aH2LL. F$1x\3UĀCԓOP$p)}#GcG(")9*tǴqe/lF-/ 06SAȰG!0>M2#at8&ÅSXN\V]NqSC0I"<Ȝ0@)8,RH(@'= F4 8`bD".Ew[ЁBM "ahqӤ IC F8xeOH ÎX/Sr(q2G@״c"EQH Ѩͣbqԇ2G\'p@Xph0r!Yh1e2 < Ms&9K4p!(6L1<.C4:Ӝ0 `x4T# 1Y3зQlF&D_=x]2>SB.Dc&t`Y2JdCNZ̴2 nJRmh ujF0\K'IFJNuY gJY$Q61i0>3&vRP%&;6!V2kxJ<ф Ā`8.MDS!')7qMee w,Xp N%Ї &Mv ͮt4 P5RMM:85 .ⵚ <P0fޮi 3f|L$_q 3q=Z. q no4^}`tl4Aa.$y'3c.~RѥپQz/ Ȕ!17G鶕 ́2ШУ\ƀ k#Cd w)##rbOC @/Oi $!/KT ZV9:_W\GZ!Jc~, I5541fpr1mbr?*}r&pL\jVٟT<GNY#Pҹ0hh wR/]62xL  W A-/ְaz(úMaP.㝴mK C ' вK37M/33} F-~oMZTjrj2pa<|272\ pLX3'Nz4fəV]N]_+TM㠧b0oٕ1^j٣e؊ |sA bo sw&&]a޷.L_! G>U.# LS8M;^㍃T1B+0u[o нsH#TOK{1p(2e~ׄ>]{ڎ~+7B4a7ynP~Ѱ q nd  p <p 33VghLx]s}m2gn#LZmЖ~gl6(i h<]eh;7M7hsV7m#7)s*nd6BI>YJɓJٔ1yTM9?דNEy1Ii;a) Pќ Pq:!IIYijnoi0 i 왟i9 l/ : h`i@ʞn )ɠJjP%: 'p|. ʞo j;/@-\6 @ ` qENzHJ A /.p(ۡ+0i֑MYQ'_"cz+w#_"t+e_QapG2t*w#103J#l&v$zrRAک  A aq:.'5M{rq@vyT٤XkFeRjhjU{eрGea !7e\AeͪYaUj{*//z*Ȟz L*Jʤʨ;(@㧜U*ipM! ޠ x@$`'Y P 0J .=y6{8k`.z0D#lQ"D;b"w".z*_-00[ Q1q1T"wX{$1©Ѱ`(`Kj ypKp  P #Ҍ(u J_ r 2 *0'1 AR6-㺰+)0PyknpZ¹?¨1<2\I{V:i 'ŵRa*c$¦ . 0 rI`(G5@_@ #p-.b#J|@ 6KeWxa'h )h64.)$*\cisAb"8(:61(bۤg+eH ̘ Đ ̨fjδB z. \Ҳ) a-f]1UB@#'mz" ю:11@ jIi[ئlPѴ͛˂5'"0>,RFR Ɲ0: M`@P^p s& .ro{*f*0(:|0 FjEl*_Mc= -׽J14>6 {߼R}ͼ]-K<(N+Lt YQf ["MA#mUF2=aCNؙh 2@h^qPL0,^KpG+ MJp n0Do@]p ]i..b0> \L ;^~X< аJ{a=jn"b0nZ nO-,{[ޞaG*VVZ Q@nq-B#Zʗ`ŌSuO p nIEd:` Uf p.(͸`@ F HoĐ ;Z`'\'. pi Mzoٯ_p7VF˚SӄN}MNoRDڤM`h p`niZg51H.ʺA v_jP,4-ӷV$^.iCd8or3ѭC-ۧAhT&J7LTM٤L!CBSXe9}F,&mRh"žt2zѠJZ/$hA+Ko_B֫oS%m,_É IMe@i҄I0p*s*L1h$:|Y6滅0B  ˨ZW.{@Fa͛7FѭF \T K15Y$Ai2-3SNbziMʩ2I,$9˨@( ?hҸBrA ˜J,Rԍ1l2(+F,#ƲVL:j 8XE4Yd8- 4&̈l2!J+4R! 򃊏i+z[&Zr7n40jPLP&VREÓqjlIُMJi@ԀLȲ*btI2+hSU\*֦{ L2adKޔ(252*$H4$dCn!PCw, R/gO5/M??:aDH΍K# -/DXXReAabiI~iS a@pN APU2ì•]g!IԿZ4DݮKK"+^,1 Me[LwF-l,kz3eX͏ vsMo҃l aI0 4H#@hdF$i>&Wߕ&QUC\IKM]l3!&0=+UČDΥooP b4X` 'Nbs(#ĘeRl4[FMejBKR d{RTYcXlc@YV_Zo{QGzU\ړՏh(2D.8 4VUFmp@%nN–!np/4t0y{Jz/Cw7ƒ%&"M֔bc),z$2fdY720|Y60y{F6'&ox7}Q+ڄq)&^{\xryE Ȃ,' CY`{̶̜ﳢ_i5kZ9%VʈY.Cr3Yu)v g>}vg7ς6tCef4%iF+6:SLu~s5}iQKV/OwDϚcª:'dԠk^a׾alevli?v=lgk_Cz($eO@@wun\&FӍ%6:qWx5qwPNНmv39w6EՍ܂'?o8UR(~Iʋ ݨG7UGHMuvSUnu]>/;J@Qe]v-gy洦)fUҀ7< Y‹z΁7 xS O 7~Y2YWQ/Ћ^`ws7 y}V Lf0yy7(nWrQ? W€:Fn C `4, #0L"[h0_ $~w `EF^?t!?`0>v d ꠿cqAɨ  (p;颾7> f71 k 3k7X:!<70 u9x%TZA'KRA.IP-@4о-. AIp D۾ 4-XC>1@FIp?@tC?p@r?7D!A=@D<XPc50l#2P(Ĩ70Bգ7ٍq0V8]4z;Ƽ8IKڒ>P0DCIH?F*XC@F tT{|C7C$??H=LG6L,\ yEf C`1EH<>iECȾcb<8TaSUd=%D c C4GFQ¬̘̾WAA@ t[xƸTT@ܾTGIc*8JD3>PD-LKD1t!OtS7K >CY䋓T[+l:ʼ%;OL4̽80M ƁȾS Odyp,[dCLDtC-xL7J$HHDludQPͭ< 7etIXL| ?V yPEPgA -c SElRV$LR4FO-.%̾ԾmK33 NE@=08A䠀Ͱ@#nDQ[P8r Peȇ*څ"a~H.8'\c+MUv#8>&ҋ CSg1UѬ0 O1DOI5T>.M?-1MHPlG4(?֌ju@TvC58pWuC|E!4=OhUS(هyP8H1}XPxt( $ ҆#`qPXq8AF1PŽSj˥*!YD7#c i 4SHD@ӿPP#DTP~v>raCqTC 8}Co{Q TyHփ:zXSe}H*yhX}#؇]kSH*h@S؄X8vR]^x\ќ1ZUepՁ(NOsRjHyDB/5Pe=;TWGZtwT6<>%vEˇt@K|CJ7T9+N@<@PH8Iu ]JB}pUax-؄ Ey\ zȇ$e7rU}U`M|W]PhS`P0$PW\Ś,YU+AIE,-EYIA2ztͱTZ1-@=$kG58aIWISqe_B G/p4@.axL]0U:EZhH]eؒUPFp+zd9`qv1%HXY9dD>~Xb՚HddIcY%a]O&4Zna3>P3IwF_ U^HDu{Dl G1c{SbI ^EkNUFۍvمQ5;>``wd݋-]ghds[MC8|YS=H]dxBt˔#^4R`O}6^ɥ7 @O ?.x@F DFwA\сѸfKA ?NZCMΩo si5>)NMQ$ERR}0zXhc>[PDz@hzPZz,ikh` lhmS>Bf \B8$h}HP$ȰM0A7tQ1P~0?>TĜn֮>[? =ĬmA)7`t&K`R%?67?f 1U.6؇zNqg`ɥ:FdfESaD ~OMVS}m԰hnsk?䂳EtȰUHL6d=ܾ|?M0?5Oȏ| oW,\BMc~+4_u7o0M0U+BhI}&ecۈEЁ:mN5DNw@>3^hWnΣT? $^Y[eami3>jF fF3~c*7M.~ !O7>l19 F}P=ٟSRLUR‹7U$CQӴDAT@NxmZJNjMT@fGKUAem~CCb3S4 E8j^x2ōKd6^SP5IHMjfY'qhI`6f:Ջed 0eKRw@-~CJDfgmi|TPP44s3 ^@K?>GG}]G5^B4kZn MΜu$u+XF/Z[-<Ci1Ŭȧsҵ_Ѽ6Nbp|T(&ysw6Ez`yIOTğgW\4TG=l C3;7㯬3$ħNj$Pπ/VӅEa|»:().ٺG8_$ V^idl}Oa5HרMc654Uu Hv,JHbC/q8v~P?3gLIx}qIzeF/Z a7]"DmoT xnVuː*LvİHj-=ѠL+nXj(ˌj\J2=HTHe,H,N!2 $aa[o(:Enمvѳ].:Ei

mWגP!%2݅Bն!'1g_Qbd>UK 3 5/CʓP[O͝BUUx=Ѣ)wz v+EaSc `)ahwn>MZXYH>(dJvhD_"d͠؇]h<јQ],28{ 9p6l]͎; RV8fv4 x?OdUE%YV4b,$డF4,=}% .: .Q$Br~$.TnF<l]@T7X<涿Y+|[!/x'B_s!&!K(xEC>pՏ>A>C}OF=_a@|fćO, iA&(&dB0]\"Sȭ (^`ՋAX ^<1x؀O\fIKh QB&ܝY-ِ\<{y![ ء 0RĮDJZJсJAy. B2ڿ W@!~ydT|MHVH1m\4,D4LΊ^ddЅO#pY@XGąK]hDd;C2v>%` v;TOH6B,WwzE2TZMjl_2tA+cOEB%^\:>2PaDemNDvR ҳ,$m)e 0G=M ݱc P#\ ְˇ^K <aS@\eI_C]Dua-BC<BIJB=D(܅Ղٚݹ'pY]wѝ]WwmE0C 4]:^4;9SHhJθQPm_Cܨ=eB&i9.d__@̅檸e2O ^ !M1L%4",g=#9xEbƹE%5:3văt"Z.)='{2'ԁI5A0 %/ub ~RvocIL G=YC۬M|@2c*DTX:ѠPZ@cXU YȀ0\EPX-QR NQ\n1ϏDg)fUdU4)ܑMxA9q OО CGBhS- d܂D*ȼG҅/RZՇ1B:cPjXPnTܝQ/].2]!VL(V'D<.0=)x06Qփ~ V(yՄ)hA2U=ȇ &G)e؋@^.<D㐇S.ɔ3RFNIrD9dЌ̰*p,KnR'Qfݐ.l1GƇ$m\`4hB(!ȃd$CYl ]GzdZ tX*qcSԢtjPV.r"ؔ-f̈́G]E.dL d.HI%S D^iAHa BL1|֤*=9(*FC(AAA,(AgLB%coFhOXO.M FYhPI MxnªQC^H9aa>biC1MzeQhPѐUotJL0=(;| =M 꽁o4hJB q06H)[|'oȊɘ,$3xI3HTɜD< tɛɓ<6' pIP P9W33G3oIp \KH 4@hBi,ůU+d WA-1HUHh ,I4JJ4KK2qJ]̈>}܀hEr+. ͺu\hIB^R Wt؉LBB' iHȐu\3 =rd>EmLO_. OPD-]ؔ2QޓJFt]>u  .NE&$nZƊ8fH*mXLBš%Y/hFd8 ZfLHX]2phBH7N(.rNЮ͸)Pfʁp Q LRv @@GCPBRuDpo!M\+ OIXk"E=xވ5/yLʄn.CpXAlbmPp^jN595L OwOMhńu(ڬ dh|&+:qP QS> GB]lAŶ"DwjpΆ18 W`]b*8s8LR_*뭒FN-O8+In颧$=#ԥ+$Z$9@&:h_PSLw@-_;e (m1c4Pɪq{3אZeJw= 42J/-M7lo'JmmU7wІdGx՜VŤu~,|yHhZ ^љ.md=0z|lN-ܰL4?PJDȸ18fp9qHqG(@@l jf(dG )aԃ/=8}ZV-> [썣[[%q3moJ8KI,$^љLUl0qk%M&89Pd݀g҅??FTuҒ7PL$Ipa%Yo;ZWO%DѧHNi,7dFkMD1b9ӛfQtrs1oORZ EH ׾ 9@ܐ4>xǏ7pBE-&F7Ĉ f$1[b(=z$M#L-a}IT)IL X1C5[^4zQ֮v̀uQhdDokzоv+4Rᵺoo=[jnoת՗K4vi W_-\>Y9J3]V+5֫Sꣻ, 4ĶћI2 0z 1!"ED)2**Gӓ%-xwfEKFk R#I돆aREH!Uh'O4,R4 6}c.! )8!kpAP毬pC,QF0A^̇Hڊd[5괫+ҮB-X,+l}-b!4VΣZA4J HC4a(C0@*Fb&!(~)%^ OW#%e/-n)Ԗ/΀ghljmǵ?ǻm fPSKJM[-nW纼dnX_]w¸J.ft\+r_Nj!|81!TD S6q_!Gx<I NX1xٓ32$ ;_ɴUZx,C AA5dI": \lJ⍿L d˥,kA>()IPMlsLMnf+~C&p! /Ҁ nbZe؄7\hM'%v=^F )&2 Н"$C̝ /V]FcNE ^:C:)Kjm3>"VF L)ҎNFpVB0F NmԤH'R @&bjc E>~Mz~&&Je#◞;N ?HC~ ̯6F #6$R&zb $ZR&Z2E)$ jnzMŽF0m,Pܖ'm430pPGfjNc5,®$`NtdFf  9Ebz6j("evc0(ϧrg <*8Nn [&Hl&n&@͈ZGlH3[3>Ȯ\öXĨƒdpZ3^p$(XLgdMhi~(V 2! N opl#H"b" #C/&JV #Ȭ(G>Z&U=DihphO'IH5` qL3|K^ڌI,sSK*]Ϩ䥌N3-_SР&etC x9Z#J!p 'Nr`IL%)>j >2FzfzQBg2)C#p1Nc]m@#]=&쿄6!PͼM66(92$0``0J,*jԀ@M&h$%'D })=W[ &A=r#>O# %"Cgp- k:E*$j`OqlN5桝bZF,HvMFX@A+NavR'=pCW4P5b*6h43!  }bO=, (nE+%ҀR7~ 7Z"nu"#&-@IK/$& UD-.2* "HVA#6E"d[DFC#-Hrec$R$-XB )s2vgZZ|*킨xd@! ca>Sfa3OWE]T)kRwD``Nq S%%CĀڊa`H@b~hi&J`4kZv@X FX,mXDZ7VpP"HFlOv)8"jW8i tdJ؀Ymo%p.d">xZdtp w^=juPUn7#06Nb<@%TSr 'g@a|T)>G1m̲{8Q+GІ*Godun7[ wCw[v[$}A"~NWkbqmjFIUZ?jlaqYM3F5sI`"wؠpgc \(ʊuh=Ü HɪQ#hn~z7$ Uj.cĆ-yo"2v! G^}Uq-נ@&e Jo p81&B6Lg83x60fM'"5ƭU.@Ȭ; \9}b g&%y# lc` r=xod],U&aJ KuVnV踧MUg &Bm"Ĝ3 0 WQcDXN Z9ۨe*GL05B}no4,[8l]S%U&QBQPks&DhXE#V`?M 1=gTȗCes#Z-X0f ,CfbF01f0fj[jqŹ1"Yz&R#%&Gs/nWnZbӆ7U fLy `hqbV%$RbNh i*ak2$B?:򩎨Z@qk at{D`X\12+(sa$Yeeta6PYiE\ڪ)[} mBFeIu)KAւ i!eN%€ &(F9p򯅔BQ`zd>v~%a?CH(JSU`~QeOp@A0l-8ZsCtJp2Lg0ss0s>s^sRc h0 "2C#L@DN&f<]2V)D'ĉxZC3-'-۩Q@ZY3qN[.>l^|5 +%^4| $"/V]^+:}.s<հfNH'8f4R<.T",PzH":H?GzT{PTnnf%rf/")\k@֧gQMRwE$Ե 'qxPa#: oV¶Mmgė8b jl͌uz%Ā&̰߳=3&?&A&p+ bzՃf0}14p>hE;Xo" H> b"}-Î5 YQ>"?dO93(2Ɍ9[ɔi1eb 3IR.Ġ#W1i$MBaiĔ:X1+nLʔ&L b&MV#4bl04a@E0TFaL63-1bMjD KdY0dm3lxG@o('l7TŔe_;ʇ!4<|F)F+Fy|)8$F/[pFiDEX7W~g$(3X/_uaV!3U1h1p a,("bgQ(iFA=vtNM9H!ӑ-On%[ELqPC s 'PsFTl4F)zU1%iX6G1^8 b" aeȄS1b2ʈ2Jh q6gi\iJZ C**KFkNڲ?P>[ZF]+-C&ˬΊ+mC۞[-̦mbھ /wCu z^nq2*~7lu[H2&bHX+Պ ÓnqUm"b7CFtJ/tN? uROMuP(O&j O*a8LU Ye" e5(#s92L 8_pP*X0 2TA2I@XT4ϔ&4+ܭ2jza 屔/(@%))yd2: uA9ZЭ',pHH%ɤCa4qLB$E(l(%V0s/览7 nngӚªXqUn<29-18tJ 3 kҜuF)m|Bb2!)ܔ(CΖ"[P N Sby K8! > 4ebW4 _Đ/eb"m!fLfųm,0p@^%jm;ЅMS$@uzZ!1$u fk*TS{[а LO$ Pp 2ސ׼5L/31 M,+ӄ\b|a&L&Ջ^"1p $ň4{Q\j\[2Ǡ]EP$E#ThA?ڭd` &Ī3( 5;Hat\B*W.hי}!p79Xr}nKτƠa*JVxͶUT ؏c g; CaxGaՠB3ѰE(`"a>^%ʠ$2a8|0 ]2 àR׶bM J4&*Fa߄Gs#SvOe =#P0,8EC=DޝC4~"AABo5z@̾n01@+Eh4 Lۛɶ/<5BĻk楔-@ `o Qĉ.F , .5@y6bX9+ _H!fq䏫86L,"r0#qG ß |/"x @&%wgh x H s7 $W$$:$SNBC9C#W|kEkk70_<= r| "uT=0?2Y3ZwMA6QG:g#z)O}]k׆p``}6`0{v&b\wŲ\#%\ ix ?PP6;9&TBGi[g;muOQ(zp kd.D6i)6 SlS*!4rmRH+Fw`̈́8ċ4#;e@+'9T\$P ;0@@o 8w1  jȇ v@fPr]w9KH!PcH5tH??Jp Ѐk)'G<7 Ri 0sa>l+F#'bQ8M(bE}M54CB&H9toh G ]xn0www'?'`(h~owowvp7JQ]hrjbr'&g9trH)j]p ^1>{iJmEc Dw+`v ,F_3r2b80S+A2`# E!"(M(8y[t.vq0c'hX޸ ho Jv!ԩ%Ðp h99 WX 0Q r:Wps%p'#NDQv 6k?d Iԙw|071_sNV*"@,S)FN'W9N+Cc@34z۵~DBh2 "Ȁ9q`   €60`?P3$\uz3j=U Qc+yOAFPrDFd@zjzDipDy{γ c| eanr"e6+qU,?&g+RfҘTרyt$ajAIF#PIQ$a<'dPŖ%Abyrw&~j%;V\y.v\qA%i` @wd+kdps5tYĠ_#&- dM*GRm4bhC)GT4YBB,!#% \tB9%yIP'O$Uw j?ddFr _*,?J,*#ѓZ˨+6 94ΘCNeU Cѱ 'f9B#%_3#[AavA4ac"hãH&j`WXv`DfdkŒDT`mX1XN+Z*RBf`'BZ?@jN6OAOz.UB̥O4]+AOU䇘GHh;zj;j@; KX7pB; yD=ʷ*FJ?+!,-*LG 9y:<Ƭ5ԧ<$UUzH~b:j ̫aتc]jX@0Ծ[drgA`㚻Ɠ?I80B#X <","+*Qa3+AtK'aby)46K~ѻU]ܱx:R"CwRNܚagġPWQ}F'ː=,!Ɠ)#,Rtc+!?y+E穈QU,bt auRKCu'܍APT]~!Iq{OɹIlrռ0p9p^pP14QoEKR_z)=+dq1&X4HbJN+=<-3It%Ъ+ӚeʲZ=h4фM4hʱ\.ʭUm͚Lsԩ;vcH8pҤyC8BW!FL[n0ѡ!/XX;d /y1J( Bt"x̅m8&R5`1El-,&v'f &Q)zbi'EQtSň}y+FK8G}0ft!%cDzJ(a]QJ|'0G5B9P*2"͖L24D - 1$|Mh(,B.7 :+{m_":KKYV<%Mh0d 9%#Z2iG9Ô}x !.чuŋY%+cI1 bWJϭ;&r74; qd*TALX(! 2!h3:3\9nLW#/#-9PHbgKb>NTPbdS+hĊRؘ+P9,yL<@YSv2EE>ǪjqH٤*g msaV 0ٰN˨뷧J;k%+koC%44e3'C*.Li8y#NH,L"̮@s :˔Ήj•ʺg*?1Zg rY &qX`,{Q_bd=!-ZƌkA2w R~ 6eglG2а0b blYdK)50qaNnrB2gns;mtS="DukˠB;`J>DÕ(1hvda T؟^ (P(єXG 2rw<`sH{w❰$ڃIPڷ@eDʀ~(\ F"2 m C޶8L" hGo”*sbzJ"p&2#dcxXO&L _ 'pŐGn`q# Pt1N%IA)ZF\,fTʕ;}V4I$#JKʩN1m_L]ćZ<Tuaӌ7s7=  ihOmMs3HA)G; #Kk> b*ROTr%{Ί8-VNb fA~Se0nZ`~2ڦiڤ0̣5uّ ;[HC&Ό-0гXPulx " j~=p]*&)D^w,IRmFmJroa΂B-Xs(j_M%DXVa5iBiN- I D;qΨ9A6*pW3e"(dA[،Kl#w-$5$loےP{<*jόÀoͪS̖.vLwZubꀿDjmԺIB9Ґ M4: f: 7?j 6y_B6BwЌdz*@cym6&j4-;;\-l?eyVLj4,E-fQh<̤ѰtՌ`+Z]<^!1nrSH2uZpq@k t"``!p/kfaKC0NE[KY ng.hFkoVjɟUCE衛 I(2qW6:ލψ@\P .^{c<` V,Y?hKlv˙r/{Qmm]=vnw57.b^ jV vU4@HSFb$ϼ37xdG}:=!+7+?ڒH4@ TP @ $ A T2@ $ @dA A@ЁAA $ @ @ @l,A rC#Q12ChZF AҍPY##C$A.( CC?C@ DADB,DCj ;`Duc71Ȉp/3a5ؗN3 -#K5C J<9C0Ȳc&欵jz**͈̌P84рqd/4;̹)@$+žR eiR&BPhƑ=D)S]ai,T32ܪ}S<,#oy4J\RLlTQ=XC ĉ(ҊK;2] 8 tfT廊XKh>Lo3t0_qMRlDU_{bS I*Js37@#GzBP|Q2B\TX >~ګ RȪK%@"ó>$Ɣb/c 0f8Qܻ#Z YN$3*N8t*:܌LJ#|˱"CҰ؈t|  Ym:[5(`0&Lp5WP8+PE2Z9* F,[-,2եF6j5IF*#\ȴ70=A5AJLRے|W4 φ栠(עx E \هESzFɜPH,h s&}YFF"Ћș0;<F8oIم"9+h2,ݱGR-3(X͏2/1{$ku4v`SЊ-؄W h9J'"+:Id* ;LˣæҸ1ץ/, c >Mj7# :!8 }[>x`̈́i Fr}QڟS<2Ҝ$5;1юHȁ@hڔLvaX2a`\d˳Ñoԝ h;] ,z #n)5!!}9H#wtD3If7$ +{ @T3bO^qEd\чB"a@̩hp<&B܋P%ⓢ=*P&.0n_=1Pgh80,#ULn @1#—7EQx/D >9f nLCe @@mGaMl.ԑtsNaNd]L,v 4WnM< ɧͱX]ST]M0ɫ ʫam7Lͱ=.1Έ΄Eb5,aɶ*ZFՑH9JtHpߟ IN^<;Dؼ _aZK;l_sǮ.7J vV󲗿q$KH{[&fGO[*l>% 63lPeŋ_o:g$WP#bFFjX]tNb301iNO@#y7k=Vlz!,Bn`^KK(8-qn92Z#o«;2( 6I1># 9S3pL4|ZOYW#kLŲ=1UloDZeŸʪ}͌˓ ;!l*|$݆e88(eȌ. M}$hT'2+8cs?[KԳfڋ(jYN-bZfNWL}oƢj[S9-`ES.NtKDsp v:9<̥3C`Q厵CZ1;1aǁZG\?icv@Nzg?^3$?ޖ|HkY_3Գzյ5d/4x;ɷ(ٮ(2 zru`Rxݭ՝K>/c*(wLz}'cP*4װ^3?a; 5}\$o- yH-xEX~Y֝ NL̈ 9P(q Ɗ00X c8L 8F5,8 C RXP'>0F ФF;}Eۧ}@-ӷON:uZZϡP3VzUT)үgj5thٶ^E۵?-:4)׶CF;0ѷY]kR7=;vJkhv@ Y\2%J):fˋ,@-RƧWh=˕*YFͪvoZe~=kۢvůoӼ܃Vjhf'`jSMaEWUvree%PjxFٱiiw*ePkD+*gF)edDRH&H 9"8NE3]Pg3^um]_j`RFZWXSa!ci Xa^EUe(՘kIY}x~aufiVvhɉڐ4QI5D)ۑ%CG%ED[ 7hO)ga`Z柝u&|6k55Nziwa֮U֓zWxT|*%oR"vpGFfPM*0)]+4qJ 4ю%:TJW4 "? c+z5E_R[ <2_`Nؗ~i gkA[䶥^@'t¡I(hrZhFiCX릣+BHJtDRl|rW*,/9Pj@<\WR'Yeڱ\R~ߴW`;!LuQ:!%jY(E<(i4PH:qlʔb˥HLb E=7zx;^)20 1# 8,++>HW,)1=>әӥ=KP~u.$ U>>m1l3FHz#x3I@2!ԥP$$+d6doHĉՆV2gfY/`5Do"~q\EVGcq9:Sd@3B% L[O]&-NZO C'N鏡ͤ!7ӳj3FT=FzuDT) 680fzBmt8$0iK"vP( 3 |p!(#BAhsm΢v𬟳KYP|>4iGs ZL<+;38@nGwS)HGn7.&"ĉL٪(eS+LJ;wEsw #9:PXK"IO}S`] -5h\/O:ɰO{L2GLk#QiesJBIRV/8[[v4hJp8-m5kj cQ ?&WPacP t@g1 4>T-{ x)*3wRE: G$+ }DTaViߜ3aO&(.-M,R}$Âᤇ>vC="v\$څE~`-bBknJmŭ{.cgojSwCС0,4CfY3bpRӀٿ [Mg*訕fX,!JNAJ*~*w"e:=鉐c<ҸkRi=1+(FxIZgXsu^[d+|sg)Fd\-]gKG͎Z"Ż"Ij ,Vъ6(ςN& =\ !e]ߑwׂJO{p׭LȰs]WI$z2ʸHFxes0A_v0KF჈^a܎IEzSB.@ܴ3(f-JWR(kX g~o(Yu>[[V;qq㰳aI B4n`4yJ276/'N'`X>-l6Cj:~b:e O2RchCR꼐ċ,@@=c]ie-_IOtIGCO\Cl=U`NJ h=C@\ ġ ahQ%l VYRmRȹy_ YE\5\PgFE*>7"rB+1c]eTfH 2ǂ C XH$ )K!PJ DRA(cH{DE:u0UShyEr#}ߜrEEݏ=YMNCy ]TƅeټAnAMTie=L kజLVmK$.˹]CBeE͘hWxPeRŠ_)f1=rae -`AVԉhT ߭ TL #YHN1sXPI)!DY24݂SܩCҬ©zK㊢Zx%KK)VeBdEW͟V&(kh@DeDF†Dghe!11)}^ĔwppaTaZEETd]=r#ƞD )V*,x)vYj\װƭNj]%F5f1 E| j rDuc6l9\=K<Ҏ- `PsJª_ՕSFVh f4WiBި$Sq0ȤjDD33lj<٭. \5q"*­a"Ӵ-݆ƅ̤ο`H-1(kC:GLɦˉ.%߉ ikXDͶJQ('y \)/.Ś͉L&A!B䥤 kKoLH| 5ajZ@l] j4@H:AZS%jصW :Z0sG|`">ƲڵaB)aІ )>V~ 8hld/݀vҋ 5C~v 3lgr l}ܒt{ςO,E?I/r"*](tf&\dý1ܲ݉zܷ5n~l E|E en1Ҳ>g D}\BB~J*mxs&UF.#DZ5($FW\BJXcb!gӟP*Q4 PRt"40|BVQbvD.Nj]FeDK45a<ˆC,CTH)!.YLW$ v@m>ёY v"%% j"'vV5^u`TLXʹnbUوnGA(D ɳkD90N hb>U5S쌕 4tNmB2x*j/ [^&AuaT]ֺ>%x.- FT&TbGRDCkҐ8O7xaE ,-Bc1h6Eu1:-Fx@^𫩽]0ǖ-|* ;PK _ "NAee.`ת9HrHMiSx™ٍϭT7kiz ά-"C!$U"^ n/\І۱" ײ"vc0n%vI`h,8` HQ*' *\jRo\#YjCpx[) L]<6C縉 6mҝ\ýt—۹ƂFFuB@ԜIn.J3s\ީ8|A7Evz}uEw{A뤼kxUM@VӴқ%/@kޮao﫤 06G+|1D:EвIZH7jKn~iR`]rt"~)G{G=)9j^Gկg4ׂs\㱠3L'+CF0 !d }ߐE9&~)]zՋF/>zf}&T‡elH`E/v2ZE P}iJfDb΄u֬)`8FY#N1RG7p#Ɗ`ax#X`UQVX`WPqlٶ`mv/enY钭;oԨIF6M^$8pO͟9iP-/%ˆ!xdGS,XgKz|hx'ܧ1ƒwFԦO>t;8uc+ m=n  #zk$,@Q#f#:z'6B4.Y{>qt#7 ; 502&tD\;N @jn#QêఊZ7= ,,KAO2 =ւ1N s3'hGd+Z _p%(D} 3s(R@RR2hoCj5b4PذsR\"J<$3I $T.+sh}+rS0l(Фӎ Ĕ*Pq2:miFn]>\ՠ$6wjTy-28D/H"(좄)aٯe `X +Sk ;4"]=lO0.U=j(duB匧x6h8K7YN oz17P[wkaQK3*in){#8{R`([f&7\%kÒ:,=qz0³5}j9H]bRT'i^1^[l U%ULS:݋g5F/.؊|l .&5ʩ\L~/ͯ,n1-4RЯ6o>S ɭLi e,-4Odpi!ɰ)&dpk2!Aj]+]e$9/"iՠҕ+8VB0 lAEt4.}Qw1e,u ƴ,RW¾х0oO~I/?ˁՠ!'jW9F۔4< 0g!.b"S*Y2;UubU{͋f6,/ AWqpV|'a%&%#E2Az.F~ IvuU;Xh?0g/B4$!)In7%#G7j }0+>'ũѼ"hYsKȥ-'{ٓi"Ey C[6 }pm4 *=ATe]Fq?h(w@:KrUk:5ؾH#kCeC U6%W[I h˄cT ~cVT&//aG@^:BZ㻦42PAؐ΃G$Rs-">>HvHF Z2\٭T$CHkAhMnhE=*!fQK.iKc`;qP,Nc-r|y_ⓗ>&.պ'%˥i˚ ivi HzX܅ȇKBbSq 9hDhma(7y}4iG_7՝(蜨Qp6VH9z wtʕsMe*h,׳mϲ8grufjգfHx jU YH}shU1m:X&\e\XCV D10. v$njȨ yFR(x!UCCtH"gyͬ'?[.u)9Qe Ϧm4hLS]khM{_UX} x>)PWP`A⠏ETD=Ju h/NT-c/Nuydt^s94slH;+Q%"A8h7/}˞0Ene1Yc:y洠,@1WkxA$ym6Z ,xF3`7Tï ɦN(#6 hkȋP"Ǣ(mt+kYB.f_Icr#{6p-u~DGcnjL(?\Ƌ.'~$< GD_pBpC<$b()Ftx(^zh! " [rynC^8 c#Jex^bf' dm.qtir钥.@e#\nJ>E5 +EFSlbbxpa<`qm %FkL a0Pp 8#" d~ÿ֨#/~g耾q\X~̣π1,vzk"6MdE KI,z2)&PpZMV$'vzXzp2IH#B+~ ,>F ?>в2 &Kq S˳0`^| w{=;s:3=S @ϳ<T r>=*" hsX KZ¿ʈ>)LBrBu\hpi1r1bTFgFkFoGsTGwG{G}pB<2ϊ@  DGO7lΜ%A'L>h>1SIrImfA5Bg`Y FG2TL,>7}0LOby)x) `#u~xfbu7LU6`2'7e$DFU # "%3/Ww##:w@ߓw8?{XsX%,r%V%4Yc:5ES =r@ BQV +JȐ&P3eqD S;3ُYy= 9?#$ao{OhllXe"<7+e'I2Bʄc 3a8ފ끀 &XrI0"'&FlI”ٙ-4J'}q:A @A.,`պ`ޢ0XjeyAtBG!)hrb!?]$":X@P.xwr"@W`t-W_q3!)8Y ۈ}?԰8|Jl˶'![nNLj:nY7 ~ Ba럸b ܉Ԕ!`to68jUx&{GtYG" x+a BİIMۺND ßZz Vٝʻ4BZ,%0%!8w5R+![7|!EtCbyh!v!ڝ`ę_ܻbS`B-:l+gʩ*4yb+V}MezUƒ!ûi@IB.N:) jzwk-Y?mB(@ߔ"x|LӔAL"Z!ϙ ?̽K"*S cs(`)˿O=q5)ZMl@jn>>h(ڞc=!ڹ[ݟc`.Ō+ٸ!V`4m <уNiG#C$ZQ]F-oДؚ,!#aAiMYlFCq#!2bn8$W+ÆD>M3NXsL2wTA-1e牓ri%tkU)]OC?= vs'`!3Vb2㗞ep)jo.&eOp}aj|=u(FsSԙ|}UVit1݆T 8 85sam MBigr +9XfxbG#TXpr=NPնku^9vb;y4BUjF7at-ؗeG5!P m rr8 Vuj_si7 GC4E~t3[1_ [>ы6P_ B );XpB/2L0ھz$ )z\ӡ}8sɳϟ@ JM ܷT#N_*%I>TxFruөLXƏ0;~,5B1*uƎGfpm״iI5Z#KL(KdlHkJJ:Ɉ p)\.mxH7>7s^Xݎ,׳KKSGQУK5.;.uۂ l(%*%iǍ27\x߲k}ʚSvG魷5=!c­7KEzͷT^3u Vy'L}aH҆.M,Ca!ePE %Xr YF]&L6JYeVBdip)$$9݄Ad_6&_ aiBwa5|9TfaŴF"Ps=TڜftG)Z1Đnq&pq qN|`~mT|jHg[n5 ߱Q KVkdh\x/20.T=i6ptL{fgiN)V1Z[Y( oUqazMI#]Nu >aıO2[ )$3"ƑO3@3O+ӎ <8nS%xT/uȥ$4IkũZD Zj ruSFĜd}6Sie wDl[7|}G8EnYͤS-sO6oa9D,G4ͺ.(7\Hy<"&Ֆ`Com0DZ-S="OOIW=[_$=h~A}EwVX=tSy%IP[o=pU=>yK4@c \4͝B_o)d67\2u6( g%_q%91ݤP':Uఇ8aG#bnSQ Y&H&jU4>˂'k`;ƙ< iI[ړѐM#Ģy"SR=e@@0CI/H-L:@0Vz<t1Ԛ.(=7 zڳgD^R j5ntV8`5c.́@ }2XFF&x1FWbYHt+Rr>6 4_Ob0r %{'򕬌YW4q*JX$Z*B P!fti_өF]ЂHF^̱E p.29!Os=7̉liZ!^~ppl8x"@& &Q bŰ$3KɭfDuTP"%' 2H֫e\< K3ء#zFur5+1X64>D6a`n5C)H^uW8F9e|ߤ6VkgPVXHjyzﲚeFxQhFI@TZ I_ e)aLIS-cyc2 +9s/KY p~LqBTeG͓BQpMxdݙXuq- [ (qI%gN{i4=jN:ԧITհg-kO u!uKKdp*vT#`0 Vⶨ}V!!e+si 5#τV2qkr߱2Mnr{n}w/C6wnx;~7խoyۛo76i98V̎;c5F!r1XM1Fh$,W2h.Fw8w~=ssrGGz7}s7}hdQr@6xGV|"Y1gg5.4_)RPцOaw\cUr#PUOmhO6qBq1 9PCZ1df!K4 "E(!6('%XsHwdGHw, y( lQX)۱z.vQigzxd\/M,S<).fg"CC౓B8l1q!Yuh^|{DQvGXuRQP&4AsVP*/y|Rd={W%"VQ/f}T8Ʌh E'4qʼn8gB*$:5l4yq)T9'A&U_!HLU" !H "وMYvgᒟ\P(wybZyb3HgP&g~qg79U, 1yhm}oUzQur"Z`\DKcsɶU&/W4d!( 1 q#QgD0 Wbc=ngȘ3Gul[cԂ/%D6B)E4xn8U(18;+^th:A#07 ɠ d/% sdX UbI"Anyk2ݑaX0/2y/4"`~X r.W;5:q&^ƄOУC6  ( XÐ3 Ts**à Ā0 ( 30 p0'7ʫ:čq>GS ]ğd(h,7'Cx$[qCԈxZ0Àc2vZ[ @ɐ S, vڬ1 k@ ([Ŋ2Jn* G{EOf)a2 ?(,ĥ6` rcDsRDB܊ &B5 ,ڣ0 `*[:Jqz v{ A #C f _JG3'MV;JrGlX -*2T I$QDa5A'˜h?T˂bB<.[ ЀpGF?K[3ʳB(8ڸvg?vHeyzgiI$\4AwʈbhhyT3䯱3 ʋ B#AJ z+[@,{.#{Ǫ v{ a;nƊo0x֊|81]痷y/Ps! 4Z*~iBDivR Ħ1TnڟagX Š =J!k * {;: ͋6L&J\H9 !Y'Z%3U!%G ,Z!cX5K%v2PrH76Qw (^WN`АJך2>#ʀқ: %*0,k) ֪a"O|ƔvgT.I4&6^~Ѫ-$R z'ED(U8PJaK8A",h4YO.f{!(EU,'Ǧ8``$w|c~BA-ǜu{4|%( U!Q_D""bh~ȤYmUI8H?B,Uv3*tAq5}WSw`-MV. :LyrUԉ'tdsih)4,DE V:ĸh/1v)/4Y׼<1aZH=v~>sG#CNo[6wC;M&;bXv7٩k|%x||5\w+(9#d!n=ܺUs8V0*ӭ`PVB i<9Vޡ80[ނ&h8ib vƻT4Vz˩1ͩ \claEaय़ܕdlL;W 4HXTJ+F!ydݿAq1LP ֚]\GHra3ch3+n͟ʅ1ؑv-&Vi7 b+ܖ3gq[s5}r.g0eሹNxMj-UEH #i, "Abl~=L#AXS+:Kz1̙d LN!LmGTJ_hx-;[n!|e4K79͉]>VTdw&'T* {lZPFeѦx;BYqi0-kӺIqېzjcyINZ QvPT^Px$hQN!DAm~&*z(rׄ*& ݪ)[H/^y_U?+#+MD'3GJoEksT*,f'tQw|rAJhGQ(v.khrOQf5yHՍyҨ"Beg'KZw'|]x-cw5aŒ/Ǒt sOI`9Y_rO)md?0Z*ߝvjls(0|#_޾aez-p>z6>e8Rrh-XdJ#~tqc̈ [L>Ӭ /F"F(<ǎ,e4rbɐSqvX!r*Ɔ:ƥVG[R Z4)ƃ:g2z()o'ZDIPOEjSKƳ&*!,գ@Ge(}\QB7B[MtpR@6Z 4 l+,"+JjڊjCI)@ⲫq!Jk"sv EnS}ۑe$+i2}ݱe{a XCH1Tn҆8\T1p'#FBvaJ)WzJIIK 1jN(i/m3#9].+(ci'g >XXU>Chl-LF NtLSrQEiTAG`Q E RR*t'Ɣ/2>656:,J,*,Z*9ؗ(\U Lh7*j sѝr/p-n%Lo[w|Ӓ91!]kzDE{"o5rmP.l2#C (~g%2c"H $҂gd3YL_.vFueI%*‘ Y➽*ZюE$H,M_1ԦUe@c hX$k//hTk"ꁳa#_G0C*d: >m"/hY㓉-m490O-*QeӌekGV(q!gyJRLőc4_8?JeShnT>fuEl|~qB2fpE꓊0)v EsbNlQ%yHr] JS,,dcS]gZgF6E{ 6YgY6J&y&)Š$XJƐ9SQ`N8,\76P-]^Óyf>QhM n-5O h❱R :C]IMCɧ ܳ2qC:Bya Hyr2OS GoRʄYW`vu{W%d'r: $ߑK%ݩ&+<ޱS֤ׯ\'u9%rU~ғ4[(|,\6W)Y .\̳>N]Nwy5sEڎ"ViȢVjq[#%%`K@d֠ƺ0`\zпc{Nj"^ؚsƕV6Njy4d%o\+4J0-jT h 6lֻ/3ԚNK(iWiOh$jwŎ-M`݅L+Sc ,:cOVXB5Hq؃m*)} =PYVOG-^-j#烙? M%2'c+.W;Wgr" 4o[IsYF̬:MgU#[fu?ɿQ񊧜5x98gr.9h|_9 g-dA{!k̔ww{w{'Je~9̚X8-teZНj9,f-kS wv.>/M-L3?]m(i\[ɌCٟzq; F?}ۣbbc4ه|5zj~ᴄܤ=(آ]{0Ӎamr⯫*eG2l87?:<u=XX|Wk$k 9y,3 .{:`oaz(<{1N#w"ٿHL2p :)8Ijh: *-S7?1ٽ Z> A kYa DjnBJ *z@ 2bH6’:CC2{C; 7)> A6@0 [zʊ:'t#DC'$̰^wiӾ1[ߚ<Ӈ7)=>rYB$<35΂pȿ(DTMPʚ2Y .A!HB j|3Ŭc @>oR;:zRB A->E=ʌ^++3:\')41s!a ZiA$ :1 h ʼ |?Z*Pp4`ɖd?գ&3v)stF,CJFzDjCBH t3}7xxZg-pD8ZHrs<0)# K |؂yS'-EH18-C6`3*/C6MC3 e 7Q;JơŦh#G6iB*/ӱ:nۮLw\쉕Hzx-؅8#R)L8`5ʒ̽G짳7,kqCؠ;/L7ɝ8t+(E|FZA / ˫ 4p.J,ђHs84g3y8..-XL\a؈y@N`}dS P/,)x7T1M4јsʽ"xAF5*"-n ʝ0(O6z$4 85QA0 ЈExDk 8a^X]}#Fȕv@N YQdKl"TD@ʼ^ l䝦) @rR| 3F @ڭ =H"}H q`S*vK .|قP@hLBY8GUL< 5 =’]Djׄo[ 8C12L 520M!KNUloCt  ?z ex6Ю3PpT|Y\F .pOhh C-zXh%uEGKl3wT$&30!|?Lu\]}$ dU֜Xy=?؅8.LvmZxKep(}`a@؂ MLhpTS@3vK j%rZ C9SF 9-<ؤ0|ƢƠ!=-X>+K@ຳޕ/8繎pI|N-x ṂZ0zS ^@LΐpTnUNzV}50K\[r)CDL[Eexa%z]ƂMH)͡))W4iT;uQ\ =}Q8fYقM`KµVA"V}HZ 0+ ʌ._E^ŲdʤO@ݴ"6SyK=4 M cHP,X`$,/aiW1Wx$-iHE(CͲ,'݆\<|̾XXMOHšth\24,y i$r5U;vD⭦t{0bӊaNSî@pc qQR>6X47EX,[#z~DױM0'UXA1XXc (v @"+)z$B)^YV6}ePGZbaM0c2ْ!}(> ?] A P̾BȶHͮ e!C#3cmCصfpQj+177aSz*⿲Nn ( K?D Z@b/؍HD2'hkú"O2,۽ܯ|&/X~\(#,>ubf* 18̾|,]E2yLIR@CN K6 ?Śu5msW|' &U)uh\~:īN2&lGFU; *e:쯶3] ,N%e$ WcZdLk|f\ӎ~`ܶ*#B4p!}k9fP5gϩ0J*d\KM'oL:+wO534dt>T~*ko0qJBv۾mFs8)qPΓ<  QXZvx<*TaP8|Ub$#2v1b85o O\N{60F}hXo}VO_4z)Ko2A,yf˘.g|>}|sʛ:Ӱ$4PAOF'̚9tQDFuhȢ6iJ`z}9wϮqFY3V}-7C>1hh|-hb',pL}7QߖPL;hZ}rK暋EKU^?ʹR4kZAJbㅩNsڽ6xDL7.U~fV-^FSH8THm(sPm2X<킉 K+)c|vP;i"\Jx\UX.Tr0)Q!UPE!I{Ɖ'N:M=7WjE]OPngԏwiUW8dV@%VLbhai]7VQ3Y``yRXİi@3$s)'1>\<ӅDrJx5!´B2px(nML2c ު2h5UqB^Ij %x~3a7'^HIWpJ%UK9YZaaUE`vʫxEO`~Ew%JDŽxa4F"o#l6mExPA5ۢ߈,KJQUD)wNޓ}!SYn2ixJd&{IyRʑu_PUQ_Tr}4ޠ*<ŝEs!(d[F8U)dD=p\P\@#aj;2&coMMReyZkΕTIMeXEs_# lM:G]eMO_: F:wqu%~D(^ WW4 ^Ffd#4ŀ@400g" a! O-(RO!OTC*CN!,RIP[~9&M{z:猉xDkZdKX"tŁ2X$ w1EoESjVI20Ȁ_9ү $qy& P֤j(¤lWVT, u jU: p9ҹѨ:! <&Hu טz{^scgyU49іΖ/DsX7էTaAʚ|IL򹭷Moi_ttBzK.ymYu!gJ?xR5 gZ"K!A @(򐉬4HFưd% P+ZVr%yK&"#Cvsf(OyP^ 5SU:3ČUς4ea?4<-9MTB &y ItThH:tiU*qYC0@h=Hc̞0Aȋv e\uKw[X= \*]x5Sm[HL\͈G_aW8eœ̈́iDJJ)BC@ P;FB`mOFD-O2tC%X" 2>6 q(|U9MJ6\S3%'-`]ԂITG% u]rG %jHp (Csf,(rJf :k,~i4Q,/VZ~N R1טˇ=`~JMy΅(D \xJdN j2xB\Dv !  0LD,yPOlf yWۅT!j8Ն-Ál\έ۽|P*z3Ux]*! ]ďΚٽ;Djl)ML''^DTL~" 40,dn6WrQjJN듶EK^iI6yBED^^Sˢ"QEe]daƪJE Kkw $wQ}'TN"`SNqΰՈaQ%URtK]*]JkQnyq%I*)}QӘa%5W)XxcyD4PɛUװ6%?pXğb}m Rw' sEOC +_.BuQ- ]Ͱ\(%IBX #-ОBB6ױ4E XGD$M І݊V)aVc4߃YUf-[_U).^5yZn$ (ބia,-ikޣrIYWfm$*ݒAP]4P7DSaQTfZs1Vm! ^4o03f*g%jn%"]L'ް *ypTTo]%+qe[- T^F(V.uYUMT?YG4.zX2C}LipjW\Np>K=}UGpXɰU& >NN./ל55+UdonոQ{ ]#[L;9BhIYٗ噘YY ;˙qY=9:YY33əYQBWխ=M UrL/dE lGE\ 4KK4L4^2W{xQ4|&2akVa]}]ORɓőlVi^-+I0߭U/Ak&j--u Q*_NPS 47msLI޵O,h_ ~\=ىT&YK2'ob 5KVǒ$/ Eɾ%؜pUM -Ж@hkXF-vfVp"Lc6jP}V, Sf -ڔJ kp/ Y^TZe`ܕ'E^Vye\)eF,:j[==@vMOƕm5uN`'u /c4y}]'6q'u'URkcDbBe j>v`!|- +:jf& $֔I$2 aQH%W MYHf#WnE =erVT_q'eMDŒNqN,!_lӓjYU/C p %bTڰQhh'R^,ء˗v ˈ3}% ݍՀPpd^j۔zv`5: >\ HH jD]xzvs #pX<^ʶ]uN^uM׼(ԝUqc ҶWJKpo~g$^(b$(%zѤaߗ"zu^>450F#sT` SSɼ%S Cݎ Q6}s,^4 9FQ=$Er п6:Xi=QTܱ,Omj_yS:HcVcnqS0c4V5ՍkWgg.PEoIDNoHglPlF?5)/-{ gft ~@8G4/;ri t!&@,`4)W"}1j4(#I>yƁ*917z90 .r"J{ KGU,4}8*"Az0D"J 4رSj8d=y\B=őQ}b$COߖ1dh:1+7EKfÄ'jLݠVڝscʨg~ʭhclÄp_Szh˛-U;aiMzh.m2(Wy6U}djOF).߯T(<]/(WɁ?.zR(%f.lBˡ^kpR4h LL=6CS.jB$Zr+TCJ;0&lN,r2KPh/mGadPZ+hvbvdD)5a'TlB4*N7}$jں++_*tE(ʷH,RJ ʰ"E\1+KIi=g-J<3nS'ـtkVQ_(vHLz d8ŠZC|5 3Gp;S_Di)D RVL3}(R 32##\C5]fbN !hήk ыzLɚIB @TO )jTA|'Sֵr2r=\RQ_J#o5+DÕk=RpcqG}X6&*ڂUD,<*C /3kV-XĊ.F涠U6b%ɪH0W ,+*k: p#*T 5"~ 5,pNjomEJBZyՒhՒ4f%*2pʾ3G|R޽NBZTcDi]E:ꠉgN G?휲,i^GXAWRB'm`[)ş#ۍO2ںh; p!H3[Q45"`GQU m9AǮGbfhx)I3l }AF1{--IYco r?9VNR;HU^ɪJp'XĮy* Bشd٥:$]w% Q^cHhƐ]8_ Uuф"YUyI#Vv5\21ZfB </e)M̃>2R:*6%qAD؆$擔 j#^fng=vkigb.81KUc6v("{? jeM1FQEjFwMuCkP* is8)iX p 1_#M9e3K`/9Br\4hLsj_MK"n?9Qִ^NaR*5 5.ax>ծYJm׽(GE5W'58`pfCuT8늚]i 0]AsQSKs gbVے]5>3rt*4w_0O51UmlJFbׯ@LH-5?;ŒĒH1N|TGkDhHno*LI%sJ2BiP*5 IMr=uwQ~87`L0hDӟr+TZ6^{5(Qxؔ[)9km$ r?BPƬCC6TSџ;W<4 I* )d2ӓfHgLS%E'S#{&AŚRH9vs);jhdf-2.9/docs/hdfview/UsersGuide/images/icon_folderopen.gif0000755000175000017500000000015512050301073024720 0ustar sylvestresylvestreGIF89a̙f3333!,@2X%08 8kL`(vF9PP=: I%HYA;jhdf-2.9/docs/hdfview/UsersGuide/images/icon_table.gif0000755000175000017500000000155712050301073023661 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3?wNvMuL,@T H`6m!CJ(P‡  [E#NC G%\R6~4SF$(4Ţ ;jhdf-2.9/docs/hdfview/UsersGuide/images/hdf-obj.jpg0000755000175000017500000013102012050301073023073 0ustar sylvestresylvestreJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X"X !"1AQVau#27U%5T$6Bbc34RqSt'Cdr&Dsv)1Q!A2a3"RqB ?(((((((}^P[>٥oGV0J!C (e*|(e*JG4$r \;}/4X~f>SW?3o} )<+?+ϾBsO#AJm|E:s6о"Rb|_N\;}/44X~f>SW?3o} )<+?+ϾBsO#AJm|E:s6о"Rb|_N\;}/44X~f>SW?3o} )<+?+ϾBsO#AJm|EG%ۡ*V!`I %)HJI$I IT;Mɛ͚ :\Kc!PJ#8>SS*)J)J)J)J)J)J)J)J)J)J)J)J)J)J V .V6ɻ2wxUcҳ iɔφLՅ} 1pJ 7-*R#[ Q)72"i>ZG*#{E*˫GGKqOtJKoGu8ʎIZ 9ǔg[\l]O^Q@ NN3Frie"jή-JRYu˄*ڌ, qka]7>{L ()MqH9ݷTh)TUfXV\Q!eiy-9 Nqxg_ h]u۸ODսrBJpRl#$g##壩ҳ{.dEvmkb;Z{]RBFH|-x2q≼%y`6 )Ĝc( @#3T_ҹoxZa:.i!["Z8@c,IJN5붞!#-8=#noycJ{ij,&(TZR'v /*XNHb>NHܴ7C̥,:qS8d)!% /w3cTdhMli-<䄖@ gmbo[UqHv贆dg;HA1!b=٫fD6 %oB=JVFmANq9N┇TڀJ6挬(U,%W,%]dJu˩)@ 2HqDשsmE Re] !()RZ!HXqr )YNRYuc7+]d`Mo0g-N AJrQIg4;_'Zv(٤1b&ێr!]'n ,ִVRr '>1fsMGyڭM7zFR8K}Ixi Dsuu6 ʎҤ6oYZRsDF|x fݩJR4Scqv;7{ww{;4Scqv;7{ww{;B}^iUEIg'T_tWt)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPg'T_tk/qkmuhO5꨾4_z5Wԥ+(2Nܯ!b4SDg$4Ky6J6IZ-.3 C'Vl ;uTep.^YK(!EpnB1 FjpD3Hi mn4S] @qB*$Sci }̷*pD7W#8 /8BV +M[qܬ6;SoiBb88aMRTFps]фXMh Vu۝ )Lx?z\4ˌ̅j_ \p &VU*Fp#oJlf5s0lLJ,)GpdˮmI0%S Jn2aA)Jwe|yN^{?G'?)i}=<ӟߟ{y߫uG;yXH>|yN^{?G'?)i}=<ӟߟ{y߫uG;yXH>Z:so'=&kGJhgɾ}'f9˷ӓ}?O5MA:so'=&ht=.N{NM?֎á9vsro_I&CَrOMhMA:so'=&ht=.N{NM?֎á9vsro_I&R2먙*\#SG'ypxwY=VzտP|f9˷ӓ}?O4:so'=&kGJj cy997/C9vsro_I&tf9˷ӓ}?O4:so'=&kGJj cy997/C9vsro_I&tf9˷ӓ}?O4:so'=&kGJj cy997/_ ewuRPLRV 0B|] Ƕ[@,V(N$R)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J*}8^C[qGwU^v?h4^v?h׽],* +?׽],*uGc?AJGc?{uR{u^v?h4߯5g[J-y4LǑt:r{*JF >L:WL|^nS5EP-Z]ů';j(?Eҳ{u^v?h4^v?h׽],* +?׽],*uGc?AJGc?{uR{u^v?h4x:M7Kv2Z 8H98W R R R R R R R R R R R R RfLrAj)oe2r2?Gc?\.BnV6ɴ|!-O qJT($+BmnQiq[Ym8ÀP  A I)P'eq{u^v?hth.27Lo T)䵕< OT;$ZzbLI2d6?%+gJ*~jYlZ^G-[&CI-nZOr,FsӀm*IPذInۤMtܨ~))'cZ2v.VxJST]ҳ6z[=xb" &e HDQ P nix0lv&_5)ʋm(n*HQ *RUCjUu*Vbc[eYkTFn_Wb~+ :[Jڃjpi+BeeJ=oVH]2| [j)lp]9 R XzWYDz?I!Le8 +i !`ڜ `4s`C\IoeÈV#)9ZgVi]|Aj[[LRJ)  c+kT;$Zz\ޏ:EWF]{ufTvGuumڂA#j{Ym(R((((((((((Wr [TW& <'0 I)P@ ;ˋ7X VVۀnm,h8$%I$r$LʩD9]mMyxp‚DO$((TScaTW8/ $)*I) A+͞Wv3nsph2D͐RBR)_IJ&?AzP֯oBR8\^”vH8 H`ڑs"CqYVԡ#ONj2(ҚOŵ!P$RHBӷ v܉ N?)7\$G[.H)(z;%'kjPiWhBFp3@'KKi %NԠҮgd\J띣W@]D(v;y%›ڢvmk!#jL"ֻ_*`HHukJT͑xrOĸc{/BAI<5 Ŏx6 !HJP0r^drZ*f~}[}SrRnһ𤃁7][/qmQXkq Iy+8A(ې@ wJ*)JRV'M [|sxDc([2{AG;PwMIen&\0, pQ!m }l Ŏx6 !HJP0rzTx3\.#FW$)*IJ "(RRRRRRRRRRRRRO:tZ0% 4ճ 3;Q,4m!)B@@ {t6oc(I%JQR$I$I:_B}lxVsk~&n#8":J^JCɖ1Rx@VתtUb3lkqn9qd)JVgS:2Zi$Ċ푀ؤr.|Ǖoe?&ö3wD§pTJR;DNïZCΫZT֐7| ݺc˽Z\/]%mp)ЗBm5m ?pOκ68d -@i$ȄKeOYڔS#6JT.Vŭ8*)FѲ'JLLC*Ashb֜nph0jZ #WD4ZT=@'o? R1y-a]6>ќ[9$ZQi:~kSZCΫZTA׭!U-~*uHyc_U^V?h׭!U-~*jU^V?h׭!U-~*jߩ$ Vi˜rXۋV' G~[SH L)]mM^ aA"X/ $B۲:=|78e4^7!@c Wz!Zq{.KJډʞe#$=zW6fTvGuumڂA#kһ!JRJRJRJRJRJRJRJRJRJRJR'5V!ۦɑ&Kh1YPVF9 Vt4Ehe J$JI*$I$NuTe0Hyc_zuX+=(s#K[iq*򟔉E,[YR R9c?9tsCZ9FtlwUeԯOom;ԂF4;*%DNCe)J*/ϒZmsS $sZIU}7P]VȬZEͥ:ņ$VAAq:|;d7&OH{ϸBr@Q2H;>v;[I䩗6\gdž(dmJ28#"cs8vLAGݓή(3Z:/ȎiJ SX.%ŀ~)I6v\*;aǖGpa{'Z PSyžg>HjOČ+;UUGb\W1!X 8 TZ]O9ϕIGpHiJ-)9d($&AJZnstG|SK[+ڴsĺ|x=3)_0Np{MTFA)@oqq0gIDm";M62ԐH@sRc?9B4W?,p|_=.v'. ]0;Σ܅xIКzTYfʔʔN`VΔ=gz "P P{5-דb&LTJC 6TDu13l!k.8SN ֣k8R'MLEBDؘ91]rZ!TppiJP)J:|;d7&OH{ϸBr@Q2HE+͇ٕm@[n6$dG"RU}kg%`eMvW w$V&nlGt[A(Cڴr+p<̃UCTwR[JA[ JAJgùnd lKv<Á+GES:x>H'rČ';ST~v*;}ǖGy!ᥫ%#+%AgkټqJ8MH|G=Y8@)P )J)J)J)J)J)J)Pۻ[^=kjwQ؉y%'5#9dxǖe)J)J)J*Qܞ ۀ!d!N) @ s5á&g1 JRAJR"ԕBB eY),;|i_)99; N wԎ[?j{voVztRN~|ΧS_=7Ն*Vwگݛufu:EJ:U۳:N~|ΧVhksn48H2Is$2MT:U۳:ͩm̽j4F"Mo7g(G'.&P5X-ѤcCHw!];;;VCKVR:2Pzk#CɋcDR**Ym@#5S`3iZm\!eM]h62! g'9QVN~|ΧV_01c;MHm$ ^ufu:lٿN4RN~|ΧS_=7Ն*Vwگݛufu:E\PjKeP+ɴ:Ύ 1A%IYIH:lٿQ`uM8.n^zJUyCHA8 @ꗉ,Ѥ;Dvgxmuw !$$-.(tc VIW &%Ѯ @]{՗aZTIZq RdXp*2\{:Huq)7)$OYܤ֫l)w{W2\iR#$j9IHV\IZ7$e=c$b RN~|ΧS_=7ub颥gzlٿN[?j{voS 4U8'Y|\8 S aĭd%( y[?j{voSگݛOm6-1IsiHsm6ˬE YL9xmĥe8݌g#9:U۳:GɥB䖖u[,N(r'ygMpۙ[⹝0q C~\{@]r*l2-.!%9,w*N~|ΥbigzlٿN[?j{voS 4TS_=7gWnuaufu:lٿN4RN~|ΧS_=7Նo9~KyES˨K!)SN93tGj;{L4Lnt$ r9JH lD8ݲAAz=Kaݼ%wIPRN @|D^U=OTWIN•Θ HujI*Vcr{G89M'iם+hHKi~l&d8 Z$'jҳMz/Mh+((2(1zv0 5Ǝ7[#rPA{MjKX.Q .)KmaavwQj.sF6MtHyl-vxK SP|xZB ١.eChwY'JAh~MtxŴ8\H|ttEƨVtp\Ҕ&JZĀ?= ZkN$B!j,CJ@ag 1u}n MeIlq+AHV敻h)%;!5{1Ѣ?gN*VnXzz)rBf3;JmE{ 9 (#j,WX.\&Hc^xb(Iwr !8 yN9nK5DĎ8kjЅ%Kkr!$n *흫ձHa/pJ8NWhr$rbZ4v}S:aLGBdO~BTxP;x|+j.]}j9R")qr WA絞|Fu{o5M֛ZQ$(' t)m$@$A)kXW!UoKl  暫bԌ:%]WͽNYP+p s흯]q"͔+x#iN3cqǾ^]qLBZr J%JmrPӍX-wS s3kxG1T-RrWqJ{U+; O>Ȃm-RoHBRa $XO$Uld6VXp4ӝC;e)Q#b;*u{o5M֛ZQ$(' t)m$@$A0Kz~ ˓+œ=-jٍf&ՔFx6-HρmC^9|l呕G>>sPq/l<hm3;U;rMG,zEŴ [q(Wդ ~FҜgy:J6=f[ěa:!/խMe%&A#v́\ND(h[&C֦[i+m4@xqNpk;|fq KCGkckRo F҂hUL:&=wrΡwUIM&<2iJQ-H!ҀTS5X[,T%\MBq$qihm("pBF{Uow?mح&9bۧ;f-NxqHq8m1m<3G:3xx=#:G n6ߜmRKoXX=mfd#<B]8V6q FTN73j=.'+ (td!,2ުbVҾުbV?ŚRm:x@j5D"+dbpvU! uNmEH͹m2,2Re`n$Yp'pJ{ ?VzտgSJʪZLz:!Z4 2Y*HV[VT'deMًVAНKkqo7@6I̜Ƣ}vkny SVʖ˭m-,BgŌx:j5Mguٌ\mio(,@N6:{qG[6#0-I Bn L{}StwײPۄPw )р2|$U~^/ ۘ r]-o9%!H SH @!iղIn9hKI[mOTd$S|lG2UحEpۘ\[hiiE(mJ@Ny~T(xAnkpr;P[;8ryܜ jڦ*L+ iDaB8'=O}#@zǦۭ 7)p|iBvO3EPX5P"栮|~H,M"O7:Z4U\YDz\oxV[IO$Sʧ/vK \:mѧyQOi982=yj¸ Pџ'nͺS GaŤ%$khq&]V Rv=9$BԖѕ!${.cwl` ES!Bʆ%$;In^tSӒ- K)]& NR۫=P8<@?DŜvpYIy[QHK_CT ;p $eKZG3O}Keiqym5wZpڐ.($Gc:;$:,4qA)B@$@5_uEN*q--iV#v;%$SkyYW[ﳣȆ :H!ŸJ҉{ `IVФ+G>Jm~/} /GD)q+ fT{5fT{5,ҔlgtYVIXVoUO)^jZZL³z^l*R,>M'Kq~ :ȊԲ F7v },dҷyxPR`Y.,x:u2lTaݔȫNP4Ӛ%Ԍ#yܼ qTuz}3Pˏ*KM8@#q'3\FizOFZ\pGek ~XIt 8?]}6J% JW`a%-lQ+ s<-K8zND@m߱R@$wPjxrEq%:AiB [ug*~L+喯nܢLB7+*ZT ))M/t۷۸C׍%LSif(p0TcIrsOkwMF mJzG3o4Jݹ?H$(9֞ɵOiFȺBcP,fdDۭs;%w3bw|ݜ'&O2v?5< KRQu4Rw)[B ;D:s.MKB}wHHq-" `!D|rJ&-CsY$;7EܽlRP >v_ԟ'7^3֩M&S <YFSÄ7 HP#u9GjaeGjDwP-PRV2#:6=%E\ A}AݍP#'w -)MO}s.1RCyBJ)Nq$$() n -dwhӚMJO<%a<6Ħ=[g]/R<-?!QqD0H$8xP$R@ݑ]qL}':o}M/NdqV9)ZpJFVTiJRE>4תւMz/Mh+JRJR?Qj8:^/u {U&B^UEI{JRRy1TvP+P@UiX˵l Itvp$}Ԭ$p[n[VI[Gj=TܻdX ۣTyrTBY*iHVAإOƭR)@)AC+%hk=+%hkY)Jך֭%>ުbSO՞o(fT{~UW+ RRHynú[܊G^D8g(c $d`vJIwz–NOA,Kr l6rc]QfԱDTH{SjIZ}aCjBTT$aUdNt=T <؆Dh춋~ FR:C^%mO1H e.ԆY6%.qJRSvC_T P93'HbGqCk(!\Ҏ⢜D  j2ЭSsJc ؖm.&hJFTS"D!:b^xN$$=wdg4Ղ^#S7okDEaEжq`YR%ARU;4}ynS:#/V8{Gvr6WBd)JP)JPQhO5꨾5^Z 2RR?qkmu-g?mγWNjbB^UEIheh]="FC,FLI.R֠RᑹADWEm7gD!.KS);jk먚?K4&R :wɵ*?K4&R NEM楏uGcs?/ٵ*?K4&R :_o(vI b Bu֏ :pSow--y1c;MHm$ ^)JU?VzտgSJiך֭%_-6κG[Na6KrK @~^{7QuGcs?DjXtf״.h5,~gӨ?K4~ͯk9ugP\7V-i4.% yL{BJ,RuGcs?DjX8Z6%gTܧ])ϯ2iWh,aADtﲈ hIܧfS󭁱kq* QnOlQ$uGcs?DjXN6.\p?(lȖi VNԭYݷ)srgO[# ŶSI}Z*؅ʒNdkVh+li3K78*DJU-rOqI $UQ4?g3iӾMݴs Ng>;Tn0q$+$'##jj~ɹn6<<$9"B  `NNI'M楏uGcs??ٷe0Jqp:#ܤ8 +z@Q9*9ZYmqPD!n”p;!9bԱ9Nh5,~gӧ|^ҨԱ9Nh5,~g~ͯiT]DjXQ4?g3i^}o\kRGC%-4F̚M楏mV4H-_R XiE9q~͚jJ-rڟ )JJF@8 +((#σnc|H[/#qBG1OuQ?smj%Z\ACDС!GcaCm@m² V,R(((3>ުbV+IYQ"sr:BJW ŹHC)mD(d1@)@)@)@)@)@)@)AOqvnvB˜FC̼!]#lZ9+gT &ʘۄ!<% AQKhB{n*WkV)JJRJRJR?QkAX?_cºKr;͇%uISmJin)JI){sY/vGgbi #vJ`b”ZrƟH%(## KϾ~תxo]5'Y.^f>S/3o} *sO\z+Mt&cN<\ϋOS!KϾ%B=~!'Y.^f>S/3o} *^ݳUt֋-I!⹸AYOS!KϾ%Bo[N^%K Td(2(yTKuuUcܤ jP \R۹I k]~'j3.6ͫ(U% _upِA$Im 3[β\;}/wf6c]&L'C[> -x*u%;A,ՅnQn+Ms`:YrŞ"C$Žiq8ʇ3=[5}dy|_N\;}/gW$Oj=d9dv{Y6U+ғ/3o} )KϾiV<u.~狝cv?Zz_S!%Bum|E]Ҟ?ғ/3o} )KϾ۶jnzqS%1d#ZXBBW7H<1"uӗRkBd)` o $g<`UzOXum|E:r6о"-)ֈWmWXVISrx-q@.mqJBwn$$2@9f6c]&L'C[> -x*u%;A,7CQK@Jdyq*\$_ rv2$ZiVthMZC, B@ 2rp(枿pD0|h mI V9w֎ٶ6B9hO!FQȨc,/3o} )KϾnʎԈ@[n6$dG"ץ=~!'Y.^f>S/3o} *7QkEtzbX- aX*N $9֞'΍E'Y.^f>S/3o} *Ydy|_N\;}/SgxnLlnX V Y yU&d)@)AпWkQ}j4/T_tzړWߞR}r BJpTN;{kgHMMEd%:#%)JEu*U)'aôeJl f NoJ!`$N6<ƅz:&s~fXa=q1+{ֵ!R IF]#JB:+wN5qW+^E S, ݼI iKc 6,+=u6 !KesPu qpJ€+RybV>bVYX6oUO+EYX6oUO+\o“5}/'ޘ.จJt(;Q)%D'_6wiWurYWpIȴ쐤Rw@%)W~; y7RsӨy!&HX; - O0G!i[Mv4,aۇ1ǖĭ&[Zԇ]J8%'ta)qW+^E S, ݼI iKc 6,.J^$iuRVt4o-Ca֋)Q+ I\^Jg]54U. &tSCJ  Xκ)5wN5_ Y}G=2ҷ'=J p2/g&Yz-]d!WElx!!xܞ`]z;ןrBkMi_u蚂EܷDr6nlT2vy N뱐rdpph%BCy+7=%eZƇM,fOn3c*<a'RJJG%pk\f7$7J YZߜ;J';Žzֶ-~7mޘ?$+'8 Sv~ÛUswwOYE.Nɺȉ)GJ-!n)8'lj: :mܗwC\#LSiz.8BK "ҤtL_i)|uf+{;VV<`T%/YaчAZ@.Ҥ:D9S|#Y 4rsOj{ i+)'ȸ16=^T %)n20vǨu}a|E[=hp'*m9gHO. }W2mV^+X"8?mSy HKKӼ a' 5/]u,_X +FLTep8aJ Ps)8 Jvs~{ʩuM-ۛxq%ϸRZt%jN9sj\R )t'T_tVB}^iUEI}w2kB_iUEIпWkQ}jN]e+1KdʂnM:˸z I…(rIMcv {%>Z V{3{ +oW?ZdR{lɳϏ;xKßmG:b,fBr@Q2H ['#-;7wvmg]ۏv6zijhs?qT\mj:Qi H+RH +wL=&vÖ~ >>_U&_fkr g諈7{43 [5\ҽxN?/5YS#VKn9ݛYǗvݍ9jw~&Z>ImXӃڱ߉U/ 8T;VMu'p=w+ۏ}|'Qvk[iǻ-N a)*9+>ׅuVGp!ڕjij{[B]ik9J yPaQ܏!:˨(qAA*пWkQ}k8+^&;>}aU?ĭg$}aU?ĭwuzZ*zZ~וGf΁a_C6(qƸ-##jAȃί+?Q1Kw%]K_"w vB$x T9mYI띫{߰U[Ҿ|;?֑LjKB/Vϥjn4:IHw,1*9qK+h+Q>@ 8tΗ.qQ62dlLY6{i8Ԃs}u)Γj,Vy s[2ҊrF@QFdOmhZnZRN!- QPNN*'@m>!!t=a 焜Ix#ZGΫU띫{߰U|k s6: g }jTd35:㠶 !*Ã);N OEf&wۦB#6x :ym8:V'ﯴe.0W%`vAv3(A3Z[FkbDhAÜHH YY9vǝn*PyrKzFBHIJOh |0^&SuJhM`ǸW.jx+ڳl*ޫj^eq,!B]ARVRA=w-}OvڮVn .z[<0#T: A†U|.\ט,%[RBN6 V:ne0Hfr8!j P@6/rwMpQ\RRA**R@ U76 KEĝQ_l- O#ޔFzsf>d|%{m-#%R6$9UYmbVOq.Sxr.^Z O5꨾5{e)J)J օ^WA~ת|٫WFWGc{hqJUN;a-s#q#PV@PxʅV_l*D#6  JOwG sʷtO~8=(~'gݷwr;T[$$%ޔ&rYin$CHS i!%I 'aIM}I6eM.ɑ4NigC\<Zaa\~j'it\"1 :̦"b 9g 6Oo Uzc0tNלJy0R8nVv$U?z{C ## )|&Г KB\)$*Tp2 ˅mTƸ.>AmaDy@ɪPkw;rHamKp>eJ\+AI(y#-wvɝܓazք|K$d'b;i>]Z4\%Kp7Ef3;J~h!ĖЕ%-A@)YvCFx& 0dSh)G8i$,!H”)2d[R Ԗx AJQFVr'jMgtv~u7aLƟqYaZ;?M% $kZžK1ewaZ%ݠ9ygqUL-Q&4ax\O$699ʷYs{_ĐI6i'omc+!=` sM&%0|XJ~;R@y\W);=nVVu,wFZ[so-8YNAp,5:oEgt9+7VHAX+NrCMsMk=SB-IMa0zBP9hZJ3jP #+۸rOƸVۛRʰ7$iP8  VR+#&]*ybbǜ H eK)Ut/T_t }U&>{}R>bV>bV{fT{UfT{);+?Q1Kwւ8|?ս)Jon7S,[țBv])BI@Ow BW ͸qZ.)`:J\W 0A|m{RB MkoZĎJ"LR_;-M!;]ZT~mIޔ[JT3C~v 156dUGlK-턨p*^J~EtΓ-X<%!o)#<pJQԛ0Ɣ&[ 8mhTT0H8 cq6Х3)$n.= m.CJ tn.uJ!=a벢87$56ŭ s* Gki=r삪ǵ|dۮ3>H͠ ARR$q6yeoL k m FՕv psdz]#vzfܛQ/Z˟8NšO20V{q.Ѳ)1(.!K-)*GF^JQ+J)ڢIG<`h`xYk,}Oebmއru RP*0NI ,g<&!!.OϚΩT^ %\!dA) M*cد"86 * ө{.pIOHWrwfnz&RfO_KDW -dqA t)J2{%i+6 SJW_SRO5꨾5^Z 6RRh_5꨾5TMz/M_˽m~o8yTv?׺֍'+\o)JRVJZs‘o7G-BV\a.%#cdm`1.u)V,2HKJJs"X))ތd9]REK \cZL1 ʖU@S|D!ĥ{B2UB--7>,뫶H6 ٗל_89@[crU ɌӣdGm8(3*xҨzɭEk}-G\p$)G$I5mKU.Rw2EwauΎԕNR'[FeM8PC$d2*szyU]Oh5ٕCmAIZH D3eޕS~תյT_5꨾5gT{ugT{uxܬ7ؕ7ؕ7IyYgZ[f֜\zT ]'nyTd_ޢ5l~kOg|U=E>jRn2"Vq(N{$dz~_G~ޕNt {'O"')m@a!\H?ebO{MBCxi|9v癎[J ;AI85&Ӗٍˁ`Ev<6дp22 FUZi9Cqsl 2Ḍd_i\o'n: w;RK{S+y^[gGi' +S=7{{w1c"CeV(%(H$uX'֧ D:WOۥ2- sQK%OAJt(rI99'5oTz>uX^V?h5^Tz>uX^V?h5rA׭#U ~*uHc_PuHc_z>uX-/Tz>uXF5!-XCm9)j'ISt**B}^iUEIg'T_tWs)JP)JPf/T_t }U&޶RQ\u*^Fn*2JPiHTn>Ų]߆K՟b}S?OY|_NB"tY-5N\3`]8\=۶oHV3g${IVKoHT'3'TCԒ6+9?ZZ8գYMW e)XvUO+GYXvUO+G^ĽzZ*zZ~ה+6T;%ZTKqEKPB@JQ%JxzBme))Re-mmd]!jEEgUwÿf3yV_Ų]߆[^3oׯbLtY-5:^w~nz$ʧ[^3gض_kz[/jju5ؓ?*nz$ʧK՟b}SϱlwᩨjioׯbLu5ؓ?*/V}e _vMm,W0̄4>:͠ G{4j= j;uxȚܕ4P ) yEyjQ}knq}zw_ZT_ZۿfR3)t'T_tVB}^iUEI}w2kB_iUEIпWkQ}jN]ea4{LnR5u/L̇BX'>ZODP{Nj2ja~҉ud:p"Gyk^6B#P,MVx^7cFF$2 mۏyŠ{NH5e~N\-끺C/'g<CUg^\AZ^ P\e t:DoP8PQ|lu9w"<]_tn7&u$T B!;r\Cw7g5 :QNz> C89I:BVQr9oi? 9RPJܵcxV:@eA Ttxm-0#)Z@JNIPN צjO M!CF9ENmeziM%EKWGOiX9"K=W;ů9W{7oˋ姂OIXJm6&86WDW#Ii/4A ##/;_uF?>b,77qL`Q[ChA[ + .wL~ MńS,Q'HؒN䕅mRl,]xu=<rPz{`7vC7m:}^”4!) ))xJ$ŖK4tŶ-LډķwF"oz4.rS,2z!§@#w.Y=c{JkРmجq# JJ *OzߚHHL^Im8A (+G6ʰI;9{CDkwu=M\(崴 H&fZz\-v0{[{;e-y JBʒ{G~)*˛}Ah&']шv#Fm#%X z'̍+bZ%M͹xXhI*Hm8A JϝOh2R7 b7%,BAF3YIe67Q]ZmP⅛|AZyZT}oeEb?w6qM'+V;p2O:p+SZ' Sna-h)k) HRIBTJIpnw6r.vv֒m䡓wH=1o{"Snq2p%F [6i 9`9V6%Cvn-ˌaq4#\ܗNp @PTAWd/vvwl8/)CS :͐[ Щi]ƕ*#v!(Puj JiRH[9U"\4k7 r7{tɔ l! X W&YR|{rrxG;6bt"3uH)J[B0cwf}.v~?EadY>lCjV;|[VgaW HQa.N/r1JW3 x4͉6kmB^:ԥ!X m6 8u(ۿU{TQ?UO/h\{W꨾8|=W;ůU/m3O acjJWMz/Mh+?>4תւJRJR5~תPh_5꨾5_'.z'}W&?-;5Ӈڼ[Mq'EbTg1 Br2:CL:#N (R&J(%]RRt_ NY-7-ppQ83O-=z1jb'!ZCr.(؁VTPVBFSuaGn< zSu7J-E>U{TZW'*/jDP{Qh\ot}I:c?Z:iֺ֨N5hpgT{ugT{u[ܬ7ؕ7ؕ7IyJRclf\{}zwV>wBWNsBo7G-򖄬ˉ\KIo߷SCh95ٟDgvw 3ޭkC¶JRoAݻS6`+ 5r=*fn'!bSId3)ᨠNU!vvD鬸\KX V!+(@*Q'Op&]V\ɟLQZeRR$(+ +**ar`J2Zq TSVv,T7ht!AKއ%>)BvaII@NRUp1$$YJRTQ?U_neUmNԗ}zw_ZT_Zۿfe_mb֪UֶT+] yU&ПWkQ}kA_]̥)@)AпWkQ}j4/T_tzY=BӾZ\ot^_U/iJV"p5%6گ tb2rrX6+ro-3:Jq2Qgy}*#;ʀ@dfOx5̶w)Ի!fFÏ7 mJi?EIפcZ$Zp-ZLE%EDvr6$-K"5 eqےpc֙!D*Q['*IMx\5<1-cq ha%J$KٖNkr|IҘT8jJN*vJjqn&ݵHS,npwld)rKi,U۪ZIKj*V{:".4bM&qemw 6R$ ,&MZ'SL֤$vCF9 ҕcn܌UZ&ؕQ <tv]>&ۄ4$%N۽@)IhA*%CǜI=qLYJeۊĄpy͛ y'4o# fٛ]RTZW'*j[PUǼ^iUIh#l=w vj % N@HTI$.t]ST'u_i4pR:ֽNJRP c9qE#%h9#%h8YX6oUO+EYX6oUO+\o“|٫%[UMf\{?|Q)J W/E QȷCjRdIt/̐ Bh3K~.6 "&.+ 8BZmҴ$8H'3qnًellq) X#iy*Znl߹NRlmwK ꖥ5[cK.Ys!I˃DoQQupԈF}:3aBJv_ˠD$sp:U h ,8ܝ K)jB*PJ>uy&,}N&H-&Ut/)T{H˲CRdiu’8ReICRR IJ@!C5X#_ @tHuLɸ%ᴬZV՜-3vlv׹ie']V۽ 9:ny#I:Ҷ#K;AvV*P'ɻTAkչ+I;VPpu@sR}--$F2|XJVP0NTrG!novW=r*^Iu ̣9dxǖgv%jiIǒTw۫^J Sjok&µ\rKC0n.*\Ai=6+~tMM6+,Ew\{*k0mr.ZNppRʸvWcŎzӇ݋ogE\X lҥɌSċ%+A8ϔ:wP:;SvFnTy+KpC!FB@4WroWr;i%jBG r{sˉ~c'4)JW7u.^Z O5꨾5RRh_5꨾5TMz/M_˽liUIebOD}S8# i9BܡyNjѥ)[xt"YfnE!P4[(!~ӻQJe43-kS i2Θ"d5!RR\aZ]o+G{M6p} 粥!Mi'$$KgJsU欜-)s]bڅ\ JVGr@PiYn\%ȘqТlG䨜kZ$&=o-ɔS28<:fbyqe*!A)iI$)ɞ]ceۄT!9+B@yڬIZiOD S!.o G`S7t]Sq\1RW )W>@ݝi2pw荅ywGCk<Ȩv@#<}ŝRiG <ҊmɭHP8 uJniSӲ"!|jZ TI<&aڏ2Hm$ *R5=/KkPpKQ!>$ %JQ yUzoPb[IZG& Sjd̎RxjzlgڃG[5v Ŏx!@Cm ` W+zJRE#%h9#%h?1{fT{UfT{);)JWm_lޫbUy]ǒ뒘 Ly-7@Xv)'h#"͊S}? Amy6pK8v1=qjG,֕QˍZ{g{3߷rݓ_/Rӱ C!2‰95áSxb}|EE+M~'&{>xfWMnwN3xM,v/'jqcqmHP.Ss/u;$:i%n8RI<TU_^M9꼉|'Ȓ#y \5}C[/)E9pf'Ӯ>^ۋc@Sr'(y;{>}fgDOiZFO0 4%+=J89΍&^;n5}.mgyziǽ{roֆ9ύU=~'nYTdVU .8:ߌ;@2 T[޵E)JPRO5꨾5^Z e)J)J օ^W@ƄEx^a6wJ;WS-_=7}5{kkBd\ϥ rLT:T I5oݛefuI鲟fHGgo^;\|dq9HW.}/L~|ΧS-_=7] q"'T jlSiHN+)})*򐔌OϷlwjWS-_=7W7nO}/87̸ޥH?I <'a!dOS-_=7W7n 'ۭ6ZQ&o盘W?e6qY^}Jz?j*<$q=o =S$g|g>Ge" N2NweȨ>R<#ZvfTvGuumڂA#kW)J)J)J)J)J)J*무ݑטyܦv$ FVyy};+rӡ0ݧ%cyM= c~r +^_WBIT~[ ';(miܣ/]<؇U~EouzWs?V-թYYlP<@yv=u?>Ct yU&-1#b-Ąꕵ(d'gu?>ĿFҹG^yڪoz}2gpYojTA8@(괮vL]';qJyrZqk9<$ɫnWj=*qlJ&;(%J8  bgx)JJRJRJRJRJRJRJR|jv&mV\e)@JK{n.AH@^vuRy[t[ܵj9$y+߯4Zotz iG^T6P)\9y;'RmsKHjP3~At|ݷiyJ1uz6Ԩ=:GS?g)4&2x^\~LZjmĥHP!IP d].CE Len.X>JxV?7 <+g߆+->SP|+g߆q\ڷLq%Zh'ReĻ]3HRqguxOr-Q8 l]W5`(qΣYwFa)w}{G3Тx-K^ʙ3?Nh'T ͵kSNew!_ 29-PODqX>L$E<+g߆٪+tvQq)dJ}y<T ÙFᧅc{ǗDT#쩟3nT{ζ~(Zu|q6R(d|F-Sc9GA}( 4FrBJi:gRj垭VvCB%)Zˮl*?p6.rrIZN UaC#:9SKR'T_tVB}^iUEI|Bbp=c,*weQJUe)YH%9Zs{e̝Gei_#cl$#I<ʾڭ܅Jx`lvV9'[4ұw%ZR$F;/8\dH8$c55a xO!}Xl)Ysr#OOJӭ5˅ÐIpEitp{hc,D; !sI;4ҳVgٗZJOM, `;My[ Y ZFi*B3d@S>5.q(JKO)m^. ` J@ZZA0HHsk4e4Z! JG?>>J^X -1}WK{{\$T5ie-A[uc:Ͳ2H=xS^75XWIRT(z2J[RB;‰'y&ǵ/&9.:8r[RdiV[cHm` 5&ܩPs!IVKZ1:y`1Eź1@w@Oy$ŗi0͒یnazNsXҗf6JŚBgϒO1˿ӱӈ2dJ%㟐*.2()SμrV?k֔X_޵u:9ۛ[ڂHSE$dyR I=¿FWmcإ)^vR R R R R Rnkmț3)q<Ь'*)$DV ף6TZ?+9'RYcڎ+Wh9Sr83rYKm<φ'ØOzjWxPӿ j#J}JG,*(Pp:+7]FgOh;uYer80Nr;8-8; 5)\JRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRjhdf-2.9/docs/hdfview/UsersGuide/images/menu_file.gif0000755000175000017500000004644012050301073023525 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,4 M1&D!Ç #:qŊ)j1#ǏCv Ȓ 3Di˗0cʜI͛8sɳϟ@]22G%]RPFժXf:U׮`zJV+ҥhC)UemUKݺxU;)F˵ev)+&K㵏جPHO)ռ3涚>hѤQ]=V+ehhqKz*4ʠ*K\h-nTyֲ&~uhm k ں߽u~;h~~;x՗mzGnc~r˰pűǞrʽ'R6Zq)\'YiɅ['vhubf.%\HR*X8GnUS܏TUU){HeX!Xjؠf!F \p הm9Y~)U\q֗iW`%va*eu_jʉ2jl;#12R7_=ak)3ܗ!t™6**靪zJQgykpyK3'ܧ!`A.#s6Z*4ɨz2B (ŀ2jʺ.#ﻡ jנ{*] \+ꥣQSpۥGMiQ Go6ȣ6n ά o(6ˬj<2i0tIWý ZԽk^ա|4V}l&eFoAF% 27@(8r"{C ]&|s2},sCk;pYMhCW-uk}jpo+I_ƫ5j!U&( ;+-F($3~4՞0_-ڼ#]F7@s,:΁Z(Z9plb"/yjSAit ζh( .Q @@| EaJz0@*hPa\wU0.h ʟ'y*fC`&>zq`DEёgݙvH 5{9vi k< *%0l`f\Ad)dOC#4 pPEY [F0 BfYHK2ڒ,hm\@^ k̰љ\f٘IglN|7D8|E>R-ec}']mppF @,^D(B16 hh4PML1(dӘ c3cљ7qDHK7G⇾KR}= eaPST@2N# 50l/LhU &&Ih" [hX3A \6sJU'_5)Exf>3},3h%pɲ! 0P469`mZj()A6Z$ D P |*㨊@T4tcn{k[իmZZ[\sp8xfu7T+ O@%2dk9%755R%C~ @V g'Q۵B+[ߐLLe2E?7\K&<ᛵy(@qQޕ$+I8꙯NړGM~I2Qe~VO,TT-42fL]%,gVr&0= u`LհO9*\c!D*@:㲪,es#JVߢع9KnfW)z7F0{ڤwK/rHcYHi8|Pj`kaخ p! gV[-/y(5-(-o ǁ%qucbal$VTҒq}p)ʊP@إ/,M2E{:1(#n! pr o:Zv95螐ڵRh&)qb^uAGŁb(qexސIMWoiYs uҼUz9YH%llM(̩l,ITV1n.QE0iYw2O~o3 Sbw{>ǜJ7Fz'|THX!jR(Rx4p<[4734 diTQ\bvV\rzGvGsUGz$e',Q6H 37Qz Q)xWyMAXB0trt@/b2 pJTxg鸎hHtcR1_1QHǘ b 89Yy y8  8y Ii2b ّ)i 'I# *7(4Y4 3976ٓ i@D)Ei!3egzǔPeSYziXZ\ٕ6RP!o0[Qa T:^lٖnv c0QD@EX:uoٗ~-%8PyKh9:F3 @tY?swYP|Y9)4@a)Ś @@sfTy5,,Yę ) Ĺ,)9 99@i,#a [  0v}| H1H0,p 8Cq@/).ɠȨ0*>ˢ7fXe( bpcǸ 4 b=J;s1ߤXCJf} w9ŕEC p 2q٠\ 9 .hj2@0/qoڦƜYI繚.Q49 9s uVc 3`0`1 Cj609:4\.q2Ъ0+ J:1P?!:jz sVp  AHC?j::N!]T3@:7? pH9V.A00::w+0C] *3 y/[: ]CY-*7 z 9`[쀧pJ p,9i:y 1p qH 8 T@@[0{ +`ja;\ Yv:R@2j1 ) P0ԶFZ~ycY :{PӞP Tꨃkn) C`ˬ6xڠw "1. ڼ Z0|*gC9=jʦyY fUPI42`S3|@` d `n:[ o@ $Kcة牽evv/Q~]{0ۻ|뿁J 򶓻bY:A\pQz)3-a˩xП`P F bpCQ0C;sv<:D{:ʶq|1ݙI9pV:V3S:UD qfs9  ܵ`A1ܠ* x@05->?Z=ỹ*0) MI[6m4JZ)S( ҳ >kAlW@X`,D2:}t:ɖ;2]!,(z\ MZ тx?e-E$- L|67OVi/9|Cskۑ\ m:,1C3f zc:D|1jۿ1н][b(-ա9c~ȱjGu:P9UjuΣ; Rb,;"(Zm,ZCm 9٣z̐ܳ@u }39ǻ=]>Ɗѓ{?;chZ͠$J(L$oTϣ~$3<^й.O^TdPj?Ɍ2.>C>A>p ?0/d ŀ-@{ֶ"Ԍ~}fVs"q.ܯOd* 7~`MOjߞ4yPȵ}񆏼݀=NT`[O/+om,DNomhԷl_h AcIFAfؐ!A'*$Oپ !őhtqeJZֳo>԰DT)LDuz*Dq d і-&hѨ!1jdU5mJW IPB3XuO fE+cͿPt¿8yI,-5ԓ/{&Xh,4l]1lq9sd7R&ۚkڔHUĹDKۄ,fVҨLn՜Xqj4 L,EO&&W_a1(%B Djkϴ1ZOk/"FA"UHBQ!h()V"Ni 4!"ǾTc' ˰|XyE."-"'.c#@J)S:l1)"(e!:eTp}\\* '>$cI nN+ܭ71'h#- dGS\If y@XL5BBSk#.I%z6mAh<$BN ` i95^hmobmJv ]"D-2+JSpaQË,X<3HwҜɣJE'"a.< v]+5nhJ' Cw%a~M0b}XEȧ ۺG"fF6-A0W=HEe(yՀ:NH]v_|7٦MI4އIz8ɧ oR-AMF+ QS3YxC5څģ3}(1WL~YmFX9g{ۍWrR|XeSg #U`}RzɁ25ЙOrBXC(HB)K-Hq foIH388N({F(` ڥtfQ !z'}D4 6ز>۔"[But\>1-+*jjSP՞fLMϖeD A%p(|+"|ٖ0D#j=BIj Ӏ|<異YЉ KB?,R?HIrC=4 #&eQ C؜x$eAL=ƌD 1,@bCB9M!҈Ȍ@¡澲'9d 8Ko8*1mj;lt$ ;&E#E?B==azϐW#Y䩄 Z!4#4J*`{'!F LNxTMhM?.IMAA8lTZ*&<DR* jÈ SOu%C ǜ:K(|̬ e{(w4nS!2,,+f!d2uF3zT|\OU~]=rl\:Bpn J躉ب,1g Ԭs;r-ZQaP Cx57M3eЅ"Ad"߸ucWm > TBڒ%*{,F~W!%^ TĞO.t&! zO)cT b|rT>p0`+8P˚vwϹُsɀ&$u+xԕ6I@YHР ,4lCܬm(wp>e0i@QV#p"E!z6IJs;ܡ4{ d!W"n9az ۖkJ {|RNoDuv:ZFPl"iɿ~k sq^~T3c@iel3$fno3sFr@ =?YO60M`jGѺϟ/rș5lTsRҙηDtJhfaK*ti=5h>^|eY҆zTӱr j:ÊidjCΌ:^4 Zj 15Z2VWeg_*aHN&HX qM"DYYN`x.~8MMaSM-Ief&qd]Vmj<^D6WlcjJ* :8376mzgjBDG|"q1H-*́r @2A嫑E)lƕ.t)/'3MBҐLLG~/ ◻;$zgnCVo^Ib\UAx%IH1#]ZWE4#H2eJL~\͸g5dȁC}S'W -Z D/l"kS3k&6h6Zapz-A鎰}\zih`L VA c_@+bҽޘªo[:hX:5<{C:Ó/6|>C3T X*>3L- Z4F)"e(O@ȥ۾j(HW+hX "`;I4.ȈWp1$=}(^@&C1u{5J.չER\K [?Y,[ 5z?ɁYV5,/f1YE( P+,YRJHӀ͈1\(Ωx jҏ+嵈X5\{ -R@ ݆Xq ØRޱj-FӪ"/‹\_a]nUɑտ%SZ X>;D30٩^Jئ,T}PD6d@asS:-fqڐ[ɘ asaᒷ |rE9d XM ](tֻN= BJ]@h,F@5(L ]H^8L^9.X eX^@][)=f&K-(ЙFȄVt;$PSmlcҵ}h1)L8ܦESdκ5躔CQڷ *dP1  Xȁ0Hfc ۄέa Fl.Na!:7f1i6؅LƄ۸Z2I0}0vpY1u4ڡ\}0Jݥ L̕zI>@$e| ?5 +4p0f`Va/#뤉/4z Jk0!#epxL -77,s.:` .b %-͏#PWVSG3.}[S W+ƶ-Ɔ(Gl,G].܀c(@ʹzudGߍJ[vwCX(w;u+g":.0'SV@iA ڐF}`\~TV')ATc'qB^\K Եteyկ:a5+:K;12zu"O[1={(tS8h}8YQW%fi=웏F<@~R 6yxK'.d {kdˌLir l)dm9Sa=zڱ}#ڥڠUڤڜ] ZZZڲm}E_ڥ́}@l|w~WbP~eR!Sv 2 l:Uwx(C'[eՃO>eFoC'Ch>A@5ҤDrқ4#ߌ,y2J-Uy͖#uqp28쫷QH;G26%Q*|uƢAWtCSvhFj:{0#Bn+-ӱn9 TsgN;_\b,4r2ՠ@BŸTge'8 N6XT76&еi )oǎ6>2._Gݦić@}.SfyP뺖/SǙWt 1UW`YElрE5Sa!`5\ Db5M%b Ui1XfYPb[y]\UHE:B e!XtߒE!A VYvUB6dT*9&eyaR>KmׅVuZR FnjjIa,ꉖU⦚Dd&%'!u!zکYw e]&cF)(IeXP"'Fm6jX]a5tf)+SlUEWZiS)Ѧ@a{姗WmH%)s=:VG CڙF PYkK`s"k[zq*-hio]Lafm`B; qukJl]OVGmˡ]hi6 ]N2SUH;1P>)A\>zCh.?C $ tkE(GrN9n(D>'SB%L ~Gi% -.5ߚUWG^n R^s>0:;<2Dc5Gp>[TN<3sfT:|FjL!}6xK k#A:N1ZbpMxlߒ(Ҩ '0DW,VI a+aE0qTppċK̒h.p(EzAd.\"G5p1ak2) 0Cj۰1wj{tgph\\0SUBrCSEcדAPv9EtA4Q #r؍7 I!~J%_}jV/G }, Ė{sԅߊAD}(#k{">X}l\";CozLTt[!t\Vr/9<9Y PE*&,>jb":,QB\95id4)Q@oâ9/YBkB8BOD^[$;K#* E>yĈx~r9ňo3kۤTK9Cp8!xE!}|9OŔԅdR$b3TH6J> Qg|%*&dqbӏx,x%ʈV%uzO^hAP%=ϊ/m}Ԭ,1蹖nmzQy}ξYJCb5JG\M醵| y fiE!<'K)$Qh"@4|M(@# e"YyԐǥKϤ5ZͮVQP&GpFhΈ'4bUH}G=͏~̕e9)]nZL]rɕ&€C@ҜfZԃq2@VxDK}  JهoFCޘ<Wa錑4 -Y^~{0NdJ{(թ 2NGE8FJm-V֙٤`>:B](McPRٍiDэ~}>'5ԁpS=̠et] ߠTb\(ыYal,%ě<ښO=<%G}-áGfYE,e\.$Tݤq/Fڲ͛ [nVopZREIR;C̝e_҅tAGfU:HԝFmH I0.%ڴ kx!g'z&TU|}ާ|g~'g~g}}~"|''(~6((gFhT~^('ڥ5EQ͜QƨJKq_}r(ͮ`DW ]l%x`찞 ڞB,M0O\l^d &wdNdVRGLjM(?T`qUЗPLD:}\XRL$'QN Q Eš)Up v\aXJNOC)rqOVE]}C,=║ G-JrfXX CWXJ"fe\]dé-EešᎶr*9K-%I:Dj}sTO1&==(YF۶ ŐUEo>Ls Y`AevղɍnaQmpU4 Ŗ4Π$F,^ENͭRTK%Qj h/LGB^bD mXhs;ɇn4jp.pbމ]i vF%% ~pIwiV兩(wٚd}=~*iϽ`ӂ-X)rmf]Ub4, rI`iY 1rlre+I؂]u5vVYd0sIjI-oe\f椆ks}@4]|0x5Nh= hh*&OB&pɶ'%8 0I^izU6A,kV_q0FK7\ &*%V t1 MMFְ]]vܨЃ5sLMXU4B~ "8L-RQ$l&DoED4R rA@LE'& <d N~0rM׃* Z%FYwGY XF(Bi2sI3Z&ۜK^ [ ֱ%c6m&Jx)y2̘dk%^Y&1ekZiDiwhPp[,C(C(xWy۱bYtOhqGiZrsM\T+ma6lNԝҼJRlU BfًiY2Fe ΆXA!^`:f]ip&PA24@(3 d 0!DJ[nM:4cz϶%FOx&)*=8o0 J @C0$AxCC->>Tl|ՑYE2!W:ĶuB8̙ܼ]Bx r0</A4oϩ^’78yP̦0!\*?Y0n&@DjgBD$|pV:"" 0r7N׏Jtn_a;Z((H);<@^Eaۂ^8o&0څ Eq2MemɮIBV/dk-[QS'qF(8*Co=a%9FDD%  5ncQ0B8@VO_=h.>e"ԧP D1fԸ#I[o_B) i[-1p 'Epےdt &pU0H#Ό8BzI~ZHJU쾘&&k!Ãte* 44tciYhb*4ؔkhtr܋6|Ȱžg|hЪW0n.תA"|-2V\Y[omVE$FqY'S8yd&NliMq6Fvkk2 kp0FR e* 6M!.R*" NEBKE۫+oې/Sq͊;-ELR#Bb,\i^Ѷ eD>\c!Z-)`c1؀,5e$ĂOC"M& ZH9% IFѤ !+8fr M)˸~KsGpko?qS"2RCN[h8/4& u~ dJSᴲ+?6m5\pZ0=dZ13k;E$ Q ̞rBkS&롪Rs;0 &=N?6Pep^%T[(c4Ԁ9f5hfon9 e.f zh5x9fo&g眝Fen陵YgM,Fk߳[1n{FbUR_=1p4DCܺT#M74U.'݊5a]=N<%n4JP\#G3E^Njw-;0&t'@77muMVD2t7;eШD8M<_o%}˼]O@6Z5d\3#5n{yB+Jy'qC4z@وLñ'RCͫVk$ g@hb^$;!LTP;૓}xürMjҲ'xeSn5+/"V"¿X+!_"<]l]2tǩUBRLS:KS_Ӽ<6YdXU%"zy+Wh1-SC 7_dӭ !h]\Q`!]l_ g|?#v:_,E#EAbQ9:<`h)!h|N+CWw-}t'.ɬY~;lI CBM%L! $s⃔r\dpB] 1\xg:qgZڔ";I>yh3rQ… P{:3> Z)D}"-MHtKX<5R!DNJ!((A3eAjXgSA_9POv  |XהhPMc^R9 nˍjp1uhs/}tYaI9L(eq]  xr0`h2uiF(H2KL/rv4& g=&bԕ-cM 'FNu .[y8%GE%*IђEk5 8l+iQn#3F;C2v! cA5-5/S'vwR&ضg\r;&K;i V6S"Qh9"BqS1| u7T YЧYXj ZQHҪW;H C_(>[Aq;Pce,ByLpp*|ZC4)޵)"s̀BU<>qNy8EI%*1KEMHH- + WdGʴEuh>,KvD@fopRz, dFo x~!Syuvͻnj$ Ph"a CJ^\THYyHOw((y3x>p9+Z4҆rXژΒ#IOl㫼U,Tjtje,NPI F~ S) A6-J7uakIRadBGj{=7Iex`Y巕hS"v2Mϕ7^(^CLPY)["H0 Ջxץl?ﭏǕKo>][b'nң I2L\%`&ij@gfhf&jfipgg5kk pjyFj.iȠҊQC_mVpip#nÅ2(16m rFd:*G>+ԄhgaxִJ.Oj4p o%Le\ *yÒ"f5 mRTDSHN]HźXjo{!+\'%~2&P Rk`FhlgkBpg,l&y5f¦f-F˦Qpj Ifl`fs' `j0A!h;jhdf-2.9/docs/hdfview/UsersGuide/images/property_attribute.gif0000755000175000017500000013711012050301073025524 0ustar sylvestresylvestreGIF89at3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,tH*\ȰÇ#JHŋ3jȱǏ AFe@iҔiR4hĈ1bbsϞnLQ/-ZTSpdzիX/ z Kvٲhϊ-ŭH7ݺxk׭߿#|e(e+3Ir&hD#&N\<en):&ˤHr4װ_: M۸szM|`a.ͷoq ^nz~M[Vpz#E3eƔe쑳r>ĔNA uki$gMjAibyfXo9t][yZz%@á]ɩU]k1bqh][("ǖo \=4I}ida_f]vfTYfb6d>84фSM[FlN"ՅB)gr e] ޏ x^tu(FdEs}rgwU)%'y@S2( %vLQ%ITR0 nږ8%!T6ۡ 'pfgc8h"#r藧~\?ygbq BZ|XH,3I)%v_c4A&%VNƓg[v\ZӔ@4)elj/!֢s֊ʅ}k飏B;z-9h"'Т:w>$x*+qQ8EeLg06LTPVdLQatsdsp>,.ՏuKts"IΊ3/x؊'uRwI2|.HEoa RK8 ]iR`2f&2Ӕg F&7drAq3&eQӓApX5l /Vl@ bCj.܅ZoYFAHw)hx#Am2vL IĠ5?irbB6l }Ф(IC$I`n!&E@Pʰ2 uD~"G-fE081*$y`TjGp:̸?G#$+Rֿ}] s)Ec'>* kYFReԇ%.ɸaSdp elã]5LIb<(@Q @ J.0az^<k47w/d4ȍȚ3[ُӞy%ꏕ`Έ)=r<|T jN,aTbQ&V9ݙ"3p'~\ȓ%A= R5ʉU:`.{S܇QL{{3=f҃ ۇ0) @t880B%*̗>b#nϪ_H>]ۓ*N]l y 7Xx(Ώx$B-':Fv #=p[m>GDQ4i,idTk s2Q ;4 аGq%JӔ&%oy~ P%.8pA{I!JV !X49L Z!۫+,c#^7|,pGy Z*A/JEíEi|AFnR2Ӝ͂ " >䎒gp.@l^P5sX KfIvC$,UQLȶն&uLcיa}zyKS1|T DoUPiFN1}ۻ DӕKHUU݁dFU+A+ڨHֱB nԎjެ> =)1{F>J7r,|[ $kq`Lբ>VF&q .3Wz!eOIMN)>eADC]H8U%hW8{fH8qA:"f3#S/uXՆ0Aڋ2\hLYJR1h9d_'N=1s:!/2UI/)65ʓ$N?Q yUXBCwE4#>>O!p&K)x,bdzat5H񡒾Ę&TQ[og >Rr*ېjJ?~5β(١ X /]qLh($Xlkȸm^f_V#!0_6!  0,]7P Rp ]^S~ Vse>ghG jps@zTp&qTw>% 7^`EMVuRGLcUkWyzL=;X22OY/@.2@/Z?bduq7mҧ@b~} 5C$ASvI$T02!eboa%-ph0 nAA.1 /Xjk`t0aTh.>6YR.*"ZM7y4/:Xacm2v~҆}p,%vAr:qnf&0W2 \1%sx10(2px8XvQȎ#*9lXhrfhp qdp-N$#s)rA~4YHfYXHBm8svN.Ms'Owc4Yx( w`R$. @ee6~'J3xbpWe9>Ye`BYe@ Diq51}E4_j!Q9 tZ43lc2L/7rHUOM!eI[9d6"/b؆}m@b'bv(32[%[\vJXw% <(aPYf97aIOdXu\?w-|qdFb's~"NtB:Qk'PSe!4wQRd+ 0 1 [[ JRܩ{iSE2ʖNߢŘm"~HsMi ^$|HFTHul_.,.]k7QZӨ 535]#oڹ9f\]cR0X 4$N4m~Nd~Y2F6C"vE.3Ɵk8avH)YdRwhoZ"w)! H Jʅ[ }kImf]/V"XXlɥV4_!$)[8vɉJY%;1<RQJ^V1iu5مԦ\4DOGt/]Y2 AW2/<Z1/P !$fGf [5 5Qu`NN|lg=c2#Y&374MdW.JctD Q(QvBdn $1[6BW!65&>J/+Kv] {芯SZ)?#ϒXZYfIY+-3 Gb:F )ђ Đ N+\\ O -)Zےf۵f+``d˵Yg "(x;:! cbx٘k+OOzwzJZ  R:ѹk+KÓ빰K+[2ۻۺ eRw0k{λ6  1 0;嫽7p苾쫽(:KAFAWњG+rqz?ZLY')u˳l)q>y9af5dPpGқQªG1 h45? 1@|AQ*Abu QAVu(:G,H\MW|@H E/e\bjl\b3c@KhtQqqd,%4;caj@ʼn ]DȅEPSCjǍȏfW~zn: Sjͧ]8ޫyZ|U sC]з3ܣ]>ӑ Rtu7(㙍rKMק|.ז^l].N.#p:[+6 ׵-D/%/ܟ.ݛ>uS,wt+]S^yI @4ipY8 [L8n(T^M{Bo2C36ᇾva!-uN͵]eF=-*2C >G >Zlp]w O::y)37Mm!#o Ao܅^Imܸm< . Ռu>ȯ$.?/ojd0@ @K//'^}-ӷl_}c0D՛O F3fTXQپ}#YDXo}"d9ҡʂ$΁k^q&Á'yҧ˔P.Tؐʼn5{j4&Iрb<)c(Ț5Ѳ]mܩ Ӷ{B*R,ЗsN*DdY}]I)33h[*021$IJ 4F$T7ܽov64o'> >5?]tI!zPUDC9gCyjPj5%}qd-lחl^S_7$VQiIJ P*$GIܛNƵwŘSIze].t͡q1ª65Qѣ],% 5J'o*1dBFGt1阤v(/̣G L C*/8α{-3 +b8f&TF YD21L$[8 @y`wqwC9;B(E/}cp62 O7@ b@Hb CsC Jr41hCMxr[!Ҳ2R  *% ɶ#~dYʬH1F]egγEY {q Ok4^^CX `]ލ,MYEA^)M.Uqv0s5#h X\H4G:r v@!>|R#U.J豒a_O5DC)J^bg$%97t"`@ӂ9aQBrh*8R*e ( (>6дRSeHPHəEe0)2ǧp' @ ;e!! Ҏ©ƥ|@iqi5Ɩk6 ? ,,\V h jD&ёk3XJR<;c)+$*EP*ܵr h,&|  36'.ShZ#.9C z.};FL+ CBycSHESXOI|/4h.H7.hX/P`؄溚I̟Qz*F <)j+ 9" @f`j!L*|B)춤$E\o 3zSiL,<:zj)s! OLaH3<['X .O ɡ2ڧPX':3CCHII:%$5=SEinҶa+6/Qyp1!%EVpgzgtih~.vf鉾~gD"fg2j^i6g~g.pggjVv&qNif酞i^kg-vkk_NR9ž)J<%y-%ʶ&m9иl 5E)ꟁ6Km>%E K K{nvymKھm.~n!*Ɵnnn6o.|Vo&nn9oJWfoNDXv3Ȁ 5"%ISR_SUSmym9EpuWJ6"PS SQ390KjcS1H橝)n rƚ 3r15rb gs9[,G}sxsQ:rNp&r>G,S5Uq*tsNsq=Gs6`ᮤQNHe@mmv P0Uּ F8*û )! hief2q O 'sd]Kfh2 u77܏LtS&jYV 5~Cič%JA,S'[U&s|w,-FcVءmt ۜFfZ^jx.2'HҼf Cϸ tԍ \]sֆ@Ba zMLzfT ܣEv$ͦ.?ypӼe݁>#>m8P(}NhrLE4iyĂ7!clb^[tL9uy&pjفG{Sn&@B}NmJ LV̉Ks՜f+~:bŁL~ܺqYQ_yp}&o}dTROKGZ=M]tZbu݁@H22ˤYF1hUVFPtggxvwA K1'RQ)rW_\tv}umkNfvsQY ԔwNVJ4cSfvy!I5)Yn&'ZqqvFe`;.L]&z)㍇Yp^)_xҌ\!ynu*fV~ڞeL WeVH#ygPmʤX$[ڀm_>қוwzAJ&msVKm"M]`4yk/ uƑ6-CjxֺaZu`a(QQ9$<39Cl4A .ʹGCOW]4U=(3b`Vx$3~ծLRܨ( -[֍mNHuT5Fsz[x)_}g9q WQV,^t5c?JjwJիmfPSQVZo&i ۭF/$N @nE?!Fcϝi!DO>iu>c5uF$>PIo Xcl 2BrŽE?HmNybFAtePі"R!<̾%ZYr-ȌYpjB5h3쑡 SyuYdS.FINGD1 \ d`CN"xK!ԇWEy49D_ #џee*4BfvWҢ ?, !HEvG,w:€b>Z'5X\ov%rXb]!:awl ;>Ɉ}P.Nw/|$RhD*&tyDXz"Kǔ8m ]\c<*aBӤgS 4D Er!ZZ1&Ii΢D5Y<$g>.{iN#tD2}JsvIhXҀ}XYB+A1Gy:;l Q@" gJW ''Qv Cq Z| U$нr͸m]TeVg>WK=tRX!CQ8U*_@EVb!w?dfE)(JѢs?i\L{>eE(5I˝9u > #Eilmj夦ڐ'mѥDdJhS~U5,Q ¨93ҩu+o~*FIȈ-; YY8^Q8"5j\yyI/rGfy;?SD#)JԬN&-땈 Kc a:DO*",0 G; B&rrR6~íyhj۶v{'d4@5Vp =>ms-jk{ػ6ɌD7Sz`;b:'{?{Wr*B[" ֱx}]v4tʢyى ]Y,"ąqWFls 31E;nV8~6iO-E}qV:G&g^:7l*>Պqv !0M5Y/gmI_{Dpb5]G ԘZ!+\i; >S_)׮(}nQ\4姤Ԫ' k΃e7 Re(u Ď=Om՗usOyNIg۬͊r[?Y-lJxgźN<`̃ `K',"Z} kETI$<Ȁ MDBC4BN)td i" uCEwQEKlRp =ШF*U.H աNp`jyuGQpB՞K`-E,I i AaSNFHoA,;@4=cdJ1b4V[ Q/"Y=bZlx^Op\E]Kb!T[ [22_(#HB QEepHb ̓ ALeVNe lJ\"Tr`'\ |.<%RFCE >CY(CY)h0&e-~DEؒLB^_LħD5I3M~dN9wY^KǀEvcktAmޕlD #E=ĨÉ4>O(QBECd` E&hczϐ\ɁasDZehIfVK%>ږ0ɍSm.@q:ݳHirj5i cP=,YtEKQXܢEE#(D;tjMG%QRi؝{G &EaF/-~jIzj4Uk` MElh}F'$"4,Bvs.aj>GA_*Tgk'V {Q :|""=D@`F'gYz)HA< B?ٕz#5a '9̈́⒆x`J"X[B!? U GhʊNxig8NkL*"RIˢDZ" R[L9)&ʼn EBX%F%0Dt ~*=ptnfh QGe HLԃJ)4#dmr2X>k=` Ca JRx1Vݮ%F䧶)$Z)1X4D1I(Bl H&iF{F 2 x @[}yn)ê6^}acdAd [ cfahAږZ zWv K,Fe#@TDrb`c$G2QHyW -7dD0έ)h$!P"퐂?0?DO\$%B$0lC&N.4`C.\!(=4hdn=$PF.F |dk*ƪ>Bn$A06HEOKdP,jULSH\ h6]$ygQoa\rP o? ʹ2#euɠR]MJ3(0H.t2É.R"HeC MR#!N jg34p"҃2 Z4߮2Lv<##44#gm7 qԍܤu!W<[C&C0e `D%:D[Gd bRp^qq )-^Z%FC[€]Dt%{n `q)IN^׮ՅCD&ZO1aa=}͘7W5¹lq1,W"M PQ 9[:#2:Ge^gWuA#6!mHb+CHmKa{v7/,es.]bv&::;;R,CamEVlb, Kl/ė 5 .!SpQxnERݐTr:Y_9&c1=EJU6RYtzޞdg.ܾeR##8OL}gi2yE9빒f/;R:+0{ #kgc|Ehy7oi+0ybi{:;3iP>@ğe/`~e3xsLoϚ1]SI5fק)26;Ipdx=ɵ`QΤL$G^lI,ΣQ\aF˱Ͳ;嚃FHs#2r;{b罘;_CH=¯;Q#'~{T@C9Ā|, Ez6'*`uL%jcʜL˥SGI܁Ui`/>־kgQ#1Im>(Z(ԣ̃<-7WP@X@,SL` LO_h 4(a4ƃ6^4QYƋ Mҷl>iW1-[ٷa4 dȲzF/ZPLAPiѣ,y]IULY\*aC-V+X2%+7U2ܩٰ]vMۓӦ{ vաܮc:d:kZc_N:sR.nب\|{t瞬&-VqGM=4fhKòD*àJ Vzj;sH D > l4ԋetIQ7ʸs;H|TL *l.Ř -E⩺jD\{+73+E_X @rCl,,2xSJ{+6tIDkqʤ9vLJ3Ȭ/J7ܬ+NN,k*_c/L*L~PԄ$#J0'! $B1Qq]YvF'b &Ö$!J* yDä ll1+=Gϫ"n2k=M-Դꤱ7FiZlZjNmILk góQz9<^tÌܓ2Z)pKC øojnbNS_|91 ǖD z*-ckaRjMN2XyLQ8:]}?\DN\Х]P:؋\G}Sq]Xh\?{W]/inCN[Z^х':ӓ`l$0pUoZY^za8 %*h`0ő\^tAx7ՋܜR#)hbDڵ3af: d֒$&9yi0WMQ :1c)fȖIIxYX24 sxG;sc@"~4!(HEᏉcLP4 Pbm0?Q8owkI⋍:{%ct:=P9,YfOGLWz!bbef:OPL6g>8r QR\3XKE4R^d Nk&CDc N Nt hEcQiG"u;dU~ԍL ~6xFj*ICmDj)wd% <=T) |xs]M殍xUlJ;g cA9"{^ұ hjCxQuD% vyc$,UtS)ޅOMBz =4"*֗SiMmS!)3tìrF;\2%)^brڕQ0A%|vÀ.[bT1W-jE} g=07`sϽn`,#C2N)bvkLs6%;L{+5\[.ݸggk}PԉB&9z4]1leU Z纊^`,tmqxʩ7_nDf-X  3J/)[DJ. ]H6V_z[+oIg[bJvh@Ji #!Gёz$9u{׹ȩs]H4T^E|{n=f$p>v9r;Ӟxo3~gy})ӛ=X yO!荎$x9Noc&|Oi=:}/?>{O}{$o~˱埾COͯܯro@OO2#?M/J/~p !s/PU %Ā< Ȱ 0 p ٰ p'00pq p0fBhZ*d'%e4 ʬ$1h$&^e8~FNB*d4Tz!FRj2e4c "(74J0dBgBqZT$OM_g'{h0Тe+HiU vI3QӨM6cSD;hD8l-yf"&t& Cc rS͠C#R+Q4"%|bx" NER W539&gO61h$Y*>l6vKA @Zjv)a &aR`H(D/~D62M$e8Nڴ'`@ٞ33'A'%ގf;OX5adoÂtac`!AVV(5d2'D)Vǰm* >LT^t͚7X.7`ef4aal5ؔt\ɕt3ve@[[ʌƪ,(ߤC~U3`LDInmƀ%A €>{mMa{q8uX jVWvvgfFPͅU Wrn Nmj1bgEw\Bz!6 N!@wVa@p"rAbr(|f PAby`A uRa!AN4{r==*ft=x"8^w4,k{`tc`v-[|}Ya7&AEYLq<͂A?.fx'A'2c'+*W9TVCfpR h[,5J{ Mi (5B j R47"z6|"FVBRݔe''.YbdrUud'IT^tz< @Z+B\9:[?McHG3'jR+LeKK^fwR֒5,@AfCFfVaF5!Fz %'ĺ9(x& qB-.edF,bHP<7|yb%AwN͵5{C!m;|l~VdRmtǏmGg*yAg{4YMmr2?fdHrx9^Gz1`qJ;H?+[7rGe}+I).@p=:(uv*^Wba{%jbKr{%u)gugP3FհePPqDb:Y | RǶCIt7B!TGWiܼU[?z q#fz.]'f!I`)sO0*d`hpE+rH f>ugM#[f))̵,-O>ȉwJj% K.zj9tU-+ڟ{b[Ub鸥aؙ(Aoav$M~R$yMn + Wlx$函t_>3|'C9l`oaJ"\s7PQ [G<[ FLgC{9(:Rec!{ zƟ(Epb}Ko}*VZ="Nz6Q߲ Mq#9γraDFє+$& Pm#ȇ)3rTgĊR>Ш2ujtD Feją KbӖl|\2PmP&Tm%s<~$ߖ; "58d7omMjQ*E/ Bz# gM5Ķ[1%ŅR@G55hFh0&KH1(tGw>e$P90`.GAj] B0eliBaӏ05OpLIU괂i[iDdG#:$u80HU^YjU11:CK+mްcMK)$&ulsLQ;'v2eSb3R'0DiBuEjgZ >ɛeeg8%h{/oZt5%}ʃE?P^oЃ'FHFdE8} T>@/!]fII="H]U<|~Yc]dHFhCH3(E؃=D]tu=J0CŃJ]&h?CL_3kig=~ V?Kb8cs[0 > ((2Qgզ`@McE5pǓk^VDj\6TD\@[xA\%J\&@d"XM5p FoQtO` P%5o?PnPn\@Q< a@2Q ؊4nf1 ;<5I]ST\UTXUfRGG~BYvYqnUH/nj,F/cw@K3%5? FQ[wlcFF9ZaYeK_eOe[U[r[M%[jc{yw4%ʠEhhhDjzSKM~YKhd~ KhcEDjJ5h0J6{JMFHGgkj"j@SA_KR"1 9grJJ dm4J$96dl9lBUe6n%n&ZaQZ@ml%^9?Fjoo&&zXoPn!c >(8E;Bdֺ='C\R=8dW |'0 Aky|=5g3G=5G:A3* 7ZzJ= [+k5^!L;guw4x7y+:r[(ICu#xx׳?x@xCF_x*x󲑳48 /[xW73c9k[˵]L3c+<+j;lk@np>3p<[~ !*r_R]ķ㮏 4+ A{>51]W7(E~DelgfDDhD(FUwHPK敩4=m{HY4z$Į3z<ˁ/ڶ里uaK&SeCB4i24H,j^J<4aSiI5xgoXTƅĢ%+YLJm/H6<䛥TED43³~aXABQ'wbh唈N` aNUM4|P-Zsie4AM8S:5PD%`Y^EHUDHEC;PPȋL$PxC;Ūdx sP4hL–}3*CR~_D%SJ%R\mEXS|BFG0KlMx PY=`FhVS!+I!yZ[eĤhv Uo蚩ϰҼ~U[sj,ռېsQ O\i,#}_YAHġu_VY cFlS)CYFJ@MVL.гg*EŋK|Cc3+}9IPP֡xYk [x xԘ}{C(Ȍf+fGNDfCl-NK PFR飘}`ϩ`I` Y` ]-`g1_lx=Eں5E)cQ}Wv( /lub@zE7xZq 5 76cdd܌QIC` ĎIm0^@҇%=bHSYfl\EYLh= %lB=\ NőU+M!; (eg iXL69T\Fh4w=ued0i:P1Fi&μ㐨 ,E4Qv{/&JDm XtJwuTe*kq*]˸L䟧ntjlmـ,ʵ #30[Mxh^.lGU>96$p\~~xS]qqqnǓq)|C& c&|[r^ ^s^| s9  , vF y-˴R vc*_=M382;y99scQ`BAKC;V/OS{ [4%;Y~O+@#1i3YsL ~ߊ5 L1_+Ck+~F;w&Cs.@czKkhؘ5{~= %CT䕬@XsDR\|j T*~>ӂնI˾BCeG6a`J7XyJo×k8Ӧ#m 2ۧP}doצ}D7c`C "lG!E2LSPK(rP\8%Ê_zqfGy1',ěA0ΡI.e4離EKL*b4DZ=j)9K4hPΓt #Sc[tDnGո%<.2(>C4>FF B1vA(3Z0.lh"yJ(&&.yr..' WCxMĐ,0]>Ĺ FI#q1.PqnIy0|bwr(H7{-5|3(Ts6e:8MENY/gO6$tR҈*'} @+ëMΚ9 KDa֌M$4?Td-n<1%YWeÓRE+VyuXga \1:+&}GUx܋j]V:W&ȺvGw]kW%LZ}*سC)ETukޠV'8ޏ?;إ42!heJMa}ЈMR0IL.BV^ )_6#SEz6ĸ,2Y^~ :ZrJ!D8QB!k0~2mK<27,&r̋oLflhT}0e&ycc5ZΡQ榫,  NGf XNŋ8mC"^28dw5Ý5U\$~ebu2"!'(I"Zhk}%S E4 xԭKӘ@hMB@TهP-H*1KUJ¸W}'B/c{L!8XtySKbXTZ @i^XQF BEM>.*Z7 ib+ ҥH[ XbEHE-/٣ڧ = 6eA FR-C,dݎ@ F+H Ǹo1wv+"߲N2682XuWjVN'oJB'lXi;,bA28nJ,D\+!"iDVCo%f8?&}}(YAfV2ATDy BIH1bdR*WQ6UR9RԩzSZGIRQR. dM,Ŧ2XLBSr`6Ñ$=*X]TSTzUaUYݪV9:*!iRK%ke٪V$[ZWU{ZWUnl` +XV^ kc% W.lg7Y B֯,_ Xf6-cZfVfzYѺVmo}[wsʀҠWHZ:5(CB]*u T2EW M}.J >FeܭzKHj\8)AD>/gUw7'&`2.Sݽ/OKuҕQ6cx31sLgI{Vica1O|'~͘.^֘̐cK T?Fd`9yDK&2`A%yLB F9 †cژdN%%:Q0,Y%{d`#ԬcwN^tFXn3cTt"QB{̐#FJ$ 9 d"fXd&#b!90Iw'xa o0gd0sryld 3ӕN`udhhk!6҈ |OurJ-9M4$`P\8v-yL/^_5*xAsb-{ahC2:S(Ddj3T!u LCxt7a `FHQNr\I8Tdi yOBd,5?O 1ieA2_HF3ZmfKy򖰤lR^Vӫg#\G#gv*ggYЅ9?j\ 6rWr/-͍`Y_~@/t3{0-D {Jcū O77y1-㡘(8Ǧv˜˜B}pou4:8FI駂NԏD֋]AX k鼋{& +3FȄ&߰ʈK(`2h 49/5(騟K$MB ^by&=/Ih+:!v p aŽɻ6DIx3+倒` s` '܂hdFlt5ꗅ۫DƙڜNۇ &{$I B)ȁ;#Ȏ HΙO:GJ:,0d Ĝ Ȥ2eHB/,C0Xg-HU4MQBJ3궏k$i,GA5"SCƒ8ŀ'p+q|ȕ6Dui=\Y٘'@*Q}T<* 8ǣ=|k e]7F3 DDI&%[߸' xW(&Wܨ씇<&}G541vS`Z1#24s\!L4ܹ=Ɓ9RyTyYGTݜ>?rT];8Y`HN)Vd] O8& H_dVP^bO@=kkʎշE6fR\)h _RQpYfT_BM([zDhJ]]$:uB MMBQ2S`Ht/ӻGJ& `~NIN"zrKKK!.b">b˶T-,B!.K#b(b|-'nBʬdb-+--c$ۂJKI\c6nc WM_a>@cA6BN.C ]&C.^>dcSeYnFfJB~QHellfmfnfoY]~$\Ml9yޔ)C/zLw~XPΧիh6&DBVfV{$hzՇ/g{SDZ)^vfi{ni~iV阦viijM2IO}gex)E:jxh%Vοi&ʐ}"ij꫎Nœj²zi>k&f6kk|륮kkt^M9uHjl|_Nkl. vglm`fkFt_M~zk~gERm&k rFprroWjuuWޮ警s̎ڦsF/ihm{mq!7̌vvFqUe7%WhXw'y_&4$?r#y%rwp7(#'rzq8g1msNLgFsc|Gvy({,{*12Wt&w?|G|O|_|W|o|WhS[Ip @ᶦnwN$gԏjNo[lUgu'iĶn{h|qxsh7wm~Qnvջlvwmjftg/v^uAE:~hmmjb6h_uogt֔k'(ohӷ,2}- TČicȋ%=<92%ɖ,_t&ʙ6=<4*Tr_a8~ 25TSʋ+51!* ֑;Ju8rA#F'؆q7QܭjTըvhBmdh҃{cN8ıj}Kj~͗4Sm[?{,mVȄN~8t\qCf/6N4d(=RQ;LYcŊG^lY|?~7_G  X~ah> MT; ?o$i{m֧^b k\]U\ ط\}$#mPE+o )[6y+dbw\sl..6pNWq"j2R ƅ) >\c}\*" H /5sZYy!󟃅WDOS.s<#$=,>]tK}0E?[Ox2u|ZѐӥNt{j ;Vζt5w\frs9ub[yIWq:_{Rs]>|wMЏHzՙy~|/dkXq>'}uf68ʴ` {Ij7};;U:`l#p m|pdqo-IO(ZaHR{4IaH̼= `Ki`pc $Qpx )QUFIu`1 r_YE[ߵ j R ̹`& H5GI"wH ɞA]B ^Oh i]ݡٝAaQE\D]c "Uh $OD 5^#!ơ%6_1!*ӹ",%΅i"̥]"B \Ib-A%">J^)b5~\")cE#-~#.^&6"aU^b:2#ݙ'Ra229ܐp")Zd\?!VEhƬHTO(EFLkhّ G D`ّH "xFdMK.YU՟UV!$NXaD[xMRdS8aԓIțŀI-$(C2mjrmzׂmEyw%ՠLBزmۺmmDJOQe !\-n Kʅ 䑔BnJ KEd8Rn(V"u+nn*MmACo ]a@2D(E`-BoJtWǑEPoFSmfo.^Ph.?vo!Q-ς"p+0n>MHVԅI.cpb@a>#DStЅn7 _hHXsEtHDg¨"%&tKS4@C@ew4S3U8-/LR(uJP7+8r}hO,xS$Oⅇ~WXW/[#qhxIp|2]J470}kJ RXɰ4+9 #y/ynjOvu${-_8؇s4oGyneCqyaE_T ND6y yk{mb 4/tF#zkmecF}I43_KzTkn{'- 9Pfz z@hR\z C!awu\z#LѺT .3u${YB(uUKVkCc3s{_ IoKTeGW9?OE@El9$yD;;Bs]\;?'[d4<ƃ"fVŇ|[^psEwb(uUiH{ 87[._SrI:OizsI2>o;CKZ:1E+6U'f@ixpÍVpp.V'W~{vUԻ@ߜJT{zٷZq4cdjs4 %7j""k4 Eٚ@>;+O3m֪ z.}~mF<#* >OztbP7,IP!DD]5_5XmM&> 'lߓeϞ)Rc2iR+b8覝^I8$&m䅟ޚ V(T2T$}VIj)`BO]ϱϡ^QbgrP$Xp#V0c9?8*Ǘght X?8/$` ly P@:b胎xn D=xx?_域ߟmDᰢhF031=0mL an0-$9(gn8D¿@C(Pa]^.la i8C2u>a8D#BD"2NLb8E+BR*r^b8F3bDu&}C1^$Ĥ. GZ} 9HC Td!E򑍄#)9IKJd%3M^'I9JSTe)SU򕭄+i9K[Td)##>$15 K&fi4YMfZә؄6Mj^ 6r~S$:Nt;YOzӛ<>yӞ> ςM@ P/!ys5Htэ. iGAQz%EJUR,KI:S#)Lsӝʴ@)MzӢ>UPT>թQ5jS ժJWjVzTRy!O|F OK P\:U&tͫ]z| _[XUlb{W,b'6f)YzmgG҆5jQZ׶-hg{ڲmkQ wy|ЅѼ|3Tqr۷o֥nv ]fw{]Jw-oxkvWev+7=~ߛ{Ko `7>p~<ؾp/` p9X±zʒ%Q A؊[f4Wl67qa#9o:q !7.1$?,e$Wޱe,al)k&sqLg0ybլ>yo6 zv.4f7yzβ4zҎ3/CS1,h>9PFOTԛFL KpȌUm QqMPbU1 g&on{ʹys+o̶[mx;K]h{VMnpȮٝmwf.mm;򶶸ww[w ^nx{/-q{y3Fxӽps\8nyrK|6V{i&Pn\hرCuJ,RҜ֫/Sy면^^:k<CkGkvapG{^}fv=z?;ax=[:\Z>|ycAx]|oM]dߞcwg}=CA;q jkzq1[*z0}v R$XO[I??m= Eo,ܿ+p>k  0íu^vbC bCƴ'}iE'LW0]Qe0' /pvu.$Pp 00 +p NH m-ݦN@.hNح|ضBy~ ڊ0 .pȢ3 Q q5Q.q>271;1Hˣ^`X!s顷`&\I"sIrm^dq(b 0^/>IT.o 1mQqq1q)+_X`Gw2b'kRPO(O`GpL| (R")π*"ON#=#˭!JLQMr";C$##]!ߊ%1&UR'h%o&TB!@XP=DgpC!rF)җŎ , Ew2$1,{m,%2)/- Ҳ,-ɲ-2//=r/}/r.2r"W,Tٔ3+a3092W1+@I+"-&5[34g4e3 +5ab3D6I H^PV3Zz OXVT`g!TNbq8PlC;o;m:I', lc ](>WLR6(E>C3@%f@OX >T~-AsNAOAu.?AΎC/BK34A0c֚Q?DUmPs%K$9"0#R Re;4-M&HI۳񦴭p턲K3: % C j-4hrg&,O;f0lgvOKqF!'0TRIW37U;)KWL. ې/)SKs&YH[TWTSUDò1CG+'pN;Wp@K2?q t?B| eMS_b,2Q\ zBr[[qfq\-^ݲ1OT%Fp:t"!;Vr̎MDCY+c@R]Y$4C)b'$=8'I1^L,\c*^wed9TPT5WWՍLPn@Ew_LboDeoUeMXڮY+ICTQOg(jmCYɎjU<KTRk9lO+sk1Z+ZmevjORV-CI< wqn +wrl-rmRrrg5:w>q=WlMQvDwqbŐ(E/\f,rH!W"Z)R@ ]4"CGqS,uŔt\^[Wx4zBA7|Ur!! 6~ó`!X!~TFlH1)dk>R7wA_XW8S `TA$t-ITb-8>7:x&`V3?rwRb$e64ͱ{0jF]QDo5/NԇB1tQa1WB'֋xW6^AXbp%Ebb d"d68#uȆ^Ti fdb0Q]o,=w!ehjI]{]Xe0:ϔC9Гgzmy fjf`X Hnq֎ղ 1:`9R wTA 9G"v@ArL6@٘-YEKYJ՝o؛%v:B6Z!GxN9 !v68$; o4ӕqSbՙ?_We1*@횵ACy-?SO!Y#76jvVuUQLDPw"wb]2}48Hjc3'r4Y%u:AS:pU7q{q&vRQ BA !A d@`L`O)9Ў dqkΑhyt_qٓU[gyxd];7H8[A7Q_i{Tpbc3QUGs7!XI8/yUfԂݏn!{^%r[iz,oLܮ7]-S4{L y-g8 …2*OorbAr/*6'v4<5L;0_OKL˱.%{_ F1{vS|y,o\]!a]ha $cCA^^&'6(Ƴf ^oE#/m$'z1uȇ;H0Yrl9Vrʿ@W;cWq;FmyrZc\ZcXpV[%9 yr-ɖeWOt۶1Y}>obb?E`cӇх~IAAx ԗX7.h_hӈ9:Ҕ_%Vk] d7:gQAwSG+VO>iNdLj;dwAbp$ee$Eb)z'aXb͌&b0+7󬌘" nFrՔVHӖuI$t3h" +nw:7LnWgcM_x|[F Uv6}tuXqnSZJAbXyɡ~$]+[PE/]Ni\YQRL8.QvNS}/~eD.5PBq~!!Vui5ÜG((f%s'F$jm}=w92QQaۄK&8sJdx%4%#]g_uRK>JҍdG +_sr9,|׉' I]o˛W5>_#v.\vYGT"GHUwmhsX24 @  a:'ƕʌr^Qƽ,um!\7 `k1Z夃 UUoj*m$8maP v:P%I$#kHXo\:yADJ21gL)x6$cB+NGy*8N3Z,M"xduwѐ (9KNy4->rr"vq;' .!]ʕsSVN7dŘDY{'F9ʘRy^ JrhE4BVD %E&BĪLq(9#JUB2hj8C 2D>71Ea ZE7Ѕ=laT}rFETL|dLV3RFmTc_9GUՃު['-@bcg@2 teb+Y4"/>B0h a|t电IU(D hmjÇ_ˢhFn*&dc0ӡڼ%1aMk=и0&}ۘgAFaJ§N©Q/ofY73IKsݻ^fE{"IX(1AIX1'a CXp3|aG&0Ka?T۠TOq Qj7F۽3D y2w)卑Q`dʕRqas#/-'xIVp,$A%yCu+V\;q7n CEV)EKRWp*t*l[.RԦ,ebǦ,uK>nJq+=Jr^RD oT/N-jzW}UT[s2^|pq)j9=f~ Y7uW^GY*-=Dk-u ѳt-,ҡ[K(OygJN*ױKιv}6Pd0kW!H$ސ4)gy[N*k 3Wo>@2uJn zQzy4S5UOw"V c;7/yJ ٘ދ]R2T][s 8Gx<ݾH<8nyCv“n &=Y%}C14@:p+J66­:j[+,km1BJ9HN MW{_ )]I[hn7 <6١1s?rBkEWz S3b/ 02lZD]7C1FՀz7Q:}CIN.f Y2lR_SgQ7AuozE#$GLp6fi4P&lSRuwRg4XEL0%71pަ+% X\q{{_po\Jqk1S>#T:PzD 'y~03qNFS†g1 rHbqgFeFpSChQ $E+cnC(x__S1elj7$_bydt{cTB)k[G"@&mYu+h0,+\:-H%1*$HKDD>,6Sk#?BeDq26J$;u%}2%DN# ns;BcMxKg!P*Z0VD;UtM _ g5^7E`1u%p&ZE^qt[RUi56eъOwIHe2h2#cq#-yZkE" [>UgF1s#J0c7ǸiղHv322M(ZԺR rpH1[:q9(z6cl wu7Dq@FDŬro_>h"VMo6Iyh 5-qzS.tф敞oʪrXwQ)xcTr1 8P] T$!5!cp{yA~A9#"}_ZWsc 8@[ݪk^}/BXQyHWNfILBHVi.ިwݥڪ|GeВ$SRJvB%-z_2J4KۧƉ*lIiуuw#Z  ơ?%+"td~Yqu6U9y9dDH(A+?VE?#CjӀҚ9Wu0 %v *MkZZ4곌8O`k`FlVPIXff+VUQޕF'É>8]JJh8F&7hJiPhp N]'CRW` 񥱟{G}1z{F Zv)C&0åFKn4ܯ+mJ%hV$44^vMEB)CC*4D@y5eciY"D6ki&F[E9`hE%c~QEZQbY1Ш6>"hZP=jPm28ޣ:w5V1$aŶ%~ X+VyLaR$aUWJw*vȹzu)-Jo1a"e^a|a Eϟw \C[H9P.s)} 0g0/4".fӯ5qQN"}(.Uf:AR3=I+9E1)&6E&x%KZ](Nsz`v(9ky\Ί@$Q(\}D#Tns=f)E)ꈟD VRШ*3D%5v bS9/c) IΉLd5"M6<[cvC8'VV&X(A#5?n\,)ɹyU<g]*ytz1{Z&YwDD!bka dbD/!c5M2W$܀E<A^L: ⸤ᆅKȆvB8&f"ǜM2ER4堚6FIDXqr(ccL[j|C!!`&1pu 65}V^cV(JȤd56JJcA_$+ʑjnEY!: ̉L|W19, '0"^׻ukTW 7-y_ RceX";ơ GT:# Dc-,@EExA7@Xc%ڵr@?J2fGFq٦*mj[@WELQl>F6B(*\AڛĴR-bf)('"Qnhx`Fl\IQ+*a-ORYyz[Sq3#"CAp%1K@;B9Qeo5䏒p HDb iI4"e53x0,n\Fm'WSq١\9 o#,yL6Dl"8ZVڙUS*'&Dv" ֠*d(*YŧBr&$w*MC:]CDQ[H~5$! (ZzoWK.:z(C k|$0Q7ޣt_Ug yF@԰MdxN#8,T8(C@HDAӤ-&eWvFy17IO%, !A̲K9ǵU  UC^d.'h=G6nL|o&,%K)C~D` l1m%]]݄(5oi+x*ܞzW#W'r!n%2E;\ՔH]UdD,aVVdLfV6U5%e (@8fWif1f+f.eQ|qQ84a+5\ 5.+5x91q(RdBVU-)dYQ,٢M2I) -"l.i)hѐ.t> / oq ZwXHUp jP`Z` #;&'#"PRU֕t#:\qN$fzf"o3(S'!c&`A8>a}R\$*7׶{?)Bp*c`wWF% WT%pO TIW[S#.O#C#*daQ薊Fm ]m4+{U,$a?8bpcKAK3{*&qv9?NA@]o)r7g7Kd8G$8gnEvSP9!tmlƛRfIâ,Znx+rUU!;7wHR-Sd!EIV1>肱afvgy߳1 C0nYR.3x*iQцo1|IM3$~|`y!(TqAHsN?ڼi:tC¢XST!St(ABRLBrAQV;<1 B?A2aQ8oA f7(F4{P&ET8 v{XHK#cO*HjHIr"/bҴ:ih YDo3AG\UvG#TMTXV1Vb`VH}df=Qxz%,0&?;xQ XM0{z;&`7޻pFi*^ W#yoav%YG[1A+c7_F(Ԇt(Dc̼(،V~dDT-K=0!q +&!&T%=GݤIA%r|cSѻ[i`:JĢ+2ɢD yuaf͂7e=X_6?7D #ER4E *=?V\2!>F -=֢#|eo=%tp&z]WlJK3%[{2#h񟃍3 %b^A&d|{Og4]}EM$,bw)9^7l#DR77w*qX=rٔ'9ƁGh򊔷'ޫz,$1äj"k>c%1p.1>Q`Iy k]%5"{G: swjz>f4ECq?I?Nn077cQ&U2T=D^ @E?>>%.q|bB-$ckeq{NkA1P|CU':qOtAٖɬ*@Qo>};e`ݝ2 KDErS6tA>tŐ͚{pBÊ!n䜼5ztUcsVb^۠J =qѡ]A 34694q}Ĝ:%̵S$@w!x+/y%ߓW@a,uq c({"N(jOncvO Վa8]844ճb 09B_l]xkr !W׾XY$BKE%}%~Q֒¶FB'(C3Yc;+U:Ac^3,d6gHɷ(G JߑJu߿.zEWz/>h_`dFEa#ղ 3NA&MIiЈ1(͘hpTFB-48 4dʤ ԲeL$HPDjFLL&̐/A) ,J%3RM>UTUUztҒ$JL=)DksRLM!C,K&eDKVM&56 ח!i]+e~UkPB1>(oζ+бm%V$}-=Zh׻j#^Jn[_=}HU" ˆַ>zJ#}]Vb}]UB#k1қ@ 7$%8!ZD6SnOm8d9?$l"$z3.|HnP>D13 q)S(&K!(0 n!1bab1 y2 ÐG|l2 !)Xή.Vc?ֳ'BP&cD]CÃz1×/ ZyŠQ0 P!q&R&w $ 'j+e2GSXs*:I4W- 4@ 4o4L p,=s M,F ҝf5 ex5LIE=uQMz,>844{%EUʫ0V=sI7 MȲO4"Z:4N>xK$MSm}{7?g_jzk ul*WyzeeYA{l5x#9Gnrl #nbړD 2ÙCaf1! eàMg!'HO(Ն4!A-H`5m!IPюr4'-Ky%aYɶJcQb x4hlh%sD \ su#VR댧c4I04a  (qQqhjw{`AhS8X%( #ß%n #Gfد\.+7 iשo>Rԕ.0n CO/H&w,8ؼJ;DwȖrMh;9uٍQjsn.)qcԥM+g4wI0xH .+2y*+f$IF6c+71s?* `|> /_ Ql8$4DTdtbHt $QQM?(t@ !h !$",B@ph`A#D ')t ]"A MЇ&Ԥ({ µ.<29v6.$,5L*`R5;$>A$/iZF*, \sDJ´ YN 3EZ{D[SC&X DA\ŵ9Yc<i M@HX#dSeDrP8P vPivȁy*~} kM41n$.0!ȁtzȍXb* 8{ <}1).f,QbpHGLHqH qc5mYKH'V3 ny 10B븎qꢮsɣ Y&"Ȣo,#4I}aJbȞtyTHʝܟDI,}GoIǯɱ|JJIp9ʁȅ|x˂J r ʂ˂Ds xǔD4I,;,2*Kl͌Ì̄,|  Y 2ly7ƵD8P`Ha0I\k|B7}.PFQa$l,NPF; KC \ĩH LAPV,3Z{EXET|BD|l MqcBTyy肣*A2OƜ1FՇB眇Pk̇*0P҇y`PvxZD*Y(Px}k *QF]3*PF֌|LUCU &eE'R&']CV5MŶ.IH֠0}DJ ZrO3R8 KSLZQGtEQlOG7 6TDA=BE;3յq*M6`-C5ĴiSUd52Mӂ1.\4 \U9k H}X\ F/:\MTHMK2ZYh`1 ƣݔEMy`PܼiM44yHƦk|}l%R}hET#Љ7P(bLؘS"8id8 .Rc%N؅;PWhdhװ9Av^X%LGbN("P8[%__IQOq`FT7H&.VS إWh斵zQ}Pi4|OF-T IܕY.َjꚭXt2\^m'ǫEۈ Z[u=[ٌ6g ƜZ] 騵veBN۩xkQt3 یE[Ul[l6hķUFEICGNZwIt|ZMelu٫TleSVs=CZLK2mqƥ܋~1lfqOb|Y ZhF>: h]j1xc}W6fo]΁V6U-N͊݊ףp{mM=ln~G6-w1TjV(pp+eVf R[5TD Gvanuɡl'N`>DTEkTD`wS)Gr*a+q ž^ܸàdF sڣZ`6m_OkT-ǤVڻNG&v_mT=eAWW ]Xae%"mQ%čecX66_*X 5/e*]N*yu}]!0wmTϦ,R]P"N Qlvŵjkv[n7ull vM4=UY%l" yjilʮM\jlG\lvO\qS5FB W>}!…evYTvʈWez z9DEd&chVNic2Wf)QQiG*䚉V8^~@e,WA's(RQi/:ꝩ}*~݈-[Yu%|_4)X|TR@ 1dI&˄J?&]1ٜKFl)n늴б FjI]T4tU:[vڗT$L\}9Z36[eAVn WX4`G!g?#X3]J%l [ю ]]sA4[GT~_oyK0tH|ؽφUKlyk1a 6m2ҴMh؝'QV(C/Vɽۻ ɶg3q&aYxxpf*6y[ &G6o 7|28ƶUJJOlޞ]w)r‰F_">#I2}iRdyԁDp5ɀ!A`\ava2HDN u:)q"OVT )$MGL #)A!)"R.d2~(rn V#*vMt&]rH tli MÒ<|Yd2 :V PΧ&ѹ 8xqp4t W=F]"d1&!!p7Q/pLb#\7MEB"E -t+0CH&,XDjT`\L-qZMF]pHY!',mna cgҭ4k3H$2 HyRɇ~if6/L23k,'M(IG4kf>ԙpf+d@CJ7)a';]ز<Jb.44N,0q)JOL`6XpE҈\-샋AJPokѥI?$4HTR^{~q|r}Z-r{+`=R~'5 P {IO*˞j`Ř!{"NkKSYEa7` _35/3Q2֤@\/}ŕ&(\hl@5=NY u ux$uŢwofs3vm|OcֶP Uq}Pl%#aϝ<4k|,SHr_jR*ꏟ]^Q'IG++2A./{gV._*c'URyT11JVc]zA‘;_>2)цGb V6s~ %ᅵSL馱@;%XZ5h0>P.F[c dUr4-յv=^טUfr[ 1 _>ljÛ9146S}Jw![KK[ώt1a݀s殫PsVWDFJzpZŁI2!(c L& s~$8~zγ/=45$FtZӒdm8疌nMߏڊOfۊ53OzSۍzΧ {mJ0:>Sb%&_?Pܰ PD! Q !0T4<[_ԏEXiF!`r29hK^pNjK&kTbW !I'caaZMqRh)(j2#JÙC%2ԦH+ej2#*#e0f̞Kjj\M4咊 5ͥ,d`"(FȢШA,I rԀ hTf h--Yj*dy-kTb* jrk"eM2jJPo)ܭα ^&Lj_ (nA~ d *"l,reOfAp<#ZBVĻVb4>L*dꍶFkN׆9-ɀRk[錎Ϻ=Unmlx%A>"&%ݪU]b/f֍B#+% )*֮inV ^+an*lI.a*)R eghjĭ\v(ؖo>. hB;F44\)m$Ɲތ.4B XMfe)bsVWk٤rB>,Lj~mNȎ(ﳺ1+mތrq>-CؾMehNnp_fA1.(n1N&HҢqmv'f:Ϻ.ևFJ֢%+baS)1dY12(I&~Hipf`pbk03к[W4 L*>".gs*ўqJ6m^$H-j?s#tqֹrs Sm?%3gm$ %KZtJ f,aXZIHa1sS$8ñZFC`41 JT#sCB0DB M 3G"&0҉urF3aΔ5W7 سC# \ =D1,Gh8JLnzywxDW|teor6!6s7bwOtpxxx d_rߖ"Ѣvgxc7CG)xTShg/Sꐿ6h6vy?C^9תr^ti8g?;WhvH6kL (CDa* X3 ga@~046L^2 978 ,=@B q Lz]zd3 zѵqqCr>8!n-(2BsySw/eJ: B:f2Vk.swt:4DW1s+/zq- b&{z/6ykҔg] ܭ.4a.u#)ELYY!H4΂s#=0Cq\j F{׳vk_ H~w#FY)[hC߭S~շ2hw4$ճo~}۟}I15:6 4di:Ä4[>K%83؃1V << }пĩ=@+`!l}1TV/eѫQcG3~8G$փeʕ.YhcLm rȒKI&LMTQ(P$ -'å[RgҮ9jE(q}5Xh%ܧMri(ɡS' ܒ˾tCZd;8.̲n2n2M]-{#˱0n*'F&ٷze`o}pνhpe&O\9!mxE3JݹdL7x6b\ X0}֧@/!琊`238;,*X+xi4L§pC$kKAӰ:TCD+D*;.qQc) E£GzKFJtDIl*m2+"$A72-}`h8t6hs{zQ6enVchB\&J9K/ܬ @0f<+n7ꉁ*@-n5*iΣTmu96zt2A,ƘKJB>12(=lŨ+Gk#soX&I]թuJ{܏=qGUWǂ !ƲJa KCnP& GרhH6dN҇UcuFӫ*f} "LbB$MP!e ]?9xjg> Sr˟|-, rC"/|EK0+V̠4ѩg6H'8`L2MPLtnĺ' 'Ŭ3&NmteJVݮaӶ>hι<,yO 9OfD #9/gh!ƀ@;$&+d )Յh yR[ WugrꔑؕN"Ro$?LL~R -q. gxe!H?Jڸ+p3/\#+Q:Ps !%DYK?*wRd̿Ԕh,cb^CCO1n諝5=ӻxPz1T iT&Ʒ NB0? 淫4(]=0Nc]0ƹ΄dᓲ$ D؂v8XZkZ*i+g3bS#_7 {P`I8t5 V T"#> 0ȮF+@#:f(bSp ʇv mm*q6"^,C[²:)HJ'9Aj4G-I'{fX9S= Ϧo$ 8_ʗt1VSz׊y.K٤S6#/Q\.IP#.i,JkYXܐe8b12Q|=C1Q Y4&p(cYҞ܆<eMkIf[qB}fq"ʯ>a,"%e\#b^*C*4L+;ֽ&\DULvo}T u=ߪNac {@vة`G^nT Xe{bXoS_2m=Φz"@\ wSc$e^,b&ye wV291P&+LzX{ n_2$cip2@ z%XQ$C-+Mt* \<ơ5\#b@8nO9`_s\ _;Ȯj/vDZX?=\Tz2oI :HZR%WøjœUHdlnG956*պdX?66dF.}ˇbDpjrL xR(aܬ2P4F`~7s޶l1=GԔ4$@O'OtE|G1Jf uhev.[X [(mO@-tSvGlIhoM7!D>ύCׁ% x3c+Cq dSx2=G&3 h%4s|-7r[x@x_f=<^+ t=1MMzT#J8ԑc~"琌u4<{r*=27hB=62B# dgQb=/:b&Zn}n.|~hq8@lGP7lL-l`m(}L@#Ӕ)Q߱+C 0IbPq#I҉% mRI LR-Čj)B.)%ݑ6 LjŠVN Cwj6Ml ZÂoHoДnL/1"+-XArA/? '9ϐ3@!`c&*rMR8oC(d+Ud":|H/.iHW/ %HI/"VJ#t݆$ |+t#aE-RD(qS\ Fbi*+r1fEο CL&%IJR&4Kq?cEo /*ôe10;W8rKcS"*%>~M~+iw\wCuc8䋔??>cvafd(l'>ag>wo>=;"~c>5>av:Qt+~ %;B/c^5A~^7_a~n9^O^8ZMM>! ::d |?_.|¿ϟ??˟?_B2b B&\С@#J$DR1F#Ez$ 2eɊMbXq#̗,e^F.yyPC{iqhL;s|T'˩ qy@4o2MRvcRdߐ=6ٱkӺ}mZjeK6Yu%{\oojKkN^ 4h=\ m3bUW2辎Z~j}^߶rG.nvʞ87on=3st't[»k;/7~ԡaX ZU&ܐ>>DSF>:>@"%Ca2ш2H2 F E)dL2 JQ82I #NJOreD.)PbZi^z飒[dlyh$EYeRIdv9>.CKj9hR2DZY}DO :gI_jhʧ~ mZ–䜴b g N̅8 6kc/aF{!#6K#͂h>4J(@c=FӬ,SBo/X2p4N,q4SXnq r"Lr&r*r. s2Ls6ߌs:$(cct]E#QOҫ2]w]nf|1[e21L"J8#^[uxk"o"8R25sONy_yoy$/Ӡ/Z7hmz##&nטu֓[M28 Ɛ7n^w{VoO~O~柯 #wSϭ4!5z: m8P֬73D&!ehc5Aગ 1΂WH-; _p4azv#rB ~8 zp)<Ѷ,yB8I [q-0Bz֌P,8hyQ]@a8qt2.Fh$mq*,' cOlJ4#hA L4 zZ#٭C\bNN^˃+[1:*iRSC) l; x2}V)Ȏ,DFpe=[$Pörk3e<^EIߡIA&<6))L눮S`va'd*7f\$/iXrc@YY]VˤhL#$13(/4zyT!= NCu $]h{ՐC`+Ų1@T5B \2cޖWLc`mu8e+I&^  @؋G#rk` Kb8p,q~ӵ E=9ȇO=11\s+0ſ^dncyTסp *=|p tqM[7g k>p;d.&U5\p t=mjg{w m"p1@7p 8yiec 2pZȁPEvWQ !xD uN& :(iG4tk*Hcc1x1x hPiw .i茱QHb=Wjxrs֎؎'c!JhMDž O"5^7`C#h:0mWrУg艅#j 8 b{{o!"hz:" zɐ 0gm)@!)ihhw  \5 X;Vwj!hs$t0hsiuPd6# piJX @a@u0hxk^Lgai[Y9ו)wkjQ뗗X1J!naTȗ[YItVB74`7@!/jC 7{p0z 1"86(nؘ`@{ n[Q<AC/g/45x.H TDC!D3pzs25r%.b_,7fc#bʷruqec(c`(Tk"PwU}Wi8qx&@`(%q!(Z3ai  Q*:&6kV1 IYkfGiI8Qf^y/xi 1I"\ m 7pB_cq8yS1'ys?YC75P'$t5{||F v5a چWh#p6ͧ jg¨5$yycm6!GXi VRX'zV'iv=h2`jfȰsFr6i%qŊ|X窠~O|Ʉfs60UU*5t,tS^?/<6!0fz`gP\ t/G9`p1:f0@w#ff/D Z^oQpٓ٘:b89z15 Й0af #%"n /2+]RbY^:"6b2r7)$X8swT[9j0COZқ;iо㛩a#ݛK/Y/ 0kf>0^u'i`^啽%Bk/Is1aj&,n=R$(lCŐ3@+C}sss8xMқ5!l^b!$2{%5]l쾦:R:¶#x-\2k3%|꛾Y K[&V1zLOȋ8#R,\\5N#[Ӽj}C=[6jCp+&L2'$`$ 'Wb'r( lFu ڡ\:ؓ ',Dٽ%mژ& ۖٹ#ZtA`)*b۵'X&+br-C̚],83ٳQr,,ډ؜A )-=V۫b*$m 3 )+jA'W'Oݝ,r((".#Wkߏ h"رߔ:.M!$&$>%.h!*~12N3n579~(x% $> $,&I(mBw?G.*P>)ޕM XVSG@V0e.gNhnikjmo.uNw>ynz{}|.>N衐( m'o$>ڧ>=hp1PQAaꠎmQ1|>nA뷞몑뽮뵎t!뿱Q^.~ۮܮ.Nn>>~.a  ehpY6zQ/|_f#o(/.47O9o _56831CEOP/QOSo41\]_O^ocba`eqomsv_t/z|{]h&(//'*d3'FM?)O/)o$!_?!of1"u/Jҏ1oOoi&8I A *LX!B#Bd8qĊ1nbGE>iIӨLˈ,ct Sʙop&TiPgʖ,UhP IO՞ ׊:mJ֡JhS4Ztf϶G׶\+½o޼ՋF/Z}ŝkW(Q:re̗5W΋e[+C# gԥS>5դa]{ֳu;6߽oZ\dƌZ.][תeA17Or{ϧ_}XJ ghpAtA#pB +B 3pC \)4V$ esCSTQYEVqFkFsqG cp *j%4Cه]#rJ*J,)MIJ3K!l)Ġ9qL6tM8rKh`OSE1S4ܭ.R0&KGtRI+EE%tSM;SNA4TRG5UTTKMTU[eUcmIk`}|?EhT1 9e%KgJiZkv6Zoo,s=7\uEw]pM]w٥^{ywzW`E ݒ-HF '=>+Xa3f%,0}J6dSVye[vecyfkfsyg{g{L+Tׄv {gi1Gbg8!`LzƯІ/X@ \jSvP[oe@YFeB|/\oGovq4.e1pBX2BI" F10 b\9In9M̠SU1APT"F-`Ԧ&pQM d})U{*(f[=j= UUnDMXVfZMYJȕm+Zǽp+`z0b9,9,*{,5,:;Ϫ,.mnb8@D3jP (ժy̠XeGGM6ˣ>H6.g-pƴu!"p.*m=U},fujU-Շ^Ay/}kң/Tn5Z Suaeal{r{ZUtp_1 X fpQ=Ucdq[ M"3qg c;1ycA\d" KVr#;Q.2cb\YO2 P/DBƽ)muǧ]a~3t-=㮃 L0zā.Zu*V--V MӢJjSgZP^iCP˴r` I^AM׎NyH\GZ؈F~BnglEپmlAmc~[&w}nt[fwuV7ՠb^ ojUO>t 5okqȇHT_r AMtnR.)vO LPOr jB@VVTʼ5*c>sܼn*msޚJ:$F{[T.1W}JOjԳuPW=V_"[lzPр2@YiV 3~x;'<%x/򕏼/xw>u͚U) ."}V׺f}{ړ}y{۞@n0 4 *iU?8PEVss7o|+~4ʏn\BɈ{|?[r[,CҐcD۰%)'9*b?z^C*@bKcӇrҩQJ0'A*ճr @HK:LT0;A/) bzXJB',&Te'hp%*B)™B)B+B2B+C/6T(C1tC*,t;.0*.4 dI:b03r59E08FZ(5](ۚHD:8MT#N84dA0 4upa8{4:1[4 *@36e+ib9FXcA4El`+4:M0*/^:[G*ꩳKGot|F۶Q#!58;E˴+ ]V*bj,fKH[|\;HLyH4ȈȉHIZ5ȆHIHHLG۩ l\C6;JɁT f:5ȁJSH/Á2G0{f8)P0kD,j<6EjU  @ƨ MJF* Ę+0 .+8EQ#O<$6sҦ@x$Mۻ>y8 #JCL˚/46C*4͎6m"$LMLH{st$O?:/%ԣ*Ԑ;Ԭy:T"3->U5x:ǵj|A||Md%LEVsMT`/_ݓ-1+)8c$0ND0x y۪ÔKL,5hE#d3;P120*3*zx-PB@dPvxƙb+9aH.Z]eP1y`SJ zڇa3#a%ݵSjQE7#8d./:WPuVW08R oRU4?@{L؏񌏮%T%۴5۵-IT(%J5V-$ϭMT۵heCbVƵ-.d\4H}ЄH89`HyhSLhX > z߂ZX}PZ8bMх݇`Ё(^8aڲ#/=}袋XS .}hUe@}% ރ2-|=]Z(%Fej(Eݔ5R3~̾h0+C#6+4"Z]E_D{`OHI`?*a7X94`xfh]P( 3`앹1++&uQM. 18LQ[\5aeȇ*@(=5DJ!lUÄczH:hٻ3RH'fcA.C.?҇!3exW݇g:Oz0+{f KfحUV?"">XΏXef]O-,=fMUMծDe%j6AJ2N-4'\H"{3z# P#ү-}90eAPW5**=.rض2CYP]荆Z^Az.8q::⺚ _>~ QT;)5 DhjWP8c. jV#;Fv]z2^h Pa-0Lb#3 ~L F"O3uBd;#.>kBA [V+6l+;+\5EjW?SƧIE.+IkZ%bޚ& ߥ3*P!a(3aHgfĀ1P\66b"dصm4V_A)PxQFVRZx20.L0)İ*mQeEEdRjL=t<:XQM.zHI ъ]#(RS`UpW^3#t~:׍ ۠ @Ba{KpiV U&Xo Lqby?h.ʳz L#3c4~XEP8#EjAKpE-Ḟ0U#+.X0ҢU1-ٞ-WWhSk7%z` -Y#`<;Q8=[WOLU oFZ385BF>>|M8ЄI툘nSw֫}ghgVM5׭8}MX*reZ0F_o4Hص-Y*I:чBx- h^#W;.Ѳe&i"Uht #?v5d\5]p..Fp^vWeuWA{,MP">Mg5]ѽz@äY jxz_lx;ߒP Wjqަ#XM0,êۂi%. ].8?{ppV1?~^-T h0i=o]-~lz}_نG,BErM^P-LЄLX]Q`/4&iP"Pv4pzE:;33>_]j~*pcztՇVƬk"4(X-6>eKzmz*[Y1B9T!=aqqP摔a2}[O}fJhT-&y} $@1-rW 5ϠMhҨJMA$@3C ٥jrJh(eXCE{zϺ,2, . d߮yO L1amQ/]V04z[ LzДqV<ۧy]Fw@/Dsl3{7f>OκϘw hb'nѝy/m izvi:ڼۧAĖ IŰe L hdB&ʈ1Ii*4]H 2\b`",pK2yWASM7դV>x6qYW1I>[T}im5PU4FM$cK4KY#fg-Mw|zܘ5マV04&NF ߎ F +a]fЄQ4bhk3Eb 2ݡρ%17)lRư 4\ɜ-YP10jUS$qdE*e`ޛ,j Xf[R2Vo vo Th`[M ߰bPL,(2e"O=sm ipW5w+24 mWfq>7sdI=81"_cV.;D Fn՘F27*w%zj{%)oe=9F^ Lc础Kob:6^>)X]D6nZo %9%QDXQ 8+ %F=IOC2ӧwbl"6H&c5fEs>'Bxh?ȇBqv 5Qq -&`eqf sde//^>% SWA[>ǐc=q)P3iECdr U@MDG@Ȼh$qZ >1#bHDbq#wO|d#ŨPC$@1 ցOp 1q8(,fKU9;iK;ʏV*)HM4-tJɒg1Iw%xԝRrpҒ$AJ[R1ĕ)GeT9,S ֏p !̀F F-$3"M ddx"nճJ|0i DZ"T l1 ~ipaX-s*ai*O,i`` 5(cD꾁Kq()"A@%.Ԣxe+`?FV)à'B!d-9HT蟠]\hl*ѢjOi9ăb@  K("Mh!=vdB,a ;6rZ֊5iF0);I]jMdKzTST&%'6J 9O;q3Ǥ7N ЌyB pmo7w:`.v4sc+)Dfr-,E5cѢK%@v%dbhNq)AAJ @2Ӗ)wP4biAz}Q _fu|q/*U4e/{!@2.̴1 -և]WDl)0}˟/) FCN7aHP}9[Xbh"klcH"λc k;D1$δGmD(c.s9\w\V2,u#\TKu($H]rG%{3mI7Myj4b9V.J\YZvr 3 5A du)y kwM;dO}cpKy*v5V w N{)Zn%iTt7YMiP Cy|;jjnqr&~ le$:߹fFrl ['Sۈl'AYTj}9KuxcfsIY֤+$ebI) Ƥǣ@]}l0UeuOBzMjNtj[܀+'rkr#& nqu 2x}pNo$8O'ey6}>>ڷ}g8XC܇w>X%cB(Tظ!7usؑ <_?cķT2e]_Q_]O&#1_]É9 ! }!ݞ JaM^W2M:!ᴐ(AAd͘ʍ^ő`=VHRIԌ>! `! "dB#:#6$@$J#Vb$Z"$^$bL'֕\J↜\&h)f 'b"%j#V*b֤-ə""-a)z".( ."bX aa.ޠ~a4T"! Rc%AU!3!Om7Zq읣2J_<6! \*"LCuH>e!LHC>CT),$;X"R$<֖dGK>VdB HztXF~d*CKdر> q4Մ]j,WMmHN d IiMjHЈdD,ODdS 2t%9TWȌW2@YeXe[[JKX%]X%X%XڥZ.[f\fY_j`ae`edda%d%e.dΥg%h.fd fc41UBXfװ\惐_BNƃ{ٜoDCuIG*g_ Kb,LB($WHRS~guVmLd4.'vSĎ e h ʆR⧥g16ZbYBg%W:_g"B(cbfh*brfdrh:fbb^nha^lvr2Vnhegfh\Q&D4وHC-$g> >C_U\JL畦EHlQ)[4NFLRҥ*R10ȝ*i&0+dur8'[2j2:Ț$ئIddd>Xꥊep(ʀA6aW`X(Ϫꪶ*ʪƪ@b׫*v*Űk*ϲ&+j* 뫂^+"j+kr벒@ ׄߥ4ثg\A&AC!b 'lNVdK$b4Fә):얨2Pl4M8&] D$2"L1$C:*1|nО~ntGm(h 'N]4$$Ӻ잼M4Fm L`ʗĈ,$-*"۾b+bB%JBڶ%톔 ޢb--N&-ۮmf-c mmaMߢф$̟JÑ;CoDTpBK>$drHb$EF~r"PʧNDFN00]nL̕ըMʾ>\,&C(fäꮈ謉l'~N0,n%gp@@斜$A x-t)p&0W* ,G$VKHbE)$nA*/F~IM2W $mݖ4XI(Wg0Jˈn $Ju94>ȫ&>'!#$\UGp|K͜D!nbbʟ_ltlIl!D^P"] 2*1o&wh.LLvD\& )t]HpM$^ "rDfSX,,s4sdBƖ C>HISlA]>hHozDDC{֖5 @.w]J-m |[sAD,okp 2Qhn(銈ޫS4aߚQ pUʪL [ (]vdl>)|41*N6CK)Oo,cN 0Zj-a-4&,Ru2Lr ta\WGm@XȀ`AH r]CA?\McpUʲUOi'ijqoՊHJK`re+C&oNrmJ k3M4o2*JB-HR.x>s!+)ihrKrB1NVb Rb[ G^u1 R"+Ye)( Qwzwnl&`@^6mV6=\H0XqL.\Y+xZ53)VEv۶d|10\-awK?4Ff/.·g5\r&2\H|t2}OFwX\ퟢ;lMl-J-;rhTI4Dy~-ΆiApk7jxdsr&$g*r$1ќ58KqavFF`ɖ~kIʖ*!PJoj0Z8V_k ̊ {I_2~,t 8H,:& ֽA*Lj&8<8s(OqHkkq"--J;3,ʢkqAh^Ŵ}x:&)7|S N46F) xrү̤Rע19I#0lU lΙd>aem߰)k8޾e&Gp24v䨌X@^HazXֻfL1a$&e ;\F2h T!LiXe4iSNpzNb ӨT mm݇e514YozVFܚb̻lݮWٽ0SpԕU\>MJg h"ofY4SKc&>MHr0Lr,'=eʗ{M,ɂLaBRL0%0<.uֱk;x;w:+8pϋWmy}ahB#&4p/P;\|%:PcJajEr'-g.FUR}ؑ!hd K }\IJ@cHa4l""$ǖYeP8IH:"I$ ڊӨH#zړg }"$YF&꜂h4Q4A;P 5nD *,XLU.ǻ;,VYmOHRe5 Y: 2-M/=˶³'<̈j6rCL#iG]:Dʃ&m҄j M{N^|cbURT{T JCͱx܊/bPmEKn{cP&k\$ha3e”O9'Yge 2ȋ ~.L.ǁV6)܃洃!դUiL/}Z&644Ʉ?٩8_99\aĞNICI7W)N/ejIRk+Ӹi.M~Of/V l'z˦s0کحLh߱y%R' RZUKjxnRyiSt$Ŋb֋a܋> sŘDvB LTC ,#L@a2 ^Ԡ㪗) i_JCdp`D(ηBeE!A dd!ʠY>0CXyaR¤\k%olxKaFH=<))xA1e<3I>j2FF= D" j l&@C" R@eodoI>JdoYFb 5TS%%%R#啣4VT7xfK\Ǝ lcg6ғbr$i#2T7\mlD2crᤁ8)ƘzD(CEH aYoUTPÕt,# 1j#yMEی#f5D֟:(M&݃ jǃGWGh$EfF=& 佲]i?_ڔeT*-jћQ5.j^ZI@4=ār)L{B+%GxZF(S{CtL-Q([e%j̕,yɕ:-o3vNtE-qKCq*gIJ3)]&6©I >!D q>*HQ6/d8a ð0x@>0ʨ`G, =2a$Ef$4 iKܝ4 2!4ҥxILtW.rט({nG*G ENiLb<ٸT>VJh$-CiP]zexN[!Qpғ( Dvu):GS*h 4&%imD(9RH!p2#$j3ΊdNrСLUYq?(HmJcΝJ(!rnזT6Elm%腕%M`b6{Ќ=7٪M1[nsAK."u4P\fg!8;cp, szel ED@"*WI"Zl3< D N+dKPXZͧAb=vef'o{k4G [eܵѰtEZDme0g a:ЇL1iC,)0 ǰI7Z̓i}R;B-v-6:aro3!>XFNα.imT>9ѥEe٦MX7+M'ۃAo\6b'@u6EJDtBo>*F!,u_wv LrM?B#iq >SeXzC9]D86[k%iХY2#p͛~C6P"]6n6dVe-( skl8\UX=?[8. o}^q\jW0rml.:(%9E@sg7X1H(53!ά61Z*~rl5b QR=}QHle*P_1H7Jvymkt_B"H-a"TX"TB Ơ6ܒHH47&H@n3PN!T@Fgt|wy?V9szxKbK;'5d4(KΫQWJÂJPhW~B@4%laxنكqPcV˨ГY؝;չo8+0;8ζҶ0a5Lo13Oos0-X~+3[F3*Hb-XOB@Tv_35*ME7=F䈒7t۪>Q)Uя^W8lwuڪGL32b-cWnfZ02 LX?ULw`9H"b)bc/*2lܗ V \iOyηGTH6PI!|:Wcee}Z::b"o'%hv8\ǛhiǛ[& klKp8R٠OW9WKv֤lm3qh\Gj8N^@>Q/ml!.6K0W鄻- wEJ>M.VGjEl8cx& YQ5o(b V &z]p؟uI;1V3VNe5Q~ Yb ~w%oAwG9cEb9o D)aC`S*27/EtE}{S[W[?RywKnwS+j[?suya[_IS?u6N>L3TCJ@v0K\f   {'#G)xl ) l(*Aei2Voh+.ӷl_0S#Ii,e.B@5ey3 Ee) P &(pEeB1*4k}(3y#ٳ_,ZiE1b8+,.Eqq/ެ솉}8ǐ#KL}c}լ/M74S%h-UvM{hqQ㆖1;̖0ȍ#PjE-lձgWZJz-j*" ŏӧ7;iᆛj*sk1/48 %i!\1H0d"$bqÄaX>cd AOK%5=8F@I29R4dRR EQE$QTI:*3I&WfZv_z)f^F(陚lnb99bogXz4 zYh{Q$SPEE<2@}2hᑊb(PZoeͣj>6iTDQDTpWk *.쳫,p0(+npw{Ig+dc7|subxWH}g/{޿--{۰.Z\, #42 bȀÄ]uء$Zф$dH#QT2fjPB|bG/iYDGY=-uTsGECE]sW_]U6Xa/j}bVn5E4g&RDtEoXQ.W.<*e xܚde}Ռ]W"3V \auEǐW;^wE(A#,\n6DW}q/F+բMupg^!\ {ZG߾9zZkKiAAjM(C$1 4LhD3[Z"_UE Hbń(2L0, e87 AAC=t!Dцh!QD%C"B*M̢8E.E6"_Ʊ܀"KWPrݹpc'8JaY&?ȊހռboX%X)r<ڨc褏Ki IA #T}"c%tb1Xtu6|!7TS5RWMlFY\ YSnys 8#bsAn_xrI0[6cx7bu\10d p(͗2+Aj36;#m74.v& _qS*vFz_+q1ph`tcSq疐$.Ԋbm'JsJK 0W 7Eb0o@ ,静n1o ouQ"L5s4  $ɥ|hK)SS?ճ  a1s/b~vCB׫uIv VV7rf!Wp2"|93wA`'"ߵ$4v#Uv/sgkPƭ2wf:gw@#z4<ɏڞ 29hkf5]3g׃x64Ǎl)YqoFE:SK_"Xa2qK7DVɺ[$~JCobBI/'֫K(oa g[' iWrtlf!h  򨑚 *GV"4*Xwv>q[׏mqef=ֳ? ɩv-L)59"/7.lJ#qx"f #FDL0xI|%wx잪ŎxnУlhf[mYB-Onla;FTԼw!܇`Їgp3z zJk9z{d_lͣLGُ˃,U~iK &/ʠ:tDXKuZ |à|("}W<2) 1 !3;Lȑ3 d91\5-(,wS9912H[#j 1mE\ċ@ύawz4KL3ię@ t\VSoS$<, Kr[-cV⫮ny•(+n|$"RYv-z8 { 9 cT,#)C_VX:0 ʽ􋺼5c'ѱj$vnb*yݴ!0 tAQkYЂӝ0 ~ͨT{a2DC&Wl<ݚ3 ^y LC<"d83p ,bN@!n4x#qw}Q=rt q pclֳboP 7݇=Oˏƭn ]Z Խ2dK3뛮5G?ˣQ]&gaMj VdaKy]CO ADJߖM J@~RH%MD2d!D^IhƸC'N9}ƀ3N@(ϥKolyZu'U[RhˢBZ4V-Y0f KZ`Ϟ],01b$ $Ln2M2x7h;Jc Fޘ<17hHFp&4o s#N[v=hoC41@C-P9g1[YiPNŲ:gYdݣ0 {-}Cz+0I2Ʉ4Xs 3p <*˸ sL<$;0d­}эhx[qeVN]rI;E_qFނmG#YBdp8#H#$D Є$晧.sHbyd8h]@hf&4|3N4aĔF8)d'44R)QEeIѶHc4((iӫ>-j¦LbNUM/`J-+-[kK-B CHL4 @0-A4#Tγ oV:y0IYYV%!Qft_mMg3\LK]+_ɩ%409q ʫ~EgܲNtLusЦ&*X,xϮ_٪VrIJ? մ1edrF`θhgQ!&hK7jttixQo`66iI9h"dKpD"q8!S ;S8m\yL9$HF"IKDm(7LuBTT0޹[e|b0<`P%LrRwӤ*H=jA-C^?%ɲňq-B/ LLBCj3UălLghL>7 }܃YU5 kj5⑋}]*JU"0Q!L9 J#@2Z1Urha3#e S\f5/9&x2 11K@4̷C՜ʐj SSj+zI )$3v#RC;)@7 [4z3)A$_3c^5/:)S斃0):4 r+-HB'QUE̩E6#K#թn6]'1ɖ'& eC 0 UJ!=hYD2QxiYrv/&#Ŭ¸0/z gN"?ZAV%k%\abʅF 8Q:h&6|SVI^EߡJNHٮ .˂A|,,"`+Yg,dZNFHj!i3qM9?iho4BiE-A8 Ό&$FqEMF?ƝԞX5ua'QQ!AI01H>)gF宼cyRQ$)\Kּ2E RS"%#1HnP%L˳Q] P|~F'EUxmNwJ)ӕV ϰ1B{ OJ6 }x T+A3MfVpu: 4߈ BҬ{ifeMj6Ro{mģf+1"P5m8A4haoH[Be>sb1Xe9GGII7J,MDž9s&SYP^[(7Ђ`{ΝJڏ^j,cO-pay-aW%x~C8ajSWro}^YAhloM 4KUAqq-OC|*cWS?7',K4H .pM[-1j3.I D^hdhSOmgc09RaڏdxoR&ӟ**#,KtD,͑ KɄ,ّ:+s  ͛3ó+4 F8;ˠBxEx,Z(!ASW;++lH`^pX@<(ԆWpB,45ph<.[s.L&[:ji9#=*? qi#{ꬂҺQn:1>>;+7QA%qZ\Zs%F(ajy<^fj. Ö& a]HP`s s!t C( { wZF'c6y>۸!񜄈L91CbsDtL $͑J,3ٰ:<=DV6T,4ҳJ,BH",X􋷠A[B"B^%,|kWpBX0+L!DFܔ3|JTjK) scd!&d::&„Ü.ɖP*7 ]`+)y +j""9F"hFo9hG }0:u<5C )@>C-GUY9+:3W*JpA.$B$AZW ZHOXKIZ`O+LA85QԆZBë+ɚIm@P/D.Qc"Őf"aЄaPbP98( )B| 4ԁQH|% ÝC 9C - ƒY ^0@aO;+DS.s[ĬXV5E]3hH'c a,'klcHvz*`32Be,%ez*ߔIMЁğŁAt| ͫzD-~3."z AcH,OtB[Ȇ̆!IK(%BÓ!;'QsR;RpXţ,^Y " 9, ea@ 1 \*<JU9{ zz4ΒN2;=V=0ٷ(A3O[( 4.`eQZPoˆ-THzɳɣʛ-P:n&tz q2I$+ff dq2"<\+ۇnFeJ"#J%۲=,$Zݐx3㤺 !G+4[+;=լC% tOl4UtT%aVlWI=RFPcuVkIeК omP,4pJgɄ ]ՄܥeUJ4*"9!âaQ64 \Nu؂ >9k;ť۠ ;-x- 54BC&,$5)<'5T,B/sI3Lqi@8Iŀds!ٿֳƴC9^U,"ܨ$!ǚԐ*u^$a(. R匊 ђR1Al ˪GѪγ[WJH E$} EA<]M\5l5W5Qs_兿@omWO[Ul0Ihe㛔V p`pS8JmWLEeh E㮩FWB-8/{4K<(`ݤ8 xY(Θ4 IEW4\[5B+}5phc|`]}Vpf,C,[0CٮqIӀ9$,3@=)2б';D< (T})MG{ q\@V.)!4  Ϻըx[z,XOيSn%G  A)Wb+vid}ZHȝ6V\4k5c I\ϔ<&tf<[І>lVȩ IPeD^zk=2sÐ+BrM}`QJ XP MNDuBp !diɝ!1llcec`voY4&niPgSF)fd#lrlkrĶ~5h,,a5qD}P"C'>]R%z΂` d}|W/~qU~w-hPc@#sҚ3Q5q `~[sncWGͼC GI Gs$p$IP"uMch:d& Ab1"Œ$$l9 :s0IN45hB(;]JGɮfdb|X>bİxD6X_Xvsp9 lX̑  Che Z mֳ2§jx4iBsѰo][ӑ^sf[lNod66.^FZ"np,<0 8Fv2c$`& .pr>[l$4KH '+r6T j:11U1;N:!ayK.1-.s۟ Jp >b JA)4 #1xD&]hj-ʆíp/,EL&!F:h2y⋵o@ <].o7XEz˵-RG8j8~c.P9 pċ9d=IDJ,i=T@cMAs?=vaѕJ*2ElHsY +1Lݕ[(ACraЏ}8pybS-lKLePԴޠ S~K2QڶfT5id՗^x( QCђĔaӟ;٩b"9oZGA&D}H"-0P(Ÿ J6-zN{6(خס>Z-"za>3Ař_b&lKv-2qaN-n(h"𧦏4딪Hu~֊~ahKF Ջ%90\ ^z$L]e poqR NEԠX|TM Z@WM[T(V_@JΌP-F-Vuѻ@FH<gxeKלfUHoG’<\sWM)LPOIFd ؛  ' ZHΟ(>LԄ*ZEgu%FC">C-T D<@¬>UZU(-LlDNLIW 2Y%@EW(HWŷa_\H8-BE ,e\={_ԄhTd[dW=%Mj$\f$ dhn ĝCs ,HB(^\AyXD$YR%ILO` V S$Ԝ >P55@ P˔L7Y|yQm ӻSy6L \֌bʋf$"Q%&TH98D'D֝wd xZ#NDGH'8E4 HDu*d%AK&b^(>'>lOC\X-vD@2@EHP Y4=S-M9_0PlnP=fP S;S:їMY|1gvvYȺ@%Bs8 x /L$ dUN`%p1ҞNlGE,4` ]̊JYTsatݜ[IdV8O1ZxymM 1'S}}9:[չjT͋FT]>Nؑ]?&GKx2P9wy|R`aDvYdAhRu`GE"RF,|MQpaZ")D>^lB(V.> .);lrBaS!pD+pYeo aUg e1!K|,Mф{%^"Th^c2(r,Bkb @cB JBUnREL/%1 ]`(XlE3ͦ+VD#WlTh^%r*a{i+c;Fqp P^=]Rĩ g/$8L\8C; (W&DiN\X Dz4GyGhH tEI_s#2,2TLM#\$6SrN6gctOd kqѨnV%•Q% bI.DaG@ DGQGl\⅜#Q%DζD-J>P&׎pzp9b JHB6!p^46ʆb舋$؀u ;MI} %DRr'fTKxYH, b./C皃9 kD0LY$$×EUz>P(,F&} Zm.35AAD# YLid`pS-B'u^;*SFsj@t-KVf.xJ-HRIBa]0Yx o \"PiBe_De^JpJV0$AS_(D{y܀|um,á*|y􂚄APH>(D_v%-GX 0g2\&m­iq9FFOzFSQiQF씭HՑ ?Yb5Ե:ނO-;avdO, xo]:y.m|d?63()CdexMZ˗DoYê@z"bXPSB%:@PҤ1ݲַ^ \6jzeAf|hƌ2fK\BWXHV̔@j|4dKm}K*VZj\TPӨٲeBs.Vl24srڜW5`N&*M64!_L3$+t:;+!+ju3jt`YtSMGy%xQg[K40qІF.T6aEP؈/F9WI k<D$4Ap| G=o\:Qczģ4)1Ùșű3n0NLxA5b -qD='tEMh&<'KVR;OSTK΃M2R ӘJ#2$Maz`B`a{^b>e"w;@ 0 mկEX̉ ?)4g/; &A[ Hq :EѝH"e1d,^I" fwT';aT\!E( tQIP}l+rڇB?o٨2)kk#d3%)7muEˠ$>85ҟ9O|B(J0“[,*tl5:%yl)*[xE𲐂g% IV*V1*zpz؃OMj]zpىU`EE$2Hp{+/*28wXf~1 %kYP5O/ba c5ˋJmɱF+\P"u6ш>@H:k#F+MHёEaD((l.RW!4^-.la)I8ڳn x>;0FU6PG&{.I_޹FawD''˄: >/J[@laK[[SKv M Uk(-Q T Sp*b$o#xOdrH!gإ4$I,H$)PAun%*B@"-+CST)vb)w@kG:8% MR+xZS*P>:yr,!l@D/-Q-״{0L2VoJDD*Dl/Z.&ڨAHn.>!H\Nʨf!&q !\pI!b@ d?@Ia?`3B #b*2.zCȄtoMФMq+~C@ z`B(+eR2;H-ɣ(_(̰#O;uLJ$)EZ2'Xr+"",5@G-9/-;<@"42$~Lk¥18QfoG.^qD4 O*Ԡ3-n3g*;HE;bѬ3s4(-؏pFtlH+f-Yfl-Y x-9Q:[dةjF$ʼū,CJ<ì* fd !p{$Tt#sIt.^u $@A_oŌ@Hq A) r^d6TS8?Z78C,,KtK3i.iD\w>FQv3~hMG>IJYK@a@AB{#$p` d ?Y  { 蘛YIxyB{@77!: njĄL+A3wdq& "hx!B8u9y'=ZUfg:9.9 & *r+h$P$Shw#;LP؏#Jۀ-! ;\0MdB(vL%#*} '2Ν<=>SP C0rPP0|]ΓquWd8/Ylۺ} 7n4|el 8 b8paa83FL6PZCi%J$5˖9p} W nkWf}Z~U6jW[xZkٲEkwf~ƶoլ >wz_hH:ƍ$7h0ɯ1%#aB.C]vKj a & b|b bc$2B#/c6uV+dj 8-YoixR6M8Gk)R!k?b)򊗫b[-Dx˹-98gK!_ H ƀ nd'ÀI&i(Y EI8Qt>фQ:>tyC28aGbAr[8 u): Cmk4Uq<]m[-XÎKnz$Փʤኀ`X/bQf$c#%jhf2"9߼d-朒Aj\ڥ$ip5Gq9 +)k|cK6#K mE&ۜxi#t"[[m`rVh`f_ 6đFڵѩ=C__,λba,c7 Lp/b4LB bڑ6[doVJ{j eȶZ-e̤i'o-i9gN8,F`_(&R:nٜF4]6΄jFwitKу;13p  pRd{&!Qa6ĨDhM4o011 L$5aq4&4+F F ᔍ$8$+N-RA۠4鹝ʴDZd:|NsfJ sd-*|3țHFe b0F$l&ӱiG;N0bLo|c G\Xe)uV:fjX×8zjCALӼ(!]cwa`H(*U08@D cØ}Mی/jKfJ!idVhD\8MS (7Z"sHtf:r}l8tb9>gO}Ex22D)7LA8 WMjd:U!ު:a$|/isϗ-FpfIm{ےN5$+I2E^skL\$N`&Kd(CɘGyTIKe6tY#aitm􆧣𬴓]CzpQTOtBh!ZwtCtȸ˥Pؑ T8dD,R(Chi*Jl`hxju2+b:nqD\ir)92+YzZB.bJ:xsE/U4W[ SWcrrD˕s?0w!bKczMz ^U _hK{U^%/R!r@ fT h:r~XxY%S2=⍉y'9 ` ]i8*Ltn+4N+Y]RD m4߀Ǖ ܏I("shp-sId25Zg60eVeq*%5G!-_q@@y#A02 pnQ3YI iA6$DRpa82Khk2S2$u-b0eT:7J.aEz9PE~rEY Od4 h` da5 \ e+Ք.$]G<*Nal3av> E!>?ג{?ل/"m GM'Ac0rV  poÐ)vXlH+g2a(I&:%$S;R (2AD:cR12-TFq'#LG3T!BV(OV5Xsg0(7@sj4 VoWutmu`FniPQnDT $RX3Y3;c3J4ϸ24$2z92S-YGKx9 CoATLSxG;.G5cFgkDNpdN\FCz%6G 80-! 2{C _?*),%7DW#tZfmd# 8g}A)! ` }0K"1:4qF$3uDY*$b9CѨљo-D :3-dY=d4(P7e5x[+rxAٴe%*=x(_ ?7p>S967aGGvs@y5n#riQx Q0\ !8aC1g'2pJU.1iwhE21V JՙG'P1aWsRd]d4dYkTsZ 6n;tC1nGfX0@ &}`& a&m;oQABgR"u; 2YR S&)KIY7%cCa!r|x&E0xGHy "6ws%e˅VVXGz= z.U9%ҹR{9JÁ/GW|&_#"PI @ [@ v6JhDN$9:pY?3UX3$TXWK)De'{&W"5Md4greFwm}t|c|ʠҗ@p} 7wlq8!~D'4JJd8!2wpjDZ'K,&y9Ño2$U%VujTdHfL dJVLs7y?wz Q=Y VEV 0/m+kmDʠ) 6*0@KHX`rnuŀ5/a0TqpT[o@Y[g aCm:%UctJXcJtB1:3 J78J(J(J&{D4aEӁ*cKBPAgQC8@ }Kpއ]R1ixo8%T w;zBT9wb6ŞKu1nRR2J'S>6E~/XTL4GZ r!ijyeVc=Bɇbz1 VI+?0LtQ {G&27'lFn'gr UAM_V7 Sg:CU:L$#R1- D}?Xnri9X ꅮYrUK70DZDŽrŔM *fWAd`jp˚yY}yɗ ~8yYXK*coG YbZ:b1:bN2h0TBc7:dw䍈qjŤeؠ:y2ɝ]OMts=B \{ܥ + 2 Nk?FtQm6G' `Pp K P rVA2b7 a63\q&hb&$w\DӐ Ӡ })Xm W1EM{~RK7`xFD-lL5׵|H0\!K!P/$= @ O pA0 )Yj1hJaSngjL8F 3ppp#u4R/kEy\L*g@cNFU6kbVJ+)]r[._ 9p^ ` l-'=j_71K."1f *uηSػ|%%K4&MuYFd_z)%M%=%w$CeVK:2@6[`[0d1lUWL˭ XZ5w$l%nuԽwj !rF#\(#!oXY|i%d=Dg0qQp٬av-S Bô{JP ws#5%U;ZM<.~ViDO"^67ּ]̆m1aRpp C.rq+. -y5m6˕}򛱤 #{-H1&$i jWq$]:'h2B-@ SI$6vq;8'sTgJ@P-67, Aϻ񼨳Jy֡^fGN_,QJ ޷о"K ^';+'pߐ5}&XXS:HZs6H \$-o d:۲)H]˽ȄsNBl86F*5#|3}aҕn1 8` AH8np h!.o q0F kղb6 1LI ./1QÕ4V3le-sϙCB"z"Ŋ+ҲPcB+tVWTj[2K*<[Jm),Y$G7oz#8TjkQ-1rF0h0eʄ 3giCgʦ+֭3-Go2}ݧn4QCI1. 0bĠQIjlJ*iIMMSzҤ1%G^hQ-dhVC8z9$q{Gl]|i1߬(4㯈Fwud6gR*F7lܿ/m"˭-! }k/K.A*0Ch C6.zP}23sqG_ GǞ{d1$$yP#لJ,rK.J 3 42 b$Cc4#6 45*J@ 4>C0ȲO |'!sx1҄h ɢL#O#N?rT\I% Wѳ W"(X **bJd:@Z AjπK-D rP4tLM0pl,1tH@GMe23Ͷlt7~o4&9S䕐s(:U.kVh}ˆ E ͨ7,Z.K@v 6Aպ۽B ;{C}'ep@#GIҐK ’04r!pc y01Tԇ)wAC8^t\Sg]wGC}t-զA[|cI8bP8%NWP>]ЁaCu8c] pα4Ҕ#P9ȧB}ԇ.ƞJgVsbVmv&ͣλM~$Ƚi*-vs0A@'M Y 4p-PB1 bĘ@F2 8Cj W ]HbT-Njc!"0\ɏ${JuD[t$ KFVe;M8)$%C,e BU,c)&_@j?=pK %Es9QH"Q-EĠAtQ[ >!Fi"]@GLHm@<%)ccG 8:x.\.HG؇0h9\i .YId&K(> )uHӦbN8 ܩ3|hYC勅j] fu6QޤvRG"Ĩ`ayX1T6x!Etu+WJy-3;b]>`'H>Mpaڒ E[#PM\jHÚ FUN28/Ь5P:C֤!x'dQ0ZBB1*S^2=TV+IETBWDT:5 J]S\qb"Uw΁_ B);0)]qցޘ :ayAT`L \KGg%m4br֩PF1@M(Q&`HcJ\8.H7Tsc*Sھeah] `p5ܴ:M/^35x뚧oB}"_Rj8NdqEqRQRWB#,BتT*A&NXf9Z ` !ׄjj6ehXDm`C$H,* Ιk z1X r&șNmEKj EF2F%M: 85bi_-嵡k)ш_&!%(%n}}ҙnJl\G[_@w*hڙFPQhȊ_{g82rػ@o0A1xEH1r@:-pI849 SгRs pQ84bQp< z=/tڲ.C[EXk ӕѕS <ÉYV1h(ڎ:k()F IO@b#sy O,c+ѣ pqG TR h Z1xI&a@` >iM@%X;М\Vr%͑>]h0ab%g>g0Azpr{j&&5$ۑB~ȌA[cB'H  p!{2;'-X`- + p*Fs/Ų19Jˏб , 6@G  DC {ׁ>1&ҩJ⯫ vGF0/(`P(Xpˈ^Ea103؊@9g9a ʲ š$PP |f2 12rcGQiޓۇӌ>ʼn gӇ4ZfA)qgMa=E>̘'KYA [ѬPUF, "2\Oa;Q ] 0Kϱ4"3Y8$9FK*L0);54 SC͒fʐD E,Ź īQˑ-!h!ȁDTfG  miYXvYPx,!y?):@+ث"JK(OD ȵ;c-?S(S@!DB BOe]hZ4h B)I 4ӊ\IR.U-Y܇;ّ2nsJXB{k Œ [xay pSXk\3 b 4VӔWHfUH-p9omГ Wq&S\35-#<:==,H` ^$\56-TTbhaJMՒb@eŊuDeQGxUUL8KtmS$/&>E(@ۙ鈄cE9-P1^BXXՃˡ9sa E ƄYΔ! 9!#"Ŗ\~b*B_ {0r9.-8&phFHd3)dr06hh3 GL>"^!Űa~[#aC y!BTUB|0;%z(|T` |023#EROeŘeVIZhM]>Ffeg,p:9DIM]SSfm]-Ʉ$Vt70)hJutfG-3xtpG I|rf\)Xa^;,\rpF_Ɛ,LvLHJdRŀYb Kl𱠣<)ֻhhwz!n'( b:٪^UE9:+[w㮷 ^?b8MaiX`: HU8f~:ƪZH^l :װdI:pIdsmd7 ` gҒ` # r{IwyR&Xo "Lp!ÆB(⤁VOLiMJ#&H&q& K1gČT卑\nlq#Δ)m1UWj%ʕҥTBzo^eU7ξ"dkDþ ׯe˾Ѫ ^-[ -bQ0"1B# S&Li$i$I[hzҢ։u GSR$gbV6MES^kT ҵZzaiSw"u_켈aWb'z1|=Xٷ}S$&BS&%o5[FnIܕI6 >1d1gW'vysx4ĔZ'12DNפ̓PnYvHTVPN\:TVרY)%{6Ƨ^Um>/Ңqbt؆㐫;;h6g^%U҃rSI%T GRM%y\-"R*F EWȪ1R")"!hP,HPVv!0AE!lA4I041JFf=m.GjCkNGmp8ȕ#eInYҕ$yqQKeZ_4+Û4xo(h: JDr&v^"0B29d* ԡWpɤTR]+\»!y{ ,RʇóBB.e8h4xb}Fv3 5@.13 5Koz?2p㸝@R pEO22 /E ZdfDhui=kl,e =>mhy0L0-I$F0dc.[NΦ *WlxKt$qQJ6S}FHt ߸HL!#WjG@I1PāFHaEΝ01dZE@d$i$I0l86HA !l%wXI֪.UZtpk\4t;&` ,I*#$4309 `n4I&lN#˦gR曣:i#ӄUJDJ5Q }Vn[{Q Xf1WdbjrEDQ0yV0IL-UL&nVfWh4ݚ!=5Lhz>f񊂺o„,K֩>,'A #Sbb|c dbhAp{^2D'a^a(V@BL%0q"Z֯rr2Y$f{PSUU aR ѕE( uIgzH?IQلBUgo0`%G0h[cZz|"(GCJs gNV~`q!Kv25j (Z腖-;|0lWdY>6bfSrPf4 [^Y,ġ=Zi1 % #~ZO[k<ģhd7770(F1U'^nm2&KN5(nUdo~*Cuxd@1\䏃OiGNb+^S?$'J!ȼ1q 1h D ! 13p1}CZHoIBJF($GP4Ĭ¤H\-DyUtD 88 񙀠Py c1 ^mUV Fd J/y^ $qy\\8^ϏiSjX$hX4 P̈́ZZ!ZMNlHPGTSE}!8V@TZx -`(ȫLLEΪơ5ˠgNK$2pLill֎ R51 Q-J_PM"ыĀ&TDCl<=00 `PFA_Blc77>(:rXUPCY;1 U!AڣOpAlJ !ω`- HXKB\(="뼠1O/`p~M]cmpa"p"p^d,SM4˸F՜  O%Ɋ9!M-!=YyPAȗbHWJ&1E]Ez{dS\֝]<} `ld.a`0=mJef9SO℉qؕ4O2UPY ,IڈZۘMq0fB͝0D&H=A'ȃ f#;l郷8o_>hA CĀ @,gs><"BD'J(&wF0B(\ fg `D8FJ \9i% ILu8Ġ)e80@9[e,E|ʃ =VFV$ Em$R٠u/y] H"$Ď4 hkԸAkFjPa؅ɿ<\ZaJTSZI#AM#]"BFv ȆlǼ|R ~hN"w[PH/!Zp"9FO4!U_n2ŀ 4iLmŔM.bQQcMo$p8rh 2.1AC\70>Br"0*kYɩrEO iiୖXOp(F NȦ^ NA [N*q[%zV ɥE. kݲ\H`FƂحyt`"Ý)zώP 6fħZP}DH(LbG`-scLH. L"Zd0%N2T"bmA Za&$6I&T19Iȡp` ֆ$fЛXiɼIm*gjjO#(đȪBd s4'@_>#66.w-)ps(lsk#f8Zs f³.,!tcyo7~c>t7zutcCI 1~NhS ;tZt- ;K A[VJVVR j]$R 0Ktf^}󐇤XK A2U0Ӧ툌,5mҜRLP`O1,b1<~D,@`@J< kWRȊZل, e%H :DRI44IZGޒpj0Ǵ\yc[lL6q^K)f\22RIѢv~"nԲBL 00 4iB3߹_|Cz+<,;.Cr;A<;N:.7o|kA~kzN݄9vS>=Bd\ ,(]zT4h)Ze}4e5 j[`' ۬ ;xy N̚\Jax)zբF]®?P[N׼ZXoPtV4jyD:J -e}m}4ƴY`ؠ~$^~`쵈KeL.j4ISm(fmmL_>QPeM%P_C LFpO,:.:jp f'x@3S/{@t>r7y3:v>>ǀsCp0YHt1;I: [H$G|dH E Ue]Sd4EĖB` mٲh 0"B  SѢ0QL1g0 *cĸFa\DyM4nHrs@ zF}Eci=hR474I#2 cŠ iX!Gm6[7JҤicK[ ٪#[5\ aVK[Ư$K~ o *7 ϟ(aAE^D8v2X`Ň:v#ǓaID eo '7\2jM{QZϩz1݇5}ۧxTۓO<4^֛d}bP4 g42Ic%0B(\PX8DCM'.:]\JCBgS(LqE!\j*{#e"ArT31,1$AcLҬ0&i Ŗ^G̖4;,7)+Ep(χl{6A6dchщ~ۨIDR)(, 70 '(n`>^UC$, IEWI$+/Q#Ily60 KY;k1Wm# Ol ϋb BR-=HZh!ނkrI%p8#^4M 'IڐЏ<}[ >0NvO?h3/eX'J?gG?)kA4H/ܤEMnhfD|I&BPEZ:j[꫻&1r&Fa:.=zxhPk_2-E22D2V-!FbfLEKlb_647[FS$6 "ЂZMuZs=_z P-0  ef&/%)rB#Ԝ2&KEäz*Wʾ4j;]($Zg2)E+7la sc3׊7D&ths=$5y: ^"2i#M I"L1\s^%eE'СΨP$)T z,,fQJ݇=qV}@ Z$ԳB,Z\p0xagE2эbH)-h(&eC&Bj10F9=&3kca5׾fw=6 2Aw["v'Mj%1Ts'pSQ NSJc Ƚ%1lL,P"2;XUՕTHDPXFl]KZ `dHrN`"ȺN !e( "H!\9N,ZBYHlaS*,07D(W=^S#G6O#+3&͠3hh *S]ۑI44(chv̕(IoA>.(n`33ϫ\-xH4MƝpLbBĐ/,)#X:CM"`8"Sy(B_4Mxق vPxE$I(,CS=HbD70!J`ڢ [ϱq@AK4 SyuF`AjpPɣ^0$1`K20 3z6h RR m I*Wd/3S("KʘŠ>3IH@iOڵe2 MҲ>A1r`Udr:ȸ^5N~a'u@ni&ays|WAU]ePO* L9 ,&ajz[,:3o%UonZp3K[R 98t苵BG\I:+⪮ԭ+6bB]QAT@8TC0/9&pQ (E|iDf GqP{vd Nɨ _6ڎp6mox\6r9 !pP|!z23Jl{.Īp1/S J+='e@w qXC ])kw||^~aWxX.&aO|"_vTC |7$,gXA41j,F $Jz09.AKz(QK3q IC&v`i׵nClQ ¸pZ2=a(l^j܁Pzg6Jf>@QTЊ2Tۙ3=(9'8e*s$!}^&g2] ѡ}[#HnE vCndN_z2 ,'VCaB$U'<~d,,+Zqř|VD tЕGWJLKjGY„ ,' 1*jj/6օB46"j0B`d fYk麌(vⱄBbzz$`첪be"*eC@>\%m ³bAh6 PvDdXB樀HBI~X DXq&DdhfbOjrpJvZ FaZ0OZ<u4mvPdc,F QΔ` rɡJ&NTÄC(|@䢇znn*)?{)|z-nnpdWH$ 0/qxxLYbsE\.#s([@GȖo^4&b^@-<="*_+Ib y>.G N"'0c"kjѲC#{Kgn gOgdF*>٢(0 ?$hGG(HDltXF BMΤ\Hɦ(*+wZ lxNLn`Tf(cnanzpbYh {" {XIJ&R &GLk#l&Вη c2,2 pc\G pok",~-Z'Ѐ-7J-C%\j !i" 89s&VT!9y&4 |@!&-$<_gcna<H K<, F #x<`d<bO)n㪹 n#72v̔hK`~\jra`BcTh$`2 d1zzFmfg{+3BчD,)IxnKM vņ@1靲C_DPE5"^ 2;.IJD?ng'L F:.>< wkRҚ0ѩ}&K''~ƫaq0 C[UMФ3FÁfcu*q 7@ w8$e6 K˦U9>%'F(8ѫ;LB@ wL9Ujfdg@f΃ ]gn"h$Rň( _6j@62jlGs@AB#^4hPS3P_4Fh6thVP  e2_| KD&Ds &Sl,|%EIR BgqTHhN `HD DX|ma*mi_RTBG=|;cX"5[wk 6nES2вd56OL‚-n.ROGR"n@NF Gp(*-#)>'D! d }J {LRHp%\KT IJBZ)Pb䗄$umЩ[! tB4(46{)~A+< D ^$N&Ynsf_g%>I@VdZ/lXM *Kԑ1l"$dLr_"NT ao.`(&%8p*f˜Pg&p"{1"5~;WA,OMd'xe B lDv!6od`mƱ/gU0,KJHHS}&mU5B|(?FIdT gz!` b@c"vCLsWDҗnz)FL.}c(L">L 4,lLrN$gJ؍&QxxB"xj5m\#WCrrM64뮒!T[ sST`mMrAԒrT[_&F9G79 hX_#gS"kQ7dXWdM袗mD9Y9 &[ɣ+8kknӀ^HJMTD-Ī@#ù*X,D D*=aWnK9+;VQ4Lt}B Z&p),a [c8NR^T%`Ěj]%GcW @{dTy[=ZsW/W?_Oo7ҴXpnl{QzWAZo0 ÑG67H%_jO5nB`喑m?l ; d~yl|BY`)})DifFbVdР%)a> ia 0%fjE;/dL^)msIX8CbKVI$P*_qsYsz{o2:p !~zۈ=w:vԖ:~X7&7̲%xP:J%ŭ"a~i=9{WꕴKL,mVdweU-Pj]hxĆkXp2|^oB̮;JпD>3\aFT\,]PUO}hk@$x7kDZ%@fɳfltu`)vlpdaw_;liF g)_G tH*Lf}{/$eà#F#3bЄ F1g\FL7PY=eДY=eʒ)#Tپ iS`}ЖcQElҺBa %-ʒ--BmӶu˖lwՎlF 0K@0#Vlp =LoW$g^zI;WhQ4%A17Ǎ'%.FRLDTzk@ ƇBl^o/[k*V=Xgf|-s/oqI\6 Q6Xbdpa (8fZag->l$Q=2'C"k367>ASQ54 hV$id"BL(( 1PB!aOA9P>2D3-E(j>KϚmfK1L[lӅh朄Yj䣐>iɘF˼FiIzFdIL)Ad=>OfRL:PU=TUҕgWvl]xeI.Ud-` r+`Zf_bh+ KS;#EjЦ$G$TRoy R$!1ɩ@&D4ᨏ>$K Q ;פ;äוxZW-t{-|Ek%|je"]{B(d -pf7,FQj41ΈQQ[j:ƢZcGĄCq$6 B\z -> Oi!8.w`22 O3rMC'y>[(Vf*-BFb% $qIIBI(1YH6jThTԬzPr3-Ze[0"bw[i\[GW^dݰf]aP&Be 4U&3Mh$s/FFgs rM &,8o<$';QMrLh(6 %##XVylcO}ga[^ͥ> 租h1B́D&\0(WH.Dg1Peա )3h6l4QV"5-B$َFǒb  IJB:/o>-de*\q=NXDH=;=QB> NdJ> J4RP0D:k ZED/fS!QIJRR\(&Y-UuKSt(}BdTW/f͊gc8 o$H FAH1\lAt?@M2L\]9FcbI7 3AK, Ǫ|3Vt21a)4YeJ"оL.8c |n&Ɠ~;Hb@1@?zYBɧHٵ5%Y8B+S3{!rF ֶRA$/ L`4Iupeڅ .@Yˊ2Npb b-`ܚLVu݇.BkY!KBDI ^ <$)N`F F:R+WL"`*3P1 CޅFK#aU:PDoE^&3_ 3.*0غQP\73Ht* Ɠ&£,&:IOf(%JYbDkSYR |K(ڬUċ^ h a|F1.T~z=ʄEikMZxkキb<$-鶔D`$'P\.%u]J!bP8ю%3˽@O,ģM@gz@c=w ),v*%+H0kMOrB+Xf0=lc`DeSӘ!B Q}j-Z[A sUakVKm8ʯdKj7P.O;+xxd)ŀ(c_Y6>%-S{祝}b+hI̓>A 3 of(o5r(|gSF'%0kB.!}s1:sOa&GUSE-}`e.?_%8Ogu`b"'/GV]VIg6A7 !Agf ug I،Qv5;;#(aU)DMq2]B uh6Nl9s1)>6#r46..x揘GnGTVD.Yse/ z*gMc{ BDx=CNX=091|Fmda>b^͒,Av?c[-;#_ydH yֲPO f$mE#oX{䊱ttjwg8tY+qeA4k#(\+qkbpB<:"N812blv+֒R1| B-RxD^&5y('PaTUafvt*2/!Mq8pc (M;p*6rphv 2m&Teq82'.9*AWnR-*G.@[s}"]I)]#ciO(NtCKrHQguTg$ t x)o$p0 M#91=@ +}l7p'GrEWA!?8)!KJ(7 @e@S._G_@@nEm<`!<-laOw!C gYPꞃeGI_R!UeLON_I,br"z@Nj^󩧱HЖaumcׁ4qJ"i:w"Es Rl7)) M >xHXFa6?gP%Kʮ}V.ad"lvoɕ5 i0;b )v)6NH1,?3qa0HmLidh4IErU-ǔi @<Ҋ&dɯ'ҋ.QrSRGXZVjevJ{)h\ M>%HuiJб;5Da=*9"Թ)#waODӨx!_ORJLz@!VO !!/^f$zi\V')B0)\00|S/](7 /ya3}P%%nߚx1yy\u-9dvWZWa^6We:fS#Ip)Xz{ !$/o0 ֱ~nX A{Fw12JS:+qq=4H+wϩ xwOfȄ|+L?yB!L}QWBj`$$Ap$:Ě"|23%yQ!1։:41EŐ }▩v(xNz.O _z# zAAxeH_2>*XRjȐWݛ` i~ZB)){r# 1*8LR+H] =zlv"+zh!L Џ(7c {v_nz7,G} o슫'1\p(*#D{%r90|eJ5x*L1+6£\ (F嚯wLOJؚ*1GWXh1?ۯeV^ ;⾉t(u&mlq;ʔg481Mv_IRw2:Qwze]bxz ݖ5lgE5P"K~OX!a!g`eFx! 4/rUgckf M# 1Z,+B/2ː%kO-?lp7U `4> \2M#*Z6:/b u;LxčBhvC6JBey#p@o͕-Q?2̖"7(Ml6wI,٣fbs .20"IB M3=\S8p\=B[LP֭&?O--nh|-Ō{{FKß'zB`iz}zdV HǾm9#j,"Q`NvC!x)}5b` tHe&`ne.U|a+#FѕGؠ< N.Z:f@}t5-`cAB[/ͳu逌oCKj.s MBQSA]i!Э=#ϡ% ~ˎPnL+/=ʬ.gp>̗@a#tzt[Û=B#R6 oaӡhGȽȭvbi ` a>$4Њ2ԳJKc枋zko}Wy@b<;"dSMc6Aۛj" +a"kvH>ە.4s ioќ.l)8* gi=^NxOLEp'Ɯ/LZ.9~bT49,"Txċ!t"vsL7΁$*u[~cp$à p O_7);A=oiO~&2WNH(Cģj X^FUc޷_H>:͵"a0K<9 @aSM@qlx[ŏ2QoI s#… &С…h0eʄI1 c!1$Cdʔ qJ193e̎S8@o2}=j^zuoiSB+*5Thn@i gѤd\utnDŽ 7ǚMvh.n]Ȏ+;ƜYfr3KtY\ei*Z}vݷl_umPRM U&~;@F{w yF}/+zznS]hQg:jigGTSF8զJ߶*JC4Q# *(2 ¶(k8Dsߔ5eY ŭ@֬EB+;vl5|qϘj 1:r&zJ',2 ϒ S*C/1a=CYKH2񌳻sl xaa0";,SE4RI zcP:fC2@2../-MLj:U5ˊjtV9J37:p.t~,S 5n 4)D8<v_²4*uw=“{pU#J6-M9p"NA#색N&(X"w1u4хoԋg,e\ς:oM!pWHY&H oƥYb;ַҳ} z0s_!]H}+1WҰl;NK2?{W?T,lHlJ k#A31e4f>hFEYU4i&TˣdH7zIO䄚Sd)nBP& e- Cyt1@EEcmmSsҎFH+ILo GMIԕ7 Kwl &.f' 2AĹ-}F]:KTƪE"yД\ [3"xr_0:lXUHѵDM1AnҘd+RΖVIFKU` 饥fSjjѬtQnV^h_QQz¹.ē^&! +pn {p YYvq$ u 8zS6 lDlV!f| ۗ^ЪYNSAYZa?ʻNrc)Ֆ$l'\d4&F2`p Ҁt*ZBt(`6}Q*UdRԢ;)0So"8qYQuV{O,Ȧ8R+'״:GR~*Abh~MVsPIu w+bȥX|,0mL%{(Wq6@UK t< ӵH]imiՐ KM_]@lop'6OqE6~>D4}@5OhR* D%[EdK2b)X9qޜ]*IC~{^~m4.Xr^c:^j0L5!xν%/)x|pbgU|Ֆ[dؐ#$^I9<>w^^,2d>8h3ʁn8;F = 7@z$ŎBcf :`QE()@J;; `0 1:2BH*ۼ > Pc 7j; 1c1W %+kfa1h0ީ7% 7 +b)0-P3 tb$syY'c+Ί8غiT 8l2+቙ۖ3BВ'X|BEybp M`Nÿʩ TUt!ZK ^I3 z Wޛ27 x ʊs&p@L!'X(8b$gd+uҭYCr,-Y Z+29$;B89F1Q2^)g#Hĝ6! &pţBy1aDj+=|,1L㋽ H=N%CcF#@y#P Mf0ş(C"Vɜ6A5mɽV%n+sfr-kڳ%M"Di+BjTƉ[D|:h}AN b8SM̐ \ jF,{zq%4kܤo0i,br GqީAt:BBȭܫ4=SBxeZA0zD&X3e8g1k0؜(,7}Y${۠AODN *N=εA-00? xў @ 0PXC+ «-3OPN).jZ8ds&8b8UÂHLOFhD-!z>b2q9TңI̤2$>ˆ{Ě2]c̓+c7" O$AT+Q^ aҕ=C PX ؄͔̔7YJ!<\ frE֣^ˍ ӳz7`>˲W0GM$|D11d$pYL^wSXOíkl'j 1[UkTP 8૪[eGTG:j]c93G6}0g7?0SƔP])_+<p‘ӞO4XP@U]\I}Ȉʈ V|$;0=^,xa!(9;]p*n#S?߶z%j2ƛZUC3iȨ8\iU CӪHE7HR[ܕbނ ̬`B]rT%,WT:)ģXO1v#J}ÍCY0PMҕQ"*b`'b^b(dVfb8dgf~fjeNaeVffhl(gfrYZ]Ȼ39 IJd7Q)j>Mj-+veCtWq G93SռSbw+Pˍj?Z KT rÊd6^G(Bk;0z7s$g*XN=$túa1Є\}U)FIakRaa^a^kF`a:g,IMy]:Ӝۏ`*Vz7Tt[~7d~\P\ qJiLF[pt)͕ Lg [ kK},oU+ N7dJ%KGFXhK 8=,%x^K0y-(9ЄV10 Ӆ]kFaq^oFfp(ff>6מ|$kR6M؝;=E2"Ҽkm*B%*%2be*,:F "9ĿL4Aw$f[j=Rd1MY^?iȄI:"h>kgBfFh^tdDwJj6tƦY9:ṛᵝg%tč{cl7.fPP7S Q~(mm+5.P2DJ6. ֖7ʱI6x8n~mDi'N grL,C.1 &gl#&ͪ0G{6\27e]DDC8v*;mID M(78P(]X݌I1H{ kfH_kMoaaM77pLgyVCwoyvپ5hMSp3W:_S .O$ma1ߗj72NY,W7pAq̓1bGKFeOv4oBӂ,CB_ڍVwW26XE,-&?.+ p ZWHs֋1xdx8FDy/f/fjjtd3 }(N(sR6E#vWq4! sd9~/& /dE^Ď}7z*O\>X{SZ(Z5iEo};>e EWpzil(Q#njDCh BeŽ!J4"H,WBTr(҅Qf$e'uJsx.kYUs=\F2Bn&m gCʨ+aC$E 2+s9X'Wz0C20ñ&ppslF]ϣʌgfYx Q(i,NTMxgi|R@%MAwH!)޺ 5X 5 DViB 0s\F1$O ʬeʐz@G3QP_W $h - lyxpa"+-iʤ<=/k |%G,?Z W" BC&V-N2N&ь9@XApxCQ(PCw _FR (C?HUp25q (H`BTXa&rIBJLSɬ|YӪjV!8 @@IBH= yl#kmŋP{"yk+?I: 5(ASsut3(iE$#K&H D 1a+|)V`9D$/D @_&Jď*3}A/?!?3C{g( g֊UlUn0= x2"ˑj.E͌A,8@ >%0#hCatډɐmt;\v+]@.Wq\p(6B+(UUg\':ITUPH<@+la8ԗk #jr$Ѝ歯S}4/,∪2B;e)ٓԣ$5lF1`ChNuZE- PѠILp)Ҡb%fTy RxcBI2 \,vr*B԰J[|%zha 0 4\ kzI@ >0j0H@_3;e,""av\d0;u & -Nq*TŚEԘ ;bT*Xh@ԓLoSD؏f6^zF| >Kq^TfIAZSb7ëIPlFYe )NЧkʼLuN茉8gyr +Tiu-꬇2)әFT&[A@-E&d1󠡏tj lKt"gG M>iP P]Mb|_øsƭ5v؜pܦv kS.kO =d0"f<,=aa($-l  nhD ؁t&O2u ~\`IĒ,հY̝ݸژ% ڭdD ˆU$OـWeљQYW9e\J eMi HkX` u$Ә|V$VH$ݠ2^d!e %@p&8Rp nFoPǪJV݆nF1$2AʆCJ(dE d14 ]@L(< ~ZUbX̍ym#H㔵RPS72(NFe 5a@AbK~ĐuHK\;1R^ˤ͚Ϝ 7nav $FQژ2 &h] W>ga}VqMhեUZv02B9bOeZM`c܌ՋGi2YDy9W٩!)Bx'b fjfb tFDdF)&rEJAfkofmTvfTpFmbט%nbן.DDWGB]UI(|Ovݵ ӿH9rӘhcɚW$bSʙAiM%6>Y_Ʉ5(lt#iv>Vd~b1`XL&mSԃ)j^a";2et ǫ,)n)Y*b F-ݦkخR:YEgB`_BiD5qӎxGLh%?\ Tlu 2.!ePw_C(YU ,Q9 )^ f "6YnTU bg:mjxkgBM^Y6O1f ͋IV ݌5d&Kَ+>Vmj$kV 6)Yu/"e x I_ H }Rȸn/1/ŮJmI>S_nMO=p9 #QȚHUQPKb|1!FЗQ -.b=LAhuo Ick(tٜ9Rn|bFhRd6vm@f&4C_^ah"c4٣VHbfWܪ[ cA ݠ䂯L 0XPkse=eCQL9 wӴr#WԥzIsNˉQpӝեwG-A7@!p+d6Ow|(uC)_r) >+t<5~yd_>DEݧɸIcilvcb&YWl !v,"\ 2Al:ey~,P'So܁.h9H-41/eP.vaЧ2wz1{62uxjĔ#9ox]2o_q eڵ$l2`"~U y@2,FonqDtqTres5mML.Zu%*L L+L&pr;3Sx3/ғI0C@5My= .9y3?m73VA|wOeGrCyDDeǕËps: fĖCC's+B;خ9w$ *ی֠,̓Upٻ QH)2 H] }եGŤD ZZW$:eTVuZߺ`-n1ӈbHj{`EgJ(2(m|KxLJ|Ɨȃ3Gղ2ʿ̋Ί|A|&<|+Ӄ&n<|Rk7=Ϋ;/S-CG};}s3<Ы<{ =s= )}R>6-_{;ޫy#`K$P ={ S</kBmH}~ΪS~KϳPoDf'?@DSMپ \oAz 1$PY փF†^TpeM꫸pJ*JQf4Ճ 4i&S}G&UiSOF:jUW.5o>zrӗ&2\EX!CUh_j.W;BM[ܵo.TW] m`\+h]6 jzpr6Wun[]mkԅC\1}jФ&M\ [VTP+b7Y;xa.=籫Gǯn^[?K/=o@lФŋ+Bē%t/A2L?zP/2AP&4&*y| ,#"r41h3N<{̢L˿bJ,Ŭ^۲L*K=Nfc :7KȘ !˷8f28z:t; K6#:MoOA UTG-SQMUUYmWauU4!1 en  Va1-+/ nʩ %ˬ4ܴN#Ň:7:XM0 ˆۄ؝wL snh ,(!7\EZ0" wb߆bꤳQO6Y^Y[i6fo^yUf{Y}.zh>:wFi]C;[Ø'pدXJ,Jp2t ]AHbzMBs`#Pe#)rH>}_<=w&Q[[1A΅Gܜt¹ܐ6Hul?"˪Hgb>!Fd4aoyg꩏3Q&䷷~Oҟzy{/?{>e؏sX|0 7 `@EУ`@V7lD-tT4mK"'ַ\SUDwO@垃'AA$>(1?΁Htg@PT'Tܢ~Iq=~C-ȋhԢ~ T(Bcr/|pHA4!HE.t#!IINA 0' ^JQ'fW(! AYƀN*T%d[j%/Me]RTÌ1u *d*SV%Jfa P$rMmn87Nq349љNut;NI(pt2E?*65ROA!=Oyh&J5cPE-=Id1ҧ z)HEJ PT--iJ1:ѓԢTkIEjєj3&vSKSE;ԑG=Kd5I-Eԍj)1:@QH=1(b61U sk]jWa]*ݫa&8k^1@|&9G򒩌(KM.\ H3,f)3GVr8`Ufg=יv f;9Mv󚋜7fNլfGYѕ.4L4gЖ&,e$ZjUSE4 oA,zի5Sn]k]_,8{ gbnrk(ֲFSe'>ʭgU1~Q] 0;$ ּF̻™^/XF(Moh~7m[78-ow8~K{j<~o_\_ew.OD _ bCרwG_:_~ѓNjN.h~-0)B!N9-PN75M7.pBA*-IOn||Vn olVXD,*B)8ۨ(-,l-RiNuyq?/R.sA-0pN 1NDBFG@('3=3F*B4 BdC= $ eY0+NXH3&p4I9' ?8%p _/2Bn'iS9is78 1:0jG ==1=b( &O5 $ ׄ6>Ox/QV.g,4es@%Ԓ+117{1찎Fo`7Z); @ 4A `4,(lObY {M T v$ӆ$tYc6䜕$Wn3.5"y4oe ,0 l/ha%'tLq7pxW@szt@ ׮u >Vh98|HR? qOc6aÀdo7Oe8[Oď,s[yM8Bu1ٲV1)pCD.WS@b(~%9["YgxrN{4~`hU, {p0(އ B2ĜC!MU @@+ujh,el`fv1uE@(}fD.s ƃɨv߼떟gPaΔ-kG<{},j uWÇq՟~8ہ KMi2IT#C 2핁P])@cCdY$fɅ2Y4QA>@CʰVܥv m [4`'LCY" 5.$7"}]pPG,_~ @( CGIB(b2@jq̛(&c~ R4FI)LK$O<R(ĩ&*5KCŤRjT&jFĐFj lKYu =qmUV` W5bACK*cPfb]dsG Lf؁ssC nZH.W% z-K1̽ 'ۛ"w<sw#fpں+h % )4TQ :VC̺%"۵FOcAvd{/=V݀ )XSb4aN)EM+8"qK(Ð)~aa)rF} ͘h7d-d4`Q(RA$hgH:뚾z2iBSKADɃOTicV.|;߬2'n !D߁ܴTqqhv[x`xr+oEa3H.]V%8 gcg >0#ȌERt\÷ňbiH"681hA9Ph3ez 0?Y& 4(s0=!!ʘBDtK꫌w&0젟h l$F 2C QD_sF08lf&*c1:RʣCQe|NsР&8צ7NH>I) R*9,!o(4<#I$uJSԦRr^ILH2+ e&EUQ /WhUljs`>"5K+>>N)\>t l# :_LCh AAx8[^I^p1`ANlO8gp@Be3)Fdp3NjEle=[~p;a~H %%Sޠgi\9ə f+c4Ҍ5Şԩ>0. i' :'mYҨƤwBa$g4 ,P= !ɣ2 32|jHFIqx l)62"d# 9Bɧn{Q&b%R6o*ռAJwhiV 04ʜ^d0|V*A[H0 cyYv}2W^S_!uA0kGrBWaHHbs [C`?0Ґ"m-$`pۂ4i8dwC8msuZ"lĻ:qH~$3\CDB=l[$$oCœOej%TuTy(47PWSA^T&A8y"T=!H = .a ='X5&s70IaldhhU[{jKGZ84̂΄VGD|&d -14}hѽ]LW!FbC/!C``04bD29Ȏ'|$D5ӽ;lM[pu%K;-ybyIy`\ wj@M!شzEhEʀӧrqh{]ccbmhl{}Z(ql%,6#}w^CvRd=u"_?D}z{V2dȄ|It6~;$`jᣈ7db0!@dB06JvRWmlHvTtl&m׀VlF3}wxI* &#o q$!=x!NjX)x8dX;o#/oge*x3):cFτff GGhNo,d34un{R{|&}|wM2is- B675qKe=)7^AH_ ~i73tC]!k'v c (m۷8jr7id(HwKDCf˰KȔ$h[$茵o`[&hOy[XxRy+L[EJ;_Lh;6z˕+nz爗NsZ(b9iA73=grIj'D2g==auؑh×a|v,b! ?7jiI_f~Ț[M'`CcYd: fgaggvCDB BDA本nK)-؝0;"*BkYpUY[QɞmyLg9'hy;Et)#*e+>`z z,Ot{r}uxHj>X4H3[]B AI{DžuU† }O!E%Ssi;꘥ }$`FTiCU` B7Mj= E8Ux)6&MD(ٜ=JWZUicSZٌt;㙃xn;T*FL*L#c[D; 8sy#3hyME1+q9Mh qw]Kse;gdx}f57(3z_q";:A+CtJt93&Yn;FIdyi8wUEwf dcϹxU&Oy͈7h[g fJzgfKT\<觓+ Ce1xEHq;f~I+CM p>pה=;gt,xsׄ0Wevzx&~GkC:u}@^UOh[reȫmC]FudK`h}^X2d< Fe#:vʪqNj=/چj_'y)fsXh#}dh#tlt4H#d7h!n4K.9v-9$nve"V7c.`e:FW(F!+G=dǦ@M< TɿZsl<Ȯ!o!'RFlͼ}м b+b<64̶ɼeͱ&ηМ5<BڬC#Cl,ƶ<C\ nd{M ]=o! ]z@ 0 8͜,Xr"M̅X|l?]6ѓ=,{ecӧvA2{G= vY{s,lk]Sz<4~<}\_-U -%4}lmh]{={8ϰۢpmG=ͧ ̧GŒجggˢgZ6{rʇ\ݎ- (z,eg+qjZh=Nsm,zaً!G ٸMN6͇2 x|e=W{=6JSWr(rޮp: Gr!5ri֥ŝݮq} ն'=f]6M-}ld >Uל^  ݎf߳y-Fԁ}ܵGl;m̀ &- J:+mgi>AnվNgU-]F.{>m߄Gh=ݘܛm1܂ܼގA⿭DK^L꿮I}[^.A\^sQB[ v^R-y"b_->^s(|=ߋۦNN۱ns-J .oXg^ӯW҃3&dyfq ۼMTuq'⬎g^{ݭoxG幧&и8? ~\<~aAY ƞյ}m/m(߉ٛm>"{]U'n~^ ?茟=i{~{^-^8t!ubܚ=X_>ASM !״]me}:jMn]{oNη9 :_  \O>EMCh #Էo> &p1iݘ B)UdK1eΤY&Lz)b=hEHta΍/֛8hĥИ>`C@2DTCLذhNFYՎ ;"ZUC&+U^6 +ƪ ױò֝DP3ަ !cl[Q$LSLVX-) ?*W놭AK9@бJ.{Æfz0| ?ճΞ!;e˽}Z /0:ed!P+"4ʮ4⦋(3>J&;CCI3z 1r뭂RC4^T_ eq{Fg1Hsԡ4L%dR&2'*$쳭:=b+ -Ԝ.VTmS1bl'e!&I8h)'." cHJ}$G5&-2S5ưH8.r(QE#UVR-$+"\L3Ҭ(Ok:"_ Մ5/jZ,5OE@ eb0) 5\t%L)(eEN5E޴ȭE xŠHL8` X&ssg=VO0OL)c=%+/8Ny3ٸedͶa2I#ޠYTˈ {U#h}~=iaa5gC8$3dk7C=C̬z8[sD,YKٿ/:Ac![12hWv#J^eU.W;sCsї!W rU\ekulk;\ulrt*t'FS*,)˖P<2FY^$0ϒӛ1PI}p LS"qH)~LbDŽ!Y$+-rT[S!n9US9D)x9RXqsPZ,,d`֨>4}+ʃ|F:' +` t8 Q11lxr"D:ix P,s )"4B (Fc{P$J X%uAZQuDoW{[r9eiTZQrKBf,JX4>+*Ne(8rQd <͢2M urb܈Eyr٤1|C-kZֳ//\9r79ٖ/'cKFS[ 7a<PȲG0F:N$A=gg>f΋#K "F PVb)U0Qa< C! @k]zF,ҋmTdb`Ԟ F[U!h$ w8pn(r5c'䵌q Dzʑt`ry&ϛ[TF(IA*Z}L?ꓙ>280[b끆0!>l|g]A!;[EXQ1Nk`2jt5ª:$ < O +߁7RX{Lz Ԝ޼S i4)5!C)fɷn vl+@}$O8RCݘ(aXϪbڒ k-2`|QԙẽF82BiPlj?c$ _mNP BG4Du'UR阦y}fZ pxya~8%&Bme!KFШ L92^0pKC\ZƱc(|T2?!BRQ*c@5EewlKLM;BZ+Gs!'J=8LIe4ɘ*+j"R:\ЇJW \8dpktàaˈY)9c։0{4w= ,x7o)0h}z;+]x<2*ƖdU زP`'z@h,83q-@ Lh@4,z *G[H84a ^滻ڂ;`>[qZ 2S>%}؅3/}P5O;}#$ +0}`)\*r5|{d$L 8:YQ'p $ `Hz6@QPU25*HzIz.B2hˁ}ȇ0Ɖ18I 3䦓%Њ0s!,K{Ëǎ2pZ4 |ǚ B  wJ(\Jab܉4BM`>kS.yS,aavHRBHPۇv 5}4^ CĒ,7L(z:-̓0bIDX$ļZ 3Gּ3=;A@J 勃gh;@-O3HxPPHګ=)ꪷEP>+h^ÒPX]BSpyɲ.jɊσk"Bt2BA)D8DbP91PČJ8PS;hS48+\?BS@1Ӌ|B7](}(5` P+O\Ip8'_+$=$b҇K%0`>鯒gI8q$9 Lp- lM8 (鉮qIl4e@a/FC/"KkDԱ88ERo-Ek~$E[B&]T5I:I^ aLUkg$#q Zy ZqI0c2A `"O 1,%+{T԰QDU$e0&2Y$e&J7}U&. B/<k ,͌$::*쐖+;wjZK36& s&8 v8= zP8|ɜ^Rp8PQ́7IKAOAOS8U*v%7O30څ؇ܮ &`B2l?#ۡLI`뫱CP!;5ZU< VbKD":=OF5zJTD41أCc4:;OL唱@P٪Áe(J4^ԃRіBbZZxAv%[Q )88y_I&C$Hð@6f[ru@EY-O 4[?PAEСAEẺocE_PF@UhЇO[B$1؅84."}XQB 2!)#3Vs!'5gl&KB<^h2xj,l"Ba%,J= 4vP5Jb_ Ѻ"^&}6.`B}?`ƺSaH 5 [^+2~LŠ4k<ۛa\ xM_Q.(zD1x*3 &j,j7Gc12ˡ.ۤVСY &"\QRC Y! I*M@ռP s6 nN&CdZ̀HDܘF%hÊ6z)zV3M@c;t  ?^)Ŭf dH>q$rJ!&LQ*e>'ǵ䳒QiuƉ̅JK4ss(.6z%S)m`{6QZxOC@)8Id BPX^[Bf%s|$ Ea1٪4+J4 eGå18ؚhyҊov\h7,=`I0푎?'əHD ڶصΤ4vtG^nyM ل=9F(/K4 eRasa!)F, YmQmIu4{tC)w.Ca9媌r|~Ve.¢KDѭJiY eoV9:Y"ɂ)򫛺~qh6Ҧ^sa8o7 ery,X 4v%fliDHC#sW(\uӁn!5DLF)?KfP>"t(FC'M2^?hLNZP=VJÁb nyAuVOIџYYuT&z =ZA`@<@[mʖb*'Ba Il5ˋ@hrtǁ6wyIp3-pG[>+/JVrjM[4!ΝL2o7SEUƚ' L]_8CɈ;x̘Oh&-IN=@lksSFeM gnef!*-'M@jq 8nh v“Y 0i'UTq`9[f[Hn+OwW ia/ߑ~+%[rQPGZq|NaSu"Ǘ ɟ͏ίSML\MLIuȗXO}OM1hMDy"6F͢1)+wsNDc.|!9ϑُ}ʯ|}~y )!շבwY}Ϳ}P&hdfR}B(q"Ŋ/b̨q#ǎ)S&F"}-ӧ2eˠ-[-P1g.S͖BKB 54N?>iܝNp㵓˭+X&ekʔ)Mt܇6%W54Iˆ\KS1M+3o[L6O-'rMa݄i]&^z)tm8(j"rM8B Y;RI$kOņtJՆ)7SvPB$~|L2>̃[= 0$enw&N_FZ~Ƥ~Afw|ngNAʝ\4h^}BLe񦉨LFdA(=@>u9](sցii~|xih|ŝL:dGijp"Jl*O~jS3Yv\ Vʝq,ᵬ,k1&7LFC<"0b)-C[ճg4m>G>kfѬZ[)Zs1Z|ql$sZ(oVqtМqfs ?2hFR73h<,sWMWEV[ѷ5[<|SU G)wp@}u=LgWޮ#=}X3r"&|5+8Yiv|b|.L;rlzߞӍ7"E<rIڧrh;/O ڜyb0̍+\WC#V}ē|s#uwIDT=D[IFA$ 1djaK$L|`8x@ɯ[:Ƚ >m,WBoUEҘȪ.u[Y(x@g61e#)U 5pM fш(9$ "W*挄=Y)ϊV$#G.hD!3Ї @M tazB6ެHu )50d4a Þp! D|%)3i%A}H3,nq$]jȵ\ӀH;ҧ;22HT&3IDAm3$rw,i|]whcI:2H!\ -e'8$%hXY0žA \'M>3mɤm'ǧj1K폗Ф>6+pRS&I9:tҎ,<3QnC@0 YO)TPP$|$$z$l*&4Gt4–ٌ\YN0Dh+wn&aު ɽJ5:=P( >0sIWOqyXY6K2H%J ˔"6rZjzA~S+sFc5l^݊<z^XO[Uﲦ؞`+ Q`dҦR5h2שk 1Jѭr*0IEϸG~M`I¡tOQT*~;k3[4(Q @hK.Aцٽ 705z>~"U3m#G k=(=.Zc" b/RYú!rFXzStv4l너[ثcC!O#=h<܀$j< T#׹eDky̓_fUs![O1Cd6$n;;hn[).M>H-BDh+HF琒`MPgu[=Niѱ-`viO{cv3=}a(1VLWQրcD$pHzV4D`Eӷwk0]nt}/9ݣ΁gNǽrzlHm.UCj.W3nO : !38+Ou-v&g3vo(F+EX|sc"@\9܇U4Vc`L{uȻ"-3FHe_W.]$yټ]vaU.Qݙ$(y`e=fč*Jľ]R9OYYqPQ 4S$-ĘEP!S &j5TyR _PH8 1CgeH]jLLVGUEiѽZ ˴:P 5 [`}[[깡 Ouq0SQr9 &CP"VUݏ#X4L%QKGu뉎!dPsq՘]W#`%mW;W_͔"^vtPJi9Vϙ(EtNxF/C@َ F-\zZ2=6NEq!D bu=f   W!\1"ݕIeHAT}y V@+daS fF`(1o(gFP&2P0y0ReGTe1QrQCNUf-&QTQ:eZVrVW*CyReV֥yeQ%^T_GT2šZ*%]*%aF%`e\%ZrVRDRZ&eebfP^fYey㨬G!WTJ4b%^_NhY"S6Zf%nU%XzUZhp%gbfUeUvoR^&a.4'gcey&bZFXeNXfye(Kf(ebecXf[^g}%Qet&*di(CÕi^чEDr̄vW:eV1E~P l錪IPFPǐT-R)~Ԏa.J7)Sz|A:(Џ-HЏ[ݛ܉M U ]cgP(Z5HM_!M@q◌b ibniчQ[@iޱEyJED$ɑtd*Eb)Z٠P NM i4~H2җqOND& M7F@LYzDFٌM Z׎y Z0mk5#wY NXE)v ҃9ѥqېϓyD!B,U+jb)iUUd)TbLMMlIjIR _nk &6U׏BʔG}bJ7P#!03ᬙ哩LjP]هKVVn[}&[)n8XYI!ĝs-XmInZlIA֮;5h di# bɇcdn5\_ ^K0M 6 -mEETanki*R< rQQ튝."Yič]2}X+x9#.#=ѬXȝl^ƍδ:2nƍBB>]IdmlBA ODAQ$XA9-ɖke^ԅ6bY.ueㅽ z9[upH-ݩyZEkgMB⇠E>4i]:fCRư1=ZX>sYa%uFXRS M^\\͵p(~ޕk!qMF:rC J;r]}ğ$mɚ]64 Z!Wa4P݉B’3ۏ0N_:aA ]&Mp1mҦ+-jF:=/&+D$Bx(kC@6M禛&1 3j9MdE1/s]8}VsI=Vr0/H MPIҮR qm2`&DRa^rsM٭oFhC5&O1jo'va*p241[mAҟ1b[u `Hf> w+`cc.Y Ms ԫ ߠC:A/m#CHUd=؇1q OhBRyle,( HHTOC%xYЊUѨ\D<LTaJ{sA(^̃\-j@_טֲvhàИ@M 46,'$Wa2#tk.%à .:DKWw//FGP KVKG80c(1PzרU}0QYʈ |zdڟ O@S@C0sT_w\u% $kI 2z+:lIYK7 YdiqBݟ"?k\JiU{su݌< B{ 4 #;:LPq;"tCt17RC;zj2p%m l@!z 6#ްP=vՌ+UFDu9&@0;4dx @p"`B ĀF>lA ȀgwxOc!&`oB4)02(=8C@@(ȽӋA/<} Y} DݧN-iL55 ?&"RPu.4qԑ=@uv0Y/ߧ =C뛄FJn$3ݠHXfqA$&<̀g= @C+ܧx/Á>,}'#@2tP=ܯٳN~_ R_Yrk_ ~m qZ}8Pv S46tbD)VxcF) TQ C CXO2%rjW}dD%>-ұo^ @D[I>^C틦ozٌMMfm%}Q~7,XƮN}\Yξ]?tZfIR^|ň7Z>.ʈ1;(jmzh5Z=PYf=/TЪ*[*Uj==wlMw Ϻ:ة,fUFO1bK 0QF#uYHywy82: MR[QN{mXCTlmB@̫,*,5ł)}䩩 iЧM* '}v' 4f-9+*J\sMb)i HbE UM ٬R-ƑF>!I025RmINv<|PJ} EF@,>q /.@NѬjJ}CES^bCQMs=NL)-6F+N9S\,4'+rF*\Vfw,ЎѲ9 <"9BRlRF%e!FIЈeFJcТN€K^XF3:M%aɾ/v&Y&d)$d 22Xc1dr#-iJN(V CTc0$ӂ6 0*2Ö摍dȐQs["B>Mzlǟ\*!5Un91l (ә$,D_E(TFtS!B'z2 I(Zh?zՠS\BOJSڤ H^5qzK=АKe\B裮 L`fwĜxJaS LXд8)1sSRϥG}&27y)Rձ6DFMfDPD RIG"mKr9B~Pv< A Z%;9LԺdt!5ge0 ԓ3Xq㵦˂΃`n@_UmJ<`-@OSKß"7DDT2n5Jbzn!Fh$a Wˆ p8\NT8 +OZq$5o20nPRDfܫ /Nd f8+jIB8LIY@erw\2m?VywHqGkH{ thfB^4$-ɰL_QjmT =itFɜʺZ0̜U%Q_jF.°;`ES1>@#EX%gK3E5JZf iRx/A=3njv`TI4d9Es8'S:h'ɒ9J乤 2!mgCprWIʐLϝ'(\Ab49Y&4YsB"IJ'i%V%mH-;yW[+Sd({,zLdr(\ N 6ʲ=-2 5jQ3qЎmzH<00Kxoj%(>[i&b0/ 5.' MN>zV-"I~o`0042NkDL*'.&I!KT "iJ봣Imޭ|] B欠(1d?ƆmydwĹ,>H>"pȂ>XPe}2!^$a5j+P°F9 . MkR.f9g?Nzeix4#ކ kzz! Q0H+bΔ|bj#KFmP !" t~DᲨ]bijeqzo?J耐P/܉Irj.v*PYa$1Q R.Wj9>b#!g fݘO_j W5#Мኘ6*pcs֔Kx [NF(K"+ Oi0O9Hψl>tJ -6)$ >  -TR Ѵ͉Vd4rI1j1rD*6/HHkGPpl,ezȂqi j\Dޤ4f*.~ g+oj*Un󾇖N| kzpsq$d-m, \L-bXP>C/N,*,); ,̆K-g)݈o=zi(#- C[s83qTc/bs).+¬2~蹆#R_(p=Fޚl9]Ia M CY)!MlXQZVòGgy 'YNG&SIn1fK!ȹX/_ls|2edn*0ш,?PPSPrf> RB b.=RrHz#n@ p`~atH@ qfL L'vJ%sf +G Tޘd" s)",( JN4!s\=+DUnW=t&A-6Nb.T.Gowr\*[VBp({rL 0wǷ'CN7h"0bfjدwu&W9/!Kn 8tc#!'t\%(01C G&|~t[6JjXs4&J؁p>$<YNr-b*4#H/yHȱ6kR`ѐ8.#Bp[*+ǖ a:&Y;E1pdrtF T3s. a;Ű!T0X(@8"jLD2֖al*A t]3+2%@ok2cZ#wfS7o $tFm*g֜/,~vb )V$B<8Sb#!i,(''xCC(f;sgLj"/lhpu&kɺz$J3u} - BM$K !'9Dg3$ oD! /0j=Bk"]Z<đ3C@*z1;}Us!Q1 U-W[QlUqT7{esoDB $379[;?[=CG۴SW[[K۲ ,BS Y2p` *d-bSL/MK8o{KSɥI=e*FSI$p"e=DO+[@GKѫ.*tOz0/0E'$U ·ބc~{(BgdЃ=ׄMb|/#, TЩhEVXPdeБ#Tr }\Zgiz:珉Ƞs!Ch| -Cw-ՙf*R)8d^,ym y66;c): X<46J5"gAF(*ENcEG@XHZEih[c[s2 kvlrrR:Z6Hb©@C.d*j!Jw,,k=OFK5icvB.4blHe28wt"|7x6r02'Blr'|hXSՖvD st9#\VTiA&TM*;P<1,;rxۧ+=\@HXꄻ! 4 -?oG4_SwץjYm1н⑥i#9|z\p{N"tÔdX'|D\O#KpL/. n.b'tooUK!^23Oy:-*b3ǐTݦQ{24e2oE&y!1`+Lݎ X57첛@A$RM4^_iFCk@{ª s/-B\2 -ۧl}K`4ՃVo2 ZԷbhA~$~ 0@ IqaLDÃMF;8tKVxbͩPcF-fb)ZkWbڃf&L w׶Ze֭޳wJQ=eʈ@1 ,S6P<. cEq- s˦.JkQ?]2$+V)%6doQ}Cu1| G8m&c: Pñ断2@2nt9pHcmI^й އ`СYLidGU}Itb$hS4>Qfe˴rͅhjXa UTCuU_$>qÈ œsqУt?,rt̅R"1 plPAETXVhtmXIq~ѴQ%dcRUcE~&Wm78TkV6N!$&d:}Q^ӜS(( ijNeMѸ*z 5*|҇zZ'4 Fc $˨pIZcT*P6u|>dVҶY֓ PQU$OkvWiI (>At0yvSAg`mO7Gd)ɒHuoEedÙ&K:Y`or%1+wq ]EQ{j`Js"U-#B[ު*ij<;IW|T35UW)ʓ&Zwp䵵!eb$T$ȱRł!$U?rEc2FZ=hTcŁic)"< utG.l$$ 6 AX qIDԵߵkcY Xvwec[5O=}(\TI bDOtޮ6Wr,vXl<\sFH\푌&F&Ġb.60ˌrLa'Fe?jFt kr%fB 3Q_h\r&r)R%a."i(IIӽH "+"ҋo3_%ǹ("]E`4"O##e-C'#tF*x>s!<18 M%YΌY5UiD][ AeYÆh`] P8Vd?LbAedJRSXT#g{B6oZI[/}bnFySL`bh ٕ ٞL/zI :&1-vF^ssb./v=kwbgQb?x}4Q3|j4Q cUi̶#+u]LhGѝyƓھQ>\;`kCLI^n ]Xk,I,[~I<+IHO>жbG AzWBFPΖۚtJ|Jsn'\jA5;Toݿ{W 7a)z!hCMoCZ4Sx쵷d2GlU.Xrz=PY㎐$1G+z87g55rA29OY(ۤ%0]kKkJ ͥm(3'@':_W_I4jҰeHY?*$WPCl(3?v){r.>㓉C=b2MD45薑n!#W6fE?cypcsP+ >6 PY3 +Ӓ;r5-Ct< m A%,p GͶ>)WzVM~tE<%J|k9lDz=`iʖQÿ118a<9.Qs4|rKwu.uAt@Rmx#t3™7  3$ooi (i|$H\Ìh1,ټ̻́Qd(FXC3 a \Ⱥ>zs=f'2&sFYS!"y::3p)~lvB>$A =1YA- Q  ~1J!§ 8'*aj|Ujh(1Mo%gCq0 ѰйB7>z 9' osЍB;_mjL ]0%Ҷ__ r֦#݆aYrCW*b¨DZLx%#f NqҀPE6٬CVٯJ76:ڣ͓=٧cS٤-ڧکNmRڠw-۬]ۅmiFrZ_! h$0`bSxwHc.]^Sȏz,9bY r-ɡʨƧ]_#rO$SA6W P[wCVBVT1C Zӵ8pF KHA@Q dW(%{WKOdQ]"RJz x@92!6$섩j|}%[P.)a% 74,=v+t5iTfigxMTڈcķ7V]F9*g+}?3Os}\`=sHohX(ge32"IUEpNt]/Ja%;I@IibcV QԨ lY*rPP+ H;5IЀ$+\PUjT r N@p/wPkLi.Sd^2h|!x?!(/w}H.J*xn{yVҤ)=W1s1`Uqi.]A#/Mb % h cI]\T=jPUE8@ f-< 2Ym'[rV{\s ?D'R\][OE1\:?7q,eUC2 pY؁=F[8IJAV%l9+袉?^9YԘ '51[W;TMGfm[sK6<.IT)넼ն:d¦mwO- Y#C%?l+|[f-$ZCp5Frʩ lϾbn2Т5 Nd4$1bo51 Kje L*͖': %cm=k# -e[1OD#+k>LҲd0L$O@P̬K9ܘz;+ Q6vԤ*1pH#I+LAJC풱Tܣ:*:s%2Oa؇VᔭhaiK u;(Rlj0YNdp0}06BJ-*zηj|G0xD>.8,-p;,-P,CT{Զ- EI6P5Պ' 5@a\e~&&I$9`ɦp@u P-* %!yAVi&Qk kq**Nuv-pS7TFc1f}L840#JCڑ!āwpd)SܳmPJʻ(`tjyHv*w+^bC]@O[c44U߄ϲ吘H8CvWtxvBCf?CM$6kK2%DcRfuIlXeΌFvs}Neje!bTx%_?2b 4[ ף72&pzBK|%aq VA~eG#*\܌io161cz4Dk\R3(e.s`  elJ]i$@$V@` H>,ci,0E15'a]!0 ]pJw (JP3=4U%V$[)!ivwI-[(ӧstChbhQZ@OfĦB1rՂ.iw2e*t!P^4z3YBd]-r<pbѴlqjBHMĵ} h &:y (Vd zAV]0Kn+J.V()2*z>p X(cIzz*Z( b'&LWa15_T1ER22625Q Ի݆lZQv2tE'"gLB: e装ahYŚ62jfӺ`KJ̟&7Z;&^4 M8d2`Ol35KzH^byޤaщz;4ѡd{I3Dp¾)>ƨ210&[ $8S}s4(ꋫL̎ޛAnrpت:5!) XRcK 2':zF+[,zB;+긣>,BMzpB2H0H̤W2H7˶tQ5}ˀyi0ص;N /k2\Ӊ.zx" uRs#O`0ä98{5\}- zXتIz,8PB 0/cDhXQʥZqYrTCY)ЩՀ!!PBDӘɴK@̐r¯^ݿ؋r%y)7bB!wb1هu>6́ u .Y}8  %—KcqvvGŠ*u44ш%׊+3 %#R[ .y*r0eЦ ͻ c3j t4ʊQa M DPKa#y؉D jbӶM&:֍ [!귉R $.'luWJb0)4X Ve7ڪ AXE^4`QY&ȷ&@#*yG76"*ˇ3Q.0le"d6/3KeK4U2alIBĝ2ǘr?&i张I+Ů X4U zݨ`M}H`+7;ukْ]cW1#L?.< XJ?cɽP( >vl-#PH@͠;]౗EpN&ք\#[W%OHtz`񲸵'F30?nۖDk5\¨B>ld.֪ݼYaCrƭǻ*z>[c\ N)'Sc+-u/$ Eݙ0| YJ =ʓhHZј,`)O 8 CT#,K ^%v:NܫS\ד1l'rBLZپ*,R*tX5=}P(8/ x$؅ʥ`;0QإKHX 1#MJQ[kPxS &fAWܕNY/uj@ݥP1CKܒ@(iG5jNkV,  g\O;ׯ<2̎y)Whց ;8Zisiw466oƘ (\ÎҵRRf)*fb &(= 0s%^EFODP)Z}>hh Gq oپ""Dջ^4}!F`GX#A6$HK %\Yq&GA(H") 4!J}, Ï+nȍ,<0È5'JL+uٗ[WmЊdKcXٍ4jyR}ɶ`qUZqB'#hLIwRAs7h4 m,ǂVJF>Ϡ2ÉkCd8 D2)hFhiöLƭ2e/p}#F@(4[zaPJ4esrER5`i;^ߙZ)d)ep;V"zXae!RU~3 d2 +2,#F&0H{$4/>VR05&z~aViU^uQOD%$_PwQv6EQcO&PmDz^QP4%B^p`zLIU[Y0b$b(#C&j,l!j2 ]2TKǁ) i^EXĕZ,DFko}\R\ڎv QJЫ$?A$F`z(d-9SIͨZߒާ&f;0oHX5ut1Gtԛ[UJ;RSZIy1!Rrz2L&A>BC!Kϑ,cFDuQUed {WR&\$Vl&j2MP\lWhؘeeq]HjiX NF m3>XaJ=Զ3F$A0Y)LQ̓"e%&Փsqc q&FNf{E[I_>'%'>cM,Fs<QtvI*%OcSEtHC¬S1w"eBr` ׯE? &!Nr g{%РA MLB&44)s[N@N+C=!YFADRz\26 X4t쵱|N0T-,fPpYZ%bXGFA1G؂CvAdH4̕ϬWnǎSr Ё>Tܰcu(wy%p],}> }T!iG 6YFϊfcY-X..@ >ǼL(h\"ˉ0ѨX7_^l=jU&5jg IHD_Xtr7 sT N($p"m%s]Z銶 $-i@Y`>u3ITprK7Ɉ hGPᤓ9lh/,qۊ2|A͏`2Ƃ–P^j薾4ӹ)1QGа7d. wRH^BQ~4"H.+t)"

.6`)$}pI5mOeB7޲^-Y.@4zF U>0_J5[4a]q'1^gM9&E ȼs몯cyʠ|-I]UkRbLɇ%:kYV/:2dB}_H?;T8I`8Z(! eVk6¥&:(ƦHK*0)x_Db[< ;IrGGhB[@NJW;ܾ<\EO˯ҨO'IT:Cƹha\2b9EBC=.KB}PXY3 ]4TIj}xg3NLf %2-eT+bXK!=Robd>t5Iǖʘz5(d}Ke0(JPO\v4)˫.@ZPTMaA:S(Э3j CA41PcDQ2޷my͉KڏW."NYG}BaT٘QAQH&-Z) *&?&EFo &ea ŜɈr7HqIʙg1䵭I. Ck! j [; YwpFy ͞ F]=l\!"Q\qI-̄@q@0dBP XLļH4"K̒ I^i&Ij`W"_ 8GV ]EUوP%*cܱF4KXbHITu(DB46"Ȁ)4+ΩmSlY2tAlؙAr`I O֕p><$>nŚ5Nr]]"Gh$vx ݐ!XѳAߟ$d؋B𢗨$DCܺ%yp޶^lKnݐщX\Q&Q4 u ]DLLu#Hi "ќU oM`N=A/.T ]͞JWID9Z \c܅~]XLDBDPXD^k S0k YX96L d%%! $(o|[ZoB (24c*&=',"b:aTXDavDQDI!q*UGsLZM1K O"LSqh2 IIXYR}G N ѨR imP==aYlW,נ]H[Hj @E񱥈(PM\19`66gQ[EVq@)XtNb]=T#B-А^eh"UƆAҶ6z(P Rq^܋щcct^}ИElF MFdET ~-* sRm`(C,$_lXu[,5b|6YeUH`TDŮ8JX}mؚ gZL԰ IDV+[ 1ET[ YhTQ%ьj2άRXT}z 𪙧(ި% 㤗C:C ȜlQ"s)sĨD[9qrly\hj8O4ʒl#prTڰLhr7TaX@\U 8hrȐ&YSvFʪH#6I\Wy(ZfB)Չ!DXiMm!taA4W>+ղ!]* #=hjH|b&Z]`N}&dWb>~Z1:cs LgTުJ_BryIi]IW!^JV>Ljd,F̛gVrFZ F=-`''"bJxP!R5&i!mrjh*aɐi-UjI 9+2hB(, +K ՘\BQ#3j*ŋ@I58;y4f%u~JWO U )dN&M&riL܂g`O,&SRQ GSQ=ɦ(^0(rwټPpWd.(.BTgez.:?A],1_f&Q M0|f;( )U1^U*RGhUc0UdiI 한 yCQI X#1 !Jdg6:sp\#bҪe`ݵF. JJ| ; (/gXeEh]" x @X2DutgFnJxNIn* %S`)>E |ؗ5"Buuzɜ 9щGL)o9#a+C5f$\_Ze4Z`*.bGQ\4%VQp2kj TX-f%apY~ bhr78>CGiBb,FcWӹpDhhF@B 2R \E.(9sS}vʃCE"h&xNMsEKLDY7W3PpU詙=!r94"XK=.Z:x+`/Jw31 1>*8Pv3˲w\=3Kxz0.ʽ|XEbgydt;WqZ-Aeζ1@yAkLYdܳbUZ CXė7ة#`B N @S9cl@EEV ȀO @ Z꜏>hAe$WbCFAMQ(B-׳]\hȼW-zҰ<,&ɴ"jQ.L$Zi׿!@DW/}-P!AQ_C'ҋ>hӨ>e"TRL$J}8Lrf A ќ tӢ?*q"ъ0(QI&TĤ*zl *8wǰvמ)XtkQNfrDWۓbB5kȅI4\UhN6>Y41hݘ3>͓-R}=["mr)zrQ}Kcj.y]NumK=y}sNV޼]b`!Ng tM((FZ1\sm#4 'røB ӈ;i @K6("(뫱Z\q* +8豅#+&lLG*'N21*J#wD+&#H-%:ˡae2P!Mj(.C*{--L0\91{KETKK#csL1}`)H.ª!Ok1HUs%0KˢF-ӼJJ8/$] K4H#4҈f4U3hcNh"}Pѧ<0|؄[sqzW6AJ+L`.Qμ]lw+N[BO}0c? # _-֍,ReQ 0 5 rm4BdCn>$cD&e&]Ye]$:LJB!6 }f EaΌ6#s 5t ;0%v0@q^\v0]<2 d5 ]4>'PDO0ZQe=h1$ѐ`(@MVzҗe D{BS* K5QS]E)GӌrOA E1T6N1UNT:=E5ҡSOSՒvNSIJTPLLL{VS_ 4$4D4@+E)R'J0EPў5?Q-kԚDV)u,H;K!)_OZ驞mf=UME\+Ur6iSUһZLEmV{ۉzVm_R-*M f/`"D;1 ٠+q>່D?FaS MŽ'QOq$}(":X(! C‹2 b*C.tm$zE#8L,4OƬx)(%->[&MoQuƘ)ɐ6lEK0%i.ٱfAM$C2H8k(.uȡdSаS21CqZNcq=IT*Dz0u+JG¸N (dn|@;6HqX󋄥j 0\lNN he^J !$ LB i b!4tFۅ`.h0qǹ 4HШn1PcA% 4Op'Yؾ)`[?}DұIJq~!f2V 1 h^c乁~H Q,SАFnWٰ>.xA,Ll$8ॄ B 숹c0ùl =(;/- Ή²Cg"&0!anhЈ%\^v.zKtcX}Eq"{=2FIv3Rˑ^$%xe:&7i$)&vqp+$Է̣NwZ+ː2 jo54kƳX%B8#92 enӓ2=o6UbF^yD:Z9 pj O4(\K AGixB_ҮR"HbeE2'Y~EBe:jLPTTVmF3袒*+,.|fP%,Opb ʼnxvgV&O2hl䆢" fΔZg^GD LW&o1$$o+>#nDi$ OǴl݆e(%ܲMri&".0BW̼hDH:H $ZGWVe^f\CPP8QBW`GMPG(PJJ$G1 mNm0k|mQ:Om&`(h^M`0kPLLHfVDQS$XtĄdkh^pV-B$\Q,I6QXqs|U@oq DN2*|Fdf.f8-~p&yrI-,i(hIG1JJKwxыzF n&s "MB0FN^B&~jR(ԀJʌ $ψ/.{WL-X@Iv-E'yD2ghCol/RFPo#' yQYP7&+:OT MpZ (zu(g32jOFCm'iszBDb,,sh?‘XbL " ̃snj܆&Kn14:anHcmE#r`psfV24hqFknGgnŌbQeK-!pv~`Sy0X/3EjG(o-KH-zIr@i&V&o@,u(-8Ӱӎnd&0& &AT8r2-"M-:S[FK䔊Eib?/G1O$rzv,DNG#,NJ-~%GL⒐6?h"O{>d!SUxfW.EKthvt[?1,*:uqLa2.#7Us_mzVsMB4aO>W[PS`wHr*BJsڐ:~ ooI";0pA fohX]eD3 ?:]@a N|\<#a]L>^ (ξ>a jH;rbRXWBzoXf9\jRSF;%/1*pr֮9I-@Q/$EV=\PpRg:-A՞PG2@#DqeMZxNNhrnk2pacۏ8ׯ{׊ȰcS[+&3M7 縦 RLM5*C "Ÿ&"KV;j6#9&9HNBc`@Bhc2a$=9j9Ǵ8pheoD{(?tVTN :|Lw=MQEayp7ltlJqOٕZOϮ8ww&3-TɗgEjOlvTFDdlxf^C+.|qV _7%=#ǡBL9/fmxU7X6=oEQiU&Wa2Z]i%Ԫ9(a@f!JR'dLVڡ41`@q Lt١@X\:AACͬR`>! |b5!@ $9{u ƕAf#TayDE1i_bޛϖC phsfcw peWB/Xg`;|%#ҕp^"''0אG-]##0"ڒF]?qp{sȗn[fqXq- =υ.^lta ܖalu[Q"ekB7("F2Nm߾d[BECp PUܷ^zDhޢ1fe0dBpG1z<ؑ#O7>ңR&)QeS\HU2Q}KC8CZ[d!P^:*=j\u%PcԔMYqکMo[ SC26mG>;ʘ5YChRvޣF_T {tv騾 vJo,Vb4 ˄&>P@-[4W[N]rCoެtwPDsfU"E3OZjMf PgqJ^acj)]hhԈ!UXNم\Ssy&܉4ni RrA5 1(#A݋!a@a餏( KY$n`Um(Z4Dt-<9fp00[զFӒriޑx͈2PBbF!gL |r5ac c ǙjGq l0շppDL2fcBDtTEYT>Yjnҧo$u0&/-mkU2d #쳉2h-#qaq\XaB%⵮s#XwdB34P EbF4i(ؒoUC\>d[hߎp$^ !9&+!e 7Zm.,GbWnC4xWF4lXB8$4BZRbh">4Pr`i !CM8^(s! 4 QŇ_ 2$<(6ǖ/}HH!5}ωqx 2`fr҇錤TNHG5a*5Rz#]s .]ajaLն$*ޙ3>1PZ~SĨ!Ȟ@ $CL&,HN$W0#z&e5|C6B>fj$T=+IG+&'e4N0 X8{KJߒMe1zR5;B׼ %m{8% k6…&@C: 6%:?Eq~}A5r'V%'7~(.pQ[& UAb PT!!QP 1fFa2 7ˢ\`=x3j]W2YBeRE0yJ bGW4wc8-D#9,)9P>*ʼnV3RPW:CbPGy|asA(|6-DPCY> v=5sSr4XJoH"cSbG_r.{#HnXxn0\_v&kѝb27/=/8]G4%$JrD/8N q_R@p u/[`d>w`p( a!!, \`1>D$F$0p(tr#\eÝchYUʫT!ʚ{w5Gp䐰HܙTLA-᷸c$}YBPU1EI8WM@p qa\ @`&16}g}CPQ055& ^Os]WN) ![1=#ez۳ܪIn ]skpUs?M a"7Gբ;ڪ>#Ɗ^q]Zj깼@Ռy8t* 鷰=BϹ*ĉ3]$&UGBF\ LH~zIâ$Λ="KՂ9/2N \n^PZ%0 @ >`甮 F!2HF~0 'R DgP_|,Z)tn4 bjcayς,hpqB2!m#~]1Հ}75r^nηq]x/5w;uO~s+yn4*BB/[WшRBhn6QֈVҍQ5>z)ŽKy@ ;q2*BB*C+k^$mD?u=,5۵=ہ>ZA^g=,[oasspR;n m#pb(u uw!6!@RӒW(2 E}wOMi-t䒒jZ S sb+7Ɩ(ێw)S.˸"*@wɍ\[=NV݌kJNE/![HG~ 5CТ$@;0fU*a.q$ºYZF/ھe 0>e P_h6P}"V\bBSxqbaL#vXs#̕;1aI+Q"eؓ%HyFċ17D M>CcJM)O5(gƕ'#Z_h ڢeԾa[bUxːGkbJ0a N2.eF0=1,(Sh, J#1fDx߮ӎ CkPĘ$ dL+F Fkg%}C|,^Yk0BLMMIh:}؁ุ3e`z-[tVEx1@vKW 36B*}# C!&e@YFe8H~xP85'=e%7&V2'd#&kfbg.fc%yPNޙe^VS:cmEhn9␭NybN垏Zh!~de5;MN#}Bh U bbW69qQ&YaXɉ83caޘ7a-쐇9m֙þ:;Ag6-OcZə7o;줭f#6YuM7]ǹxq .rMŠ; 5To7x%M įP[8Q\%}Ĩ>L"Z*r-L #cA4$hL&d>A7#HSq#x~ogN=ߝeKFvڔkX 2I6ԲW}*xy ^q'i;MerF|'㝉sd*IlPϒ-PV}8"BI66V,es1UE18Vjɚz%TfY9%Yܥ:TՖ=l/E |T9R.bERVMfn!4 77Ho($C¹ I睒Z.|D*UV|N9Wf77MԑI(KS=mWG^8OLoL\/!$X*8mJ;Qc%n J`LKT"2ap1.վ:72ø -K yJn v֢ phP#8T \)iя~v͔>9[C_ц*3%y8E.icצ粣aLw4ۘ0f]<:d^@ގtf&q*@@yqC%':3 X>7ih:X4(ˎI)Aکԁ軾rߩ @Hu1s4-$$=?& U%"I63 zms"0= Iԫ1,Tщ(B3N{)TR:72JSC =1ARۄOۤC8:+i L' "m$j &|#SAj ""cRsP$!Iphx옉P5?=㏤5.x;<1C4 6 ?'yw;+*㫙8= y8je6@!1 OA+ܲ25Pؼ%\L7ZNCk:)>J1<:+&[86ъ QsYM$bL8D|-b»'dHiD/2C*:|1E 5D!I?5i͎77O<6kL&r/dʪ2*;3 6Wq.8)M3!FQl#<DH‹239U@SN,1:' 6I @B7LGT9h*IzT R )\"PFD9]Bi[@>c8BgZbSz +?X\̳)*T5V%˻0:C,3,. ;]C&%QL!)7JЋ .C'8ӵT$ME#5K*[>2)zEяb+5IjTLxhV:DRa-k $[U8FL:! Tć592Bj>dʎbt Լ ڀ}|I }I Iԟ yqɍc 8x}.}'ȇ%gHYgT/J2]`S`Ex!4<(WVr<-}*[$7alJ8V=E|4Hs*'c@&C[ `̌Y а[J0s,^e(%I< %XuT1TKƔSj2AܽmREY_ ՉG+ eނך,\{j947 IA2YK/8C!KӭP_h_ܨ_i= p lH hdj  ThXHX/Аh9}}P&.x@rs963(耩` H k'ؐĀ5(2aExpbzH kp Hz.5o`pB"g {羄r[Z=%UM߲y1bRCO5% hW":UӯJL(So= >|ZlJ,Ч:,2M\l2L2oPه4Zei:0Te9Od٠z&Dž@cg,Bz>^ l'G+깴ipUe2$\lLNkJ\2UtڷjPNSw_C`I9_=VOu!DUWPvizY`h25^O7Z7)`7A.q>1g\ ;:O$p0g<.qwTBa{ЏSSM^ #;1pU qe`GA6ҕI "YcblXZSYXqJ= WOtEhXM.27"M[ȉ<<"p[xAqIe#ַGGG(iYyj]aڊl>-8WFdG_yUr5V amMo&H>& J!t^W^GMy)@)q,q^\q9-2K*'A>YCc+_URAo)uY[lrZ~@TWp1bʠZ;!qՓ[QE^5I>`bL2i,.F_PApr4?PNT{M+"CB33P$8-`=AFl:H[J%uHt8G01C0Z*xZH墍?1 uTLxҦq% #F(@ tRN$ZgYKd%Gvo@XT"-TASh:-Y T"o-(e.F9إB%F+ RZ $[\IPW]&r0CI-9Jkeb>2JrFmCD}R_B~t, i)-AҸC^zAPË EK-ncHH0F[({BPU*jSqNi֔H@t}a](=2,yQz'eEcxǑEc P!+!hsJ2CzO (L+b0J'[C˲Ά5Np.dBʘ[J7DMD#)¦< ]Uzԣ[K\w쎼CGRgQػBA*1+54Yh ̮_x(>3XL}c`I9/7#~>Qe/]8="k1u$V&3gRzDu5i?ml?GV0S!C 'k.Y** 2ʲV K[ a]R*ҕd4}A3HDC~Џb{8( Ecrj}FV~qRGщOOGZeBR6ydC#S,Tņ0:MX!Iu5L蕟K 2bVe4&Aվy_R L)n+8J8-YwUpgվ d $UpM@E4FCR=%{$^1Z drnh0yrq Ttgna œGzW\-QQPܿ(H(%2KٟvInx M%& ۲^]]Yt 1Uՠm+^a(R]"쥄M:V5PƾL](͠(ElFձȭcU u<#q=B9aBC1TӀlƭG>!=aSG1Eӕd| Pdp\ldu׃p57^RQ吀$܁$ɽ<W#ߌDrMH{=2#1{FD|1aaH_$4)aqa_[ֈI&E|PIEH YR^b Sם[bN(>Rp*Kd0B&dg(\%^BdE♝W6hv uq}"1Zdja=OX=r` #fbҹ^)gmBvVQ.WX%$nVC i$ !ܕ9&qQj )[ )׺E =f $1n)C2yT]ԐH9^Yťv^Vd &e8)mhBg(gmd(d$2(r@)*i1iN)"(r)gi(h)Bi)URњjŸ^$ghEQ"cJyZYAeմ M{"gnM6vլ(MJ0h=")1 igÚr܆"їrX*)ri)^2̪*.i)>F?Y`: Ue =#t9zFtaq^%{=>>8K߬p&mBFUo*dC&cZ[ҥQZPdJÜRmiꜾi,웚k&+ڬ)i*ñJij(\&TWf`*\%J( MniS IfՊ&hF^v\h-H"I'í"Ѣji12)>iެ-l&ki*-&.iN1pȇbp)C b6Jlm@E; aEIx$C<2N B0@SJtw9M( eN YN+6 Ϳ,Jڈ%^lP6BfY.,nfWucP%&/IYrP]҄~@|_ܢ[9Foы aH9-$!"2tU=~Ж CV3i3%C\[`dYp*|RF">cL[=Reovׅb"zߊ&)0V'EU$tOzE8lA>v;7Ax"u|4e/r=\B/pV.IG -ڧ5p;>> Ȥ$01Hhh@Ejd$CM0)(b r&#:/FDjm&1Oϝ:X0_bL/>a,9WM^鵙 1$&L՚Ҥ_jCu\5/ƎY"9ѯ&v$1][JP#Jag9H^3Z d a3gQ4Ч-L.r(3GXcՋ ]! ѐMށdcX2* F'a#׵dedB&@m4ĉ[/"u 7t^y*,C@ê@()q,*c!i]08Ksi\rKI%vݰWA#Ì B&M@C-Lh_q(NxA %O"D~O"tAxBQ I IyօP+Gi@E ,Qv,~@"],זQ7AoY3Dh3%y*S*e'm39JvIXE%$d Cesuyn3,q]EU5~wD/VgJQ? >3wKgKfgmzNP:[۽7Re 2AܒL:qQA$C#2˨ɩG @ P0T℀5a)2b=BF\4ytFxoh A%RRˎs-e ϝt" 98ctDR2F/~ E\5,EvvR&{% c= ̑6FQ|oᴂ4:B[aRja;s&MG^<)}V%e(l-e9rY!qǽֺ@]K[:2|Mb\E1DB#<I@u,5μS]0SŔxG~2eB(NyDs`JĚv*=܉SGm Nvl\ nVt7d8kԨ&j1Δ""V)$eaҨYQ8<+GyBB}[BcͰEY24<.*TJj={7SDS♖7Fs85*=eH},b4"}E|ïH*,lRI!,.$Rõ"*K詒"l4 xIJ#evcPB1$j 2e.Rj1bȦRrGF8NQOe @ƆX0 =JȢqbRh`LCJm6'*ʣ$J҄ᨬP@q`ova:\hJ(Zd-vrnBS,!OGߜjIU&LԀ4NuBQ%jH&fbGdb0 aD^)vsg*jV#,G.yh.4zL` ,:F!$CKbpZذy %#΃Cy!=NKafJZFf_:eE6Y*F3DO1g>ɤypXҧ n­]"VFFEv)$xfuM*JCuBT v裕+znR&jb.d4bgPB96x' тwh:]RCDfH^`W}L`jS48nI4QjN7 $2t3ٔc4.ie(O5;::ћdj]2#)Pň<s(LdryNJfL:hԢ L[#m)3xG*?tFHZDW!ҝzvʻjt+mL / ))c9( %HNY J=J" o8+MkXP4X9e$^ p4+X̫3SVC RڔfdHi#E Qh'g[bCcpIO>C-0ˆP0#PNW0=sd{!B2;*u;<`;#yUAhMEC_acl,0}d&V@ )+%Z.,XgB=DGRLՑ(~V{Dd^P&JDVq/+xdis{(Hҩlnq=щG"vMR< DI,ο-1|O֕ASX,]˕ِl;r^5<o5 " *2ON)w :e 2Mqti((6"Q4h&ШB  Vnг{jG[q,KRwaə!g%y83MD= z_ 凊+%KQppep4ǔY8w  EIj73 QVzx(UzU5Dqy L&聃]+4W[;r\ )qIYbf[!ŒGb6%"Ni"4c%-iDC+d%7Td":m)qc0H"Lia+0Lh)v!;$ \︊$<)/PO2T)X>!=zb cfb`$meP$"~<"%80xKI0hhb6H@ cՎF!3{a{{3&AAw: 0>Мkg?,wdå,]A#:+f?Z\:fϦeEߖ(qG"A s=DfVta !"vrDʰhlC`BkIIj fzl83.hfe@e/0dy4K|"*J.nf~դqƆ/H-y=DtK "O@[-~B p#"eK0X.[Pp\#ʘk5AV#pjhIrCh" I&7@J2".Y"L YH[\JP6I~|mI%q2AD{4:p N)ʼn \YB#iJ쩨#!s`Q:j h !7J\j#gX恽".Gb$UĢr 硺lcJ|7sRBl1,.hZj֪ʛBBvDV2Ca{E~b$B%OR"gxleSNbpf-ܚ)܈'|M-ȏi)fLr;@>TMɒB{#Q6i..I#aa陔z:Hbkl,%A=`d ``ban#,$n=:2(`6")$,6hD#=LJŮ-"&a^B'R8Vw(,qJ֊-O'G .TIĔ԰!p!nة  :glҌB_!#'i[bC 24j./GpGFDNi !lnGsIhPiD&%hL8,tp"E7bNo /43C;UőMO3a## JCf@Ob]g57>裟MCu=kwJV$G֍g XPC15=Q8*r":PeFiD. sYEI4+yNL+TsR;xWkLB-4Tk5_MMV"qcJ7VVs)M2c!" ǤfO+p`*űA ]B*šBrF_}'#5 YF;C=? [1싲IلytEg¬_%m8jSH|&  bB,eg%Ȣ3W18>UUpn+\ӂB %/@OrDZ3?وHC#s06@ b_,!H"VSjlO7*1e60VE]4oѦ0dus\2'Z$Wm"2đvy=6S{ϛTY`E4fyzGx!il$ ٰ!&GV8H2+J|Rۺq;qu~'w0(0^%fdI"Xy.f[wі! #|Q1]r"v!JVqpeZ%2K+*OA 4bs&%sXV/TfH]"!Jb$##-# 9m({!&f\B "%` nb?#5wQSe恐»B4/r``@w @5H@,)/ BCtEBrѤlG(.9HVǭ$wLU"P۴\e"PcZBCC\ c㙿j*5! w>*W@ T?!Nk6=EJ%$AfKHhmL8|YS48 /1iK@)V;PS9IWdQ'qEUD.B Ƴ)+,?>#TQ̔K VvB.0Gj_կ " Hb q"6v'nwcp"?wcl `$G-M!jZ?w`/j‚f 7\@DwyX|kК)7bmYfB~m6LJqM`67(zo)#? )‰^P 뷱Ͱ|l >ʛU,i$p邏;7E2[V4Η՘42 7,W6եMIxSqyfy1rs' ,ncNd?Ix+= &h#bAV;dY '@N&H&;j:X9 D2?S̲0d};Gz'RnQi)k*`d0 [Vd ȐɻYx@aEʗUՑ>j8<֥ʏʧ{Ιyɗ!K\5 @ >g>cFCu]SF=˽K'"tQtZpSPʏ7+\nͼꤝ]|΁]ڣPꃽ艁˵ץ׍ǾaX*q%g"&4 GOť=Lh~/2ExvK9>A rNul'Lb.o`Qr‹X jE)4y-` Uo}x=Le.ܷ!Ă#>pǎ$vqcGՋ&Lz'SI}mB3IQ Acby"GV)h ift澘3k* =[UZօ׮Zř:Fe#)4)gQQf(Rt~,ԒMYY65fBC3٪.]T֌u$BGKzPF5-u)VyF)Bse9\ْ*=egdJ, TWE<2D F ]2\=# NѳH $&rGGd 4(JTvD[WDf7ZlV^.4gNЪW=J0 3 1$ 1,#&3ڣ}Sm(lzZjU pTUL-xvz!S턦W}Y yZۡm.xMorf'Iq&Gvp0Eৌ>bF4i@7RÛVLN" Md"hL8W]O0.q&dJ.cl2OÎNZz$IlO\  _-#c Y&Fמ=&w=kߢgOY+v5Ui=xL.ڢ&އ $ROI~'uq;A꒥cڪDY`d xc}Q P7.f$6Ui4q}e[}_~︙%9yAEi~(xEۮSQr%XIeӨi"QnQf- }'4W!CG @ z#5ZL}lY䨢E p|T1ʑE8DCųBWc;>a.HEn srĩ ^H9jMчl}&S1%=` #i&}@bGjY<}VPɱj8( X,jTN/?r-`R,o[>QM'CLNEjɓDȰVK:&h&Y ĶlK-̴6SLTZĎLg[h:@A+JI-ylaC"JUie VndZ%Xn3`rL|\MƉl8fڸb=_d8b_ROWL"=_)Ht4(ٸ>)im_$̲1b@΢$}lw*n.HH׾bb>/1|c:1ĎV&`r@Vfa-$b{} 6F916D+{,E<J[eph‘`,lWfxްԢ}q6Y0җvx4)W$#0W8||]F!6UЬMS e0Z .N@b@'MA%ruy@*/TJpFe"ZG&XdҤ4/&' ë}KeGP3."S"GbSbh sT8;v_*A"J%ThlmQS2,h<:l~y`ZlmV3@Fhȁ,DC}aKGػd/TA 25hVb!+}eh҇"(Nڂ$e7W:m-#hP>tY%&B4S<8bY>@E5 0I'LƝ] ҡEzs5\!BJ* Dn[~k!R;C!549uvaZN,o$v/-ST6s@KUecުJ]L \bܐD +eJnJ尟`hSx_Eh >E`鲐D`jvAwX"+0C=6`H(i?]ƕ7Ԧm@fUrd;BWP<kAmxuO%?;NJȸ HMb]T\秫l!eK1CC! P3Yp%:PP"P"" $b3e3R RB90"1d&  8$hQ qTB >cD#KPKjqd`%wa""P!I18#-#h F57 6>V Tvfulz"i@| Jb KxF76p?2DCȐRFrxc  8St(#@6"#8bCh!8 bAs"X#gZCA#젍1&!{FV:D0-:r[Rv)pwe-uZ en&m_\TqF(Y3*AՑ^a&~t9m?] zXp1Q#ÀD0-6wVp ja1RN#hS\3c#(%ƁuMbThj8p(u#Gv&`p&O!Rs 11"h4_7a23p29 ?c9#e.\8D]M/Fy0#дRϳ?'dOeh 3 aYaKdUfi# +6MZd* #4B(h& YHG&5WUPY{6':?3BE`g2qS1F1V` F2alzHC`%bL#GXט[Qfy^VDXut pwmM~~s\nv4?ВNpo$!1s1:_&sMJ6~f4CFτ P t&1W"v\6%t9h Q5OV"5 V L惃Nj' X À"t# 06/ H"D+eW4[c!"<$r&Kj*ڇr$>:tNJĐ t+_vB(1,?$ɠ;ڣu g3%1Ј7B, W @Pgdx Q# Hj671ScX°1Z!#E:F#2H>DPN 2)[1B/QD'ʹ85[cC pm8le'ْO|< G] U=ΗlLW^q,Hc07zG.3 62i9@"3@F11igs,iaD[!-%6G# 6qwp=SWQ56o, *1VK#D"`YRFl Pޚ%1<ߴtToF)ucWQ 8XEeT< A tKUcVW#72 %r&,d4d6N""_M cE $H4d(X{&Ád1S'uS8eg"4O7Dq5ƁyFSb /1zwrjBiP;~A|lA ئ tnmuա)Il? #\_S)H>^#(ǁ=[unja41v\#/f("!AB p D ( f"rDhqrh Xc>Ka @wWyP=s_pj_1dpґ%Ո$ݲ h"B]0tAH@mTDce0UI?%{.(\'Aw+ y+%!% >D@EpcVS Ц3RcLSJ7WDZښ *Aǃ_;$c-Z3A2:1R h Pac@Nm cX4bS'\}\;Y?8 ٦N[.bv&Ar Xmb 5|->kjES;T!9G퐀Qp5+ip% NRRB4ASE2y`~11t9yˬIg6i)4@8po*++\KAE+T"hH X{0 5Ν3bP"#Ld 3r#A>slQ6zDy"|&b c&rL!8ڂcu8 +!,7NjV134y6$-ִM uJ m |LYkENkJ~%e@ SN"@x4 $T %՛yNdj;yVQaibkUf1nFO&;U.׸Eޕ u/H}Bu;&\HώzW;59*<\ B_ {uIqq'o> syA h{1~1jQٲhX`@R` _oQʤAWMv0A 8.OveYʀ,8PĨ$ۣnN33 q(gH2~rq(ifoLa'9^AˋB8'2kG",$/qfs|ul;mE a1|RdG-Y3{^QIɇx4)S&0" Ρ'Ad0-hS( q70;Boae7X,0:ȗVLSO#D9B-^ f &gfk/gځ;uoe2}gp>eA>$VP_ Сh%BF-El̆)L=ط T(P웙fDPPᾁ/1 I$#9U&=1 40,ׂUB]'֖ Vt 1#b|eCT9v2c̒#Kr.ei2ЃE s V ~ɚSM5&D"H'MDHq8m ƕ|#ȃ.p l963 ||${r3*S H(B)nj(ǪB& 0TDIA08o5F)CDcL"ZeЪH&jd!CN6f ː;p!h4 ;O1 ?dIbB$12 K G$%"'rz} 1tI; Pt2B#@Jq+mb* /Bo:=rUCfI+6nAJAs }m`6P:P!Is#d켢ڭ-|flZwFYA?25M -4~P6jJT;qpVB䷻ڙtq[3;y2MQ&) T&ǿeo _ @!`. ZЀ 14X&P' FO!`7 Ph†D&2)84zӦ0G4tUY,Et5b'\ gt/RTk8{ 4BaӘc $C !?ԱD G3:wAbC oxbYCADv*IP+y,*&$wr e=J~.[D" ʰAxk^GaaGckȆ+AJ:RVrZ/g7$cWl>ю` C[F$(H `Qe42}# ?E@ z6{ 3A7(4>W)bVx0DȰD]i,BF}JvZ"'@hF} <:Pw:4gAjѩ1O) }(E Az~i N$&'|RLG;^Iɖ$eA 'd͜[Ø䘯2 VɎF?% E_adRa4 r(Qጅt9k)Z^|X:!=kZ0!'J/NL$7"D1:"I2\tK'r`̊</uEyK2-ʌ&HBҺU:aI. XJRySlw#BlsixzJڔ-$3)QcI#̪2,u"Vr$l6FXGC q${4,|ɓո;׶$vD4Bz.Gbi3I&XYyULy=^]J=b5AOٌdXC5XFI)Y JC)DeI&>2eڕg[š kҌQ&M_;w-dF PBa&,Ec QCð+j2R&M?cpщf) &P"٩sj̩@-}\nTl&c` ;!˫*BIƨ;d\y4(i] 7^QALϕ2b q)Eyl TQƍy\hͼCЉR&2r`ZlĮf#w EY)^Dl+Bu"(h"$)/oXc2bW|K0lSdsZBb%Rʜ~Vaï'qv;*[ f'*"iRj))#p|OފT'F~[ޟWKveÒSмJ' oل-ʄzBfQz䅣5# s87td} 9\yg;nh+c{QR71=)6=&ns@ )pū2Rbʵ*Q'+a[E)΃=@.0IےO1 PM57y0?7y(lB aK1ʩ<;?%dz%i"ACT*c N؄dK E.0L"'9+`Ns<٬sXtg9ЉI_yuJ!꒝P&{:\eiS%h B<,I,cч鴉Kh}8 6:S"ySP)x%HS@kG a} 5^م8HpѦP dc {чp)8̳qYĤ/3 z()H}!hȇ-(L d17! = I)`A](2IpLhډ5dcƱN;Uٙ y,y`P2;YQC$"-KRL`4sQ6+۹Jkm1Ǟ|4xi)%QڙbI e?6ÐKYy5}H|hJ<ʴ L}h%yz˦2U5}"BE;v|XJهE0܇dSlXhhH1pdϛā0,eӵ /x\X<udœey׃X٘١eQae(A5IHlK 0M}]KWL" ܇aȁgHXXDL%mܑI7/@.XPY]\Z~QEڍOhZ1YWT}XW^ZÕآJv`}~DRڹsr:/CD;%TR }^+`\S[e~0݇]}paPpިa/6"!h{PZ.h ^?݇(mYn7K>nU-'4,)9H.P'T$J6T=a}`5 )c^8c,a~Cl[GcZu*7NM%=@Yb6 -bt :ZːD.&vAayPh(Х&̳t+}$ װBh;X}jL8j(VDL{d0]`]ᙆP\Ζ=Q.dJxiĝazi$W((3He(G9 @ %A,Y|F?+i1.۪&)yÂQe+e`cP0Nm5g~E1^)n-JZ H;1r2tl1AҕvS]p(%6n:↘عc-(a5`i`%M@}}]@LZeSqi>GFb 4#E#3;9;sS7@q`O9ZW8 ܦ{~;,(r}H.ݵ)Z6]r<ˆ]/oK_X4_}8k S[ ^?mTCswSrYD1w b]IjѺfŜrZ" .doq_̒D.lw A& AKk늨AnNsʭg0$-фd۩ [Pd\d}Z{Vnat\D)>0[ +B90$%9:oNe L˖Huo熵N~J9u{jk6?J/}{?ޗ/Zk]fU'TVP [T\;iV5VJVpixYKɫne M-hl0cipqK wJ="IF"0([2QZXcluF,+gMe3# (+C!PG)g2j[KrP/=4e2m~]bma\mWZ9[{T|Zʹ.ǻ 3^,pUNRqT=5/"-Y4 2-#)du6Lq3RT>,M\l[Wz! qx \{qXEׄ껽r?wky(VCh9?=w$Hb5% xkQD%BEd̤2 E Y"iO jׄإ ;+LIqoSzZB`(- Hսn" ]r'exPzE"(GVa I@UHG/, phڄAtUOXe'(o 9oG XjR/jȷzg2G%$~ 2/ &ra~{ pP}׸" /[صDn&a=P"DD/O~[ ]l[! R|^&iP^_I#^T0@2 }rbIA i$HyT2\,E()*3p.DYDg&doSf GNzoqzen5m ȉvR!TcF}0U uDh@ ,$n%UQ儠R0FC<-A=Bq +TC%jOQܦ 9ab^u=wM+Ied{5(÷Q,oP[@K/UCk#XjOuQ1ݫ;fz_GN`$$!4bŒhThz rXt0px ïa}Wp~- Z}$fl8㴼n,TBPtsDiktC&nx)֨P2>ĐפAmv?i hD'Ѝn4h4:ЖhMgҙ~7 JZ b@C|IފK1t}jOBuЯqo.tmלީxv{Y& 'IOy#ij(a2qKfZ[m*AgcPhb@#Bӷߜ'y#M!Ѻ,QHyBؖ TQeV.Jn'[~ Zzs[Urz;U?w wڥF?:ғ3N:ԣ.u[$1 h\)c:DZk'D-\ҷo]p%Z_ajI;!QRoP(C|hLM|WM|]@.?#|=?x('w o?&r Jd" hЊv48ܩu֔9q4( \\>r qOmåyl:-|[o<5~O=9_ăw^_Xki}Qݛ2dFCaPlr S Dv B f` ` ~j  a ^`C!M|Uhd`'hO1\ePp_5ɕ_|0tQU~ Y X;uM*[-T&[fyEW&DM=!OA qׄR9طĉWP"<cc"^?.Q&R4Ǽ|A$HP;m)6EI {}UIℽx̍͹NYS]OVO![ ^\STXۋyJ \1DPԻW j7uJ%ES~šm^_N4PXOM1Ml[^T]6Q-d&Yhfhi&i枍fjklfk֦j&m. gp&$r p.o6gBjft枭&l@WFXK"yQEՊ흧p K%"i"dMfT$yY}qe%A&=#9AMڙe]I[&JڈP$MR\q|ͷ<蔥]g;q=gi$[8 H͋ڕE~ cҧHLTLR"uɱ[nK鉄l2bYRA^Q:"".)p֩ .`( 2)4ةCʠ\\^ qEx\xz|)c Y\2WejَNKݝ5քVFׄ/u"0ȥё [Θ5J]}9zfJ/>$\ <=%Jjmfbp%Xmղ]dΗXh*Qۛci#[ B# }N$MRc-)i=AЉ뒖xѪ/%j(gq&p֬q&9l sll i}US>ĩ܊1iD^E* G 1^=^!OֶmAmAꁭ^]_w^Y~_j-̟޶~(țb7UaJ*i)mѸmy_: bm> wXv-M).GٟmX-)/U/(@6U-䝞m&DnFo_9!>=Wh91D1p%7l _20 >.7+ r`V]f] ) mIЍnJ9FpiF!"! JCsKZ*^9 %Wح!M ٰ J=#O E6IXQ6I yq- KPN8GHT\T"ӗ,SR=Y|CYC /IՉ(S1%O&s1Y2Ss%VXhiTt1TOH*9 D&h00($$gH5"slKCfC>2OosN52g$EpYAȖU\`s-fP|S[zUS5ʝ˞I x\s q!?1IF$ķena_Nޖ EU_+ % c%T2LנּJۡz>J0[)G%_eq#g5+eФm ܬe9h BL.gQuFC="N+5wL[lVTyBg WO †iarօ0`Oˠ i&00:#NA81Qɡ:;rAaxϬaa{EWk y0%QD}/'Z,08fRl$0s 4qYYTjqs׏bRYjZt3[}ўQQd.F\镞l\rY8(Cw\7;u:=|J셌_WTcSB7AHyX"VO\+E-2AZ>4 ChBDMATN2AeŁXÌsu23ġR0G)H~Lx @p'h,(h3,GWaA&G ڒ2H4I9%l˦hdod0C>;&ɮ@5ؒ&KHRF "J#",⋫+ Cш(Aj.* 'ǢH +-hq  -tD",nM!ӈˆ2*2uDLrHzF")L$ `PB!&hH7Y2Dwlr+'Z1Ek ,:"**1],:j4܈ U-iF0th*,(hB:eKW%IqK'U<22ʰ:DLa Iɒ5B!h{F\ydvw\J5,@DedPOo;96ˆcGM촃f/;P[f,%)ILĠ}bʦt%V2dqXJ̻,Ij\͌nŎr 32lL3:Dݐ*Lt>"^ӂ!gUHތO4IiMi5|(Q,3fȢLܹC{ŻNЪMkf"FJlƐbdlF}&zU;j \Ş{&o38#VBIP2 5}&lL^ҝg h.b$^;h\B}o)b@.' 5p?[cd'܏o8`g<|@ п0v_Q*odQB2*r>yPcv& Sؖ3*UJz@B%,rZІ_mORt8JmMT/53Uqۦ(,QkR)L A9a{b  dC!%+;T8)lltTM[xE[-H|+P4(Z 0Rs)8Oy" +K,:Qőr i$4d+)1ah@ɇ4 Ыޢ&6ĪHQV]l"0bcz~`y&b =ChhAY@625w*#z4MČ}BCl.XkK1RJ9N(!݌FT"b%lʰ ҹ$ 2ې%3F Rb&En"9VrP]ab6HC4d^Z.) &&f imPbUR@"*7Xs|;[Vڑ0eD)D)R!S$Fc|4"z4d$ TkpV,78rl] " /d$k0|P9ⓞlBԅ;.(6@SQ ad$PF JC`YK#ґXZlj.qRҎҭPedB̮20!UeViƖr#ɢDts0K'8=NSLBA&(LsST.!cД.-Ұ&X IAv׭gEb`.qdTdٍKa."|iQAIH([ ace@5)( ]*ѰnBpj)L ( E:a &i$b]>1f_ -_wBG9J$Q}lTFaGh7mr)stRǧ=sg6]I_*^;fo?YPi@NeoM:t;$8J Y5J6r@v!d$ +KCQ"K7ŌP~s]&j0E0&9geX2mF"Q1-oU,&CȓxCiTtG4a%}#fORüHA$l{dsؿw12z\>,CMbXtLɠN?ei!Εbbլ6N 0F}*.FUv:wZʪrɪx:y[Jt`.JroIR}d4y[aOs-vOKG3% ݕˌՈ31U(tgShD ɆnCHcpZ4PC-+bt#,̆liZA8+|8Fb_ knc3,U f0.jF#!'ƬDBY@̍P5p/@~(^Y2DnonBË': (#LxwF E*b QjǤFɌBBp$T⫔qdʊC'trnenY'mX@j/&+j2#Vg J8ޖ*TrJvBBfv I%H0L( Ghn'J'Z*5ƤH 'C/0m`pC>BldlP!@d.@Ã@N !'J/MHBb2l'~CmmKtjY`"ʍ`jmQj," 5C>e $ ̓\ϨQAe&aO@$0A:Đ>u`1bX$=ghe$0@!C8UJo:j|s"PLڲ%f5&.FJ*GFdn0D&ypd2.eAZ*l(0d$"N B2 ȇCH Ln|1e""̭rrtk2HlxL-}Fh#)L(҈'S 7O:pBdƪ#~&\/2,L96/d#EUM\I#Ks@D1HxLP$QAB&éNKz+&I&IK!`N0mF GsttGyTGG4HTH{HwHsh@ ҠItJ4JK KJtKJK4JT IKjotL;B(lp>$y(!LD0Cb;ڮD4h6v(æ&S&xup)چ.BQ}*b!k$PNbjI'RmB趧ULV8r:45#k()clǍgW,lO*q 3t2#AO2(4*p}"!="_^_}5_5!/'Y _v.bsf(vB-S=db7h+"&3:!E'hF,uMA..jgۦoPuZ/QX1b5A )R)N2#.DDzfB NV}HSj,vkPH2g RrI~ՓINt@gkth쩾qtMfpAnv|r*N+ AegLP!B* Bu!!$_ #B"5>phO 7½\-PIrKhhQFeWj ,{ehoG-QQou 0_h^6Y}4h+PlHZj!l M*k=iTol: /}ndB*`ĚI :eD7y1&,1wP% &$GyTF2^dZLB$#$Hbˇ˻ˉ!Ƽ\՜̻ͽ||ι|<ϻϷ|]&9ĠHl"%wC_뵲05ΔH: wy{Bm͍zQBͽ#GGO+*0"YR&RW LVS%&%8Š9D!<"mSgxH8y" KFn:dZu P(SDʈ9iU'l<\̄"nɓz(I#\Ze|pH!^LQ>^H>ڡEam|u>s>m|<υ^XAhf 2g~h"ƷX}īSf]9Rd*Ut4P7ut%g\O pN<NB 'qr51gZd=IVr:/8ی䒬rAt=?ѯY k 2yݵ=7AP $G^N#[ZA2>4!#$燡q޾b~"|?I~C=Hbd&swpv&6ذMtF8)X44ՋFOʔm_=h/ҦM}6i\o2}@4J>B) K5OtL:of9iؙaIT)֡Vn-iSa.M%ӸdQJ$|E TRis^ę%oBIuBf$)PBEզʗLv9sN̆Ұ0O6e y5c˴8S.ESاOÄi9ٳߌTN3o7ٿonJI4?OiEF_1vfX)o坄eBL&iXIXɆfɆP& !)IH)1 =4B) =929xP27*4BA!Y0\4BЕHZ4%FnyIExF=-~T]Tc 'YQaFN%z]wr>] 6UcGqC͕WױיToA}1`SAp\=Gz}:aZ`|RZbY)ŔsA4-!1I(SAS'Jw^l fyz`yWV@򊋘Y%|Իx(VeVqT=`R@Go`f7UV0v;߬ r;S 1drl*/R=+) =Fh$sM%3f>7]Z;,)3RJ|pRKwTFWmJW]RPVS3NGĘ P螆nk[Akco oj)S*5r>,^Llhp۟xkZY!'oYJU}Iwٮ[);q1lxĺ|ڨO(ʄI3V^c1{ 쟞Zy+[{WєsI]' OʪesU..=>ѭ_O#֘OniH% ;jhdf-2.9/docs/hdfview/UsersGuide/images/save_as_text.gif0000755000175000017500000024250612050301073024250 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,V/ڲ}D`‚28qC/FF3 Iɏ(=rɕ.S,)3&L7_isgM>s ѢH*(}PJ UMhV+WYv5Vc֬XeբkvnA[Ѫ}ݽy]'.q㺋 f\f9_hљM|ZaҧXJT)]w4w =wēW|ЏKg>yԳ[׎}ோ>{ӛW~;}j6Yߧ *WOnT>]A՟n؛>X> X!Bb~A߄ !o" PiDP-aux "$*.Yc/)#R"So0S6y[k:[-b mr-z.[J^+kmj.~n 0 CS p1Ve*mP)UT K2O5&,%r032L(ls33?3C s=}J7mI?]|&UZG|hOĺAȬ^p-tmx|x10 SDS! _\aC6QѣȦ0rqH5 k:T䐌#ϣBoDC;WT,Jm3uKռTĀiL~TA/:SM/f>`D;oNj=;:@2A{)q3ȶ}(bUgSVUf tt]NE ]^~#$ZaW-PPx 2D i 94,6 gXCFKLo䦋bnF"zH" n8"Q._Đd#0Q!?̋nLbQH7>i2hq $,8І\dhE5^f2rɐm zO7B%ьAif"8X >!0LT&INehe>yt=?hTOodDkeׁ)BM2pI$-jUA>A&7(LSJOiqID>!SI2 ̤P4q8B2aP05d钔'С*02BGᰏ|XZRmdNM%\0]JKJn*9ة 5friXT8f0 PhsJ=RS #]a& ρ0xJ0tZ##B*Ce$d]LC>oM$<:q8r!ÀC4Z萬@!|HL NeoǻvajGo[:JCrȊZLAyyW7mC0l"!dqos @)tv`<ư |w5ũ؊YcM]oǺ`6ȧPFJ[\;dC\y2 hD{F#L z@q@u+ !(Ka f18b4ywgx:Apmw!FCK /$]L ƑĴ2Iز V hpK44PfΡ5̋J:s]D ncƁXc5")f^{:,怡r:MK/^?0u4;B=l8svLkzQӻ8"kSEf8W+Oa-7Klb d(8tŸeX`r10lܴ>` c ^60tk .QD$L]MEC7; .E>N~9oA1`$tU*އ,BB[NLv{+Kۯk9 :_Kc;AC۴kVһnK۽jk 6)뻧+Eۺ[+Z[˻֋k;+ :Ka L|[,ڿ ]|8{ ] hYmʼ+ е|y\5ÝεZ3ŷBlh9ELCJlP̙6ˀw\N\[]|Vbe|OhKGc]Q%]ؗ=Lmڦmٯڧڲ6?z3ڱ7ָګ ۵m?sm cR G+@E0ҩs!L+ܔ݊6C/#7cNs!c@&۹}3}M*0%=}<;ڽUܴF'ԭ'u,!6BkAr!ݭ0`R@ b3@X#+#*2!rr%7(2)+l R!%^B""/r Ѳo'=,>Le~MbN"m+ҍ'O/# B)e^+Xgמh/n,/B,RJj^騢?0Oi$$pO~ RƂς,R52J2w~Ynڭ>~!=2 >ޤ2! R/NI%nX>B"q,]Ò$ӮkN^,A>+߱)><؟SNnޜ r$#kX9~ڕ]:8msTRق'u&)'ARK~~%XGX,"(8OK^caP>Y:$*&`r!IN2DoX?# B$"l'!D")>B,C*~&+XLGqK׵я^#ca~ +<_!2Pq~@[ #R~^O:ABhNR?!} bԮf^~ .BƎA!S2_. @a"n12蕄b!B/@>8oSyNÜc'cl};M_} 0" Ksq}:^8aThaEh AP> ՛"ÖƌaD; F O6_VliA8qBH`KZ2KŅ*] ɰW< .L 2"A[m*/U.VD6lpwŞ]V8kFLվ`Zab^-ZyfٝǶ5.‚?FrZsQ0ˈ&]qFZD}]8N/֣ol.Գ!t{)~R*=Ჺj6I'2)) .S63h)r [jF4R+,|Hr#m[ñ\R*# )@0\IJo.-$s,JM8NS吒y4%jF ,ꦌh*hs$ }5S/b-I>#o,1 +C@ЫʋhmRɇ8]hVg'\+( |tDW NkK1:mS X] mM1t]5]lmz7À=s+x#TPo\CJ4kAyt`C]Рe|Aem=n9?Fj#2iG1+vZQGcڮ_ӳ 8 "V5%*Q/ٖGIծ;Cs[ g%D` ն۠DWrTj #-jo<8h B8tZʱ3*κ)LH4b>yoC1;}~b#D@kkcZ ΄ '~r;)l}pf݁.0S^荩ni=Wݡ-5 ^vc4`/7ؼ#kaw&2P 3f3Oyɛ-w>|3 ^GOr䏟>J}{_&я1gVr~E.ck= m7e;?;ؿ[+Tm @ D(zh<1ü}2$A;kASG1?CC;S@C:7C{S)@^c,#9+ürB^\t+3C3|Al=,T *A1DTEdDF0exz‚ڷr=CT6,)$EP67 ;(lr+(&ܿ? <6ܱ/]FUNgl<ݜȀǣ4?K0 rAЖ=δfCtLŁdJy DbEj$Ìa49N\ς6HhWDINtLOhd,ZL7HI47QR"@lƣ,AτLP$DWT(mJ }MJƵĭ,tlҋFdQ\GT\0HAKύTII<ō4FtNŜbJ̎~4ȩlOEL`WTQ<,PJtR|ɥ]HW4ATԣ[5aZʸ5q q ؤ Ȋ\}kd!Y8*X6)#( U)x"d͊00c%juW&U XW]U&YEW9(J)镄W |9x*x"kшSbFٗY%0YٛٙٚYٟ-ڝUM١YM]ڣZ}١ګ٢ڨکZ5ڬZYڮڰ]Z٧ۦڵ[۸EZEZ}[YۜZ \E۳%[U۽MܗL6R%R""R R\"%˵I(]]u͕]\"mʭ]4@5]ϝ\U]ٵ]޽]Mٍܝ^^-%%^=]]M_յ-_ӭ\M_4^5ߌȢ?=IaȄF`^`f`f` ` ^ އL@ e4hn]Rama֕I"]aFFb!FFNb a,)Vb'fb&&c&ab)a4^'&c-^a.#9>c >4^!v?;b8&9,W9fJJ8VMON6 O.R^SWQΊPUveVXNeWdV~ePeX[eRFeYeYf][Ve[&f]VYVf\]nfhfgvfa6ff>VH"?Qaԙm r0}m-Y d@efRjig.df{gjgje)8zyggN.h> h^梃Vh|NctnVJǘ?C`,.ӇA Ȁ hMf.i[&i^|.N槾fb^jb>捆dbhV꣦eifnhl^fg贮VpfIo$bz*0"͙/Z-LSneNnj궆萖vh诞l.hFjmj^g&mm֘?I`ɠcњ9ĞR'DIg]%y`Ձ"婳nP^EmglЎ|ȶmo}Ӧ&خl~lvr Eqs*VO#}KȕN=3+כ[ Z؈wFUU{Tqۉ^zNJt%ٜxM%R= TMu=MWgW|iYpu}[X ra] ¥[ q*>9[rс RJEYVٝJ)Od*w xNwz]NYR'>qCXsZuidrM֥ѳD}B.[ w&ءZoJj5jVɪ{kNo9wZ>jh^9^WqNZj:h[IX9;YvnQ^!v!8ho1Ma!r+Jl0ݫ.LT%fke+\kűl 29w{x ]&-(G b6ن Vf!2uk[~ӱa?L'Cymk[|p:G5lUbygsVZuWXQQbrA֗e}+`t!MM0ʅ\vJM\wn;b?Sz ?5E,wv˴}HZ7xϢuAwѣ^[6Y:&,! I%L]0f6uXSBA |=cɩZ:4 zj(2OfyGܲjEoCv/0b*D>Rkg)Qkצ1qk,l> [X2-x^D zx*[Th"7*~#!JQ|DǰчW[!j8P#E9K.N]4eg|&4)i.sl4,}L" fMqs$g9) p|'<)yҳ;р}'@*P{` #2}(D#*щR(F3эr ;y&=)JSҕ.=i|vȓ5.z=4/=M}Tn1QQ?S%I.AT";MdZ# TD0eEVxa("u?n%\շJU"bmV'Vu$Pd+ZUNk-_jU$@iIf } \H 4VNu+ٮjՑY]Sիdp[6I\jNd"E41r+>Rr%X.OހaZ^2.>q 2Gua zBxuh%롭]-ohKY2= / *]naz/ |(_duqe-ؗ-^o HSu\.o jTW2hx7W6%_z.;516WزO]?|֗82t>}:Oi.qwH>f~׃+y]44|VD ^~J&=~N_[A_ߴAb Z[``r& -*şv`lv`8``n V & BZ[ ` F`! 2`WP!6a`r 05XetL ȌMMKE\uQbaqAD0duH#aÑ[M] ]TհSZUdt$YP#bI'#@%Q]T(2PY$ZQTU -.*Yba$*j)bMp%>|h!QUTu}iMU y#S9"Zc$, pH5-|b=@I!#b9$q-I0dY<"^0R8*#B6P9c;6>ZQsٗ2慞`#Cc(cJJ^bBP˜mH.$L4WG"NA@$-$Bv1TʘS:57T~D;S^9:Ye:mVb%XU2e7WYfe<%SfddJ&fZ&f6evd^&hNAf9Te~fffh8&ccfe>k&ff7ffldfnRffnr&ifohi&sh.ojnfdRgrnpFnfZoNgm2qsZtyVgt'xvNwg7}'cfqc{~&z''zzg1)cEMUMYX^YUUaUYE>hC(hl=hL)%ZD s)XNsq~ihfF dU]K)K^h͕X|hj]-6^ݕ"^!Ka[񕌾V jU~bE!_Z/B(D]ԭ["MeZ]h(6dQqi>_ -!7͕tӔZuWMW㜗5]_a2ՙea\V kh Eud4=‹PK4H^\dlydMut9XHAs}+EC B`8зr2+\`+`,Cx-Ш'UrE~2:ɶ[kY[]`(>Y40Ɂ8 QbQțAPO6>dy5b\5$E&1YENB[hu*A>bv!\5e"V1)JR,mnrҮ "\W%blz)F]ަm"?$Ӓ)AIR6)z$]ij_좐dٹK72\TWc•t (Y$Xli߬5\c>7iWyM=*PHNOL+[(C0bLEmmzXnX1[Bo vuxJmMYK2drwu˄ܢIX^Ј ƓEs s=~]W0;cpVL[$~!b6/'AUkZOu) k>m,(FOnD QOfS BKiRLݸp4(iF&6 n<Y !ߕj-Oya2% :#*Z~H ֬q /Wp1L=|Aبes$$>bx)'OJ-_*CF"^BݜM o,B |CV+Vк֖f*XLE- o]P.i˼IU*릵o\ w2(mm wQDQt%پ>ڎmi.KLR=et䒯]ltţ K(.UdmPOp:Lao~WXzʴ^stL"sEmVt1 Lc$aS&R0EY*ƌ[zXT+ϰp6&42(h024u^vr_s5dݔ2޼+:*=J/s *FBM>X`Q-+#N6855-n{+(l&nnI(" '^n*-5ulH(myq-6#=r<(⠡%/Al[9ڲ*b+K/NO( $5>נ; S̓_m0!uG ńalZEw$հ {X휍2~Q̃W[m/^IY-]7nx5/ڜ4#X2'uεqB"vr4V -^$&u8-ΰ,nrQmbhYz^S 'kߦt 01Jv!W$w2<2WֆuzGts@XϚ)J7 mft7lTm鄥mU7!wFCu!sBOS +zBwA_y0E/`UAu1GL9 wb.ټWz=¬y1^ /B-Fw!}(#9.B#sgGo05nw6خHaQ5C2lpN*H"5pwh ;$}T z:79gG{5h/J9VU?/&175_O쟃ulw Jzdw]@m<l'V"Nh^S%?l2̐/w^v;-{C{l؆W)t'w_n!za{^@m`[N|[^vm;zvy0aBǝSQ.C5FҖ'Ym5֠>a%3dޗ-GW-P|O1#=yd+_unW ]^5ǹr4@^zKXp_}}p2)FE+F,LɊ#K9QJ%eBp>5ibhrXiSE5dτ1}8 ˅[94HcǢasađdrbZ,;%B\;&[ =pOKԚ%DіD1$ʖRYC,|#VfGYfH;b[NCۦKZgԓy ȑelٿt.+xr3*'oJkfع[FM Pjo *M 8=k+-N[X/,0C /=51D1p*4*QEaQF57DR1Gi!cqF[E ,IT$qI(ܱJ(g/JK3LJ7S΢Sfe@Ne<@ O@AOCSFA tI P>e=5TB D=uMm;EUECPI3tAl4e$S\ YGEbVMM4YTUEWaS@=vO4H?9SJ*QFa!&za4^bxU߀wb$AYXޅ]8zF闘 $UP -XU^ e7TzTQ'PEv]bl}AD!zw}_wɕv#=^W]vՃwT؏ϽvC{/^Tcw]]^vڧ_ZwwW?I߿啿u,>~ͣ"%QOj; N wʞ2|LaWs}8aja21G ÉbeE0O2B+le#gPO[#/Y5mmtm#c@ǯQ<)uLj UHY9e'c%-aJ]gDx-e(ıHv!46&9$"O{fHHADblK_'.)LdKāD'yne|ԝ L1\6A .4WAcЁ{ީ5w`F7<}AjdY[LRVS*tz,T@y׀ʿe3$?ՃCœ; f@S5ϐ=ST4C5X?I$ˁB(H9ᜢ bWLuRW&$+ Z T ì'a H4P,4ø+jiZmFwwTA5 >RSq?P hJȈ |-'{<.T p2I)I"'@\'].89֟n^]߇U淉$mkKہmUh$ ̈ed51WfLkj`SGZM9s¡au/L`[ )c $> }Ɣ2 TSxKeMm1 kL R|ê "`e6OblS#mL,ʀm0IN \\ ;O~|{ us+y]&`w2QUVqu_ [f)NԸ́aeSGntyDc_|`*sN>9 aS.z+v;Ŭ7zNUž27*C>BQal!CyX1􎄿x1(cR6+a(|p -\(ۡ x{4bw#e( +X5202Vp ɍW ^j'šdo,muL:R|NI]md. 8?@jVr[%%DºgUeOݯ6ШJrJP*@j fN5J>&N(gs*ϰi O iZș K_6OT(G\Jxƥ>Ap.` mO JB쨔  dsnХ ȳlM~f,Qާt J+k0O빊v Tj epDhr-jzes Vlt' "% S!b"$ CŨo@Ɗ(0pn<'H&7 'q?Tf~'^JdHx OX͢Hj0j~fR*jp|!hG k@A7*h.* H< jFQgrQP'NkbgTRQ @!2Pޫv U:?җ%,*F g(ĭ:a|2(2 (r rZp`Dn) X,ʾ(:LdH.Вs'l.vjV  t4(# pmkHɽ~hLڇ4A*Bbiէfp"T&k 0(bibFzt3l"N*s&;5*&:dц`pH`F`O8 ə BSbw1zff,ldh leJe':1Uo -eT#EsyX&% 0RzX&~{d,nЮy2Vf|r RCN2QH +GTLF&8YI?QJJ邧fIW6/&"|3h3}, Finj낔TZsR0yg,ӊǨx&u5P, Igtg=!.C$)d"k#pM*C,:5CC'C0S3R-$TmFBCF'|g4J"5CW syMWINA'E.CU"ԇԫPLo)LL&IgX(UڇA)Lk4}Dgr#=7-0tT 0$l`/`[_'M0ut`'_`a `b#U-6E>UҀc% & N8LVx\Wl[tDihHWex7vtVuSdvT'kHyCu`dLwM uu[;$^Sw pk%x%y}htWw]nJz7#Y6Qz_NnxB+t;KL'f>EsD)vrpqێh!3*2`s)g* xQu ([oG֕T,NwhgW.y녪fR5$GGP WUҧH=tUpw5vt!%P&lziU{P凝Ux. 쇓1vuOYvԀ!!buDB 9)+!9_ ix&HG\\ȵe.Ӽ紽bFzچrFit4XP>uPx{Ҧ /Z Lw^S2YD3\QcjD$~C!d_%6p8GqH2)-yg*V'r bfΈ[kMif\S&QHV/4K?DyP8Qtz8C{flʲD/|rSvYQdzЀvRR% Ey} 4t>MByOYRcG#yّI ^9 : Tj*.LI4K H˪ߔm ՆkCINPv9{|Y;a\TONIw "";\tQm*OcYǭg+>Ȋ3_E:q͊admYk?;δ~Mz2t9A21=n |ۧuf]9,k5HoҡAYye@PX'5B>Yǂrɗ|(5YXB"0@EҡL@$XJٲ#n(((B(pcBbGxQDMAM E,7JA +~H?{Qϊ=xq Yiɑ),ORIKa1b J2؊OMUWeB~F?iM1yafaLjI8kJ6%`5ˠ۷/ھˢ!FM Pj` ܷ&5Xdʑ+\rɕe9sP¸N,sC>&#GSÿᰟ͟R[mHˠ27T,I G( aXaVeiˀ?I`}8鴕P nTXS| Wh0RVY&2J(!Rm^ SU$Wf"Xe$XKYF$ qзQ$@hZ_wQMD i0iU(̴>6D-c>jI piLvw% zU1z讣K;bؖkgcgLDfg1X&Xۃgo6p$IZiK ꒦k܆߾%==k.QMg3W>6uZՂs2JW A`6vAPS:Xt" /8 40 d4pa w0DDC CI1ġ8 14i(MbE,zQ@h*^qObE20@T$StD8XG&QdBzv"0brbp$}xC*o$sHIR Ā2~Sibr/}Ax^gQGMn +oxg–d T&RnNj FJ\\8=$t@z%dS(L{Ѭ:)sO<ٹhs<~jV7 Rv$:7ÚW2P*6A_j8+stT 4+N^:kR++e*IKW2"&.Ւn"`%L60^I=1f)@dd2 n&Ѡǝ𤌇MX/KH5*BYq/FYGAj'"%D=jQr]El#ŕ0-e3`)r$c6zM̳ms]X{Uw6($k z%jƺZᬊ/&)I6H+ ohHlٍ-wceϩiyZ6l 25,;ڳ"CE:YjlQz׭M$\l#~ hb&wIZcԪK@sHuW֊ ӗ(++fW/[(R[NdAE~p2А=gEÐ @!:x{9_ QZ[&6֓{T# (uwMl]_RX@P4% :qH6?&?– K&љz.4мb`G?HV$<=*LWܠ|%1HM=CHL*Z,eُƢ4C!ڛ8EJ$ $KV(;cOtI-ll;yB1e"C";T$VcVuM{Lgw hN mA'Wi*e>^62$Pg>8wpYDA&Hͳ* [Z+%y*@PT=ϥ_%.%[h 5OWvZ<")Sי~*dRt2-.DUd.Ӕ~{+Nߞ\%"T{׍"ɂŵ?RRjAPDrn%[_L0",$ݗ4ph Wr0G(210[(sLgdAGc@s?p:TBt2C Cn q1w1 4R1;"}pinp0#f!a!bː }ra ew<]"_CQ "l;Q޶!vgMEw( [}q3Tz5x",YJd'aD90{f\f\|džk᱆>|Ե|Ukr**v  n1X#hNA erX`yss}W^5r>~>DeHxj3O%xu6ӈ '% r{[=`A4&qKVĸ i8-w/& } G8cs,&A/vK!c46S"Ct:T7Fduq$N;VfqZVR#0R;w{/3+hYC!b|xg2+}C`1Uq_wCm'"f .ٖg1Qw޳=<%k\2CawZzSVhP 8cPG'[W:3\E]X]+əR|3*!m*Jq>*gYR|N'j;HJ[0g+ IA3XBR BR۹Bd3.TBHk0:;)xTD+F}C$GodHqF}dIiTJKJEHvTCI^$J$HDKԻGF[PDG4TDtJERGDF{H}sdݫFKtGH\tDaT싿h 8R:ۧK A uQDtw4 %PPT5PIq EeQNMmTdzyOPz"wMn#lOyC='фLO`SRbD4uq u;ΩQɢO$|- a.GQ[};KA3Be jd 1 'idc;F6cZmy2 ".!hf vy;4WU5leY!& [TEѓ斪10A:gUz4UY!Ps#cE3"vr0i7Z̛Vge0ZNSUA?ŃPtr[D¸W9|*k||((&"ϓ| C-}1s Sc&C/&P_>f_\tSq9(ȁ\dTE2 (v`R m#wy@]bh2fhd d!qװ^.?r$ţF8c~SFq_[ˈhO0 DTŘ+A@1(nTD5=d7'Ġp3^Q~Z6Xs> !9}K- HE!   7ko0-`8kuw5zN8pw7Ť'wȭ WvմuqW$8@ガMοՊ싀ȇ]\g}cc&4'mWVNͭ06$"_I [0L}+NX).> <yXЩ"%ހ!Ga""s;&"ؘG3rE;<^%ƭ1K"ia (an9ixqONp{3 &uwV%'0p1 rn>6aJW^9LhZe6) %,d\,Ӕ0C /"6bG*cHȋ1rd4+*&PdX"8!<)T1RdJF'^,FP`O"ՀmWhEK 514۶kӤ٧LSyeW߽v, a[/_ȁ#OL,aJc&.P8)KPK*KS]&pX ҡ49qX"/.'*; e'6&Rs OF7Ǎ.* S%ۤ1\2*=sO޶}nxZzT))nJ#Ft7,e#Y IZ\רa(O|"E r/8Y" !9YHQ&/%kQ u\g> Sq.t6Ej#rۅWaC1Gz5P{m˜nZ(ylݔgL-1y\8w5QmBDBֶH904/aQ 34~-#]E})^  ~W`/_xqx2Oߚ1dn=Qǧۑk[p|x)#;IA9Tl,cŭoW9YB"Z3-X 3XΓ3=."H7֥t.oϫ\/;F &Օ<ꊣr"d@uo3!h32Y#ړA0B}P K4 i{O`7 ȸXLȁx.d3K2e 8+ِ. ! ($kY2X?B X$/l 8L Ra9[:Q1/9"K,Y414ɋ8RfT> @ЉA5#X9T[YIBȊؓƫx @ #0F H(S1ɐQ1 l;8/9"2Ő5 ؽ%*nGP5,B.> d12@h0TC'G ψ@i\F(ukF+%)h`D 7(@&1SΚcؼM+NDWY41 E!ѪҾVѐ۸ŗͯrt ! -ޡ3(:(@13!X K2R: j *LVsKҘɉ閈} A, 8ȗmLy;P7H E J8pЭɐ8" gp  2k2Lx+íQΫ-9-#(  pAY!/%Q!x=PI|0]񘤜EDz0<ˌOD*d=ʄ4[蒧趚xNiDŽT l1 B9 qm5@fD0= JN5QXc Q"`, פ4([ݔ$) 5'dhcAb\x{a:/ Hǣ @@F31~W!Bc1a!ܼ=<ZD t5" ;  נA4 2T5{ h˨0ʋ)7] )^"(H 8Ĝ4I=xD"IԾ‰)T3{9{WAӯ3U!l6VWǿs"]mUbKeU36Ntۈxy ѳHAҋ5Q1 ;"a #ѦL]'iR^z&4v~&\%n&r%#V~ڦlZ%ha)&R~&Ux$&I`'(Y'k*xa$j(f'j'IbboraI S/D 6z8ڼ((Jdr&:*_ ( *pjZd djd!ZX~[j+٣+N.xÚN )BjЉ%Ve eZ+B̷ǃD=4Hn@ôΪ,~vTGLTTTb葡8T0uU5p- uk6z9-ֈhH/y1._Q!*ZTP|@1QH)kMhO;]( I& KI lIWTMίT3_(9!Uسc2 [)pl^ٳ앒iU5[-;!;L٤*+³6<6s͞.ZwHH< NE˼@L$pˉ,hNd]6`KȵX}ʱۘ.c(\ ى:/UF%9݉H B6_6A '{gNU.c0Q2y \󞊧(*E/qkZvհ{8zuI,PeHLIP  *LTCތ˚F Wk2\ݓI^;YL &T9+81!eM+f IǔgqXͿE$z؂{t< CHVEhļtn1xIh iS<Y$a ;rt{`:C X 5TvP<p7\@|<\TjRU B? аY6iOiwHx P[ K$N B M v Hr ϸ}qC$P\P yɘ1Ҩ# k {_V^'*;Ìr-כݶPe61Bdamt /S㈹yԜE)[#8Yh8ڵSg>8"5!0@+,H,4<##[N@8LNDuϪ%[Ydw}MmՕY6 5kr4NX TT6ykT^W03 ډ|\J0`/. s-W Pbg3Ieb=Hψw׆kɔ^1׿XP3 1LH1 *ӤX2MɈ)KFٰ}geHR(b)RYʔ&oXfN=OyЛhHn$dQIFMxZZ貏ʬ Jb?(aTAeZ KԚ75-Z)[,(a< m@ssDivf$gB=AETD@P2bhI!dDA$QyQkFD"J\1g;H`<=;ygJi ## Hf[bm]rOySfIR2U@C`v%X2cnYaXQD\!e}5$'H0W,b:FV  XQȗ9e<՘Id.sA(bz&idF4} 4Fp9_xj1T~q$9nC1$rUk%OۧZ63E[v,#L2UU~ E9f(J8m6'Uٝ2>mI6MX1PWuq(0iLE!oc;h[P96)IēZϜ0MzMIr%JGE=it!j~A41b+GkywTS%/1ρIa ji5n4uzM&2}t`K IHJt3A!`Ґ'4f7LVd@P0ْJV1O TфTT;<1n]D$,.G4aQ$4X|>"!LT=跴8`JTyY@'0yPLQ'ֲ0{ I#36EL2 3h1 A4 FȜzDҤЄFl6ghD:7U|'iZEZ8*6n*iW:Uw^IOX9 4H" pM$@W4h+]sk^ ׷uzk]X2vv%,_1D-,f;40B`ľ}l]?;Nbm_ YR6]m%aNmcQ^Vo,iyWw-j;Wclt;bW]-d XzVz}13%J9Մ l/Ũ&(1OJĸ2,LleLIa %LKKBnZna {.bNb8.% CA\K'=cV c]Zbb..$AG|;xƈW LƗ)g̡2()>ִ"3~y<:ii%h0:H<`S531C 4En͌IK(^̸BSvONx2VotD emE3`!J{ 'y,ӳ"ea0\:67LL2c&UjP&ZQ4L/y;,W*VRRBAv7˨z\V*TWTQDW*W!} 78ݘXjd8,"c >/)S|0AGKFp.*=ŗLw5d3]fxEaHHvvx.;0acB2e%Rd ӅIC0%&TǍ#ȢحԦV'*v }|NO4OO$lKb#(>\b?u>O.,Nx#ғ)3س5h1M\ ԖQ-7OpmPR4yVű#uӹ&}O!nlDG7y!0pP5yC|JHKTH|I(EML㥘 }&X_JHDBJ ׅQ`љD/XyХ~uGCe^a܍|Gf針aM%b,R}iWTR"IlhiHh^3`M9x~Α[F\8@ . P mj6ŪhhFK.˘#o@' A IA0"." )/DNz!4l=[NJO}`#~<""jy>gA[p5Stة"ռGԝ |xz졟CҴw^(THWœƎaP^vUIdB `x*xqpN(`,ԦUgyԱQa(Pͷ$ \ې`E0H 1zpFIP&z ,vX*J{>NCCJzJѭO Ɨef+F˥9pͥlnF TV } %N.%x.KFomx݋)yK* 1T1=fSᣛ e<&Dڧ^MYOD e, &ttBF~ mm*q$HBF/A%b`Gnѱ=6rp~$ 88W]2YqF$8Sk0(MliPFpb1w1ObBZI}er䍒4 α,;2経z>4\Ym[m'U8mU[M'Y>Y3WUw]luikiVhaunUqAcDKlVbIL[VnhitIA{^A4zk IIkaIWB4CGE uqE4_Q4hWbuFcr JKsVemhutO^̽qk|XYu<)!.؄=MXDILqmX"RmH;!Y1u^W`bFID}܎Čل-naL@+UG[ou5ȒI:!5q;YG{  G\sW7brE(Y1 *V5p ? :[j*nj"MԷnI@HZi4(eԷO~-y %ulFcxF L}{*nﯭfNNl1Qc9 P|Jh3#)PiY#ʹ2JSQAyH AS>ar@2p9jlI]lKYD-M%h;NU cXT.v_ې'$ԃYol0Q^Rb$ey 97w1_ǦD@ ^ /Kh{{f/ tL`*" 10اSnVRtpl?a0zCdV!U!n{]TXם 4È_MPmyrZD J{fj$ϐ#}2?DF|Ex #Nm,*\H6^4CO b̳?hQ`6? JFAhOGR^ RQSo&4dMPa:;1pz 2vLSaϟ^ ȝ& KXحu妀B2XAcXh\depL΁'IA,D,jsFc]O ĽmX A6" K#'AD$hWk?Ǯ~˃7?ܾRҕTF 3,JA1'MYQIqDrM( Dd4Xp`Ae*i߾4jbJ{v5M>L1eɏ wذ0p'_>}/_?I@&(i^@6V26f*xdͥLEVP 32%Jۈ∾JRl-)7IRI-Ć e B"B"Jʖ1j'h+ &ebb+}\B(e@&XFAN'梻n5D,͎IC!$c<rOLp ӆ:XL$#@Ä*H!]L7.\T|pè"el7$cRBQK¤,.=]0ʾ}Ҳ ;t`RF1+ 3: ߫Tv(H{ e"j]*XV۾hZiCXE@c!.别'ht*RP԰uOOPsrÏ?4 S "j&K=c,=ꯘ -L+aD!j( .83(J\&1 k5F*Hb|Q~jdM3t≴?e@엱fvk1gq`RĻw|%^6[2q2(I(88Gk8颓4RU2~NkV(aSL54d|V~c""Xnb;]NYqʔ$ˆ`wb&ĄR&K>L`=ݰ$[Q$ h| W@1,[f!wm B‰& yۄ$d(_L"&N!΍cA)2IYHc X8R"ɳI}4O{FjUS'@*q(:| 21ņm 30&ܶ)jT#7K6UVN&#.0KTNcMsDΊ*c A.5B-X<\5S<8)#2ҠT99)9ѡ>taJ  ȞXXKF*vhd57L"ˈJ`ví8]p'!xQ DIFƆ0<& LlJ 'O rQ9+n]<(:ӢE$3jS3jY6+ĿD\CbޓmDm+0 ɹ0Ζ(z4Bã.93G!CYqJ:WcZFuV JU;50~ 9CM.K`b0hM(.HlA`tR`>`cmbÄ^pI>`i, ^7! '8(oC\b 3p Bc R_q-|&kJ`傤:QFq:e<C~tgnQuVd0^N&) = .k%MhB7:҈D̤Hl'P`M$VV1_ kb NVX,`ҸN{ؿ&k]EmgoaQ [.^6p,`Xoi^qeLkMPՋխd6FCA-`գo8;\a N[LgʱNxDWV_ x3hs_lKcy53 @C$\4׹$ s4_һ^vM|ү>KO<ovzCz>EO|Mv3^w.w ]2)xz(cYt&_}_R2{_~?(?/ooA!5Я0̯:H<,k b :2nBR8j=>ffihc\PirEP l25 P  P Q p 0 P p p  ɐ S P р ˰P0 P 5`)<.ijs0.pH0gSΫ:VfKjjj|*dRn 30@ m1 P{0qq 1 Q Q k{QqP Qqq0q1m1( 1k3a p2a@?ap "aU8qVr7b %̈*ĉFB(mE;QnNn@ r3<  ;;m;N븎?=;р1.L=@“=;TS?/?4?@V@%4?W tB1TB%E#TF<7AGDt;FDF9;T?TIiTBSEc Dz.@jndJ.p@.SJ;NL˔LRt0AM#WMYRk'D`2&l@ S M 2c6'6QQc +uRRuRRSc2RT Q5T R2QSrUO5SkR;V#U#2,Iu4c1O5/)QUT'VO5WgQW`WI5V'XTSQuLT)3[RQY7*Q]X?]['5Ti1uZUTTA2{5RuQUwuS]U]!u.\_1QQR9UTUb@ZeuU7uR8dUxU 8$dE6@1f8CCdW!D(ĠQ3Qz~hRhhiP|viCiViOj*:jQi6kkRkKl6hV;@mv&OnaAp`dMq%? UdG(b6"H` r&! &HkV-xhHP t?Wl{*n֨bdHKJpbviWt6(ހ~#xpxݏwe7Ѱx /ُw[-n{$dmb}aԷ}W~w}w~w}WGb8IvV'!>X8XVhq_x6B!"#BE$EbݚWjW˯u=ŒXؿ)<QtG 'سhExdH! rp}~}ّAs~!vMQe&n݃pT˓p%F0l$&$#2AP  +*V*JNLb$(eK6cTev'dl[BI8^teM׾M{AwB vЋݙQ{b| Bi̴20p Aw͊idHɬJ 9}wW9ڣA}:RрNqLL1 A67xV\0M%N@V xV&p#KJ*Z&N\w%A%줄1B/9"yctnT ARs0K{sWvۯB,JbTZ :R ( |ext%,|W?}%ځF$}?۳[{"$?ٓtng0j!v+H`t/$tƴ|9z:axHځA cգC a̡ء<;{aFkD?di>W˼F<zS<{P`(\#Ü }̥{"wܻ|/܅ɻ(Ś,K( 3</tKX3#M1 MШsЊR'^m+ᖜO4ѽ=̻[ݭʣۻ|ݩ<-ݝZˡCaeRM]Y?;;4Vz?M?*n??@Ǝf|n€ʊ!:6a @ ``Yʣa#|: -S6p2h Dxp0Ih`A ^$""q0^#PC jY˗"Z!]lQJ(tXG)qϟht ʁ|:2P^Z&eҤ [l۲ -[ւR ^.-0ajUVx}*ZT֢Z*c̹1aE./ҤfR}c˞M۸sNI벟%)S4bkedX@@2;Ȕѩ1MђXoeSذ`4&#O"4eA2@LxTXЂAb@=]]4R94P(.3 g]D+)JVq})CWdTP$h2PP! U$Ԙ!X(JY2}E _W\VX[ĭ&+VY{aiR L6+UJiwR#b(SyV١)C 18)VJF:iTJ*r騨JkI Kb*sV\FR_ j죉 ~" #~гzHA8-AФl)z -F40\T-!lATpA^臀+qa2,$^-C."@#b;Pa+LUBV:qWA(zWZWLx\[RrdǍ1Ѩ em'f!~*=}-šk s2E9s2Q&C%(^IXi^MmmڟwoM3Cʬnekbİ-=?(z7H:ʼ[4~ܡ+m4G0IK.A0(2@4@4@(:W A3"=L.J償4|BSǮ҈ )B(rx D%0hƺbX9ua2dB&KDB=$_Tx&d(EŖ J//+N٢& np>kKcf%8(}%1? aD2Delng51pƇj 4jUXPES0bEUT"R5FG*aj`$b`a(>6|m1C ,#@u@A` KsaׁEcYʃBv&@d%DC4Ed)пHe`/@"0 lH;+J$u`{pVNvMYVA%̛]T(E[(Kr@BP/m9 $0kjI\mhEF3Zqa72J`d&e`By $[*g-'bCh|bC lK(lf2J ?*yW,UD] ,$(v5kȚUk[HHeۭ4. Hcv/Xf+1YbKф"08;%جKp?]uIӨ5 JbqDMV=11/k^Byaa6 I7{[m7jEnq0rDצ}E% o0dDiqga۫3'a_uiPDE,iQK! P8& 46v buRK Dr A *LB5GYqP>C&/fYa]C<$ŨV‚[)LxB2PB|Qp d@'B8{NF*2AwxЂšMdR5TT"?@[$ta;؏x`b@L35+ g}:9!0Q װ1*$fǁbՒO@6d\6d`Oaā岧$HS`)]4{K%#B P>؅5&Is'"rܪƄq>G0N'r@B0 ,1}>G@@}AC+dNt=\O .D CWy t^]xwjlQD8ma[UlRx3*uZ+/01 Pt@@OM`V8IR LKE5aS֖GVmӆmR)1`J6Jmw7h ni+|tVWKdu!VdcKhq bK!Y?3a[.e1hsXyXz&%83JPPV Z2ߕp33([qy^i P"ewkѶv[p[ PP{%Kg2+ywp^(3mQQӋ{cK yк*+³,T)}D36\DZA!{J+(22k"\!8ɻ&cbP'ԟ90B[|ڵK뿬]ϴ j*i\]dkU|u^i^;Y߫FE Ev!}*w*TQty!a>P"wU-J5Hb4.8]ʀӏ%B:i ԕZc=-.V Hݲ,AA8Xۉ(RX6iiz,HVt7h2hHr<-!҂G=}KbK6?-0ӡԛ V&}I|x9Ͷ6mv8m*6}6'ۘ}Sۼajd⮺,cː 80RMR7@RMN7a]MN,]}ڝ=MRݽ }ٍ-]m=} >m]~.>>N߭-^M,L-p~X[W gyVinzxfj[^v[.o3民摾nlW_~.n}>谎{iވgU-끎|g5aw>헇9찑Ҙg6S MN6a 9b6KUnASPU?a{bPc>ڿG]YH5SguYΗ_-=]W^ϗnۂ@#oR?(oC]cEMG_-m ?ԣ>Hq?{GI/썸\|-|)Eq^ro|H%7{?O6(1O-Qob12P_-C-;?VUU2< \'њa?bB p 8 %(oiY>^4_-j}OREg??COk%._t~9Ư{澎߈}?k_=M_h)W>Vo'.ӷƁ52pe-tX^4FԇQ"˜ +͡NgDHF= z(eB[xKژ9\ZgD1j.ɛC~PfE'cXPn*ES$ -3xA{VDSo5a{.n=p>-IrAt%o86jV$7G-ed,pBePçaKP:KC+E?pE H㯿 /A84D )Pd<裚DZ.8 @2J(Pʭc0Jz@z3HLlS @2 zӨ.O8%"8DEI jެ H-AG"\MA8>RP&kJnsN~,ՎѤԘ§ꪬ ldj뫰d 9˫*d6-b˯Lke1ת4$p`B27]A#J47TΐlҮ͓?DɣH=n Kz8]Q֍O-#nLS5h`$<|oR]x漴4)%+#o5Gm-S'rՊR*3p U0F ZQieb9 fkĖd eKe 2A1+PUT;M&W"Ԕ6V VTeA5rnFIdT3]4l:5:azR=M;wҫ)^O#5*=S~{1W>^8Obʩ5enDL0Є0j B0kClq^E&Β E 1BeibO#;z$ԫH*t9Tlh"Gyӽ7Q,Mbblhv)fKBĔ'tp*Yr)dtHRBy8#f gD 鱎<& 2I^Pd!uB̚_-DÒ["aGnJ6]=Q&ڥ 0 e@wZHljğ%Mh4ܙb=}Om\H(Ų VO2S #5- `L+jdrAn C`9f5,X+#e)2|rPPq {Er#Wg扰?)~`C*˶&u a~ *AF6P$F~QMt41i@C 7e@FDLGOc4s5bBZl/- s0jf)%׈il Qx,iXC)1e5!{l%𖔫:Dc X7 R+8kjB17M}75hMa۴$jZE?JRP48CGG:G1KyK3/mH`B%]:°^QʠXZTas S"fKy$WX!/pe[{6PD.%3t:}enm]4i.c!GڼL-~Bh$Gxp7_86q1 um& ʩR`EaMO!G9¨ߔ MzQ^n\6ѹd#;Bhyt ;!?Bp{˺!7 :[ c>hiSqI<i  #9 Hj7(--,9z) ީDܻAy }HPȭ>ldjhuS_;$[/Fz>a s= +CPa +\|㘿 S}x008܈c3SHB d*P,=3 Iv@ TA a8Jb8H 00y b.86:GHp!y 0psr#S𡦏(=K1|c'9&{?,:?;7ljK>08Ȝ`Ȍ;<4Ӝ+ɔQDJ<^s P+a#!)EQELY qM|JL1A"&""}!ْs^Bpjթ"xǕR#BD)|cGԜѴO}##ۺ<89Kȁ!+MҘ?͸̄^C4i0e0맭Ew)絛 jF௭Ll$2.0,\ %+ɨq,O XɫR"J7R'4QǐL5X ?tJ1[!P\Z}Ý_AlȼPʬH5?UeQEx}ՄĂL}?SUӋּ(Vu:A8 MOI y8ޗhC( e%}ہH}F$80z+hpS؇y(Rc.eLwHX.#&WAԯS5\v^4]tDуLYhݺA<d LM/ mud`8qк?i )_5,5_͠A1E# d/őKZ8 LXЇEd!f i΁h#^РdeVvx7HP` Qja؂LfzX ySЇ-xjj]]~6&1UxF{t,L0 MX,PHܠHhh#>=#C? ˋEl[=MiDW e((eEG+N@l $ I I؞,, I K (&ϱ>L0CFJE? ACKNORKF5TCU[0(p"*wNO`jA$[6˩yVNK6`C}VO߲}iA/2**j m_hA훷%E I-mɁf2.i&\֟9s-B&fFb2Ą҄[ps!aıO;2P2`H0#[+$nbu!1]HESK ҆18>E:qJ>\bEӏW^`u`pRZkeV^MY_Z 1l}ijL[[=rg)RK1 naԛxN5VY2oVj6RK))fŐh[VRL`0_ck 0\EGo^& 1dr- L&ڎ{;̶ٲຫmm6J09ꫠh&@Y(RMy_qCxי5yRypV>:)J&lWg1&CEr4ʧiU]>9./BrXzG}DsZO(xnVb }SЇ61ily tl82ҹ fr=Fs" s*.Ml*lXR(-YaWN.ꧫo~B̀>¯&;/(oI(/vbw( 'Gc╞_f kx-W\5^ pƹC8_li%n%M>UjyIhiNQ&mLј4\*=hL+e`nRQf5=V(ZF8-Q̈́"6cekMhbSg^gF8T6k6&9xIs2e*@BI{M}~T:5gU1Єn V2$-%t PnwÝE,`bb10aaI@eL{qViZ4TU/q.0B}E{\|D{,/VN=}₾ĩ5O}.H mb0hi^Gy,?k U|4^eљK:Q6MNP9~s Ǹ`Bzˋָh)82zO"y΄klJf4el 8vկBrJ^v*:甊4оRf`"9)'$o ٟXeBfGtU&;SY$daYgG+>8O˒h{H՝ΣvnQ9nc:.xNG k2(,B13*0sU$b֜Zu;jjq Gh4UnD+yf /2CF%T<$lb7^_.?԰3G͆GYizHA-6*Qp# q?}O*ɢanEyv\r(-1q\6nՕm=pՔ--`aȁD(ydAV̠1^AcZ]UR=NQw- |}Gz PIYc#a&Ť>M=vZ_^!WTˬ.Sy̌d.NRq8 UI#śE\21I]Fm<CT NHθإA[,ٳJ޼ dTJ-MdiU1DXE$%XJ%50b#v Z?r)u,1 i*'|@W"Z?FH[QOUPXx%8XÜ$P~t$@:YaDL浅 Uĭ΁$AHLX>V\#z?zHUn :be;3LPAWML_כ1{f|#h}~Y0MmǼigdgwQS}W|gvI="J[RfA !ϩ Nб)݆AN"WEC@\$FQE%OTz  \hPzzƧY$ Y QYY=U񨝈(ȴҨf(6޿[,=IR_e5a$+yLERzRb`UKKu+U j`1!#Hk$H XΚބD%IK6W 4z!>8SOҴ 򣒂|@M#FPg͊YIyI+BR/u%A+"ĂƾBMZkgЪzX~T^-־GeE<ɓtA,6dy\|a텘e#:Z0w[\^hz Y\&xgI nlE>ܡ%ƕۚnUƹ'zOђ+*fܨ>Y(j’lQGh ֺ `VKQ{&XH(Yh<&ゅԈWʬU!Xt,n..4Pnl~%jҌS#>*V))lªIIx^b,ZM1A Ve*͔(Z:ȭ=NaO$~GAr j  7~߹JŽA{8OClh13cχ̙ݭ-1@mi>mחaOXSf-VP*rU\ZL"dfqVk,-xBjzn&pƮT(!Sq%YfiD V`D KA ݔ0xIGl@HDP[E ZYyv%>1.#1Rhz>㣍OR+>M>PFPl֗eף*%0f[kv'Y})qZiXd6 7&$KIVJm0DBa  C4KA'O(H "@4m/oqRW)6'!ň 3{6e)wcW%Y}Nҝ4Tz"Zj%RM|/^ܽZ 7uѡXSc٧dV2(K"@kf@B' ((0h@`  c0@Dbǽg hihGh`6i6jilvkfvki6vvAlfnvv6ng6{$ ʎ COaC&p'0"TpwC0CUKV(0(|wgz慔E%,P^G788'/8Ǟ+Adٵ`EiE]l%$D%$$J}BY')Ґ|KYpM$ xCZ) /rM$Ƀ$>ȃS(?ǿ2꜋mU @(#l@CHPaÅ ,Hl„([i(b4* Fe4e҄Q́}@jrMeӷ/;5kF3(П@ 08%ھy\N!պkW_;lYgѦUm[[{֋}:ӤdN*X߿'.81bƊ d?5l34i:.)dbAL&MK(A ])zٲhiy[b`:o 4FͨKշױg׾{w[ܼ4`CZD(?~Ca22{ OhI.88Rfe>A$a ep''<ܧۇPL%I&5s#LbHbP1&s1:Le>S&.l8`"i 86$M0VkAhH|ڧ-EyqHk&*MOA ! -oD}@QI2h\ "ZD<=BH1oW_M@W B[l30P8ᦺCHFaƪvINbjUyޯz:5nګ/23' ʄL0O5<`l Js͍$$5m:5DE3e>R{yRJ5f@` #&5S`aahPre 8E7 8Rk5IBP}tSP IVGY r{O%c?1X3Ad3IrD4 $VI܋ZIu,r=bȐ"-C1L!e(0 4}Դ5IM|# k02 ofsgsrӜބ 1:8F3(a~@`7PޠLTCq.4rBQsUL'D-ч3(8)M $HI>1A - TMCr9b䀧=)A᱊P-4T췪$ 9NB {a QdIİ4@b B5Y&C{9ڀ"`gXJZzȊ!2&$%>}uMieeEe1+!mp`D*g,Yi!d(EJ[-8S:рl  (ZUG< ùPy2,Y.GCzV1WҬ 2b ٞbLo`pPI`p,/[\x"SPped>+PHE8>)fƪ&DCRO4Z?.fL$`$ *K"I&h2,DM9D~0 re\} +9Aqs+2,'sY SE+5}F8xdOD^j AF ƺ%^,,lSlO0&USo~o` aV"cE(Ub#a.T[ "Z GYA%4nl8 20WL1̋9繁#u*7*8WhtvPdzbJvo@Mnr8ĄG&gkXK*PPϸQAu\ TQ1S5nU+t_-WFNW Ü(BʪOrRaM/e*%qu2LXIa/L1Dr&D0`^F J(!@#C?H@P gB!f{Kj$` "c 0RLoY@,Tv@nT«n+o+,r V )*^FpdӬAԴpC0Pj!b\2͵-NIlQ^I<N#h)=ZQbeL%X13 *h#UF -”y|”@ /WFG>F' >B1)P5Ef֪%+޴ ʠNEh).hʉƩ)#"i*ҚjiQ#i]5젾į[`Ȋbҧ !m&hn&ԃ(j(#.<*(}5c~ J*M* D $ *[* ^jUË&j˜n2-Ϫ 'bGz$Bcd5jZf6xwAr0jpnF ! 3 c"f"3<$ X`:P0YS\T(IGd0dl$10hq$J I16)%5aj hв53 =%$ j #!#?#9`kī2 4΋AI϶/ Ca4ppjc(D3@'G(PS/U$ hqx!K&t/V7ƔM Z#BKdPw<S@a4P6Jq+ưV#2k"Dt`l4!z4%ypbKex@n(޲/6OLrr2 2ٴz3MʦCĶ?20 >QbYfm㹢LUxf TP;j dXN2H%3#4+ %V 49"9EG^Quupj ĘFLrrd7uG5pN'u8FdfN '؆mCnWuWg G1䮘;e VNK6c7cN-i4@L R0z` 9$rZ6B5pg[Wu])^:I9#RM{?Ά"∀B {j`sl6#>OV \c\m&pnbb+g59\{Vh^LlL;XĎN1|(?bQo /VdIrQh$PSrd&( *im%bl;hSfDЯ*H7dI5 Jn.D1c `aw@{&w9.uæ56ry "(i:"( `a6n$+ TqB^g7}ùƣVh2:R)1*~yIy7(R2A'G+X T€O7KqWa6 }7vgyF=f%v| u9ǷrUex}o F_H ζ3@VN.kCXk2 DOs&D#Ş`Og< g8ϢRx'Z+^kF,ZѴt7ĔoxÐlRrwm łp3GG)kxX.K69$ z#VAfpN3a9s}vwŏIxhCMUZ,Ej(u!Kh!.h Y򙩵ؠvhU'fnfVH"3tئ L&Q3D43a\/!:$3V4Zܐ3.! I @9RNRc3%KNB agzE0Uha%jHDjc$;Bc1% g¸!7'ꚾ՗}FUUXwe?7"j{T(cH|t>3~) h'%V|U V~>!"9J30#ȁ"R#A6m+5 7Kq-|,/<J=)2ɥ2) #(9Jz+ऺr<i¸~4l|5ZvU:)m!}fh+9"B5i!V!"-#42lNㄋ% 2(ܸ m3זW2MNHbjscEh\g9zVٗz$ [I쮌tn zг1ӯ:oAO&%b V${|o %gֆ)sb{Z/K$0"aB$㭭Ad8 (:$Rf% dܥ솒2-_VE.(86vb'b'h'ޖ&6 S%H*d*ݒ3?(};YG6GPsxꃃw@,mJT~CObh7 @[*r!u5 ?ER{h} ꫷Z=}Fo}ыV"E6o"KZܷQ$}0>RF2MoM6eŋӠ<4ҥL:} 5ԩTZ5֭\zj!CiRF#[Vƍ1èPnEv;FĻaDUY 1.SF2b2i)TfebNX8"I_K>:լ[j4/ېwAI3iȔp=p6p  ˿%^Y8>6#^1gR`fp0||ۻ?դ"(,7 p BcɥPGc]$ZsFFQvIXd2M5^4Bu[*b.c2Hc6ވc:c>dAYYC_UV͆`fo ]Dy9Qa'da Qr'&h2 &s ·gzg7Hb[]ovсցBA tn!4124d ē]_EӽP*kjkkk+lkl.l>l2:jh6GI$%Ρq1Q@Fnӱ.)(kfI}j}@+2a Cs q>3 s,w#Lq%2.<3 {3&=̲A'|3I׌J;HJj1dY ՗t%nCr5Fl`Z2 15yf=n]We%7wq88_dG9頛>g~ꕳ籋Ӿ9K۞ﺣ~l ԵoAb~qWdv!Xp7]F4VAչCp/fƳOr ` ? \5-H *0Ġ7VJ,&ڐsiyIYI&$nf!QaۺEn6!$ b̨ఌel4lEFR"86+f:"0q_,hF-kTc71ttch<^1z(qu.k$ ZVIDCLf|Tuȥ,#&Iܴ<"`&5gle*_JX2-eZ%/`R1Lb*vb(u7OEӤ拪٢j7qcM#T>70ՠ ఆt2|s> 4AL:UtԚd26IdF)O)*|UԹ?\ G5k)] I3&<1]iHkɒ-LST9)Qy:TԤ2*POTTG]NZU.*|= L>ހ5ijD]v-\\Czq]QV{_ 5lbؾ"篏=c Y>ȲdYjVͬa?{Y&$y]-m iֶͭo{ Vmls! @Cr0%ՐC)8R3wMY޴jSy՛^׊1|^/y[׾[Bx<`w pK[.p]ņ."孉\X,Np[bҖ  ]'DBK1䩌3sN]VKO"Y|]r(dGYz2&W9P2/ nZ32Rf"5s~L8YJ\Èqi|2 zЄ. D+za XT hjh"wuKIO4zB]as+b59jpժng}Zz׺5}-k`vmd#{ٹ>vNj@}8i;}6p{.7GLh iy5γd]Ozԝ~gEo¿v0r ;jTfB쑉3dΧfo][vsΜo(B/7qxcXc_t+g#[>꒗O+,ebYڳ2˯ϱdDBrR=6 I|E y6}|4Tb$ı?(X )@O\oŭWWTM2 >j VddTj(=THb<*T+ AS51%+|XtS j|,d3TJ{~no>.FC2@'=ڢsT1WnsWH"EHq9Dv9.lǾMvklllNNӾLM\N.? P2[RB- )%& |ei0Suuju3q}t{tOA7KGG mO&oLw%«3i|눺z,T=CLEub"kgc*-6:WbH]5 }f%D;c8,۹so(!)"F =,-iMߚ WŲ$*  cӑI3T>v0'CD&Ƭu鄡L.q@3$=.ןcb[0B /-g9%$!0[,? (|Uo0YIBZ; l>eiV/à \hp2}ћG!E$YI)6lLL&ňV ԲP0A Ÿ#>=6zOe AQ{xU+A 5EpjձYhUn{ )ڷ&5hP@ΝЭ>QˆjT=XOO*OC֫)žN&m)K +J<+*5/ˠDmE&*;|+Ď)QDmld-&k;ئKjҶ*%:<8R+襘&9`Cc"ZGڲrjK.pLH2ĞZfe\5u2ʯt IN}M1u@B4GQH0UWDD2M) C0FͶ4.*}U4a30Pu5.IJ*(Ќ6GzS4;9u]҃ {}rHP,J }k*-2UWST.$*6ؠ{M_`+ *̌$(aQQ3cG P^*]JS4MYXZ th*Mc}wkUxePyo?Sv`mGh”(VSg 7d8$-h/p I`kݧNP=vɻr+3PnDԪ o궊_$pqMn–M(%f]j.$.`h6|GLs>vwyX(aA3% }_iFB(; Rw7*Nb(cAm PŸ0Ԙ@UUZ)>J!YFb3`HjBjrre o2 a9Y2 # ^$˱>A_&(%D'e,c'W^e;EqDo+o9 8ccx.02|#-hL7H!"hEAPA$<Px+iy },B E.9Qgf# DQ9 %e)*,Q3ů[&KS8I+aYUY]hYOl@!ƃ.ns>ҐT5f$>I >9J3:dVأ : #4H9( 37h [>@Rv 'G0tp@#iDG(~T\Q 4>Pԣ"E4>j!8NF#GjK[Z<`5j%i}5Z|K ܔEAiDM}K-ӒÚ%,Mj>i@+heᤝ &c& 7>aF2)[@9|ШSF#=n!>a(Qve\U0ѐ.]@ *F&ٸ 2L4 nE KCpaḃbKKRYI"0YݓXŸ1/7[вB4Y^lA>P@)j#˦8<] О_8 p}ZɠK 'P1]3sTm&j0G!BHޒAIL)%t&KiJY]EJ`ꥨ 0xQ Xyo"]gJ/OUeۯ *t]Q~$̯!΁tͲGgESػfmD=yz#|&MP)22ex|patkN 4lnEV2m+:^Z4Е(ݦ '>(%Nm$9 uv4x.sdhNp3`~]җr`@HEhV\D#.jp{0jyCVzt`SuGOnrc%Ad&P KhU#C8H3N,%铓xdٺd!@`<sN F|pXQ CD4Ov4 ='Ϟy!rw0djxʇ%f7(8hwi9Orer*ẻr,p"CVGѐsAqL:&(zgb! 3}t=֛}4="˷%DZQtb03 (eXE$  ҨȑOحcS03"#eˁA0@+扡I{ -rP 6  ɚ''+4uɸA"Y}؄7銣jP0}hxb থ8 )Hgr;P$d;ո[):#H z9kpZɸAԙ@¯4PcAY&ўܚ918{:0FIUkU8 'i#k4IatX nbѧ`/;i.Ȏ(z1X9zE! ⱙqi?GJ2&@+ "sY4)AK  KCFPi _< qA+"sbq4WHR1EɡjnRo2dEhq bDLČdR S5zM-C8)T rb ReaE^)H$d4Jn"x=ةA9„"xsHA")=ĒI"I@![47@̗4bdLq[ ‰CTY&OFs 1¹g겻bMB]=!՛7зbO$=Ƙ$L4OD(k)=WçP8Ģ|ċY WBAH! EOR!LqO[L7r>JqPmĝQC3M\Pl*Bԫp;nQչxͳ8<EACSǼ1=! $0 SW+q!hMЄ48e O U|)N$yh@Fq9Ä+eʦ$,ѧ!Y ,MU ՛O,#cMVd]bg]VVP VPdmf%inVfWedVb0P(ld=jEVnWmU}VeV}WuWeO WcVdUe5װaײ Ձ5חPgT%U0Y T2moK 0hXͲҥiQ8 )Լ R\E 4HIH7xڨuڦ}Z}ڦmIگZZ-[=ۭکڲmZ ۶M۫m[U[۹Z[[Z [][۾uۮuZ}[Z4ڪ]\\\mZ5ۮ}IؒZU1QyYÉ}@:/ B\JD[eTC>̘:a8  4"9۴ y2_-A;H^H^H&o` ,zL=qI~M-BMT9G]ŋ. B19D!ɇS)EbiT;pH3sC=P<Պ SNN l ֘E졇"$4AD & 0SFM,A4]]UFR3+ԦȠG9Cs0\uPq9G˲BBϪ6NS/LDN ZOt=7&( ޓPbȉpkPn nKbbX҇[t8.QNKh"X\9;ac?U\e!QRID.?O,!DlQneM_(AD[6L)QB8N2j1uc>c>ل*1ȬDDhΦ5]hSPh W]؎&s _PiG`4}=RC~8OLɆiƘ@'f.j&"MT3N#>̺ݓM0:(lFH#q7NO+4nF՘LPk/lO?N7mR/6E KSQ"L>C3QcdNOey ]νh}۰I''or<54iN Tlu쑖>0H‘TmQ =!FcZ0 OV tgj:+ya npPdEzrAnM%V sJCCvEj=&ɒYx4I.>M +d5nFu>3v9+l'+vgZ}ŋI$' B<3 m=!XcD'3mC~k)j5^w,nO ߆pNT;8жA0iVx,H+BOvё >Ah̀b RBNOϐtFZAqQ mZ4pۧwzz4zzzG\4Wpi5ڙRk㙑,ŞjQwt&^Hpt9iYmJ6nv*ˏĤG3rP`Ju:EƸ2r3iM}[L(VXγPdiby|8 Jtof&U:s԰%L xvו.GkTѴtH ӯ#t@A XO2}ՋBE}S6@FXo>Lr%˖._Œ)sfJeє$)4ZJ#fy1ɂ %LTDVCZ} Q"E!MxE^^hUȯOFÈcTFU+0Aqb*QCcv$G*JU nO.!gzLT# : VVg]ֵU-6 춤X nJvl ĈQcT4C.=&Uzp*әfP4EZmr R"r*?}jIfkX9G_-`!8o)AA5e|҄5jTzh-["B%ar܈A@ympH}HqLdTl RI8oo0VJ$VX`>CaNOPACp]?W$oHxQU]U9߃9V!ZXz5X=ԇ_*Iz^UU(Zb_8C"癁p!x*½h9FlX+;byؠUڇVrVO(jz$.Qꈔҳ v:S(ĀIx~`hIh5Z 7,V cUyUM+wahVVfߘBYakԧEW|Z|W#x kG)RQE~ Uh5=ҭW} B`4dL&&uҥ7`]YaTyО^ʔ4p_4&~2giTk35^Zpdo"P1 ~;{^^놆<[==FHiYidFU揔Ue@$@>_O'% _!_4DbO4 PhNma7&%KҜncL SȌ#W]@WքWUDҸ"dQ,ZYq I#(1cR~t`|Od|V& "rOG#PbҨFA!RѸ4<1De 7HI )f#RY4r/ԘȢ"koj 7 1DEBp8hOljQTh׳i9 Me %]p-Y,VENFKQJM2FJkQD#[&"a1U0!l S%p M&rS6+8lb2#Ig432fS<4E٘'(KSGh<=(":RpĈ?;A~.\9d$d:E.*zAP8oFu%7\nzdG5oڣWqsU5L Q,R3(!1*KVEn/{9Hʿ q+_X'Ec.cJB3>΢B,@@ âN8=H&Mf 1P*̈D3q=ݑ\/ /Bؙ۫ҙ {hEئ)ߺ (^$|g$J5 GJoEl$uN~U_/NqBD*v҇PzH`Ў7$,jA^b׭8u>"o09zD'p @4n[e%cWi A˄BfhUr6x9ζVTN_ L}]'ި@te"( :]Wk9;5FBAiR-gqYW\dW? u'=z+ujNi| lԨ8"MЂy"E̽4;FlQ)dO䟶\j}ښj.5ή_y^ >KU%WBz|doc4!8'^qK%~< 1nrkƐ1:&:҅Qy:fl ezhBD¢rc٘}m)\kr` K}ycDX7IXP=I?Aw=G6Y2>w9x\(E/Mdbֻmosl H2,I\ԡhK[+<: TjA=XIl\fɁv $Kda #%`Ta{>o xw?yۿ~#wyԃ&VtcL΅,uUc[iDVFC9}0KymHΝKh5GQMp`Nh(ŢY)@ @(TDU@V!UOWAI;  [La TA@D0]ʄ曦)WLh> JB4}u)XI2pQl8Ac?@$dd($A@dD:MN@*]Ke،jl5 F I-mHtHrгQ4ML3 /V%Mў8PDhĐDCx1ElAC@C4D!>lGFc ɀ%V@WƔ͇Ȟƈ T"%ѿ2)BK0D@"!£)0B(@C;D"A4hCx*SzgS̀%;D#D4TA9c4$>C4*]Bh4*_F>$ ̅cF|yI䈷lF\qVy,T,[ NT $EN MvF׍ bQ}tTaT8`,:̈́ŤPڋ0 O]WP}^'#}sNh~y:9U0\ M@=$.22|BecLB֡i:&F`] <2B!j!jzSE`:ke|^x_(8R)![ iLP &P܍ތ||Ƅ})m0Ma`7!ʴDϜ4h@oh1 k O^ٗYD]G0 *=ABa24g2xBb(M)ix~b܄Dhl$` &<@ber(ƊP' s`p \:θmP1Wia옜0k4,fv+ ]CFcTY4| mm&% Lp 뉘1$h7lF|BC!҃dB]GFM$MDKF)"ā2lA"z<<5"*cnBGrʰ*1ư HNWLȮ~B˻Dl= .YHΗgv uP-e Br-vK-Jb0Z*e t n,-u$Hҡ>a4Į<*4B 2,Fa!;2lCS"A"/ Mg4Cb"l(DNh^"Fb2.M,l`HHmL ה*FDȔ$>oPGyJWLIŒN0RDs͟㞄` l@F dhڪJ7qj UQ`]ޡ_>C`p4BDn 2/!!ݣF "02@A2@-ˀȬ G_FS&O>&"U(X$̰mE\)͡leG&h@4 Jv=υ{|D j S8V  dpp2,fH6JO1P=ӁwYl{3!B^2! T.2!OϝM R .Sfe(s4Y :ߕ&z @<6>ÉOCހFob0G߆fHk `X̧ 0N_P}J) )]O_QCuOC5?.3=VL)O^L4޽j1vUk[q}􇣽ȠQs%1A UªR (-4uov|rބB= }< Y!b4ݧ `DשLܵG=C c2JaӤ1pnvltp_8_z1wRtobjǟAH'F)($ժ rF[5ȋ$5A &\җHj M a*CǷ!ݔK) zD[p5 QщDٹO_pG8j2.R 6S+a w)sTttxq E䜎 ͔ Qqf1Ȱ ?go(B1fΓoC$ '?Ĺ^Nf!\ Rm̘% QTV9vjV|p'`4jhD/zޞ;{lϠ6O{Gxǻ{6"HQ≐ֳ^U~I /v$1h[ 11(N2-qf|N4E|ߜ7.SA y_s5r5Np`e]M${G'"1}7=+} =W"R==ӓӋ=k}?cث}#V;Y20GtO ߌ w'U>Gn:BU֕<_Ӂ$W0u=s7=OiOM`6J{~~gc}է`Jm[;:็=c~U<:9M PAemI2KPNTy<*ϋa %.>eыz-XeWQ}!ܷ#Ņ nԷŊ9֋v -+B3Y"CR羓:/<fš]ffJD'jU[Ӽ+Wj6YXr͙j4r+lެf^+vk^5ljLxѥJ KvJѠϦ 5,B3+dJh)#i4]OA91N[ n} .ghC7Ta9-8xƅKzwqw1#ۤ' #\p>|B,Jѳ$ 5\P! d @̥(+0BB 1<'J:N<ɲ.h%j :TĈ"l) )%ei5M&AÀ}BeM b/'%n* N>zv83i^j7(LN4o!'=R*sl:&&3\?(3|;8'D{-.}p*R20BK|%8KW"#*M˼S&*۬ƒLU5\$L6Bkd݆H(X%7`M9| T 3>"X%۩#z&wJL `QݓBHB &Jzq/(9m)wԳK7Ptl35ϥc`|ƎoH n`:e"Gi㞃+|L1ŠH4yԞ9I#czQCJedUQ "pGنS~U mt{Jntۗ wGw$<&W=$ ;&r nJZ曏з%]'{2M/,*)NwnU5b-4fPB'_GDBLaZ艄(jbfI) =鞮|]kp#Wgl%z'oDK]橒 p{.ߠ X8Ru70H~jq +]Ǹ] ;jhdf-2.9/docs/hdfview/UsersGuide/images/dataset_subset_example2.gif0000755000175000017500000036064712050301073026401 0ustar sylvestresylvestreGIF89a#3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,#H*\ȰÇ#JHŋ3jȱǏ CI4jPle)4.aʤi˘3klsP:$М@"z)եPb-)WVzmZ5kשbў ,Xe%ثwӲ}+.^|w/ap"- 69pč-/rÒ/?hP}'׮aG[f6ֹ{n޿{7.|6ǕK|إ'zoѓog^u讵m/wȽ~|ם}q'_=ٗ wI|)"!߈Zx"})"% Ú@iKݴ=H>;գl샓MM4VK$k1y$jJ>NB)eUYd$]OF V%jno)>&~Iej&MƩhW()朋 z{z٧Rjy>*jZfiIʊ骚)+Nꩱ *zl(2iNzlfl&[.r;R뮐U&@D6kD* m˚m[J/Up!|p CL00 n1_,r [1,G <l21//=l0(<4|rB-K4 ;uFYݴ0'`u>'Mhwsʹ]*7u/-x:/7O + 9 Dj `z`ҀS=mXyU7us6^;?.ذ~^|3ϞG=Co]{>Dѯ_>˿߯?{?cw90~ g.v @tHZCTEt'L$08! w8Cڰ9"sC"Ј:wXD&.QI "D(RRtb+nYE2h<F.эm#(:bw 2>ҭi H@!C*PA&R1dЧ95@t`"PυӤ*WV򕰌,gIZ̥.w^ &-Lc69?j Ĕ1Mgj4k~7x$XEN {"$w%C'=Lqt0UJ>c81,(x1}XJvr +QN2\e&FF.r4eJJ]uTC4I$wP T(J~ BڼwAl 4@mP󱅕Fx;nnLH'{#1R;y}}y@w ^ 5CppU8AUq|k&å]`gW WVC~&oؿN(Q ?dYړvfq0ewVn83[K*( ')Lm.Q\CbMFNq^8D#4VUdF.k(tG͑e Ho{Se䣽5F;<6h2n. .L#=̧MC[޿ g^O vS  (SbP}Ħz0 R%jƕg" g(5l3@Wh5~Uh9 k}A^WwFg/`'i4h 6x9zElY``[w S!uO% [\06{-ZV~}SDY:Sg#BPgX\HF&8Q!w70K&+q#X rFAOR(艑hX8XHA6nP2gA0G(ͧ$]yǘ7 z7%-$ @R^P!^ E~u&%] : 1A'V|`&Pb i&Z g^mw/  (T$u Ǝ01" Xpg"S@f5~qynmgu&{Y7SzU0 %|\Z&g^0aW')o'apl9AŐNZ DTaTYQ2) t60s^T}nvmT2f:8t(~JRג[PaU}b75n)yٗљ09y-Qxיx㚥əOgٚy)Ț)^28#b }zY͇I7g-Xyi$5Q:|TJ}m!Sэiq{w2 ``~v멐, U`{Pz!'x @j('r)9ov31ˠ\ 3{QZb1P0w m u[2.y&9 V*9!]x 87SF m m :e} Аsl"or-A{ʰ'm^vMJ9(ˀ0 90Q XBd: ;*?6:PПɗ X<ePc81JCǣ 3Tٍj"ֹi|+$jP}z$xº/d*]ú GʊZ}+ $͚ *]jӚLҜY%f]-j$trXyϸ *BOBT)i&@6!jZ1m إvy !d /1Y:Q{Z(V:+ 9P+%-ơ! igQظ 9B 8'71F 3v*j\?@ZP vi:H6]` :J-! wuZ}pv jpP" 0^0·[oy}v^ʓ&p{g9yۦ| Upu$15GmR ⴿQ}ע2a kЙi)ѽ軱[۽ I1y@q*ƾ 7's& A*ʜ tv$3OHj`83AOӨg0 ӫ}u 8 ׆Zx&rfI^ n0m$h|50| <K|hL*U 0էpWlHk-ڞe6 f> |gJfm!Z99@mW+P\ye PZ 2oؼ^> wKU  )"{;"vo,~N>:Ч_ l`p2ȟ[{Q м1:0{\@ B`z&T,rȕ\ͫV? j`2QzI|,|L91   ˱K g,*!d \ N\^<= be^~fh@0+HzONysf{~\p<-_^+|؀bKfNZ2od|[ cI|~~M.֎ٮێ.ʮMg%t/Z@&1XV T s^/mYfn%wug>Z5Ol mէ8?"^芮Om8"+XNP0?@9Oa\lz-r/G&s߲q߶wOJOm+q/&}]R;GJO*OZYYtJ JN/J~[_CendN>hNL^+帯/奔į<>H> h^_LӮЅ^ƞlٲ41F .,`ÁJTX1!Ef8ѣƑC", t2h3-x3&̅2CSF<_œӨQe:L*S)TTJәM\Z\{6 VhLu+j\: Sv*-u`f JU DWϴ j`PVktgulZnG&zطr7m *aP7#Vvʥ41@!T%pܔ?o?O)?uKнˏ@> |<*|о@<+AK/=ͿZ4oD ,5QBPRqHD-o pX$1jO 5RcFjRAػ!u OtHd-q&eoLl1:OtIF}"3߂EI4N$1FHRESNU;ttPVW3VWeQe/D|4P@*n(/McX,Xd]degbZj6fBn[bť6[hVt-6l5W]q}[l{-\kU}e_Ew݂ᄕ_f#~ڊem Vb/Xc-yag?v9_kn`G~Y|aN䟇5.}F:ifiF:4ސ: LΤj6j&lF;mfm߆;n离n;o̽מde'zh'}Az};s&|s?=t;t&b~;]g: z\rɕ٧_&y }Ҁ}rWs^iқ7ViFz{igug7է>v⯇}{(= ЀHC8&m3p4 k(h9~8i ,6@pz|Hp|! l6z,!|DQ~+ ω#`E$.M b(>0ЌdDؼIlTaX WA΂'2i `}k qx/d GΒ)W8?D+G 򱂒$+' pLjpxQ.,0W9я!Xֲ0'8В(T-w[ Џ4e0/HC$:M\eD2 ,YQ$!t/Y8|pdMJf3‰ҳ5hH)@8vhD9΃2m'I=} 9a<$V9q' YrFc&O 2ՐK +Q}4+LuliaMCJq#RzH҅rrk $֦u4D& AVpdX Îհ\'ɲӗGYlfWe4bV *jݡdJVְzݭe׼2o+~u=o2K6)W;7H vx__VΏceUj<5iӨ҈46W'"1#]iE29'j:nvGf<1I7*/[Ә(cYDNU"EX>8[5&~HC혾qDy#;bnp,+dHWŪ ٩Y+NE7 QmTs[ϒ}R%(S4 K8/L|ZњL-mOC.q;T괬RI3{iOhj䪕ƽQB2s uK+S UpXβV^yvei뙎6%7k}Ak&dJVө(;k{1LIRUuJBa@b{^3o_ s{]Rm8 9w{eC.Z6K=9Zye(.n q6h2£15 *Ɏele ^uuQ4jwCz [O8|1Ņ-8ݓ]S軶 TxeϷ-s FinחpK\◪n(%K񜥽~D+=T?6 Yg ;[=qowa^U\u+]%a^EjݗiW?bϾǞ|?鏼!_}~; ?m; PتAEXpȁEb ;@° 9yʣF*}*35"6b918Byy5HK>r|+&CāK-JG>>l>>$7 J}|8 ܹGb+"1D_RsSʿ:;Gc%L6hl ?c#C{A#$?{\;d JAIGcGފI<4,:x8F_l ʙ T],F¤hdܠh@e?X%0Ѻ "lI/x$6J$>⤙+7k͆"H2L{&,81?VIMv6pI +@9+L˰r653$%P>dN ڴ*H_7x\O}†/^ç>xJ + H$V5'ԩ9F|7~(,l04.gk"<(Pœؼ6t<ɺBǏPBN8E4BCBcyGBJHJS5- &z Qg|P؇c }؅ H K7GB=UD%ۣaZa6Z5] _]A #[ &Ө]ױD%V5&uV3$b_uX Zh=R߉U exT'izM0MI]M`mܮV X`^qT` ]dBWε`I`(fXpqm\)Vڬe\a^5Ny_FeVvfz`[=[?vZLalvO~5N``粅]'bfufI`fJ&bH'e.v:eeŚ8LM؇Hz8SpR,E-EhEg^ BSSɡXdavvf _ eT hvT#֞]ieVj Vji}n[njcuܦ~uj͜Fj[%jfziܙkJa`fPjk~Z{&geٽ u3eƆ\Ԙ^瞚]lSp/^p@]4p@ĀgH4h]ّe0dS ։n ]mjǦ^.kiٯqqTjg|jnjnnņ黲ecNz;[YlFbk^kkzgn~n>o6gempdVpnlP&-ڧEXtJngY7ihi?mƁH_oFqfq%ep:/r."U>o!W_Vrr ~r)r.^rr.WHVG.8r6=Gqas@/3Or&/oVr)wj?;wt6sf<>IKtJtNGqLtPLM'u)vE"os v/u28mG2S핖BC6id:/R\/q.Bt3tFuj7uks&t;G5und v1t3H'kRo* _[Zw/Uiywfjd?qGxQgw7xNp~Mw-sCw/XM*XB^qSciД=ltwmrwyn_.Ox>tlٚ/[%_oxz'xh??xzFwl&w0xxG{O{o`3u0Gnmt$p$e`SmXd|H{>Xug|wx)zugzǦ.z0gu[ovr:|e%7uŇ2O}WeoZh>;Ky wgoN֟yztwGnuϻ}nϝ*gk~Y&|o{?~'7tԇ~w~.0vfe ԷLAz TVZ=eBTpYŅI,xpB#be 9F41Dh!Ŝ )y"4J$qhM5(ԨRNu, lj# *H׈ZF 6lȐ׆8'qÚ*Ɲ Uvɥ]-+:|6*LH96-jU)ƈ=df*?bJn (mrym={>-X5o7hsVw=pjЯFO=:6v(Ev ^ĸOk,?+Wv_P)gs%N=]1F} y(nBѶ[IuTVE! \h)I(ɸ h@иL(Nx"H>QD-dew-ėP-fuN=DP+fR$PEbE9DFy")>n-)OAzIZM^|EG ]K ApaNtVkm Vs ("jd:ģXGA"+JHSO9HVs{ԤyC*qt$(%)GP:R}t5xNpqĦ?# [lf1_Oa*|kIAn)'$I)GJ3$u]z?vh;~=Z|!I-'9QKrR=5?{2;s7}Qq>UT6Z{߹ѧ^/oOuc:͟#?~έ__٧~~7!_>Ql#E|],ĖÖ@>@ʌBnIG>$,^Ɲ)佝 6ܥ `_1] `رMe^U^!!`:. R&a๔ܓR5S,Q0111#I7I@!y%zN"Ο r$F.%"1"؁"*z_'$`&*"$v".",Ң-MzaĜViU^(F#=RAFRU(j*zV # #% ʟb%E#>"?).0v=c"~b,:* 8$0CjCwu^T5}TA=^R$64dD38=^22R8EcDR# vZ#&%dfea.V^f>.$Vd(0j%fah:J%f&R:e*UnP.fAD&@cgn,YnT` !#a*s֓)_V%٥AbCeAbd 2fB[ei:ogV""xU>[nZc֧{r/N^~V}(do&h{{>dW $F>eKJj_.'^RRtZZ'I!s&&8g&l6emAf傲gX#Z}'$:Zʟc芺~h=jQ[zQ2%C*@vf|Fbhg3 =.!NGZJKVgu"gH!M&hO"n'*jdh)g.i&gdZiQ*)j^b獮V&T~fg9F*BVeO'w$n&V\uRIS&Iʒt&jb)+2R^fu%'hji&e^h.)yNig*f:eBY)zeRڣ"O,j)Qu5+7uR (u.*I7qjA)QNf.k%+1lZ妊ACj66Ūq[BlR吞*Q,B**J f3(Jʫ]V' i=jR!vg&&V+:il)JczEvml؆,Ӗ'@Bj֊kb*վŦmb+ڨ`La lHhuqfh2be.9C.6v,jk(hjeت6ib-|'i^,zή6hDnBb,^nЙ1<dt.2/*.a!Ѯy a#v,ܶ庮yJ)oj*&m,cg.d Y ]J>-"6niѾ6)a)Y#=hC*/n..h,^%efrj{dn2r--6dz&/rm2n2oN.R7%seʯ, 6f2)bn{'[*ڶȞ/Rh^Ʊ܊/kWo45Qg(ItlZ*%1IJ-Ev&bld>k2-q oئn݊.0 2"rێj>Loωr]*4ʑDxS=Q/!,:c=Y1 R-rQRi!n ^)/5,jip_>/i>e9RV.b2-Vӧ62/2W{4)4RX5'"o70Y)t^;Cvrުo!/0G on/2t<.f KN5.qg2j†-T%;-A\>Jnp֥Mtb(4aB/,۬+qk+,HWt.1E7hݦޮ&Wg=3GtU s@_RI kl&̶m ZmǶkok6l6lCqq7r'r/7s7s+=tO7uWu_7vgvo7wwww1Z`yεz7{{7|Ƿ|7}׷}7~~7788'/87?xusYyEN^BQc?YJIh)TE.U0%-3RKaRADݑA͡x'}23/0i$RQ0%9. ɒ/98!, S'S199B9R6;94e9979$qR0QӋc9W' :x y!Hӏyx5x#R'E&oHy&e(y28 IqT5U: 3T[ccsӑ 2zIy敕l8;39oszONVN{^+1[%~T169#RqKoaC,\a;_Dya#Q) fr^fIJ_Q;s-'v0K6^BR6u(;J2{#_&s91;!Ss{ϓ3ɇ2{RSa2;a Y|-φյK?};;#<׃Gg$ǤS{*c5eҼ5;-&'#j2dIN,6,-2*>RS+!6I&I~d"SI.s9*#M0~w&*(QGs3C R <,2E>/5+!~IʪG<;c^c͓4#Dɪ&T߾ a???!^8W?@Ћ^4z LOh*oe'V8pE փFZ=8J4q`Fh̃#;bI,{'cC0ϥ'+$i$Nd8SMlFh= R${0Ƶ<C4&|6ZNZ9lɸ+l2^qqZ #볜>À{0n̓!+2[uID+LxhΆ!pӢ'Umjɴ)]m1X;gk&x'_y(Z9bY'>M=t /;R$bJ3h5rJ. 7+B4cбP,ŃFd:K>Sк(\6>L0)R4ik#c)+Jjl!+;hʃ"K1wډ(ʉ'0 /4i)11\|R5 2)SЏTQ?K8-BhѨ%@w4*O(O;M>S#0u!-E;UTM WB3*QL4.>V(XYtJ֝FuمBm)9 %<UQa]](Rom wVT5UuPV<*'sߌRb\s9\V,}%}P+5VBzhbDb$?h&Q(. K$d D51 <,IeR|!=኱ je+=cb$1eNQfꛣf˦k ls*鲷qkx字# i":2OYH=?c/s9DZ&1l%p$|;tCjFh qv뮘Tt!iL ?)"$=;ʤ*mh'/_d~PbdZ}7[H?6^V{g)$%LTԷbrާA,("^owA p~3($ z[-Ot/j{#{9QK4$Ѕ{4ł_ WBMX2<8^~Kh|@BF ZхS H?J\mH ^ऑz/Hh5" $6A01BᆅUfRD\_,HJDM* bP&cބ({LU 1FwiV}G9BāoJ2Bi?SUnW2ʜ3ht˨t8Zp&aijWհUe+XzVuee[:V5_]JVU|ݫZJa Ħ+cvU+ V.+`?v,h3KZr֫`mh-ZMiEV-n_[M]VZR]yCW'J7ixu'IT7].vr}vPNv;W{w]n}ݰX+`8uJ=0z54BxO a *x 7?̅wӧ0Sj;'`4ݮ7U_ &+[Tc'}Jtԯtg&\8Tו6AKKpX UWi(a`*W tL=iqXu9o(fiEi% ޼/Qs?cvʜ[*<3҂ N z=hN&5Aq"Aa R:j ,qMIS`qOXS<|1o L専u@ǖ4PX\UyڎAo_84ZZY4|󐺯" xXCXA7V/OhUIO HnO%tF8m;兔!?lSv($3 ߸NLbY`%Ox2R_Z:kJ/VfO~8ZG'&[];[/͘N!&aR6mѧ-<[nB;{UEV|Kա쒊ʻciyM(o4AAW)DfuƵ>FBi5>IVӱ,Q"5rmu.1JbXD#$Wa~fڗ *B6Yoqb6&J0MgR$,C*o(r3UYVvV5\l;izPO酲pjϮX{!mYPSR}sk$z^LZU}%¤ݻviȁ<.$p3 QqC)J<29& ޡQՠ T/r]ҏh?(;~&>L͈Ǐ(vk}>-ӟo&WxPjt=*}@5КQǫ5ݜy%Z[ϵE;kON=PY߬4n`m, Pyr~ꪶj#E+ |~= _@'A3)* >Jg˨ 3z^׵TM~ yMS5!:k֓92IXAqNыWqcv԰^:B_Ҿ?B!? \:` ͋4i65jbhR3)>b>qMƵ+WĒi"6LXj3)4L,ii{vYj7.j {3Ō;~ 9dZ'[9ʚ;{,ђ9>}:tE2Kv0Ĕw{!ƑL *_&ysP)S$hE TLף/}IRQslpeU4fG/=q+I We'jy5eE`ɼ[s2sv_`I2 fX%jRXZ$fh_iZ&cو#fhȣd4$cb%p5drϭCNISxH=]sJ1dR&iN+IyPrO}IPRgBIEE4Fi)\~_R DN%!DH7UU[sՅ"nׂhqXX@*eץ!_(e! A*EA>Ɛ+AJVٰ2,KZbjѨ+5-AlU\o gjќ3eM2ST!GB%ɧk6o=qy}U*Jdy&M Q)Up=ISVkTRGg[EiHZx!U~)X!ʌ _ebZ->+ %j.zYhaMh_l/&Oskd :~y[{P %Bw/T/CATnlҥ r>`Z1})T>*jeɛQe VZ=]X>-tB3XP"6ևOcxb/263Fg>Y#Я>]Z 'ҰOl$6 kIޓ4lcYM*R%j7Z ux):H.'5KÌw9$JRi0_I!O^#%G!!qB/@V"YlibaP"}bESΈEPgb&1XD"Hư )G؏ _$H@6f#AHE2; 'Št k"u8ZXQ%kJy2x<#;d$1D1ׅEȗPua verLqhKQ% VG.>+fՃ2Ey0a[&>t|ڢ@q€}h| FL+t'-2c$]q! F?b;-IA5$wuɚJɰԘ,Tk^,*֑ʚPUMҖV2˅\.^&{N3*+©m-nAQD!m"UEjA_]lƘ6pv(A`C,T1$Iy!5,#-yIf,LuPc/%ЦKI:B3rEN&/AIsܽD&jW仜,qHHܮO$[Z*0&bNBl5g9ף{4oNlن,8Gu,czQAp`!8Im5lC9p wAcrROӑ4ؐ,s)~ܳ[fJ+s_1IֽWJ1Yɫ~Fx:˜ɞvl#5Œ7-_ШҐ4WVdkhEK?v@ 1Z6}_B+=Y۟cb5TcPqR!T$-0$^j97$B58$`*2' W;J#meZB"%\e(o..>+{9obj/dSu'N͌ۇt5ؔ zJJf9؍,k`&;MF)QFUT77#FyNWm^jVP:zib) (Vq^YgO>[FZ #}c$PxvNhİnKnϵbk Դ bmTD}]{u5:YA|ƼJoy-/|9r[0bA+W2SBaU!/FW {Q3& uّu{p< %2FlCBJ!&; 9KxF9\?vcQd*1cVx::&$9V8f/$ad'O(CSFW 2"tG!(^$ šNz%uR7ߥo)P]gL9Oy#}TU䔯bcNDS]bRi3\ه2 A;Ts;4/NKK:!G%hM:lYL]&mӃYf)\ [)>+hFc3puGG __JHoTXRopn2+">ix4 (D2+U8:FZA)Fh09k0c<1Dr)l~~'dɵ8CkWAz0 teO7> N" 2"S3>Uw>B7>x5* GmS hlo1*Fy`D8+@0q6EAd;{c!cDH3'dF;I2wFkeOegJ!<ei/lW^yBM52 lzfu4]v*#a_ЭHs4p*.@`*?ZYO:XQ ɶZ|RK~AQZp Hk:kSuLNU pr49s,~B7fUffm&3vB锛gW66гѳ?;hG"TuH2#p I>khg$u%EH[eR6LCVj`RJECXs)֔&;~0"jsXL%AC(tk"W%Gl5azQn|Uzfa)ڒ4Sg ! q`PKpb"JPPEH[+Q kfXQA֒("% $ {CqT0UqB{AA$ҔS$Sִ;1F &(GjL!9e/1#y 35Me=efڲaV[ *Fr>@Y%h !h{,Y lf$YgP?h.>伶c2%^j`"1ŧ9傆d:P 13sR}kwxa(6&EcbRTY5 e楠eF 3uk4a gf{V*p^:,u\*0[HZ! Fu!FgoHuqrZd~Ox`#}F)9<gQBDz:x~SzR+%ݦb4ifOHz{ -+@1}G` VS.#VKgl,<;<%&gBB S(0yjCK;LhubS/ܩ&'krUKC2d;<3fmiupEzs.[X9Z֖%CGLC&9cCCTD eݰǩ$ s[xU&|:V-sR0zR9s?$^ܿ/ _.m> <ERt`,+ q{}{y{]vZU&}Pգ)Iۑ9{K jCf SDD1J)%gbRD$ SJۖJִlX8H((j΀()=j;[bCgB:&ZJiU\ WƗEk,JLGMtmhZUYwhnXe8f>6 臣qnsފprtXhy燮(Nu~N显^Nx~nnNn.Xh뗎ԜLMEEZya}w%=IMВ F'Τ`kS$&ќkJ~jBKaJY `x/k<&1gr2.Ř8.1O@7)ԥY.DRal3Ra+XURQʬm< -Oav_)`c`B͑*&L-dB$YwPA;SSt×2ڤ8UZsR@fBw7Ń2[BDjзKRFe73-̶|mk"m9w،I9Y'HExqm-=2 je_d{uZП-SpP-rBP=}+L)N"d|CYw:T [ h^B} GϠ>"Fań FCRFH!EZd1aLU|IA:T&&5#LS=ͤSXFUjE'bh՚-[v[,ݷ+>y J_&\ ^f1uM,/GǙ5F<͡E獼>C~]:3sBcKchѡG9ܙE'/&q i|a!G}W0M􉰤2|&M9[";P#Pzca@F +Bbɰ 5C 50HC1 Sl²d FNl15 Fҧd!< ̌t20$L.z(glJ#'PډjN?$h!X!䳎"=;(꒣I!@4:z;2")"l3&:\ hzZ'IcAb ö:V q%+ #0J2֫jddէlPÞ6Z'|ƈ$Gqq 5o/vX540®<|҃#dk%4% 䎢[xDC.G?(Y%3x< ZƼ%zoE+QɹbeaseCfEbHc+RzE[0ç2'8Yd}Eq/m e-r/ތﴥR]C"}lrP3dɽJ_AcF)^=kZ NCU#=:zolґλj?IIьџQ𨢖+brj*ej1$ =̊YɄ.☇pO1pdui U*k8|_^2.h2`eOB*um.wK8< yƻ]K>*d;a 33@gjT|xċp$)yC ':4IQn|Ћ\ۊbFc+c~Pp`cH21cr/I:LA̓*DbsX(*:5D_DIm.R0=M/$[+/=/w8]O<@!TGF,&< c{H8kVՔa0jʱ>>%0G=sh]''P,` ;fL!i v&zH#2{>֟,g΄)htYYi;Lo3۔N>YHJYԊA5V-- Uy8QjǬ|MSvlւ_Ǿ]${ kxR\Wfd1Lj342'1bc)J7$OQYBl@sRi2&lr1Tީ0u>YPJy( !Hh,hQR>s!ZVe|J2dXQz ^TѨ²s2O~87PFOw38Le"tTֶzz @e G))!S& 0-G $#}q?r}bYM2Whm+Ud4_?"HJ.L! J>JURLIcв稊Iz aHUNvGSf&e,YL 9Sml5+XUtysǫ7vAs4biJW:ӓR@7\[t-jJL{Y=W%լ>́ LޙecStZZ(Qr$(J(ٮkC:25[ac$Af:ͨ'a)ɡ4Q~J_-#|{oO+eߗw%o~~D0 4x8*^q;|x+G8KWgy[r[E򍫜oq<@׹mq#IGћt]8gΟnr[UGE{]1z>v]Qz'n_# Fr:7{G>)})6LaNI.EL%[᥾cLe|^v g"|=t2(hT=Xө_5](~֪CB)*OR7Ӆ=bQT}M6M٪+, v v-JQoXfaAՏNiV!2(X8uCXnb=pW3@V=)Xss6S.ؽS22>x442A%Q!Lዘ?QaJ5LY7&|S^y#]ڊ\&t pZ=|=U$}P'Ө27k Lk += 8-(&EcVb!)8cC1a%=ئ Q15BZ+ O3E@'#Er/[t9 _|([EaX6ҧ}b,JE32a;`05)"=ɞ[*l"!ehkDn?2`7 Md)O-"0Z B^ѕ\B[QX8B%‡T #F*ɏD2'HzB/JrI p/XĪ=GK!0zv=[2ӔӢ 7=;B 0⸩ԶFi*"4D#:tѱ[c+ */$a@L%[ ʜrǹL@Em %k SN`Ur bM1򺱦'_֒5|z -hHL \RA (|!e5WRء/؃ ;D]])[㥤RH-sE=4J>-j^pUxSȪ܅##BRdɱ2#YE #$h eM,[re,ƴ_r ,uZn*bFmǒާ%ԛ);8)WڳJH εP1 + y:\C/C-RB,Q2+%:QM{5?ɍ2rPr  ,5&S&^0[?I4.ܱ1-%NK+%Wd=TTU~Vf2i䬖`@T9\n:THT0іUޭ%ܨZ]F Nڤcv!pX1T#N3烻O4Pu6}۴xôOzI-,gszZݳ h>DNc:gAqL8/2[DUޠJ^O]ZXE` UMP 8igFgz8~7Ꜯi#9KKcsj۹˺jSjjj9j[{jNk~9s:9 ;kkk>kkl&.lƃD>?;lhKuc3^;(ZK쭥!%*jԏ)a2, ʲJցںM~bXbT4@%*@^Q;` Jmc d@{dnDߝ!ZP%^Fm1]!C'P% 9{e%Cp$SbƱh}&bdN-pCԔ^ $ /a"ЉO؀WrAShCJBQ1bzAy> BYa'%DOP0U`J&t(Xn%rb5ciBp؉ Ho*f-m;KF!K Xllc1<KC[^EMѪITe0`T9E4J#ëoFe`īSPfdU u,d]ǁe6[2|1?)A̹Xq TbeCGBR(*cQ"kn w7x4ab/$rRE ^*Hȵ`BEeIAr ?mU@IIJuD ) .ts?tQ"6ZF!s+3A+p)) .)FDc%I71dU .ҵ_Pܒu5zV,{kBI<{@ΏǺc61+@EIs峝 zmoʜM]"nΒTV;LmRM>U"qNvWZ)08$}} `jY>R`u͋ ~w/eI{?+= q[||`eA/_ʔڜ[焩ø;%3XOپAO50@Ii1e>KV1F;Ha1(C.[)2&̎5I,OP:ѷ(΢F"MtiRI:o^S;Yeu+צO1ѺMiART+wnIO-#Y~Ѧ)H/Z}ۗp=nM_Dpa1GfƎ3e ,-p0셯 MX2cʘ&Hеd 6Ț2=玾SAc;x ]|pٖ|zre ch%1޿#~2 #HL B_FiV;|ePoRsa_FB'"a(¨":]FApaU;2x㉒4'Yb…ܑ1eiy9AGiQ[g'cҥB)pwZhQq q)lF2iz飥hV.Cޕ^gu$5&iTGuJLd"ƦlҦqʪMjSv ?Ők "[bDR%N>YUj+>"<ŋʅFaIʛy"fby`ȱGڛYcYteAY%ŹqT20siמ{'qnn艙f{81MʨJ2ܜ3Λl(Ĩj}6$4# e"~U:HW5Y`%6ZvZ9^>3ns5 A 3»myYqvѡlhw[g5@ԅZv%ffMkw|{Fg? o>ruޛɦoĄ{0fϥ+{~~:i1pKI&Y"m[<9w?dґeJBL["scZD$*IGwΤ$7GNPu{Rr"9a3Y(AnZ#EU8ܤ).3bj|K|'tfi|p)ePh1)OIQ_F(zYUt(H9JQ̢]ZRZLBӚ&% ,4%/js{<Â̮^c寇3D&,4!aBUÞ5ONeXB3;LӷS]]) kGcvK]H/R,HKR}-$0 4H" lf1ςhCKӚ6mf[kY^CgA1x-fqYݢm+\gZZVgǰYRmmv]v׺e/Fvnnk{uoo\Ef?VEC#@k7v/`7h gVPD?dH.WK䑗"&TPc@3 6RvsJ}ga.o̹QIɧk p*r\!Q}RlVwe,h^79KR@H8xۓgӂtIݧ6Mډф}cf\=Aub:fv⒥xd/HՅ-ILl5-쩂 ST96mz&rKӆVBv ICC/$ʼnD[qq=~{!LpԽb$I>24̥ፉ8e NӃ+>S! 4>z =Գ ŏrĨ,pGN 7@nrxށbP_+cv8y#^$Vjozf =OOEV ^I?W{VrzmD _/GL2 N}W<2o! ~]Q};yՓoo_o_5G Ǿn_u\pۭaj q1 )yk }[ڥ` _-߾ 1[rI `. >-@ݟa>!j!^U `C@|PDRR!!` u_!e!aI_ ^ p U^fb b"r&z"# VIqb]+("# (+z]">!"Bc)b2c%#3"1# # G4R _3&$:2b6n#: _u\c: i"8:#5!Fc."ƽI!5(R]")C6c^"? $+-$-dba-#_" A2#*Rc V@E"J#@"ac.#K\5Vb @Ĭ`/_%^b9b.R(G"Lb9F#bVc9b"rVUYvH%)zXޟ#*O*(dZ֥!e9V$bcbXei*.6d%R11F9nc#`:f;5&T6 fM0Ab&]%Vh`V#4fg&hr&5Ҧ"b^#afV"U%ORnVLanekʥk efqe"`fTfqbV:'g*fp:'\2'yjlfP&nv\]aXojX'b''~fg~*h2&(WohZ(:腎'~6hkf(((bh*fRr hJnjhڨ~hkRhp(%JhRgh腺(xR鉢hq2iƥ4R.GvME'~ 蛾陲i9i鞶̨頊%jj))>jB*.*b꧊rj*iꥲ*jij:j*VBj*Fꯊ%a`~O)1lĬZEHF++r:*+nkz뷢뻢^+ڪ뚊+齶kkv빮~*Vblkz,Fl~lJlVu%և~d1dB&Z0Xlm-,(:,2>-dl&0mxmm'Lml~,~B&-Zތ­ݒmԒm-ܞm-F-rӒ~,-R--N-ӄ--m,xʭІmܪ.Ӳ-n2-Ԋ.ђmmRn.^nٞnm&LnϪ.:/mm&p.RmzF >-m0͘/2/fm2,o.&-n //2@٬bZcpksp{Op p pֶ gB p 0 00 0 0 c 1vp{0۰'q ;qo0~)|$L$qf񬈱fWy1[Vk11q񥐱ee)V  2 W#GqO/ ;k;2q#2H11('2#'s2#(r &2%q,y2,2w23+s3V2&q*o20c-ױ"g4;-W3l]2/s:s8s3$cr"K_,%s43 c3%C214BDX@ CGt<4D[tEK4Ekt@ `ES tE{FEtFKHGIK4F4LtFHtpt ptM4QP?MtLJC4SNKKWtPtKk4S#u uUt PQSuO;RPtY35JuE[75Ou]7u \JG5 4V;5V/5KT_tO5cDgUvVSv[GW uX6L_5cc#KHSw5X)NPH ΆCON_܍a6RܶQHopE7oE_o$q'Eo#rpG7nKu[wvts7vowws+mWwv7S@wmRw&$t|oD7x48W2w &2B+_+C(\xi8{xWoB+Èkx(gh&8((h2&G(h8Sxo2y(x#2lBǸ39x3yx8Gy{xxkB1hœyy9&y׹Ϲk#z'˸+z :y9yC:;Kz:SSzz{z[89y98y9y 9g/;+y9E{S{78#8S{4l= C;C;C{{;=Āe)}β~8뛂[#/{8OOM; 8w|'oȟo[/;W`/{Ӽg|9?+{/{?{';]G9GyG}W=8c9՟9C}ԋ}ԓxԇ=øS8Gsýݯxsy{x}<ᗹٟw=}_=w=㝋s{<ޥx߼|W)()pCCc(<)$'-<#[C (; 0{C;?C?󛻽g}vܻ>o;kK<?7<>|e. e6dA>\x`ņD#ȂA2 "ŋD1"C7jXL6MpB鬉gMMGjZ XMjnҩ*UeZUPDŒ-mWhԦXN9n͸Ef[oͼ?bI`` ea;dAfFShY\k]wQdeu %Q?<C&M'bm $J,(0MM: S0;.!jɦ>1 k벧 TDJFڋQFnG갻`iƺs»S>Yq+7h.D c{+N!CYFkقa׿eᆹz?X;e &G^a'#< X%Ģ܏?u"DrJSdLeNdibl+aac2*6e,TT&}P(qjQC12&b0SF%YF]':Yz#"_H(+1 %/KhEZ%;`\{qֺ;tǼ462ŞjΗ\VHe?"}[X=_! u Ԙ7e0fNH1ݲA*>mQ7Hm1IQKerˆ>lRM ݶ:y-lF`Ƅ4dv0w6 ޚHT2*ME(N_+M.OdF:jrK؛@C*2GjsT_D('Ccms¬Fzs0­cDZy5wu 4P11 Md NE֠}l k(א2TCS"P"$ff-ә`>QfBC=R(ƙ h3p1ކa>* Z?Ae@QgM[PTPf# FĖ!e)XCpE.X.t9*D@8t8Ү}C̉VItm+0עٸ"*L:*MjȺ+\o<-~(\OR0flhȦ&M&3l0XnBEO+D2&l77Lbt7Lsx$9*ct2lA;nBF!@DZP[.`N Gkhp:r w4~"^͖ ӨL;2-Rh"S--At#O##-тC%;$:Rΰ)!#@ %@ &4ڡ"%‰j2'E+*"4B*ot`0!g,U,CQKdƢ*K.(* ҋxPGߚ2/G|/jJ̧hh5 4t+M-lp0\FTE+fM7&l7n$ .(b~+H.!n! ` 5{)Ftav-!yT&{4Elφ!Ga/  $."FĚLM,er!$2./ @$Ą1̅V,!ivM_ H,HZ"tIQ0EK6oM6[OإMo29qny &m ZC3Dn4,4j"9mQy0PZs=u7|#W?,N{tɁxEH# 84JDYyZbG>W\^"!w>&DzP >ΒYӎ`G>[EMȴ _cA<5-&aϼReѮTd|'W"Dp~9^>asC`]m{#ih"`^R0f7a&{E:6HX/i#ir71-P0'F軺l֋ePpPR +Mq4In&#Q̫æTw3MzPVoƂ hsT"n랄xHb@Z'@A!acɫʻہ%!0>@?\ˁ`KrI&UB<4k͘}ñ+GH&vxJdCE%h+++ ŔzL_4dPSgVwk+NB+LR(2/pJ/Uĕ(Rl(W4k*loOKd Td6@gO"vuªcWcCpAJ99J :] a ` ^c`@ >᷀c@ ^+~2\a@e{XnxшσA g0&Yf'uhvihVBlLϫ:KP7"7xȧՑmmơMԶ8*SJltUsCsS0>Rx1kd kQ5e^/ٽ(-٧@3so͂}{7N"dG8&+ wxzXWzxsAɕ# &a!g.l!zgi | _5]Lb?Y@%ϸG^.Y$ũ KL "1 .hŰN"V"? ZJ&* 0P:,T1P5MԨGA :jxq8 %MI48˟+k%9ʉ?Q> ҙ4/$'ͩB1"MV51²YA jkMXvԚu(Sse:„p2+&lY4ƍ5N8 >2h7n qΒ9;VmѰcǖ 6mٳMV&4i(NLSIib|v[[<h׫yrߕ}7=t4=FoڻjөC ]>}e.䁆 4fa`f͗g)Z]eP4RE2VW?QTTؓBJTIrRHFDL]WQD&LbDUTMT袎)dՒ-U9S]Yed1WZ)aMEWiVE]VHEPpT %`!% d0%aj8t eQ&( RH_~6k>v~iv]ʤћ&jGp3$hOkGa(>ڙ]˭dBS|q̲j{J_kV*-9W7mi ;Z|F)j(Q|hXT_ixT5fb6*iT]/ь$\ٸќ9 hm%T0yQby\fR8Mamz%B4nIPGˈe];FRKD9']bXYATJ5( ְQhlJk`wW&sWinfo 1d1X4im =1kⲱ{ma{B_tCf.e(e 5DnoBw4<]tQ2YQR6>߲Tfk8TX?ZMJb`LYoUOegPQ UGoK Aɑ%:yIH fֳ%])+Ww:Es(R7̜ CbDˡ-WvMU4*Uߨ9[L's%\lN5-]={LӝҘvbh>"F3+b. dB1Rd%8ӗ; J1) UlQKӨiyK2 HzBI tz*9A0I{I2Оgt_11#A5%hyPVZ -4՘? iOyRח" fD&bkLC!)BM暍96CmWsz.S+:N@1(hgAC6MW:M|+#5OT9o@$Z%)^2%BVtE4bECa0 )bt.U`f55O](摔d|X>v2GY$Xtd5 $ =-\ !%V%io9Gei![a %-հ=oYZus&dWֆBMA!X +8kUvSj=)mAr|zWq9jcdX^!&M.&FAR:EC46D/ھF@U/$Ix“H" LƲ=0Ee|^XdJOxa0ifgT'yI?H5+YCք%JXĨpIMp`>j]Z0{%5ixF| ﰩ onFCN*.n*f*7!"<0 ܧ6Auhj9 }Xy;2 f}y;U`yeИEkely w%ZB;ZƲ쬞ek΄УmfX tDNk;O;:]UҐCe$ʙە 1>}]H/:З^/=I7ԡ>t+T?z՛.`\ֵt4|`O{ڙsGW?;ۭ>v{>};w[:ٮvK|o:_;+׼C/~z;;=^TgMg]2LOVT"P.f+(wʥGw>[_g>}qX0t.9}C~7~}|7q }C (qG~]rw~~ x}~&8~ܷ-1#'x.8 }7}>X}ׁ)DȂ Y2 A b,B\(`-9fʢa(^؅h؅]Dkp \p-ZXf,~d j-qmmjCcafgcȇцarȇh,oƊ}"y,d8xs1&xȅx8+'(iqmo8_}Xȋ؎g߸؈ʘ㨎渌e,،^fXDjg-i* OˇfvWje\8gfjƐ# r☊&Aiv9ff/GB7IiieX[fȔ]֊3ɌMf'2rQie7f&…c(ql&fafW8aYelhT wYuohj~HXfkXr)x))Y?Ʌ2D}h[)oؖu9:@teY)l&qur/YX6/:9fakٓ⁊V\,ȓ&,)nQ9uyIiN8/r~#> <閘y[QfY YOraffJz|YmZxvՙ:I1)ړgȝӨ)yf+ʜ?)BJʙyDYYjf9N *(ǩЈ +:ᔅy,']+ד{H_9iɒCJ)nH}*ڠ'WNEʨF~9@JvI2y*ŧCà 8XXi/2ؤ.9h.g y ? (n>*R1 :<)9əNoRiJLɥ1iH<2YhS:*Iĺ٬ڬgɟ5q 3 ۹ cʯȒ)h'*I{Iꫀ) *_&ʚI jȧj'cxʤZ07p id3WseԊ;IʜJIDZ {)9$k:d9 GjZX٣>;6rɐIƸ^Ԫv=Io3ˮՙBZ]dfʙ]iJ_r;7٩SqzPڍZ)@n%[٬)i1>KZəX旹~9hk:{+)7 Ƒs>) h+X w; f3<˙IX|Iy*H*ʬf/Gz 9sYJ)]; j ١r)f۾ۘ[Ȭ]yxkvy8& \"˱{ٕ;c&ș.YrZZ6* MdQh!kfk؝9R,ۜiiynp{۝!zܖ,{:[L쮝o ' Xl.LKîU٤X)Li>YrˠFfzyklaKNzȮk؝+kp[r:ji;-qŎ ֚#ifW6Ǒ# J̛۶ۻNΪqk~jFp.ފxz/9ʛ l +[K<зDzȟ=fשE o) J/*#ӕx=Ϧ[fZO֌̯$KΛě\EzP:S(:̕,k_J :7477`qLݱ0[pp ,=GqO[P2 MKݹ:Jpܺ« jukܠ=mM :{ AU PmŭHӑ,v˦9CĿZ᜕gjZُX[qT:ˋd=0ޖ dƥZ륱<]ֻ}辀Y}Z(PL$fL/ )Y^9 N +\o-Y d>CbPuL X69 -\p  >ڻA>8 ^1 ؎lyI,&}r},n+^8zXy[I~[mݩ'X-:,+0=_9X<l{\Zޤ_?;Ԉܲfzrݧ`K9J(Mȓ3ʔcKa譵)k(rI-Jы,p*hΝ1| Q! C MP @ɰM.`\ @` c p uÌ*;=nm~QSWJXOi]v;m~=L}΢W޺cqrYVL իnyزsV"ٕm8ꏕȭAo2} h WO† :Dlz=XQiXPʋq$Q#AKZ$ؑcŽ'7(p_á/k>Թəqԧ4Nb)[L414L2b29-2hˢ&P4'T}BrJP+G_8ߘhB' >y6n3*ֺR2ԧYu(e])5ҩkk]M­ÕoZiﺚvݝ]񬓃WzڮW.hn,4Ng%@zɥhLɦ BʩR&0;1L&=H*":jXlvۈR w'(Y5 \5m/B%dmWlu!$"W\h(l}tX݉ۅ{Bi׈%xqM"e'} `Ìb{ȨIJ)DcBa_68縴_WU 7ݗlޗrm:\ъr"gMyjct201ץU>[UvvhX( 6}!۔vPlH"J-=5Q4",IS>&iUvr\e fseUF@}/F ~Nf%ټ"D"ؠGj\bz4RgU:(|lQi{'zY)hG$/~"R?x0 2cVՏ' H2fgx>pmR I(k%|F—0eR),{OjAz 7'[aΖa>!y+[=~𭄍"c섕 H$@b 0'I="u< kG6a he1 P/{D0Nx+k)qD0!M`)S9K%=2krZSBX9%^H/)2}L){b6x6p e~ "n3OThXvĂrQ(d%#.6B%&6牴$HA@>n) 2aG`S$dpjH0L~1A\G~f <]JRdmQUYUr8,Pe0$j籅X  a%S$ bU]Z`p `x>7n)2Ze$H{Ej{e>=3z;R}m* )\z0*E%Mkؘ2,DjE9HO,-@ڽtq9+^v$_34'aڞXM[$!,_{WQCf)MA%5,p[3>)==-% o˚R;ق7Y= 3}I+e Fe;IV12h09X+e5V\و&<2.0&2`[,b6~[0Fw)fO)@rϸe}hϪ5Es2C;Aa U6l0x>&Cȗ/-Dz iIarg<{h6V9CS%H6zsȜ3i>-&yU `[[ޜ.X\*o5q28OTI -ZهCYq+UҠF 2%@[!:+fqFLM0`͉G//gV_Bjl_a_˚e>ە AezYgCCD{׋l}ØِJл h B(UhfPz-3ď%9ZW3 ޭ 1G=d-,4]\//d[L^FQFi2F)`~ǁqr,3] ;wܞ&F<1AX[r,OSZ˭ݸ¶>ՇMf7z.t%:x楽yPK}Mظ_e%[NɲB*Nk7moBHE' p@{n9[E _-yW#]=9J࿭J$1I3}^S7.˩[tQ̕4A*ʳS68mñ=<[pz,.X,!j& #>K3ȯ::f%21!ږσ⪲ :볫h{ ΃22m/Բ,֒\+$d3 2;ʻn&#:jh:-s),6K bXJE;49h O:\WF鱹 Vb炶LA 89xꫯ@ /Bv7_RYTp-΢қ傊J7_nkCjAىʴ)mCzp!;R4q;|,*D= zӛR B v;Tx9գ σ(2* 2O{):4:-+B4˙rȣ),R@;:p5h3C)12lů ҸE@ BѬ:>]i cr"/E; c[<KRK;ڡC*z)4㴫r2! EB#,KJK?M-z}us 2=j<;BGD,)6+!Jh˻2#?~cHג,4 `눖;ˉ:!B Mx#o(j̢B"@L/|qɃdz&+U&3EqpĹ! DbIkt1|o7rKyᚺK[2 M2PZ A ňĈϻˤ3ÛB(?l>9:RzZ,+%GhC"C5beBȊ\kzpaDС[( @NJ22Uc$b'Npr\@(IC+,'jpꢛC¶K~U;t Yb U7~aa짗CΛh-nazH~rp+O)1쒫FI' P| l' ' dG 'C3/>[-IPl2RW;D"?)J9هLPabHMnO5m- x#oa vu##MHbp7"YMtyWWzW8WpVbWvvXsMDnWW8X}Xv%{XuW(@A׈ل|Տw Xp}Xtwem׈uXr}؟XY}VzW7"ؓULm}YXשeXYv @y5׈EXz}XEXEZXreYYuZ5Wu٢Wyu#6ZWrXXՏ-zYE؈]Wٟ5W%R\u[ȅܓYvW{meغmpMzE]{oWV}XYXW-ڏ XʥZ~:mMYC[pU }𯪓M?a  *dbXQ2ky͖ﵘez _٥)I_'_ _-'I%GIb ct^iIy6\_ GIra_tY_4) _s ~, N. a9a{Pn _+i )aa!߈CV/3d>!_3Vs=^6^lu/˵ Crͮ3;<*r{89ڞ #zȉ`zzp%SCv: 6|O+JLsO|`T߄1՛+ed-rD-.yiYd21MĖnqfS~;"$e t"WL ܊zsk饲|dUFBKBԹàJC,6: fQZeN.1eѓ @4:?M##@bH7RKE)MxKgbkƙ;3(/\. /TP?BS8,8FM̻#DC&\s×֛O^LQCRA֕/#ћZ,c.xPdsT "_D~ίs??pDד=Qr(ΙaMZ ϼΣq뢏HpCӛ6[}HEN8Hȓgԯ3ĤP')T<)l<l.PMȱ(Z#*ȵ$/m2); Ú)*r)rh+r);hՌ>?-\4oktv)H]3"@o@$s6`QA<1oD`A ?z$ Ӯ98rr2$&cCUξP,^IcΞy$Mt鋢RHc;g:h G *˓=:*t I#lp/[7^š:p?^o [^MCytdB/4K,&~èȼ& "x̯7ʖf;>LsFp)Hb4w/B #Ö8tIf)YvHfǃFkY4$ȖS:93fH7.LZgJLp_Q3.<0+څ?m$kβ7e(IG>Hӛp!>% 5PPx0!k.֪FeA)dLҬB]]nԎ|{J$lݣ.D+/~;ۖ 1m=e )&2PԨ) xz4 ˔I1dtK}iKԧiY>[ oyNʹHL Xo:E<,&b-H's S*~TdTZ~V1YlHVf]O]1䘆/TdCY&FAae gSCDscRr{ rUeK4FƐF2UQPu]_-WGWٔ"'-!}=Zg[dYmQg)OW|UP&nj4gZeZedNBޤJ5LN(viĠi1h2y1D(j~Ѭ FFh`'CXF֔qUD,GA3 (BQxDc@rZ:+G3$mYUQqGHhk~Y@%R&ÕIIheAWtWsu~fQ#]QTavibq 3|DqLӃj;[Ѫ>:0Y-UJefJY*WI<ͺ,tuthĉ5jiY@:U)a 1ih-32 x 1e"IM8]3 _j2OjmI>\` σC2` ,1o ;z aDp+*yќq}WX7m)eUiA+3gkWyYv!E*]?*E 4QX)p;S9He#َ3~9}}S58-MgM#$W*%،%-*>edTrruT5|i2y+#[зMK",G,cmN0}G4 y=tU%/tՄz[@;al\>}c WQ 8`Ё>E"9IyeodG%P(ӗ?aB"(d)MDjJ$Pk[ZAH4fvJZXaHJypy ܠ4̤lkZ_(uʏR6}q)ٴ.B[!,oɤanb1J60b0e@)zaUqb(b؇s &&! Ѫ4% +~cN@o@EvG."'H)Uhk! ~E; YR!d "om{ڌBZRdIӤ9#?Nj|Pjt`A[&EQ#ߐ8ګ 3ugYY$1J zT}>fYgMh.)mf#̖*u 0_U-5,Xsyn1Xy[ۼ/(t(,Rj]=©% hGxe F~,[}4~'08Q2BX"%e>*Ij^Giz[HY ^QEI%gn\l\z# bm%\M,ftZ`HҘ=h+׆S1bK}t|ۨ N~E'Q`2[Ucgi[P8vʨKI&9s) *$eA )8gIgFCwLd) ~j p: jB?HS-8Ʌ郫! PrQVUk3:e,0E~2+&dLWb$ W$[\OMɴ!e5}_M,h;n 07cPI%zW%M3ޤ93R\ezK6,;[Xh)sȏۓlpBiZӥΡMt1V: v8b!@ۛ$3uycV[>}G'MwQ+&2+'aADDs{3[7!а$^RW=. _*! #2檏aUy-4!)"RpN+Ě_""EL\_9N|/~--/|-f nDuY*~Z/͗PQ\H?)8mTqm}M=sרI ɥeƟAf `E!ǹTdS |ZIjuLT- LՃ u{˯G$LQ_8D18ۮsȎyXmAX=PDÎmBÀāt,B $EB̿P ^H(Ď^WGn!ъ I]OĬa S4qTqļ,AܙL8Pxb% J E+Bk&D+_7EHqY9gXJfrF)pYץιEM)$!e/& \r叼V͖'؝+c'1fHFEy +ԧVMe;%aQoF\tu,͖BC']mM-á0DK E % Z.VDQm~P-^ւ6dvמDC-ؖ֒yd$]k8JݘHnyQ1J\:IrO<0ޜ'TqXV i \) uݔTQP4.ސ]lQ]VFHwbRiV TL{.ԙhVtl]6lxࡰ҃,C=a$@#  5Ap_pZnO-su+E0T-0iJ :f /VI! WFqhq- "A9+b@QuS['L`l(ܮIo覤ĖvE.YJkdJx6]̵}Ёz WhrbV}TBP5ڬC2D - **0^UX*P zƕWQnq b+g@4 I\o_%jY\ Lo\-`bVi'ɥKmԌ.bPbk 3-iI%RY (4$`QI$12#1[4 = Iqwcd˯uh|qEm)̆`i7%n֬!{ZDIdr$kjLpjW8Ǿ 殛eDe//?WfH$T"*A= %Nk9"w%҈I\ r~aqkB9;O|'lfYLϚ!j{Zb`Kx>(ܔح zMB(mb`dǮ]g 8L.}&se1 Mm]я_(Cq=Յ9[̀Rc`n5jHN ]4͆!G'>pјex^U$t&Irn3],&G5eۖzbl3>L%1 sQ45/ ?boђ?E _p}Qk= ֨u^gN|Q@,{;5J)vYTIfYPqp7Fm'z P &""7ڪ49l]qtq)hЍb eIou[S2V Y&NDwfd2z/ (с5kiuP]~p.Ap%.X<&y1dx{P>Z.dxz0% )%7T;Q iuL)A;/v[WǵY%1&R8f.CwW4tfZ}+J;_:m2." ?DQB 4q#Dr1D}גA/[&y"h6mԖ" uZpJjt)LA[ffA)[FM Mj&QWLЬKoY41TӞb̗3YgKRP@;:]0MiӧQΫ:Ү_FÚvبa}Խ]8o}Gqmtþ{ǣO.{uk[/gN}N~+=t Mj-+@1m/bBIix*}'ʌģ4+h Ņfj $¬LGe He1 %}LIIe 2AaR-4R(yLK*D l2M/\S*ˬ7|+s&s'{N6єR,sP?M?E)uTM5+SIlJ(+ /FeM=C'-JQ4tH#I3=?|QB%+ 21fA) )T.Ѝd$1b0HpJEeB + 3<>*,6)ǃ2jʨ${Zz(#}a;f7 mY&yBlYl(9إwI騖 Ұ/z(h(*:ގ$Ne@f`HlFZ(Uz<91I|c;&x4FkHa:>%#f"+I,viIͺhlYTƩr hU:e- EV Pj갛P¾dʍƧEKhFIÿƱg2KƠ: "x J*~Y_ z{26n3ief'(؅zL*$q Ș!xn`嘂KpW'l|9ҙ0!(LCҖrn i5 sE3+JxBCD:`F]V(v-3I"-`6&^}(bY\!$| T0 I r[Ç LèoF"_)kEtH&nƑ 2$@*c"d*,<\&oK՜!MnEġfFƐG6ܰfӣI*űoVbCi23C7 ~eƌѨ3`Д dEFA "{JB@O1j HYnTl'eYQ1fb\&.3EF\ifcrh[2&]DZp)̶"T/h(Z 1|E~0@^ZNPF%qHΙCиQ`2nQsP,5j0NcOnHgLR4$JRx#j=p5n_OHYLacLe:҂&$k&OiZ"fpGE#B\¶ּ(>V8Fͮ,^[ ecfQB8r^fr/pylQnq[$(iɃ˗rX8ٱϋ v`=vtr bj8:s ~)a2U(%2f83x$ꤽT^ זØPѴPr;fJj-FGFmphkzDzC4xsn7͒Z„ fY33/ `8֥NS΋D{D!@4*U4(4 ="Ly pbXDJ/h.g;`(4|ŗKR.Yiıjnr )Q!z=f K/}󽈭s;_Kk{=gqFX_AK2+=&ꋘl)kbyA{^!6Y" =X>ol]Xe}b4#Fls["Ѥ$nnuB<}ԛrw@ѡȥ[7K^z ŒeDB1b,"q"ڛ h,I!SN^ nsIN%2YG;U摃dXX Os7΄rvPzD=6qޞ*7lB4j5T>ܟ[Q]?>[˰/mµ] 7Ec4\jP%0(EC)[]ʋޕ ø(-g ,M&4a&#f.J"BDb"Na!d2oL j' (!|a>)qڡ N#a n,b%>PLă:@}Ó+ΐ|klH;񸦏{*r|B̍ۜﴤy"> d'@knH+bZF0,Z[ЀG!\,6Jhy0E2=cq-l"8& 404CaV3fԓFh G CZB*$t`'U"(9_/6r]7t7."Ќx;wsc?uvcpsUsU";1.xnTq scB9>xgxЙV gn djL[tȮOg^ﮪtv-p./'k3tM/h-uh'˓"PGxt(h8ms 8  D2Z"@xxǕ$UԎ#,U5KӔ\6-C&#B$.$qcT ?!Ơ0ZI$j `#5#NME d=3*)(C*qu(w{!*w~peFss&@r- ԫ_=tn"'롔.h!XDvU8VG8g+2F([μĀ!-oHM?h`6޲ L)c+Z‹{6cװHJټ۪E숙!C4z+~Xb"I.L2? F6r il* 0 00,Ȧ/ pǜ 3eBoB",jt_ѱjd:t:!s N+"vS7܎? !p3!FB-b:*s&b7= es va.vDAn~`CP1ڪ!"ĠA St7VUT; c*z/F)kB& 7͈H$+ojbo,IƆ.YKjt}$Xj"X*| ' ڎDtϼrJ$m10YnA2. ¾.DB@DBS#2 .J`UrI&pDBuZR^ȕ5})usNE2$m5'×0Ba t."RȳW @A!V ܮt%\!%ԩ&U(4a$o9`c`aJ|pɖ~u/]0jRh`lt;j$C`f4b#ؠ)&d C,l*sxt42LI*ƤLh8JN1bIeεL+~M"j $Gb\lDnVE/6ǦZdȼg-bH/[!HD%ԋ k#ܬ] NfsfئFD q$ CPn|f&=tXG',^(eE4~GOr2'ןLMJ8e;cBnX,,<΁TKޔ}^-,&x.5[D$}d)vD"j!p'Bd.,~t>iuxp&f &|80~ MB,4C}ʚ|:~k1kpdd֌8'3h0rD ~| ټ,ԱHhmHLQ~~lKGV 1Jz fjH}IFG^"0A+8Kf%=Xy5EI\=r6 $/XLW/2}p ԷlDe5I a4} 9F/⾌Ճ^5zQʔ+QDchuwfI:ajsĚ@*yfD2 $I$7UZR(}-cФbfU:SɄ*Qfl-%Y'zEjF_1ҌpFXSibd7ޡ-M JMa^}1N&L g_l +{G.s^;&~P]3S/M\84xrWm".~sԠׂ$p`Ŋ.Ƽc2Q$`($Dgb`jܠI 14#e GRnf$[l@-֕yہf,G pSM"J uHѝgT|I^釚zṈM f%Ka3ER fV1_x1w֋e}ݕbQmUabd[\yhMV~WxtWFgn ɧ#q5*_EXgM $n bk ]ac[LZT^-&zsNcFwP452hnL2l;K"~eEDPRe3GI:\88Qֲ9Wbr}|f"iOP3M$ +aVR,iKy)ۉ`2ș9HaNtt',ՙcj &?+BBң͜'D[IQ.t i?HTH%ѩ[$<.C q"} *A2t-͹ {Ti +Y`V e ״cUk\Zַ#k&: UmezW"V+`ؼ5 ^z&`JW"v+aJZհk[âUeUKԦ-gvl[ulemok[غõd;*=i[æ6UdeW׸1ҒE1EJOh"_YJ"NF MM@2 b ֦(< TC07tz8C ް@4 PR3.05 ya8@&r]l _<,d'Cv7L%y[c#kY^que af!'cw f2c&n<$I*sd%͋niH4I'z3F MIcJ+9 ԅԽk  h-YҒc-yi̱7r4I ZRl`kFݑo IYyA tn7oF`:ֈ[lǎy[w6m o^ 񰠛-&vvǰ1ăcewow!m|*7[>qx iIx]>r{c(8gny&vq+Im]3}X )1Y4JW_]IüTgВKKh,&7`=)pM2Iβ,O; aHB2nYFOU\2 FJt>5У9@A%W!Dc%Bc6=T&$%-NBy| !j$&|+)C䀇Y/Br@_=L@q1Az]ioI~((|ꑒ?h#Cؚӏ7"̸U!Yy/r$XTr.)F1(yq4 (f``Sa;֋`ɠ`FbDaa ay`:a`'&ڟaY aĐb"KbIa b b'!x֟&;6Mb3: ֋)E fڡ=J4 퉣jf`6I(fbPc 6iaLJ16itWZzQ :a `Q`Vc JfKZjvy 8jI0cN `*\tE$BC%5:aJ ʢJ}j"?:A뉧KJڧj:zjW:(FS:r_sA.Ʃ%s9JJmȖ%Wsu^hYY[Wͅ]\:W\J\:YUVj\pn:ծgծ媰[n]ە\V5ZӅX͕XUZ+{]կU%^5Wﺮ\>+[hmU腲ku^˳%X 9;5U]ŰV;ʱ/b+0fKT&! _v/5D76[G·2!S5"t%8#@I8\ช-,rm <ͩ~Ðө73z0F,*'yHŇQJc$zx&$Gd1vNlzb4txc35D2BI%BlS9"A6 Ψ{[A A S5k:xeeE5!0?d0̊n*&'bB̹$#'T!1‰W'R#.R(Q8y+8={MgB$72ɎF:*Q<7XΨ48=<̆' o5zJn ʹ43>l~۷)7#ӹ RD(1V KA`!!:sl?8+>t{*4mqK$u(]3=L<y&BYb,s0}t܆<%% Q%=@*AcTsU#&kɷx({ӡă).828|S486>b`9yLB 7~8ZF~ؔb=4 X:]d:rXA%b5}4%goÇ C7DAXJ?x™8-+!긄,0)YSπ=mYw}+D_h)L< 9yS?(s)%Nトؘť u/؀jx w935y<Ο5z#a(-$ER4bp'ThL$.E@ _<*|qη1ίXiQ C73$tƆrmulF@&&`bɐ,HCݛI*ڞ$_6ر%˗5qi0'E3s|Q Ć#,i`ON;^4ӖU|X1)UFYnUʈoV5Z 9FH1nɑ1MBH/vrߘi7ʳX{VbFh.6՛r JbsU*Պ9+ )3zH7>֍23ς)OnJl̰)T5?OJvcQb"TF Mj$QL&jhu[}i`4ydEF0!8 jghKrSiyCQ$b) F"eBI.CA×.Nd.a"ƢEK:^ =∧5 /Nh'`)1)63sɷ;,MLm.6_R0;)7i8<4– ? c48H7 ͷ -͈?Ҧ .RJ86;iUrb *H2 ļ0RdgvI'!=үL 5XCQ#@Icc.1b8e%|J6qKњP" hQ}Wdub YbDM!!gM,;ysL0B]ݚv@|"1sGhL„;=1 e2P="q b9 vST.٘-I2p[C Cb#H59[)3H2#FP&l4B$bR4K[ZֈWhRm1/:gCx3Q6SRTЂ.r of/1F%_1tciTF%X Gg(B57A]ccE%f.u)!WOj#ͥ"G@MdmIRF1IȒG#e[&L!Z b86B,,~H>mȧ&B䚜U2A"1PE3!pLE+9nU(kr8=t:%DȫH!j)R=/*iR&J5R՟i8jKPx1iTU\6brB&rhLrG)F,iНoٌ]UBE,Ie(qW[ZRɆѮ<( 6+E9 oE;JjN}NXm"F&J<chXZ)ZGfwݪ "Lb.lA"}ǗhՑ!]w=k!ڙuY :9R'/f}½Յ!"!7ה ) Ze5CӜD58T#i$,"e6~itcq U7 vΜddpDP}ӣ6irbž4a-q?vHjšn| 7Q}N"BanF}]eaH0do <0y7 IDOFG*Ηd1$!8w1.CMD|,gz@8з@ :&h ph#C{mW- ec"A1;ݙ&P(ejq{USF6LoΉ C)XR S5_'LD0TJ:"j{M1yQu.}Y2xqp=7cg^?JHH ƿ)"sȵ=-8!ĺesL>n>-\D22"c(>QT^`S Rm?, 3oYqm]j(?͉D諬DSa<m׹_q3lVK)7 S/PH)ี4 S5/Z)$<)P **+ QТW5: <` cO)"> c!ӛrA4[M Gc /)JO 0! H+Lc qAq9>4,/ѨbI! 9P2ЇBa0u7ٱ@9 $:Aaq@)FB 0. k䠴W b27ْ@< .ڪ+DLdDA0 ӜN$r%1Q?x .#A;.L?|IF\L 6jpC+ۓAx`!X4%twj-im o!aH+S8#[>׫}4PƘ2(w 2Gz#pJ'!蛿",.4p [5`p@z:+=B#U<ʛ{ZLqD{.`;āq,z"OaQx t.*G露B p, ;O<ըX'IFB)_,Ҫ:! $BFY$L$0)44rat I(@2߁öaLL9ȍOC77`P3ʢd |d T(2E+A ꧪ0#UA]LĨcb<cKhTj"]93*[!

0P=TïP(@SROfN_\\Np51: 7Q>T #ǻԟbX$*PP+XC#IDCD6-ִ»)4$3Jr H0*FyzFnu~R,AEqCY ϴP'0ͣ2ɶ) ɰۻ\.ż ա;ue =DBGk '+U1V]!;ʠy6N= |4/*B(|0> =B4#?Q+JD˷z('ѩPhhOLu9MЎIE- <˚]Z W($Up9hÑu'pb5+P:!:hu":Cz2-]{"Cw%1Z$Kʫ\ݖ%ݼhL=ۺݖ[e\ sm\K\[Ƚ]]ە\E\=Õ]Ӎܼ_!][K^nͫw޵\םݻؽ-] {hф]}^ل&Ch$E\ם\ _i[EwrE\tը9bR:%cd#S3;!ܺǕZ.i q7P%&v$Vr'%nb&*b-~*Nb1b,~34$,&)^Rz/N.1/F($V87=1Fc,fc1&d2c+N2b6c.bCVb=c;Ld+FMv+dPFdBbEd+c>dV4cKc)6J>>fd%PYe`NVe,bP6\WecbA { H>b_h[in鿰C[i5k:if#ڏ|NYiKZhi8 i>b>Znf#Cƴn薖J֋i,zŴooO/>6h&N=~U#r (@qsbT'ԡn@*('q7X$ )}P+3aUm6>NA:њ+- BPn6JN {ŮHɢv՗/y3uAS5%=3IPr]K86k<"9Ϯh3Hmn?ess$9iw%bFeq!u첒z:4;7s|iU5;z.I0R~ ݒp b̓K/«SIY=Q@5  4׻4i4&ayWԳ ްØ='YԩFVs##4/u۲to<C|F@;A%O>pt$U׳ٯٕi>WE uˈ l0[Av1]Ι\E"u\ռ$8R"g940gЦ ؓߡS(D('x(P"PECՇj]l/SJNƣȮ/M|<(,ٻ4ܔ2Z4Dt.X60vt儯ZP{;AK|*-͢T̍R\4}ן6'ݶ]mzM!J $}ķ(#ݽRSʫlX<,ɜ{p/6 eHf LhP!… "l(aÁ F"D9Vh GI3rRdH.1)3L MqgL2[~gJh&MxF0wD&U9 }iԧIubeU2M:-۵3)Thr'fYPBQCSAzʈ)Ӕ)B)L̾eӷ d/]Z}x5+}Z4e m~}7/טqMyᐋ#pʎoyǕG>}:λ^8tډcw.^합&nJ6'lY֕kEh&nYFf8Y\"iYF)AͦL~vh g]蒳͹݆~fVLz>e 诞>h)vٟh&k(ugQ݊ve^豬iۼf vjmۆWK.[o}&gzzz黼*$jiim]&Gkr. xƧE˯" [yEJ3ijt&+[h4yZ‹Ue%& Va +<2E&y .+\-&(:[ޒ*},Ϥkr2'qٶͭuޯ*Smer&Ӓk19mt".5\ǡ?F h›2m|ͶN{_c 5ũ垵+W8/h.ң䣵/X{csGa5rr9nArV%&HӷP˂vEezPWhB9L`4T'MhAC PiN1l涧QLs2T@x ˌ4\iobׯ)k"d';qv K%8fx)gj58h(?T&p=w:񶷛2N{"G<r|OFN*x"~jf:7e1Yq'>>Q sWVsAAFpT f59wa4*XpUOYZ"fL$mR b&2?걡01@&8F|e M@J~ߣBJt VIM8/UMy H(_b.GuJ.mblv:Oh>2#NJJt|iI:9,``JIspYT M g`GЪ"=_Uj\JN15^J>ⴧTU;΁K^yb 9}0xu15yZ\Ti6LL#4fδ!00 Lj$ĉS‹C>faX3?VyCPu&4gVd jm>7<}͚,yFn!mɶG+^zk 4+:U{k<MRXzha&Lqfh3yօ4`eɭI*I#Y/ªokJ$af3㖱 KeƐf>Ί/$J%b*x2M/SPKa.1] (ShcW^ef kzRӬ i9dcKhWT]̼!=أڱf}%^]S{ lڞ8k -ƣs sc~+WLrij{a>: S7?>6De'3̋W`[|pmlA @!<@0(8]0"A=$hB4aQ<)&exIdXId Ga2q@jGflI!e ]a0 id-Cdg8vx =I(2b"*^x1c*UюPM9eݝ!ڭ! =D(X=FUDIA`M1`DM.Ym9#PE62U^ޭdhBvx 1^ܖPa Fڨ ۸^ipF=C'z">$#@4a:e=h>&v.-i\4UFCXV.>B =CUnY!G (C1f7^=a3I<lqLNsˑIe1Iџ5fF(&h"&r@ j6^gYIB_\l˞t$҃KئewAhUaލE1gA] my.*~6`]^{ e τX!^đbDxdV=d0Q&PD$I_l @4Lb,'̊FÊBf*>>BX:2'CCD$`db!D&QɌCfe8y#3f0_aeޛ3~`6hTExiH& `6dK "j؉rfd.\ѝ24۞ ҩfdԕO;% Jv9 fa"xf$4N Qfi5 jnR٩f~&0#j%LyOn&9F"ihh 8bcQo<ދ1 [LR݆1y-TW8/c9RZRYt'y .Lv,qMfS6R[Q:LiC= `ymH+P s;&S&HPb"4W*G-2(L0&B>&2i& jmrcbr2!\3n_/rD&+ MZxMR^Bqhai/~ɡ&iea@T(r,ˬ_ݐu`| >-mXHR)!TynNҶԳ_8[`L/R]A紺g>^Un"d<6Kbʃ* B$S. a9FAF4k0q̕%,d &b#Ml(Ć!TZ)!&x"\Zޢ}>Gle|xTl/ /W `i)@_HY&vvx#ݩڙu P%:utmQ7q5m?j|^ZvU^~Nw*EfQ fBvcR! EW=`RFdh6چ}ö&5ِټSQ_|"edy]u ڥF|J~JC\_XZ)eӧE៬mOqS?odkc _etUɓpr Nx]|1:v`W,ϜSOї yvVUL@tI&I4ߝO-kO`i&|n"@ T 'mys9`ZY12(XJsJ`I͐lcҋ\p+(XX6b"AvfM>J3*[Nmд)XBeHAcQy_SkXi.`83MۂP,U,խ<,LTX4TpTTK1w8=IN񘸝ܠ=  ReRJv7x Qʤ$mň;)}aVS*rMk21مNKh^<\)Z l0{mWFvz `ݎpR0!x!͍c$J'V`ܭ7Uw[ mDKnH'#ۘwEGy_!}RӒ:8QA!4w~mpIԥ"Rc"_YDfftd|)na,Pn}',ҠfQ<7R1=?QYxsKq0{M?ge7 jCgtY8TfC_ΝK6*Dzӷl2} m}0Dh]aE6lC s1D}gnQzozt%ǝ2r,S!ʼnjxD+.Ie̙0KRt)qY&F}i0'&Z(e@QCS4)#,ӰIibӴlhb&5o0 BsYyb.s4&ϟ[Ԇ&-gGg-L S *UCseW4,9w< r3:G^cN-ӫfU<*Cunz(3Qg{o_Ӷ 8#7F;jI:f;-*N %3P4&Dͤpf䮺4%谲6z*f&L龭4$ ZOJRh¡PBe4Ը!/Rb4D e2J@ى "m&JJ"rS5ZLC - 6oS*[1ѽM΂Rn4 oF[PT\2T:ALmr?#cqd/v|V\%g>A|NIeOͰ9'Ѷp1i7u4|wdӊ*59^Ӛ )SGY&5 ~ а}-oYO /h1ll ̝>Pe ck7&lV6~_O/=:5Ѿh )>=JR/(UJ"f'YFe SbtMcR|3MiFM RtT*1JњU3]KҠ4,*Jդ2MU)Gԟt"5:Iӏv4hWkfUU[FZW9_²Thha/hF YTUlX' EQJhf^Ȧdb\##TFRB|0ACX A>eӌtۛLWڈL$Եn^]Co7[-P$dWvFW| `(0eBKY ^ʯ_z(~.{ۓyxmo]qQ^nx sW|` k^ ؽBn0[&&L\+->S]`P8>CD'JAr4OG[ t@)X$ P=t灰jI)W/2iY:)WI Hpd\+H6.HfZ<Yo ]Wnw:O~U:5>/PE?~\lDz y`sɍfb촗u }@g[7AlS{8jzZ;o9/{(u]u^';ڹJ48#s |lu|W!87 큠w)x~;_ߍ'AF Y{ ~EI|%%Ipc&cb#+>d|c),A/b YdzU6>"Y\A2JDX@(%X?8_E%(82@PjfG|*Rj( P=^@H2UME#XLb8"3Pď-fEeep%6\hMiРZf1,d0bD~$W:҃%, Bjd=zQI3M>v=b^DVdPd-2f%PEGd8D@3%HC΢mRLed:ca a<< $" QN#`,W6J%W-TTB$<> OGC,TT%+bñVI`CU15rQ1 av$^\2F)c62 H?N$#"..I#g 8:2 s%@,E8Mo˞&HnQְ2OlװY;hSe_<,# (.-jB%O*\zJ`&,8#tcUf˺c ]s:i8 GA#cּ$ TZ$ %@$R+W$) T9B'._?=a$ ;23r!R"uc6 3,2"  CԀ֤Mpf85Ā%]<(6 s%0#"sR ضrC%6212Eb/<bR2EϰD>a^j2!X4hhp)*T\4Rf>b(a[XPGBFJSq=vbp:~ZaQ8/] s`hF2`>t9b׼qD@,9F`%j7.N46cf6fa&;Lp"tM`gG(R6n҃C'$R wEO`>_$mToZ4id3<cb"$܅AcDZlE>'sSeHED5/b@%5OO;M!mG\eDHRđMFYF1]::F4Oɭ SB8b.f:i08qNSu[qK%O@ٴ\cM3V ܾP;S4C6A[R f/b )[9`QPUub4JC"en,0-Wg*Wl6̃boTVJ_AT XQ:@R9ZtiL2?E-XriP1MrUMQKb+1uc9CAb;>Y"-@m4i&I=..4 0pFg<1RTJSbЃiZw>j076Mu8C^ZF>d_S"%GphobccFS1eqUBQUIE2Xv?vR`4YOSJXu&`AE+k?= PVqo#Y;r9M+N5w_b$:[]F]^W!nb/fZKa9N nX7jp4Pi3^VCF-(#_D_wZd$#1"29{c>6cqD+> 6wb_jUMSG!FߊsXmI%*XAH956VkrP_NCQyJ7֐o45XWY_`8C%R7fӰ)7;R9H[2Xl\qweiʶ5 ZE#)DzH6|!7F2`U%B*94!VA؉S@@~#}s|g"fIMl$͜D6$]r_jH39yQ@W7QW[lպ!|b )J evW55Z39G7JS0; C5Wz"Cf;3غg*\G]a4I}9>ڶv*7s=rYdyskMW4%U4Epn{%i 5oan/jo2wS:JŵUv-1#%VPM=O% H*RF;Pl[Vj7<M?:tWKem,1OLID1jY[Ek`j2BY&V72K;9A Dcǂph[V?:J$4dl'/>YYPbcLuW<\.g.@._˧[xlP·l bb $bdRH[3&ȵW,!/<d`s:j\&cu<JγF2 bnka<˃[ctzYA4W4wJ#;7Si,:uDB;#lն0?d='C0} 8J&+9#;$49C نhy94Vzqz&5l=e5oRlʩ:ef g`O!||uG=K'("c'$Zrt!⣁rVsQmY6~+,2vAeBO̅mA1M _B$CWwavF8y*%crl1HuGBM{_awTL% D?-oRQE&K{K\In!?IDI~+J`C0lV8Xw;0\faCHd]ҥbT>a0!@\ @Լr <]L ]"6!˹\<p &T&"=<_v <-Y p_ pH_k?@a B훗#R q۷leыz1(1z6RFM Pj&LLѬPĘfd\<|f%< ؗl \Nыf.C3}ä.c`;1QЄ^(ʰL}XO$C-2nE|Q$^4M-F|2>*f,G 2ı2O,Y 4.Dr yG%WJk%f%YG85F vLaEolVSDVU!qi%xJդ[OUl9)Sd&IPնytX?EbV*b-ZKva:=^k:-bfM P weVۘexיM!ri8hQ]uM"hrxvxJN0,*((LP~[2lae[["q/>DÇ2"s̓K1 4G>lQ-pT ʸ%ą)[9ˠI4%/#0w V`_V[j){2@{D2(2C2Gkw1tm2B zǭw&ywx8W~w-pq+9( ޷ЅW8r+w:x]vM搃'2.BÝ<{{w/&~{w[9ӳ<@|.n?/p錗aH Pa:u2cxSOyAF̒ED`6-,gC Glaa6^"j.#,bG6di6J-P>?YQ3|GLKF/ǠC'?2El#f%JcT1 o4}("aT8̃.@"aizZ2! ɗ,dtgKIܓTTLl besrM-]cs)d\rJ!W)޴,*opdOYb;<%6EPUsZL20U=*IB18gHTC闧-zzr #媊&GXTi3Q a{'haV“PwHQAUj>/!/MFi݇Ay9jHG ed0r (V#!=JPM'>7Hg.RXK$[F'A]"Ta4Ζg.,U CDIcNS= 4EИDz>2@H_l~ - ~)og{ɜM V07۝ fβѱ<,5 *nrs.690FHDh-uyHip0AyptX+ Lߔt]j 8Ys72*P7YbXBu]|wJH*rArx)AW&k7e^4qHSXEezzX)z^bg(hW,hOewzȡam4 #{РB4(^{'Zg'i~7&yMzTvLXHAvM-4[x$'2.S(Tg]*h1)I'L,7ES[SZ-$Pƒ$_GH,*y8[҃\Hk6~2'ۨJ'* )WHIh63hk ї%0ਐ(Q և$AZ_d/ 6 oStx-Yi+'AlC-w (h_hؘ&Ww}2XRvUGyzfuh&De-V[6}Hr_(L(Ǔ҃V,V_1V)5^O*7skh7^vǩw{])`f7(y+s-ZvbMQx)mwA7!//0 UBRG0v^AIifiB^%y,6*sq\ŌRM5+9-`Zw*Xa)tp,ؚ(:*vtcQGKkhgP uw(蘛l%*hqihG)b-ɀY9jj8bz^XXRhiI(zY gxR\PGzI6  v\({_8Bbss(w&X(vunQ-Hv4&v"^mުIJfbB7xYшV +RKEx`[]aȫqXuֲV\ H،dXɩ[,ökgh”kHkx(g(_v6w*ڪI))U&f7eà u{ fas-ڪUf\LGmHLioxL"^vyŘ"T7xV CA~L 50jle.% +[jKڊz7x8ǔ*[*zy(s|;~G*C:k\"Yךxh(rYIcAIYrreἊ 5Hvw[T7_%{ԁ/9/T7eoh :XbmZRxWL**jG)YWdRה0X,]DEBQx~)I" Y i&,2۲)]gM12i˔rjt뒤'+- ٖ'Hj[{ǃXK1zQSС\AI{') aVȓPȈȆ8Ȑɒ<ɉ̙|ȔQləɜɉɓLʥȦ,ʔʪɭʍ|ɯ<ˬɳ|˸ʴʬʱ,˷˓˻ˮl̎̕L ɤez RQ5m&'/!zi T|<|=] r{s&`E{Qۑ7^BB@ +m4HN$'MP*Mͷ.,/-1]3N L0M7L=(A*яH}QI-JLKNuȓ`՚lZQ\$=K+yD=^M9]ef=BMP4Ŕ@os-m.=KzҼf PO Qƾsm_:0i37"S,136 33% Aڧ m$6ڦڪ ۫m=pFj۬m},Oq,^.Р-N.n6]^!<>A&2$C߃V7<"Bۼ7*tXI7pbpbbIFhhAfN9Kk,7Jq>xl;\穷~^ށ2yy& S|g@Y{'Mgkn)R\ȍߪ.nק~'ʐN*u(yz&κW̧ CcGNY$%/nߖ A_b@hp{l]jN-s|>IӢD܁ }XtfXs[u+i0 ,$ ,ubi ؽ'^Li2K:/˩'._2IzA|Z=@Gϻxh8"AwAj֙&[AW՚LZW' ʎ~4l[7o9tn|wŮR~JAMP =N)_/:ktT.c\ʮ'8f:?뮟g;jO1%FfP\TV Bv+]Y; mhPj7Oq&nXY??ÅAo_43X6T0D.L>m_b" SȐC㾘1=L fF:T6IƜ++.q\I4̙!7vh*֩j'LeɞY>0SM6.[cjH5+KnM9W߷O~*Xnakf _BrԼy"(u&:9eRZ(5PԤ6eҔ ͊}6) LPA][^7yUѝ/e8;kNV{h)>I|r"ի,B4@+Zо6'"L|/n) %⃫&I, Ê |A E\18. ELHk(%ȰKң(+*RI~lF$FbR; <6ǿؚ(!$b6QC4I#ISL&} Ehĸ)!RZ--.idoJ0̆ %G1"{6a̎(>@WaM(+`y5mXH(P0eU J*urlhb~/ݺ^԰\wK5v07M)$H9k4W)g=nr^5UZ.![64)4MDb hh 'k#-bʯ0MPaSu*g_-7[s 3iXE5&,N7Z)6M2kZ͠[YVOspy/W4b!NzKy^R`yO":<8F &a|N_pFe47$:C'ACQFm4Bh54bb ;rBU!)OϘ+Lg5Hp1` vSe2$ǧTV(>NJ:$OT1Dfu __(-<8R AWytTXH +t>™P,|oV]VÑ|K$]m@@Y&p2PF ቉&h!M`ǖTBN78-L+X&5.YaHL3^8eh ~i֊zDu_ V\مp *=S+2䁙\ȏ9)WG;S*SRH_Uu@?BD=O% , 9ӽG˨&h-S@+X@V ƶ̈́Q`b^ƪژ)OW&}_ ĕgaŮ.MEf"cP(6 vjBFFAny"Hd8d\gj _e5em_ 7$$-VlhLt"]h9:D(Ug(AZ;HhL})B.|,8]sz$C aNe +B>nt-8,22D"n)NqM;!5u)S(cHj ԲīY &;8C̍5|Q+.dgH<BѨ!B1T/?@mm@a"Rىh(7 B.$q3e~n"_WA$-m(&݉@u[% zTAOs);*2 V&؟ev#Lo^#&ZDjzՊE| ^ <1:`؂#jx LQr7m<@#x$Oﺉ؋_[$v䞙bXp+/2хT+Z ;r;N  ,JM` 8]h6rP#E|Z9פ Ci΅v#*o 65L- #DJ:}0&T/6 ،NѹJ8a%VVe }ӇZzP ֤x#a+}8IbYrRkNەi3"%?S4q"$ۿ%2yPl6NC2+'чgiZ )G f 6K UrǻZRʚHY+R֠.GqM3 exP ;APP!<Y ʶ[M<++xڰqðFP>#!X5w4\X68p7I fQxOI\X *DQÁS }ygvT(I>=QBS R ˩խ}R}3) ,@ QξpӰ9P2 F+<"sA]_N;oI3(Փ ð]ɐuĤLP/z^Ҋ}J:D|4L<%ԏ9Ȅh8 VPΎȩAI3к2إ")>@K!ޙ%!"6رT2RP_KS)#̽*Ø1( )E-ґ[ט;9%?B[{zjl@U@\49#k%DZ0")M_O=\QT]9 MeLf:"-FL:=fd bΊhBҜG Kqm;j]ۚѬsV\nO> a-ԞiNH!#,M$%^&=ä< 䣂H4)5<9# 2 32)ڬ z,"Xf;=McDZέx z˝Q }eZ :8#K`36,J}^@4 B>֔Y wӪ.)>Cc)I L2{|)7Xγ>Z{tפܐ8!#A,ƙ1bÀthFrT= }1>&"B)'F) 3XL3m] jɵIf5Ƙ>mϤX\M 3~* g[ڡ2-b?3u.i^_! "HU֞s'tz#  A\VU蛸ch2= 94'1{#Zg{me" $,PE#K*+'PdixoHgOBלrjKʒTqH&;6&t]ZXM-XڍM Αυ P:OL!6|@nQ=hlf jud# $:|m8c]EI b(jvYb&q$!q.ݿ &"(iY,q!ժ)dpcPV'7q%f-\!NVًGY+_Ix lݺq)BHK ,;' lCJ!畩C}&SAO + e(@8銣 .2 "#\7#a:cGiRLI b"+lK Ɉ^#^`nkpw*ʉOciMiFenϸDz^a s߾8qll5jΡ. oFsaeϜM|ԩRIH5jEz9@hr awsY 5w[of* ˲oQOhw Dsצ@9vd2MBiC߲}-Cm_}%&D/hE 5B2BN(˅ _ZLdS9D''zXrNz n\s_F+\1Ҩy^eL$7YюtW=;,ڰhPV3D.=I%һ@M)UW$'eyW-:nIwC/j8 5U:Ȝjk٘G*r6qmGpk+pn CZVLYF9GF}T0W rPSno8L$( (F $( 1 3 +,&P(R+iQDb6 dvqU^Cᆙ_i'Vf%uyf`G=bN)Nu pP=ٗaZ*œPKd\>SDHvR u9UydUxL=ݞaQչGb^r٘EUG~%R}ۍDRcM"v&jpDP)&^{ )9i)bN-)IR WSf,هT=%IL(ʃ q$CL&$WBޥe|)ũԙh祡8cťZJHр|du}qPXZNz1g*}J%7mlKFF(N@,#.(h2sG Р(s(Jȡ2P/= na#2ZE~({[|wkWڑaM̒w'lxq߇_Y4 \YGR/q0Eo\* N:h|7b99|pBXhDKЂ788IP(u&b.̇83b=pYkpu{̞f$ixٟH#wűtUr뱦"yZ"V,ke!r07 'XJ 1xI $G!b# gfPSUnHTqݒesݡ_FJ˙Y3NHɉ#a8F C$hNefr#'QiY݂61EM& |S&ΰILBQN75q#LpL!ߠS*0G@@ƨΈKt 1.-=wV;Y^R$E&7FEa[R`0s z*^G}K#R0٣HELz&u*JY{SLqjQɍ.V&6)&A6pބ)ڲ\bRx+b?5%2֧4:Oݦmb8ɓi >q'Fୡ/=՝)>q1X qۈrt Љ?veiY;G>pL:ӯ*%M\=0"lf:Pw0YfnI"ғf! 5/]`W&xD dpNnfoTCbuƒ"GKKn$*Ɔmul[fT6&;#Jč'T,W9,RzeAv2`44&j,G d r?Adr dn͑xjfGٌ`ô>79Z-ARXډ(Wڐ2TrkB!d+ r*Fcٙosͽ~;/x%8z<x_{b#/]rVi1u4t($Di VIn4o1G䥾8]J{UDOcj}bk'1O?¿YA0Rt~75L] "=-~U2֔'9ז#aMtAM`[!.KC4Vۍ)}FJFXDwQb<=D =H#WgVQ-dVZm-Eͱ|-ΐ0Kյ$T @VcTKI\=!iWn4JNLZ ! _E b!.bFɛ("2$^; aXb&~N>ٶEB$Hh}'hH,C4|GvuDu' ^!B5wyolEq8)MzZ%Nѧݕ g8aٚ$v4\ԥ qca2-לM$$%[tA.$M C$f%>LUœ$"dz YDL(8΃x($H»^7喴#ZMhZhCyG՟E缄VI90f{ lXl`;mYd$SE.ȟcAUsUMI!Ŕ4H$FdF`NٞSa"`mQP_2QԊP( + CdHi i.=&ef:=rRq-\С@J3~QO" YmP$Jq``SK]bƍ,$"Pi)V]>#^Ĕ>Au"c6{AA`Nm':D* 8`yUK);>IG KyMH2Ld"D@"b&K1hZS9z!LS< qژ͠r!M@UZȞ}%ܩUVQOr'XSq<ȀF$ wG1H,$J@'F i\akhCF'pp @D_|"4AũEf0b1=f_7 0e5F\UXXH`LT*zeiҐf1DihWa ;jSΛ~ARf$!R%HGE ׎9JDpv $N)AC;԰Ex1W) Pu<_.4,//Z`Ҷ~׃}^rFp>l)e.>C|6,C 9sC"*=X>8KEtj**>./Gbb`,һqѸIQ)͘Q=݇kZ90%Fh2}Q׭1׋؍R (ۤS=ʫ p40C?<0A(tp4q01/TEO u 5d3&4s A{U{G*X5q@ @@mDL.<;~)M` ^7$(7'̀`k!\ Q(3)ُ완4d &PIj`6aP*!F)kZ 8#M,T!cn\Vt0p ׃ C0@4 8[Lԃ:ǁu">]7 |E2^UX(Z/8Xa4P X_^c@dD:SxOd>`36yM_=$[ tX7BPN#poehLLDr/B(4+C5N7FTX T 8G 4qǀxXp4>lw)VFZt1;8a냛$J5pM%!!= BVh=E={&Ѱi?HLj;nlb ^RI( K1 R䥑tڐR9mRRd hq݉Z{SO-K pwC+gpB,<GIvID&P20P{0n$ֈ?Z 1Ŷ"yI,8yŷ.F^57'Ez AC,6`E;juEuEIi\x i`QH`\# >HJ#BȾXZeTfQJ?!v ؜ Lڞ7eX^vv'siX ?!9#A}?< ę[[A3z &5DÞcGbODC44,@"/lS♸;3B6VOS>캭e FK5!D J ZEʕ;Ƚć$'\H@DJYebAOپe eڧo>z]\/Z=3:W/$H!)^Ǐ,3hR!ʼnI^lrB C0aυ$:ҍ$83Zh#G2)RąȫNJ՚t<X 2vI>a1B6K`ўvT0 ZFƈ#P j[(E}w9h5+jJCtY̖E.V1ЋZm%>߿>xq}lIw7*rױ_1*Qu|y52͹/d5wg/P1klaPe5҈A4xdd4`'bB$1:*MP.Jd*( inCG0⩪l*rؖ^Ǣ\RjpҷZ%(ZK(.RS" h"qK8a '.\D1ms)C"0X==l|xz&:2JqIT&eZ[Pe(C$g朳7p7b#0](mN)VsHcgNBK G\O@q$C-֊l;c% !MJD 5,TCzQFb2DT!$*ͧKۜ\:bv5m,)Fqa\X?n$ܩ)Q^(&)EbPIoO=1;ccߠ 2E&J SbQ$!P _D)h;ȖrQ)PlY@}":O Q)"x;)i"Aц^#^%Q +3XxфPV[OM+.kӄ)L ( HԇDeZ2E-(/F/ڐxgF3qx|;j=rdlHCT$Sͭ{ )"iPدa|g4hǾl7d .Vp򼵕w;(ǎL1;k,¼;%IIVҰ qqNZT+4Q [` btj"`gµ(ii7 #'qrr rG9.YڗݠFm9>_^Ơz: ACàb&@0 t&Ҡug1ʏ>᩻wԪ>PJfizs+>e;>Iv)d%XK'_[!1s e({3u* jܗr]98]~uս2}@]I;~*biIB'B . HCbB! +\TM/z^<}`fD,4b y"Ln?Ȟ|p$h-d.`HƠ$e,F&1@Au&v / & ߩp eD dHȖ P/^hjC   0pppPq  10|,OVde1%qtmI* L$wr& c0I m&-0qH*@aHMP({F>K惣6&0qLjD6 ]NK+ˢ롶HR)a|LR˵1'JBdnl)0p0  dnȣH!m< "CrgD`H>y"$'AJd+D5!Iį&p<'w~(w`ʨ1j,Hiόl"f 7ଌ|I>4n7M ho,K끸R(Ӑ?xҎ#r*G%N[ʎ+*2Fk/191B1s("s/31%2+(H0S1%34As4E4I4EЂnp3Q5M36as6=<0B#GLsH"zv0] f`!HD@ab0,&@dLPmxKx)p"wG.NFTrtoVI6,<_SNFqO#&q'K0T$zhZ1-s鰎sðDU2,l,G"Eg.LEUX,`'dtEτ*p#!H"E[(THHIBItHH=,J3U(EGLTL%KQMTMwh(˧Ŭɶp z|0a놖/du*J3z$ }/+փyFNj%T|Lp4$KT҇j/J/%h`h؊0.d#r.ƔsLHBҟkE%_+Ll+bk[ D[7I//'L@2+S%(g-df@$G⵱] lri0TQ+bWRdJʴ6T8Q1 H8,&BQ솊ot  ql! v R:mn!nVmV @vp p pVnq%7r)7q ҵƆ>fZL/n 9'L!IB`BT&A6D\*ħw ,*ji5c`/t'f/C^ 6(ʵ4j|z\(d"bp/z. P.0~A Ѣ!>ū bЏbԕ6(:6rr(³zrfB+bȽ<djd>W:/vԲh8?R/>%(lDN`Lv|&xLbLb|RZ]u.NI5Ba5 *\TEߍ' GsVa?g 5mxhh Ȱ Oo"GfKOr(J5 MvBa BΪV,W&H~6<2tc5*x|}VkiG|p8oi+Ni5 43ِG&瑏khԋ`.ޙ|K, jh^dx.LSYY>B\PĄ(Ts:KyS.7‹'Bij֤\n,վe{.NhPwPw&R~Tisu1H bk)zON?Y '^E~tLMoGm h)bl6&ogǪ➵ gcŚ#+' ;.b8Ria~%)uLɅ%P9=Q{r*mjƘĬ6U*`Fi؜q(al|qSg-b <_>%銗0~t٧FZ.挝? #⬭X#|8y$ei ݖVi&b)^P mfS`ZxDm4iԆ6JoA Jpx@9â{pbCU4Ddeُo(EUFt;Eʬ^%{K+@4ΥŭfV"4 [;dˊou~ȷc8zRN>{\WL,i?*ZNp n6T!,И2,D+wДm`*;w̤9h7 AHbL\&ϔ(zzo;aܴ89k,!Kb63LHYU7D6MTAf-[8:׃"˒| wwO&"=O14s )uU.HuQ'RVqεaF@PR)CQ' tvSZ5,'l`j#>"_(*]ԑQkXJWv~G>E5*j-rrɍ*[('Bݙ9ԎɮIS|û䬥qʠG'J.9ݪ #Z&i ,h *det]xZ]*ՑNښZhY~KSE}l_{V}=(:*%H%l=X^"8ƣjM>Oh2%WeIb">zՋFo2S}V-B}&\xE9dJ'!W1Ӿh@(hBiҔFM i&);X)40i*s(&Cn%ՋdGsC+!.D8eF87N !ۓWV/UkH…>2K:ܘų ֱ\'#!.r/LEqe)zyݗFξY1w˻%b U\LaW6/Ó!Cۻ?|#ך]aę`Ɨ]JUM `Hß 6Mpr X%CJ$SBW4BFhԓ(d + (\%F\_TOJF\VrFBb57[YMfaYR}xe䒗gB^idfIʝuuvvoGD>1CHm\D#Oz՗\hiuBj^7F2i!]Z(qzꅕ5k ^vDW7ɓ [^BRƕ`j3lf'mBEYH7Qd&"ɤ`M (8TQi T&HrCPm" DIX]#ѼҴy[EU)+4`Z6qwwԪX2Mrӻ6Q[_qb}<9( #<"O>[ĐCol-'\_E 8,m&_ @ ֛a9}̱i_!G2)ς^NMpMz`y&KpKz@g/AXeoZK)cZ<%yhC>;RL7Q(&>yTĻ%Sr҅r[U>ǐfsA.b'@+~ _]'SX0d"(+%=hH2j&=JTkW}| pۇ0b`),Y؂ÅST&1Ģ&0ibqHs& V(i[O=`iueyt[cc*SK_dfcIȨ'? JҐz E)KO.-HL$$J Yc]rYf!")T)}& 1t39L˞LA* L,dd0">vQf0]B*59]t0sNAP,6bS*z91dFedрbx 2 ЕGBuI> шbnV}iԍ "5qY(4%E25c:U:̀$+D 1iF1$ M{Čl2!(LҾ;QOSUw>2` C}T)_B̊c UʰdOI@(8L)̌BBx8Cp@>v2YCј2!Y[lae T\UR+`baĸ<>ё:<%Y%\I2)Q٘\hU##G0MZJ6gXathotepy0N 1 eޙ)}I\y% c%{BK1 ӵVv8HAv21.|1̇A-5P&tEF|VMM|VqK4g?0a34꣟;D:i |Wxqp&CH Rayb&r6A0&!3sZVvJa4dv-'w'^ ևT>Z16Sb`',5&%yCQ1uFnm ئ"%(1{^$4/ Dބa<=Qd؋$3Sb!d'h/{%#bJw3WΣ V#iiEa=Ju_ݳ E  !Fz2HLx'S4or>^U3uPZw] X2"1qHIAUxG]!E5#[i3ug1CiQe:ESa`gAW0@qdYWD13JЀȸ-qDY,3a 1J9'9?%4%2hRdW}_ Ag#DI @ ڃ0Di11(ZALlabbem.\ĀwwGڧ2'c`V/5HT9V224'f^j!448f~%KjCsYA7;1K.UL 17ޔp+PyKh4 %9!B)ݜYEJfBJ ԉ%WXVa!߈s!#T( `0^Ms?- H Wvgib5LdzV?3}'S.sg_|WJ#)!b1-8V> ) ':ׅ]E?*"+WMWAX<<4 !?yģJF~eX*%yAח6x42["1yDElY0c04RWp&9xsJ}R4.'-X"ac؏NJi' hyf1A80 *Čh$n106z7)PY@r&>bAʘLzCsݒ0i7X.vRnuG}b 0i9Tptד=A= @<VEu8Wij &+ mx :Av.}Z?kU@l%&)9CJ$@$W8騇&zVx>=ɓ7zxpq" YIeqDi,Dc>Lg4?v_.c6x(!vu;҈5HH 0 r|4Q;cQx4v{׉@ԱuvY1V:{ W)']Gih*[2t>aG+2q'yc;}[FV7'k30n9I0aYۋ}{&";(sk(-H ICU; =1P$g.VSa( "^3R|d jۯ'b!#hhWW?s*ǒ#|x:J"Y(]fl:)0ybJVUqR%c!P{$ ؑf$4;.AJyᲺZFs'8jѨJ}+38h|tH5E< H@hH$ijLZ[^0}hugDGe[sKؑ۳2#\Ld?q7vRJٶǔ 6WyN={I16H 6,ȷYw!0kIʥlʧʩʫ[:ʫ,˳L˵,/a˻˽jA(~Xe v;lK&E w1ۺT0YtM%OSH qi˰^jV//Z`vk3Ds?2jkmӾJ۽b63CslĦ_)FA#k9E-=ʓpi=ʣ<}sDqRWf5auRr}J`x[L{VELe_D #aHn'U|&9_mmwų+ VcQ2v&K"k>V*?\X}̸&(%] bUR]%%^Sڱ!*]RmڥڧکګmڗkMۮ]۷m۹v^ۿ |uLebw?(^ImiEE=à=BTlx7Ղ{I^ {á%ZH]{7eNӠ\$RɁ%jsͻ ~Οew ?Q Y+-pd47~z9>;U#"8V2Ubb䵈XKNnJLO~j9埈 a/^c_N<>>+&r0Yj- ˯."dm$tHtt$V-bH>KÃa_qλ"&Au{~kHӍ7v5ll1 ;7|3>^5S9 Iv%?~^Ҿ ɷNnJq>? Ï"QOx_.->W~'W7x(a˥_r29Y@ @}1I6Tf@ $Z;ݻ-}Zx:kɚ&ed֠fK<!I#sdrȬ$F]%MM,ғ`0X[̥@ɧTȎ,iT li׳ihojqĠͼ{ u_ŀУ N,vilP1nԟ>՟{jOWv$bps_Oo?ioUǝo&D:ø?xv" & 9t0| $y슝ӑu/'o̡b!nRX?{^| GoDL_z퓘0DYlCy$ɐFhRI'?p=-a&.F/}I.eSQ60genkeFipiժUiP$!ٝ*)hNh J|hPo\HV㊙([Y>M4iR&4h:K)S&4+X˕ jM*'Ƅ>eC[{ш w()±:[mnuaoСI0u"W^DsnqO );@hPI6 lƫM(j; 1ejk9zBYE"J ڧsԱtE|1N?p>ˉ$s3H#*ګJx lplh6QfP,4ҠG8dIB< k/G>{/P<#:FCp;*q>K7lCVbC?\ R z`0y?ꉳSp21S*7m'"a( ;;JZ'&B(Eءl,lA; ܛV"9/z,3XقPX|PȇBy˻4}pƕ2hȣД`(!7 uXv[Hũ:6:? xC|CDb4K4#cZD*IȿØ918+hKRa{ ˔A.<)A0 .j&tI"a9 2oaYRv .y𸏓OMKٛax.1:Lw!@@D@y?hM&9ٝl74% ¥D!$YIi"8:_!fiK@/OJ*Z/ڳv|}؂M FP$B2X2pS?9u-H휦P(61eR:C7LLQ,-›yA:}xGC+CeP _F(9VC+}L)YIPAJi+Izb⟅gmerF (C܇,ͩ$pz0ȋGBh,U졞i A᥊H6ӊ컺z2SФ(ڧ54Vc?ѐTZQt\2+0ѣ L lb7Ipeh=y1А3D˙@0Sa8^OK5GH$b4!0%bEQZO }a qFԏ#LBEdH=z˿ꕍiБprG4ÑZ&NȖ YuDH0QiPdC{5MmTMNÝPFCA,0- 3# $  lXx}m_CE}SBKDbBڡLh:,QQ KwC" qF1(&)miņۚ"Kញ9iFӾ%n x'b :jyE,_aل؃ Roꝑ0w;cTǒC-b#q# #49\~]*DشԸJ, ǵT" K C:/IŗߥOۀ3Ui*^ BI`}bSD'V%^[ *!(CH+I1G!ЌpM%&: (ŒP(z0@9Bèe$z#0 V Zxί>IGz˛꓍ำC2hŃr}5| =]0D9<%ZOEp/1ȕ˄1$Ò10}z dš6uDU(n"V|k ܺ*`[jc0ӧ v NLʍAI(OeX9~&sܘia8Wmڠ^C`əjqڥ!4";~>0n"+nٝ6[ !SdqW19. 7sÇR|9yB֦\ssLVKlu!z(I: 0봣Idze)5du r7M'Fbڳ7R$1y`)g5$b-Dq93D;/Č@^¢|K[Ԭ'\ы8̄o[2d0) ntE\EPa/V+pӞI$ ;D& {)d~e44(m3EdQ@OuWmCZAF'kܜ>."?:BER~;*NoO7 6jKĤ[9,9 63SMџ|A~** ψ' a.).Ey־O^QIA.&b0nlMېz!9\ ;Yzɩ dOfy%̕%*6Pc {jk_oF7b8PJ?65z-IW~YD>Js+Hd/2/"m}Vo_&ÈRXO_ \0E)G}WNL;"4YPc4ZJPeņ)4ʒCLSQMO2 Jѧ2\ѥLjM)q}n+w.ݺv$V!ʱx,-14?5x1cƅCr[@ HeH <!Ą~\Y.lȑJ &5ibJf⠆e{ߦ鸒z _慕_l 6M{;l/Kk^O?l͐˗Q[)PC}mgXk'זZ%EFv[YuY5pʍ(\$*"o"8I;@VG-cUVEzUHidTL>餒M.)%N}Yy5Ss\ eWb Ԙf 2dfj'VV=Ai%TSSV{g|蠁jh.JP%KvZMItQcIݔj*wt$)F8DcnjCoG2_M"8 ܝM15iAj4H-M|i!k)I -wjKۢF)h ŗ ĩ[J}D) . |ӄY õlèBY: нgK'<9X)¥,SE"Š<3. K ߺ򕲄 o4L4CZ0OorZ5| m[ӵdY]J|d#Ij;;E fC3e>8n:bq~I&bSD;ɦĂp-Rj^y,]JV}`{ :d.jD֗۠)HfNn{[ACE;7F1Էm RڳvһgHޒa[i ^?8+~drH @y{*`%4sx5Ps :Bwgd\Hfu2ysNO}꙽TGV^B}Tв䆠tNxY+{y6O ݖw!)tjDP-uAH8* =[!VN a2(G@:$KQtN^V՜^4 WG6f>V5] 5)x Iii+wnNL4(z4V4}qq{0NuTgV[&j lBf2zCg~IFkkm1{O ``ƽ KЁ-C3 ѕӴAJE^=Ϊbh7Ƭ)%$0V;=dj}0IŁ|q\GxL HvPtI44ޟ=!}IGj(0Ъq嵋ThJe4a\i)%ݾ"y"t؏id5%H)KL\J~d&: xƐL(rƐθBd)Lُ}d MUrؠ6^ ۭA'|E&S4EsظAHSĝM.xٲۧhoFUʐqaYΖļ4S{ PT!_%9%LK۝!LR-ْtJZxVd8ڐQ f\Y¨VDxoFIetRhYIh}OVjJZ▭e `eY^hY+xIfՙ& 5%p'g)Mw'ejYbg(l7k=Kh3T(-Đ3 B pļ!鬤Jx;~bawޛј$+ U9ry>EuAVsaQtSy[v.j~B[d7f5ۮ}/Zu]SPBQ[Roږ(ݥ\PlBik^_^8w^w-cPJ~[c^ p:(X8ĭ\MO4hyk/#h̾סޭ 1F鉃;llvL7[h[do.h )n|61㷚o4MЭ+l,(]|g2W7gUݬvCqy -+`0*|$`Ff᠕E?)LR>57咙-VƩJK`6Sle0OT@Oe{\uHv(LwEͅI*xͪokiN@{ej4jd"IVR$%7IKz2@H&9I \Ri)5ᔜ$C(+IX%)MIJ5R :'_$G K]^|E7X{˜ y(f*a8EN/Qc$MȺǯ qcrqEx J` Զ+`쇮߉8Hu4o*Gr~NDcKw豌D_HY0 (R.5#=0םBSqa I9+Kƴ6OH$wzr0@Ss) $gČ P7 0mLzsq~cJ9HB}LIg2Q]XݒEF#+q*N`W5xXJ AN6kk~&:j^kX d>Ͳ+DRgs](wίRN]LZX:kLkP@ޱ"m@7.XJt7+lDۖ:.kѪ5-x^ sf4wmdܒqA%:]q`թX>r| ~7K) 6UB]8}$ < 07p.poz@hbsQD0Aצy.HO ߣ> ;'۫v]eyrVS 884P;dp (P]﷈8{!}ե[ v9ji2=(_טPJF 8; Bb1cp(}<ƠKCc,F2hL-a2!jLu%y;D&o&5.xkgAEec4SȚ  TU؅?WI)7]w} |0s4qf%C1>t!{X|^.M!|E٤Aq!Sȷ8[RM/}pa"s!]~d}(Y%w)U%leY]nyշ-y)ǁo"h1 5kvi;(v1Nf0qu `'k R*rN"bgc[rM&3o>ؑe4.<;`RzĆ;sny1ǫ\gˏR[d0W}/}#!ڮ sCIa=wWƮI@Qߏq?]z38PU}{3!FuYͻUj >iܑSx|prpQ Bfwio'Yw}wossggnƀhqq#ZWmtw^ F^$\aHL11h#{f5/5XPNmqx"|Oqu~XMZt N6dTqY>p€tEG7CcE$aqh?WDMqT]ht]DaWN{BfP9CE7JFOVWf5|H?U??a55 ]_YlNV\oc C@3mXE9H`"%Pv|,%X4O%b燙t!UX^V4KU[w epxUlC8"!ҨfŁq jCQ]5hU8{u`HT$bQs^EH)׌$vO1`KRxIIN)TKLOISIOKj0KNJb9`)ĕ4KԕbIdI ʐؔzK7y7*PSew=ejH1gXU`ԑ8gH7Y[_u`Ta!0=h@&R PYRaHI!4rX`.[곊޸\ͅd,gRK`I)Q tV(Zlg2(r%aX?ŎX{tփEב)%ut%gqFVt`XqZYh: K2l5SFY&Ûiec˜7U*`GRPhPQ%?dhU38֜ &ClZ` dĨU5WST(eI$TBeva38R䤊[ofqx^Yat2Y^Y_wqsUkuvoRpEV:^kiW HgϠrc_Gp8i9J(I)]RP"HD_UmPK`QʼnST((@BɁXB1+| v sQYGup0jDu7}x!i>5>ŝq壍u (t+OB8tlaX֫>`xB] SeE dAډSScU.ɎΙ$ؘ̮)0dY8(6( >UR heS^Z屦]gρ9_Acxɂ1!a6%0͉S\&]՜1)eǎweɌHZ|ܝBߜ!9a GZ%ymh+JȣCf2[ )#V==[eӦzm+ItHǩ1UQЗaԔrFՊE8+#ɜOSa2H-ĕDDx6U#Qͤ[4hfqȵjBxu`?5SiթE@ s@ !*^Sp Vh{a{[T'Rin킫w`<]pXa]^]K]hfXqzom@d.q]i pJj?rfZ: |wz@gT1yT ա[@@ % 'moZ g1}+$Ş\sXx{ c9^wW~X6Ӧjp1Pgk'\Ȧk8 ,QEo` n gjEsnyZRr'jGưk9 _|UKuE`q/ U%WP}@fa $W VpG@0nn~65,uoP u&J!THus쩢z1pa Rdyëmmr @& Ucλ VkrK;+F{Frvk KS[\UK߅x[8wUUPwVs$i1& 0ge)ѐ .p,ƪWg k{f>+b)/uS?oP`'l}[w|d6c,h ׽ `zWx!#}Ջ!}5Tzٗ1#F U$xÆ퓸BS.ۧO侏(FSYp\ff̊)Xɓj<ӢA]VR%ΡB!BbJ\1j1JS!*wͲ +wH0& WG:d(,F(5 Ze1"=|x0ܔˈ $';rWYՆ|rKrEʚ"L nL+&ۗn$kyՔ̕8KcKI1Hq 5 qq<v,NPZ*+p\[H Ƃ!3N5vn1] 0r7$㍖*\Ps @Ji(bRIcZOm$Mk%11ko ^WzfJ CA9cL2칋oh)E}SIꝢ2b0xjH[0t~Qiz22)O(> %iFS9r$%ffIL[r와e!d[9O1|gˬޚSCV{$1_44ÌAJzb0(O'|I(7Y"dL(7D2QaqjQ7Ă Oȵ?AZ㴅RLN%6Vyo\ۮe'fA_ʠ$0,Ү |Υ ,wV1?[$R<U$~e3`L)'hS ˘$ᗎ0Y l2եt,dG '/t eB1ł5Wvt$%kȊ4Cɪ<4fӥMfD†V$ )'@MK5Y ts9x31y3g Zj3=i?zѕ~tHw&MgΚԧFuUjVկuU1,DzP2$us51.EFpH[7h4%%G5)Vratmm7P66Nʼ6md%Ԝ|HlU&nE$UYf ezk$"q,m,H)Eb;]:C9ccJAFֈ#n&YaL{᭸f:V@D9*Qp##Dtq АcmBW:˾5]k&+8evauǬ5tWKs,|ុKd;=1V2(ܭbE.B9wV[~Ps8eRo=IGke$,yzES Rԍ;Wi뙂#d;-Rl#0$pJ'NcOweXpSJ\l EC/-"P؄}+ |J1R@W\ظ ԩ&.0P8%&rNZI #0 RSX"jR@aS#ğc(ўM(Ab`Ё`Bh}xz"2!h% X-ؼ.d?}!ױh+o+8pF}(FT PPI- ًX)P%SDhDЋ¡قWX!:bMԇ*Wڠ_,:;>9ꕢȣYԣ Ҥ8PL8Cz!!L.8|ݣŔ`УD;d)oG&\ܢxTOChZwڇa؂VR JZ(aȺHNMEL\F^B!}0}Đڥ!#AA*=pxCS\ z`Dz#&O!18:g覝N`jCz vJ}С>)( &T2"--*?z52THh# E@}:#Sv(*. HC#LXk]$ ?+ZtYX@82XI} Eh$I# Z{ԠA(GE`NXÊ 5(3t0ꁰzҐK?lj9TJ!5rA 8`O3Q BЧ˵Rd@ C2;,rzN()qX1.C .ەi&Hy0!ٖy 16%Z+ K էm?̙.*JL Xi;ez+DP'U (:k9$%8bûF;(1ǩ28믊#B:* 9Q),*{GE rY/^9(KZAdԧ(BJ832F4O˴LUCs4M?4a%V54N۴\3^4d}? =;KSHj:AYopqEcLȸȀ s4i!0u/q"|)(P ᕲqKÚS(7 DRSV Y!8 rSJ҃񭜈N"ׁÏx17i61_{Y=}x)3ѰBtdy2@$yUJ;Ц`j2 khp$髷.[%=Tq1ƛ{q#Ja) S(@tkS?EqP.SWQͯ(18{XœkaZ$ ӶH1P2a"`SY Z%B0+$#9LZE*mCۃӒ5E+X#Zyq;z0[PB5H]h#%>֔b \ƒTM/m#ےȖ4e#2}RؔlrRZ@zğyZƽXy8^ԊDY]U#*[OH"!H#2m')Z0/8a\&؂cSH0b( 8 P< m$ HR0<Ģ9fB&Dx&cV1 y \ؤ`)}kDS( &D5f{GF 1\y-"0k!‰j byG/Ġӿ0d"- ~<˃Uk+?v v}؅(Dhx! x#aA ~ )+ ajOC-9Qۿ J aڠEh`ḄB=H(CHEOHEuuB1/߱6ӔS+J )3OD`ܷYM$E 69. ` QˋU5)Q&*#b39D"@w[Ɏұ++3Dgr: 2co)1S$J#ӕY8k)h[5 3I SR ձpÓ]Q(J'mx2'5eϘڨY8)9}1[7EUϾa)t$&<} 3뚥Ş&KBdq6alȉy&s9>S";&0ЪRfb|mdԞ3]a4guVQGhO;VV=olph5p@3gU&5rupoHИ ϖN V}WS ;jhdf-2.9/docs/hdfview/UsersGuide/images/menu_window.gif0000755000175000017500000000614212050301073024110 0ustar sylvestresylvestreGIF89addddddTT , \ԅD$l|dd$ t|$dtF.4dt|,,4gTt,Dy!\d丸,,LGTTdtsdltDDD܄,D,tĬ',/ 30,12,>@=H'4k6&4A.Uf=Y^I%)mR-#;%u0}\-eLcgF{cvmpQd[inG.Wt lo^mmk(ɯ9^ VphE@8X[ :OKcYmUR v?}C,fy2c3q ըׯ (ڂXDT(!˓2-َ*SHA G Z !r2 ߒBDaPy7[V(T0}:׈&Z0m:W7Ȅ+|T 7MQUt]ؾw= 1[̏X/X "H4Q#sEc"1V-|dOF1Cj|uDDKڳɜ $(x1KaBUTA*F24޸(yIfhƠȂ%LN #SY6z)E9J-r4IMIل%mz8IqsxΣ)Ndxf|aI$&|IlEcZJe҃ G'@iKt!8Qd>Ӫ@FF)84ShˠS Z=h5ogP:yj)ѥG*5TjQB^jծT> t*ֲ[=kիX\ƅ۴wݢۖl_`˭ws M1ƃlXʌ'_^Xbǒ-9tfѐ7dV2֋{پ޿-o⼁+7Nyqʅ7?<:tء >zcwo^ۗS'ݽw^]7{Iw|7 ^-L~؝*x :8!%`,0(#5'"Ÿztۑ iDo8CpOM4MNN>DT=WQjɥ%%ejZieNqIgOvf4k~)dz桉B%p9uN' vz'zZ'>:~hi*~f*Ɗh|ڪ簠*Z貕*+:[+Njb[jV賶ݖnr&+ֲ KjK->!li K3 DJNRnW\oVtnsetSL7r$oL,nj2+29,5sAk=1 9=2Q+1U4&4M{}uI5]w|4Y=3,5auN}qbM57CE}Rw3up[jSٗ=2 ΂>1z +zN @׮@2! ZE?~xo8s07޼'wKN3Otʏ.Cvٓc˟7c~ܯ/?3G?)CJr(Q/z %!}\ L.X ~QH60<'ߐЄ!t X"!F&)lD" aHPa%UJ-zZ"E2~ьbDcF61o4ߨюucG>1tG9yD E:Ґ#)JR{d&1 Mz,$RL%*0v)%=dc+c$dFRmpG\"z0wL2f:Ќ4Ij>s:x!JA&9}|9r3&8Az:Y^:?h10>fPgFl("!ER*A"Rw=fT-LC摃d1).Wc <8:z 1`*Ӛ&)MԦuhL R'A/cGGcA57@jJLJk*R8[jԎ]u=kH ө>U/i]z]Ġ\zԒ4)ccYYufT% z uuD@4M%r{QLEla@6.mm)ǒl7Cp5e?{nz*5(nMl2kzo6-v݉lg,Xݚٗrǰ e˜Pjz_ dE | WHtbF3I(X]ыaxhǃ+RLbC]z{qsECUBެN',C.$Ζ9A/kc7&N0kcms|f'Ye&D :4-tbi$jEàVtoT18A 4@`>TgPJwUa@'NN٦;#c[BaOAdڮ*ZS' 2HƷ_S8m1.U:+E 1& HݫĎ@R]9=>js8#ߧ CBp\/u[GCK,;zPMf=o3g0m8:@><~T[w(wqtOIJ)4ԩ.X Nr ay4xsrƴӿ3ȹĈݳs918J^.8O+E?Kc=0Ox#1.)cL{rb \@}5'crр7&ʰ}\;tg\ ]@iFW`~[@o/q40qWD6&\bF} $ ~ oPx˰  `+~@ XVG\Hkh R}1 V(t $MIj̅A7 c3]S[o0s1p[Spp1t}eW%8M_h}fmi0@@MM0a1ʈ$،̈H8d#hx׸h%P؍N$ @3&G6?DKS@{F{v{ L1i[אWO(H%Uq)b8& & @ wo : >11f`{te ^Hmk|Z~eɑ_i 0 A'TI% R L;Z O PEPe scGFP闔?S"}Rw@&^Ʊ%,8uwP}0Teg7a( v0&\FY9$89Ƒ9Qx_YibW, t/9 _u]}y|eqř楖wy91a ^A^YH6&6k26$W;V%n7a_ ?' Ý %옝Ys23nAC{I@8% FPȷ 3}ER|I|Ƈ|HQWELU5!)jg_ehkS7H^(pIS:?q} nIb 8QVY& r(pa9G61 ֦9ꡥ6@`0 [`2 gHn±~?W[aYZqB w0t:I`qɨ )u(p>SW^ja5RX1k ˠH8Z f:q 2YS蒞Z Zu7:_~[ J,6٭Yy)w ;:X6z(:$Ej F & i kS81; +6%0 kf6k5$@: ($u Z%bH%{ZBYKh)EZ@iW[2duam&ya?k 90ij0pjju'pcʗ@*X~Y Zй) b7fGzSkۣ6ꜢKoж 0˦tx Xb g)5%*'ŦC5qQu.R%HikM9mʿj] =m91n p ='N-b ~Y͌`U:Š9z ˾}Ț9'* *pH>oP$(.ԧºm h3P՝7ދMqL+!=,x»% sBcl;1KJsRbkλ}Nøn.,M{n~l.>!X Q"ܞ ,7>.N\7fݎ9/@CGoEIMNM0H~13~qD!)z/fib.~~׎/*/{&.~u[y︚u*OmboX9 _^{.̮Y8PgMt?쌪~^\ʞQhBD!/uˬ'mu8!, 2˔EۗPBFkxpĉʖESFM Mj(~41@P%BaiqL0 Zĉ1"ă*SZY͠iPO>oڄ -RS^]j3SY ux+Ԭ*:UEMk\)iճu Цp16YֽrجZȀFvlYםC2Fji JWeu)ghܭk߽~;8rM7󵋍Zk'E~P#G܌͞k\Gޞh^?N4/;".@+=s Be,Dp/BIF|Ba\EF  eFBG -2E4I#<'E"ɤJGe0\K+;,G$0DJ5T32/1O0-*J7e O7P6;?D3Q.9dP3NLtMQ>D!H/U:K=M&1D+AuK5 msQ=Q5W4aKUQgeh}iTkLh 3Is'ZR Vq ZuV=OdI3e\V_ W5ZttTvqʶz!bybZcո`ݐ|xևA8ܓ=eaՙg{]A fZul#R 8;7H#kz뮵k&뫁[ N m.kƛmv[o&o?n^[#\#[/{Ow[{uN=v]W[u9]ts+܍&xGs{j]774~4&4&1?L7G{秿~?`8=B@sMbBQh(!܇2!}@D E8B郄'Da Ux.Ѕ/!w?2~-d!x@@p̠eӀÅi'&DT_(NzW'aTxF0iE+FD1u$E@TmOiB(ґa#A .8l ~0!DI $yJzb?RZF /D.Re XF8RrQF${_Rל2aILhv`]Ƅ|e td,i)r:TH"YMVs!܁AX>Ҝ&aŅ&D&D}P0!Цѓ h.Q.,)Db}0>>hB>-Ġ!RTԑ"mJEZh\h.gIJ~hP{͠b mdGFT&;P:R5h9r.fQ |Zq4E:ՠ6T0TLh5`3 @jE԰udb*TMT$es֏5=jцss/an804ZZ.,qhWq?pM7F(Yy9~>'sLn/\-?2!W9`F3 dXUnbXRl(ܤu]H#K2õjS.Q!E*3ɸjC]_'i7K:V|RҨmpcil62*VĢdcO-NRսmY]dzohՄ-2XkN:jU,4A-β6fg=hGXDU"jbTuQ[bՙhqmﶲ=pW}#I+ձ3LoХ M7kD&RӸu >:! ̩оՠ\%yvCD/_ %kd8T0F`#u쯏3]U)#.J>9}?.V9#߷R$ORW6ᘑ C#(O,TzU?d2X}k\^~{ǧ:fC̴L#8`{;=|o>o{+g ^?3 Iy~K=z[5BNloB(]sӪ+ \ߓ`EZS!<$۬F p 4{<T$)B#$A[Ț P0R=2kCC9? < AE%PW( 6 ]* \"?=2=j BB9B$="$> B4$h8T!krN(R|Z#B:D@?Ej,l??@`R1;06 B¸4[8 @8/v:=`LJ9}9Kk!±˽9=/*C0 4 L13+/:( ޳"$2K9ɚ2{%;!\`tG[) @@Ӳ:=#8Q0{?R*20Z #Z3!k0X|T3ʓ99r'E0js(;ǂ<;K:IB=9HAA.^C18=VMrKTrMsΓLs)4Y.`%W,V-@dZ`5DеCʱO#:]Y*ɬ]شn M[5QY͔AͯQ$=]˅L(%.U0$' @ҩ<[;jv]@].8x} {ňE@EeK-}ेQ*k ˒XzJ &E#͞%M Z_f\F-+gٻ+EгxUݷ=F\؝U-ն͠R߷S9.m[-U.-\W2k`\mI.SZZ$Ј,VL~ܿW`%3_$ڿ F]YO"n[Y؜?+/K$m}cbO}MPBz(a ڋPdS^}dW}PҕhІL_?`EXIZ]F6#d5S^mE*P/=EM1x[\g_c=mS y`MIg-VՕ@/6Yթ vJ"ӿ^=%9yFУPb,'c_6 *eDžBʌ>vXEZ8Їy-HPie0^sEe/e&R(JK怒 "hhy+lfW~ ^[_6рa+c`O^dVf=`kdԯ`e_!`*6ް[Ne.nHOjxT~ &a8j&Fkln`Sek_n5p>Gtjun6Yt OWD/voSELj om|UǨ>*wu}2UCt^uFV :s?K hd7xz^r_w_/Lw_xv؎wYow7_vt7taPW_zPy+bxoy_mxgxOvG Rg?zqWzyuk_z/zz"RW{/2$Lż5z !Ϡ4X:V;>Ѳo˿Sw{'zt?{wzozyH'zW}nz{o}^7~@tF/Y||Ws|}~}Owyos~=>&G7xOvH/Ix HR?H .oI-#e LzE&b=+JQ#F=jlHALʖ/]:3ň=qcȜwi'Ϥ"? TӨ?d!D)z%˕^dž]Xʅ<&%*G]b5Y%͹zӞ{Avᩊ2FwLv|Jň)QC}G.m4}cRs2͒'Re5u-beMeLJ,vЖhˍ61υ>e]y{48 ٍ3Ɯ3xP3OD$^eiJW1ma Y_A ڃ(uםdIT_TBa``eG~Y J7V-J-cB?I9MFi&B z9!0QIA6VE bf%w<9QqgiDyo1UH`VNhUVh!n8(F:2ih]Ni*VE:qj`yJT*chr} 2Ɗ{&*^YU*i렶ݧrDa6yb52*5ftAh( HCGaO&FQ]VD؞DKKⲥF'S 4oCi.>9 I*y riwr, :bncx.Yұ%e&ytމt~l9*320s 7pф (F:p=Hp|ol]ڧ+i筽`UHTږӇ4yfz~޻kFl(3\:8>+?V]w۠Zky罟鮟$*z8fES馾_c:-'B9*bEuFީ~~nV$oú~F)Ue!J\C@<(LRq 5-b-?;΋RbNaUkɘK"B1u:YZz:WzFJ3Z5٦M4 eE3zDc=>FhOkeV>ьh!CEmgkZvִ0.lG;[Nl{;V4mrIZr6fGcvMg+5iSۖV!ׅhY݂V%jQvv5n{Z.Xkemwk; k]Zu}c:r^Wgѻ`+w5.y-.kּqz, זÿiu^׷YάK*2MYl L6uqg}Z|-i} 8k85#[k*-}JgzU;-Mwӣ5WO+c~51JY֜NYUӲ5Omk]Zž5kQզ5ki\+;ƞia۪vli{׽7 lrwno&lyv2mw:El{g@#ijF54g=1^uog@z39:Qz#gs|47AstA07؉s]$yyw<GґI@"9a^u{|7'<q=bo]vzsE':rg4ObًNIU%;ߎG-o'ݎ倷:wko-؉'hi31~}e^}|9þsL>ߙכS:wrmCLX!:}?X>COҿ9O}?_Ue_5`M=`<>ڟY ՟jY&~`Ay`&n`y__ؙ B z!H!dša&~іWV X ֜"b"6"#>b""iD"!B#җ$bb f#:"'""(~"%!v%%V&b)ږ$n+z*Ƣ"-.!-+%"0b.Ң0~)*b0 1*b2"3c3De&h_iWu]WtaX|Xw9z9D3"/=NF?n?#,$j b+BbA&$2"$Cf"2N&&$D>$,#@."/JdjȢG:dC=bE~i"$A$KF@dK6AFbHNEfdDIFdL $(M4aPGYC0RNDTNRSJhImPepgVN1D4z"0"4e1L%F#+BOBd>dY&#]K%B$GC.+._&L^^*3*f%#*a..$_GnfcFebeZ6Ih^e\Ft)N(t&gVamVYrx5pY=j4q#`.]es2E:'se$^VMFu2fFsbBz?vd?'gtDsJcayeGgx*`}MnguR}Hx5v#itF6֡o^GTVs%XffّahkG8h{V=<(Bh䃊e(('.B|gzdsJ &dNtN~`*zKB)1^\Bybi%zjHFgza痎tn)r4(JYFrd)|h6"hj68k1offg 'ҦfoxUs= ;䨚C>p)x*CDC>X)0P͒vg~槔b$f'鲦i+h$$ (w6\rZVfRrʧ鯦el>!dheFYB٤V>VR.'e;iXR<"B#*v,`~,ZO&gv?g^;ޥN2k)}V#u:)Z&kbkb.$i mtiҚkrgZFŭ&R.l=<%^tAh2h~f4TA ԪYDXWv*i|.V!DŠ>lAC*>0),B*mh'{Fk+hkꦢq엾nvf듮.~+(ig[x"-^)nx^jت,(RWC+hDTB+|0<&hi僐Ƣ>,@.&(,nAqh|hCkFoB/N-R,.*B 멙g2z>|鶞F.g60) ?龰ngBVVF٪8ꦢUz=3j=tl²C;DjCqV(^..p6(en*;(˒.(qna*#} K- Jf,%) e0?Jr(r_,0^- $rkiNSk1VZq w0o1<2&hmjƁCFb2B( .lʖV!٨jfkc$(7+~2p_mf?$ ,ˬ.nk-Ұh /|FD+Enrj0aPmYrhnzWmZhh*N۲íL؜/kiC>C lhs*2>|ngBr<.j?3tEpynmDs+rGp^iZ/";1g5()zX{4['/m g0$ֵxҗ.2),n!L/çf2,B`۾آUÈFkC=7V.ꯍoR׋v>i9d*z-]s(/\Aa4(uk 1sǮ>g ZAi#6&'5Z?'cr'r c^k>*ꇊeĭv0jK;)|>lj9h#L&ʰZ|˷ *u2;/w2uzG7c.l`g%{2.t&ta2+mZrykzcG}+6a1wBE2îVέæv}&1eK@Fc)u{9ry8F)$ '6#r$7iv_w/:޷c6lbŦt׋mg%o2<^ ,]n+DGo/tZ0Ck__szϾkx;ry_y#Oz0)k2\yD0jŵFAjmnM-,-jփ2nz4uo&<Ǯuwu50 ?ﳶZWt {Y;fc*a^8:X7S/d}G&v_bYm*C:;ϷP#wObbI;^8:۪mS4/JVe g ̸QF;rHcɑ!!FM MjƔ9L5ibi_}.^zBT`QzFFtPGtiOBtP*EHb۵ ?ň$Gvf|$܉ilmߵ|Mλx.c'ժU̘H}zǗ|~ P ,LPlA/)4o.IX 19rIQLQYlaQiqQyS\N#LR%l'R)LI &H(ʫS+z JM}2sLΤsztM ΅3?穃*MѦ4TA(PPJ}RQ5EE KҭRK_ FWU> R .T -4RKôV:u׬V0 B--V`{2KhցZvӅJ_ ]ORm[eM *)h,TPRZv(FeϞWQu ʪ)Wm6*cn(^ a0 b \T3LͽTay\ic՘ TKe6/j`XdeT,$CqjNj N:T( (]tZh*vlOim5lM**zӲ)@˖[l6ĕr sSϻ裱F 4N:5j]O(beӏo4˽uB|oAKgӨ7xk' ޕit2~*'ٓ'()N/_*vg浾-j g' pnK\p1PGm[#2Ιt3JDyb3l,jO’&MJ^Tٛ3敱OV[F [jcъ8bٌi; T3)?!|2Y qv+qШMbBG+Q TC5v|c)ǹХ]FDC4ˤ-=Wړ1xIO ;ҖS鴨?Sԟ;gPO4HEOQⴣ@iS_JԏueR_UӪ'8JցJuHGzwUYGSEuhHL՗nTkm; ֨s,btjVR4XMRb[=ld ջT'5jX2 tDv / >Hz߄\0>wLr} pw LXfӋb# 殈OkSE2 ŤAy孎y^l4|Vs ;aOz"k6' }A}Jaqs;Tg)sLFY(,4|iIk4CD8ϖ.5B#N{YhHsձMuMOÚvG=iD#:o._iG;i]B{;֦vG}nf/zX㳴ӽP[޾uq=j6557DCQ Imn+KgɉJiޑTE9^ehjl/!MWX)9TlhQOj WD&uRXoM~ӡc^ڪ(}M_ҴOA7Di(a˔t6͹2\uK%]Ȟu+zk Xe;4F/Nq[7vs_TwQt[_~r5{z.L'U4v\1s5Z5 &mNBɿ ]Q>)# ݘ%zS9}.gMYUPjP'+Qi[1N|r߈8gv\!wOkx"n4(PgOj̆x/t@O&PGKso(p_2Pn^SBo?PmLOk~h.t07QGks e. j LW<rD %n=>Ѓ>P9&> q=PqC!Q?cq>$1Q97q-IQ;Q3$><C>\aM1eQ1gY{ qOK9@=q c:Q=C c1Ցq1Q9qq !Qr! )!#r# 1+rԱ!$I2!q!$1R Q$'r&Q [$9&!12$#1$5/'&"&G(r(eU#'Y=r kR'Wr(R=)i2#2'(,+Q+2%=$)R.c2$, "Xhḥ蚚bU1)Mi6iBcn"E2C2194s3k3=s&@34cb4I3!L498bf5!NhJD=怸mgZKƊ P~eg%1I1ѥO9&%\ȸP0{e9eFԫVb _#㜦= Pӷ:'h_ާKSS]%7+L< S;?eԶS S[BP閰;S$s5d$4ECݥÜHǚ8HYLC%ns` 0Z&Em3kD0*l:lQFfdS01g'P/m 'c;N< Z@ puᄢ4jDlnFr3_<1G/pFu /o䯖zS8oorhlx'ƞBzSҦ[:HqP&o2ǞZ㔏&ijmS!GpPXWeWNtHSK(L-`mJ/WgFU sDlL͔[FFp(vX4Tkv J%SQ0U5m|+PMpM.!ta4{3Jݬ&oW8T}R?u^aF*.f-vG\ &ZQTeIGgNWBsttj즖jvc PJfO&tR8nUWNks뇺ab>R;(ַ\EELefi‘vzsUJ/P=ȖlU86kaaa]QEi8U" @i直{zor|(FiTYi) @AYoFagVe*wL+ bzlHsmKX[`.3PuWBRN7{Ny% CzWguu4wDMtt(7dyMב8j :e,tkLvj~VD*| fi$P,~uzGvt96L`.Uss:HOFd ,i!a~ 7zde@7 zs L"pS'MdMsV5Bdl\iY BA~'8$L]f(Yxꕑu0STO1fCuPx!i?8)us ҷQg8FWfXpZ՝m 6j <︀rTk l!pFj?{89}ote?-ª( ?'Ju?Tl`N`pgECOjz`0{P ! hw;pQGaf˔Aodwkjn"A2ywyKD0c nt!4e߷}i5N|!y/4t'jW_F*@϶vo]mv [TY0 VM9k~0 ~Y#bR-Un 9 ( &٢y/ 嬩qGو59'E vbl8NghUpvkb"@( Uw zZ}rxUO[iUyJzHW< 3w>WxI2{{=G趌pgo@(hG.n -p-no!Xg:J&<]*#O:; SSyn?Nxp:Whr `~=q+9vuWho[SM~'*s(%A-8\{qo8gK&E<٤Jݤeizsm:Ҥȃ-b7s}~ĖdMrtFM MjX 8,fJG% jܸ&'̘fg[nIW$T"N4̛ͨlQ]@~LЪiùmB bD:-J1mӛ'f؉JNN-0#F R%J'v1P\dL[27zvyT=P2>F\JP$'J&16L7R4-Ai >xY[7-uYzC0"Hty'µ@Nǘ[taP- `nEf,և[4m%UTfsgِ`ѳc(! u=Vޅ%Mz)UKTz!FX ^jEFX"D.ꑖ&uS%d\ѧIlCpwC^5t҆NZ$c)7#-m4'K)WTC1HIՆCqMnb 鹘aKT%ˤVLaDEjQyR(gʱ4QD!,n Ad+&X2fVzSny1@~JblZ?N2̨B驘I4ţm?;ғthFҗ>T$M)L9Rtt3JAO.4ЩF/jӚ6IejDR~ 鶓`(f23 pK: ְz QX2BQVPPkYVխk+]JWխl=[*WunMk]׶U]͊X5m[ Ģbz6ke=Yk`Mֱmc!;׺ִ5-ciV-.`$a mV~ Z5ƙ1 b Cy[^ehbzA e C /xkƗH1׿o{WcSdXJ8];aBX{-Fa ٪U0I|a,lc[4p(lbz1+4u0(~PGm e#YT&ue byl2{]gnY,LA,/}Wp~A1^9t3xɛ ew/ͫE/eVbː2dӖClVNOzmA J8ՑF\|v֥&uki"Zm]2q%w5%-iI6֬5}ew͖mchvSm_Zզ𵉍s&M]/W9.-{۹Z2uC50|2bwo} 9 _ Tှs{Ay@X C4Ƴ`VLa%-49 يCY32f[jOӺ8 mr0&z2< U/o+cu!jDC頰:)Gy-m [罳 6Ku ]/N+a` mEZH=(R<1G%O?`4?,`b ^ΜU,|yJDsoɋ|;|QF$rhYтxn^G;Z1^e`T+hO˞lH a ! g%r$V@vFX>F0 :^wi\s'pp~ `Y> #`܆itG klnj7VJk)&:hdvkFnkVi\q@&쀅(±jrYV؅^z1"fH[xhSU87lb;ueEp(hGge^V}h 2`+ |q_%}h|gig2\`ŀ V Muː bPsm VgtB aF0VLhB'Ww h\Њ1Z tԸ H>x#( garx|WEFHVx?f%d`̨sUB7&b_JXPb.ƦxSh:zyXTQ03 yqy(ɑ i %)i"ɒ1!a.Pq1CVfwf\fWg ׉WrUq rpx|%gwhh 6 Y l>G[Y5kvsx<YexvKw pP&dd v0Gh,'[lqJk՗`w1q nnkFX0h7~&aC\l%m)fbKtɘ(aII^iId5Hu5UVl;`jI9~c0`3\0ةŞy)ٝY--*MؕfUw(+U|Wqq% 'h[^&h8^`qwgH deYvG@Pj*  jhtp\svqv@Wt@m-jL֚[7>q DFi&ZVףWb}3V`ku j0wk)朅׃Ik/i&a ٨p[PA CZwͦmgXFpkU̙b\P%w ~!\Шez ꨕjz~rBWefbhzƔxr{6g액 06upZXhq&V)_Єm`d2H[УuEkW험v\ U}:7hV-9iiUbVIJd ɛy_!6uNihwːx60JZv`搄xنjzW&vV ٭fHjbOExbzc9ɒѩ~1?۞j;牴B۴ʑD;Yt2hpW*`(eӇ|Fqp w} (u%X2Wt8Wtj a?ɰ V'ewtGhhU{Ռ凌Պpڲ&)t c{ɧF6m ۏu%HZa,+kZxvkG]qӛԩ9y{# aɽ2 *ٽ'k07Z,Y2>iTvpÊ`fp|?@ G| Ǭa눚Hof!dl'iqW5PlOl)JgKj7v~%d(İ ٤أZǹVviY!dvaHd%:/`L<ô l8lJְ6% cX%a&&~mbFiVg\!%\HF3I]Ї|ǚt@vhǁ,Qȇ=܇++"+S@fUkp8r1rv"ggϪ|{t,gvEt,jfw(h<1`ۢK &pxu 6*axn=Ǹ`W!`yVL7L#tkYΰFQXW bԸcvjwWb)bilNyU2*,p= J] }Иz۩y}1MC]UDhgmkqh7}:ݡ*}bEW[WwEcƭ XZ`~aux7ϓ0[jx'~Z lvrm|xKͧk6jr=X-gxHp56ՃYc FтBo]]52 ـ؁a./!CT[Adz|LFkkka쫉G^064l0R]֦{ZXGjXkkuP6ޖökUmYP;a})Ѐly V|xkw9Xxb=ٔߌ߁6}4#p~U]j^Ār286gO>NON6NDddba6n⽄vMbJWh=lKG8O df`YXܐ̭vK-T̮͖vZZ\Ľw+{bIhj-{.qM[LiMxn(wyMw> 1>6% > ithn阞>>%>鯎N~^.>> ~.>h`n>^n귎>ڮ~c랾.NӮN혮~^~n O~黾 o~o$^%?n>y?@~8U{ .]ZfQlljн\͋MiV7W7{IwM^^MMjlr5i lWv'o_rUWmSx`ZqOf%dnۅ]\_cS_Vf_VJ@iWBfi.#D\o] GM}pʊF}v֡~O^̼7pl|dyf%bl \BFϽlD6JX?$6l'xGGĈmin_jg|okcj^:w8ʖiiMh-dC%NQaE5nd8G!%$Ybj@Ջpپeі\r_51@1QMNMi&T)AH.MԩRRiUnTU0e[A ӪUjaBC) Elm@-֮\ve[7͹s7zEs|7 ww"6\"f+$Z0^֪*>McÊ'A%5Ȕ]ׯe.Oyu6o8e2փFS2?cPM3Kk`ן}F#d[0AK# >", 3-K..0*KDD$5edL:\1abAdD@tLM:R42DDG*@(ј+E> ̢GJ[k* 0trĢ|Q2˼Lz"vtrHn}FM$邡rІ0I'iFw y@ӏP2;RZIȤ{/>TՀcP, ,aV*Lv$v,fUp)b"vZb؍0ԌD+ Èe3ܨJJLKrEа/ +%02šv,mD,Q&ʑG[ [-I€l`Лj +Qca"5x;.L9E͠.mx|hI ڥSTCnG}AgH5&}aS;v(b oXG'Oi7Y?۾Ebx*%LcOGF/(MKFr6CM9YPa t5/3`v4LwK{8qr. ]`珇/%H JETF#އL] `Eè1$*Adb'|2}+PqUʄ,E+zkJ !2 0kyћn &d7A,iN6)ΣfH1"2;(3;rF$,.d216q zq5: =.{ZvX!(DH@,"t6iKJD!$P>%C$D|kl1d';B^"d!aOr Z,e@3|Vf HsPdA"gt/jS∢&Qw\F01D.ERƔědQ2Y!)fF8u)9 +F,LQF4'R"lcbS<?r1h #r0ӛ>#T1YOccQWEV=fBPlp'ڠ&XE?S GBEck>]1K&NTŹ`ıHg>nfriDwHà)?`heYf(SZITdR2iE. "RM;+/-m(L6#8iҁtICQlx%Ŗ*C6ՅhL]2dQ2%"ؐ`cwe@c!i+3̷B!V’kF~4ͽԤ 7!B (PG99fOFBTјiM\[$buek"].G#(.BY\`L'JMON X;bD 7^UQIG%cfͺg}p *Du:ˠjgpjVՅ@_ (s5`U&*(ⴱbMS8 YðZ [µT1ئӭ #8Ɍhs>۾Ҋ-$b'qØ8)r-;;jw BZ"],I6ْ-;I䊙Dⵯ':29;CRCHC*}% :&b"0 "0A&?@$ 9DġHKK ?|DDDH ,,l{j;y65'4">-#B+{s#P AʊA(z7A;Z+0\"-{K:Z:ċcFH@hF6FP@3\I0+k Kr tv4DITG4xd yv|GGDkGkǡ`G44@I448HD\ȂtȄDȂ,HȉlHHH1Ȉȋ Ʌ<1 H1HLɋȕLFPȌHȘ,H ȑHtɁHIȁȅdIILʟJɥ"ö.k$;Z1#'Sl l"$(e$FMUzOkTօ4eFldzаX8(WK0uUk9I*ͱ-rcBrD +ј5+ZA-:7]?A1D `gR?R%XLHȲ0kEPB04S3< 98Z MّS yȥ2[;$H$vp@"ztS<0!ĉTTU M`ݳUۺ bZd ¬\Uz]m- a;<UTBۀNMl pB%\X+/ IO~3Om8?]a(E \Z ><}ݍ%~*P1譤̣E1I:%S.fvC_ FpVטݫ q9{Jb\|-{•pۑ;x'# .$)%4xb`1H ')zXpf /:9Y+12 (d%†F7xPeP}p/KȇJ2I""ږ 8+zb8M^b%] B6c_8M5`)TD=b ؂wi(PU \ck{E!xzShdP(ת+1`' 0ea:dYrdz3k{9CEԵ Y{2ኵ(UVeY'SSMJlyU{/aKb('!ڋJ"alp/6<1G> I؄фh()3-q#"C*빥_nvrO@[+bTn.H<;#aWi[@B_p4&o:^3fp &gp50b|Mȭ#!u,t8 "Xm-وhm#EU8ҋ ϊ8>-) n1nGRa}} v]:MPE< b''RzP<*yq8h!6`zvV=K+A!86IMq* >0o, l!ݻiq&<-l7rqs C*Q؁4Ո݋bN[7u")¹dV5SXY^q6 [JAď=jjKk_zPT|ƾ%UE&yRa="tq~߈#RTuZ#:D7.3g2w}lVoe)pYiՐ Ŋ/bO DMi&Qfd Ӕ4I#U|eʘo”R@! L2@"-Z i(bE*iJV l6%zRISi4ѨĐrEʔQA{&]Ѭ=-^b~kbku-T\ł4iQK*u2棠wIPk\S6kN-u Sf1^T/-C\va" Dª b._8BeZZL -3A慛hU*d@dx"^ddӉNA #?b}جfESМEmhE b gAԸ3']bQk2$x2<CAl22Q~h  )slA1TS x$ UFȗeD{[B2f)/̋hb|daoY :s\&]Y6̓ %GsP2ch8Ys'E3œA4 2:ʀ' I3q >Oc 4,L!D#/}P6bd}0dЗHk7Tz%H~B02:hPHyF.C8abX* +dl_ #LGȤ.1uR=E[DK)q&Xa­.Y EVdP3 8F;`|'<ǝ],;"G |9¨EO#v̴@1}ÚLmg#˅xfgy+6;1h$d A.B/kF0Nw>=ZϺxŚdO wK2d(V1G5r uUWm_誦 οS ({/YY4_+F sD`;Xq ?'be4vZ2 8xw CnM+Oyc5A}\֟23E.!oS ѮL,O"͎|44|.h*#7hV{F-.hՊ$rpCqCrL0j4JI§I˄X᰼ *Ӱ=t.P}BPĝ}G &E WeP;-mYXe#c)DʳbE';,@N#tw?)T1wpa+ۋPbp5 dZ#Xw4_[T=4ܻ201XX,})V] 9mh% @`1DN/=%1I캘z&;|.VFg#M::v 0@a1[ͱ&vDcdP<@P.lٞ1ز>o>yeTo D|-`6'%O|ŽTlfN8CT[FVUDZě1guS]  l<[EP \;E=Ȉ =t$BXMLɊДu șMUxɩQ}˱X(T0P,u ZR8+\ BhyE2A%0iN^b9ESa3P`<Nqը!` Wb\(YpaS8]Udj8Ruޑ>E`7! [yYYC#DVry a@ #AyDa՞xJ_Mx _6 11U_ CTYOUW0Zu㤍B2`VPlt]АZN" YA" zR M 9hL&dUc\@5[| Zj EpbR,3=λX !X7">PVEV0,򎼝E=b %AeEEþ`< ^^,[>`^>A(8E( ETFuye^NX]v`~jlaHd۵/auCb$5XF*dm)Ӵ}1۱mQ%mg*_1F$ƣ޸V8[XH+\I׻OۅX)j-rS=e==:\E9!e\g 5Q/ gyFu/ tsKs]wEv@Ѐ#ajJY9*hGqW_p8Ό]Tޥ^#<$",ӵ0-# 5nWTH»!((y9Ns!d~e!XjnPiƕbplio EsLGBt\BtJCtO]#إ[xW$[ڄ^aG]M(q-ZxθβY~ZN ](Pԋ6[ҕOh.Q g 'XUP-~[qvljjĮ*F|bDdQ[.DPDʞ=QKHGyDOyMDLD^뵞D%-i#_H PiehkGjXqP%$'+r>WhXUXN&kaS Ehǂ,tGBĉJu!Ʃ GR+GyHG-jxJG̈ LIIlɡPʏ,ʘ4 ,ɑ80B<-FḦ֎ ڒ-|Hچh"J>0I4Il-ݾI$ b$,n4<$DnL$JHԊ.x.ךm.dr Fn\Jn4IZ^LQZҞZjHզK>EV g(gR*Z(ʤʶ)в܋S  F۔XJK uE X,!&´_]K2SJ I拮& Q0p:fpFzuB ^GG%ўA!a|\ t v^L_}]q1No| W-fbNų Bfp3Ep•"PPCF)ټQM9SLd yaC2epqQ#_ll#sS̞bGeH#7fTc &VG Uھ$& \W2oXxsi*Wn،I0l0ZrS2JȞECOʴq(!>a WaC @0v`bJpiXpz&< "'wVD4uvaK](M?EDl>Q)[1[P&c2fDe=d =3=;>g@uҧXB[eDTkMyfo|YY=թ#y@(946+EE5*/Z*HqO*26Ha[PhWJaêrBMW\]EE.0]D>sY7a$MOR(Nrn!S^OJBUEVoI\j> Een5ApgU0^) F W(^PoioAo76ŀ™oAn(<383p ^npyYaw TׁKE_)ئ!)PJnc21/wJ0eZk((d"lhVb$CPM{PYQ3")š2S|<Qx nA)a*{CeyCj*bef"Y/9.%HM Kك )hKLTd@wѣ!6J:)㌠81]ŠfM;^r.$`|@UN䩭auR%^F+EJ7N4sr3vjQ]ݻB&k߶J*AS–i|XU"ww{)ev~;C\C^ʤ0l󒲄?ae*N%CD`Ƚ0cEFb96B=:fRr;kXt;d;6KEw_!}ȷ`ER iQyΑ<޶EEh \=*'PkJ)Ta7fTS4{`0;驞mtWٛ}/Y!(QBDC-C/)oK^7÷r/z0F tѰr^Y$(Wt'Er[orh3!*'ht딓!E_y-[}ٹPfQ0 ]dF/_=Rmg(tk%0BҼgTB٘x"<ີ= ? AĖľh.lPT&&5)VxcFAIi0eF*ydJbɈ)k%K"Űiȗ*]'1P+5%K3)T2.@ t@-['!ea,k)ӪԱ 7P-\bh]Ga1(S+շhj]R&&xd],eNc:&5oZU5}p^C%;BΡ4>58c&qV%̰<.-Qt۹wLj&zv(Mٷ~߼- ;4pތt Է%to䋃"[|=IDHheGh2khbDQ4TܧRaLFƢb[4+>j~lH,qlIńLrHKd8dJ1@Y9S 2K5 *2ִ$*AiK#11|Nj]M+J- ФZ{r) 1SI3 1VI,uKb De._;M 87-1$h.NهdŨu} 0#}Z[ 'ˊ5b`c["k)$wŶu۝e'} 2++hy5I؇'Xrib!nm0)(,d$ѤeH-dkeʭ ?U1S+MZk$EC -hYպK j)e9J0u>Sj-r.8N^H\i1!&ܬZJ5GYSP_%ߧ5X]gyՎEA1Q&)eehQ`du佝= +g0 B%( &4 x~iǖldiȖHx,IZ##E$뿿)T|ugu3͐&6j-Yʒd0ZIafe%/Ɓ[h)bMM?; ׽| el[ cR T/()HNE"aJ6C"A * Y(:C8 0!2v or:?oj!"M2rC k__*- in2Ead"q0(.} eIifK1Fx,HV0H=vj*BJ*Ʀ_n1 f(:IĀLa B)qٌr8bqM\^Ѕ`0RbKҢ*H%.dOqHlm!%Ə "%zgfXx\xe j),uZ"a >f,c#/"?(6:C~_6Q((&%.,FfFl@*bBf&f#P*R+$/@.I2(V S@/&erm`6Mhj2I*c!hfJp$om]00BVr0Lo¦6nDzH>c<hS][Ov^A7Y`t, /m,0qCSGi1q04UjM“*VF\,x|@x$d\ >#v;Jc0>Jr[l /obC&Dn߈V`,NHqAp$A gΧ2GE(3+xJRU>EO*ZB1^B V2a ";i L88|Ci4DUFBT ft LDt-/c܂-<%u+I/.RZij׎A{ lӢ8&_SteZ4"GC3>7KS[#H@" aF"XY1}RJ>C(,zotYLagDqgcbVf$;U8HpȦA5uhӖ@gcdAAf5FGV1ee#L>c,3Dɢ/).VipR#c&;3BCOfPVcW@'ylGn[wuv\X% <:Xrv6g|u57'Gs >(I_4pH{!"%^r q'qnbSCgh,-6̕NE5S2 Rjvœ0E@NѠqXTt5f{Vل /ڌ" -S6pY}ԨJ ‡#JHaL:XGe@ R2(DyR"8ĄД(@iΛ7?t(4B) gY$Bj V:P鲪FUVXUϒM׮BIRIX J1ue/ž 6T. ;6Էf%MW2(&_ám*RVYַ# 2465pde^6u`WXmiNڧK}[g; _'Jn{]%rgOKyam>|ݧ߂7xP7Cv]"1@ A't>ŠɊ qN7}ю8=zpNA $ļ2E gR2[qlˁ)ZŌXrjmVRSU'Ѕ%]WyVkm҆@)3e(i:ɠTUWeagVfre@a8 RzRUԙ[YZcwR<2\2Q<\D=-{rz+n&b+B,C2EB 9ToE GD%>D1P8$1GMuqDIlQ 03 MmESf骃Z5g脃R\ VoBT&[j٩^URtQUMXYƘۄfԬYV2iMq09&fich.XpE(t|z/xCX?酠z~cD:u|wL:eNmH-^@#C.3  #MGBYN3<22:JTzRsUMkش\9Mj[M?I8MjQLϜsWE_JL fbH[(L j?dZ!}CsD9FT<`-jiwͣcâ!Έ lc?y%Nl U_k!6i22W PmQqdTޒ'4T>&ybʹ&iCX踛5 ILT;VDcTKF5L&i8ZE[TatKUBs78,vc9} []G?R`2Xx&ڎ"ӡs҄y @RDq/#DXC&AI/~;*$1H4ّ'#F>B&7$)N-R2p,8[ h0hUlI5c!LJխtV&530Zީ֕`C8O\^6LSs8h6'*Mk(5d\2#қZ_F#2.J$rҊCU.&"p!d)Cve R(v+d7)L,}b?yILfRdՕ,oR}ĸ€AmJ ר!Sb* /!P@MITbY̗a[J@oyږZxD@Up7+93C {lQӢi.a3 VXO>*FKva ]w#[^i7")c xvC[.bsFufA#CH꘨ Z7 4Or}0`geW)U߆CeHpS|fe5"y@׊02"ѱjqf'%as5>l [%, nEJs%X~\ˌQ =3l=jlڭ :i=/;A{XeGc,iluu3c=gs>^w-[Mq莔ƠyH/֫=Nk$>_RdPB# I'~ܗ!)s$rX㔻 6U٭`^@Ϊjm b3ڂe}"Twnp|lcJ =5%1 8iE`,t$34c)PCPB~oF5>H2jZ'IHXQHj-jV~5%I L2$zDUgSI641DmD{^XT[ڕqWaE<=z]Q 9`c>L'wApBd_z !z1*C{?s F^^6B R6r(j'H6bRb#_&-_0hs(-lDAT%R}e!p%ڔ~TJh~+wgSL~!a;o`HY)w2A"nF3x7Orxx| (" i:ܳT/#jL5_WA(%0-ȃh 芳؋hhǘ(xH(8ȋ،h8 bHX(X(Ȍ8ȍh(HcĈ(h YH8ȏ︑(ȑiˈ8,-%yɸ 6 Ɉsj@0*TI =*#oZ]Qa!(BwgQZ9y1Wwb]ٕmiYxHly7w'}Dn!~i*Zl!Ib)(t)!^&k9ٕ36xw~F19 #Tas=HG q!%?LB C"$#jC|Sʹb%a&ew*TLҹYu[C7qDeiDi5`yiin~i2Rou֙8[ESayY&2ß@p~YeEʞHY)LGIy,¢j `,3=ԁ a sT{F`VNut9!\gE`M7a`TMw(y+HRf3}gx5d;3l>hCQ8xLSeqON!@'VbyUɢ+z)zjG0$,R{{tC|TUo͉>NқIB|kk ($m.pqE>mFN4 I@ "WePW$~bwfjwkSMV>TBU""@!څ_BYQN"a )qk5iw Ot' 2Fc[;sg2s65w-z"r6\{-Ff.!MӰ[f1 ^/3Z h)t QHic#>|?10tN# ?q2&`;+2_O XW;sw1(G6Dfbx" 9MT+ `*&wrxmU@1Q!oAmMQ{yAScʀcMlh}e,r<+hQ.F75g\nh+S "h!!12]  x!0TTTJYl{j9қU:?5$ VTj P6FTL\5d>EnAv&o m$DVBmlӅlXmN*"KXKz"#6P8o!~CY|un:00F7w#:7b öLQ/+z#.[ 2*RG-Sw#(\BbF :5/5A#=wi0=*_Z 0{\4|ӖDRJJ2@ dQlEvQa'vnPÆo2\`}(ojWA4Vp05Pj}tewU 6<%SWRy zYs]w; -#h-:3:fwgsʨ ׺2 Cm̓iB OIIu=5tW>:15$]#uK#Pgk|aoXg}!cFGCgثbw7ϱ(Q1 86v) *@6Z5Dv yg(V8S4\*3h{7q,d$ٱFpqGPr"1=\[+gQ[  @ӣiY{_Ԥ] >C:X\2A`P_<&267GV[`sjbtV JdYQY!moJδl<5ۇ`V}|77t!b8t5ag`FAzLp#hpYwQQR5z#%CR 5]Q} |3eh1zS ]9%/0 S"20c"h9TGPœƛ&?kjFUO5 h'VZ4uViڸѩL" a|%~pv~ ɚ0 gMa}TXY:m@F %uub JfpQjέumRb]VE;pc.L-]NnsU]iH[\}^ybtl>[2%K;Nw+f-k*vsڼDV$7JdlPɆ:4oL-F=XH^וK͕'fdB֚c@'j~ڷZ&x]H!42sN7IՍRQ-վ%8Ga5z'G)ӑ#3u9;J.+>6Jx2=?1Cb`A/5MTX |jdԗ=sK$vGy+vu2V|j8Dj7&V;WӨ #zAEޕCjit:UC$;QjOWSCkLliWt;%nvڊC xoUA,PĖ:X M,Pe)F p`ł5q$81bÍA)A;N5iL5męSN9eTP?Ez4MRMy.!zMx04jbR4Ҥd6M&gϲMܷnƝdl޶wK޸';dJ.[DI,HせbPb-a^t4ʏC6d4!c/KcqB!ͻ%c8i.C.v/C#V'-^PImXzh. ZVdch 뽚H+B,:,1ْp-\0A  -4& I01 IJ$QE4TtO\1Wo1]E QH!&GD &lrG!D1H-G.o,1H4ƨ"%D1,E4d27KF<4q:ᜳN%!N,tSCsPrQGJ!10qN#SP7 L1+US9eTWIQ'R[d4uW^RG*$ *g&= +JK5(3(*nlŵ64eil+9y6P8 w_B%Jeei`[ҽe6|78|%m74nY܅2׻}U>y?ʌӫZspggIǾ7h0gka!&QꭻZkk&F;lf[at%{~E ;L#M9!'6bM1eL2 PB%C rº.tLn (B6Y@Mgu⃞W;;6 C82cX7dr8mkbf7v5a 2Muz`ݺ CX21s@Mp#ƈqs"jP},4K RԌ¸):ӏΌe<@C;"Tz2qSA@ ՗  zD]̺Uy+`u=j[ f-25kvlh*Hݕ`U.2V0 ýmv]vv zc)QNO/]&YX%IH~VA~B=R6Xܠ%Anʈ(|q:M礌2QI@!CIE;Q"hp79*4]8c9 EarB"@ LS32jc(;19/KB1&8šhqCT8"3Ee@q"cNqC&269aHs$t E93<,|r4C[>8Ԅ9OwWD>~ykAz5!m^ ҙ`D4SC9H w8N5ni rj ڦtsҖ + kJwg&7o>,Y pO-x@Lc7yt<ĉ3CA 7Lw+DWii^41<꭪X;HBr*4-3u 72/xf~ ES42C3B8FB 1П@D2l1]X&(,gn>zAp;HpHgtɓB dɊ&1 1eljȇ&܅ r㾙748,g>D\H DbYMI~`|8뻊!$[<7,$lKf}U3PB$ {z`@>)DdADhѦb:#ѧ=v::l9TX`c Fs44iFTGiFS,EDLeЧTrh B’}P MK !a'8?TE0!\zPE̊h,d,5]1QG BMQQB'MQPPe?5z@Ph%է λ'R2=(%E%]@+U`B&3!ˁS45e@5R Dl)CE10'|9!XГ@3k ̄UtVmUEsUYUX[\U1UIXU\ۃU UZdeUVeUEch{EVEV_UYmVd}UfW] Fh݂o|NE[33xUpV`pmU%*`Qe`gB}&C5؃E؄}XRVM-P؃ɨ>d݂ÉR*ؔUSB4Yd4YRUٜR3RUKXEMX3Y;شE8A6 DbCUL cȥ-bPNL0LPVUfVvH@}b-~UNe fTaf M-[0 ;SeceU6biLeEӂ]Dd%Glftjf^]e7xcW1@f`fe[ve[6LZby+X ZA*6SE0n:FM GR0,4P1AEiyii隖iEcQi:֨=ڊji0ڂc4P1箖-Ӵi~ik)9kck))kPEvkV잞鶦df1 \2͖@ I(L(&6mF׆mvN+1mIЂH`7Xْ nF Ӧ^F >mӦl%sńIl8F Onnn^n.ؖnm~$S3n0;mNvmVFͦlB LXƁ>60m@mvnFo\bL8MapRb-'N !sfC^iYx):*zt%lA7 *)GUѐ8q$:H*~C4[q%Ĭv"f=fuD-F$YrP E]Hnmmr #+vN7_|RPW|͗}їzi,]{'qD{г=qeq{g2 e šd#N|Pk&ۺ16 l EBv"w˸8[p6\\MCbi'-#IbZ9"D.RJJjLNQ:TPG57S{:L1\S ]Z 1İ0L?M9I.y昳y蕛N9頨5@q\&c`DI̲\7 fy'%u[1Qk [+ӫM~֑nHݿ6>O?-F TʫUkѷB4.D6D`9`}7?ʪAm-B[fk=kAT1s9$\M;{Xxh 4 WE F>)l !؎ll$JVG2(y:CֶĩmbJ0~qNh[n"HgG E8{CJp1y&eCALt%$=P $1>LZ%gM2Ѥ&C=M$3Pޗs)7ŋa&6Io5xQ#QE}y]ҚU/[ʡ 8̀C2WP'Vkps]`r%;X_;` ~bRfjPC3Yv*~Ȅ%N$Lj(.$,fM*mIHrsRdQ'OR[ SF$RA  X=6M[dfenb9v>嘸z G#(ÑXW’}sK:XÂ5ˆA d-{f1Yйn .L@90ƇOU%&jb,jz_]RIis4[3 Yf+s4LĒWv%%%3J'%-KZMo14"V@)_r d[nf铢Dpf-FF"sPQE%1)CXċ8q9ԈVMj6aaLԎxxRԶ3ɋ[<ZUM%oN8E/x!$HF[1 FSU-H6kYa+PX!e)یSnA ɐXV*#U@ i+i"#b5g!THp;MQM5cfUѴS1w;HKL'OY.T<sn#Dj&–%tK-[ ]?#L$FيXZĉI82)"7`k6tuc87#X3Xؾ+'Ga v0r;fds.7GA\ůvk$XB>/V;a/ d#X*\:+ɲE 2hD$M.]1%drl,չU50]5Vɳd7C"{mUC~U2ѝy=.6̮uFgWo a@6{2$, ]i1Zxn/h zK0(*HmD-2<ß;8lӦV#IYa0+%䄒'^`0pL tHB > H-u.?$ lJUNAjZ$eQaָ&dEBRdBfE`Hu` vEjx <@A"%Ia4!4*C2|%j%.iRMFC0,Cda#B.*&h&`k@lhBb.C2,&Cr!ʬj,T,^R %<!mB F .a2"" ^Bm0Ρ6tvPOΑPngT)Ga"숋x%߹=fN G+uTxۧ&chJ\2 jv&,}iLhUqNd͕xcODt':yc:#(=Rهc-B,V"g]+A&bM)q}g$f Zh hhi]-%Ӊ(PԄ%8.0)0h>$)=@Navډi KÚ0̡ Q AvPD-M0%I0,zblS*w42mI@Ş.<-ݲŒ!,ϊ‘M %.Нf& )`:6ML &H\rVMٮ1 mB#~WzY&"-Ra4 ؂Hw9BifU<薛vrNQ q6EYv xˍ[KyEqdV Ha#=xWSbp w.7m< 4FKؘDfV tEm V@-3;9y7-B7/|-Hy;$TƯ&PI+~aXЍ71X&S1 ' 4| @kS4ЂT 4C8(DЛiH14 %ODqr–AS %Q썊I2ԭj ]~UF2nnkvV&$oᔐ%&Dmi0qeIm{1gBq q!-Fr!"+ñӲ_?fx xAGQ:LԼL%A8G m T TPPOXJcĬa*ނL, NQih D@O`4YtWwemG $#쟺{{;/ C @§V@wotfDA/ x@+Y:b FdDT-L< p/h%wlTY1TŊ|l2Ж%M6%c&'eШh6eAhjכplR)  @QΜFSι,Tl{P d2HФLQ8B[eʨ JmFe+6]2LZne r`Ts4ifsAJ,0p V&a(Fj01ѤI3iH&4d~p{)Q}FC2:~ o0[P 諏#B"-&1=;+ ѣ@XD#qšҳȢF0u1@nԈ 7Ĉ>Z&h$j,\J,ŜFT&I!7tav!fbN?qGvb!&b$b.G 5bD "Ƞ>TP S4TTW5UZu4ИuVZѐD 4!bBP&ceZ L)bVʫ\(h&h,3lQ([l +ˢ0Jb.:e&\r1֬cm#MLr 8z12|!.!Sm}rbv+~am„co{c< y#rFH܈X =d͛[P>H?50^{C!4@ky=cEnOgfLQ[⻐"Nۚ 81rY.zr4 ,g-`| -b-bs5<-3rF"ݲӠK@q]sW=4`Bzdb~$[- G"kr[ ˸"j^!Gw|lLz^d@NV__/u-&#aBc3L@_RҰ3nG;p莥4a2Lh(jy?U mh#P.D@Gf)R -ME16T l&HlIDSЃpxg0(#'wp4'h}hd~s.mK5FMQ*M/J#ܨGrEj4dcv] %)5R0ٰE)c̤0Ivu$'OYMvMl%)QI \f Ca&:% @)Tbp1Y` +Lp\Cd G(Oq1^B1@FM[Bmdd01KnsWF$P]| m D$^EtĶsb6sچc] sÔAQAsv#?k2l<-ڑܳ"3}/beH!FǤ9tdDaiKǦ8`hJdCgh@cz--{H&KY#9.=YلcF% rk]7Ƚn&`udhbUF&4bX.6Cc5a3OĵֹfRDIHc6'8ͤ,2YV3ud 2Ū⠔[l 7 *4W՞e58w$I0dPwt&an7fyDagAAKB`bCIAYs'Gf0䙇ֈ"n}:t-Tx0{Eы۬WjâLe*Dn#X'AH4 , 8@m{6[]Sx2Lc`Mz$o12T zF~CCP հv_%Կ1xH[!OB~5lV(gV"Z } {WCHTڅfzR;|RG% fiHR^|td#LF 5PFfgNO݈@jmH̆B ]ߦ^ĠH;=\oc/DxD?q0nCDd npd1Q"ʭOƤֈ*& :+e^h&O."o[6YQjKQ*&"4.o.0"Rh !v V6}6$ѳ(1Mp bȑ/&k'FA锫 )!X vVѢl߈h #PȌHJI(/(E$LD <#k=׵]ծ͛o]ƹ|M=S"q;؝uO6)םs˵|:*%~w=Gq>+m\]աXA]Q_ bN@V!""!JM T4W? V=E"a J^#  DB<QjP%03ȁ4C4UI/z pUGNseKX=2BhaôKlysHe\q-EP7z:>{G& Y>[:~80}b6/6PԼfi2վ=[mۼc~vl ۶47& 4РFLv1bpc&P4Eqa|7߸b|aLyaxh+/ZE)\^YUhS1DMV4mՓS]TRODT-6ay(Z5SdDEYJ@=eTG:֓(jf+I$NBDXTdՓ5U@V^eZnY2UH=UIEE#`HUQUeag~ hgMx&NQ%R=H~&e xXfi9ilj k i( , (IxlJZd>1R41H,bY6UT!N&QE.Af%9hgfaPWdWF]eOlK^ջ`rI֡~`%&f)]?YV-1č`-aA!r*22RdIY R ihc`UTR*QJ[lYQ\u_K9%f9Vja>$w(w#x7?>x'xʮ 1&dbIకARxez40r4 bQHFJe9IjHk)$mDAfErtU7؁QʨqQۏLTeo ?C8`!ʨ2,C! TFȫ,tVrd}{KO:3P1i0ۗ2&I.<*饀(2zܰ& I k2CАڪlH F?3"?J6"}ob2!D a5P׹4X#(εq85ql#G9VDzK Sl1ͺnĠ ᑖb.u+[XF'&&LkcE5%D Z]$%A#չ(KxR9[feSF ҇(AN<4InWdZ"{Wz0'P/f/ Km%) {Bf''J@@}8<)9G ^6hٟ &CbE (Rc7LbP\ ZNr|K0dPT=Q%56RF(~b, *8 nrSWMƒ.h>pWc.l(zvR& , DISwJ'D,w*U41pzWqc&J!!T6U|&Z#M)թ1xtG;v1 ,_)<  ;<ʨ0lWi"@:1 P$=p[GjI&%$#L(V5iT靆YB,/RapQ\^`|!ʀG?agKTGl.Tm"EM0W{2eJ-"%<{QyUWa7IX _cYn{MLΦ_' q.4(h/./}MYŀy|3D>hRy4 ~fjWa/K7UDQmq9 "FFcuö(`sdaRd&`IN^ uoh m@%Q4|c ʨ5q C{T2~jq~ C.^ `X%>dOiZ\OY9E @wC/.98V`<^ToKC6NeQ^At_wјU׀xnXڢ6^ZS鳮tODW%#!0!O^tuv'!/RpavBcJ}ALYLdU6RZQ?^veW#'.dLd6b/@D(]#F75Al9ҖT6TSblESfTH8Va\UB` d]5PKG$.2)rp&k/|3/}ds(;=>iWv3f6DHD)t>f$$tjNGi[EGJR2p$IA4DvR7}"dsjB|{LD21[=fxX^$1pBSr40a)rg%%!*̑l7GGT x6x`hx+yRb[P,Z zerQ4u#, "6es>)"n{)+YRXb6"#$#!i4AE#H#C4q\J}yUZa'Rb=/iB432?,GgH?x)6iSi X4Q.gZCU%yR>wem р=4rbcXՕ7X)/E!JgؖD!6_CZWR:ߤ?-eEa*k=ȃhl?(8FF?`caA9TN% ܶ $:Gnr"tJ"]^YP-9}uhvXzr|y&=t9|4urBe&/@]h97$<~%^=;nJ#h et't&QeRw$H"^$w(ᔆUiC1V 8N8#ziE8X%{1z*{!* "&$J]U߸kHFf9F`5+< aĖ`8\T+_m+ Z p`1k b`c&ٹ"EuȐCtIe'0Po4~zfѝI {Hсg|^"3p=YYNahBy|}1:R@Z" " R <_؂M2J{ 5fe 5%&L. x:]'ca˩Ѕt[ R;IB\83l!y[ ԷIQA(wjЍg4ڄ968ymFF8m5Ź掝c+NFd+hH9քt[ea ~WIvYuD|?hW!7EV1'FcDFĔXK)󆱗6tuYX~4WւՈEwY16%t\B,RR$5pDr4@5S&KR];LMIf)$%/Yn.$8|N|\LIH1<87m88<8#ÐS8<̃469Mz,9t1n ;IO+hq"=v&j {Ac+P$Wђ2Vgu iffe W&5#5ۛj/vť?DM[)}E^^R)4 E'ZB||OtW23xX!pfT}q&'-)~U|!"RzfZQ-mw1j_g*i@ X̡l+̡xլ| AH|H V7+ ^ȝg ыRтG "qb1ɟd(z)h)tKWZeSRDTtMykZc!ZM4dM+|&Җʩ[h_;\|,U>i$]W=q˻=s[R'Bhb B]7Z0bifBCp:Z7!ؼa+ΡDZ׾QAAwM؃ՁhPqR~d3Qѕhw|v#"~b#WvYtf&$&rhĂg=] A;8^#+phPO5]ytb"7"7878ĦxJ9N|C9ヴ8mNeަ U-evɎL|j6 G̾@A6Q1eIWQPPݰJcoҕ??-@fl1H)) .P 1=f#g9t&mjMfRh7!@S2 Q>g٣etw)kDmuE$\ʚFQoP[Yg.6\܂3{-a4׀筡GF+y4GO_G5 (N H%N,5,R^ #6\1}xQBzMpIEhbK3$iō I81˞Rdd4De\Tӎ9)EL)jtHC4D6G:3$XA9BzrZ!iS!ɣ}o_ZmǹEM IcK!GԼTͽ}]rLI_,!C(bpc1#|RIWB^i*deϦMdNoesN޸֫Mfiҙg$f#nDJ 31Drm5ԸA4&I#!bDD #B #tPIbMdSC7TQC$&4BQfa<#FM4$0dGỎZzL(/4B*}`H.*x:%S)6N0hDNJ/zh*;*0{lN ?#L:Am-*Rk OKnLzT0Bd$@k ճD;!lڮUBL "َM:Zb(l7Zְ UàsS}f T#MxcAb>!Favx^xdbe .%ed8&cC>b%0AeBQD73p8` A9<6;Z.m/>JN05Ym(dV}# Ԭ6ֆ!ͻFU}l5JVWtkZ3M#wU/[+MʶDLYWj::{ P2[tz͚9ݼM+׬qKk3?i-hCQz:Yh:R#3߷WҐlHYL H4bE bWXaް UE/PW4al1c vD(HiV|)*SCPqLR-mG5C JpT"}].$A]ĝ) TpRR(|Qd;ۚBBĮmISALV©iQʊNa‚([Y2 l,̤'? TÔe"d(&):AZ p.%}wۡ]]I;OZ"bò8Q2V&ɕ7dx"CnS)L, o>T1dbSŖ0MAĈX2I,T&B PL0ÐA(DVa"i2(4 LVܜ2t+LL}R"RVb(5&sI䛙6q^^T1 HE@F?ڴvWn*!EьjdR2Y&<,!V,ڧtL4T0EÀktRYKOU3ȥ0! X T4,h!駰 ذnk,eW?* ` 0$OA %l4d |ΏM$j5FF:wrCۼ5auM泙2\eM$h&*w~jW7Q-ɼD2DA'XiT҄UT6%STBjPQIhX&-Sض҆dY{^K.%Nbh 鏔x괷̾B,cnJ&0F !m32m>arT2ƺě p#A|P4&IJ(iHw`e;j '7INT{mlf%M[43+TGhmQdo,;]JH Q줍!e4p>%69IHz.WV4trZR6' SG•$-%lo>C`? ׊ P%TDJ[}K0K{&(V~pIK L ki~g\}ǟ6&[c&ׅ*nJ(^:&k+7 ꍬ.ijE_ DD̃/p#K+6ZD-/ %k#,$C%C [hzA&yZ˟mjaH= MXʙY 'fQ2mL;8K]iz^ ,E |DMbl ;jaF27:QXFˡ  E)X<# tlp^ @ODL@GsDBOS0ϣ '{Gb9n{5*7LOaZV4PL( 3 c#m FZ)ǜ*3[4ӗ[4{3 Eȩ|၁cǓX#=ܔ/Y&-c-#g˜(݈` BK3V8"JY$])}`e١-li~ 0y)MB(14< E5 %8 qY 1>8ɪj1Y: D(\5]bcYX0  .;GZ,B׫*aEVyU\ĭ~OXyD)bCdÀQI$* BOjaUV BzFz4"KMAPTSA+[į 0#u{wK՗ ˿ݥ%ܒ!gɰM. LW`hx>)oAf<+d*-(ºWS"z$0jvF!El9h_j}b(L}7]=CBΊ9CuhhِJc<\ՂL h1ű ի=_f!39[ "u/ʯ6ڙ/DC#ذпWz,.)M Vq0L4ŹmA_v3`k@%IN4:q$ s.˱}'UĨNCf U!#fl>:fTB$8Y =#$Hd,./2-7lR^)2LI0rhLbBp9^N"oY6 T흈.\[#]ml%$JܿJ_-r]?+z qxU^fc˻bSxc B ;oN.S56 ?f$\EMY[^Zr*P``cE%SD@+nhA{ (~vGLD2 `ة`aZ2r,m r"1jl}q++YLɰn7ýLVRꐂ[-!6.*gZTL7b͡@T(2O"] ݤ9'M_=})G/>A`! M!Êao F7eŌ\X`Ĉ)&f =„r(ψU,xsYNU^\sL6 ztN==)P؋6b3*e*•Ut)m/߽_I[yAТφbL(gÔip TBSE Ouؘu>r)Ze%_M}PSqJz]x 'RIja݈q'`P &zJYt5#!kP^XPM|_~ɷޤ`AJ@wq \kLOL0TU;JX>%$JbtAvef\qj 3100[un{uMɷiupk&hOCk0W"y4m?ǒ 8BYX,#p+OTĠ _ Z$asHFggbSyKHć2IצSa# X"GjjHC l578 e,k +w]"GaX#V!jQXixûP"2$`p02@Q<# bIbɕo?&QN7OB!o_bb l9dΨ`[Vdb L-A% j CID)IR,54-b?#VB"Ӌc!&Ұ hр`64DT Z8X&,ګO/a 4,͛LE&hTlX?KbkM`1dڎO Lsۋ*υ.djCgxC&Xs]n*֮cɦ5]pc\rWuL k%W%d%}cg 2SyQY-2%4̯iA*KO"TތEE6U8S1Q֌иmk+QVGMM\n(E)bebB&R[IƒABPH54rEjZ -`֧O[` oDƏCi*SGsg*o%nC[@9-cfd?8Wwsj}5[Vrd`%M4L]cФA zY+EywE:18sY6ei%.6ⷅ&seA1H?if#+z"^Z|Rq9pQJi9f bDb4&ӏc!5FFCpz3[lA(z1:Y\6BјwdL\pUYą ҧ-תHLhE@mt&qMWo` mL;ٞMlW[vM4,[sWު \!x>Pii^r\RHOFg|!sQGz _rYVa8 U qiZO~EeR/Y~y߇0F{E<¤ O6ڟ( 2"˝7e[' Qhf&F,`b|S6o{Sl M1`X9{+\qW1zqx(v#So/4LhCыA 8#o*BKh2)*2=Xys9cBG=YCQRJk'Z`xFrwT֣ !zG.}}>%ɾe"RbhyPM,E^L4Ņ< 5 EmaIt `ĉ`ѿaЗN-M@Ry`a !s,C a'ᆹ[w(t,!P0= ^ `IaU>ݞwOe`o [ސA2YY A$%|܅L >QL,Q~自aDHf8 IHRp#|H !x)H &:HFVْL6l Zğ0}<ЧP!>|[l> 1xXhX &ʵPpTe1`:N iUY&s*uj)>A$j lO%O ?9YT*~MpٖfM/az? $D@ "T SE:ԏ !Vv-Z)!`2 %D=01JOыĤxBpG 8Y"<?Mqݎ }V\H 坜,T+jH>YIB ID0&:P~EI|6" r'|' =H¡>hӈ$vW8ݎ!v]NM q ŝiY'΃%R-R"(KEh"]"5hl<dFݡxћ!~-IJb24,]ũ:J#>NlkqTOL !B=y|P6@XP5MJLbn: IlQE,Wq&dƍ]OvؚFH!>E_lV_'~ei1kE UBQH%L n`Bid@Ӟ1DS |F (CO2; hR2շ,'pwLX1pZHDgeࢦ@.DbdNqVD .?yWΒ[)%YfjB%AȿZbI ƄZ} Mo^D\,~6b f\q`aNP ڑ%U|Aaj^ G &bQĦ̰ EH@eh-Plem ^ 9:;Z Ȏ2DC҆@3Tsx2)h|K= -k,*ݍ 9{Üq*r-iSJ/*nHɥ6H4rVjeHW,oy tZڑ\}>bےLN"Ƭg):t.׬ޥD$OS1\gKHz8EDI **ӃkCqʽQr$`qg0 L\5]ph' +cF"W *1Bu` pG4dXG h?#l{ y&POavlo_' <)dLEp*i:l7 a6BJQ AC  =uoTPVOQJ#V2wAhV-GywVVTgѶCI1UNz {]Dq /CVYBVU§9PA aBbVcҺ`5 6WUװ )a+x(O&AܫƤ^.W3N#fY& &waNZZezؚMn Ai չ1& qd.ޱ"-.f wFr<JxX޴s2խ|E(L4Ge4U W# 4G3lxǨiH3U7팾n&-8@ J hY?)1s+.g LnYIzUoTJ2YSt!Iby#<^q+:a,CLUMf%s g46/~JY/ČnP4zr6D䑛mͰ~}D P>gHXg"˜r?me'N x\UYm gk*.(/AsSGS`kl>`+伢3G}L,jnVeïMd[;'k3)+0j:ޜ3uRh>zX˙5N-+0C'eҸ.P5H#';xEXp27:0e=6c~Z'Hzp0Ԥ 1^'̝'{s:LOcBΪ*fHA#M7a}m־ 2} -lT\K(~⬽8uzʵ^N StnqKu;%oY$CԐa:j^i 5_ "¢hBZQ_KiHX&6&q( P4R$a1IV@}iPH%Ӿ8^2;FTWF0Y5MlaFq͒t[~FXT`qڔ_DȝζI@i݌zF бNlT ;;jo8&ˏshږRU' {Vx2(x$Ǟ1pLwtsYk)1ie@u.%MKr!b2>@2"#HE:Kd'7K>)CTF ҜR5S& d1a\: {A.x85tpM:0Mau$;YE#h 32)v8U$skB5REVSeռ7~e uJ!F2K HI4&Z1-Mdֶ6n*7HTPk\SN1t$PNĤFhLl S5SK.Gepo-LZ!D.2-VHjjf#Z\njmԔ%OSyKrdIX뽼Us~]8ȹC4y 4Ea=}| P(8,Cq,(2aZK䕖t~IaoL$Vjiή˹)slr4Jfl̨$\띬vrb+.**=1L |dcVE]͋6 T)]B/Zc خt7b$: pԨB 9򣑄 &nk **L,v^I5N0EPBtb0b߂įXD` ! .br`1D$!0K $#) mJk>BN*HR 3Tch.T@kBEwR%'M3@xM6lP*{DBM:T; P* g8Jj Pİ؊Dm"\P ,$' rN*t.$f $mt ݴbqƢjbnbjD BɢLgl^2#.l,TɎT$\R'a#6b I$ ~ҩbi㴂L&L9N=Xnu'N`q0 Q^p&) clJwci\0n `s-l>Նhj)$ծtj«50ӆŃ䩻ԣ6àHH"*BNR<% |@\ @0тP)*G+J//ʷ?+>R3v7gpxG9be}|CkF2n nF! 4!<N0 d4 `D,g@ p"J6W:1a$BZ ('CvQ5E+~4A6LDbN'fu&Oa Xv"9EXnQ!ϒ+M/]B]*BR @ |=^tHn#5F6%m w[PpPojjć=EwиH^25CNw>lȿEZXR%d8 Biڧx|{Oz2bd@EDDʎE %['wR'l6b>a @#tf"@B_&/A"*%b $ҏ"\ P0$HuWLЩ鼭Ȩ(/J'fLH̑BtY&(>22jmGB4ދcPK5S8(ĸg#D#WJ-n*vU>e66*nS rTx"YDp!D J nP!3(clF;G22ނ6%,5T'ЪAm'$(B(&S (F!?DVW/'I%X iAN GftrgZoERS-`27 [-77 F'D,/VW] LrJ4m,i^zrvArYC1mة#Tp;f@66Jy s`9pMZOoP4;$Мjk`O{IvH QDf=}a< N d= 20@J6dSrrI嶄ŽN4J|d7Qأ,-sҨyx4kM]ʆR׺M-b"wBRX4CN83jr@hE{ HQeZ㟛sW3.Nv@+FJ\YTNCҥ6+ߴ:G]B+ܪ+72$}[RUr~lS![$#P'oo,D|D'AeBAg2 ZBʆp v^?#NtoT ĆQa!×>`M[ I$Lǣ?Dc5'&ZFRM, 8弎Ԋ w0,]H,?%8zt6B*3w&iȼ-oj E,4'9RTcJhr 6\7iʚyY]'Tw)(vvfbyjhTDqEro&~;GE[G$DI 4k=b"ZWzlum.1 vj3[yuy scURY7fy\ 5XqRy 7*6N%WhPY,NiY2L4gw~XЂY k3v";5uD cA.H&B5ѕ\AHZb 64oWzC2w$oLC@ee`eD}\GFc>TFfLJF\I,g$Bi"40"*>2OZt4&._(#E3.8jh&,A%$3n Wёl<\‹-e[frE M&qvWHrg@ ]r>F8Q)fmJEBDmb=F-"Gu?N2h Yr #g7bhg'1(f8e2>@X "h@F1dw[vA4d^(*J%Jtj.Mk ة+40+O(nGi/P,p$@c>r)>ۯQЛ̑&WL* bIwu?>˒L"z+ZI#1%_Of|eG%ȗ2t%Ɔ{¤dD `Gٴ贤AXUЯJβL69S4Eeܹ3XsHT_[?)iA wٰ`?(F}jДͤ}Ĕ zheHF4֧_FMtmԶU4RIeiIS7i &YB)cX8V8:iڞ5VXV37sL3IM^!%SXYv])D=v =(M&!h4PQN恇ZHӊ`M(Qؙ RYcg+!T@D҃ŧ\L 5xz)b7Ya.XS.%NLu4dSµQ~KPVԊEt~=4*LFXW4e2uMW^)5&tQE\(j>B (èɪ|L&g+Lzk 찴j&i (,si2Ih2ᐘI7M3$N"U$ !fJ{^bJa\W)~Zw}$O;|Ťn&vI0mcVN[UuE))+E TXdD7m0UPK#:yJ%!ށPթ6T'Hy:td-UT@I1Bas{2C^ae%"x0 T*JMCߛj =b f1zjov0`0a p cծg0CF#F#5;gJ˼١axPNX(xJF6}Զ* YsX~'uw`0ieuOُVvBN)c} l D4Y%GES4HKMx$~jy7 "b C2~8KY K0ٓLrzN+p&ؐll2d=;jWU`& 1 յPEW1Yj _Jv"@ a@e6JXĸV(8̊ prU:hݚM쓴ex(Zb0DT. AC%%`o7UKM{QF%Y W`J&EFs)n0KԞ X b ߷IH3PTh΍=k vEhSW`fJƫ`&e#.Vy1Q Ę BY.+*Q|ȰJ?> d Pqzf:sUq6iMd9)BncVQkZuFA489p0h,c'8^HQ#&VPG7$#K@/ }甐:yz;b x NM`xxvs whDM*jiۂDe)߼vc+œ(זĥcgBļ:PdB fN]{ \P*~s<TclB%$^g[ (ѣG.oժdT%8ڱti#MF ͵Pc@䪚0@ 9@$(pT<. B98U:6!-DZ(5\|}빼鰈糑i^iJV8ِn{>v'w M"ه5ǤZԈ.H|O9U‰u ;UJJ@w+%؀@nh A/ @}Mj+A4f rf BwXZiv^bf`9/i6Ǻ\a5抨unGa23 1cSD$Y? p̃"ev0H84uNFLPhf=ol]%wIVW!h ,>ˤQ!? C̢L3ͶA39>=jE n 3hd$54|E&ۍ%) zmq»~ǣOJKBŒZĵ]OUfLo4%/.dyB}C84O rVa&^G3'\1%EE!9R*!k1%C*+q,f{WC -fHp1`=Rm)f%sL3V3=L7235O ɓEr2D3h}82OYKA[Ei:wLuX$r/"E&PfPp5B/cb᷆ȷXufR/h03V$ԅ%Z#"jW4DT DzBfzlQ$BQ*A ,d`hp'q8u".qRa9mdhw,,s:b SV`n+V+ yWx+[@U-\bFs$Rq8#Zs#bK(bu?oDg4$=7h`v% n3N#W!CG}MHMh!v3=A#xmK#mJO&snO#$SZOJckB}FOֵ&$grA!Wgt.nyYdj-E_:_ո :78T5T`* c:p 2@a8D`"8H/Df3vs5TQ44oN~oK>3&c.!5WNt2>V_U^PR'!2 f[UIwqVrٓqNQ.EfgO.U%:9zݕ-.CK6{"5qrd4qh=0 ]Ɔ)dc4OCsIx_3Q+n+_+H`h|7-ςA-i,ia6 PҡG2$s#A(`A3ٕA~cfQjp7tׅAo9su^ JROe&5JeQzJ1rn#f61VWQ3cYX?o;13v 䁁"!qsh1uh05dos OvTDVzKOӛ ʫ4LDyɓ2qUWR=:A+eĂ x,1aQ-"UE;)gvyEs%%f_rF?1ɹuED~ $jBL'aP$ Y8gSa$hvJPJb[%2 QןXh*~3Cȷ#MXQP"2YOե Ӈ{#Ĉj@ KH$5"P9[%Մ vS4 -V*b*i ,%,q-A29~~~;{-U,hʀ7aPX'=6O+@h$cY:Z5}zue> ǑE~2c;"^Y!X*y.e{h}15W\gBbVY=hZZ?#G&8ҰPA9{U6tIe{Yː]ՃZi8P''q m4b7鋼uA-BY}Hq߻aU$븍+29+ )ۤB22 ¦RÝ1 hBb-D,H|10 QTJc*F$sorP3)Ӌg [jeI{C7)@BI#d.)[H?.m*7DL%;E(C@ǩh4('YU?G sR$.2g01c!W?;.pPoq9$Lv֕r#VOcXP&Iub$( PF]t؜ڼגG Q-ׂBie5"6"'Դt!{Y5kWx&0{cY)A D l3IN,gd]{]sk}Ĵd֩2if[Dk0RLƴFV(-kԼ2V2I&Xi~ g35/Mf$j+0Er/H ؚقჳOgopޒu`QO)/rwc攻QWb7V#D 401]=Kd^ŽKڮKCbj؞|*0͠෠1Tx~w k:Z`B`GH= 1`H@,baę 7PC'Ș+3ހ+f8(b􀳼r Yw_W"qo>2F2%biRd.q4^9VZ6B>EwJFEo/ױυ4ٻ-]0SBȓ(Z]hMiшjr$f8/u/u-h![ʹX!f_eQCLi%QʆYHQc2/[ P@ ;ŒqE3I Se-d&18Ӡ /hMpӷlhSc싪/ԫط*6>g֋6v+SFźL+԰fB,}uBx_4z]-]vֳK0\~6pĥR*jc|WeXTōػt4wic=YdU 8`!r= b.f蛣#VTY?ظ{7.W|[evj}sgSlJM?*Cͼl /Ļ*6KѶ O>n!/6#L ަ' 5nXh$/MK2Kab8HrP63S:3 sL4e Ee>e4$TzDCq`Z,ǮGbIKS`L#8+cH~I43Z-4iS-Zw؜k߲+z$,3šD:SU0ȍZ-26V W!.1k A ;XswXr{WUwI#NBvJT3݀UCM'D `Deh|6+`܎`UK+[3V}b0:p,Ԁa7&a \(j%4 F%il;l0M0!7Ҁa}Є)j'z ʫƷ 3N<[ B-+U3g%2ҿauユl-+K0ƅ YEvQ,w0N5sC{n v./2m4,Ui mw'+DXT1hR8?)  O2&2Ø;BD,&R  ,W)4-VAH*zf͇i"̸08 o6etHȧ)O{j0HaMMiGJDĊu"te$c |DI(-DP>d>\*. s9h]*^VCd@ :MHPt-5 BɞЕh`];`hbvtcPQLp-*ITXUJzۑ/Y1.#zfԯx`a;B3Ah*KbϱZȣIyat'Tf^ř=&sS ABq4(!]bmv M"fz bDp|"De"q C (1]yͬ`-1ZbP&rGFqꌪ5|}kA̝ʭ>n #RǞɞMwQeurA. ;F\$ybJ6Bj2VZ5 |mi&H-n `Q]j B**$*-C\45 cs]P:vBk聯9 ^#JW&v XGdޚEAՋpXIj[P꒖l2&Wm-E։laK$B &"`ԃ{>3ty$n͐v{y#F^.ȖzyLAíJdॿ!&#9[IY/Sn:m,Ourc{ #>J s~1R⡅h}5/@@/9@0P 1ʄI1DY _*446٪YɝʶsiƓ`ʪ˲3I,>'Kýu+Bc$ wɗC\LS% @R3B1YB)0%B.-[*[B_ə s 0 m9iDiki` w+0EW%D滊c(/AYF-0hFeh\FikkTFi4a M@ {##XqN*:9$-[&~iKBBn)`.>cr6n6ݑ+J 1+7|'eٲ쉳LAʧWw&- D ֹ&vz8Һ!-kRQ I1 aEk"d>s4#8i‹,5@gie4hq˺GllmQ2×Gʴɣ,N4 ϠlcHޜ* K3_'n;1-?VS¸%c}IId-ey4IMXmHP>n 3:d[!% ĐpڇܡiU$׸(bVv5Z(W@P#DPI,KTDе>(Qi8l]9烳Σ޴1C@$$tr/ ==JaH¦! I ^3(*SVS] ='L-C=;9JZI%&c5QD%SN:MH1WT O@sj#BcA^-,ӢM!Ldtq\r̈́͢5OЄ!;#r;e\/8# I<z3y =J.\U=̳ܥC֩rd0̧])@i:Uh48?qk2R1{Ka"IP% v=}BT,Sy{`;O (BHS;B o5/fe\hܭ.5 R4AIpq4CaI!Iɤ7MjR?>AC9%rc53WȓNjikS H;uQ R5Ec&YNK%k(e2,V9"oڵ=cy46,%AZծiRM&洄_wn{-ňh9*D]YT܃F=x{¡~u5ZpuP("Wl G@L1R(M2ɑFL}o4ɤ h)ۧqeEYzHnDlh@F㸏d?*Q%K? TK?ʄR>DM"I(MeV W65$ԢIZX@(܏6G:=v%ިPђ$Yɟ\u> Q]lUs_[0㵃͕3ZXulՎ,=33.EK(ֈI5VO+GU%藴="G4iUE.R97%7M7&E^z|٧^"W6矄iJȈ2lQ][tsFtGi2фOjiH 1hL ʉ'"A")#  8&(A8@I2" TLB eEh@4 pOuQKÙu݀4 N 'Nݖր)]VYvFufQh&W}ߑTkaff ɖqFWGca`j,t G ]3ͩQRvNYYp~Yӱ4ihn2&XV@QLADܱ6EpsYrF[gv}UEh[]&`eZVcS ҡc1eRQj@$o쳢2*x "#LL&\|2$1 G!\22l1oL$.p@)۱P  AEہ)-ZzuWII+AUz,S&ioZ)fX ԲO)Vp'VtWlSkXbd!փ&i9\G{u>ݝo$_KMTGf'Vqku4̭{kje.+Mve5RWh_mz[VED|Jf*aJ_. Ta1@y"&B ("e)D"S"Ȉ@M(ISFA#)-$ c_QVS&p#Nj ѽWJĢ)r1Map׭BAEZcWGÛ.T[ r vYeӚrj*PMElh ǝWs6R1"}Z|*bUD:f&հ$ڱ#ѩ35MU rSA}+yar;Oy*.pն8a|[~N \w#>"F! / 1H&$Hd?@F͑DBqzf#"'@eA͇  Rzh Odĕ{& ò)6 AS[$n9DnL+)ѸNTDPİ.,eJFJSbQ؆S.&K=S _)=#(>*zSX9g diO=D 𞵠]FGLG{ynJw)[>%H 1mSDv1VpO)H=ү +F1OE:4LI.[YQֲf3fY΂,h%h.ÝP"FAJDhH&6渱TebhM"qAW6qENסWR՜T+(Pͭcfw+ܝG2벾`q$:'>(Nm(^ugz8S%zG$c9<0YUױBȤ%x:Vŕ&UUXӁPd|["/Jm(ЅG*)ciDYESIQj'L49V핻 .?Y˘$0 4c@$ gǖ4ߪد꯬`zLKM X}2;"s'NlD +1곐hzT{fu֣TTqZJD v64T0IkQ-EMvxjq!] i7(fykwhT M4o}9q^[Dwi_|%y˚b\br8,CݭϹ1Wuv-$~b)dgry8#.S8#Kz0l31O,cJtJ>.zd!5w|NR.=PLZ#hGM/s=R:z[1_7 ,gMҳ+m<͎6|R]UATaPwWMٗj/[U^{aJW+7^bpRG*hԕrŤ[@* &]f|ѿDCDcEC܀&GaP*SݡSatPA<B( l֗>LIUL1ل ք b& sAR@@*IZI4N\ m$F"S@_a_F/\ yXx NgR ,IY"| Z ^ҝJtF?Vuy EBac^G1 a71\XĀhˆXhȒM>ɀȎ: _,NBA@$(&mɖD2_#NE=yDD샍5% 4eG` xTXtNڼ"9K]Hz Q) /f(\!]ITTؔΚ(۷ԙZV0bD%MD̅I `qp]˥]P2=E.U.@Zl&̤$=sDĠ5Hz™tf'v'1`B H1DIzS4APtI$%CC8"KG@ENlD'h#Dp6byT`p%_yXiᄇ}&'ifwyhWEKQQ h:؁Ql"{CVm(h*Jc#Sz|!| NX V棹T"n#=֖%a(}yEx(oB`~aJVFW4}X2M2F>dq9!Ḳ"ȀpEThqSLK:}AL ؘBā&D>DI=L>YmFm=>l#~i@)!vҿF#BV,"ɛnBz)tɒvibdTM rTzVdK!Wmk&#󍽋 NCf0koU(YȎwc4qo" >[4/U)(t. F3u^6pԂ-0pA5MoKnP2h6VBpLD &lB~4HTw[#"EME"Ki0#\cXصZr>)"L]2h(9,r >svH VL{1YdQ#74 [2`@c=[R R؇MIENU:re]v˻lN1"(ݢ|K` 6\Xp NR^b"zrq$eIH9a-r̬2< -z!x|2HBibߖV@U.F˜&RCSP/ʔ+`*c@یG}i'`4 AX,F;b4`)Jy%i:qŐ.X!we!M[l L!AG+[;/CnJ Og8LM͏ HLo+YiQTD&Pڥw-113bidq5y6]8Ɍ$m'N8aHƈ/dBl DB ˇl L@dRKNo5+ߙcm+)%ѭ;]v|d,gGeMOS b EW '_ %yK(V\; NC49kQ6?+a1ذQvһB`dc#Jdo6'j3$9QcE4FY|o2xr@5H9a{2ȤH/8=5BxHŖ(M4")DTP_Lb;B :`V~PmJJ׶R`xUqN|`)6s(丬␟pb U$]}3U# n/[\g=G]RS=7]}%g#9jٲPҨIͤ4/4|I @DPLc$0 -? EMB$&MDL D#}PE>|:jL& gl'2ڍ &u2.z,ˆ T,+H32@r 41hS,\ ,S N Q16 iK9MH trlo"22R2&Ǵ\Q(,||lծ)U5B>ɞK V** #R+)Ii0N é4='. *ň>QC @Qc@ pC6 0B}?L0 {w p}'_#l^4$IC4&8 1@CÈa;c^*YdSV']+0Š' UYPcsK_[ul48mԱTTNjʋ*:PQShqPxjɭ62Mde&ѽ9[s 5Q=[u{.2B +=yvM;9!WZVikƆQ -̲dVH#n)m$M+ݣy>w^޿e>PGqEM`MbdtV,ҷzqsdv6e&Ukv I >q79,i/Fˎ-Hʔ~%l9 زsjd'O~+#|Re"QR s@U08]Q"5AܨO )i2/\tw1[VZMQ4 Z!& OD>BcUh=Q/)t>`*]≼nc F2A eT$&7iILre'CITrĨ+-ISV@(Ld?bIb)dSd(YeC`hD,ɱJIY$u-UUYXW'Ķ'5 H!8+}fnq\I ӳ(pqA 98~*J6Ԥx+=YJ5+gRYG\:EqZB%3@)Nm7 ɑ-o'9!樁SMμh ]N%*LcQWW NNQh@}1>A \c0zִ5ED[5 HtE[VPխmk6 D\6$ԣ} ()ze3[*Fq .2Ɏ@{ ?[Z~X2%2 )H*ߌ % Hb,0ml䚹TrBΜvuD>!J㬮zѪ|(YM> ӜF,dBB=JϚ=.++4A*e[6;Gt,qf2a\r.'2]z24%b`}ڥx"%a KMrbOj!8@_,cKF-- WDE0b&DƪsBss4,<-e?Kg\tq-4uezD*؜x_%(i5b0Al7w#):Q 0/ |B w"4KU:TzhQa\GGfKC8IEs]|Ug )rk<뇢 Q}3Ednm"{*`Z aޅj=]bxug!# D*9׷U&+Z-obDHD^ƿaL^teڍLٲȨcHLVf޹ss?jvUuO/E*M*hhVtQb<0XL2~$X .TKk PCM&g`k"hзl>(t*sBnr4gP,gJ(qb8z:#(e+??cZ슮: ބ2AJ ͧ {ɖADO V "}5E1 2N0d /m̈:+e0DC9©~Cx#v#Dul3H1K.lӲPsV MƼN9$k7YfdP6Bq ~r!-3'"8gNBxNLBx8Bfc4'QkŶ(ގ(|bTyR ^ezN) ]8 6) ~ rMbD DpODa E4d*J)r RrBJ/X́kD qPU46T .-;Bz"L-*R01tiP 92R^vBH۬J:ʃ po ybCHlI *e2J5$DP8Bxc2h-c, O %S.I >!m - =$a ( b QFcQK@/!!.8!񏨩 d MC"'b4Ef:22)n~-Go'5*r2 #NMg2tToװ>DE(`ø /K,kҼJ4nf/7`jƬp3vrNTՖBGm&a3PL$g tl p 0$g2QՒoɞ,R b@}}@֨nch*"2tx0qlJ%RFpsv J1LrvzM$ /pD3Bxzp.17nդFI;Gn7b0 iIҩG4h=z*LE$6#pZ7]3WMh-݉,;k,&6W7:u0B78Z.hkv'D3B#9Yo?:P^6;В P)a%<5jhCrKAr/  5Nplr0"q,L ) ԌFqkl.*mh$>4VB0@6WU,&4u 4CnjȋwX./7׊Ȩ9+2nL4pxp^}u/hc ͪNAG/l琬:\!pbROyUF溍dN2أֈX_l"jE#OleчŦm(5 M(UCR~l Yj݌rIDPd 2~G0Op q=7.PRKGxEj ܂nsG8=8n 9+0@YȜP#4V8DKY(۹5&6#gYl2N'"ogT`uW ;κR6rQHMY5wwxReq,5fOP;p!e c`(A8dC2d_e@_.$_:D_ĺ{ħ|bwS~!1}:FusRGڢk?B#ve9x$GݢZO)KsVku<3mGRbC%61݄Fk^OX~6n׆p&"%P>>##|A+|v DʌrypvLiBq~s'>ԘRfU1V3}ǿlOU׵ A v 4eE2D0P- m:/Bq^h5VkKAgHY}|Xt"P΅GT{*0hdr)/Z B>=]RYC3Ze}j\ g]Re-w]*5SgJR{e}-݇|@'}r_|]d̍FaF*Y.ȱ&dUmE<ֹvU΅aM=WCh*׼1ۈRuUR\CEDՓhBNBپhz-W}-vA #L$ȇl1Ð ;MB,cz4(0"7:lȱdH[)hAo \,Fͥ $DŽ?IU$ÄJE*Ӛ0.с;D[j4jbR3)>bR bM'E8r'K6< țAel8ʍ^ 5je kҔIӛ4h@2R \ĝ<1g I(6gҟ63R8[_d(es>> 7,C5&rJMgA&Ev Q6S:tyqq`qWqK}']DuPxb4|IDy~ '!QIOr'!p.Sj&j1 E$C 1H*0XJ)n(**# ij:)vLi(L&[Đ&0Z&* Z&Q @K+Ri+$UFf[:ww5u*)OUBYkcTS=6i݇Lk-|Ԕ 4NIXs裐FNVtpV2(oyeaIL}:bUt̖QPtp#C^QEӔC9~6n1(ցniQL;GZ +GqB?2s.=Zu7^zcc%kc$Xkp\a,d!o^+$2alZ, DS,c|L%sC0҇1hUT$9 Mq3Gd9U}o௷x49U\ |IB!xLۭ- eد#"£Peuh A㑋QDFyJ( oa> ÐL3N%@p^w|a&4(&} $1hI$dl$!8d9=TP* 1Pl(QURl씫Ը)IRX7p!?ŠYF2 M CU&dIaG'E[ 6i>A#9KB-.]ؒD8kA}44R^: 8!X7 ^Q t3鉕?l&/|%][KbF'yKĠzb)KhHیP]PiR [J,>&ũLIP?@<1Fso,aO9 AC]> Ib<_J'?:.qD9X ʘT4dfRMT?y&ELpQh8ժG..'%+e} "ct rŠ A9u$rC0P0GImdPt0xwj,g%C=hZX@wi1+Xf(RN ^Ӝ$և̜<Ԕi.Fԗk9pz;Б2,,nGbGE!0ܪڸ)UqSR C"UR!R,)M9؄2@!h$E.jp'SI89SU$+A0%&jCh^!Wle}/%/pʷ9MgYoF9JMSSg[E'MW&# J)'Ğa kjfhͺFE,* :oڌHNmM_IVtꔕX ;&9Kj2EVxe6X2.  b: U1`gƐC+$c`bN BK_(%t%M"v-*oMm͖y8BG={ }OԽl?NB0%vLa2P>UT&@ pD5GiBÐTa<kJiX'F 6c xG,ІH+ RҤƫF#uv8J:pL0(9_e("#fBb?!o;J~Ʈ< ݱڝnw_v3A3eN6#dsu%5DNV4O00B< MlV0?PEwsFD~C^pFg3"*}bME1#ptEFwaIj8@E8RTcTH儋# y&)m6nEuTFq:@ r a9aPi &^kr}W9-WrJSp[F{52$ +B#K;P> cSStNd'Mlr.3`v 50%12DC7rQku ׃?=x}-" &|dZB&#e2EX'>D%S q2̡e 0AewxJHWg#Dݣ/@@%E[vm`x (9GVy ʃyHr*F2a+ q+\H2+rboIPz-tBv(W#P(3^4XՀJtOt!Bf-Bݸ0VQ/ _g'.Z|dBYIj\=36Ud_ 4wi68[yCjg1AwB.zW?xP}^3'~$ZI} 3$_`eQ!jYq3X.$y9%EqJ-q6SѰSy1F~AGi$Us)AU1)c)1aV8X5\(+ A pboxipVg;@u4XMb9!E'$q$kxَ\feK5LH#u>y12GԖұ6*rvՔZrՈ׀Zfhjr="ր[QNO%3e&zW7(^NRRV"Pz85G#Xy}l"+@++ѰR: ۥ +{[C+ƒ 1c7e^1Šf]-10],7"e$2j6dZd zX'Pss5ꡓ%$qVӀ3(oRq%[9T3~.Iv3:=*X_ڃy?FY[JDEw#Ncoed*A[ht@Yh;m&EkQW42S8M(G-i۳e(; xi([:ۻy [@%[:hhbbpǃV!U=69KN1%j\z 2O rJTrb?tL7j/3 d=f !Enr@t^Ӣ.sR6^Y.49٬9 #O3B%Ke.7hM5\?v.ź5Xڴ6¬'^0td$7M T0wQ!hг |x=G88&ikmo lUɩ3)% ѩexI#Efe4x<4%uz'wt(R=Q(h?`#|37a7*7[WS.jBCS4q31#qJÂ7wPPMy%%Xx< :"riM9%4¶5PG}hĘ E%kҠ .qL\@g\xi(xF*nD +)DСW)*y̩ HzihEπGSc|=S%e˃:EP딹XLRGf@M+0NbpB<ŽZ $kWz}g;Uf1(x#*x# Bx3M[aSe#7nG7;Nhguc4f? wy}WXgd|g0iKDE'& mUTń]HT ˩ &xx((I ?t=:.12"Akﳖ00mŢ}XP/3rB7]KhDEtONeOhOw!~3"%YU̩[o8Z/rDE1݇Ag_Tt~f"!䕍4@-sǡkdv>4AKޑC}(l F -F *j)<6*=İ` Ή +1D2AewQZS3RBNԬ QP2dXPysP#j# (=@Udotj5Qgtm'h\%/Bsw9ia=DpXqr0#rQU7"k64a3pbuCi.[آ@Yźw ã cpSK8=ڜcT))p9=_:^x:Sb a.Y"*L<|Lّ\= nXY;% 230Aʞ/bFZj}.zklEd DHs&#X#U_]' tU@z=A"6݃xQ ӷK= rj^Ws]oW(3p5HJJߺtaY0%QW*0NFfmڦ+r)v s)v4|b)S:ztzp{P`)LZ>-`\J)\Y:%4N,Գ^E@=X02L/v_v'2?S@2P]6=eتY\]32:j\XEB痹5h4|c^|0w'E#UQ,յ@CAO h W/ZA SϠ>!le<XO@+nabE4ñ/2PըJMI>KIQE.EzTiRb)˴EamyץRX4*8@i$C41ԃtھz?<\bJ7X0H2 'vxѡ&'T(0h*bR4N@" ˌFKGLUII` n)/<23Z200t$qVsPĎo]O?ɂMT9,, _㮝Hs1Ѿc!1\W a[S LU\ NXưU>n{eq?6Ę +eZbQuܠ82d=j EI'PMclAT;ϡB[-!L3ѵ~;7&Q-SLd܍bX&lUeێ80qx| wA!LbSx&Ny*5'j@ hB1xS4Q#IxSbҨeP*gA[ dB 1e6HϝU j 2n#9ߺ̩hjtN;לfЙ#4 JfSKeair^ Fiy+&YH$r!р!P5A$'ZO o@q^Hx;IFSBeG1-W$W 30i$8:6f |^KCD޻huk0߮"LiIvķmjkޢ2'*ej8TQU4DD0a2! 8_cK Mc#_Ε0@cY c>rWVigE0R%$) rF3qRR+ER?XEHV,?XZTW4@\,WԿI@_41@F@4(F10P1 YQ2 z0b*;=[=e0s BxG,Y$(d$iّPe(89o#0/J0ӜɊqa2wb:DYj81SH5$=J l9:#kiy $#> JDI7sI$Y2 P2߉ƻ9$D Bh ᫐ 1EJJ KK,K,)T: Ё5Qy3qѾsC{t˘!;' b:1JfQ2Y.\H'c,b24?ZJBJ\ JT2 &u;[3~'oEj;=A'?4G:H2trl^:n˖Jrt4óSz%=9hx2ڒe١O!8Y":H8"D Pa?eXԄ8FAg|42L- Ͳ%C0FL8s t ڣ̀ sJLIݛz3;wQBk,\ DBfC5_z iCHHתH8'I+"̑H|. % B+7)7R&%Mѵ͠3#,3kjc T{(  P X図Xռq++zUJUFTU@5@xñq$MЭĈL;Rq[r’;Q*أǤq*%CH*D#L&!46>TQQ(=t!Mّ8;M % !؎S381%!Hr@:W;p#,#I\ppG%1|ڬzysNC~M׽R!ݪM{4X$3фV܇ ;.)A!P#OI0M -8 ;i,RWʞ8쬙u9f8lu*2[hK{{JرA25sӨϣGѢj х}U*DR|U"%m>KMY<Z;O")S19R!9m5.etU5N>SRYC*N*84N[{<WX4G3U5?Z)y/(a e؅0Z 5^Y800ePȄr 8R_.h8.$iaW 1)JBm,mXٷ AmXp_+YY2|V`T0n'ڸ ,'1:z-sK˒3T;0 1xr!Jý2"_ϣlq<8"?za*ktN0Zv9FT!F!CbMP}DHE(/eP 4Z_z(P( EENq.,Z'>zƆaTJh"i2"G)” *tA0*;$6SqCeΧAБ[pa!G Iw - f==zk9kT++6}،  T}By RGzgMe3z%ә->dh'k QfSɼth"싼 4JU5JÛO؊H+UeK 0RU@Ћ2y#Qxб! ˜kR$nW!6z{G=Ñ&l$D{jG33#+6]D%$:,'A~V|z êڗ6!0'6ч9y1ˀ*1|i Lh.4F]_..Z; &#JG"bPJ1᫨ 8Nmm°lwj p;)AO@Et\($Q}pcH(\dŴ<Κ %zĭƑ{V#:@.pQsDm,~DS:wAb6*sU su%gnn'.l'RR;e0 cc,_Fem|x4?^ӛ!~nu s:N`'j]y  y;tQC(Z0ցϱO[~4 (в-e^ "քa,q_nfPex1JфMԇl@0{"(P>ROPnz*CLABQmD[pc{{=Dϑ>8$ڍ^BtB8v]%M!t8LG<.N-1Չce c.ײG_Z8,\nR3;#CO#S! $t&wyi[Qm}ՋFOe9\Xh1S0ă ԲPԤI͛4%#(iRv3gL:),a?yᨙl˛4}z jXͪOb*sRbQ&)NP2ɑ& 4,$AcQq>C!vD(xf+Qǎԗz  ͳÆA>þ0k,}&f'nؙkASl#av17.ڳ}k.Q@Σ3GhҤNN0rjʼn:η^wgAw|7Z4I&@Uv6ZEM]kiGi]Y}i7C}vzxዄ!Yz Fv1fg_~QiUyZѶM8Z` ]LI%F UF=)cTN2ELqYO&DzSLwT-)R1&ȠY1W\qA)E{mfQ] abV#z )zᶑMYobPPBE֐45 kikf YdfjQ\~G|gU{Z)@]xb!QۭYj[樠Z d&%ɇ^qXFn,-snl_zJ^RCfIܼECH2,'Z]^ټ=G%"`=2iDIiFթT5ETWTٝNN8dAm22uYiq@=oP28WZ=jqx$ x-g 1p-НW'0˴;qϮVܵkU2sv2 Wz'Ls6ѹ!qx+FvՖkYϢFէ^$1|SѸyOX$iwȲ%#Be!9d},Ҝ򗳊n2q$(c2w HkaG>t!hĠ?9! 4AM@4OvG&Lto_TҐe(+oY\Y4 3aр \!d /؀0ְuXfVA!4n|Ҧ_GX[k< HyJJ_d"3+d&=RN*!P]hy X!229\38_2i׽E:`գ$lKR2eĺmKttIs#f5‚HCX6\I2p%f\)IYJRԌo4cJiR8miT7S(jFJq rr@O]ԙ="lL3ڙ@``qey L81i#Wu/[96oj.!:FFӥ:hJ6$ɂ%  Zt?}SLI:5dwYmCWЦL5km[:׸nI(^"Yf PёTAeJ?U/zCMu*TuUÀ>#Q6 }qѵ5ZC)Ae'˙|aYFG%o༧lw42˚d4P.J$ >ƕ"ġ"VyŦ c06VؗLN30QωQId#f8[v#"  Y=GV.Luz%T{8).Qi? %-2 U1[ؚh * [}+ z[0OZ큍чU .ixMC-Z8ޘ< 5Y&jѓܸъ4أ!wFY]vS3M؞M-eJl0S{y{L5$ѳ kMwHevۉo(mr2 ^@`(DQ|TKDXE (O*O` OOx ޘH QM8 QH6W,TՆPVy[ɖ YVWL H}m, YiBx! D}<8mO}bKbIɌ$k|xt D "_Q>cL$ !=ZEM^|ᗥSepE촏LƀH4@fez,/V D/zFt/Je"m4az a#-P (Jر8Z܅ 1I P @ xʪA8UH)Mr$EU4ɲڛEo94kB@ ĵ!FAܘy$0B9a/9ԃ)ZœOoК LU @>_1$Ğpݤ0$bH.Vm ͡. 29bURg~F\"tFeoI=!u<`ItݫUVh`VTn U\:2 <E DL ((C(1 YdB8@CS :a?%-baXbeuNlOg`CF@u[(SfArOqN=\Ŝ^Wq E%{(ulzW B1T !`UZIR=a9e =lCd.T{PqU\@ >p ]9&@,c0DX8MܡMLE ~D&ȀYD&pL\-^%lփ_|nIxƟHD^[w̤B !1rahMcAh܇pWyXݧ}郖! Ŵ5 UҖ2BKJ?ej񡐿g$D9gô"N%]ejhݻ8$&dpKH@C&TF QɓfBMAjA!bfaLQ&RQ a&J\hcOH^Ϙ ՇNփRPA^|<4Pczh35!Y^N`ЌIM!n)"nDK:"ъä'Gdl޷XbeEu˪t=xt,ħ֩%9W!ؖF5Y5bq)VIWcŪGt4UJ>5"5jOA J$1^nH*ʜѓŠH`ic l1 (EX6K)lЈR EҍA%-H>l4Kp>-"+2ꋧadyn$}6,Zn"ˆa$^TxcݎY/EI&ֈؽϘPKeE!mmQr "yl?*0 1Hc4O淞DJDf|.dLlnpOLd¾ClB2\Hh&d弌:+.׵$ur!:Z@PW F4 A-sIy`Aƚ"PQ*l"]$.#'1Bj0t%ӕ"2 +̉W/}9 1(MPadϙ$R-2,W Q(Vg -]p+rU+-"T]戜J Q.!`QJ^qn<:ѓ򝕖 `%=՛TL?JU[Ht ɌkLf\h@ 9|N,.-E: N s >ojGpO%\ZgpN6yrUqnb/V!I?4"wN.V 1P~ wyΤg /ՃFZECЉULEb7b3S [Qȍ"bZ`bMg*"XxEnAA @=݄_xmE4`H!1gĆWBobD;9D,Egk@^zB~$_(V\+RRLКZ#lݖ#-cf1j}Rgf@-_la[ؽ[DUU#TdVc1S / ?r4v'0"ʎtjHUh~3 @Ks7*T<󒪝8LcLElJ [S1LGw o& sp:JH ~X)e$I6]t*>鲟٤Y՞/\[Yӊ)nn'Z IQu/a֙ڙ+t\ioΝ1@n|vNe4]g66vbm%i\12*;J Kʹbk J:kŝe2e3 W(N``dWA=*6,]MfHTRT?Oշ둻eF$]k-gloq+7S>:!{Bx/,vz0Mq9+yU+Nr## r)Ȼ Ԗ&-=7iH9}A橐 =庇oj1ݗ#퇰n4yUͩ4wy/KY %FZ`z>đ>N B;Edse W :E>`,fOJ"~dZӄfnϯ =07tF&tLUQʭ:սP M|레4u?") !6ȁ6AΪeon/by"#[CHe5TС U'n•mݻx4u[#21і*O4T6)M !NbC'bLĊ;1D3NpbB$JSNM$QMpXozыVo>eAoYӧX*5iWHfokVªM+[vԫ}V2e+N>idBT+hRO Q=wͮU:md[OJW4sN TqFAVK/+wWkQ[p}Lݼæe_ٗ[^ßYwR6zKĤ 2є* 60* #dK5X5**>L 2OC,Ɩ-+4頄nD2H^r riI!M(''Ac-A# I@C2q#J MKغmƩRP8b+? S$ 0Pj;V1z `1FB.(+95;:TTm UL4֨”;Xm]oE++[P9%j礓⻐DRY2Ut"T+z#R2UJAzÊKu,LνN5;c'\T櫎VpǠJc!5L emPn"&L4 *pfe ?ZQ]@ BR3eL1J3saU*Tz*lﴵ15Xʭ8 n4R NR!;|}3U \AMAILRE]'cUYZo>8ҵѹhvX ^f=b췊Nb= O$s/];61vL!@hb!&?@*Ё?O&M$h"e8z^3-gCAP:V`V'ۡnL`b+2tHAz $H  @ ZvF 8 F1A41XA60t2Ae$c 1NL 2yBfЊ 8$Z-=2 IFcNQE KixR(;M%ޢ;8 c@E#ԍHVZ+ {^{ʧ%炸qXÙ^p]o~3+ĹlcnwWroW]a &uI8f`l~*6rAA\{3a,29-A1ZY2+93 (#,#:Pf&L*XF&DMQZ(R@qӗlo:۱ V$ZQ'A&-2Y:->276Xuiu4U"zPOW=(uqLG1MWk}>4J'r !-[c*|#l.=v uҕڰK*e2al& hM' ~ F+! 4a:LZI!4!d2 I:fSP(V-d)ğbp,tn phO p n \O8\FGSNǥ&}|Űe*(#P%SrI@bn`IPʼb߶AȃjŒ^$Az(ZnLI?'{f6XD\jT}fFRr "ov JSƹ%ۍDW(P&․!ˤ2L2~8QJ;ʹƒ#h!&4d(6+FfҼB/"2<D H ) ( @ECd>$_hQe'*L*} ޼ D ƌą%P 4\pp.C\R<W.Q#$v|E\ ƠD٠#p3cA8c5Gpg@2QtIPsũ^-db~e"~$\ 4Q6o R 9.I"aCe@(hqK. R*C8...w-T*<2L_U[gs08f@i=+U^k<^gJIT(*nZRLn.D:dHm!Āg*hXe5&@a@$!ar`-%ύ"\џ"bU +?xÒڮOdD= "dRHfaDP3 Ep{ʍ~^ T^(ywP,ikIv:C [8MGT~ e jXH0J-Sa Tfm9[ (U<酰,bq2ȔP%>.yZi972k qg@ A7q@+`6HVX$hd B-F`J c A++`,!OGtXҧR0.FQsUG52兰JF#Èiîc> !R-JƸ44'oIS!f7%oEdpcLO΅Cr4J=z4n_HϪEZ E>OK_F=|g zsvjTW~CkX$ٰ Uy$`)/j,OVH:xnlҬA"|Gdtb'/Mc!`#\E/#+.bާ8)0FNOcR1tN-0O'j 8'',"L7=ڍq2Ow&3apK4+3TFJ&w)tZٶ`N{vPشcjjb3ndWq<xT*mlCP?֥dj(ꢂӏXUyy)~GXV ʼ,EXn) VX#&&ɶVB D #pO& `9B/*AY?A69b0GB7_wB Zew^ B3ɉp}RhÇe2;Ce`h yQ#*jhH1oT XLx-^"2^~vOOP>;VvC#FdZ[BsbeAҧvXN:|@) B5"<"X⬩%""#6%ɵgp(A"FH\ |+x1J1s@Tcx++1ViYHPErTmpv8rÔ𮪖wꢰb#=rzH{~zh2fTOB#isqO5ajKͷtqhaKKIR”3idqsV&OĞc79L\%F:8x9l[D"I#$Iߺ"H$$oJK:\OĀLH|d(Nh5|ϲ)I*!=8Rѕ1p~y#(/_5]-)0TU5{jyTڪPP z-FGf9dVyܪ%5uron{ @v2 alj|8PyXꈊz%SǩWW#ig=8:_;6Ue~D 0"g^c]axr!(\:7;\ #*ӕL) Ӿ.*X׍Z㔼|IS:˒hRwqtwt7shi7}k*aN-cG]:nf؄oU mN'vGu)hb7jd ](%M}m L';;B.i'jLꤾ"j )T*( Y΂ hBAn5hfbgl!װ-"j>&Uվ6̱$7Rj-JERw4N .j645~`cwJOZ4jh7O<2gJݜ}Z6 W,ݡYl);a^8ir {Ln6eW9¬,-PC݊2/IJ,[jY}jФ&M}@S?  S#L 11C "_ j&i2lC&d1>phR28TZ)חHfMV/M ^%Y[mn$AZJYSIZV؟^%muFyZp-V]tVPjfQ5F&wh%R%*d\lYhN+{ 똗j,a۶du¹JjZ @hD{1_goj+$n(<(L'|RP J+$2$a>6 ֕g7i(c"w =c)Tu$qӢc`O414t5W521McAUbN;hLaƧ)Q+w#*QCsThU^v\iyǒ`:ځCD$Ok ndEJju@ ʼn,:(m'+g7wc4YAyw_oX{sk?fwç^(w}owo8`j0\[Ho(p2Xѿ28dB +8|b,I TBnqDT8$)lҕ\ڨ-6)J+[ 686%V) L3-0AZv:3LZ֔ĒlэfFǬfW >GTZώh#rF@nZZٵ77̰fWk8e;ˌh*Nt3!̓824b+#> > ,/}_ۏ (F0qL?} e|@ Fp %+rS$Yj3ЩZ(HqkO$ 5A$+ ʏl{9sJ, |au7IrҐu3O1Ðb Be %h@#>[C! ahX h3mpG:[A++p⤚TRd,oFQ}iRm@(փ$zmE&PEZ6S zC0&)Fj6;u]IYl`!7AUK%%"0"m5i5GhXC*~RˮB܄ 'FV%t #q]r7)}ri_Lc0-al bɜX~ckc9&eBol fFQ}z(|Ɛ84d $<#6%!Scl(:trH$LVMI`b*]$ '=eڊ[18mHu,絳[ &W0m m+;ՠƜ`8"8^WA Ri>rtPi~yş H%'6C2+bE-* fW`hfӛ` '*^JvAA8xFT6Rb=䶶lvH'[ 9ZYJArURfD"v~Qd! l!qCfA/A*-XYea0q;PH*Js3Y7I&.(/UmȎSy92/vPxL#mB3wznSuш|j/\C%l)zalA !Mh|j0qIBarP eB 9xC J`G /kXWՉ&{Aޙ]H@=pŢdz~$,;\|Q &N.ghvUYRcÌ]CcqeEyx9^<f3gzfv'wLW6Б^*O29#`Tw+GEQgf~3ą6~qcjK 3&b9C1t+lf[5cuJm%p"#!oK ҅p0 nU>VXZ!"Š `"Q@(+b@ؤ UfrEr51iADS.C:ŀ/XrBFgqtAaB~Sn|MOJUNQR>O% Ff׃ڂt2x={&)g4'RU$'a=r'K-gC.&94Gx]dC;~N*Gs<AJB#26h^rny/3KJzdQ0ʠ/S9o1/r#J/"iY8PnW#rT8j"qB;'Ut9J!aT'65g"1Vm* %\nA.Ff!ʨR(7I hm%]\|FXwgq[+ƀMوaI'Ja5U-TEx\476OՇD=&$RJl:r*,(S;8W3& = nSW<֐f 1e0 { {Xx/gH M#2 b$5b# |ldD%(\x8ѰYZiAb(ۇ%Id\B%F+y'ς;PCT,SIkn\!xjñI ag,X >G4=uʕFC~<1U9H{:g;u;Xbh_Yyl@*[(:UrTw~Gl,I#>sHҒ")-`벎7W)x;}JrJ#cZ*c$W1ѥ\ 2^*ch:jg*cy2 i Ƨ8`w;T}sgZTw$x$HD$cjib> C3QCKTbVqiNaq<VF_C 9rQ`6(:ϖ3]4WUuib(<ՔC"]6F#DǂR}*R+anC3AVVp%WrU/[J"eð ; Q +We`: [$ i hh  h bax@8@eB3yGt7jHFCvZxpē 8b$D>D\^*^+tZ\TJ@ʸ35y` ~p*.q::O"뵂k{Ŵ3a D4;G5Gxwm&F3K;QABD(hE F?Fq}Z*;\u"D[)(E4]Cu5~EHLjR%;^aQ҈Iwfut7mk-(KJ0yII<;V9e>jhW`Xn3 9ouT\ /ptY)}1Kس v[76MCmdYZ2Q4U?"XI+i\qV=4[+#F^.BxeEѿ6vDE*^E<|J1g}CR.>Vk&jbFfOA#9 5cR,*(bVr+F D_c3 KJ06/ ILKcyYKzϤy$P/wHyMbĂi_1-β6g+(c$Q6GRlSi+B廠0@e[ TQ@ aE;^rVUOwRd㊙VQCT2%tՊ~ERÑhۻp3тyk;jڏqt 溶 # S[BWб.Bc{)A7haYTD*H:=.LraWVxRX]o}WW"p @ ,Ro#+ 1/9H^%[H)g3-%Liz:H,YT{GN 5Tʜ6Ր eil$ё;})htRti𔭊-Nd:kΦ8m(J7$`]]mK '|YaJŁTA<`5×"^8|ES9*Tn\ :z9zz134{LVL:D Yv{a0%/V{фM3ӠӋ1)*MbsZ46y;]u Pyr-gm'<`b排NJ1]Y5t\vTZfdWFO%ŗv UgMo?ᡎ}Qm͇',:w3G+r'~ݴ(bJccdDKT0 fx1jOLA13? 2nh*P|͉#uۅm]] &4~ l_acLTԠGD<"6rF at- /iճ4|w"IBkˆfAIH$}OVGnl;TDFA5hECY EqB/9N\ۗ~F`Fj޾e Vھz :}{O̲eڧF MjҤG JbĔK尗5iΔs%0?ln3 P6QM,Ô#L\(JMiЬ8pk80Z b0o>ap쭾QǷ1b0\†m2 F+8 \pgh&W@0Nt/AiNzj_߉q/" SW<=#BǻukCoZ^iؖ#Nx4M~>5(6ݎ5C :2/7@;"; 7&.9Nz5貁 -0̢,c̹հ[m+FP C5Q̎ S6otn$BGS}B b()bBV%6$jJfZJFa:M?iM9U(eҘd(.BEB!FLd#4bP!JƂ,!+s(ka ZaʉK-!!Ɂl- 81#E3^𡁈ui,h>FȎi-]}4 *z6ŌCflen?o3p8rY˱I8-7n9.$E t0F"7!Ka>3q!sѴs=qYT,Z|ᆕd0;"wŅ|66uUeQ9btS{a"#ɤ@1i}4 LjrIp)E|R&F*O3dQd%+IDKMx·kJhf zWQ 2ӴY65p -F3"us,@]6kz2o}ov#t[;sc^L+{O/ O踸7&ol9R3/@#S@$x+i&dzn4ů"/2^AbsUASLl;yYӸeaXXDžO@&0EcL]yJFCɤMaK&my"b$1`"V6aQM8TeH",\JdV0Kr1Г0Q <>˻Ou!}KE '/2fYo588Lȃ}f1 2 b uSLpH,f+ {QU]&做GY@(k{Cό,էr@HuCդ8Sz̋|Ly0:k!X%#=p!Q J2 0nYtIB64!%~485nx+놔$QXF&"2 B!KΊbA쥟ٙUv&׬^Mg |]}@nA#RgA;E<$wfg8KxG< !Xv/;4$3#9r I}KilWLv{ڻs$]@;D"Mrd*ILoYԄ "$CT0$œ,` ]MW=E- 051Lj0>JE1)IHTDeTQE!PҰyyI: bM%˄&,,dQv(*>2BFU{O1.j?,vzbMPju\ [d^WRViP.졶4nX]X0K:?:熟TȴM:̹ORDp1HY*ۭkֽǘ0Z]yj-N"Ra+m>]fKD~>U12{C1~")vJ\BI8hEĵdN`#"_iJSCwCiMboB(('q^hZAZ >fՐEK8'MЇ{˻.ɧAPmJ߭4HWHd[9?F 4)tSOCxfD ޖq1N_naiIA&ɵR%I Z47I'PPz 9י@zS1s?_&&_9cP9lطT+yW#t/Sj{Uɻ4Lz1 :$nI➆]k{3;G.xdSI(Tf+Z%Q*H12 2yB*&0tKu~dzlz :yCfZMm *YUBYr:4kY9ϙ>r!#H.C1Zv.3q+Ҕ؅KvIvք+vԧV1A?8=3S?(2>A-t"G% ؈0c53s;2SAdA;rITA rD;44 !#ā0:h:jɸj' ZDz)z ȟz j'R¾88zl?7:9饖b/sDC,-ٞګ=k' wrǺdtCpcb%?8\n+#Y q:YS81:b P3FG .C$Y|!Q<^)! @TÚ02Aopq$r4Gq6C+CdJ9![,U,(sph*: BYZ|? @K*%sQS@CV˄}a5 I)VHVz5I:ᩕIĐx8 u ιS \U e Cܪ t@c&(&;吋Qsu)A'RJ2 !౾ qb 2,F<: 원p:3\}>Jb>A2CڴIG'(L=*)qP2KuRT88V$jQ.JBQMpa b۾e[eQ/R4x00eȊG#ERk߃(WC9I:J[2խ1EFأ׎OyQ9.hp@aJNЊꟂ$ŚEuZg<%Soy릑CO ?ve%4b+UeNزB h*aLe@% ]/4@H m`X8Pd 6kUա+ݳuڎyD,{%+J8),= ;0E& 3S 7y1uH -\YUU Yž!sŔJc9b*1yM+YUC%^|h-dŨػlN&8٭U51諤0|j1"c*}1 }`M4z3[ΚK1C.xR`-s^\Uoy)mԖFQАk @ wIÌ !?-e"[4PSÊdtb+C`/{څ:q(PEk:  ffTL .^oLe)X M k['\&]8,!q ͎+{U%WN:]`KreSW^(N崄7M? UuNڟ3A.a@L~m-Y$,n-42XS=M+M.L%2Ú y.tm kAecJ]U\?1 "]#_~-*;y 'R]e[/ܶ[1`GЇy{aF\@ c>v͖GuUkIm(os蚼=e𙨐{W`^32D8 !fl֭>4XddfPP6I \Oz=zd%K#w:S%W(b*AXua-xDB1M货}Æx ϭu2INK srx@hG-`dֿO2ڛ4x%5ME$ >""VB)ֵtOF٩LA4`BrtI~q2.xIÈz0쫧/@i)۷>}t}B{ÍELFO XD[eLG"|˚wDxdD7 <IF_6dYL3nfN: ܘբК Dk4j̆PWS N R_cÏOV 6GnVc4."F:d\yKŐ-k,K0eQYJYjд=>b4%I1P>'V^}Go_0)47z24&&T裆&pCjY5C _ӁQCĐBŦXj-bT@Fd4'nEQZheQ#D&_5SOQ$B%igMel3eMq%ۉF-fqɄӒoUDv\AI]`5ԞݤSM,Ud de-#Jd)l}5Jt4rU&XG5v&UG'k"LiDf^- O)SN_2ds#2d>j(iL>W޺݇ߺ^ ^o@ vʨ7!1D!YnJ$ύU(=AeA--J?s|Y( f[] 'I$gdJ$O ?2ǓR)5K˒ְ ngVPlqcFʆf uL[-%O5-#Ue|f˽.fL%{!xpasI;l]2#ume"d\pSAr(h>iwļ`,<<00C|Ƌ;=( /@ 28j,jmP u<4Y@eY4Ґ<%lHɈlE=R00}m%pL[Jى%I"綴`fXE<"Vff&Tx b'Z- o+ ւ%̂qbSijEjTB(id-\_t)6cpRr 30,նnj Õ"M2@; hfli ;R @qOxcI*<^#]|$%'y<5 i)0 4bx phxC$((pT=kUPb̒H#N&9IUqfpCRUk 9𛉫Ci1l3'0 NRR$OaQ`NE iևV)W>`u(bA\"3qF3䩊󲹼F7TZd-K K$ d}ic띐2YH1CuS $ SsDCC@ %+ ґ+HD2m+)m]M{jQfڥڂ}R򧠘CM(TPJ֥FHŝs\uz|]`u:g]ㅞ5z"kZe͵VJ &Z.^?4*f(m&'M L97& Uڏ(c˷?6rz.UٱN,j/T}(QS>6qh*H6y6W_jDkHpח󢌅4e #P$oO$N'h`̵3Q01=Ø cK~Odl!9x& @$61n)Wwa2F!'RlG1{O"4BM8ILi8cZsƏU*"LxUձ8Mi~)e:yKFLkuv$f(i$1^Pu+H]t6gmB *|r_`V<=ZlԴښxWDNlv,Lxy Ȁyl ԝ$G~G2HC(xU&dB XyHYM[m@mAE0V24l؟EiB]^0@ĤPqԅRȖjD Κ \Lr8UoņftBbHnM0a\Nq `S 9u_reQo=eJ4s|2bq Ԟ0p KZ -0әDvڷ˸0DTu]@-C0p;^2$B1d L*ÐUL υ^܍E$2 >Q")){D ؑPh ,Tȟ[ ЅQԖœ\M )V\Te@%_Tk^^@iTUx\yЪܰ_EJ8"ñT`d$dR|w0U%f% { {-&`|BZ(^d> @HñY7yΘh$Dս)\E A4D3y]aq薕M-.FB[;3K_\:yqs9ƀԤyZI]IPuV1R!Yӕ>)VS.JOweEy ݤMm5aOKB]A߬WEES{T6Zœ|@鉣qe߬\RRyK"mh惵ݻ~ C ! 2D cg7v#<|:& #8aPċ\Ȉ@F})k [dplBEietYie-jZjV9Ȏ0FkAhܟE(]$M0Uşq1$%\A?)NO$@9X m;qxge F F \LSL!>*5FC=Za f6f[&(] 9 c*fKG m=h&h& 4a䁈]5\ED | hH8v` )g|闞NDrhR"ol=T5FXЛ ̟e@I}^MC;U']aG[`9Nu4ܜb|Ԙ DE\}ڐh$1ZYtgw5FV$ܞN}U5iu Y,|fFjLk5`vF%Z\˭ekmک Gl#8y I8@p2.4. UoPdHHK(D5(]q mpi%>Ոhtebzum:)#8B}R )ޖdh'r̒NSOďtdi:4\ζaHG [' 1DB 15qj1cB&lAA8 &Oop\mIdplDls tF 4U "ϺIl2$Et]ȓה2Z5mqFf[@p+3 怰#cj;(n"]g*ݏMFA3jr '!.|W]" 7FR y݂3mO^cl Ai4LhID0Cp@ynVDPD'ŝ-Yԭ) =5^&$RJYlJ͙(ܔ*ypbM q>`L+KeQki lҒʎ뜙"M0TK-P uVpF+ۭár 2pZo<(4LhwlkKWه,d҇|s51 pϵ#1@{\@K>nlĴlC"h6^qp-ODAEXlKUףŰo gѐ|(DFP椛!HP)o^"QςyޑDɺ'*`私\rUFYK[1:_9$mI/rK7osӅ5LlYP: ]CI~e+9`}+,Ue39ÇeZ&u>C`a4YI $HFBK΋Cv=8lD,MDADpnSRzװp΄ْ٧zQ"F:m{i։NnPOىe-r45]iɩSjE]P xJ)b㐨FUA%%h?:oYU}k!x̸srppKf,hXOH;#-O #Y, La=@i,%Rի$}Q>ذ"llCfD4lUZ JyަAqY[!8sVyT:7-' (I#rQ{aE26YW~rc/2m7S5tD4Z>YvO(-{(Y((a'5(=*+ + lLDv4pG)DP3R)mHHE(/ oL]9%C v"vpGom\b&E:z{o'^~j2} Tg +p|p*8xBK8(2Hk-53ȪK9ҍ82밷lD H +'PBG 5b%4؇dQ&Hbr!Q#\!R L2alR,R7P@SD8`Zr-,Zα+<LnF.zID> ᛋPJT48dB;P*Ts4b "*:j+8(6UJ5ȬO9^RTlmW[j!3kj3nWpбvZ*q݈7\Kы̅Բ0em=";OA_sÊֱ E\ͫN.m' 8Vj%!A&fPѤ<gM&擠yfe:hV&6zy'4l!k,U5ECkX,F殊ZbYTԼ/6 bG P*o3ObM-{6K]6 $8Ns t Pv+hڛO 额6p+hØy+a7[qqn{pT V41]O7P8ɤoP$xZ4--J[B`xgb=PIO2'`x 4ab 'MI5"䶓QCr3M.˨E,&ӟjg+r]F%+;St8%NMUf^Us.R+"N}¨ؚqy L3EOWM܈Nxu{Ze`a Ŋ8DJ?Ƣ8D/r>VX=B2 aJ^k [X %8bɎ|3Mi̙x͛eSTF$r0963uf9#& es(6qL!%aP}hIpM45ļa`!Voe.NQ/5 ah;`H"u}(UH'.$U1wx6Ou+"oAF\( >?pay[-"v"&L2I'̴60bB2:ؽhˊMQKcy'y2"@ym1`:/&[K$+PmdJ8 g ,6P͸ b D*ih;Z'V<Ѱ7Ql4ܘP$˪&ri(H4I b "A ~g@ԸԮ凴pX*, *DIRl?.x'ROꭼ|ãj0t.jݺFAY9O8"Dˍɤ \C< U[VNVC񈤢+N&昈*P EzpM~ƌR=E >GŜ0#Vlnb" eg/%i~i@ilIio%]'&HHh@$!(@r`@A-EQ ͼe,F@$ҲwE8 8k "gRϔh%`< / 2{nܮ&قSqய45@-J/'L"8O@H\cL1t%PaX@ `F@Oj0cn(h_#/lܜk(1Έ1-&(%6 H: s=K#AVI0㤩䆁 NBV$btqOƂt2.B(^16ll4e6O1M8xg,p3X$d#4 }mT )Vc\N2ڐU0 rlj֤B;aGӇD NDO*Bk1{i:J3gPQ-n;I2.UBt: `d͇~tb#$M"%\$hI*iH')g\"(zF(Iz+MvdHNsH!Odң-XULgb,`jRD@!?wP`0&w$Td6.Y.*8F$rZ *4&G8,L弔ӆrȍ3`t5Јq5B#_u&ѩq{D vڈ*JhKK43F HɵPiduqH/HL;IRg(45 41Jo5b?i,3eB&..0{*EQjH_:*nG-GX83nEQ=0Ÿu:ԣdBFc6ąT3g]}4֒: UږΣ^ñ)5FWKE:DI DeUQ+lrDTT7j/hE6jT4PwFA8e@!lGiG4+'ywwGx%z{zyW7|,g&>1/gl MHs4_?'M`(0 A7!"E&Fb$`.ܑP\^$f4Oan &0͍ o9]g)* vlVw ?6`` ϒ v@+8W`O^"!g+ERE5gBR|$l-;3FLuF7y]b)8˖z%7p)8 LyG$!   @ @ p ns85ؐ7-P\XGPz0C}9&bx@ vWEac쪂}nXYE 6GGRb5Xkiu?.r X햨MDhj/*C!I1֪Z,0Df\΢rCl ZOuMQ&xR&kzM2{9GxWj< t&z#bǤAJ6@%u,TؗڗǭદXE|`M򎚏'VjaVĨbxoC?z'2th-=Gٴ*uY]wt S4$q_.mZ6@J/N Bî L RwcoL0/7b8HGL.^BJdq{EhĶ$g)}3|Æ*a 5Oy!e!E.b쾢ŐH9ii8l2:o<O̺ ,VaԲo(GO@> ^IB l59Eo/ٓQYjLp"sX:WZ"2Jw:T-xIZ!E {-b+QXGej$G%Ƭdɬ ƌQ\gis͐f)"̃B|N>Q6Kݸ[u b0@086 S|0G"8}y,l~A l"eX5H {_gIv/#{%:-o^E2FDRi3 'r1-y" !!HtBح8[0m150rKޮF+=~OBA:3l 42N$&>1{[G&L`d?SەB8P/% @..b(F½v.B&l0K~UC_'#hT=RY֔mZ:[`{_CcGExLC `y8rXx="@өc!WJiZ,~ztjS׮\|iC]2'lU}IS.GKW!~%h&}&P<ʩ<&u(L.1 vğf)X4[AQ4ȑE8 ]&Gq7pX0W$׾ Ϭc1p]MkgC휁u oE1!I;8=#b>z^} 4 z lp_ċ cz"lQ>$AFʇ4Yfl!HrЖ6t(!Q#.dQ),6$Ē)^&ʃa"$x&W *t 6BH+f=(qI0RFbZvx51@f1eQX͓;slYad|"H.:96,W *ͤeX&&M2qyI̊ pèUJTjIio"@[vEFJWYY5AB)`_ z}TQԉONQ_R1y`Z4RAG[P}Nt/Q[W_&EEޥ蠎C5c_``RahaYxg{QauecQXP*YPGBQ@祂%9&_4Nӏdq\S:xa}&QK'9cuC%I>XfFd&FQ6͔]z*F8D (1hX$ dr2kkj2d@Lk+:lkf1Z, pB&$n`28fjW(?PAU@1wށGΫP|5_.3*}@bʡY=/B P%Y/vgJg\_Ud^'PuZVC0y&4R;4R4ECP",2GcUqKw$I1P祦?(-a'gCٲPS5EMa{v]U>Y:6Fd܁ 3T*xa jN~fD*99btAZ\#2 &lYfkv( ~>ٮi09rj" 墱MaK,`CSў܏4B AO|2$ɯ eg>R[_H0Sᙋ|d!\X6cjы"'pJˉƵ>PGT,@>PF YcXY9x-JPx¢)%qa҄p(B1! =sd@ݯL4"M<ؼءM %OQXt2 %TM_hFS6 B el! 0 4Xp4'%яzC? @Ge0Hh'0v0@ ,'`Nڡ: vfs=|s? Ѐ t-AP00#:ܐW9{/EL,b%DO !ՐWjVfJ:Ve4;ޝ6I/#L Dpg7Pz{0iL$o1$l2g}F3͂,4"a XU̩uoU@̺i|_ v-a*vmc "{'`"?>ÄT/1tP>%j9Ym2x] c oPVDHiEk•e&-e,ʐBALl!o]r=7#HQsI BvRUޔae J(Lrv߈$e.ٯRFA2*%?h_=AaDx/[CaX&Mbx)v9b*qecC汍ac$@N#?Y?r|e&[U2P}HG[ c3j:,C=ňu/ mJv.I+fmfWygZ׺`&UB  'ZX Рh"ALmJ73"$\d/0<{gnm( j P׷ս'GϾkK2kG҆vZmoch۶-ns\Twэ$w'[( ڍwwߍnuw-6xo~G{!W+Đxl  }f kԥ|rUiX"֭i(,'9nDsH6LUUMkhPA/٥嫩*H3󺂐&J4ybVnVؗZvVF(s`aBڻx z<>xͭ̈hԢQx'_cd5o>'=?w5~/J5:iq?8$˭q B*C"Edtǫt48LjJTr裼%oK<:1%Q_+ b`x_KU {{Ee`9U Uvc0k.lH_%QdlQ'i95#A'z'8W@(xm#!"H8w&H)Hc`'Xv%3xlP59 "5fcEk3@Qx!u:o@ 4wu/l28 RV{[CR)s@1 36h-IlB2A CE)bG%r"y_c(56P,y6V!+wH-E_fKׄ87Mvv!iCc'%H8aB" 3GrFBQ'hy+x,-q2dWy$pD9Y)mzE{]33>33K lOl1v%5T&:w6:ghʗiy;(sIQã Š*< ıi#E.сEbuFG4D%'q6&/#%+Y@~3z4oG9 Ca8dp ɠj*zdGz h2j4#G%,3D"2lE{qA2k"AˀE:.0gJAJJT}DҧǤsE\utˠ +ib`f(fs"u1fO3X{*24"(fc:už$qBG} F:Y1HU;ٟ2ѨF7VJʩ꩗ 262&VC.FOrz9H(>:C U|RS9S(՜ dh#hR*ui±%SpVjr7D%$22r(;dt"̰Fs(#G_ :1Ü ' #5aDz2dp΋+㇌rU"^Jb[ aRHwak2UK4ޱ ?/W/ y<YEk{˦z^{>f a2fjljV2*dV:ajx& +0stWµ9hʐ `he;\H+ȕ-TqT2KKGusy{wB]8&t'ut#R7`\f;!B0 96qbb& ,$%wj]U l mR^sBcfvU6*@<5c EznKEFiɃT$2 q7*W%-5qK@( 77}ѐv®^"E48Y!|ėƇJ?͹,1i3 a,;\I ڲSpPJͣH6 Jf=""{8*3aTSz] M'Bں'Ta7mvSׁY\RuCQZ'p1F 71C9;ƻi1#-eģ$= A`Gv}:BB8{!ҭ Kka܏BU LDBH6c$6A '%&MK`^ ׵y5}%GTfB™`yʲ|aII<V˶ 7̤G:0#K¼iĜ ƌCKEM"yM{f1g{L8U $V39[&w{,қUƍݑ;LoӯiG )}l;&MG3¼arsAJОqz)ƭǻ^-'Y T~kES4+#aŌ(z%dRS^BHR5jsv4|FZ3RGէ2%SB shh 4}S VP.֚Gft{m֘3Xs$%d3Yŀ"t&WUC"{M0_3}{=ʯ(B}EGK,v娽f8@sf<22M8>'MUEYB)BkTy9S]a&i+\+t7c[10XSkW}l' 8—Z.1:Ѡg"ո!sc\tat0.nR˼[ hi``]PL T0tӑN,Zr~.1i?J߀-^w)4%yB6 &V4vu?zr3j{4ֆm4"/zt"fdI"psӫDlQ!0_qv:({e.NwJKhI4,L_E~͒2Q%QM!Ltac oDϾ? ňFo_z髷Z pB}(p-Fap  Æ >PD "dF93sJ7[O̲eڧ&M PV3}Ԕ_3 jٰdϞ%)[8m8#W_עK,OLZJٖ@-$CL1` @s`cMp`hF!d˅w0[OgBUMzOp-wJ`бܭ|[u%mwnj?eF7iaX6mˆ AZl/;}r =V vm TKQB` =HP\ h̠l& H  AŽ# xZڇDz6d#M"M-"b|/y "<%B i(K-Q(y<@[/94*M # 4I}"k1,"&dDK/,GCuTG?=QLSTCJTLCh2{lTB"4ht5ߤ5(:TK*jZ<ϻ˜@s9:5S 댷VlǙN_s|_H-ͻe`Eֽϡu擷Q\wP\}s6BmwU4vm(80WceRۗړ#9ͷZA:b |شm~X?;kk{Nlyg 6p{61*P+5&IcRAEKѼ{սL,/NU/e7+I#5Ҩl8ӌ3k۠|=ͳa55/NOUYnvzO{nAlf%bg3NIw[3M\;&/E>Z4 -_ŏUhN(ke5Ml7v!fYɺU3,b:m"{wN6bA'kΒ,$D,գk ID%)߻ x0WUR(5! JC'nQ<C*shݰ/^S'W10c([DWz ڞ՞ߕXdoy5H`'#gdlݰ@i*0yI;%^L|C't4vǥb)u(ӜyHI!hc ,!zG2d<$HK,y+bdȦ>uh#zsX 5%iO0-DzP)BA;7Qdž=-qOQJUf()B.iUE)3ft0Jj%ыnTFK:ZyT)$44 cl*02DI+M^r?A |Іz6t<='&jQ{VpyY x3aH,h`*!н})hU4ąLj&x ӟ0aj?ѷ>D6IOBU5$o$Y1G[*>ukjtfJz¨nifdÇOS1ZDA 7ЄjfWnw]v - AL(q z2#y<cXfGeŚ5>XV454j/ImK <[sܦw4=[T5hx,rRXhZZXFb3ك󓢱1lI9:QhNaĚc ap^rۯ7[%KG:4'ꌒ `LߋҜ7Y *1C2q#[Eh1B4/dT&M`&솆tsߑòFG{^~zGJ룠  j׬\?#/Frb筶#h츢λ)2w~Gi$ڄEEG %lYj)dQۺ;gpcHhǟHzwA)0m7fm.{_R*]IcSPYLdR+hA,T֫w2,[*VnL SymG*J|<*TA[We˄&ހ43CfVcZAc"Ʋo#WY3DQX%_'Uol.c,x$w'qZ-lWe xvL@UL9G>I#4axJ8MʩpşK>g䢇A(1xaʃ/20) ౞pM(7ibļP*9,+6aU7 Qɻb1?4 }[i s;Xi:rElVu[{VgJA_4Y>b;c" CY^U$$a`&7F.T& * 1W=oi{2Y“-)(Vۺ}x?ξ Rĕu>Մ@8ق799MTٝNL PHƀLO X Ǽ/b!0+2' *%d!Cyiad=B4]lؾ3S&&Mr j5G ai&Т4H.2 610t,HiJP|Kq6T6+G׋e1X%WՇ# FtZp-Q1 >LGkԞϧ 19MTC$DzL^0ET_AX^}dk-[ܐH0\տL$-3bKEe EPȄ-ȁ7Q#\՝-{ҽF]o#e'ē6Aߊ)>\5 WM60U+S[Be!w xa*z#nfofn~a1ЪC\t7Qm6}U3@-v& -\Y$*<([,5n]~%G`.V9!_:7 S魾8}9UlT,EJI P>IhTiT؂1п]L UQ1M gl:NJ/ +n=2r#$~Ơ¬Yv*$+C;a_@2 (1&0a7UZ+7 e a2l;nQ+ 3\sRK`Q0;/ÒDBɻA_EUAB D4QZ ɹќ2̰,|B7)T&m.@ h׌2S#S "|> ԋBf.I(ij0UBVl.lV'Ga.u}YT'*ZFeП1[CV+j!e0YZ5$}V9£]`2x7^.SI:1>H1KiWQY9N;V 1ˍKaN!Vd+.lk,ZQt$m,Zr .'$<7kA^T &iap uX/e Knvd }氃gkՆ>bsH&wSij]q{qqYc;:̫b=qpZ(b-#0wu"+¢3)2| u.LL4ȸUlX-Vll*w{Xfp .SNsAgӬ QGߛy*H=Ȭ= |L=sRv]KWڊ.'z.X ?} `ґZJ%6fc%3<0a6 &!1' dg+=K+<&kƣA+/S(ʜob)|g)-Z'4p)4)1.JM83^MM[}Z,=})۷O`hAC02}+6ph3X E ;BGrƊ7nirFm1ʆB *Qd†+YD)1M@&TRAɁfTRdW1іZj514F!ݺvͫw/߼rC) ,M4G.4Aִ ǚ޷KF4fD3gAbѥQA^iH)ԟEeSQЃfO=OJgqUWw[MtTPGEцhαiC@=WP iІE&6EL"XUV*☔MPM)[X͘YjŖ[F& 1s xu'~ hyyh&ʤ1IaʀRLh)d&F#XL TdA^ɹjeP:t[BT&S9^Lm2 VCsIƘA)۱2ԜCUZW 2UF:#:Γj`-qR a9ыi# oX{6|&-&$ ӄ&S۸j* Z$ژPR{̕]côV%e￴@-h;S0 %Wt2]1Ĕkɀ(4h2,p%Zl`hB4``q1\O+]+E[`)=LY݋DI݉ɧYSS :I#=aG|.ث ETM!UN%URp I!NMqN (EA(h&dcJӼh}""UTPl\R εPgqa$Eͩ*َ? ЬlV1Og ŬAʼnDGR$ =PQ41d@ Q7R5RZ4 }dFh#ՔmLJ< T q]]U|ɧՐ pAH3I! K ]_qFd0x$uʽÁ1 >V́E`h\h{iGGTT μVX@S@V-,,FM͉YEyTOX>q\AE \`S[[<@FLPͧ=Ub2atWUˁNs&*HP=1=WHXw *%D}8"ȃ%ΥrUa+uZG:ʽEH5)r&4CYfhjh)efc6rc#eP iA "`զv=2 ,{ѝ^~!hJ!DL큑ޞQUfjOJ ZVP%#jB&l XdDXf(DFsH#]ƓUlFϙh)C0]϶vϊii fxAeA+v&tNd+񽧧pkdHRf\$-X2h*nI]&\EF$Gj:U=LRŪ* T͡fjQ`aQ w&Z衡|~у  U1yjN`d2\բy%m<+)UyHl0fGWf$ U!tpކȤR(+$1L6FN3‹I1 ,f z#fn.zhRiLBe9^d{a)P}^=np,sDj6쭟}rABv8ٝoxZvkl2,I]"J \^ MRoQ%-ўQ^*Lhͫ0f%S) t<͹-y;yR:!lSm,cMK\aq |X"`XZaĐhJԞcq攮SJEMq.?n名ML2 'dwaI_*-M#v ێk*o=hh*..%l`ik ""+# L-r0"\Hr#S2"&w$r'"`hJ)7Χhd,׾_%Bk'Lj [ U~ "-"wi}Iȹ-0mF ̓`VШIfe={k暳'1[#s3#EP$2&W:parkߢq(ECEpJ2}pbL4!>*?KxU|($Zvdaq >8!L~gb1}5pl-б=|OXŰ\Z#nHY '(ZEZI^chň_Ltt[j9JĹayѠ9PMd ՞d-J̄NtVDɺ-HA "\03Va1I0LNǤe%M4}k%(0& T! #DFWf2!ƒ*F!ӢH+=*bǐ1eU3'z}2*3kɅ,qÝ9MPFK'&5iҐ%jbŇb cȐ% IY!,a>4h՘Q&f(ea(q&-@2q"&ᚖ;qщs6sr$xufu~}J+[*qjڠf6I=#Қ,+**̰X?+#J!{ANr&+((RJ@^No{%eFČ/C] x2</NJg~B:%e(3P^{JM!H{٭E OH; otJPju@TQ%6 _`6M*ÓPkR*eͬŸ8E(4A 4T \悓E7 os9ps,9z~|hFь3@K:ҙ)FkҘ6iDҟtE=iR;Ψ>eQנγCXրf5 kEW6Hf;{Wl1!Jn HቼC[j' 6)ôKREcB4Js{Q>hxo﷿Ggoh+iGg '8p %޷|cNsϜ6_~9rH8ϓgx+#|Yɫ^rS<$s,Εns3M'y }q_z>;Y'%R)tߐSrnOnt8̈/5~_֮|aqP$!yFh(VPk/ &b=}{?SD#o29l/by\/ep1c/cO#,D9kď8~/X2"z/z"O$P!O5)00w/#0o/ 0s^P?pOk2Ꮛ 0.p؏oO.'0X 1240c1g 5Osr!>p uph{OA Mp`puPo o c02Q( 4 PE Xl/K[, pDdCDL^^DTcbH\OoȡҌ oP*BA6QQ6hp&o q͜QO%XoQ1'qב r 2!+pK%Pt/ !%!12b1#;7R""1oo$C2$$_%Y%qO%?Q /2%;!w1ߺ1&r0X q)R1 Q Rg"###R'q"F#1,Q$A7!2-&c)q d.R8 &aC F1 &  +-$i/!IǚKGnfʟIn`34A -Mo1O)r8r(&17:o͜0$/* sspq.%$23R3>$ )&SK")1mLPR1y!i?{Py%qC5r#s:$,! Ӱ D4 o8{Ώ/(/~37E$!>sQ`0&*lLfH͝2݈k#-r t2mP:1/D/IqR2).?4 )E+YRTR3CsSeCU0ғH@- C-RY2U1I2FxTUro>'CCsQ*gD3D;u1D C sW#YmCGXTr?A./1'c^U^1XFVS1%]t8HV :qLe-F2#@ @sQL$P$IZj$5!\sx@jr@6eE V&aT'kg!vkn_(Ukll߮lklmݖkCnvm6nvom7nvk pdoVC~qUFRfparOqۖqwT$mm6p?ttsVo6kpUqFqWwpVvVmiXvgr_t?tstw.jڪv#wkGfs_M@ M0lBb^jɭ]ʺ܅`$rD#L+ v@~7~a W ~ x887W`WXGMXSx~a`X᷅A @Xa7h~}~[7w6+X_Wx9q8XoX[@(x[Øa׸xc xa8+xxk8فo׏Xk~ x&YxE8=8')}9x!X87K~QXىSم48Yq؎98HMtQbyRKc˔jfY<"YFX,{"h lQV@Wv% , vp`_zԶ Z ZS &ڠ9M Yz5ZIYIᬟWzI:a_:>Zc_o:kG=ڦQy[Uzz[ڤ{Y}Z]ך}ZmWۺzS_::ڭzڬz՚Z [@kc LKڥG[WѠeh$GS~x$䢉D)$(r~67EM-ךsMdtź[ۻ[˛ۼ۸ћջ[[՛۾;{Wn@|`Lg60<5ceVde=\)yAE\ 56Yi~ 6},>}>ٝy->~m1^V8O1e~?>a#]=>}=~~q䙾^Q^C^y^~޻=>ۋɾM>e>^>3=齛6 ^*< ;jhdf-2.9/docs/hdfview/UsersGuide/images/module_select_tableview.gif0000755000175000017500000005034612050301073026450 0ustar sylvestresylvestreGIF89am3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,m H*\ȰÇ#JHŋ3j|LY=hAq_Ǐ!G< Je&=I&˔5ct&ϕ2qIs̗: &ӢN" 5ШJ^ڔkUS֮`fź5ٯI ھa֭W]s xo_zX߼3ʅ?1͍%[2ϥIO6jգ]͙vh̷O~-6nԼm[ 8L~\y̟7׫c߮;KkBo {/L2#r,2. "\3'߬sL<3l(bʎѰc -[=*/?jwhފ}xWo2O;2[/=">U>T2 | _䃱-D=XxwL($~{;n;?C|Oo}3K}=S5S ] L̎=O/(]!X"5EB qph]AeeKYd[ ZK` M:pja _+! aXBް= hB4"s.Et"e(E&F1Sau3Kqı& DB0Lq]t+/ZPWdX.gAOS` YC~DbdݕjE0$Y%I"#7yId)=HKL(5)KXҕ4-9Xr-Aȁ_7jQ]ƂCea`irv̠l4 r!u ì:v<&Xs좗ziRjbOjW=;Ot\B)P*4%(@ OO%mE'шsDAZс~"=)E5:R+(L;J,O[ GIjRůgp  >z#R88ǯvAb;.bpƉι\"Gk)Yb5+ֺU0j-eVu|]Zɴ~\Ϛ׺ ZJױubRְMle3 ?˯2xY89E44\?uHFi0~o %8lC.q;:׸=ns\Rt+Fݮx^bw=y^8eESi!fԕt%QA.KK%hJ0' 3 {i1\ҎvѦҕ8 ĞJ@>N0yVy|4g5q,"CN%;Pf<(SV֕p3,fP\N]ac ^׫_uuVu}3uHxqqS>RҦ̮[Muw6 ZY%ÂMaF R}C5Kbgq⚵]f0C=fPZJ? 'ژ'{4r;qv'9}N:Ү1fsF oCvMntڡNw-op;ǁ׳0l%kvdx <.[f>0omW㞵2cնX^؊Cܮϳ-ro\ח39;qۮ<-aK_\.9 csa.w^3lK(x tzi@]Ƶh~ jXq5xl|3!rmyNq}6vn{rO{Ox7|L`XRZL bdЄ2!zb~ Kһ; b>P}s=a?zs>}[yߛUoc_~?~sO7?ӟӟۿ~{|G {y!,`TN\B'ZhSeA}ZYGf,h).8[)S"/S5G8E,e:47#9u+؃K؃M-OxH6ȄD)]A]h_QSMUbh#Xbi HɲOtDl33)PlX?1)&o<g8f!]TA]yg UuԡƉq!C(_HnȊ芝(86]bf!ȕA\JOpˡo,.gh1qu0#qi#sl|(sveȋOd-f^Վ(t7TSǎHtHwgpkVA qvf`V'\vOh`%|8$h-AUVb&cѦL/+דE’?)i1+3;)=3Y^ufKtkqT@ bag\ 4_6w.iv02$dqvo7Ǖg6-lwSy+rho 75*G`$ɕaw x teky6)]g Fnu0 Hiai[I`Ǝ[64yvik)Wo\IH`IU t1JYk'#phibwYnf&)ɩL%̩I]8itv9`3kX)iiМ kbkuQp $q~yMdxVP92yIʴ:Xڝ)^"!9Vy$a-G2iB ȓ'v$CVKitבƜ,3=FatnCeVaEMZdS7ä"I jQZCʤ]?64c6V9DVrl5H;0E[p_'*Ou I#CqHjRz2/gA6eZwBM6nJemf}!JleĐ,ɐh-J,Ē@)dty\iC78 êr>f2LG^:;We9;g2-SvYtZJFΈgJtڊt-yyepY[HXH?) L;8 a@Mp/00)QE)p90)c,10cIjĉ9)i؇iy9?;t%H]wh"J!gCFuɌe@ ^$[GZ)\62 qR rF es*p`50Fٔ@@7ֲ4uP˂̵[l&61cyc4\,xbGnL kWk 7ƬN) kLtBtet64V!vm7 5 )`/[L9@:@Be#@ ) GT,;ۺ^Xg^t|6/2yZQ^B"CkLBiCOQfFQ7Fv ujh& 'lٌˠy[/02\R5~- 6\U0 80 s/ԧS*I"9CVA?U]9P]eD`&itƊGǦdvWej\Sw ǘf!؆Ec,|i>dS2XiP_rؔEidpʰs5(r+l?)̃ -9wDy|28qѬ yv7y\$VOɕ7qykqls!èZy3I[vPl0 ]b \Mj$,n N{*d- kTAԴ ]@|kτBgWaL\+3IRɎ"\K\ %~x94m_5-ugَ=mIԐqr|[Q?ْ:X|AhTT0# +n-U0,N)I5Pf 1::& b>RkPW_iv5mkHZ(eu h?}cI+fNfvzdAꩦAq(HT3/E=@uT=XfpYR29·L gǓci#f`imZ?F?[i-LeCŢn&'H\/ZBxAxT18IՕvFl*0mmTO\*yqs$^gɬ`,C2iu,!윘=8-ƶb%B +Q@M݊\"L2J(K$*l1ϚB(\KA:J &D$gzh?&(j @0%⢨7dD 0r2/1l4*{~J9n2N*Вd%sc(d%J0lI.I)7YL|KE+p*a.%6{I"|4!Q'`b9*?o&΋vF,Q10lL=!XЬѴg-HOM L4CӬ {8N6X*30|0x閪PY?MX75')A#Dp45$L&>rg4oL#l&{6{F[m~nNn;o&p{o/\ln EK n#`#|˃b4Yue\o=ve2vPZwvetovy݅_3e_^x㕟uٟOuב]ߙ}z[>o~z?^ů_vx}{'iVrZJе+&L¤2QNIQXKQdI~B4$Y*J SPYDnFBJ N^>rprYK~h—]%G3^+TAt.T~rKfJ5imT3ډ>Q1V>7x5!8iA Ts܂͜I> qe fb0%,i yɆ"1d+ +Nf1_e&MPҔiQXn8RGQdJH" ;u(RJ+6g&w%s sВTˉ_؂Rj''1~h1BTLQUH)ڨpN{Jff8^. RYYG0dLzjH2Y- f'N:8:BI$T 'f|L(SBQ;AĪM|v](c1 0fq0Y2pd$ qP)B$c p zԮ|yr r)g~CEH#X1+7Kw<5)GY ByI%(٦D!,!F1b: K%U2`&*jh.0Z3@# (<` Lq`1C2K6EA3zҡ8Œ.Cc,>raQX|zɜ<^ hPQjejU NM[@XnNatċiϼ ]!ҖA,8,E *Ā>D,a` w`$d(c}# 'H2e$ g9ɟ0hb,OÈLX)ft@ C' 具e$^aeD1@unS]ʀ82Xv3;r;Eٶ_s@IߴI$A |SF#v=yt!؋A.fj UyѨ;`a>xAaHّ99xio!@ $g[?z ,$|{QpǧcX?8smI5.9K 듶ۇZHp=؃ z.> >aX?m# s٘: *Ҁ0TB9#I7]QDq}0.Sa Y]öd0 Qc$hhL ه11@BCe)=88;140=˄,80E|>g@$e-ۇaS>|hZ83e0B$\= Q=c1JBL |J .*$ /E9P/"0ʫ.-*2r8d; H8BJS9S=|6ƕ.OX=.h"}H:Fc;ðAH08@d+#@x/8P}F؄ghp4ct8h}G?`ӈ`:7a 3= >N#H(s{.Y3Z,P3SS/y *ga-<*E7d B ȸK8C/sCXS&`OeíxZx2FhŨ@i>죳K9)HL8hCz…XÙ 1{%@1XKIXE@?I3Ő|3C«Ld9ʭ2CD zKĤ;At́X\ 44cP 3 ;MPPB ]>mM@ <O e3{;3 >˓Z]b.#hz)ظ^YNHAݿp ΨFRuӽa!UdfPfu.f6htwvhVg~&geeh[ ehY,,A#dB]< Lhiiyi4xIIX1fjiin4jNj!akN>j FfjVj1k&fkHa O oNlbȄu&MHNM ~ahglL Ėang6іgbؖ٦ڶ&6n(͹ҴwҴ :Q j M3&(Yb*ؘ&MPF6o&ovNno>oyvFoo&oo_^'p~fp>pop ' qnv ˳ A:ތ-TY#0VVqFpp>r&ln(7qr~)O%rr)7r0r(or-g,W$r0_sysO";W.gr>sl3r?74_.0B.#)b]"ZI o?pP N/EoTGu+7WswpuS p^Z^']u.urA%b|wK5%`ڴ}DKvC op9ptE&s'r%GsR?suT7w=7o=ow%wrwu'?www=t&owwGoW7wpo7tɪhͤl_ t0QtWpYwbvC?ouwb?_u~/fw[w__wyGnvRzGq>og&PmV^V^gpl_OmĞa {?{sz}scuM8@| v.A'wτ0 05pGLĿ0GtWO 10| urxyd?/uGu:$qE!Ѵ!֓wڏ5 pX-M.ɷsx.oO58wwpoxM8L 6oMj*&e )Âd ,h"E@4q ŽXDAM(EL%̅gV4aJ*Ay'͜rE29P>h޾O-ו^4PIJYJ+h`zԹ`}˵4as&F 83mA #b3!Nlbj2!#LƖ1IĂ(1ʏ1 BғS;i.bʜ15 saTg[CӜ ړ Ɯk4T)РqWdrM\DCLT.S[-8]TuEZU UUREՅn_S&4P c"y1[(J$%9Tp@ؚ& &1QS3Ɔm#icFEf萐& 8 RPqy]`&\hDgw6GE Iew)CF\I\rBWTGMQi*9~\aVW,!&B᪱*UZ8gU$NX]bjB(RQ6&5\l&36#?h"6Xe#h@̌EDдjIq,kAY,p@|j f[pݕ{^B9 TƷ{D_|qS|BЬ`ٵ TӠZiuVlA喯fkv8UZ2*R]rl1d=p 7IPzކi}628Ku\ ޙI"*ǜdD-rvS>Vwʼn&p9mM6g+8RL_Mᇓ}w|$Ш3Lq]Bsg!8WzƊ[6P;5g˨ƵvCQqH[K  WYiG/xk}Mv"WOJhL xX,%!0PB+Y-# LC|hAJB;AC-1\"H[Øud=Po7=w6%!I"1[H7#D+I*ߘ6l`zռo)@řL18OuW C^SF$DF"1Höb`(H(H)HfN)KZJT i QXHn*:J_H8LbA_z7=vr_WL^6yMrĴo6d,NelJc+~B"7b*# hpL2EMX&qJdc,LntX4"(aZM.ձRc|$@ rEC@\©ip!Y!Riw#0gL%SI%s'TL FU?GGh2 ΪX(I&Pv" RJC\Q~@>3)XْztVEuQ:B>Q ~,j٠ }j:f.r(ֶ60 K2@EhyTk zf9F j8'@CdD՟Jd k*{.SR%C?E5V !WrLS%Q-XB[XWD !S(C#B|I%X4}F!%+ܧ('Ճf />KAs!M-ز6@J!/' ş%,֗iC/Wir2UfdRp GѰ #@FB[ +\|Qa u[̬YYґ{eX zΟ3,gUMTQAT0BuI3J§V=$LzׯFuia_Z֕md(Ֆ52kkB4TWz77bPE@22(Ckqz#[qYve$c 7(!Ą"YW\c,zoF>i,JXM|C:QQR#X%W2إw,vn \fgY'>7JW S׶EJ4rЅ/LՃU++6z[ =WC`I⽌eH5GpOw8E>oT­"/ C/9ytINJ?L i(!UYI)Bw2)% R +½Oe* RƯZyD< `XzXઑO+65<>&A+cHy[6gM w0|(b-q7Z䫬ʰdمHmryGވ]* MXuru(J\\^x묜 pY^`Ҡ٭]d$]m[m_Wh\$ޞtRi65[D)-,T H^^mȕ+N IH^Q\^4CՌ UT^_HR!ъ!]LY]#B1b%^>mv`)L&:XO=h!4(B@CAG`#ȩ Y"JJ1W4@Fl cZ$«d` ?~ =~õEY٠ Md f# C)$Qf`C 5UH  eZȪ@\9GkrYc)Eŀ@CWW a2A4,"dB4f@tCRzfTȕ)hmXPWbt.Sb)]! <@&yF 0@ Μ(g剢 G%8؛m(㮝}5:c- YK v"CRކ\W ^NE_Ls C lBp"LHvt-E\1:W0IelHa;0eHL~U4@C-DOd$8._$^4tC/ ܋:;J`c`%] "{%gW"Nab3j&ࣙޤHh[Wwio"ᙣ>M2B 5ܶuE0A=П՟sF/`&ʎlFje@ X@.قXC0h,$FG,(xMx^$4 +M+u%ZϽeC\啔ZQT2h9b%$XnP"%]e4d?BR.Xg>N>QZ4l&m%#dw$4(nE.$@4*@3.1 V$0B2@X_J-2&h>~5`R )%Κʰ,)Ō $^-`*ұT= yMY.+)*%cm6pEz(;<}jbCKq p0hH: WĂ-_$Fy), 0LKFv˜\P(Eo]e!oQ5 *`\>Z@[\(F` kꌅ2ԡ>Cc^ Zf<>V$ F>\ɕ=6lF04F) sVg ʂB=,b<nj!'3\1 _cu: (4(m }b|]*"&ZU:#?'*^ յI&`( ,!T$ժZZlɍmyU̚)k[d1n3/o s 22We ?Foba))'J f{R\[h&(^o놼ྶR]ND6t0ݗUT=Ha |ұzV2Z׾_ҭtw*F`_ +/ާ\ '  %%I)r\g3~[UMHJxY I"z&6-,!z)R`* (n$i|̧y5 ^ʁR׹JVFF?B#jX ۮ[rЯFw֜h'bv1\& ёHSii+jZֺ8kuH2TYUt62EYJږexJ&^bXx6уak< ݡp!&~g7?8GO8W_8go8w8^grNq]-u"Ƶ&_)C(828xx#+9/93?';9_gyoyc9C9WykyIw<jPRL1KÐg݌ MkJʠ:#':GzO:Sz_Kzo:?zk[z: _ Қ|IJ{2w7IeR w aHX^(#CCRƽN& #;͌Sȱ;߳i9GŵO; ;~;;Z;c{ж;K󊻣{3VDWE0L""`h+yp*LmRQd b{ZT< ]|meEn|Uh<|[ħs<ŇSƏȷZt<{̇<ͳ|r]4ϗ| <'}]_7Ia]1\D3,wk҅&>$v8{Ҷp n^ *6s9޷Ͻ0۽o}ۧ7܇ܛH#>b+-o_]-';W~~_)~ :3Cgm*_/֭D Лs4! LH ?ޡ[peX#ܲ;~K#{q>]RrBϛ%7^%t̕ !@S>zK ᾆ.ӷO"E}xh?[O$I]L2aCh,y`- "E?Y:ٱH*u dSOCBYbF5z$(ʤRu4:*V-#Nz*Goǚ$ԘzɈ6݂ݬh5n[n}s^h5D܊ÒoEt*F ƋIRˏ2dB q'p/@hRbDb0<(H-!"eyA˒5F@ u}dEv(Ȅ z@)9qVmVg[`Leu):mEtդ:!{PBte.[`3PgH}F1ɿjm"J)^B- aςܩLE~%PPLZ؇4f &DyVP1}4^K^PB"׆b؊*r5tQۦ+Z 2o\vM8ea 2VQX$ 7ɌAQa !W%rm+ɭDʹ P͆<#MFDUheR_.l|BՇ&]؇EsIDD#TK52~ >*#Ehe&E*#!ŏMh6Kgna^KKۼ&3-zֈF"' ^SWƔdDy ,@8 ٠\f&4Pt"71cxzTFhbcx&3aQ2EmgX\H aS\%4x>4aed a` {Õ@> ipn9-ǩI6T"#ps"QlҞ"(~Өuluo+P|";QӔtb dô?ϥ^Wd'Ab%H =QMQJ Y(5X vqS2"+ē" jx$vf닾L=p/6+A.-" NrMI5t69 j/M=#9(ⷘՓظh;Hq&+ʋE'I%R$puZLدK..& L2f !# E=NVv@:2S#*cȞ3OΊm8$ ^ڌtj67vyDWǡ CiPO$|(JN"Iպ5~s- =}F"tRA.j"#JLELEoXpM%rJzIt=_xBTd衅k v =!\d`-Z#cgi , gmqG& #FlЙMXkp/[\9 nJ ڦbF+qHb+|LZhuek#j#u6]4I_hi''MdRev,y8ʈmn;<ыgTB|E&Q-#i xjm㓒ދ&he&2#x_#4G,qG #ciJO&e8Si 97ЌaJv!uϙJD*اM"HڔA!dN-KnM !: g/.  Čm fM$ THD78„@ 98.#%d$Gp*'/p0@V\\]je %@ 7\ eU Z!8cZUЋm A Y@! %VEV EZY]   e PVqZ 뾨pZPTUQ08Ԑ CU0 u0ypjM0hONLb &! ~@}q1 1Q' 1Q1{Qq1QqQQ1۱QMԋ! #/R2"KAZr4!Hr%a8Q%M>"Sr*2&+BR%=}R')$(2RFr(')q('Yr'Ra"2)')R+'*+u*r(,w)'2,y(*"2(Ò-'"_-Ӳ.*/i.vxB+'"G+b"21&&2/ n2̂"܌2#p5JX3#5+53B6C(24y53L1a553-Sp5?6yTSaD3ts8OC16#8AS;e8S+Nj6s'8v"&G1 -J$.ln3I!XB?$6d. @1h3s86B T"T?tt_0Dq\SEbEtn?>tq>d+&A@ANDԬdq6@:0`.bڦ ?qI p71T eXBkJq %Lse;2 mE\EK A6ze TO C 4PP8tU 1q 0ǔN1O%PI IIpr"HN,-LL43@B-5i'~آ4xBz"(ZT/5L|U^7bWΣX=.R x%0b=>.8(2_.|7'ئZos=]!|VѤWTrTP$Q(EL(,SZWW`{cD@TcK'Q$BՀIiBSŬx` "&Tmh[gaU\띧J^dVP2)eEcѐ"1LVYi iaiik*Cl9# q)9K; c9Nk( CФ1&K%6s9qj]}vmvM1zzc7%8$T KwS;2TRTXseN `[ Ȗ +[9iaAƛ#r8oʋA<*+B/A32=&czeM¥LI&&hhrʥk蟽y0b8Hbg͈:slL&V\qZEG\TW5FW{A[c-6F!mzav=d:~φUl9$8A-Jɓ;Il/{F~qn)Tc ҢLilQKuX/+J'/b>CcsoL s5dj8ڮ&5XjD x6@HG楑Iz!%x3hpS2J >ɋ}$hG*)hAT."Om*. 3Û2)~=4ܴ̈́*SBL sr82¢ ,'XPb9 u' }9 BZ]hd801JAgLS\i=R@+YIrR$#v>zb)>N<+-P\ Z1(L;Q%Kgeiii9 I؂./Kd<~e)1Tۄʰ2׿k Z ч@UR9`^Y0SP5 nmb:JTy\QB| -*J sၜB\YhNme=bl;E\xu2\)D2,`Xja"`A0, DT@ iMb+p/5`zaih?!/ =aݐ=KYqrs@3ķC؅ҕʵ+e1Ņca0.ahNl+x˛`ϸb<\/1k (* 80iPtR}*D!&MIn:!TCWZV+&KBL&ThB dP>6a8ZD7PaP0_iKnLx`[>:쨈FEY#[l:%&r2~-st!j)K\wʨ7Y0rUx$1o"A1lߘvpҕ9FReW*eYLh}ViiA8@1M  PjpR-p? w jpwl7v0Ҧ VpUWppl a ?(a T0w0l yA)'GBx[Rb dg!EEd״9R,R.B;8X<0'I{BC.2E- :J# coM 税K1 F FU`/  @0( pxΖ`5 Va@~xq`^S* _rbcf+n8bq!,ɒk9DRq#kC[t/зP.VND9BaCx,+o)BTc8 EQ/aQ/k{TFhuf;}}!R#gv*\CU\rQ"^BH2*C&ÀjYpjyi3P <3aIY۸j q> Y>n 1А Pa 6a p Ppʁ @CxKxG0 6a6ypK!Qb[$vP҉q?-4"fcBj"6DEoU؇x7ERfp%MTM.M+m2;"X[0ܗPG97$^iNSF#g/ressiH)=,SƘIxy>飍EjC u0CƆP ƛ_>f Bp t4 ImxW6xwWOT!L e-X9PBafF7YgԇMi qzV$WC+a f73DhpPY,TcOuMT- u}!qbFFړ$:rWF5;O1ɳQg94G~"@ â{ 02H&20^? Z =j Z = 0 0PJ0B n @?V H{Z6&6Л9TpYl/Hyq {5yu L䑚*T92e65&Zzmz9PT,r Y.mGȇd|X,MneMi"0"EBH!MBRpIrg=ZRs+70BRʊ Qbn$$X2L-S]ᗤH 5%I ]]텺ĺT+Tpp  y)&a]l|7qJkeʜ 0a)a"˃,84 gډ;Sr>ġ3e)!ROH񹶰|c"NK|H{f;!_(rY1FX[c|W3W&DF{FyXeԫ`hP_j-f0e4Qb)U-2pʳ[ɣb$RRsR۪1&ft  LN02)#5K%@X6]ڥTx\swfKX[ld@\*!1đ[*rkN\0*!Pu9zDdD8XDmQOoSYkH4t.;z8J-(TDj+*eH F!X6tfLg*:4/hzLb~p-r˓<cǂzCW,4-*%Ŀ ʰ[+**[[ѼZ \A2WJ@UZ֡6\lyPUzGӅK_,ߪ56}y}NKm)ixh2QFzs%>=$73O:p}ϴ{B 2dp2l^!~@H꬇zR-"p:(8+린4-Z++/9)d(*l12Iķr-Ƙ ƞ0%B(m5N1+GC 8L52uldp%XӬ4S2kǯ.4Ke4M7K/40a{R3n7R. 7#.QT٧}^uUVYuWo}X͵WnV^uVWyւZ `k]=hYՂEHiu loՖUhlp=[}F\]h ͗z O!o S?]vWwM⇭5xYm@^|cj5_ m7`n >Wgyfo\t/.砣'[wUlkv:]eik!le@ k6m^lNU3C Ao4o7s`y |3'a\3''(#qE7^qc*0FŠ#}%HuUUDwe&ŬUJrFU6)aueL*?c2Q`282L9/f*әW aVϬf4yJg"ӛʬ7ӱӜ(&=Mis^&5q>W]\:RU{V4X~5u+KS;׫5*Kǹ}04l1̂H4*l3i]W-[j2? ijYZemZy{ݏ]լDvKdLk.nKWA(K[. m17[Ѻ5熏U:XWqS*} ;cwPZ*,<`Xfr/AK7ġmmjOVIKleYjmgu2cs2LÚT鮘ҵS]*bRĚr~;`0jTLpe],o}{fBv/\RhҞ5WLgɪZ>ׂofd1uՏ fk-%*C3ڕ a@7S􌴯+,~Uf179`Gk2=fFcQ_خM@9dWA靈;jډrS-a9Mcmﺳخ20^[ŊN嬀5.j*y>wʏ;fӺ,`67j^eI[wԭ3ϝSVA *{f{eK[douk}n6&tA/!,velw.]OaeWr=qg>dm{kڪliikuDx %Mp=aϳH,Y鷹<-ą22 Rl*275/խB^լ/sCͲ6FsB;ꖚ۫RH 3|zd5k-3]3=܎7C JîYT9㾧3һJZx (+E<<@r63)S4ʓOt_.s# 8+|+~˴b;;cwis> >CS4);: Em[q DЪk3@0 T l'#5s=d~;LCH@|pc1`*,_T; +E Gr)S2kUd3 ^pOK8.2Ts\;7=i24OE5:"@a[}M'#R>ŰA"V1ʁ;98j< Iя8p-ʕJ+OL Ar:4A K)׻J#^s?}`+آ892,T, D5IQ9[cׁY=tȁZ:CH3]L0$El[57lU>Fc9n9c?^c6BdB6DEc>dRC>FdJfBcEdCd8Jv8dEFA^cKN.ePd1fڿ!|L>;D|'ȴ˶DtTݳ BdVeffvghijklmno<^B*EEv@[FkMDY *0q}Ho|}~ƕ{}`LgHsS7-2 4IML{&&6~f6̈́>j:mUkRd=CV˭@&6F{5}gI? 3W)4ܨZ}? j&6Fc8ÄIx1h.R ~i̇T8cXPױV6F>j.^7e@\XܺU@(&as S;#l6FVmk6诊;R1- yPjZdP N@҇^>FgXn^8X[J.8,S]ќDSIM.onm넀Soy8m dЂ8@&v y  }0E8h܆E2  0gS؇dwne {.*3J>[Px*Sh'o%߇]z5rWHp8vȁe+)EsЁ}mS؇E `Ё(uNSq!? zm>\>EgA+:&}|tSPmQR}0 _F MMJ'Li[\{v}njyم vs p_svv,dXey ?Umz`P(-Wogf:fvwwOkš@PTr}2893/JOyq'nh($_ve`aZ;8B@[\sx'7y#7Z-a zHrG}we`e&%Gu5m}zn6R^r,` _X'mwp0 9cxq_uMMG|( ɧg0,+Y}.ݻ}-G/@ "Tp`4-79`=h+i$ʔ*Wl%̘2gҬi&Μ:w'РBKX/LzWbʼnnh#E}a Dz`Xjjم j R>C/.l$IGfJiY4hF#BCNTXpkk?Xݞ77>r֧0ܺw7}N.Tb\;HM!ַ?~g  & 2:h!Vf!!r"zh"'FQ%TcA&]TlĵuH &B}VXaUfjq^zI9%UZy%{\&M=\Ie%֓mW%IfCVx1$C\%\uZ|,}'|g$:'}h:JBFz馇v解VZꠡJJ jzjֺ ˫k"K, 챙**kmf7\0cBmVFGVl1nAmnlYZWcVVyřYHL( 0((2@C, Wpk0S 3lq)2229׼3,t; H>|sP4Om4NG}V]_k=uRc]61Oh%Zk>yɜ"/i waBkpbZFQ L@KekO^HUdcyi7&v[#N^zc~껷^冟|DG/8^;%G:zIs?ǯW?/-c  ܈"Ho()oQ4}v9M%+ Wu=ihr  +-r,=jLC"}GS$ 1=:| ڠN1H?؝$QNK CX(E;,I R/0IeKF+u)Ht"890OqBGQ]A&YE<{3{ĥL,*z\dɍd$wIl.c%rK/rv"fw3(0inos66wZ} 4KeD#4o1f̉';YO@"oԧY|]'۹;^ӊ'F 5)rRJU1`%LW,T9թ'/XޠAs7y9HIR5uGA)lݴ%GzEn8XIr"рf$Y;QQ*9)j5DW1yWnfdTW^խY#W?3X$<<Q&s! :Đ4imcU%^OGV4f 3u{paF2.bkWUee'_(l.\IIinvb Ru{x]m`/+IWay\,0%Ch'xU:2@?Ԯĥto4y9wҹH|eoXhĂ:ù[c3Ḛ:Gh{S5r7ɞ2R~򑭌`fYWc*OFc&yP63ٸj^r.ymdR932_U0:@ت]P Adˬ.̑g"QF8M2`PHsoC֮cV9N+qC6s{w:j*K#,vUCuQċFۖ&/`_3f[ǖkqmjN݌}mvfQɄ|: dhyp%4AcѴMF-_D `o!xFb1b2HHF F"D ID:|zB ?;C~Ј;aa@:{5^?kC:Y׻xo_OŮ~;߁_zmr=њd(2,ڢ^ Tj؍d4<@(ÝC@ >C,C "A4 X.< k RHA`!Å A=@ N<<0>4>E-A3 :ϓ  eS5qQ0uO /5YDIEP(xy%ԯ$D e9]FQ#~1H$$-R*+bڠE42QXDl2SdOi "ㅜF`>Xr62Ԟ62E@h04c!9:B>TA B#=xTAZY 9 !Ac>A4B(<GZ[ASZ])uݾ}yQQW1e_`Fj4y]d9H.I2EJYb\&$!XJ$ $XdKZ@\T@T4TH4X&PBí@M>^&af\ NʀC)! `=BI0cA ٜmD$ N!HTf"C&@F=RI@]VR<%}%vAdaA#4`H̚j0B$`4TR=Rř^x51!ЛB myK)-F(p%UilV6cFii]<)y)9lij֐gpXfvDVǞN3) zPh 隘gEG=V lAI*Uhc]o !eC.u)B4 @uA aB >HHߨ\b([`%@F-Á*f0\xB~Ih|iB*Hl\ėpv,RrN=Bԅf4Gyo*~Fܫ s{fidi ,],kBl,vW|l}=DfKWh D+TD(M=@24m4pH=JP C&C4 9HU^@l^#=%=,UE2B %ٜqE8B:!ϠA(€ƣ҃0r#he_ܲ )}btպB\1QK\E2#.01Gnjnǿ ߴ齀OoŮKВl.noߨ.n.0q'/Ė\)Ҭnozy,w\Gt2D5-GHm FD*eXH *ȏI+ͱc U!g RyU^جI@@pR*QWsNTj(YN&. b*ꐜ?Q W͊kz:Gf[(ݞΏۗJ)~k#S~0*F?.,CqDD(GR<> q*Q.L=Ԇ2j CTNY)M.. QGQxΆW"o1}Vu*cUdj AD}uimTgx\ўQIlL.Ty!m[(B/aV .v! c(DF G̦NT>0ZLӕ&Iӝ.XݚpbjkIM ?uTY[Ci]Y)SI⽎7-i?٘*SNFEyNӍYS(0MORGY4S30RِPQ5ER3D-ɅqĸԾܤJSDE3QE]T3u\ FWM'\܏c9H ݓPz]`˝I ck6rRΦ7^CfgLZsQEh$ik'a6jϤ`gvNv_ɲldm6o[nSixb](EL q?G7t0ꗤA7;*Uj(U0HF(UDtޖCe%rh1\6u$qvj7rڡm!)pw։MFF2;I77 R_Sj1 xMQ}99 6іX(1t8\5ZuDsկJ3etŎziP]B1ű3l4 &N8bJtQ8mvfl\ߤ2agRzx]. cW`HWKfsy}cxVw[yj9p$)9E u8L¸GX'(#$=N2N/G1PUE m$L@ '&`L(z1@ (ܺ&,Lz̺K 1$;ë{:W D# W;+2:g2@{C{O{[{{3;;;{({{;c;{;|{/.1/hAXKD)DЦTiO#??~4m?I?7{?@(0z,8!} -da -64p`Ɔ9*82G =ҋ GQL1!BkY"KJ[fS_ h>xPLA@թ3>t)tժC{Riaֱ*z-ū,~:izi XX^VUlw&PzS: ,һl-z5)8-PeO>oCM;.lvUzeI:kXUmrϳswv<::ߡ{?5z9p0=~,=~Gg+<@Ec4N;/;"s;:䬢J+ʲ7`ZKC2qebPP :H.ri}n }bI>84qNȻܲ+*QF#;0IͩRH#R,@ l4,{h伋ή\h(.zr "2*˖̬R.Z)J\:qP3 ZJK-,Ȃ%HH|O ZRЕ0-JO2 K #R JKruSHUIoU)wIW/"1#RN#Mtk0CTK.n%6zS1,A)L躬ˑ"Rvı5*a"Q \x QF]8N}j W=ۭe!TZX#v44s2]Y`r1ϕ;՗&3g:ags$Zb*.>Tk5>l ]4e]e|Wl ]h%7\]ą w6r%yq1K Z`?'iE.t)Z I;˒UܒuxDk;rBol=냸ߺ$*u9_o53pyw7ߺ۷5;1H^1mf>/5$_DK׷I/|1z_yZA<Ǯ,UHz]0|32):ȶfq~jZUqi16ڤx/rWԯ.x@RJCYF棅L6! V΢J=-XIj)ۖƨq WkXtuFtmK{Vuųrt KgF5nc\FطFTѱk"hcP_I"r,zӟpwYl:uE>)lH? $fI54U6/\d B٩91]ںF0XA$U^GH>ۥ-ʺ?+ JĒ1E,8 /* Dvno9=S&ud,.tGU&f1C)fVӞ*ۂ:4l}Rj\Y9.tQKrP`4D鱷VtZҖJW-4P C\J*[H}P/р3"tR}k_gԻ̐d5k }-ݞ6M񆶪R$UtVCtʲ5Z)erBSD*E-hXΗ f UV o@h5&5"*-ĥ7DtwnұSj}!l,!cRCQIj)'}Fŗd֗84TBfy)Ⱦ?.GfC݅O,b贽yye8fMkbmS1VqSa^_JF)ʹصCɌ^LLDDdp`E'Zr&hGXb63M^ӳww!^ ]2IRPbsF:J*w9/͝tv2+*#xA(BǦ/#({@ahmkO.d|5isb/^Y2~ұóF.\ԻS"<}uVP+AⅵnySS̽B.q-oY^qHb]*&w,s.m3JMg"IavT|$kEQ-RG_n;j hcC٩l Sh{w YXP,=#)#u2Zun`eRr\>_zwd*viT=lט[)V#xf;Ꞃ-泯ˣ7ZSIreoSʷ#Uy&zz.zHev0v1zո `UA_]vs+ uBˎ^^X@0@ ^!"N&N بD&D6+JNDhTZ,jXRnNʇr jT.B& c%2̪dKhĤmṆ ,|dz8tf,K2Bi0 °C- fŔ".z(WQ{zb +_Яr@a^dNO$& NNw@,.X-A6A^QBA4a5ḊkyfomBeQ1oQmkQaQijgQ]_Q1qEamnigCAQ Qq1Q!s!12 2! Q""$g7Q#9RqqG']&1'U$qQ{r&u]2 m(mou2"qOoqr$}IF#Ƣ 1L"B!6 \" 6a%!al kMU%!eJ.tD~VBUƃ|uʬGR"XB0X|GzVզ6QuiMRBU8D^XIJMUFONЋD850 9#Z3C| BzT|"!xJ5[=o;gt 8 -Ixj02˓,:H>)SU@E&GH V& =,zNLatLCN(~a(P!Atlά^IR|h'І뒴B‹(T6ZFfCP 4dv,KNƶPPAT& -p%K Pqe7nIJfԝZ.y*v򯵌ĚK}4mBRM,RI-_˄N^ ̾3ZTH1.pC x ʾ$$sʩN~/ne\QNMԶ{bImf(DkT2+lt$R6 fefŭ(-n4`PKKe$ǀ gqkM;뵮I2 5,O^9{!` 3"T &F`h,lLg @gy:1:q C^QH[4 6SJpʆ<kf L]B+ܰ e,rHL6O2d 'dJ5 !%0 a*Nɠ/R𭙄3@u"x6Mf0 >u`쇖-Bfak.[oƔg geR!$TmszbdbtFv`,1⃎Hk>j-*vPs3WǠR~6$GDwaG mdZC3oTNK5?5 1ڞ|Ju6 8`fHqp`24IuƝtrOfHƗP f8zLG(6ʉpr' @!!S`tPBJngV T0FxlS.b1GB6b,咄5Pxu Ψ^ytYиx֧qg:Xxr,jW-j_WG6*9gvdHoar7*^V%zT+F.spJѣNE't` l&ʐ45uhz*Av ։qN!3mJno*Ȏ=ymFmkrjJ\mE`xZEE3(?{4 S.X$k5z}ylz*nHH$lV0TklpmV^&pOZQz,!sŷ4ᏸԹ4GOJsK!@Qu򒰨戌2mMDZWu:Mz|L$u oXPʚطlEp ~,KDk%Ny*lv8QKP+oz^nQuBvQ,j[%/-@`2a(̯ZM_Rd\Rcۄ9Qؘf rJ FmpduySͥ[|Xo\3IM3fpɠK{j[&HtNHMzypF#"b`|`ϗ _ṱK&<>a}ԝit,68[q}Q^yMR uJ85q̇=zs . sUzMϴ ˧Tw:iFoti %d  fOx`6Y5(DikNIwwvg6ho>H6 /age =*viň?e>BGHDٜoԕpd1K^/ĄMgXDư;x.=\"ZtÕ :q4x,(hzx͐\Zx( 1<6) Khr^eUl{}XŲ⡟KB>-W/Z $Wfa"ңe727!̃-1D#F $x͓1QAHF$)p#Oܙjh[W|Q`ōAQçENDmF_՗QdP!>- iϘ,i2[1WtB\ˑeY1 ,dȝ1jLSkPCP˖Ej4TȂ/e|TiÒF dԣ彀e[Tg栔%+`Ϥ Ӳ$UmK@dPQM44S*r,)rJ[BH=4 .Ht؟CQ_xԑ!w`g4P#4RAudrKRe#pS^ENK6VT Ro w_bLaGQVbQ52I^%Z #8>9di&LR|q|[8ܜhY`t1\OG!ق9IVp:xmgcNdvəu9*ez|uc.RS] F\=qaIՖ^CYvӒ޸W2"Iuqf(`T-٦yg [&y@TYLMy JI^zc&S.ؠJnHĴZpѰZi<)[@[d )>iylUAuv,a4:%S0~?bX0KF{)OvrL'Gn,!>Y~LV_ʉ^('[=^2e**2py=Um*diLF^xi)2];ɱY>e.\WlF&IIɨfk3+ ң-O .b~ h wưݐ]z*jkjM%]:>QIa*BF[h^SȡlpT7`I ~a.M53䬔M)h2Ҟd$`ᕓ[Ǒ 2B2䗬~4p5A(A%d)JJyr(>na` F)&q`>&.c) O4dҳΡŊ'X&ș DƠ/AOd3+|)ɐ&̃hb9SXyj tJ.^>@M!>t1#6!İ$ yld2mZ\u ϝ V "JUx,ZA&z,0p"уjұGŤ,tʰR$eB.vka-"9p(夲 X<e@,3=LYԕR*C.w 2{H5X6PL<".eZ.YEI䜙(?1Y $hˠY2EC "UR328$c:V0U.A[9cp;4P"n;~q@" L±8-]ӦwjHٝaO1bm+p.]&M QF7L *er3+Irx|ca)A̹J?zL|Ebq*(P</d! )-44adiBK&-(m%AXNZeaM /#f ȤqX#^425*IAJhr 1h]}J6!YzEC^-_v)e cĈBpvE)xؑM)uujj!xlYs0 3# ĺ$HCjh֤ވû9T%c5/^݃\zC4hG-^2WP}:qЇwҡ-uSJH).^'9eJh7B%ɻX+[02ؚDqi!ǬUj.<؂IU]C)_ r?82}:R`JTp! PF :Œ`WAʶCGB_և# :2QyתDXe*!ЫU\ db-Yj0T^A(]]a;i0SDѨE\}phtt_դ^1.'R;벓\#6·mwoLbmG:F?"ޣde/vك U\a{F3M}];lNP=!fHfTAGr^Tj@7{"v~A^if `-a#BK8P-1 &#1sB&`Hv vm8aP`o3UD2~0 )6DzE.%R@C%"b`UZmq| V 7HuS5iHD N'e=£H"rI=f9m4 [ AiE[dS8uj9zw0[XP`H gox65S#BX2 QTE3 veH^tx֊x[  pr9Zm_%=[.hvc%7p sOPSuPO! kOqZV0~hwHPT€=EG᷁A1SxtR-HBF*'oS9#!?2$E ~>m{q_zx1sOHHI (;s DnT74:t!7A3$b`!w&{ Uw]GPb^Mȓ ~mvm`(ngL@~ZuBsŘP/[ӷד!n^jѧiwUk] \!j{c,-!:"&SlQNRZ^g2-8vri B[0qaXXՍj)s\os "S$2 ]mFTVE< ɩ )5IuEo#2}R*XR$GM7]p *4SEotzgTgG*95UK{86!I%APQkGipp@)m,!Y0 Ki EkxjU8+~fFV2C&/RDP"ipY'1hp0k\!SOr کGJ])aT,0USUJ.2s/76[2:NR67Kc3!Z70/DVEʼnUh8p, Dr&S)0|udJA\pwG 17fR ]010S8y.+P15'A[|hDfjP2#{P[bc\Sy;C*!saWr8$!0[ !ƨ(f̢[p&Y\AH`/G[~PFUCsT3kZ6x;2'ðIrp 7D\Y*_#GqG\r6 QH>, ]#@q'-CAq<4Qsb#0!&#w&CAF{U# ! $mE>ueLّPIGU!޲]s2?\caOk#!0z9#Vw(Td9{%UyMÚö3S @N]S1Z#QSi/ /˪CS2#=c#!vH1/A$6"f;ҫ5+,z7"톗H rxZZcW 0+"B;}=.JkNZ&L/+rq9%MV86zxLZ;?,_ULpj1Z%|+˳"9%@Q]Y.nu WCQH+5%AvU8KTL,R ; oP8:8%f+ՓAFƷ>8>Ҳ-ٗG(#T 8{[1_s$11V_#D5Pہ&6^ B@1I3QP3۔?%.6?rWX +L"%|)&}H²:?A9ߩyQo$sKwGp<@-.%ZSu2bm@=R!pGKBBj5;o]I2b, )0ZCAa$aW+SWLDQ},BcF#?^Kͺ6P3FbQ(^q}eV@2L'~X*uAr%4Th|H#a%2lJq r#̚ګTOIXdQYM b]>-xƥ/ˠ1Iw+5R(#u(QTij;:u0ùk.<ߓ*)tҵ"=ݵu hm.i\\ {sJsaR@JQ3n<"Ti(k穦Db+Ba%%d󴯭Kz#3B~6-"\a}KXᎡ!+XhUE{P (%8j3'Pg=æI*iauto6*,Ĩ US'C :kT2h.+7D3|n\4A0QqF(w"=߱FlDnR|Mmۂ??II}+ݜe [v\2݀ض"V](7PV}Z>+}N,WC:u]+T2m<$(+Qn2ayRAjQ}<+ԁ4Z//T,Ѐ:6+ˠrBl3b8Te!2J΍b^}I'6R6))9٪"L(2 \0Y,CV4BMѻ @/2!#‚堼TjΠ۾A3[*1E1f|72kKJ+3Uj´}kKV |)T7J78h u!cT_v.ll”" *E2A<0/4.:{D@RT.(k☲IZţh u ͮ3}ß8áo_?8__OƟ/EBs8hP͏ot @?O @ @D a6) EPe*JAb2E 3j2X P0RpGe$idÔCXo4Eۧd܈1}?ыi4>\`ՌT1"ZêR%u*׳^NͺmWc۲%1>do{WPdܜt<s3Pgn1mh3%Yp6dQ4$5)KmkMlJ#c_8<qOF&Bܸ̓ UhPyd,F'k[lɩ@ae80}p zny4[PIY}wDިe0 c3R_%l3|хk8ԷJ* T UckfHgeR,gGgCLp6͔J聟t_@#7V_c~\)RU}~UM` @9Q Agcl MQ`%39K7(*bE4^U]z ==sO~1,Ee'zֺe-ڛ ' JPrc9 }6Qֲ4og, *.31YaRǟnw3H3&RFLX+'΄50(6񹋲Z!{EF#d! YY }@\!tPyBh +b1 Hd1U'X%)e ZK%K\Q770igPOw)S!fPA4.i[>FYKTrAp<ƐZR'Lʅ%6NSQr\ň ws -1l1& 4a$A( %2Z'SʬT<ۙďt=$) {v8 A)2d61}8O{&ReLh=^dp؂ yxU1a_yM3(>azdU/O:xRh[,Xu%3؆0Ϣ׮nHa0t #CiQ)C{Ո; v]`ڞy~5W80v"kaȺ uf|o|ckM͑xXhYRd}_+yj?5<2ħd"88$f9\Af4LGJo0 (}LXv,Gag&͚jR `񪔵5 0 a./fUʘGĈP$Tu+&*TiZ E.ēg5z0T:YP!凳/a9ʀؗ,x~I6O҆ﺸ:TU@+ ,IzVD%rI\RaQ0NłXdAC}hx%~oQSIic)l1y>!e5qYY kUqm00W c;7@tĖfb,%ҊPSҗ/pYK!S)Qh=92MdV0imG{i_F3AC6fZp[1hfGkT9bMO,ۑ_*ebxlq tLJΧR. [*汾= j}= eLkPRn\My2DJKj5O"C5Nz p8xJT8iFvToS,2wv9* eG*y/z>1~! 8Cg+G'pB#;_|b'ʧj/lgsGg!d˜h=a*=R+9 5!P1iwіP(KaLÈKc;ĩh;»TAb4$MX@% *cq7o*?5 + 7}h i6ɥhB2Z2":AZLa]XBRzs*M2Bջq"B&1a1p#5 #7 <wb- r.U¸nlB&鱳wY1s] y: c4R 4 R K0Q5AzSXǘ  l U20  L<}`L&¶ȪB2}؂,K =Ӂژ[K@. `Ëe 6fD>A<1G2*1̣~(h?1KJl& Fʁs#H`+¯" ُ!GK$ { 4v}ضp[l~l0 o٧g2 +a2Ó`/gKK fTG *t)HLT0ɜuB-` e61 6k,Ƙ,cFa@!+zX@3 gAJw4C^cx5!VF]j+ c%* ^("j=k&Bg/AD˓a#Dqsِĥ$?a X 8q^@5ȼ:11#Q)7&4eJDAIՊ&hZ|ƝZʯ(/8Dƫ;F [w a8(,$FK 3Jt6*%V(0%8&-H'II|ʹ'"q)eD*F*IO^!5.m-+ 2qr -[C0U34[{H-2t9 JU9/dLdj2)C$a$Fp@P 0&#Uq æ"27'!X SӪiDJeȩA  `kɔ5p5F#!h*eThyAG[ ´:y*z'"!k}eÊk ȴ f/_{Q$)"R7BO"!1K e, PHU A*Q7@4:w>߄ {ٗD+= X$+DM@e@]QIƱ;z[Q~ z'Aa \- zX FQd-F"; AȢX ŀmi : B}u\C5S@7:A SEF6T3HSRZF,"/kGܡ4')![wK}Y][hp%^[[ٕ// ѬZ]8>ׅ:E P}1:):U9IM%⠋^بcDJ$*:{))8.zQ!N`7  m =XXT$. Z9D"6\T%V%naMWB$Q LRj=ZAq_GyO23L"~(M- 7` `@5˝ó V% l: M5.݂hU0r`bdC  J|bFӺ&wcItK ]11B(@^L0nfq kA6%p6!8PPpR ȩ g``(] s.qf >ጎ Ȅ^ 8yhv戊M8grΌn> h  ^+zzvqvHnNy6gFgPg8o^X: hi[ /vf ZÓ4RRx4Ȅ4HI~븆뷦k7I뻾¦kFll~컆4&ȆkĮklFFllƦlfmmNmlflNIx%ÖlvlkflҶVV׾l^~Xav芸iyVi0W Honjooo6[ ԇfZBzUҐѡ)Q LYL;=-3 vqQ!L  p?q0Yt)j)P{! a;NiX 7y5a ge <⋝ erdY8_< m{(ԥ֛L++/T,AѾir;%L8(OMIt2OY lËY+%@y#K#Nݰ뉖 AUoo13^ 1UQ^~wGēGl:~4?")H= !"J>AYQ"dy؎'a럹܇f0!_rv( noȩw@qވ pg&犨FgiHj7yogzhotF~g^zHpE gz@jpy0ifgz /wr{V/Ө{}yXgjfiy/yhVp.|Wև}7qSP<4ӹq b e6Iq׹!q#CQ#$Kr Kis%C#LiA]DLT#4#5 #$w1(r#Wo>zAm_h-QhA$.8DL萡DLH0A#-4XpDl 4·#e$dP8*TJ0hȏ!/ft9ӨE+u#}4 8IJ]>x TbaʔU| |RUVaɳdch#Fe<e4b<qJ?D4NC^MZ`„8Uiբ蝺2l#21b;&ivŇ>P;螶PhC*+;58ziiSglj&GYr^y&S4!jA_W5rqRL=Ez8[}mUx!D*Agj҅_ygYHjդVAD%hFdrC ,SY4b0i!x$aDgզ[N4J]aNz]OYYAf$jDߡaMdaQ(!s_MᕅIꞚIt♩RT&ADR4'gN:Uwlz$xbkhjnZ!d#V)<%h]q稜mYB&azه9ЩWU*I,=fD,Tes EgMQWhe#'WRn(if)g[5_Hj#M%!x( nh%yg& |nVeӼt‚5u֊nJ>,H1MV.<&WZeqn 'NU;^ R012CEG4VjlYûaq/VVsgI2? *Բ/*w;3jtZgP-+}:شCjqJioߨ~_޸z\$Ǜv%I8{Ff0@G)! ಶN -{M_bfmbۊx4)a26$>-5ƹmcL:T}2.eSJ]*< MDuin]3VȂ#@m{oZr25Nhp3gyvI"g.AI X%AN{ -6+=`H"1dK >p`Eň`wdմ!^m6+Z{! 7I#4*'B0e< h"M'8l^XB̃{adg0iQ90{haZZ.6K/d]>EЁTŸGk P-Yjƅ"ktriRAR dn/-|,iyD,U縦L|S|U)]̱^O.ऊ#Yi>Jɼ50\"۸I"ՇjW*r.棏# L񘚬Q[8I6jGnWhάNj40^Ԝ߀'M,T`ű-.Gdn`mJDW{EH-DHiC yQGa8p3 *0u-gy`JeZGed `G.v:V85ӑb{3Yfs֙#UW&)Ѧ2^SElZn7Uk[Ø  S*2:0W/Τ9Jbr0gey2B丯eyE9@5HK})^Z`8ѥ6j3ラlkρB59 ZQa6sw >E,u]0&a؛ ~i41%4=T.ش#,dAtOD*L.=-R U5T}ljފZ޵Y"=m#(^x&\_?o˪6O孓i!aCB!6$q22ϺK w]Yb=j!O ܢ>CJF'Tg@>m4ƐJ_sP+#9L<>7+Jqz}M׵fF -˯@FPaFeOo9ΗQqaLARԭlRD4olF`p͋開%ų08ȝy9N\:?MDH==r!<YYR!-Q\MMh1HpkViOL`]˧ h |JmIyBɋL%eYy4 ٔ!]ԉ]޶NX1ت}9WTZ,M]IH OrYW%Ft8 .=DDEoo9 SXlH)PWܛTq Is`GI!.Uz +LOhςY'TxL1܀Tb|dF qm ՑL.e[`BY[Ֆ<2 ɽۿmYB#ayv-^d)|A!;ߔMɍq ʅQb$PHj)\L# (ӡ-ZHHMޙA\L "CP%HHj@(fA M7=L O9 ɕW^Ǹ_ۤ#9ɔUݐ`uYC `50`^(…` aJ:\mJ|Ld!Viيhtɦ%cA)S_BbqUG1gh.6>4B2dÉm$02)<>dOBCsZ(0D h܁@(>BD,4@)$ź >|D#F%kYu i͵ Vly`qЦI?=udZ W4ME$r٩IH(֍^*P@I(BuBaVFI#zЙqT[xK§b9[tT]ܘ2& G$ VD @CfA|d&, >|&㧪lnKThiB12/(,Z /2oz.&|2 /"Z1DoF/*b/fB>/ /~.JVonZzo®\/Co(o"b.*jrp/Z2/o.o&o{oZV^2o(Z/0~np00  &_.s/p0wo(h 0qX܀&hLeT=,C>2XhD*=:1ZzΧP!e 9B9W/I=-!=$ŪAN$ ngq&yD, *ܬ PqATh4\M6Pʡjx.jBC GZJG/d6oTMC1(fɖn_Nt#.!XJ`C˨R,TV 5#^NZ9zw9\8cQ֛v" ǵ)sDJ#FuX5kvۭ}0gK ]vFzsGaK'[H%~o&bGb*NC"Tr>PKj(f;r2Ip&\5f eq,ޓ>2J&Yǜ0QR.8M-W1HȜ3ZXڡF|t'k 髏dvЈbi$!5aDE k z'E_iU0"$)1dFĩ s][xU,[[ cO vW`ki-Ua^;iŗWwbOg{)sNyrxsxZ.u#3H%]Ήs vdglXycLXӢȺmϭS"r@w. PRg3y xV2,G#`<])S("[ص@^M,̼`:+wҎ[/Crˢ>\*ԵT7zb,˳p,!J EP9@0phT e 4IJPr6V< U1;3LpSX:W=)m#6uqPz,\.gUB8vsHLll6E eRv!GYTH<}@FH#2JT,3A.9˛"p?*L!q)5Q]+j޲ˌ(R,nC+ata+Nȫ L= B4FwF^L_B1U3%PiQ |b jX.@7H@QDm( VU( 1;9䄂Q-g:le0ԕIrV<_m0y;Sz5NSZ%g Z(a2L}#(OsGCeZߓ}.ն^ɬF]2ӸWtm}:P`,*1b4- }@求;42RްG,"jؓy@Ee$ 8xq9f&}kA5ӁesNʕ F xK҄;Sւ=im.z YJo؎NIx)gLsҥ1 hß i?;lدi{\ V׮f<[V U^%ᝠa@DOO(e.MO!J\<edf*Ft̓fᎫ.1XNhDJeVjo!Hl:v<bC(*..L̈́"*FtT(3#+f#F)~L\뢄@XC$r))cޤ*&*z ɘBM>H@~"A!* o bayO@R#`X a$vq" b@h `"vOE/lbr"zQ.Bަ&vмBKWBkM^&&N,a "@1 d>Bqa1!+JApbDq!OXG-vf%v4 h JlpkDn-IN5|xL $2,XC%ɞocNCnΞeA!q`^nv2XQ($i ft`&r"+A|o-s r0210s`&-As1/Tf h(a3E, -G@q$0&pi(vAsͲ5E b0Y.ڒ~KK4/O43zN\w|SGZnqCC‡FG;fjP#lj3cpF&fͼNYR*> Jԅح(Y&7a $Pp4evf""B%8!f H%CCO6E3GA7.Kk9--6cxn])g-ihS6O,/#1LETw42t-@.D52χ6Nu dB+\2LT$Kx(* uNN'(OB _NgLje8I8Ek+x6Y*]Z m;CzvH)J&L>Y%PdwwmvM~I Q" ? B,H3lAG-{3b1p8˒zsL2!avmQ2HօHPCԒWcMm j IR,/rв`WC!S!7yp-/2&#DvPqrm"NjVsRk,&" N`$ t&%漘NfIs],iطTDfD~~c\.8c(FTP@ld@AǞ>4qb~[UqCGԵK"gt]\QoS 6/p"/tQ '9+OBnFn+O`ԅ~Ac-)x` [ut!r xyAyV1ngl;3s \δFeLvd$"dex {Ki&ټ&GFG_ml=pD3_Nrď؍jjtlS«2.8zmIcNUD"B;+u)a $) qVo#*J 铼fgx椸M Hi=$O.\0>&ظ/8ǏM)զ:(~=̩cT6)%=Z:cdCSZڹpܫZlJ)JZǚcV櫟bB2r^)MC(*HI~Y⍃z+;FyV^@RS2QDdo-}qdz{+<)5q>J'x4]TɳV ,^+^"QPxfdG_'QpVAa$.ez] ˦9X`/N~qaT(ZPD=YaltzEg\.u_yF4LzK Izw`>JZ&F)b:5!8&'ȿO/J l~|IOڇ'fd3*{3:%YeoX Yx ȩ$AACbcQ]<gf8n<ؔDZ Ce=FuEҥN@;eі|^PfwzYEDmmFQ3땨0ޠ|~՝ߛPk ֖Lj=ۡQƌw[U.n&G'Jc^\_ՍNP{Ȇ^3wInB,^V9A56$ԟeOcyR?YCHsd3Ɉ%o t֜m.+6L y"ٯKI'|#PhTs܂8'FNӊ(U*b _ꉘ=-zqFKiP-Mh[* ϸPT)ODAe Gllt>v<6MK+D<^^bcV7 z,M_h![>%|p}]qG!:(IE+'$HĞ-i>9QhBO>'ѣ!G 4 4"B 6`ơ:vUiC !6pKh W !N ee+FsDHWeHq KPV`?:k0,b@W<)xKelsО Iyf+HpjYz8FbgWmdLˎ*qu,=tfS% <_bGgվs~9%W)}t 4YkH Z]9tCmWIpŖV&iw(cE17Dş{{BuTG[e6 G"Zgs(B'ͨJUmvREI\AIʵHOZE_mYFvFgA*s17poD#F\v-YOebѹK-B$wjuUFTѓAF v~= eUZO"b:F2Z~]UmISui8!Dkl d IdIs+wPY!/]oYdI@lbt"!7mFnZ.љZׂ!痖j5MO^"ˣpݡ*R(V-n8,Jb 8(iL L2 ܳ*hԗ) m3NC5{\>}8KOq/,aǜ?_M6]=4rcv@=5yvrћq@g4c@&c~2wzrz>:(c 蝧:Ϯ 뛻>~:;zzeVp 4S4k7Mw/o觯>iEoHHs9 MO!TƙIR2"^秙(~A&4PƀpT" -l{[ G?x L`d  z}'DX=Ұ Nd8Bp䥴E2:T=$(a&P-*`p?; Q1!~`$v?#LKe Q2DgFA}FqʜUMrR2ⲥvk34bH>5aU1qVe0h>IbR6c؊7]k+h9D+JV5$e..lu@Q6*\6zN PTLGG>HI?J*V'Sbu.GG&{WG.C-)|E>6w k]pRۗT5߳iNGnUD?xvC<z"1 :L1j8ʘD! q`XE?& bMt_;"( 2ү 3u41铊h"{cj$,σ %ߗ<2YtR3/UA @C =H}Ђep}̃uvވ)ÐSzc'xh| K-]\kLb]z5FMQIAv$)LGO,u!m1ͧD+!&iCk:٦-;I3 Llg.`& B-V>9Khosop7SaThЁVhc5RBեzUkֱ1ՑI$ͬEc( Wp@1p(׉0u2D¬#ۃԝCYۭqW ݜJnv?Ol-N#[=ݝ h<0z$ r" >$`֯Bqh,B+G΂B2J.$+Vˀ^],XFOKmt1;E NQݳ|pmy%K.[q?3'̤|]q^ \D.Y'J_V+0|+3 /FWyw%X^%OjQ?nR+9P'2U Fo:ixFw& 1& 0oi_v w ]K6o5x fBjA0PNa.ZJ101@Cː4RCa,B$?*OFAB/b #f)&+Zj\\&|r.Ѣe(sT^w~rv"@?8 b^6u# 0=wϖf}'E!JK4J Iz`w fen U$jzriG p { S4Hzu.gG!%z.Gw2 it[R[OX)Uٵ'L0f]7kV*sjAk•3MT"*dHC~ @c^{fgv=yfӶ+j bNIrKj<C0#yvw i ]` dewy1 wwPIli1 3 nwG9IuIKC4ב^Tk 7bsBi KB/8a[[r BbvrkKANeL`bt%.B&J8zb$gPAI4 ؔUd iugKٷRs$@S'RJKz2") :PJqx6ɀg @ʠ1h9 VS Égw<$XJ46F-dK+ĞFAv1'$V{j q@+)aU$Sj?B ^\|"i#@/d9'%\k3a2IRJur9 r $gg9,=7*>Wc$i0HH KC䤚#-ZJϰ ː`3) 2 g wcJ2cӞH$,Iy)H19#ivFel'u'w1 Bb'!Q)ǑThx-"]e#Bb=b8MaW ̃9,jMʤ`Z|M=: d6\܊Gi;F;䕍zJPJ$,*KTJ .eZ1yJ yzz raZNYe hx'g_ڰzJJ˨INL:[j"Fb1 AFWak'!BeRSe/ò( V#B,7tUsu)9.:; Z#5ڭdu$A ʪ/:;p{9q۶ìr˱ضQr]k̚o#+)ۨr[Kq[t۵Ӷ붘9+d|"1@ ੻c^ {rx»jS@sw@V(wf@R`u^#eܣRd8RXF8,4Mڦ_<{ZbQdCd}>^~ Ns=rs#"8r}6%N#!f`R$nݦ_j"t^q]t Kq~zxn^y>~bB66FyHj[arj)NɗD0&ڠ A02rMÀfڬ M ;~+s.3. | <9N <:.:ެ' ;̾ ?Λ3 o?:'/: _,(Z*/oo1>|~'2~;R,>~ln1# ?h?pb@wƵqA@W7!OE/f[^}b_B~ J$\ޤjRYO^_"pRR@sX~_dALo)c$qce(WZ=}ы> :X/h F>6B#EHR1N}b<[ԣwq$-@%yYkYAQnU*G&5P !G6w7"\bETZۄl|LJs}ձj90h໵ R hl~0ɑVqG3sʴNuf*i0QKlQl/~_my5~]GR"0oOc-R$Ҝyë}ԭyeR{mbA]ud~ůs6VLp4|pMרI5LT6q>G׸v%ʈhJK"m=Zđj0b}=0L6E3Vц8Sh5V,Bȩ8!hK^x}8<8>l]: TM<ۑo '.#vU7%M1﹕覴+NVf ܯ)INHITwE\,9,.PG'=|DRӪ7#Qvߑw ;G^4mKhPN ;@ Dt|cVS͏iY#/=AC-I]cwcFW mbPM0Yuf^ޙG6J~Ђ˳}OnNd%*%`Ѣ{3P;,[ry2ea4DS&*FϞVc.;rf;AL @VnLW&bQw|![/^Mտm[p,$WJ!O#-U@'lڏRT"cttƦ%fZOnOHtTZaX)d$:\z ]BmX:xA䗑U>MHgŲNyg$tR]#($RtAfFPqc)0a惭 P(]阄 U[@ʻMKhbv-vߵKxN? QXt$ ݦ t/(ƄcU-tqhO`6# | {6m{q';&|&D顶˚Qi06[!B<)ZA#ikGeX4("2!)0A !a2AˤI2y Y۹{3?$ { J-Kjc#A nY>-30pCj#48;8ӏ 1O <~? C\ŽB&.,ɴw*b%˖8S<0:iBSш& R%0Z{0[)A"AҠ\>4hhp1lz bA#Ȳ]Dcڨl3|ڜ7s,%IA#1{r:!5zYG)'{v% 5/yɓ%)(,82x8)4uEุ4|/0E8w bܰ9 djzy {cX N2=,%'Qټdk'2:ёq8Bl҂M@r4A: BL죏mʓFҔi2䢍x,8 !-zME+n+(ɩ.R[DMGzk;ɣbd2J:ڄ,9TAbșL611J1`ג7*;R20s ڧ  Lt KΩs,$be9rL%a4|1:XOMH"05 IЇ,ЄhȂ;͟};H̎(HW w}P}x wN߬P@N~ }RxX-#*u{X]HMN0pT~5_ȂSeYה҅xRccUK"ty@ q3'$NQq (Ҡ$,c)rO*i!FI*Ub";B#Q/}Ia6ӰM&`[RYg2YPPMΠ{hxˋȂexP{]RhX}ӍɝhHDwYS}]}p^A8}$]D,h^|퓍Shן|}(yPPe_]  b_݄_b߁__!_\P( ``e`v`%`%aPX^%~` V~a^^ua-va% ` X ^a`b_be&6/~~bu^a"ASZGHD8M؜_IIԙ׀m@/]؇MޕPI5G8p(MH;;`TWtX!:-HC TøR؊}Xؘ-bHQJӢ|j=Y]D{cehވ%K&ҋsWGl]X6ia)7Ui&N!*4֢UhY98j c {UCx}ScuINJ0}xSIeU?mf&2!mTz}VeS%XS~Tk+% ^,lkə J"z% ^]oJ+Q\,pK 9lHLB 1,~qPiNY KqJlr!7tBM͔Ƃxp+Z(CEF"Fbmk!~;LXEXݭހx)J|l.L;He8w o (ӕ={=M$͂(S~ XPvԐ0Yjv؉m^ޥ%uJT՞iR.÷8$4m fL 5ޤs291d6&2jOR#**I,ןʏâhK<)^:LK8CƁd9Aԏ gNӅ`S,TSXt65f}6ՉDԟӞBY8} LBt[ܐ:=eݺn޻,@-:Xzpe-ISjև}l ) uED?pnO m5me A=Ə4u('Fs34zz0RՅm$x>0ЩN,j٧!@4X0V h&v>G>e(#"b!yyøx!eb~$Slqylq:Xϝgo ^&Ělz/]4 ۽멝?ФBB1bV:> 5Ab8mLB4!1'*V/[)*H%Vx+iBXɠ^ih C|تes* z@ުZF z 5smZ_G'0wrZrܺ?%j23?'QKa:]qW!E}Ճo W!z7bEeEH`zoپ}5X1bGlPŽ4O.3'ErhnjYhb.ތFB9VqʔA&}A$U =[j㈀[3EnŐIS>̇%bp(6$Y)gvvetd:)\(Qa kb7qZEvJْ07ݘWBI $ݢcI5.in\Ш(tkgf4%sO.bEXj߽l#-T6YPV'Ze:|2n7:X䤜]J $S'pUP g+ PxVt@ŋ+6km`KbUұ|W0? a P)r=(uj#są1uJX =56nu' 6کfjZlE%(qS*7 =QS8ؘFܬbh@\Eĉ>ؔo8@AG:3j>F1iCe/ R$ڬH;k2t>(#&pu}FHn"]':Or.TW$ZJ۸3G/EU荥 --1/MTElU1 zΉZO jbv%&MXE1PclAݫ2 XB6xcؾh1&I%%DB 'Ńɍ,Hg63 ¼٘m=!m*G--bfGa }nV"I+n$vp{3B1MU6%koiWLMk-9 w.8~JQR" S03 E#h+gbяAcVJ8WTRi6?/_)knejz?¶\JḲ:ʞCW `qY$LDmb"}&et%DL驙Om"WNiE3юBSY%~4Z5c7Ԭp[lڜ^j\8;L:.2{C2 FNșj4l׶$KzKl\YO*Yc;ЭLҞe&3t*N]Q u4tL*-Vn/m>jR^v@aZђv*CnԂ$iXN]wčW{,sfUق [tRAIs-[יAq̅':˷3@(Q hA\+GKY $pp쉍t7h9#Zq8ϾɲYt%0Ro<2vp12iqC)a K{Thlb+TDPɊBֵ69EGU)u04!\T3m;n|;꽳$+V1or7 q?>ErcJqxh#sE.cXUQaۃj"4& BWbFQ>LAq i^90-HLEMM< U#1IJ<:H-QSY_Ĉw1* Y)x\H}t)MDQI\ENPZEmRZ񖲅$PF  jڝ&\E ,DYgD>TA Ā =̃ DC۳ ( vD;tPE)!;a ƨ b2X)TMI{_ 1xiZ#ɵQ5N JS!^r!ȁɇ#*O>aDD2(el,B"Ayk^up<aփ<@c{1RD\J\Ecj J_ A=B2AG%Hg`,^J&}C:$ LcaQbGj/aJ@ lϮG.!܋W)Y$Pp=6Mb{QUm J!ݚ >8bGDGL͔J",dCnNJ0B("U텺xLC>9&,ƁA | nckmg'҃f=g|R>(#‰ȍ|sr3uɥ/)ؙVѫ gǺH{eYDՎ#^XIpFJ\ga$ .&w`,Bu.$h>fI<%Qxd}$rKB:"Pbj_ 鋕<|E@8BAcݯD-!TTBpJ\'o>C[F;4gGFÛC-A}&D.>%R˛CY ";A2);<R> @ #@ xs?)4@>삣gB*YCg$CFLƪҩ ǫ/M̉}ʬEMhّߢtYŹ~"A``C@r)gj(CVjCC %;r(&C0@BB렱L=K&'y[̓luFE-%H lcVJ|~)[!~ p!er"$Z2L'ALg(gg4m[0(%=pgQ܆F34B4-!gfp)̖&sIj0.jm((βg;(m*Z> CC"p> ‘% KdY<ӭ)ɥ`NŔ~Htr%B2DG,Їii |m @=0 8j=)*>@nD>^Wn,D>J~JsE fiUI>ZbC0SG+ʮЃ:)4Ĉ@yi!j>oy'Av~^&0naUsz2Ѓn^*B/ ) 0aQpZ婼@ 0OG6} B(]^SACy@61Il0nj "CxR@FŸZUH Z5!Ynif(%&ŮCt֝U׈C =jIDBj>t_֪ nhclAeGAVjBjNв'\a`AA8'rv6&A[>.^\/kirAZv0(Tގx[q [=rMOP_=)MDV|(t^j]d#桐C8p/%re.v~̀b#S-\B)OV)EGB ӷrCbDBڙZXOW ,EUiS(\"Ȫ@ g ϾN"Bcvrb/3F*jg.fRfxB9b 9*o*b \0_&\>u^œGdH V2M>o x EPkuCr)'~RYLԶD$bEuQ/hu⵫r~vhJ` h $f՘ qhFT . 8#DNcukT@S@EiI2,Bvbca&9%fF* @eLxh!t'uI=pBu&E!c iqÁ'xTf'hV@BQ$ilVFv<4i\$q>|`L5rfᄚUѣh mh@hވWY4%'2 b3gt 8@ s1Ai)sA;/ [܎ $٣Xlz F"dHR?AuJ{\__D ˦A _XL/[i #NZE{ФR#WV`XWlpADwuv;mX7 <уqeBXMôpLN({bA$26~F栉ϿZL8Wݛ^ gp *D$gG*jHrɐ<7dzOʠJdDdS=IךP$դ,^hp[Z5cODEn =Tڅi[DۛXkȨzRW{H N`nZLe=Ӯh-K4 4i)jIֻ/mĝ -gk[Ob?>[8FISM_/6§ZCl:,@ohL#8B- O̾A'Pz-md=CǓ)SHRɎYzX/ɏ5z*cҋO)B)=\T(H>ibT3aUZDx- \zeY2^Pk.NEe[ƃԝ7e*T(|"N/@zq<ˢ&,uVU+eyJ^)F;.K"k4讻Io[F# dO?S 3{V-{{)/qL,KEvD U:_ 8;>7>݄y}{*\.bY V*R J8])|i:qĹo tVţ ::uK$BҠLa |*HA B ;8Ldd0^PMV2Y"ۺ>|VJ՜!A~b wB@#toZSG&(n:H俏XIKjD ^a(>`Y &'Pb b@CAn@ 0apA @P.ʰ OA)!XP!@~_" PM)&v2@=b`=Yb-w ,I80b.G 2N@d4 'FL{+-$F'mtJJt#Ta2JkVJj*t)5 ,)kp(`8Ŷ 4Ґc뽎3k$*X5g O%(t/P-`hf(K>>>bnUZ) (̓)^2"\%o.V%aU_Uonn@CLAB+Ҁc$hnRbSmWǮ C' @fQ FWUrNrVyu|l-"H" ʞωQt3zi<^AB ,OHHd%3IΦ+"@ ^FJu\L~)L)GU8h-LBc¤$6G`'mg f{P,RQe;9 A>c N(==5!,0=Q i+$C? )[RqEi>©$A!~[ۓV7uj a"v̇8pSԎBNA%4c2RoeVr‹Jf/=,Q!,b@''A`+'PW^+*GRgu(vR^uT@Π ^\LB|6o76^vh'RHO.?,6a"|!H(h"Hb7W ]]r ~`6/R& J %r.;wk n@'c`@]ݶ(ȩ҃ +uja2*1 xupV2ycb)$r,mx.ec>0oW'>SvF)C4x FTmzӆDfў)²\jdAVtWkr fwfmBn~I,*bߎ.wp&TS;4"5Р ѣ꒒ "PLnuծV۲^OI&薕EU`@ W πT8CVWu"&" WzF^rËXtޑ7L vb5ܰ:Ώ(ZO(ɄO9fmi\GSj^hc骫F-6Q+m433C@p5 h|U&#P**4F,D|1zPMVj̭.`mrN 4( ▊+\whY %:湟"!0",BP(Nq!|3žrr?B!ݼeChe[>W5 OmV{}hnץXE/}* [e#S-ZB Ђ2Df{yzfFcw$#ӧ~WfpnrJ )0,1N#v-G.M"2omYf3I_"̌lpIjqdLJsuf9`&@v|[tf]D1b;F ;0{)Dl&d3|;gP`(_To#vrHFaTHjANv ?cr,ͳ6WUM~y9--qҗLҁV _7}?G,Tj5C]QH崼gaMKn]YP?˜;v_\u몾̪ I/K ͂x* f fox_o{ppwIh'hx1Ǽ뻉 >P։vdoKN h\k(J޾}޾k̡erPa8bPjY41$`—;XQś0l "ǂ+*pfP9o:L4ZGFmt_͂S/ZԈ/Z|Ы@+ٚ.3/Ljf%+sjWhp@=*8ց}TCշPۙjV_R܉+ي>35Ю EX߫ZĪ7:1lʠʆu5ME,G›~v}6vS|_vNxh!]^TMI1>bW>`h!Ku D\s6Tqhgy)CMWPEdl֔Qk v:xZk@4O٥r:X؊u]XRA ->@ΘnنdERg+%/Egs]KGHi)ա?]dގ.fĚF]ƱtĹ5fyքzaktR(UZVښIXMO(@&%ݰLJ+a[Mnh>i_=9m|D)u} bM!5s:yԫ~iR(q}Xhl%ᚧUF~q/W)#P A)nا{7#jybAeL>4wD@tE#HEo6|M9]؅mޔ9ێ딛=~wxn8J_:}l䲗5砌o+71 ?eM}ދ]z7-Noȓ[(|W.}3Ǿ.v`f>"+IjhR%:Odd"MZSHCBd!EzddX bK*o9d6/PٖTn8$16'Үf9 <)zQS.T 2\Z U2Mf21ux>ԑb2)D06LV"@8;d䝞()f-e+$.L(ı:;q%vlu2\$%D]%t8F+3 <9T,O|PT*+7RsePc,DֵOYh^ T̲O*ֲgUPy!3%eD'q{W*>4⤟#ȬCcRك C$sGje5 aPID &]9PGs&(.\K9\JVk,DCLFP# 餩L.6-AYs3ćyWA$qh@jAڨYb i|JEv"F fv< z' eoD>-^,Ō54AYzj8^v#Hh XlQiG֥HBC Sn*B…([*Oyذ'D&^DZdXP<,Wd54Ҹ,\8NPTr'E-5/{_¨5dLz:al.. M:)`rN}QQ$ژ˪\Ӄ#sZ-)uvbO*K5Dr1{ {ɇuJVFא5Ie֥.bjO1+gvIMkU%*GKXp 朦ZGi-X80 ؋Ȝ7TTW{5.8&h7-&q^>vg&neIiU:1 +aY+-9"F[DGuBJ/$x%S69cqW0r|!5bb4}G *M^9i824$̙!dF.uT:!%T6,kgdamR@Wҕ)$f!Zr52!p*FW5`ds4%5)h~Bբh%OӉh (_.Uߤ[w.2S<xriɟh骮i0 ڮʮJJs&ʯ ZjMk˯ ۮf.y0XEhD$W$Xқ3jUvqlDeZ {58t:5SW Ur-OnɆ fqvG^ّ-xG8B$ЁQz!LtDUFFzRtE<^$ivЯpTiiI}q!eDIKsrH5PKE7CڹSvʁB.&bEQ\Z rB'f7(GNӳi j'2 Y~-8l6^*C}ᎀsZ[XI UHxi儘˰!q |LY ekQv1/XvS G{RRGo2 ~sgMB_рSFQa0 Nf-uJ|ª"A3 k6+A7*ׇb+y+qf)|ۤ@SvfqV\$_/GvHJ3#)1Dˆ(wP(j79`FBeKKjd=CLƂD"8jz+-IJf<ҞCܛi@DŽGH7 {fnϔ(XNj[gl~u@6~!3tsG|}5asUq[k"ŵJ% l9xohLh|\1zRJ3)KF9r5ѯ%q䶋J%۲\G7$E1 /UÇ+ v[І*twTL\V>" J%-5ҎȞdKQ WL7p+ҧ8&ΉPsiZRr& Jo|r]rMg5&t4gd -!Gi.OHr (ZgxUha]L4u_$LGDm5G!E{;dlCmJcґ1XP䅏!іFw؊EGȪ[Em?q|irjIm,Ʊ:r*^,WR!Տbĉ6a;c;PETk*d-hBSPe3z3!BY7gHY+T[!MҊ1ђ1 nح ]I uD .L.D9Y.ip )faڂ9~V5dj(F0u9wxX[xlǑ hճh+ъJHϴ{??Am㒃5u}ugOPJE\ݔ.N1 Zᅮy.鋞Ӳ9^qriMTA2f VWXXK\5 MI$(~i`(uMyDXOf#0ts1s_ho/"Iť/=/9 nؑ].(>.>.WM;S\駈 đlW'FIG)t䉲NU5Eˠ85gm1؊P>HzWdSL~oDh5nܨVs܋'e,ʣvq@pޕLuRz!1p*|{10\P g~R2R3o j`Fy-doFlXu 9$hN06wJ7fLV"ha,;'p dZL5"ڕ{y}]G꺻5qfICvXaɇd65ىFC=Rpg+X  EM 2@ ۯC=4D{/zՋo߲}iXOՓРv\ %xbA}A0ZՃF C3>exZI1"™p΄61$̓1P&R5S:qk̓DIJ\40mW\k*E{sصZ:S(·A"@@-&&ZRAU&˞ Z4jD!@vsiY&]NRD2ç[SF~ᰫ 64v:[d56K(}6[#lîGP_&Q$B[BW^-b!e!b e|}H/NIz* cGSd!Ӈ Ibp˰[ **H-|j,zjҔS--!ڭ.HӶګ˱Bj+ c̾.(LpI'j*˜2*.,2J%ө@"E6Ȏ+ ib4\LT5ψS( jʬɡ7FBYĈʑi.$ &4]1|1&huj#^ا#S^r&=*HhNn!vP)CeIeꭔ6cmM|)IS6,2G}J S72Һ:Fyjrl*4gb8᭔:0+&T 5\Zیؖr&7[$mx mH+led;+)R5bP4lthU5'3~MP5ɐaK%Ier aS*)79_qIqj(NũCi),&A8#D_+ c0%D0aX4I!4h$LͨBh 1F^(A0H` I]C5L@1c*D0e(@w걌9_2` nV f  -ҊtR=o"aJyJJˋ]–8PƝ Hɥ(<)wBl7T̐&`ARRek&#mP&:y18;}bxЉ F!@ SE(#W#BpY&W#y .ءV2 < C^P2&Ehhˌ캊D;4vI?HņNyMF@ .ܱa'"^(,Mx\YG!L+L.%эMU*jRqA0^=a~Z9o{ZcyM"%* ҐhLQQ\_dLBvfFaPfi}a8LP8ьa6԰{(Ai` S?%Eᄷ+j6Qv!HS Ii3Sژh؜I8Dm_%͔T'lϘ,ZQc9k547Gh ѿ՟;ooʼnj|L!aĺYHl,Cq1pY6eNEHfQNԏI`&%Lz%J?-urVl^t -ig|fRqg3rֲ)޻fk5Ɣo8 +#pvF,Y`2BN|C}ȁ"fvQyZ-O]Zj3S'nۢic(ZyxRXNk NuyM 8mޟ]*^m |8l3m/L4٠( T@MM{YcWX㮞&_)N MPzؓTb]泛e}u9,Qrt"!X)NO+ؚnX L‹MM>sK22#%Ցjzn"Xmm1%? &naE;nTtskYĞԪ- 8MЌثĜe\&X#2) 1^j2 (dBL&$CeR'ajg uf2vygf9gi@1x&* Jl¨B馚N餛b iʨˬZ)^2.Z**: k z쮸ϐ6+B+b[-f-.K+܊{mۭ׎kmz+:;º2+,xH J(h軉ŀRiڮiFކ/kxc9j酣ηWL+UMamS-f5O ~)q1Ii&xrB%F0ms5l37Lr?tW{tf[unwmG F{ ;ZF'vSOPkF7 <M oÕQW r rܸ,X\TV.}0[z׮XHr-\\Hm~m{Fz*r־{x,',e2ОʆFL" ;jhdf-2.9/docs/hdfview/UsersGuide/images/dataset_3d.gif0000755000175000017500000050301512050301073023571 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!, H`})T,2e-bĊ+*Ӵ#G5i42ӤLiP|s27b JEr>92MI)EJLœj$4O3|OhdEU 1\jU&pPR fNp!\;EdS˫|Q͔ծi*F1LQk+9VeӤԲPֹqfiM)t3k~7ĆEMMQ6e6J'F.\DNg*<ɑ~Vkdx^sހ9XzX&1bɧ ~i8`anabܐX$~hb(j8Wv,vDi&cю5RD#(6.5SL.K-R[$d#xDSю(IN@*UUk^MF&d!m_P,UU*]sYQouPNJӠ$VfDUAz8c ig_UYU&j5Vmw^uMD2κ 4)$I$(FK, ;lU#l5DQu IQsrkC,4DCO4n.>Kk.Cgsb4(R䦢Hthk&f`Xd|ZF[yV 'z>0dy$-\0sFzzab(@Et1FPtz4*#[Gqe\uMIRLg/IK+ԤMn1ZiGoWRax jyUÝ5ZeRoApI맳4VpMd٪U%"7]i'%) a>x &jBM⭳vO %dGVH3aչ)Qr]x{>&T.B+A{B qwZ6"٤=$UDLAm&E0? y&^6>L@-E{J';aVrRuGSB 燑P410#`PPNKZAD!F%̷5a &FqP hU?0.P`8vW@e&0$@&nۢʶ4`]< G\$8Byf(HP1bVYLЖ:!“9skW(-edJFd:yexTrvF4ir.l7.⒮fݜooOܵrl ~UC+KJIkAa-HuuUXExTZ?oSٟ'Cc9A' E ʠ@  )D C Zu^dewՓrvY=~>18$ӇT ZVSSS"$ >aaK4ina8CVhr(}"CPaG(qјGy-aTt2(&WLA7ԳjW'mXrRMB+D+S[X@* "P!5 6DP|6%3 0t8T. Utp =xhB9Bx,OG"N"1ѓ@U_W af:+i!y;nN;H@mq0`0B1Ad5zlq6K? ziy?16j,b7h7vH৉A>g9W A.!&M~R|1<:Dɂ$Y4$iA@9H_d9~FgWIR2uQ7 C4(dhHJe^8*0gYhV`X+C A.0CdccM Gvs'8di@E/.A0d+Z0d,V:),:e;]ebF.#u0!y9ZX7eZPJħg8jkz52x 䤔˥tD7* FL%^i}YyK&YteE;U2l!!Y20zѩA\ .C?bN/ҧji"!k]*SA\)4,8*'YH޸)CI3#~^ 2C28Qp( ~% g2,q$=qQ8D}OaPuךE+[t0уNe$ `s: *%9   z'":d6ij5{^fG)u,P;&v@-o!]Gf+10މ ]}N)2 e`EdIUIX8i)åL#-m^M1*EUK¹w74*l˶%e.<=ܵe|īi{UR{9#$ZNQ;6g0'iltPU"fײ*esHq4lOJoWIG 6Q(0c_43Zdb!@e*Vb< nɷ ˴ -ā-;ZL @ Mؚ s ˭\ nsw17t7Y1n_,P5?aLi,GfgH;Vm2_} :-:4ZG|cTZ?R봮;UW_F0>{-ta HQpZX,w?-c-:D 8*E*@9nq^]Xf^$' 'Vm 윕KX orN淥ۏo6D^D^ǬF>SkP,fÌdH>6M嚰dTYN;liEqdq^E.Doxf2 :OBW4'A^<~*ψ*9pA*s]⌡jt,K6Jx9%lKgWM;zN 3GTn{ݛ&Z\;Tvt7V턟LWŃ?œiz-#g^$y(tJ In|Ys0hӀ1 gFhBsQ "7p1 O?/8p"֌!aP4! !I!8%"1!:El6eV.]>[>LYìüj˸y^Q׎IXq31EjXXlК)Mrܕ#c߶nhE2щ:~lE4AJF]r'\ Rdm}XXZfAAGq)AE7uSp eTfZdHɖlW/=+LJV*rQ+edLg8ɞ/,1&!(e/oqh%ZMՖb$WX>6a3 @ ʐ @ JP$(s|a4%PPK /_'݄sYt)S&M@ D1M 8p4&8Ɗi0]fҠJ4hƠd5Z&L3),g9e1>bi1^&19F[MhؾuW\h98I̖1BIUK*Ҩʪ]= U֦e}1M҈U)4:5,T4eh5g'9 EJCAb&ݷ%)=uڴl :󌈑{A tA{,TU/nz87L#h8:"Lg+"<:(4ސD</6  D":%Z 0hJ ZIlFql*^FāH#a / L2yL$40ɔ2Y,1;7 H:L7DrL;Rɶ: rO|N!ɄЌh;t@R3C;; iK\ j d{CCĺdIX1F4ꪯ‘R۸p3ڒ Wj=TVZU1PT1D=j2DeQj lNˍMKK-i7(q(t 뷠LSwSN zɛ4ҧsNqMQÏ&f>AĻC>ZSbD崛LAwk[p6\^'T$M(TI/9)ұŧ`qi`bi֊Gyt"j驖b .Ir(9 )\{RPX]W^{n6 X& +!:RՔv1R'Lӓ>yeA 5?5D4甔3ڨ:=&'ip4Dcֹ W9H,aTFpSjP#VT5}>$W4r;42M&R($QW┥ۀƤދ%:Ibxi5*ZG_k #IM@9coM,qc2eL(](,"k9jg4T*2Q^tS1*a~Yq,5sljËY+3jDΘ)^6Qbx,@4ǹxtD@hzed <@4 $@>d((PLhYEBq@ZEMBy/E``,h[ F$DDEN0d dާD5_ٻ V X]^mdO\k`>AQdL&\ ,*?SOERe6a8@N=m^}h`6m^ae݇Zv6``xht^-^x BnX,E然n^tggcSQ4&{SЇ-0XydY}~^\ Ig+~]YHzѣjJlhFW}YBn[n[>X]@`lj[W~n[~{ma-j|j3fYuيVZEj- ]ZTO&g ^ӡnk~MՕ_e]Rkkkm%km>Vn|Uf~mއ}HfM|6慆*b}Hi]da"&y>p|=];oV"6X[ _͇P="hYMrgk|؂M^U>pf`].MQR>dEgэf=Mq Ns>ŕn !MlEYV_OَkeJ4$Ee>n&]Z_%ga~@TueWul-gr\`[gY}dFd2gr-Fqel+Mw_avߛ=&&`],>f]hPC.H.0C`doQOxVbPU?g4n G=6RcPY0Fv\%l<6ncF.d0jQEX']vUJWl/nO԰us6UζU-oUINhGmֶTk}eVMZUTUvRZ nٳr-an?pn|?-]q[w&_qnNzf'w}ؚ,x!%aVs{XnPV^ނS8pRv^dPFbMNufUq%o}X7PumgpRO'bQa0fw.zpRrTmcwN=U~=j5궾kjvnf7msx~w?U~.kYЅqZMnǿCH]wRVF\l-oW&O|~jږmfvsO|ލpoi5봮=VۆD~WmWnWxfv|&mTzEohT*&e16OƲ,8uQa-8P0>T09o9bs1d; 8*,F}(5X5絔 :xt[U ВcS4P ȅNU 85״^x3rƜ7B ^;pc:2+Z\`c=\f렣 u_;lp'F1q]AAWgYCBۄga fw>Kqaf(M#h}rWyw&d YM&EB[БxC,_pGrɥ"1F(䣤VXr&;Zf~)iiid*$-1,E&WAHʩgDKIPaEE VI&؊iip1o UaE]j ؈E9KI~B5)V[Vo-`VJff_꒳·ՊEPź{}k\g*{KoV䆻UK% xEهɘǗ&Tm1UVkyk򧐰X$ۡiWzv؁Q\6 xbVHƚg{|.D2Rb2jnͩ4J$&6b4ܥ\M"܈kfijet{'a})}k1ƪ]R1l/W6 K_g)mӅp'n嫯5õJ ҽ^B˘`>tB<:6"ze^-?JAFbff;i?gn ey߶weI(s¤=zJܽ +A Lp"YlFIxݣ RP`d6FAq €]uSPONAG xd3tS* 6HP-BWX,? D!br6k84FmkȮƖݎl hS,̥-j#oHulKhb ,0I)'UZ㠾l*7=Q Y'/@B8U-!,u,qS r`N[!ђ[N@I! * ȈQәΆH 2t(mZ] 1t84eIIcsyK-=(2 {r7왊5'(1:TFN5N"[`ׄG.8rq1%`Zd@璍ELW'het:q_PB+&~ L( &9Uf`O2kqNVEW^=HN+5Q[^Z [j2yf: 9UɎ3s#NGH%Wy+iLOaI.Y#.j\8ѫRtTe\a_B"_Rr6RFQ#M G8C b2"u0 'WSMͳi6*bwd"X& 쬀yesטᵍQuig2QjmT}|*n+FkdG+MNu'YÖxDA[Ah5J,d#٤@3&cR7ڒkuJliPn'FTg-Xݺsѭ#o5>LN@0 ~+ 뫞2{%raMal beNAfѦY[ N+#9ڞ;kNJx6/Jq2(S.$ypTX[L]>xӬe9UdםanCIV痑]'WZ>idC#"U%Ere\,h=mX4a *۝+-nX 2;9]uo jISz^.Z9*hUv.Ot@G4vvV,}AYvP%uqt.)JV܊0XMGhoDu#,ֱvRh2Yg&M6xaƻuYudb)f4&6+yOOq8Wb\W}]o>A/)͈B;;M P$(Z|u:l^b "mÝ0jvl:w0, y7w;c 穼f8xu;-ێ0Y5@Q+ݒs8y @JhNh^RE]Zak1]NIi βu-P-^0)%%e \݃̚vԩ 9gn=iY) Y!4_GMV f%SĴ̕TRITD%niMl E)`ذNŗ͹͌RJՍIf$9QNߌVE ,Wt"v˱bi'V^aJ55"xōa!JEO~@ȵݤD QEQ6(ym bl z$4 Jܺ 3*).-K]:UM1aٜ[9$/-ޚEѽ}WQcY^aLu1XcRJmQP4Ha,Z*Qr i|J߭dhY5\`! 9]14Ѯ5F{T"$E M` ]^0!$4[=eoqd 6^N^])wd]~an5Ԝ|)ci ?ߕe$䀑TF/ n`a r!e1)Ur%]!)C&Luvnu^'wNvgwbg=|gw'z~ybg&l9e[j,m$XV(1i)zmbiYb,Ai:[&fimM 6l'@)qbl%,NqS#"hFΨ1 eq, -(hlΠ8+l15,d(Wή~+%wԩFnYK&_솭{Qu"RpdF(:ݕbkO\"zB}@6/$a*}ާxx/$t,@n6]5+SLJǻ.^,)n.,i,vk֭-h/XnL"#dؔ0XV+Up>(vnlފ-]-ǽɂkkMm 0+Ė>K0/o&*pr>,Q0ߙ>brXoUg. 8CFҟ)î>tj0@L*G5r^N/*D! 24mr*{/S/rn6cV\6Fk)NbNBFOg~*V?nO:Z5/W2>+;*n٪ %CX4kY_1j_kr\SubqJJVt^WO59^76fcu1$@DD2%B(-*XvP XAXZůEmL&6}6t]Xg~7@6cPD|bY:5Y;V2x;5h#[6$g7XW85)w:oE@kؒz038Szxs!?KHǤCʧ4`EB1NG/fO;B΍A#X9L#/ pp챡2,ey$vGmxW"h"s˧oG_Soi; h' w0V.O;/BG C8kzX{/u,|_5ü7ePꉄ/_>ն;G)},v/ڮ&#=cӣ+<)ƻ~xd|O}o8~j vh>8<;xyhu>^OSC{_Y:9G)#5>v}1ɹNjxݺE5@@'Pe֋Fo}i$QcL*D #&-'  ɏ 6Ä t3$, ^䙐%1:f@V0q_ʋ+RV_1&H]~T$C>}&$0AV/\sknH&ֹnŽ 'QC*1C wX3w-?⸀+$Ks6 L:28!鰄k;ٺTmQۜH 4Ts8#NЄĴ4d"( 3$1' i#'H9?1f#(021v FvBB -`q^L3r0\t t739J23Ԝ5 S/TF ++X0 #2CtCOG˅V&U~-3cJ5c C`fY Za&N#}u9 -/c[v. 3f1޺M60"fV㨟KniJg$KK*&'^+{,Ч.KhadD1NxYj\x-`tqIѕwLO}>ok!XۑlIW:lsy,ϦYk*e~Ŀlkdwn?CR8ߎ'+ߞb84<_^f@͸ fxa!Dr-k DB$Gл =, ˇ#1(V Hp*@&-x;(p.ҡ-cJG0]VOk@x(+8ҲQe_20Oc c87R:ړgFAe[EP@B] !ax,$3dc)JQ6̗$ p[>~`vq Lp,EQͬ2+\0$"+ˈo^+XG8.EeJ0xڃ9&I1{f];Mrr~shC곅.ʠl$a4Un%`h 0F$qA.Uf\VH8V^"bu5RGMt~-T)Y2Q\JZThdCn5b`jS[vk#:L)pAaeQY2i[E'JL_RIU1h\@aH&qF+<]Y h"e_5}+TU0 rHE5wkZL}NXA_Ww.QàI\SKfϻ)2xI24P.No|S/1էB4Ky\OX;7Fnek6ƚDnCYF8^OܻF7[r$|եX.P)J9 !_D$2Cĺ%d@bb(LxO1 +3Y$n4ON늼ѕ[X͌v1=n8S-Wf#Ǚa!5|9|Vlɕi'wn/3;6ƱqxMCXVQѐ W@e{Bt*I}ϱ3MʪH3-e))M&-L*XD HSp˨'YUx^E"D*v骏!jE`C*Y݋2ku9 )hWge ˨:=&J8OlheҍC 3eMc{vq˞kj>p쾯;j*]['/''p* *_9` -8143WJefonwB8m3_w_5}rOl}۩tɊ/}-l),vqO~ߤ`tk ~C?}9!~xǺ~W:EF|N J*onb'&%^/gN2Fɺ0aRDŽm'db!pBn.0p-Ze' 0_/~Po,.j .P p4PWPGkRbn &z*8h#fn 0ZD% `Ā81!@ T@!v"VFSVcuI:B#K2lƄF3 hT )2O iu v(p8H.&[ l *I}uxu U"J3 N+ ۏ5{<0ZuY nG%TAQSXP&#SF aS׌4u.91Nu0+ˬ1Ou*4.0.NQBC:/,(3VufWbOg,,$uFX14hpMLJ D9A UâLbl#aon OkI5T,ϰZp^aCt^WL Sp4xz#^-5ڬP2U6{w :rLo,U,TC3ZUokS"q /U!]o_i 7oJP.b9We]p"q9TG/gtye4J[\4'L*v52A^\# 3a8b?6-l#VSqOnY6|DWb]fjU'|E>pz%iA^v&yo5 qP.iSu{U Okv+MPu6OEROsB5{ֆCprS Gv}RQ W_CPXqMUʬZn/ZR4Xxz j5{k1 Lg}NCszΑsH_wk~6LPWw i`ib&鬰UQLm&혦9F<@R444b@*#yLfU6@l'$5n9TrԴӐ|CO&Q {nhQwxG`0y;Ve)pn]c 9 64a 7abů^vTTK@vsJkCC:N89TY_ШPڲr&4iV[GY 0.s.*p.XY98Yr7)_jAC0iw M4hē1XyyNL#38.hj*2Nf93kϱ[;%xu!ukWo-5;WXXIQ4|v_0cժYvϏԆz{9ڎ5{xu; KP~9-vpka!CP.U*Bpes7:E,ֵQN]U_XumA_۹͘_x԰xc끐Ee2\5b^:5P2A!eÄ`*z5^h@@8##` bErOChH &{BGxȍ#bY ;PWX U;]]mg:4ZBx.|Q1Tد77, `ۆe[Brʩ)9z̹ xW\s:tUpgQ7` V`Τ\ca߇}Z5 [ +FXrK =5p $ݲ {٭}cͫ6ڽk_PXϽ=|{qX6.Mjk\dXNXީ  2u='|hnfsX5b/aoqx [αa]{3, p|;|pa/p V\ݪb Ր:`ݭh%טJ4wg}ꓹ 2fu0{2!䖡><^o~q<1^}קeB 0bYm^+9.Gޯk{Xo0݈U/ͅVh`?މuеgoY;}f53u \#yq %/ߵx/xd4;ָX.v1YX]_!\e˿] >wyu4z˔)g`… 6\aA #N\XP)gpAAeB$YSaKBh`I8GF4Yȍ=XFz@&pbP=EF}ɴI%oB1Nj|,ڥdzT&r&ش6# 4d» kٰ>7Ny;,U)ǹEEb|{y9-ȢMw ׏m.55Έžؠb¥qz={6A+laVFAB 68bza4)ֳ HR"v>MC9Aʈ!M风0"h>(,x>F"WY҈]^ /y"^fY(gBf'esn9%MfQvi`/ 9M~h9٥*Vd,6%Ha5բnt*&&:*jh`9'(A~lZj bj%'(iJ vhhzbžjXGڥ&,2 '̰ ;p?i Nx_#nyo޹✯:Cy'^y{yϞ?~<훏<7n<^Oo_}䷻=埏{t`w@ħo} zo`4hy#( 1a[:pLU(lh"Cm9 l&D#&0!aB1Pp"X&GT8"ыO<D'Ql\H5jIc8F8_c;1}|.# )-1FVCQ$ۨ$񊁜H#xN1J$XDWbQt'MCLC5 %[+Pzj@m37fYR3}M"ҋ7]^j8yKF)λp'8=|B#12"D-AЄ*t mC шJtE/ьjtQ(&#(Dg4tL3ݙhAlXCϗś*c(_馽SOm.=T,PS~d&<”DPM: ְud-YϊִuiU/ ٴ^;4*(5:4Ͼ A4jS E 3GQ<$k#Up\&>ʩ ؊Ԫvmk_ [.# .Zˤh:9I?l@Y5 k4[""+_VTT:]hsyϋwm/EA1 W:l}DZXgVPU:Z /ù*I$[?ՇȔ#e6]jY}X-Ox ukH{ W/ I" Dm_ 5 9!yMӈƛx\ n—2ܢb&I>Vդ<)J jk (׹E&3hX2n{8K&o HKz_vh tfre KwX&Sde?4Y&n,Sz׼2̲V Y#]W=j;ԮY:3o=1[AВkMaSYu6l{wAq+9ANF}'} 6~7j*)W&%efڙRakUq?V ;4F-ZY0]UAͩ0;ygd{:>ՍP3{Fk8%zxULoӟnQKÅW3cm-s?*KЛe)'9[YF|y 1XdP^7s r/ . Ejg; bbV80vK8; (hv# y̓ `(G_d/"XD 4+TEAOO0 }sO #l>ԟOoN~~hc1H ]Iȳ}ZEU^PܗP|xZY6<%y'S"&x(ƅhB8!  q7!\P^ (zPxzwЁeE`( @P-y"|< 'Fr5XU+@=0 w"jPBhmbtYG#YjεY7 y7PW^Fq +w0 c 0wq 7N Y8y8PwNRw7iy<{ a0|y(|1 x1 5xByvgPBr8A犰h ʈyw[y x+y`ȆȊ茥x1(|ėly"H Ќ2]p8Imnu1y 58O$Ϡ(<1 }q "%PPѰ  9*4'x2 ? ' 9ɰW0 g>5 M yW^C \ SEW>B^) Јgy 7 Jh 5ZFXz x9bv[001pHkm克Yy {!x) qYXF76qy)BMw9 )|霽 4,~4[%MK)Zc{C) @[PyLa-B ד`SIzQ рixMFTWBzPx x鹇gvF)xTYw hS^#Җn~(U *`i&"|x"5(  RWxY]أ0*"5Z/!IPؖE**$6 7H{&ZF Ǚx` pO w1M6B890N4y8H7Z@s&Jw$x2@Dw0t8|  'S{Xo il%5[o@ 7ڊh ǣ #@:x||1 X ͗vc1xyلʒlm :ʢ:X"zPzY1kz犜 dYlWoag#1p1 S&C8"8 7ЈNڷx9گGW5 *⸒{l"LʤFfڡ9*p@ Z #g귆Pg{j +eqZOeMu*%5bLʰzThSIpC$1LR FM6~ j@Ǽq[*Sj [ܟPxw"8c gi9sPk|ih{7-8z:غ>J l()|c ȘjåǯKJ⩉ڄ=,o֊L<p`F)gŌ pko6RXCGOMt 0| ײF ~+x*lyOXKٲAjDQ H T * l˼Mdx w`C|<}:к;!g>!ȋ**BL v!X! |.z  j 싛p!Ƕ؄7!ЌҜ3(ټwx2imz ^ewaO1RD2  \v`A0 i ToPZOtq!q|7m?O;8QRlOo^VUmE iOKAYK=$EM6ӇxB-kk]YMjY`AOs!F;MPTԁELOx1m̱bVOV~|՛Mmlm O YO|a'+.ӌNKQD߆so <}mM_ӢEOqeʅ MՍQڃ=O]OsӽjxN-ymDYO %8{|mMG}؉mׯw-؊Cs֭ V}bmک&F}n־ A{ێUNmDDcN2>s8=VmMo~F VN~F}0~S~ۥ吡8M]扮QIDU~Y~Eu J>F=~>ꁎT}net~hƹBaGDFE뾎sgdtGYt_.oTVDKJ[EnPM%8GT$G.nI q>o0 G$.F_YEmD2DcK?ZDD %oV!Fw. Fp (I.IE~DER_ LUP^dBUD PdXF\/E^1/CEfODh jOcmoʰt?`a_{?|vɎOtʰ R//Oi@? C??=#AS:?A;:OO//ӯiLJ Pa†2È%bG!;XrI)ADҤJ/]I%̛3q.lağԨQIU:ӥB,E'1T@a!ׯidZ>MHWFyoЈa ]c%[Yc1ܸ$۠>&=tҨO5԰WoM{vkٯmƽ;o{MvqǕN\ִ&utٿKnVo[~RUPn ^B}!}J?0o:AG +ԇ3Pi@QC*P0xvx& .c3c9yc/.YcSFyGVa~9iemgwg=8 ]%*Jizjtzfk|WlVxe6[m;k8m鞻nlϻ Wgw|rG;/߷A!گ@7tSWw]yAh`8h=b]wwy'x/~yW^ᡏ~zߡz髧^{{G}??_?{b`pV(c=2`@kBѨ(`?&k#ԄKHB+5?MT#s ;MIA4LpYM )VUR 4_7OhaYR;uXt,S'e%k&cjͲf[z(cˈ,=XWj-c[ں6]mkk[v`nK\ nt%]RUnekfnt[v=a[YjR2;ehl܊{ ( ,`#s8E1C0o1:- Y@UB?Mg=+ ՝ڬy}fUcv ɕ5g^l}w:lBv؜Hr=y~v; H#yh.3= f%kmp:jsqv B[[8kfu7qMHY0^}[޷~|[p{B[Aak][qc{#NQB$&}h 'xhjRʱijJGy@Wz)nw(8q4wkWv꟭no>ʈc[4߾j=m/q܏#?ŗ/,7+W~{k}?~OquA} XmQau|bj{(h5 0xx-}Ж]P@;ѵo}x} [ P@;@S& *1'z0m}Aһ^۰|ni>spɶB2K[BnЛ!*, -.0+Bn2ܖ14*T46C.|/D3$;d9C7C94 jB; :cB<@P! ,0@:n' Ӈ5My؂0.8Ol;O&.hmɇM6NQEc$nAB0Pc\c4F-Eg|FhFi#v8iSF\?Z&ϛ0J|BE#ȿ ʤ n$ ɝ<00]H; Kmʙ:Bnbr:r#ܖ|D6Y0SkK0nENl0}6PԖ ԇCHьYLy\͂T ТD}P0PFe,cԂ %'z|1[k#`@ ԶxAsM 7 T|-KhCϿ3KJ1(<*+˧K{@)%&~*a06TP62+"'[(' spc 2#I Cp4b6bϬOvS2ڨ)+|*P'},+v2Q Go EFi:Suۇn<Lm̬"b aD+0dGN 6 l؄ d컝5H 6696]0SN5L8F<^,59wAc5(ՊC\yHhHpT4kzPFȄNjRHh`LaK- Qd$ru^.e=,J]զ- 6֖pV@0p^#X="&}btr-^f'Q'^k^h1.hit5KS^}s}*n"VDq ^IOE}ޞfX?sfm;`}ggE NfaFV^G}Ee PeX\}lu^0t.&zv)&I*rR)ieqҚg,eo1JZ2hڹfbl $Oyf8OB~-&uO_8p.HvNUaDt{V&Ou~nf}ReǪ:WEŁ`?֖M'[=޿߹a.{elNP~ԥg,g4e}ׯm0P]`pOM`ͮe#uz MD~|y7aI5~OgbGqZ{ȔZnz^)c>Fc'p "LxpPĤF!Ŋ/b̨q#ǎNGoz&*F Mi14L}`f*&0Z- t 0yň#LeĐJY2.SiI (Uˠ rJ-QvLS_{+WPt.lM.K&am- \hFhH20e.QHI*c1Pz01v0fa}. P٢7۶2hY_Y=˻SGNr讕?cM;˸3) 3h A#V 64m"#U['{fUX\ +CRj>l&W *"k&,~dE\Q&! K2٤M"P4HHiF1xW]ˀ1P(2pٵXPnFכn9嘜r:f^[v2Ϟʹ]qiFdq]@}.fp\ɸLl槡Uzczh(p~x"(a5X01l xR+*l Ścz2 dcpDi ZƛeZ?>2hP 3dH4IIc7y>e~m]r,ޙ2^l՚uLɨh˘"KksKVPHr?ύ"LY1/OjuYgHKTW(3\<υ,t,2fBP92e F iS^!%s]ZWN7i"`lq"gvZ&OJkM}WX6nʹ {үٷ kZim|꽴ͭ~,ٯ2m֫{Z i2!l(0@bDr˘ѮC xk"ajy{ל&3O{\4>Ώv`@>y B h4 k'3 nY 0t _~oD&4@.qYEEМ@9wqI d9 2MIJg>OyIf(Js?JMCNd/e:435:ȃbeA7thI\r4gӣ4s o(9HRd|P *U$inҏDyQ ֲ+Z VKgZӊVUv+_*Vu%pXjعƕ ,bٚVƪueulXոUlaZؿz+h+jk,kZ6|,cٰnbU%2 eDEva]cxTKQ0$#125 }Xvb/"^wi(/y׷ /}Iwnn~{]z/  cby}߃p+^G$.t;`T=EH=@ dx8 ^1Vsجj\C1*bo,GD:m\y @̨NL ٙ$Č@P.NThFxy$d܇D\ln Ic/Y͑$h/p뿊b@"b^H B(8B$ Za= hD 0jLW#)1E.&e&-v jhJHg[K&ql*К~`m%&wm ZI)f]q1IW']p߿v ^o?qP3lb,H-kv\u=Lc9D Y|" 7s߄D%-F\9Ƀ+8)Zu'}k9Sܚs&E*Q[ *q ^+a 8 hW7 *`v,'9=p '߄ANhA. .x,@oտS!yOCA摃ġǡXsNw\$>8 =c ~sݥ4d|T̅\uv(PYRb4,08X7Y>f;r|hdSMLJ_F=k7y5G~*C )YuQM)@ٍ\_ޭ^ ͙]l]!ڙ!ݘQy ؈EAI^.@>a $;X@5 P Qn!ȑ;!aV!΁M`AZ5`5u9!ژAٵ] $ߙ][Ap$a ͡N #" I@H9љٔ"`$΍aaUB؍']H!:}܉D/~aA@ԏAA(W)qS9AC $l܍q>^q! ժ&C6 $`QD)FĤ"%pAP+K_bDx EYB"dAdQ]$vHdm-CEJY]1"/͙j4DfAd NX&0"q%4ЃC$YFçe=nmt@j̜P uc4(᝙F D)l$;yFR1KR%000$A&ҡiИYvf]ŤE%؃1"BA|gxT_Wuꦩu֑qfnB`\*buf#Ac %(HlYbTe|fUQQ&xSı#IÈN(=?䍉<0b9IgVĖZVmݐ՞ݙiXqrfkZJflDHdѧ%$o'"ڃ%@BR' =_*eP,X7ٗb ]㙙 ̩X)R j DyD$*RK\n "#ʕHLZ9OҪݟm\yj^^FQ9O&,C@ A4 ;@ȃ(!cFa@.4 d:qѕ`&tX"fR@kF-Z%^*f֜O>&{Yw"i0%X0H,$8eݑ`-N1D,Ŋi^,pq^ @=`ٱCR)Ѡn)uqZlN3&Q RJ%0zqF% bv0 i6~eB :r̜ٙqQ!E,$9bV +98D:*DÈb^1G@@f>j>$~QkDCUz_{٧rA JQm@H~.[EhfNڡ=gR,VUWĥ5BoĚHޛr0 ".-Bf0X+)~Jhvo6-ECĂ,J^ꔔҟ!/^(i`.qߙjmQn"in) &/_SU1+AlfBA4+znWĽZ-lW⣵&\σD>4GfjlfNզ B_I(<ݤm B,zlR, D쪤Ъ110<%]mj>y25Qgx+rrg缁Ur2#3+1:lr殱}>jN٭Xl)\-nU Fz u&#f3/#~#U쏇eJ1*q=XDZ(0ĨCtQ"L? ,B`g"Ek2Rr*~ ڥ#+:#w/$ZO=K4$2$|><(³4 ѧRoE=t*/b末d hD2l5rZ^M808[Y5r3I;O&D`g7 (gJQDnߊmu3]5=^U(O6gA-.sJ=6{_Z g'QňFC4 >>>X)Xu762sfI,Fm:[ZmFmR/KaTLJ䡾tXCNK,!˪!ۜ NtoN'N`B>Q'j]J(/r&qCpuέ,<*x-$@QFC7;D-i2c!k]}x 6&_ˮ@/5l #qMol ;st0_j0 5`PC@D@jSGI*l6U#T) ~E(.R9;D2/G4lԦ,8pNg" pN- -pv"D[>:*#-2l !#&A3($8gNW`B_*4{zI\2+{,<:K2L讐k2yeC޶:f/x)[enfS޺ac{6vz0876&,1TIX]uNm3aZ> AAOWvv s57 ɞHHZHku565: tox,0ʑEq|xo2Է%#Ǯ۴l82C$'7s]d,#K |dԙpԳI-I8۹+x7vУ:K ;ǟx4DQUzĔ{[tQ>ky?۽dXkXЃ`B@ƨ=*.=Cě><9LX<4H7]cp_ \GG"F7$(adžĪ7<>ңʦ}:70[xً{ZNzډ`Ȁ L%?#2}`B Akp)֋(@ .ۧbĎIN(}YTr!!YX1ɜĨ&M M5ziRK6-)&eaҼS[vlXc5*IiԨ:F%y2q&,F ,ۅ&o(zɬlK ^.S^L&-le$ټs͝-FOij&Z}h 0{ Lŭۘ-GV9z˃1W>,i3hM/mƘ=`0\l?چn7Ӭ4p豞5"K0˨#! ;: ɤ3jK(5[)MRF: mu z؊p+2Ԁ#(`YZTT =8].ϘSϏҘ^~4)aP}vC ~`e g:clZ7t٢=typ9ڲ=[6k^xX샒δa~;~y2q7_,JC"R(!4#Nٺc:0 LelU4>V9ÍL*-X/=,պ>pƋTq+nK 5t<<NcNUւQUgb$YOҴ^Yt럷y[%@d"VJW)XAkQ [2*i iWr ! [hK>҈Kb* MC.QXx(/d6״ QƙZ^$; CXC'E&BwM=fM\<&Biʺ ) !_Pmh!ʰۛA2v[CeJm (4zl D~ȂKʨdF(/Ȏ#,ܙ:Bz%|$J87 UvxXz #SL،5Un;2@D N.53 M%H:,ƦzBt,ǼjT{& Gq3w8f>aeqVXYyp ˆ` aIZ®Ȧ^Ρ%JEH 6r~4c8x9P͑&w.R% X &a5teW/Nb|% 䕲=/6S 'phK` 3,=G7Od (aӢUmFϏUPZ4T\>KVܵʐT A\TXNRSغZӮ*j޵j-*]FRWU[bëhe 7: %[+Xְgߩ0}T;Eh$ .+ta^q=P ʠt-Sa<2TMAoKC̗;GšWl\cH6qCfWujW ٳ5T)#Oم9a oXF\IX@-myT\!rU_8v"׻wAr=:`_Ŗ!qvG?R+U\StJ!V;vv wE(29HM/9/ mrUK_-##O*ZM gaE&'9Poıa-ӭu& mN6o#εB{rV^ [AT$a]E6K-_RCۡNmri8o:5(,-oւJ oHQr LBHה> ]y! b.%-]>hF9TB}T")JuAsKIyɣQ!]򞏜2A in;y%"u(zԋSEONLKjn&\EQN|=In=\7Jou$){+ӷr/gv>:ye^9WQ]X|S'O{r thͣ-1e"GӍR!8cb Dy.?1Dy),]^%q+?OfooopP0/7A>EH0KPO,+c3mPqpcpUPCe0/^p'0TkpKPt *2ڥ(-p on +ba O:oܐ` CrkF^)p,l`Mqp-hը Ekp6Q4QפMH@q1KDQ3Ybq qk1mqQ]1/hœ=ӓ;:3릳9刢-(2EB )+4b K 4ݐ aB-t8_(*.2(s;3:HI9=HK)>TLSJۓ5N0ꁦ 1)4:05[3P 8t./DCqDI _|B vf ""DJTIN; A"PU SEUAbSq&5?Jk5KM3:3JJ4IIWtKm5WXWWu<WYݴW>{?sLOP )A#!//bPoC0/p oA`P#uŽRd8MnB#$*RanAhNbO$^8 VXY}UYeTWWNTMe[vdf˔[YkKa[f[Yw5g5[mUI>uVYKV4EѵlF BM)Q+@`n@`bXd`w rD9rV4^$D"4n%;0'b彩c-d&.ws-wr?7W[Z\=A\qʘvEa1ƖA؎R(o7xV"V&zb6+^b!Zn[NyW"B>qTsGt) YLuYK3siWru{Y|E|Wu}Iq~tdTqb#A dD)Bw^yeBV;jNo!6I.m9OBg"mCiW~WrO|Iq|Mw[yt]hIWq}f~Vpgs}k=O"Xw(%j&3fŒ]zAXW%08%2dobN3h#;ct巏i|v׉yXo[%{?ݗV=4!|tY KlI:NN XmwĹNo)Hr"7vy{xy%B֗m9UxpX֒}]vsddx}ue/{9iq/%?t)YX:a9bHX fRRYoD`E#xxmXa8[J7+ B#RB{+ׅ痈g7e;==[VV{X)=їQw@Yi(FUѦ٧ł(.HkՂiW9Wۘym'{٘q5%u!y:fK3ُ'wu99}9˺}vxJb"ZNrw8:y:f9}9bڲ(7oO-S:y9ݺK%ڜwzU6uZŹ7ZMMݴ)'ov? ";"\H,XFE"oN{I6:cŻ8nqԛ Yh[ڵU{إ~y9hzQڤۙu59Q]9GdWⰻ¡[1(_zxA:Ϊ96SX!"kmv;Z_h͔':9:79q㺷tq[j(+\xR1*Fm˂ZoO-;οyU8w;5+Weh8<99gzSZ崀no , )vvAI}w>!R%u"9O%:αӄC[Bڜy"$c9;'ݬ9;)] wXKچ|Z'}{[57wx[ u Gp˓bvAՓ(NFcG*[/#Y<oc)$owpW| w=;ۗϻYuig:u'Y{f3](ٰ"ޑbI=J]ޥlW 5&؋ca8<] =ڢ[^>}[}_?:M?Y⥔ݑf6"W])"PV_7c($_ۓ*%#'c![e#^n!R'88zg1^_>;oЍk}ȝً(\ 1G= "QSՓ"u^IN *(?+,zno8 [OپՋ}6VoE5o!=)‰#Y1Ӿ4H̘7ܹs͚?}hP9\3iSL}JԧP8ujϢ\ :+ժR&JWh-ۺFKsPLÈ/($A%6i}2U3g |387Fy\TP bH&#ڼbĈzK aBM^μs)BK2M&LrY@)\IpA,-Сd GڲvXQe`]\qRT 啄tU`W5W}8"]>B%iĠhcQ qcE%vb|LaZlHqL>ĖU#>;2+6NE×2(0k' 7Gpq(siaA>G,B$Z"UEͳ)E-.Ƒ>|1ĂEIA12ZH'L7}ԄEØrXf-nLh e@K2-5B$l(5BUdP+yu4J UkCm2DM4_F4|PIPLŤz,A~z1@!^HT:BD;Dw$.:Bȯ}HF3RB~?T;xX'Ӊ~S봇{ T6=$4x= Ž&AoEAO1}0CSd w $%)^W֥t`k莅,?4 yƓ'NQ#ϤxD#"B0<E1̩nI  ƍ#HqH'")d!,y(:V=w]"!t" ycCэ@}F LqcIJV1s}jH?^dqGp r,#RK0 9#"-He#{@G##?r`'SƔ/ϛǹ,JwÏ@'E!/q) RM߇6}"#HMI.>H>7+x*AfN9¦3Mkz6SMmS!EՃo}iR(BXG {6Dzat$Pt(>|HjHqOkZV<0l+*ېziuB[rdIH6Mis_"Auukݴ\in x_2e{J+W}]/|;zwaK܊Us[ⷹ­^܆.?%V. bnbps3L_M'qok_|zaz/@$Z0|N%z]JR>~u~͚A <99P CNWVvsWhyTw=miDOЏޠ}kKKZԵF'bt0.mΔLvf W3%7on0y-v/ph;7=f ䷂o[VCmYַ~pV sKG\ce8-.J W7~+DqYp,o-0.8k s<w8]nܸVW>G&ol 3d,Yh_`'SL4eI?|u=ҫ{GL/Ѩx/sg1~wǜ,݃Wnqޑ`W5ss&樷p_xFzM0TéU{cy,G4[Y7ſtjnQj$cZXg [Dq"žywqwnVFBwT'1K@u<Dg(9;}:OS]A(GTt|DA/h);?QI?>@)X䁯wK:$;HJԃWJBhMC"hM$xq b˧DEHAuv,6RwjGj;R12)x(()X*2((#8XH)؉8X؊艥花xȊC0u>>v~Vx/RG1&2b(a+tx,5݈Xx(4h8ȍ숏H؍H9B툍ЏҘ iy Iɐ 9Pyꘑ(Y!ؒ&)(9ؑ(y)+;Y4:IMdOc`?mj7=S`jiRɔ'Gic=uǗSj$kD$kdY_5c#5lSa} pnj+M h恦 _IC@t$~)#< F8G?WigBk4qq<:?oA_i\)J2qe@g_)>CAө;ۙ<݉byz?飘Q5<?@\xYן[ĢVyIYZt9隙@GOK+'cdQvy rMEsEճʄz8OytvIT8CAip ¤YEG3l Ay Z;cKXzLTcko4Hsz8JoħYIfI QpF*a5n5Jc%&hJNDnLGMv$SdwE3Kf*IaB˜m~B()Z(#i 4a{v@cXnf_٩$XFFUR:ATC!D:9SKn;y{F,{xA{AwEzUwa}U?hGiK*uů:}PT8FӘ0=w?K顰aBh\7<*I8:Fdw[XK5 ZA#c76B`:`> as 1t/07/EJ:INZLG8p&E(p638M25w*9`RB-FGqV8yD$@MZG3HO:@\d9;x}Tj!&QEEy rGװԔJXr[{ꬭE3VxR4XyCȠkȸת{-;/#d;Q @2Z:D~Ye^BZn(f*D\5+^*gLwJ@Y|l#Ep;Mzp1NhKv<QzT Q7 >y5:v;FTHuPqvP\tM)Q4vB,+[LG\Xb8v`B BիmkR$Z#2fJ{+{™'؄w9PEՃ`;;jP7M{ݛ+ >,|UZ@QÝ8#ʱ;) ::[ǧ t \SĄ,f|I2{FEUWLFA|D{ʞ Hv!9u4d%6C+>[P6DOA`di/ˡeq5̮kHJYeR8|R9*IyeKhy<|8;#H|,\ ͩ;W.!jc%z|ËJ:wS%/y 4HEMSlɶ{Eqv;`c]L%\2ʢȟ5A˱v@/8WLMid,= V MHrګ9IXyl5˄@]Ásڂ eU@#%>Zع-`mĄ>e2ڹy04c8}$LhC@5PLmN՗KAƈA΃q΅0{:mq1qCQJƁ,a/&>$n0@kc})9'mB [mDT媻zXfx"ѣ]n[lYqt˿)qMp]|sz*9>WyCsӉk8u%@Rv+St\ؘ﫪˺W@}x*\MէT9A~w̿sĀSC(lxm?Z..mW B6],;,1,.2$:2 b6LZQZϕ2!lpc"&i5q3"4&Ijq䫝)KhyM E(HV ̿}z:ӒŬIG̀kJQZ RG\>ߝDy%֚W:ĢsA o Kh-`Ӷ܆ȉe]^xwД5:~ ͢ ,1}MV/,& zߢ%q3$6b%v3/Mr  z 5=3r"xW96Ѻpa$Ϟ%<6=6Jܣ=\Z˧;a kVl85v {Ǔ \"TG݀PHA^M~f<@ރ1 BT:w\\Ȃ)w$=zcnPd7kU`@;ҐXC7a63 ±.j#ƌhD7>ʈ1 -^ĘQF=KP߾eԗFԤmhL 2#K7>ST"'ML ICIU͚8^0iR!gҦriգgCsO~$Zt;[N`vɑ=;+5M 8TB(ƆVWI@Ѐ`8@s1@ .p *@$3 6Є H/$ K n<[TDկ4a4w)l DmT&L4U#h0F@-GA`$4xYьθFxL'1IӒюQI}#3q*r܃@#XY]'MH$(pU>^Rf 1ʾ֢$E9 &Sc^S6&dyMs&-8D35YBFEjeTb_ݻk?D"x+ -\Ӷŭ"y<{l[F{HuWl]ς>t4%LH.*"bP&4Qtѽ'2Rd$CJ3qT>SŴ0f:rA ʈD*ٞ-QSNuGYXqF[(JN,v~x-&' 5“c.Y|b dR^58B+EIGH2Yϴ&ƺ2 (_6#ɼf?R&:} `63 sS{nB3i x&jygr'6HOҒ'}Kh:ӕ'hĎC%<ݐJ.<{.ґ<\Yk%8Jl{cϛ&Enk]ϰXpF {$UҐҔdbPB3Ee;+Zaࠜ[iYKT<+U)]j}h{%>p=8Fч 14"by-'g>HWiŋӱ-c)ܛKwoxgOZ>ZDo)T9~W>ճa#n8,\O.ftvt֏ˍy4LlaMt6oZhG}ZE"7[׏8i[|㯙2xBlceL'Sr_au NKw.sO-tY"j AS@ d b<= 73>&.z Z*:|;{;{0 '㻄XlճA;Y&$ҟޘ(+IbS2]a+@"GC=uY3I٣IP7;*7)0HMb4?)ҷd8=t8"$K|9ɧ>-^` ړ G'?x?(Q6 Ҫ!,-bd4l=y z <2>y+>Ҫ@ di) Aө^k;BCGѝA[Y;㉞ZAA;B&*lىT̖Qd$*UUl<)a+_6(.-pȏt%dT{ 4p Yw 8Ȣ:: C +4;*2Tk=d=$EʼcbS0Mb` -a[I2;3PV0HK\37c/2%<;<*~o0̰ Rl[@,J4$ʥC&hB఍*9* Jh!2CPv} i2ޚ߉GDs 7hxs{4PqtC&NLN3䪥+OcLLQ2꼧q̜ +8ٮ*.k1MO1:(dVrbTKE%8Dt N\j: 3sN'!#QLN8TJI"M"  "EE!5R$U=I8&Q( R"R+Q($S S0S1$R45S5*R#RR/R5-em3:S7S.E3=SCRUT*Ўzٰ)G X6ѓFjC72O| FH-Ս1>qy>yV A1`Xdl@nQ/9[:,e*ݻ&= 3:@Lw{&9WoEïMΨB̕AJϜ6r+X҄y@\6B^|MPPZbZهĝvD׸-(f5, ɸ}0@?^5118DN:,>;mv Gp0m,neo664BJm&2xj*чd}04Y8WXYbdPEû8C؆a~\![FFVj 5wɒ5ߕUYez&Z@A\? ܂>yG-_I_ u 9_)ݣ+?} I PDFBL+YJ-+[AB͘Բ,6 G _ iօp]Ey 8}1IM 9E5(>)N^(Ɲ7=$A.^NQ㈭~)c"ᱞ@=K6?q8M2cyA#87?A "2XKEz p]2+S2i}tx}a:t剋ё9  C-ٔE7P3B7ͶU4IC[m׀fc5LfGy\]ey4W)5ha#U;ht]`ڟL$ό9YPaٌ踟rͤ7.L8U}Ѝw X0,Gb !>OAք \f '/u)b)dX0@mTܣ?E-(V#$J|ASj>F8d42ܙ.dʣMJ!0/(WE|TXnKÚ]@蛩iF$(e`eF'q fE `"GMsD6m&j<:m^;OTb;bj&9ޗ#dev#Goo>v[5AHpK^Uq. a0MVT+AܛN$ũ-MƯ! FM -,>p$1g:LPjB[f$*ߚزAHabݾ|;ĭ-:6#'GV"&޶(TM?K/M ?K%RS%1#=ÚZԢ״DLj 6qfX OkUK4c*uWw.]o3R욄rq-MQ!F䓘j ]Es(%zr.<4fNr,V&m-}|G@ڞzo 4?5߹G12၏C1+ t?fs *,yؕjEC_WOMԝu,Jo>4KLI˛W*R0 V4Eo;o*`dm+i9 / 2$ uSM*,aq~dqS! /:oi K*kq+zz4lyܤ֥.MIxs~,1YA Az"y/'{i&!0 9WlNLR!>_3\@ V!:YS~ʇNTwKw ՠH?GQm bW#q(9TBuR:*U84,IhH() h.4`AJlh!Dn"=*d(qdI$Q ėQ^Hf͛: < I+SeSOJANVO߲}J/SՋOhWϩ>O]lU^sj.UNŞ.Ԫoʕ4;}jФ&1Ȓ'Sld  sePG.m4ԪWC >pVIY8$yn4KKZsrF:ujx>NjXbf{ /^QYmPş^2{En^p5g 1CL2̄R!!na"8"!^b^6W#~;'\`6_\hEeVՒfV[wtQVq%udMy%c>Uid> hZtYy Zge#Tm!&ɀB̢ (N:. )F)d *c)plZrvgwM՗]]⚝UZUVWRv]{a%lװ\# lڀdc.۪%>iac,!;C oxbk/dpU2PG6zҺ'&1dL<[Ǟ:<0cr c\fGqb,²hfWKRuwmwl^Vn,UT[klyNckg6&ee97nF_qQnd ;ꨋ'x&p2ǥtiN>㦎j!`<ȫ{5O^ d﹛)Åfƪz מ3;C|G&L ym]%V`i5w|mX`]lteדחYݧb id-# Dbt1P27<AU,g:5ajÃ/ 5L_,,QJ!aCxCrLC'J |x'62!Q>e,9#MD4bØtqM`F&IŇ=T!l5eXbV\o=NwR6z ֊m\f"@0m\TDޖ=Ie ޻ ɪd%8W~}`H”>չOy*U<թaqc\2E[z#sLhg5'͠m5Af8shXn|IW Z i 6驟6@ZZ L6ܛ ȦbFq E@F LyAd$G"2} & "b\>t2RSiWwU+MY2~å*a!Tuj4Efx9IU=2KW#&M>*NZ!WuduY:Һ Bdl}Qx)\UWW) ` AjS:$^էH ۖSR&]t>B}xt2[g)Δaf9YYfВ)cnA6vAuh:.CM&dK2D@-L5q3]*Hu*m3 MN8ՙQ-kޛNЗ lz7^r$qǨ%>JK d؁2MII 4 u{Dr$Ō&FX`MJmbZPUIc;U ]ZiKVñ##W5"!:WZԬ&r=+n ]։;:p #v ],Jfb,g>sO17/$@Kj zTIg .-VfL)g7æ(Е&5j7ELG!BwdK%`{ēwf>a1H9 bk7:dFaģ+n)Nt/RO"f[^Gi,fGKyU -X1,]4l~+\瞨kUU6?@X-4&鲈x~IZY Yp1`dOaGc&F,aV`?݈SQB T.4 ӡ2G(U @n 5щg SY23FIRwWda;vHO` oxB= \ɚɽõ$ _9n oVPw/04]a7/ћ4]n2lۡ\UwwKaN9 ݟ< k]2o?d>yQ0ri WzOum{ҕ\醛IρFFFF|)dn[YиT9 A)L  #dKl|] Q ÌݥPiU- AJ[!j _dԟq]bFc}^Pw8b qe}a"Oi %& g6iakpfɏƒWpXȋF&FpX|f"g&V%J)2"d!y!5̅b׀YO B>׼̀QO!DQEKC*qA_HG 8nĞ(:^ }ɚI;#;=r9z.OLHABMEEQLDFLdD>LEHL|DB`Q|@AFdHDIdCI$K$HB$LEJL$FMn@ U{pdEXXخ !֓,Eca.I0*ۘF,+#~$Jmz1Z2",,V-$\a|\خ`Wp]VSy`l pYPPF5de {xQ|ȿU4Sj^ #Υɟ{8 ymMvXMa"_ڏaq&ĥaJF ^&vr2,mPW1ayn x}dߺ /J&X&mVtڜeePauZ`'yyXч_Qoɘ_M Hvf1ċ 4UUqHHiҙ}Htk(}L[NQO(L:)M T TZDwE|a)f\4(&>Q-r"etdTi#& $ ܊Ur(C( &+2h=kB+(Dk^+j{ ƃp+ 舂K eaEIќўJ~74ѾMjђ~ST֔>E疊ґbjlڅs>ZF(2؋CC*.A+,ijCE0t-xRzxj0UmTx}5D;$M6};a[utIEڊ-"X~mضSzLM  /*˂qO&"я3؄e\hk&klZk,ςn mjb Ƹ+p`暹yU_UW^=_IlYYʨj/Zu"u4 (Dųdayڕ3ZG* 2I\͜Miilji-.m.4+lξbriV~|&N򒦜lPZӎݽmLI *[pW(4y- 0W~90 ,gumzZOϪyU!$n6eX@(9Hbpބqzŷ#&+*!{# 9q-)"Ay qV>A}.])𾌜L%?Zar&kL'A) sRZ~Ă,P5`p9W8BǤءogfuZFFAjjEF_+>3F"URnštE$Zߡ 9jwI9sQ C6E, WS= 5_S=\3*n*(_ll i&ESaPSFV.gSa%%4b(fW ހ%Q+5qV±M6kg@2rrJ.RR2HW20!o'+0!)"*sC/Ȇ6Ku/YDB_+ՠ^*ReާDcsq[BFdGF!%20 }v/C&OSs&5il'wJ= 1JLp/y >$΄Іe*O)*5QQ2_Q/`=Q ϐg6fj66\X !F v($A^΢0&\koh8ƒ  ]2Y<[!=Y8"ksbr[fj[1U4eZźRƢ=03c˾ h8dM3l&gx(\02y&"8O8hX Qj"(V*9+n*&%"[b0"s;ҝl1#.c荜< 2Bu QZɂ* -CTAVZ͹LfCjR*ɠ*wh,&@G3pb)=꣰c9dRLH"B\Er$k{oFI$#ĹAĺF{Ļ$A@CƄPĤFIRL:h@*ҷvS著s⋢^0zfՒZ0'1NX'@8`A&TPB!FLf2ՋF/Z=˨o>&KzmH[OIud1Œ$V1LCoZ2@5ibR#jՃ.fRSŬZ\fߢ0dE Z*GY2JVvA;L¡@-eqcnjn4ْe4jФMSeĈ)9ҤC6gתEgulط]> ne Γ-8P>|7ln<8sc0Ey)NϹˉCW7~>s}JgG!sgH( 쯥} I )P:2,$ I0l*PH74#hBqh ER,X  PR&84;+1b2"(P&J¸KMRK pI#ˢR}!Re4I738鴑R:HbPN>Bbd7&H]#/!roS>Ŕ }8e|ԡHARI]4S^UnOwU Q JF\$>ԈC8(ْ,ri *l5饑J(g2@eMPb$LI:;BrH-7-heILBȄkXa .݉# s4IF-bDF00EF n]d$>u6,: R9E_g%zF<?.? Bãkcb))\@Z50'Q0hB"p&4lТYڇDOD!HX*ұ\ [Ȃ!&bP/T\eb13$ADN,^O<- Al^x%6G*W{5 q{UcZ|i%n{'+y7 P,~HFH2FX5XA1)eAU""T2;P[9AaDdGa Y|䣁,`(2 600BTb"NMa3y|7+ I4H.8}Feb-_A y8(#&&k$t$*%NID2,/- ⭂P"GM A%{LJ a(TD$uTmf;:bQ6vŦe#YrjI?bnNV/ʉ%;J٫*4d\N_eWHO*&Yudn0zɸRdY3頸`v[J^Ŏ*2HW8G&p &Ip?-{ KԠP@t8pcL"-&B1WKb2ĜAbX"X%TY0iHft* &)fE4vdrM+|;0a1\o4o忂5`{9H=K$^';b$g9\qbI'%[%d8Ҟr5OEr&el Ǖ3gD欂X(ﺚݒg;1 w{l=Q5\BsڥqTn)}!BR IJrzdpdbU״'|5Rg&C<%@&o{a)ei+k2/;ͤyf3bػqv=?(HA\!ydyA\ aL=NP&V-aPt.y=ke1C Ms?&L D~ ԮcXW~&0LW^]u{!M[n[j{zŽVOӗ/m'/U;r@J]:!z3+% 29fL]m-ۿ}WlO/]\!~9LHѐYC?Տ[K >~I$Ͼ'g?{[ܯo/00O1p!ί/ n% $)r6DniF(\i,&KN%-y$8M]H8ד*?^-! 4!p!F BR`cL 9GC G=0 U0e&plU iUWMViU _0"<%~##^j PYXPII&4r`A e#Ŧ)̕[ϕmtB\ҕ]e4KU*/h^et\qgZqY!K_7\`K] KqG\^͒m*B'j4DHĔA^rZjZEP-KEB\0Zv5ea&^_%`X`eed Ht`6iCGp>a !  p X jj|{gCVk6Ca& VV0ȃ! KBAVWjd1ѳvqYKY,?oFa&,H2bq\2w)ĥCZUtZqsCX/vd\IvV\tEvsss5xwxu%xW\$F7tv9t}WwZx\xxWvdyydtVuQs{ev&`;ywvw7s}y[x+}7#Wwa|ywz7f(8}~Wwovkwt%Xz~q>;&"OnF *KGOllj rꬢRGUQ$ja!J5dAcH?Lur#p"Vd8A@pOa9AMBl!t@ #&O%|RD4qb W@}:+! x[Za7~ݷxxW{F$9z-y`HzY| 9zeW*CHs2tz\/q3twyuU=aAug"4ؘyM5(uy뗖I=WaC99ACnws97YQgٓ YZY-yu}sWt7Bڠs7ٔwzMpX hr=>zAzE2"l NO"BC1Mj -Vio qwub5t!Bt@d#!2J>>@>NA7p)IJe.4bT@/~;8헁w UW7Ɏ ~`,c {Ȱƕ{ {W/;!l`&۲?۳ICە7ې[[ {;[_;[={G{O۶[I[G{a3۷=[Me;SqW۵{;k۸i۸;11'5d3y+b!8G19ݗׅ$dde 榗vBGA9@I04YH!@PYc0XHځCJ jɆAJ @{@;/z7g۲{  6ۮ>` $u @ n;]#CC_ͼ<|ۜ<||< <׼!Fƀ |p۶f9;t3]{M{/{ShT JB [V4eML|ƕ!L Aד= 5ljDM\eHBC٥]f|NjM\]Н E#5 4` r`  r \@ 4Jx!IN?C ^>I ~]S/48^=>CM]>[~^g4]=/>N<NNTc~䍞Q~KN>W~A~e+ٞI>K~1YY~ѩ~QJ͜> 4~ $ݱ%SZ펐*hxS#4c$̆afƔXʚAL1aЇ* !ӠB.\Y&ɋN5JRG2*DTdǐSedˑ_W|I3c޹bNhLFu bGf= oX'?\q&ehҠ!v#ͤ4JGէS>̖جih{V7kᦉ̑/_]/ZeˠE\yٟ=˛z釟nݽ~_}dv*#Vgh"ȅa=p1E!u!4!r2ј!$bѸ(bt*b5$Xc|'܆L(hd, ,'Q 4J%Rj"nU>Y>ew&f A9z&qw'nr"px@e4'""9Z>E sW%iXu( 2$`oNia) yn,=cZ>޺!a[FC~y+iZ̴ؖ6i`;mp:J WRWdl$u1*mqiVB 1vr,-oF)1qޙVjige)3e|ߨ<'ō .^ןYmN/]JiiF\J1+Y7mČ~H-A2)FlZEZh!R7Vu!N5~(+$\.bԥ>w1i G(^e*7oRZ }Q{N)s˙B -j ث}懹 2jU:ס-*AoCԶ(Z'FۧDih:OƷvqth)YTx3E w<!RkS ,3jjkyVK(&^vjvS/r;41|4:P#&T8yo^l<˧tqP#$2xE?}2R,}f۠43)~ybd?-Kcڰx) ;1q/i,KtiMu$ }%Ǎs♬#^.0]ШcQuZ;cP&)W k(jhRv qe}Q8R͹ն? 2 -R! ^#*UD2QT!g7ũ@X14YHʡ H;ڶ)Cbs580ipMO9|$n)_SDƒvpŀ>حL{)vJѬc1 w |gէO:M #+Δ=U(kHQ])BlY*q}9J폁3#ҒBURWҶ:Jmu\`V7NtTq6P lU(&EqvqDZye"sa>p n:9ŃLY`)Z,o*Yޱ5 t4A OSAbd("f4IehRԥABbb5Q3=&sTFKJ%b yB򱯬=U[4T :H1Dyqˠ344;\u5}8Ȱ` vd-! 6l~PWFvZU CT `DVf'}",&cفY@x>cm"4(~Gx+~@c" h&[DHym2!n6ftSGS6_4qz?/>,sz^3~4yD5HY7QUpThT';;qhWh2\I|OkA ćx+)KYee^RUU5ʹN)_#}gI2 Dc_fe‡BLcnMBQViಆbCab,9Cs8qxNPWW!8?>V)ʢD:pe3cwzpX`r К; ( #tv4_Cä@wgW"Ѡ  `0  , 2К9{ء ^j =H&bU'G=zHODrTFe/VIl\~v\(7?nf0%e2g|#K5·,gdnajZfGsQb.gӈ+E#}C]#bz+}ea"ƢK)` Р E"H!p ;y0uw@+0qfrorXuO:'_:xWʤX  `ː -`m4H q¡p 7!uQqlb$Cgg]dŏa&څhȥofVDŽ _UjXAHKSq R`F.d$LB*sS!nR-#xh3vatyJI`v"!| C0npB5:z꥾h " tקѠIw7bv`>kq `.Ѡw0Rf ؤ,0q Tp0 , , Q\ 7b&I;lOJ/9iwJ [65pfSl)z^ zf]zo X\ HgU{QyhL8UKU"qW1f*BYI}{.$H'b4v/ⲯqG \,r 1 t ӱ(` `5 hY lys!" uI)ȐR)!8) ;!#Kxa7[[$i}׌P$:HIcReU4Mx?}($hyUd2\uXoy,o\zG\,K62vX%Hl^T&xg.҈71R|*wj}wA 7<Dq|U,檹}RB!ʀ!Q P ƒ)1DGڗҾ 0=xw R1xJyvC)ˁпFH iȇ sw"G@t;x;Rr *~§ݨҀ<'wPve L&heB<읾TRRЅ\fRHo*‹-}\.H@hWqKz*V߫x ڶpR|VE^8nbJlm(NE-G7f! :dNsЀ [w^"por҈NUx>yw<]bޝ0&)ztđc+ßr[*L $C >Gu1)2Ĕ= ^6K.rۧT'V5Gfb؋CK<3B,k(L/n=M7\7S(Cl8vp>dn-sˢ-M߾z۷/C;a= 5nر7hݘ&GeUT FCC1z%lM2}>(P Dt}3*TeBAաBhFH5,ѬWFK)0-ep*]$r6e6)Ӥ)\5cԞM+bӈؕ2yBݺő:+Ș7ÎLs}77[m/ܹЉ~;s_В'"wL9_ 6htέW~"\ +댙x6.82*PIP(j*,ci4HCҘ䤎BĕX0\TĨG'dz{=ǮVK'LIcZÌ4@+JAb@) b@ j38jRJi˫{5JTz;pCSJT3+)kP B0.;x9#P2}HFY&Q3;V^^6/t8m@/ϾO+2覊>z;G+A9,eUge7a4˾%L"?/1O d6zꔟyOS# ak E,eWQWT1JJ*7X\0>aYF(Tj] *j +\kJDB4+[<|!Z-A #F/Q$6Ȓf5L:q3 fsS+[Qz .7QO]⢌MIp8$PnBw xЌ@GYqreCDo3Ad̅ kYO)k`k',6,e:=Rv1 (oCO )r(qQfe1A "9CyItP:"sdC7Fu#:O7 ϝ B8x#7MrehD~D7&h';bQWd;!st fk5i"s9Scs҉lz x7+It/Ϸf畡+1To*M{zy[Y@_^Jz! I/=BӒ.$!.̗F|X^E{9e5S1uj΄޴%!搓@.7 r=*T++>nÈ : ?8 :8B40}i/8oK2R+DR=DKCA鳺E 8ӺCA9D:[<=S:e;DF1~Ɂ?`D $^ED9|# C}DhH3}8p;ǻ2BmP[y;x;DʠFtȾCDut#t ;}(IK]To;dQĐ<ɍ;D@*IW_4ˋ@IcZ@ێCԿ4{Lƚi˙[lMA oAKK[ [A@A7.7 TAC$37D9IF;7B9lʼMrF~lSnͣ˿Jc+,?kõë`EJl( L/0J4G8[N;lB<^L<Mg>aΒ+AiEI Ϟ@D\,D SG;4֌;#9sEUА$E@$YJML4?,O|7.C2ATţ9Īw H'v 4Q$Cg$ѣH=~sC]5η3^\]%EQDPU B @# 2=ER,x;? |@W|>CL{RX]A&UԪc91EJ7?]ROATS4-SR;؂3$SWDX]Hu4CX1%ր7XD7HU4d[O57$8J+yyTP 3M':I2KdնeͫQp͔š۽4~bD. Z$8dƞͻ4K"S};Τ<۸ iU5J:,ћZPnaI[@oPh.8N]}f@sl1e`#v`snIօ>}lC/RuY)WF!fU"Gq4۩E})F2ctuēFDӻ!Zi paպ5广d \Fy:R ]Pd"e@d?vf_fwveWvhvivPfilvnvmwvvrvopGrsWvWwwwqOwgxG_C4!$_5P)`roǖh^4 Y6[PgSpmP9ʆ`Pȇ3χ1ԓo``sv9҇X4WP PP2iP HQOW4&_29zzwj")'< '#z{?{/G4Gix/{H{_o/OGOizW|X|W|}τ}M}}~߷W~7~W~7~G~~o?7gw btYffh'%xطohu(F 1-l}ՋF/=q9u^>.lˁ=3Oߢ8()۷0FJz>o"E yJw4z 1cG|/#VUPX=թTM8^vtW@q%o}n޴*8/T3jvМ*&uӹ`/ x̿+6toSK{ᙉ,'xqzʞCFLz&bi®=;޻.:y_F^kys}ŷ~GQ^} hV za{2ČC %sCW_&2("H?%>]DSh2 ND5Fc)p,[c(-rIl@]/h<^  3iȥOo9bmՙjRvtٟM)X-T# *EibNԜPS"JTDeul~Y*i2ԡvL+}:g5wIٔ.qz,a:럗NK t]&ۮۮ&;yo,0Ë pǛƺ֕(2$i(C&縏jc< 8rD.0A4C} R+Ug;:иUzg'*hrUXj/yeбySo:UhjZSgʶaIEe܍{$+T\\[VxbjMUN+8QشZTi(4Ѓ{N$HF+$??|K/Zo|g/Rc>O{OWO[<ڿ_Oc<_]~|ރ%{泟A N].4 pQb4d8Bhh&1A 8M4(g+Qbpe$N` zV10$ KEA-gS j 3;-2 c2;i9U1\WT+-2l'J*a\o$:j-5$9,)[YdA*V9ˡNU0Z 9*es n'}b$В h2c i f^%d&n6؄5Df&42Wc3| Mq>ӛ1Hf3)MS@8̀!Ҍ> rz hC#Ж`&?@Qd=n4 Ġ<(b1L @!y&47Ob0AC3Љ,ޢe%Vt#a)QhfZJŅt[KmS‚duvc[UY8"iY-Pz-5JEMJHL2';]ApVVWͯ"eB:3Q6-o{f-q0[G&)ILLϑ,BFwvR ␷ 9e\FmE*%9SSt2PeQqvY75RVK[rH^kF]Y4˩ev3mM_qcExTuWE-=q+c.KDj\R6WD&CySؓ<&sYe-j 5Sbg 2|M,͚sL?Ş5AMb{šD/zВŤq&M(&/ O'ze2<ЃƪjVcpGk]kZZֱW= zp"h2q l8%v3WEdFT:LF Pyim+nZk|Y5s6%,PgV^NEƚqP?̧^ KqC8mmY-eًB;2k.Qڳi-JVUZGF*VjM2洧m}ܩs=D9dDD\EWf]ҙ:QݗYm`9 (8 9`}=Y՝m YٕA(C BĞe ݣ= %Y:e0>I9 ԃRKMBHLPmu HEp(0R*q(_`mRLXɅae _( hXag N, `T$Mdbԛˍ E`LNf]9,"]k%b_elyLAPT`=`}IDIDxN2VYՕIЉ ͝M9` v2=#֝ Z]M]5ҕcTJ$$s $$GJ90^Ys) (H YL L`^ W04 1Ҭ$܀|aKNȍФ aa]S5VYX$ΟjR"J MUIR%*"c6aR,9Jc&Eu(.N#=Xܘ+}ү U.V%_ZZ%-W+'<Fxi0Z&<.'j*! o^p de:)Q</'/0ç0/0BU0B/C/0꧎*=CFTK!o%nUJL$>0އ\e!)!Wͻ%.U9NY:eĕـIاJc"*qN!(߈i֌ )eU W`VdYYR"@&X$eL8 RH Pf‘ύ 3ruҹ>9RYlk2cn]n9Z1,q%J  Z^rc ?:*8۝4TM=Fm~j;BF0B-ێ;@RA J0HKX (0U>2HJ&C|tXZ玡&|JHuH&&ڤpi^Dhj~0-ꪚ#W4j-2/ȶ>0BGv̱Ȳ$8rSH4 Ck]L_13Y'3.;Ȫ$a8>( pyNˆ)B`UQٙ!޵)tAID?u1K* ttt*rAt&D@/"4+BTCuTSuU1XTWuSWu!B! `4$ RUW|LL\Vz]5N_hQT,ǿbl=X"~)M=в0%\:vҾVSmEXZʒmbSD \=ʡ̆( GX$!YKƮE( g&/lgĊnV0Bdh)p܁\DHt v$Xiin >ߑvz.IcUY1]w?v< UMMtL[j @"&Zt`?rG C!ToC5iSC""B/@`Anٔ@don-DpEtrUю1ص`fdY YMw6&NP_p֧[QDHc;劔y`!V`\X9OkE#bɥ$Yޞ-•H4B7 4LF 0X|\f̢kJ i)FC؁؝m!8Y<#Ef-J+{s:) Lrҝze>,uXSu{V/WV;GV3¸s8UoXC?g#8(]ߖ2(z.u1߉훅`"4s؀(y,,F,iRlGh3֖Rg:\R,zK̿^,h}%vVc3 VuF߁B Lw @4hzt}(w 98jcYYC_J`G3MC1 ZԖ4u ;;]۩Ymi4`SBWۂ+4*L P3+0;o)VWKd# yX( D4v1`5ߺ>"՟Y9Q((/R)eѥ|/n|b6\*sxD}ҋVo_4 k!zJg"}ՋQ}8F!)#7S>+N<m ʒ"!* 2b&YpY4ˠPl: ZU U NUpY\hQm+yuW/` ۍWe&+\sb5qrhӛK{v :1zK[> gn6tM{~L]ŀFEbdZٹkg$Āg]{اZ4Lžb1)S&MbЄIҰ@@) E xLpH(x&GgBJ#: %4jEbI$f#r)d"QB%v 'zh&}q*HɊ$xK&s#%!r'#:K)9Lr0QH)211yȊ͉I0?"S Ba*!QF:΢LHI%()b/4bI}#EǏPd}t0:.KXzU",k2e9SLߒ2Ȇ2 (L̽mu9+&]MMߌ6s09cGal9:[~]NZfXჳ;<6Jm@2 ! D5٦fA (4 m4N#KA%VIbѠ0(;|:Qi) [G@ImBYlSI"5J:_ <3OwzĘ,ZI" Fj. NF*tE.\H[e)I /#]*(ۇ֪0H+J֮o+/v0. `䝃h;0-[ܺeeJ|qEw5NkM^}#8dEЇ/@> )]@pX0'&O7((D4S&T0?x@aMCRQ5(k@hIUӉL%)Io΄6-ij'񚗨Õp;Z?EjHe:$5m)j=ԈFFRH3TB@I&Y֔',(O#+FL]GC oZR>1'T1K*XE DCծBi5_[ch)2r57q5@T{j_/5 >{&қr02^0h,bè<(zB'=)8Ic}G@Ȕah"ebHZ@mP4` A0-h i\ C} 9P|l!1v=iK8xm)v6Ad2d'rJ-}r8K9 tvI朆I1ђcϸƨk|[4Iqpdzےv25I^D0^p3TIDMQ$IR#$(?QU~z$CLBʢxo.˲޿1Y&#1A h4c>bfF B> PĀ9#$Iƒ1 )49@܄7 MJ+=$;R4Rv#.-j}"F"i6JiF(@QDZNyKu⚛?6mx;/Ĺqni*: vG,7(H!&Qxl0hg.T~b=k!ʪ1Q&8A.c.܂fgʙq4Ts5v2kdSlf758Sj#'Vh1Ђ -x¹-nt[PZ| 1` q2e [ 9 =o82>4AD6aڞh .(b BRqHr);΅0Ĕp9;rB0%h@mm*D6qԠ:%ΛR"AVMV&ߢT),r^g#.'C!x1K75J xWL*)iFfB$s([TnjY-0c.es|{_kMk[䮹k.Msz8$P!~~v`|P B!@+$G#F81~pOj@9R|t 4ǔAABa td!hnlvA<"A A @dA!t !( q$j␈д$,eȰLh BEp'nJjNަ ĤpF~bFDKdI&L(&t IZаLmd%r"ώb"4)B1l*fN%W"2)H"pY'1"֜-%Fyg6$ڂ\Zϻn8).l ~\Ú|4I^cѹ)l_$\M{Zkc_3?J&?M@\ AnT.,v2 L*obap bc Db@N$t.X`"FP> DPF- @7BZNa0FDGq2vpNDDQrp Ǎ"P* MP"'&P(8dj`xM"\"NtnIF\rrDmlnB)@a)&A xآ-`'f2)?J.җ-wp>j0+{\8p[^dq},]M11ۧK|"_Ն Z cyRn+48 ? BEAhj ,jޠĬ車qB$!6` ŪIAnŧ,ajD"a!hc*Œ *\(X."% `$'LR*z0 mXJ "lȴ=ʲ=g &h AMF. HSNh$F ZK#61T$bƒyfcۆq%zv2.c78.cI^&ـ3(iٌ-<#7 ^/\ZQ2͜OלM.Js[BA20/ Le\&A`f6!j gB>MCNԱh! *01wts"!Aa"! 0NA'j.!Gn`J)%x'! p( "Eem>g2GxPn&mKJd qFOS>qR?N*djEC {@QX *H@TkTRpx,?)(J%Y2`$JEn-Y2)`ڢz |E1ktJ[>6'}%lc4Bd'}ꇜZ1M++Yܒ.u`cG-'.: j5S 4>/6u` 0rREH!qLB" At!UP!6aT-, Ů5&-e˴ʌvr$lhkrj Dr T[lΈ`t M'#g60ED$L~BU#$aT_IM12 3qM0X8S~8a25_0IiWr]Z@61I_Lg+.Exr4t`Y4kdʣ5Ov6!Q^SOJRoCʥ3d?cNN"Q'6nΔ p,j!OPh La"`Saj'Ml0I +t(NdFf$J( nN>)B} K(Z2 a0,X't(sȨKuۙ?jMJBZ>g ֓uLN2IqFuXǟVt[Q_M-ۉggXb5ZHm[LS[xMs#eKUVl#׹ ԛv/5vHGqQNŘyy,c ʃB bBzk:(g0.R,N(qFK$n$XmJgoƎN)VD>xR ۦH\6 JP_ZjnL^QkXD?xMbTzFJlPs3 )>aҖ@n׻@VۛdP(g;(nhd'V]Vs0gC TruE(p!UwB( lʶf~i>:nڕN vy3>j  p9IJU=u Hb<ҚyBԦ>>^7>A>껞OɾA쳾Ǿ'~B|?nߔfi&G"ߣ|57 -o(%s,%1\oxo0bphDaRJLuK 5$FI;m˭h}D*,L^kιn,? p^CP҈!Bv"ۊg ̿WbSX*K._Aq4$* )HP2ESHa=h!#$p}ulKm4!Zhp[}i71nF`3-mǔٺHYO㚜'm2`Rxm҈>fHߢW>DV@wCxbhhwE5X$sŸSVV/2bJ%x,Q7X]VQvAgy dH`nu\_E2e!pY $Xf%Ɯ1!_GϽq2r䜃 eDv^ v`aIs8JP SKeSb iL(^fW5VhV&Ve_U{v*v)(n)ffRc/ʴ pr\vb vgaavhVyU.YIaGf!wo Nvu m~Zגs*%ņdhc&5ߋ5.bv)fZ Fه_&T P4BE3 ޖݺTCLt1Jgʫ &l7H\ƫn-]VQU]kD* 02*BGɠSNA%$UmƯDɬ>rn%ɮmk9jU(2Pe1 l\6aO&X|I/c2A4Y!])a2ޮb׆fh]6g dW HH*uaGWudy$2|҅ bkf-6g"^h[Ҿph"_aaIju;ʡM$R7|U6=)33\z &M[aSn +u2AeSwϡWAⓊH+$zwsf2"]Z$;[>u‰EGau!h7(!\p2ThITV+SZ_У;5IYaw:LA\F%E0e Uo]L(04ފƋު-}} H1SGˆ 5"P؂dKV1UfP $GΆ?-hZKp;x28'&FF6}V|]'ճi y VQ?P>qչ^46Um_bgsZ g#!(҄2f04eL3  ODZٜ%f<#am?Z*>N෰QJ`D@Jo,GZ-Ѵu7s! 1x^hIf;iSKJVvGt`fqmΑywa%X7VpC;@pyMA }[I,j\9}4ba904Ľ,gh8;DiЀt#9?B@,CXlYONwƂw8rj(Tтjȥ fP)4xy՝|Ga9ɋ#_DXF Ylm8z:j[IKj,HoTM{@IONwofꥢ2q; !7w߭Üo8e=tnk@Gݢ1Bh" NC[uy`$D bvcd"o# F+L޿aqWReQeo=czٻ}oI^ӄ~/7=e4>s~?܇k4?| ?]OlbMC5A]6Q98}wX1b WL (sDu1&΂L*-xA05$`%F2#L"S$CoC_/RcH`Aex+>C)US7IGQA Qk"x%Hbj7&*:Pr|$hg4.5B4hPٌ?Ap_Z%#K(HS+!Y$)r$GqOsrD~`ZTVz(q[Lբ .UBa0)-ē_b0^N7B# %NtD253єh(\G6լbxNѸ;61ohcGwMR;aG:p0jTqsVMaDbEV7 a 0?vxG4J9hعi䝠617Dl[‘<[#TZ6 a`Ve_dUcHM|1I!i`.C)Xh uB.I2>А PPAڮ\'YA[ 9mAO%sA+@A2Ab y1 8>#:ֱqpэ4u[{S7ѫzd8Y"\Ʉ 7&=x=xXǑ qq,p y(gqcFw=G=qJA2TRoLӼ HZ rf.#"056!)T8OaRiFd =2yoB"n8:'D` q|n jrj& {#0\` P1 p1 |xl3  [2A\ȡz2&`1, \ʍ|xp2b28q`xxg ʬ<Daɫ|b l իˏ'  i$dՄV`a1iptGxؖmb1c6.T+TĢȹnu{ $d'M+G϶H|e'#^RP7RW2GzO&^*v6MCT["rYŠEJ_&>˿ m hh$gУ  bu|h 69P9p`GȽ1 Ԭ +Lj<{9 `k׈ @[q; v;\ а?pbgp}ٛ]@׷ -'ػp R"<"z e8Sae3M&s5WoR,bWV`+k nAC3*4T#lu/̸*;ѝbQI>wsB5S('-Z4Py)ƟЗ.e]ٴ犌pb`bmX($ ϐ!tm3 6C4< ppx+<} kPۘ UZ?Thx7}uoxx6ijo;.nBrg\.MY@1 ʗlʗ] ʣj׆&Mccp̟ |p@Xεgxq?o)ڼ1ʢ[ʩzĐ a}b.G4zڧb!J|x"q͓apy\>=Hec.k24)T=1 3TC-3H-ӷ,zOZ6nGA;~ WȯrWw[o&Ç.;vk,غʔis9_d;6L=nؠ  hϙ=Y<3dJ-\:wK. Œ>a$ÄK;Ӕ ?a֚`.gh1|e.@2 E}J:ʧz $z, ί>HP$."BzH0a3}v1b ,̚:B#L[FI&DpAޘ$L3DsL!2823z6#f"*V)hj٨aDC٨ )t`tшzviP身Id0<ڇY/]r(BZK&8x|k[ىaR}#F}xBSLЇKf\QYfoӣe;c"KPV.Y@׫[w虧GGҶ]GLDK"30qa2X,ꈳ.\5qmds2 Nnq4Ɛq$xd94E1re1^0I LS,)~)iBi1NӸEb#c>$=Do= alPJ_cYX{6HY<ؓbJ#Ɩn4dyE_(zcd:30U( ,XQbWF$c fQUc* b$~JfHj*m(iuRfʧ~pլ:"ޠ ڮ#!RkLbY#u#pO,M'8WÈOxS5YBj\8LG~a˳>FXd+c#f);2f_̒I\plCf6m,`5#e,7t{ncZmywaFoy6{FZK0M̀^+~ňnap܉lvTyiڙaÅ%0ʹJ3':Ų3>(NWĀ2dSYx5L.9R\SޡJ=Qs҇|`*H9>'0=fu,xAΚׇ;ኲ>"E4k_Hy]P[ؿ&Z&tŒܬ+^c>Zw=]+QKMo3Ʉj]Ж/^nHhN0Z;:P0z7[b}K+5R?u+HI2 C5M>#k' 4ZĚ*J'eA-8@ba82015e1 V;b!ChjTJT5b.L!ʫ"SP#Rcs~LR/یӶu,ZȢYFzDDj|8(kۙ<#`3Mc*8yͨ q #"95OdJ ʣz  pbsL4-CHrz#S'Eډp4`\FFP.):E LjļzK*ϋJRK )8,/19N~dI1ȁ4'p1<5F+Y_t ռNS;ET0S+UZpUf?Ic%GyJeDtPilV@DЎ"8 PҲѨ()԰0 4>̄RsL7ƔR5LSP/!!NjM.qUZ4+gSP=+ʪa/\`{X;/biVc(c#xQYEU0P7@`vK9 $e^dVvEM6=PK'dKIZDQ#?.=R m5eW'6̭ڕ:MٌS$UdMUT.|:[|0dXWHQٔ g`"#ӗ$ir ((4Z}\TD-xf`ӈΕBbP1?A(9SLd0ؼV|#/̼eW,9nQK`K?5 #H_NVtm}5fEcd V5퍾zV^,ʋ5]u=I}ez^hbx>v`΢䆽Pa,C]-ď~2̆[;ft ýĕ.L d@}0r_ePL_ӀɄE94XWӠ\OruJՐ.߿#I(肶P ֣ MXkO,Pkkbk>MekP(e`.캾ټ Ȟle삆lĎl=*FnmekkPі>l&mߎl k>EަlOVllȖDΞlmMp-K1( ϰQS\̐QE0˥#6c, fY0C@N#^وQaDYYi̙&̬=}ՠ9M7sD';tOT_sG7u2G4@1h׺HchX%^h4t9iN,i8pӬQgWC rH#v0I!ǐ@'Ѕ8Hv{72JءMcP+57E~HgN{5ziL.P!L1&wpqP#Ȅ#b PO@yglCyP5Wa MyPg-']bH#=zНyzwzw_yz/z>o{zzOKgz|gzz]x*1*( -uEHjz6&I8`hQХɑ0^d ahͪZ;8W}q Gr.g} #a%P6Ψ`1z z[p>}$8PYC&nԷ/@}< lj#~qA#_J @2k3dO1H!o3(RRm0I/ pV b$P٪fu*ڲs~U5XU~rLF @KXcQ&F,S&IRje뉌4ԪSYFeIϜY0ZpgSٗl˃}dL{_0ˡ|H}[BjPG B&ƍ5~= bTqݓFTa}84~_~UUf|)7TBu~Ġɖ}%t>H L&8(11 #=qk/$5s^-a}lHi`4A+58Zzn\Z.o.)a- K;c +^YC!wGDUehlֵg\5Pnð|ʐklλG>vQ0.4'aDY&Ϙ*"[@z#=1-cV0ivJT鑚jֽ6iDC҈b"6.Në`~CoiY>u! yEm[[Fb4hl2-b[<xM@@ xT5%~(k}ə~B_,)M{=ÙQdCWUOKZUa> A8r9ےd4yCT%T$w>n:$;EʼE8>@Q{ekY@APFy%8M>,72 àEN$R3Xz:w)H9YPEJYX1Gw9: x'5Pi2B1hH ax amm\)F6`' A% Q(mFA#b1Tv0k~Y!L\D-`n"!c Tn4;T&+1Z&X{]];vtP%tYBS>c֪Sk%{ f=Ak}evF;}!(Noxm)E=01TctOqA}l XJ(mcbAZ}r%]h<U Thׅ#ԊD Mkh#"q2s1Ć8@&Ґnы\Q30" R>ג@yWE ԫ]@Q^{e>az2qjpXCTט\AY %X2vE )_}*NƔc"2RQ fX31[]j15~>ג x-= {v_üvx^sWg*XQ]f^VĀ{1sk3Plc+'||ʠC1p@ v΅РvPBaĠ́0`g"K>SA Y2C)&D؆\X/p眾PTyjV;k%RwFK.%99|mx/lUD 6q+ו U\`ɪc HLp㒫dY9OǩdGҐAm=Ww+xm7*q}:ږS=Jy_=Sg:ЃNJҋ}QytӝvG) @7z׽ZWw=/ֿuų= c@]4ˀphImP $Uw*᱊5rdSG!BeǣbZ4~H=ѵxu\=+]f/1DqN* J`OِPd,I[^ R ".aXd9w" 7R(Ѽbd.=R }5|4hD䄊,5~4!)*%t1;OCLhV#F"EHNtμ-qR! $_H"JGmBi-mwOit|FxHo@ˁXLQʈUu_3FK=D|R"$B^1cZ%M[Ҽyij`'3)cT&)z2g*Nh{#y'TK(` i$(ͣƗ]D^3&J'(L%}Sn ~lxU#RrFT*Rii [_$N7 wcJg(-Q}}z"f Ì0@*(G/h؝ ]lCQ Ň[zz׷_㘎ϐc&T=̐6&rWg)emdyWѨ"c% 92H$UhNS1L˪ECא~2 l \DRnܕnꞮZnEm.ʮnƮn//sݑ=!9`Ԟ/RR|.N_uU +_TN\[ T4ۈ&X@-GXH?q&]N aAm1|B\>1=ԋwBS> + gi!E.e L 0aSbdR%b_ 0 %yjf ;-|JkN76H 11132 ۼ-h˵hjMh/1 1nQ$`#mCo+2 I^4L(~9AwWRգl=oɭGs p>lOb0sXɧěVD[7t `)^Y\TT!3Ƭ i"U菘uBk0 D԰plA xr(G/2!EoAeGv C@ PFD2H5 u-йQb)xa6$~<0qIס9e>UmK@gYncBN:nN Df.PP\SG|7}mHoɢeRq6<$0C ~Dv2 W CsXG`[G?(-C$oTL9Pqi@pCDIqhi )>Ohi(XIB@8E36 e`&Y9#7$P4ܜ#+UIЃx(Wg`u>p*c@ mx &GZiCj3 >އYc6(njZ wu|N^s>E:˷u{"@B3 pȂ W=܃1 V[st1P$@H=f؆f:!EB"e,%IO"2x@ e˴kiOnTfMWLĚb\qo@47GTGԪh bD|wWqƍ'\A hQ W25bLC}+ L1;@loP S蠡SEMz ՃVOߛM腂L߲eЖ)hQIHfl“m^lis>b0[ؓ^4b4SFSS"De=I\oЧQaHcы5lTXtkMMFiV7nq-W0J w%ݢ7C xnj$ء5fJ7mϧ&,$4`\MeX8ubd.3mmM%hbTysϡG>zuױg׾]y+ͤPŠQ:S&7 ;)$KYVX!Lfv b*+jJi4*&hڑ"F@Qhe9EGBYf a'2K4ji)T 2*P\Ѩ‚)>ș 1B4"P$;-%p}"@>ʴxIM@QSR) mbJ) A żsSlM$M4\WF)AM~L0\SJLlO4ڥa%B3S:iݺ,'"+6ֱҵ±PoC1./MNyK:kNQ5.csVI/t5|~-1L6ޘeۍnjAXLFNiWާ>r)j(2se3)}(s _/s#z ߵ2TH"4<.}6Yߛ4$D*қ Q`e62\zK na-Lwl>%Q" GiQP2S X/%Fh5T ]s716Mt⇰ X1 | =ᖷjG qQOYŘ&d4@Pe CSP"rYopTɘx 6 VH\,qʤ74h#mIUNʑ6BEr`/Sn`הRH\i&jZ \9A{y^M7[Wo} 7Ǿt;ib 8n1L!9Z 6E櫃a'Iz. ]@1Y&eBD󳩼 [`11(#[VCG8PQbTqp1]RudI4V3kԜéeKŚ*Wb9mn/JCA1lA)HUʓ|'ƥK 4uXPujAgΘ5~Npb˪B牁Ce*4 Q<_-7ׄa92񱑝b.>!/ h@1n@.b'ˍV3zi6(UeҐ(X&%jK )x1k8)10x6\`c2Si{TbyJEU] E-SKC!%ha2~Ud(Q(HWfMїړV,|w~ ʪ-xCT%d;U~q1T7yþ6Γv huƮb"24a0tT01/g_ ߲,_Ad3^g?};.˗~e>O|;OoO7EG?{K|[d_?s}~،Q{MBøPXk-5\Ltf2ez'wEۊ>0}Pp\ P  pz ɲPې 0 P p P ΰ  0 0q C J[PIE@qb./Nk`zƉ͊$+OcMQ1UqY]a1eqimdWd<,d4x$cY:B_8 k"DwP9ZÞehvAsĊBayX1h5VOjTorT^4+C7އmʲBrDZCO-Vk"q#\L'%D!J3<( Z 624m;HJLbu{aWm@M^Wvi7vguqvmWw{vsxy7xn55Z`<ŽT쵰#²'@jDuvN,"žg/qGpT7u_ }}ݗ~O~7}w~x 嗀؀ׁW8~>=X`t \C|vHw}p#+kV^imeXo8{8qxeFjTw<$h~,v&TmY:"4edk˄4R 12W1 D\(4|ƍhhhz[捛Ze\~ƎXZXyCy9a'#1y {Z9MŐEy1 &;/'Q ,m R 79yٙ9yn9ւZ < 1X :E &A! `L&M!,cjw+0,l"&{XR}Bjm*,nGmTtĸW…)j)"h7pjˮxA6JHީ&:,b̂-BUE4I_8lhq04s5.K6\8R"ac"j:Zzͺњ:aWh VPY:&p 8{+{+ZDI¶/:Ѧ tt eud9Mlj$QbE-"dmG;%KxԄ+ yh1@7X,׺uj|NW`)솠*׈r!R%JO$ jv,eB]F{y}Xx;{ؕB/*}7rJoH *pWYHP: ԁ>, b"B%!y 7.m\:.aSniDr^HkEʪo(wG6Ay3{wl9oɛ(LoKliW7TRt͈S#In@UθpFqѲ}6ڧ{>\Ya=-  ]mwŽYBZ Cc]KY>b:nvjG9Hԩ'.QsDE +0Ӵj0Ē[ nf[Slm\`;CHiУuƱ8mF=HH]tr]iU $3asg͏s|C6hJ X ~*d~%^K8^;~=~F~"x>U@]Z c 0Xb%4 )Dgjl^DԒԢ$$0٤!7.zq3Qb|u;k"miVZ~Tĸ'eM㺋{c 䊼׼}S-EH!Ds5gmmwNҚi>E׏ F,˴/tH1bz#wNS[Y?WiҠC"BCI1v~|_B#y?6P?[lPn}Ϝb$;]Nuc?CUa: c c4V÷Bx]B_z+} SP_BmA){4,P E4YrJ4j,޾e3?t hŔ>3BR'ϒ3#NYPϝ+6Hu͢@u6qCdy|ըÖn$ OKyYB D<2,cB4p:jE"q4Oɰ V%[CMRUQURTEIk+yvGi`yU~G-ė>`LQ[uWl?)3P( 支YR[AF-(/jt"Ĉ "$0PHa B p P,1,")xApFa!goBjh$c`M CСV7imhI1Q@_cC!Bc)3LFKZQF=Mc Ӝ%{)B>&^pox(l-Ey$P:'~5[.aj7oj&d 4@,Q Pz e%bVP >g >S#j؇0&@Ї2Q Eg>vT^5?څc>QM6ork>y>6DktkRN$l a:WMM#=BՙfUXd?'t^%ܵ4ic[%omThR5?=&6OVg.D~m|ŢԦO˰03 4`:lu*<%1 ^i]'+3,Wx-F+PM،/} R0B) @ 2Ztc]1uoMH#h dɼGD%@J2FKc}li RE͒-8G:tK f$4uwu7* -3MFn p)S*L%/ B>5Ls5QqD'_ j^)~Ox3Ԣחg[pn;!~Žﵗ^g,+l}CxMpU]B\, tx#jU@b oeĘz;*;YFZ1Az | F)q "cpOTdb`"% S :zavQ W2xQW&ZfG}6j% `3X65v@cDfuhZh_G'f`b7uX^}h%kuO8uf<[e2,/(NLA[ K1 +c&Lw!5(r;);i#!9ő'@6sNt-q-wq-2!-'%-0p90hղ(ASDh=l|h|X׋B8;kH&|RѰ :"7 E:b9 }U^Ā03 w1iPp/xbUp3;ETDpPs h H6TEa \/%AFhfaF a&zroB[VT/4Ph0I/06XJXtahh\Ǒ}V(~hЀ6Iz- . yGʶ46|N#R#lr$[hPBWt"Q bcO,QI3jviEN;M)׳ 9N k?r=<Ca `r"!['h@|6a</暟)b[wc%a8h 3 D wz!ui߸!]6c`60S=`dp& )a<ڙq@CY4C?Sw t3s$qtz @ 6FءfT\vTXIy%Ցs3h%1cJu2zT( W:E~ttC[niVIf-'vC(/E); $x]c3v)y)rٕkF&F YtwyI҅[Zږ>4>'s"R$2aBV $DSq@-4"8e.֤'`K|`% (Nv)#PC"Y`C,p >s*Q8EJR` /'t2:5 001opYF'~A%H 1 Ɔ$OB.pi<sPba=I?$A8vwؔ?4QO$S;XX(GB\K,m3'W(&!!EQ3tĪ,4H6ADS6|ymG.wbC%v|Riyoc`"/C::#>֚U87Rx@!?3*Iw9Xј@fm  VPEZ< 5vSMCEA`L EDrAUyQQ*Dv|aC8S ƉfH h9zr&d1Qs]}c[ #&"jXx3zeh5`JՇ涖_kEagNc/6uW)9䑮VJ+χx>>ҪivGzGsBR:p3"k#Po ^jKIєw3UFI5 K`01e. 1ƧMVf;App'5c #:^Ņ+; Ę}9)t|h &0 Q: h aF!3&{25V-Y,8L`k6/Yiy6;R;R8+k8Us9g)A#3u`c8T<?ՙ$fwQ);j*'l$j²7JѤiշ l!Ps*b#g{d.[e5VI ј8T[04ieZL#K1]i KV   \DрS1 gh*i\㔞c/Jxx:@ [P:baiaQo m:߄ (1 z_bdPW,\h @5[  c)}"l;ȗ?a9i>;4ax0;g3~yBǚmΗѮmQ;2 yι(:c]aBnQ(jV@BKrpe֣Rż Up D2&S]=`5XER_0ZwA]:aJ7]rY7k sRQF\XfѰi;JRP@/$>Õ-P#rӺ$5MP7;:|hn/Z Ҍ#1k1|]2IEgZfBq$DTˠLBXEKC7;-5ep'r1Y aJ >@&P,t`u`uV{s4>b_`B$ȿV+}㻬;])9'>Ӻt'L,::0EHHkE*矱vk9'/1qYHEgH f&8<̘sgjvTs\ et7EOR}NyόczdPoFZ&u_fdhPxECuh#W?h_?N  !c:zÒ\9z)IZL|%tchc/ & _|F\$|8j:֡:@iZ4[2e" 4pfE5nXG)S&&ZhR^KD/KAo*7b(*4pi8P eB!&bxI ֈ4z!$HFBn1*ԩ Ib2QJe"bQFb )aJ./SaR4sJbs2JeJ/,1$OB}$GR3mF\R=55I\KTQ]URGMMUi0VL4L^sWTQH7IUL4Y,4ĀaM4q10Ḽv{*zB\0pwaХNItOKewc~* Ћ@~՗>o@|8 :PBɔJR&je8J(t=lgZ$@ bX([P&ǂ4"b# n)x'}BJZ (쓼T BW$}Ô*[{Nۧܖipz:l3[([{9zrFOqO0B3GhokY^A`&i?Q$e;I8(o~ഈԦLe)ꍅ@kyNXL ѫY4MTK 5VĐ"4z4Bi`xF 1'Xۄ2tFxQJ_̤(i "%| eĤ%4I %MSZBԧQ}jS"(LSfPYPj/ՠgUkOVe5PSSk\JUI*MjRvLuXLեe*WBnE~zX:ZR*[ҢY6bW3O9A-*g}ơ#nY6-\\ B60lkESqR.7XsQ+.sZٕ2}jwC9BeAh7 9Nt{5kil ΂j07z2hTȆ>"F$ 21 $i$J"u던\ 7ɭcyQ_of>-RP$ [ /m# T:!{fip,B/xw`'ğt=w[%D>4,Z 1Z(i>b)Cx{ZrQzzY8eZ&"8>Љ^CԞaZ~lSc~;ff_rUߏ/S!X"Kˋw19d:21> 53s9$ KA1㚹\:4/{ιA L!6K1.? p"9<8k:-@56PIhɗ:,5 *8cq<)K;'ĐT>h:c#3/ҡ"[:ӯP/7h:z''N>K :SGa˧GuܸS8zq? ѹ}Fl;9K ЃBa3 a0Ҩ!170؂01 &A ܞc웤qa0ˍ zI W> P+ {AV?ǁK:&-gNSƥ-#);ۂjT82;\ S48F2Ƚ@  J9^?" sFad'/0jq&'cK@hkCXDv4}80X!hEx=!T] &Q9F7t`DdW 1(@4L:>lsΧ2dO|ILz G,>:L싯Y2DMBiEdcA&Z|Į b31PЋ4B 7B8TT(OK|j=UyM|uIӬe*OxG*Nc:,4 1жzX aڇzKj8*'dH>|~#L:9%m[;9OUDz:{i@c^K^{MMK 4FJMA%HKK'aA}99D 䲿O6HфZ}X`ZedQq$ A`1JЁ9_tSLA9[\`g22Ha 7[ isa-G=PN9 1ue]R;ɱ3U/23MUI^U9ʌ>@eIqL1Kzgt_̳ 2[f vW<=G]ʶh8*6Ԯ~ q;oJ4\cMQG^ [>u0,rEfU=R5VnU2F 1Sҳd($ 7* "_>mmgrhX}H&H(x^}-rvwhhZ0}hhh޾e7OFdZDcZEp g&,0Zd\NmA.o.5g%Ae#O}d.-(JD/ .Oz`Gb4}fݧྸך#ARt؎9$0зEl]mᒥOsɒ;KW,Y7cFl P_2eĔeҔ M}B ,ŏO~b;O9ȯ_7}:vγCwOO|x̻/o}>GWye@>Fdr2iLF]RXs2b$6>K,2ԅ`-<'c[1ңJ4Xaʌ,)p \jJ>\@T3 4a4>\xB'=y ZEMU T•T\ı%(lyʌʄ2d(dmԎKͨgyE2s_*wiwi)&ji먡8j)pʫi)3g".ʔ⪣8갘2kҪ&i!+D~ER4.._/Wk/0l0\?p70;q0 WfԮ*([󥛄O b!C&C!=bd2}MWZmĈ1_TYc5T; e(T)H(@cJ\γE o #C$uUŸ>zL$p7ĥ>0Lp FPX MNDOv %5W[y#HÜ4C#\r ZuݗXnA;`zaגae,kSgծbu,L]<x6BևD4VpFH7*Z>Ia|hb_C]:FvR#GMJMR$v@},# řDnˈ 7e"fm%A!ˈAN U.4V"mD5[9fTON@˔ D!D=b S{ [Z5YK".$m`g夈ẢOhOĖ ^ P+MrQXص1hj,Ω7 2V2 ).驌L栖ySoYì.mV_;g/o(4 xEb5*ipG)OW$p? GDCa$na6Ԥ#K۴bzh$&xYfi Ȅ-NsqR:"}axTI|RJ6\i1g,q^j&o(IF1ATDmsM1xC˛͑ep;EG޽M,A6@-!TAͣE >F-&t-^ ü.ҋqE=¤FK*˂w }h\؂9S-?lZ |*5m?G021kd"]ߚr&Y]lzԳ~cUע>U8_,Y:=V_RnW6T}Ż:]hڭ x:Ք,w3QX)ԙ(NDc}Lhxt-HSFZM"bAp`!ZH#%K!i:I3}qJN켶d~zjx1?Lh} _Fk^.0<?R`Ќء)i=\AE?5CSF\cχAXO\DB\@N=n$T @& \M\ _dOUPċ `| օ `߄``EB!FRFa2! JRZH$eIBH$H,6=Hކ(_ӌA&0 SDu EDyB$EACE%X_Jy)kFLELWI]yauIb=:_$X1"!OJQ1X)Iuc$]dm M҈Aa@@@    c>cD2D#> F@>@>6G@Z$@GD@CEΣ?*$F<ƣ=rd<<$NIdBF$FCʣPc?$JZd?MOF#?cE^$B$?&;W.WL*P N40xH`M$MjHB & K\4Pl"I)iX ubq#/6'#GHi&gd$U_cG\"- 2nX&*b_b*]bdR0""p g_5<*+:kBJkRe\"у}Vhi%dB$C'\ĀA &kѦ'eppN'z~nkঢiiIb?j]'ԆX^i%Ztd& ͅatT,9eDl?y\2RvjG^ !]a#_Jƒ^\mbmBFXfIBn^vm#R-Mm F--Vx>H٢_-۾-0ۂ-׾mԪࢁ㒚Nm.vm#M֎n-nmZnVm؎zFm-Nڪ-Κ[f$ (a+졆h# Xnl>A,rlJf:S(jdFihT&vҙR8\/\eI*],]4!'\.ƦŦʙoڢcaFl6z)h- )H) F}&g*::I (h pڰ 0 e p  0 #q ##{ qOq GH! #q OqSqp_171cqc qǰ[`h!ȩ!րV $Oȶ  C "\(0 ʹh񦤾iֈ)Մr0ieϹE&0l%2\46F3uc?52_ >E@UaB,EaE>0Ԫo4w↬r!֎~V e ?0 n1.0@#H8@Cndg]4B]1qDFBpECH!#AC]vCO􎺁NM4Ot0tDKCd+ϱ D0GG1QG 0^ &Ԇ>. BM&Ȁ&ϣA (C݆&Yֈ&|́3)\,3UtBq"NJ1rc#gicdb)E\fO&oals\&"3.T52fXfㄜ1*ȁ9B3:!&'W$r&$ssrMs?!St/t3t57tcD;7x#xDӭ7|w.ķxygt+7zcrscw|vs57Wv߮s7z xv#u7M8W7xGu/w˷0|##+4 1D) [\{2`$2 8 ~y븏 y9️> KSy#[O9ce;Mm'k/*9yy*9yOky[+ z+'/zjMЇ,tᐒuYSȀ :\#RHFQ rz˺hzORLq {jȥ&$m܆\(m \^Ԋ${H\{;%C5%;#R0{zLC;"1W:7({Wz!wFڸ;S:F0|{{*||ou6D=G>S=CC⳱Cn$Cd¸/ҞZ{y>x"{%γ">5rF>>r˔uZ'>rBR'> øS?[gk@>uK~>K?P?n0M%@b>#J)U"}-SFO>1LweJ+Wrd lؐ [O>h#h}1bqc4zЖSͪTYVz+ׯZz,Yi5vl[zn yڭW(GkRT XV;ޅ[w_zBr mse=,12eV{ڴs&E#Jo_hEC=i2[a߮V9Ԫ6QYǗ(=zb>'K~xϓdDA)"{O?>ջ<=<ͫ@<ɥFMH%*J9BҡNRJ)C1QBu 9$H(CXaVYJwM8Sg%WXU&5 ԍU=[EYdѿ4WL%[wk{Ldֵ ]1qAAҿ_G{Q͕/<X"M4,k.3XʘQrI}$ T)U;}T)M* TPCuZN6X~zm-UUh-}tlQ'U5l4OG3%Rܓu֯n9_;YCk`aR 4ȅŗΟ5.I'qi묣ZB}5s/'Lqsue-v?Νw{}=x܅{W>LKt̒暡D{Zz$rGulkT?4ks?/S75RlKQ4]KpۭjWSȘ`Q+j$+etDQITGiUmRZ7?VL]ҺxINx&Ibz*NWػ,&Qcx<}D`*KN ) 8h=>A8UqDb(J&?Q X-a& lʥ֝lc!8BEj`Y)If5*JU_rV ^JC)L’_!)Z%Zl;lJś`i0 \ 8Nw\'6.{SaHzsw:"zsB)k%;8)QtnugE[^3 l $β7G¥ OP|ST^?E2t~z_xFUj%]TzPĂ¥p*)2dQؚE94fIz$ž4*4-iZ Qp%/ hָ:^4h,͂nd;&6Y"vvhλ&*|E.nr} 3:ڊdgiS(Ƴ-j Z 7:%UTnmJE#n(^FDsUx@Ct f&.C}dOS.rb-TH}Ur|{&$ɪ(F] 0s HMÁx%w?2۶gH)ZH%muݎ*YeƾqwX%mWƤUg[~V [r%!ߖɭr9B[>i*sQjYrMNhQ*(( rF^%_AD%_9*;VDʴ 8 \Q*ipDN3h6t j4!Ǭ&}ڧ r a ӯZTpQl]$U%7''OYFr\* 56=a6 J 3ǝuޭ2,zn-t\;&[o &..QQzQC=*~=dXcrM-9>,oV9a2k-+sLxEpKW q?tvtŦ :#=TN~3S0\ô h7ye*oy |[,+N{ǫK=k&Mϻ y:dwz63wb;3IY&ˀo\FڽʐoCoI$IHN zpv-Ȓ)0I*' |ͧ*i$hpf}bad u-e,jLhVńPXf;!r"O׾m!XʼǾSl;CČs4@#$lnN'KX*Vi֒mp#Ыk*p0m̯[$~O4 oFڎ|dI66/6d+6bE"bdC+<1x jQ Im`pv!a0 O9hؘnlQvfX\yLſ na$NxI`p ҐżPЄveHE `4$#\ 9AO딭W)Uf:ۼ儢FHƀ،#zNhO{&ap@>J#!}N'G'+ QFt#"HԔ+T L(eE3.fZL$ )'/86#8@Z&%P6IrYD\C7KSnR3b @TpJ0ap b0?A*'Ɏ/e:B0;!)3H(gM䌎bS0N+d@M03$S+V3 L0Rd6B傲cЈ͔A$- a4v8;9G S0PihEi OSҌF)#h *Fe0%J&! r&g(9E6:j&"Lk+(.~f+NDm8W ,:uhєiFS0Qh`*L-XgWU ,FCI1kVn@lP"/4S$Rgrn#p )C7o?IԘ8lتM`L!ԠPc`1#mɼ, &cN,lvE*#MI bwAQA4d3y(Gs92M`P2AITʔz (s!6h(%}F#H4J$%5f g p*ͦ9QwMt PdNFt,k0ӞƒHs,Qj$WpN쪆s>u"W<L'!/;(|608eAH9g2tc6tDO)n7Cնji""}te}S*Or޲aso%67i0M7EuX}3 lmp0u:/dA> NAW7bPT A0)AN0M!tr`J!{>"<􁺰\%fZ0A @ p2~B# n(X(clCU(ҜNjQj1n?+`H9x 1?$mN{H% 1*.*ШfrH]cd9|Me@-! SP-v+˘9ϗwRP3-a%M9B0S9"(Ds$p-d3_QH9M#va1 8WdZh(Gl,A5'`bN29x  !p1Ʈ,lN|&"(va` {bf .d@n@iL3uJA8'O}%l$ %LX oPO;(bH#*Z%TR?[7ul:ٍ"ipܦi"Ru.AbO6Tv#LhQv!ꐅho\W``^0M=6rbnDF)sB9nMO-I1)XrSSPRp[Ҩx jSء EUn/j $r9 7)PO:39G)q*0TR!M"!x*vAqfs 7JWHlD$^%AY: `1Q-DEa,4X:PjؚÔM' :DoEpz̔4rU ON8 v_ Lj'9dȠW''KHCN|6Rb 6 8b)\pH.$t O$+dM4GÈէהͱ=j]b(s|* RZOEp ,ɕP&?!-MMIUU 6¤FϊrhPS?μր΁ASx aalUP |QS5q.j+n[nDgnRASI2Aa z'fC+Ptgg3uŏK͗Ŕ QѰGH弭T6/Qye ٠B_Qև竄sy fPZ΢[#+ Q$h(0ڰ[ώ"Z4MDuc1ZAcd  `KҌ~oWH)8Q'sSc=0jJD!)2di=àKI6UEw ~;EC/ugnr^ hۉc] ,]^1jHZVO:e:8oc*-q@z3`V@c@Vb$].\?nVo}2%.:> /gr4e l> V/@Ec5V7'7ҿd8&/3Thd3,*j%ab"i#)I%Sǯ~VDȁ08nlWZn+3V9FRޭg^Wi-3{ D}NA*E;5)B &! 쬐s%&A TV@ m߉m<ܸWt>p?XIAN;~7McIMAN9 h1( Un*}xRK@Hr pM𪊕d2} [o>em!Bz6l^hTq_=}<6xdHdƒKBP'M>5j5RDK.,#ǧ29֣^+XW=bkDyl"SM4̊1z]ʈ2 S&&ͤ4;S^ͺ՚d@ VL41b֮ 7KD(цT6סR. 96igg5?7[~e;X%dP~]UeH8qYF) (f@EF@i(cL5daNicsBV\jux}[ DJet$cOUԅdBg``wUR5vs9g"Cz\fJ0ӅA_59uQsNSO]@^)G%i]P!k>Tp 7L&ʄ馛ʀ 0 Ȱ=XpjyY=/)_q \W"jx%gJe%֙*Z#$fG+VƢ[m2HZP2`\ڗ:jݹ_4I(: nb˖[d oMh}lL`X=dw VK(\gn$*a+T`EKMֺ٠cz22,+Њ,06ceTE :0 gxn#l5Xa_x4$dӃiq  pr1*SLgdN u3rx>&W`9{$AOEb= 'lz&K~\&a!sFU8`z"^{ȻY9d( tc OYߝIUŌlxEgggnB26{R5lFdC?)kg뚝DTL&~rT'Au%J T|HE2b Ӱ턚" p 0AdUGb3}/\3Je)9/ѳ8X=_IZKkYr 㠹HqET܎&:mze Ұz)sHRڕA$-Y?MP4_TŢƌiKHqPRFBG`;]$ G`3AWb=l)LĜ8kي˃C?mQNWzߔL\aˮ2L)IùtdF2 1poH bCȁ4d h@/q;RK;SDF& DJ"vxtyXLYFiz9rYD)_uL" YKL).6yRWD+E#SXv@\H[O>[1T~R^C3 *yhH%5(+(֒g59zGV|f+4rhȔ>W#rK*#rI"Օ^WS` >ctp`&AFN&5S8=g lV/ Ю%xM)4MMZ:5JQt@.'!Ѧ4i;P(@ P(#wߔ& ^xox+Mpw-N ?l$L~UiZiͽ*J .yB̎U<Ǡ+mhdB GF zO37?"bwu"ZЪPiEc׻urC0"]{1HK䱴kΊ5,ZX1fb.F]Yg -IIQAB#8/ !*{Y+0 FpHH]3 | Fͨ|򄴶&(qp9-iPDnUEh UBɌ٬4]8!jR.V(g>M-8]}3\X L:* ۞$*V"[jU+{]m躣ɱA>W=Usm5b$WG6ƮE!Nv5/F3IDxP.hS!4]ը9[ƻ=bR|s7T)yYmIZlGhśe<)T=={=HD"yVm"r])}^IN [frSf.abSQTJx}Ux&u<>[fkCRK>!{au=maQ[$Se2hhv0KmQFE!294==7"N3$u'r,&=>XL 8 a'K"["b0bbdU!-1!w&5z~4HeK7,'V'7Wxk|&+BF3ErD#4&6;_[u=`_6jiKYCA$sA,FJyJ@H]33ghjb!,tOk#q$C}vc;y&V!D&xiVj!)i!Ii'i$)vS,Y56ْ)I/Y+67FK>I:GAA?i1EqiHٔ.I8ɓZ@x: n=KEG`/O!E()`6hH8WQ!r7ql@'jB#PL_L)>lOcG8O{/UIp-OPBTyφU#%]`!]]Q՛A YiÆ!?2 rY|Yl iܹ)U5ٝ4 $"GEv{>d7z 6=ցQC Ae)oR)(ir~""B0;9QkA1"Q9<#QI3fM+@G,&:qfE(WO'`>iP (؇aV[ M&~a6@+"Q͂ብՉleI!#>qfe'_GKm2RetCtdt^rt!}I[3|y!ϳJ4:1YBW/AE;NZI9K{B`:7UdZb r7ց_.f< 5b)oPT#T=մLt؁d}bh%!hSl0S=gag$n'vآR2Xw[2X6l'`(iUKHOtt A dJ7%+i' |ZtbP˻j6 R+BHZtQqs5]#VW& !d!_y {FpcE٣\QXi mK$prPaA,('qLϓ ,nĴ?" uhEwz'?9ءfıKq37OۉH î66\eGK$kL@O#x=<c3]#;"yoRՉpi{. ]CE" cQSd">W ׂX?Z8ɑuWHx-?=&3-hSvU/)V!v?l\HZc@ItOXêqgY`ڍL#!bsѰ5UXoCO3@xQ78yQKz@h_]|9 6nBȦwKg.#I 5̉y7bE0WkU1 P0W`XW9K0ZbPBo p`RJ/5l|$\O#xT%Il`)>DXv {d%޷0=HGå   f1W R( 97(a ؋%ѫ<Å={ZЬ,rw,2s 4aqs*"!{7t0ˎe TQJ\ƛU9Cb#2[vp~#ǞT/1KlZ(s9ڤs͹ާ@&vqkZq"%Ĝ!mT8{ɑ}O (p ~SA5xɚ' 12P2\3͵ZVZ xQ1<aPBRZ;2Ir`m:) ky?/ 1 W!N祮ëQO aG|J]KL7ԡ`Aī_i7Rg (,w9<0< 2|Or*C4;BFƬz_a*aːz0,@~{ }q1 Kl 1신ѐ@ \ 3?X0+=:f9_[4ci 2 3pZ[]+Q/eoǂ+&z2مZc, ̩* Q_S=u]N :2 ɰ +t}mNS /_/̤? :Ċ4`o!!A#WHs׭.iwJP;oۻU` #$ f$dEJT1 Q/>zٷo>eCf„-^ĘQ}SLLEz %)W}JfJ2Z=}X.T/ʔ ԉsYǛ5kSR}3*fVFYjXiGIɴڨO &̂%m}hU`h@XF(}[B-<%\hXDKN>'i2]qqahS0m4٘esiX,-K#k۴2 `!úS$22( ݿ@L[<0~TۇPP2j K-i-'l %Pxn4!z #!fgbVB) ?˨#H. $?Z2*p!Ҧ n÷򉺁zAa)!zBD +KhV'|SL3MzѬzBQc) "E\Le3؊zmo,7,$MbJK3z:`6>@{g`uoP$0ՏYk9<:Kj08VEI(L룡7'C̣0'g<:1'Pc}FI4\(e@LC{5j&.#)lw4P^.r,|9c>yȹ`N .[B(#갾Lrhz$+NBQM as*74j &86PVUS5Tjy%[I.ެ1Z:+nX.L`/B+iB(Y><}*\'$"Tw]YV.* hCgV b8Q|;!%œs2h#KI\M4py,-,,ye-LTRegDM^*3}'Hy.P&hC2<I=1A8F Ոr -@;(rX^Ġ#8N=X(2s$fXׄ0iUZcHĤ +Oe kd*  F8M,3I,>TEqj>a KXr"4d*bHC&Gńxɉ¤{w*I q%O2B}$YR$4F|M<ɺJJ쑈3Eփ(\`J A@Xk栃M~efAM *!S^02dTgf7qփ3}$B'P1&"aDrm:a&YE9+[>E/yr7#V!$BYY;AA:P6ĔcDBB4LdTHD$fϪԷH)>ǔuPaIBГ,SUz gOeJ⾛)MOC1.2'ɴ/EgIp pKUc΢Mh"x IeԐnKI ,/Y쵆BD右=]{bӯ|*TNضxif#/(ce(^#\HT֌]5:YzJ; hFYnbr Յ׬GcU=Bm2WP)3T--'+( EM]ji &qbm6X%,a-lran1 QHް{#Jw!dtVze$=9FWv)v ',na7!͋-+x=_Uĥu!_ m]`z<' -Cҭ|>TQ}]Ų֌"%%^RE /h {.! AUe 70~`yKx<=[VԌ]{'wjQOk QVe{`L7jtۉ-!aN9wDk{;6ZWgXggHCgF)E.JSLLLL/8%+DW6#nd9Z*3˄59^%,λK&[53.[qwyra5$ $."AgRJZ|,JP$%hD"O+c ё8 תLrҔp OptrĖӆd W[TkfɼYu5ST7JؖV4(l!3mB,Os"f>oY|vI((elba(.QLX%E!&:2[Бj&sMKYJ:YѤQ-Q-%RU %1N’#R e! &R*R)MR+R )"ER252E3U4EeʹQ0ѽM<,n)P !z@:=z嫭Ly1&T93⿘yς;1\B4-"`+T>E;\yL$q "! ?hM9mA4A֔Yֽ z!֙Oª sJ {ZWsz W0BW@-šk!ҋ0Vx`aumWVxpZA.[sV~ q-!E8sXUW؍لV1B/A,5MF5̖'2b|ْd ƁC87Gxê[ASA E-lFZUTUY4Ź3II@{ر(KHJ?0['K[U7D2BZ@Y0!&} =0mxE?-͌;9 2:q\:䉠:551=ݩ]-jݫ%U4\ 1Ӳзn)Y9iY񬒹l,rNHuĵ'ñ#%)Tz\O</S\CTh:p ZOD=>34E Yl>I,) ʡɖJVLʠͦ͞La\I1 MNlaj7a&b.4$6a4%T3q(ޤy$^ 1 >B`|1 Iϥ0ET,).kT-9ΪՂٖ;ľT)=5{ryd{;MùJ(b H͓DdĀܸR+pjiHLb.ۑ살EDF;Qd( Fy*lPiNj~ۦ**&ͯ*M-ԶHe&(1l2^] ACM ?J MTlY>6A3;_9[5Ԩ:$gnh⡩gT%?B e.'rna#n&V lM0 93'ksTEU/f?Ԏ)ʙτX+7Cǃ.+b⺋)<<<*ׂ=*wI<FǼ4b0pn2yJSS1&ŇJt5~j_[#k٧b&0ѕڤx #;c8+hCm^x=y펯v( bĥ4n2z?jtwkmZ];Ty=FC/ZqB4oKwDΦ^=ƪ*dDϹB.Gzz1¤Ա zAUKTޕAE[7tvƷ<LVy1r1/ScI羔myS<-BnT|<'Ǚ`g䞚w?Gc7_nƒ<U;{moY߰O !?uS U !-!d؇3q41(oCj3 dv2nSAܻQ$)*Nrz)۷˴}փ&p@JDPChrƋMhRƈ,DXf3iIOQy,ɄVRɖ8UodIF#ӈq4r5I#.DOk״jײmmI>Y-ܼzT}F-l߹SV R%ͅD)R?\iQ)LEiWbL*;yS IeI`SF ׁh<:ܔ'E(rfǑ?#|Ўc(z-s=u %8Ո &@ΰ%BWg1SH;1!;9$)SѴ#C4Uci,G,@U! KW2h4G(Q RrhC`Z=Uh5LZyxapa•%Rf"FE\GXՇI4~FQdTcrF~qyE؟E1Yy4S3|.FH nTB4zt٪juTPhGRfFHΉG1>a0h!/FD'>ic)^R(jF1CAp2` FC @.dź#*"XnH?xt' "wζ̖V. >|0!2Wh`[`2^n1!A2q:Y"Q?Eխ8C#2S:[mo$s[) p\6+zvpD4E@?7$dd]{>6pg 9uM=%H-X)vϠQ=o]LB.X80,d#qMr ֪N9&Lx5:c8o(Gp-`lֶx*&""1N%Qhu5H=DǫHŻP%9keivJ4`V˓ ;Bඥ4 }PKŶAш84Dr;TuB(V/~JTh&o$4Uˉ\:􅢄B$wug5LӋavQdA.CH UiB\x$AX Yʠn$&ZHYT1#GZ5'u}>$]x{*S-Hv}눵' *_ܨ%jaAþƩA}z?s~c iPb_GsS+-3vZF g~'{YA&= J Fa>Đe@AD&4EᎎNtPJ6[Ldh^7U$OEN:DqUI3x~-VYeq6DH(.q[qu"-Xnw xj6vpЭtjp4}9!+g0Ce螳+27c ڋm:er%yZݍ_0iT&-hp:С"T]%dp1=D8n僔x>I ~NEqh(#򴨩#l(R줚u]z htIbaVK 3LDvER|QD { `F412[gC@QMP!GZIghD׵SzхE BUʺkUt`֐ˎݙM`y4`%VQ9dNX˔K\eEdߊMDE2CV(-^X܉!Ux8S{\֞4QftTN: |D!^d yiINkM]l#cʇ"4O9 Ĉ aZ[cGz@ܢy#˛BTg4f5$PFMSa"1L`eG=!:}ʎ,yl$VS=\E 0!J k%pP#v,? @X:p*fM] !O@]0'>AGMny N>-Wnv,DVPz(c^HtZ$,Q>q؎ԡa\lXt eMLR"rIȅQt]XD%E$M@Rc nxFox)Vӈ{NV^^A>lЛyQCBHHN%!F}bu騂F|NtKDd_ʼnXͥ_YJR9V<]_-J&b“HpsmF'6\O3Mc2glSgC e!<'IbenVL>V$fM dVcqetA 0C&'ݍiϐ dɦVMax>1 J}p|N@rg\`UCS} vQaf~س'd֠Rziq=#Qbh4ft~{!ˈRn,.zhB&2 wH꤮RAĒ ̦ [t%g4d̈xeMڻd" F\_NG8XPjdI31YHHM i֪ӧ o'!ڪh *D,gz$]dBLJU 2Iu"x#(,V.f^bvAȅNa%򡎬-\u0Teb7=|(]N۲1*ll2T &,eCC MD J<~ijnGfi21" k - BbzUc DZXfMVВ222lBC.CVkBkZ.(8W2 ,Bp(?AXb5 0 p 0 pbÄ́p1 oS Y?1G1'6eޫRLޯM䁈.MRrjx$Y) Ԑ"DҊX`zt_gjIJ7@!AXtG,>eza \?D̉jED֠ER D`ziVe- \V] -~&DMc<q^Ar;аpb ߆/rr0#lqnZX-c(3W\hD:3{ cܺ%;p'#Pa4.j)N ;s<.X 2)/ wRTjF繅} M}y'&ZayNaCtD}06)h"2ŔV0cM|0OtOZ0֦.t Q R&RR+uB5H@uR;5SGUSSЍ8VKV5YY5Zum~5\\5]5t*WɸF(w*vާ+L=fTc0mܲTAeceg6g[fkvgcg6gesaJ-nJ"qZUS: >Rq'Xy` _o aSlu\`DT=ἝI\bW\LP57A ]XV4MD=~|$L7AF~rw!y3q ݅JE`xoxUsx7 :8xGcxว_!2. ,@1L vV>TJ(ڶmNBǕdqE/ۥ(Z*-[ߊ&hB*>Ko}~bm8a>ND!`H޴!͇Ye \{܇&awihpgzpAV+ 8bwG di"sGMPǮfTYdf! צFȫ?{#O_[5tm t^lG5 $>އ04ԆL*l2ZL9T* %(Ȯ   1( LChz* #roC}KBJ$0,2+M [ϪόlRG +j *l8nn䈬+2S$$ԯ!D;+M1P#Lb2(?HGem9L- #5Aܮ*H(M2LXk(E*O DO;&YZaAUFi*R>)$[ I־T:TA<4PUgEաIzrtR`zXa]}\X⯎2`[]ɤS/eKZ$\Zv9TLh e2deL(AQLȊtWZ5V3QFH3@1,ڔhJiEJX"LLIRRVG:X `-NSsE&Vf#/)΂Vu9av]e(Qɐh*UCCޞBYG^WЅ4EHp642\,|v**z*cN ~͌'"ƒL"HEΓHnAki܇0ƥl}Nv =gISR;q]˔e3v*O>ȑLdX,QYfR&O{ܛ12Qfz>}$ 1h `( (OCL#PCRRe£+2 ]T1J@$SV0ĤR){ګ@]ćAⷒ bV) 1I-}tϵFZhY>蘔Ы.[F9O"%*I$yEt>9iboJU)Jjz܈ *(k=~ocJh}c BʒCG92DC"J GR4Ɂ$#K1 ={<4GY{Yil*iTά*m!* 5W>K.KW6T)f!9U)L_ǖ)n/Đ޵-%6,5R8|Y`Ek\ w(Q1 4Q PIZv; eKpҊ+ nvL,# Ŋ Q*h-0ddA18@хF|B0R0~s#0PƂ vBMc a?})U,R1Y9FqAjSҏze k6֐ VS)7)d\QGF[\2$X5 ZQ7zfZB'.^KZJy{Go^,l Ix{0I - wdi\P&cħFb<` "2)#tS@sQF$~SlOI7̸Ӓ>jǜHdP,tǡ+'7$"4!y۳ACyBE_R̓H>SBkcd"noRs$ޗ%!"薒' ,WX;}-HZ%?jsc*%[76s!yE `0J< ̂t`2h2~$ң#p*c6A0bL+<Dz6!^+lAl.Ȅp.:feІ,8C l,~(f|& !2  D m᪢ࠡ"vK"Bp@R!'Єj>n"9#:V˨dlXƬjj*m-*Jnz)HƪD4¸B*pNN~J t 'v+Հ޶ư.`HȤ_F LXDḌ@= ;&Tq)dnp+`%Ǿ+GYI&#M&mQڊ®8drpEF]үj~$(!ɂ< v" n) bʦ e-Ef&E4pLDÄe;G:0sGKP1@0@l樉:"Y%etH^d).#jav  @@12nA L0MjY"!oȽ )Zc_%"1H&3b$R% GHJ*HK2- $&2p``OE8"@3ΰ̐ -FX>B.~#ƴ)D'1[.H\$cdYDP.1 #G"ݞІN@0F^s1,A/&4*%+& 6J>J38W*#P$jN. R$g܄!$"꣨$,11*S kRdnD5BjnNDw2 B<"6*y#*{k@. >##NnG4[p<#̢nn҅M4S*MhPb,m7B:kIP#:%t),%.d&-\YTF>(/DkhɳLrQJ#o'_]pD颡!amiC=tD.x~qb޺j2A t/| >@a£fBB  qr`ݵ3=Ơ2Lp=3h #Oicju>TvG#9FNΔNv3|=>H'ELƒ@Q4f֎fMذQGŒ4G <tI.,5]Ơ)3g(u\ҚR0N&<<-b#/$v@i7rR LJhzg0bb .E0"Dp ?!x0OUm8FLRnlN &=+H#VPnoI]7"HSh*R-Y+H'SP(+>d@&`$"F^*Δ`(0C L CfΎ()ЀL6h$xRl!C nzQQdA8@u#5?b46jfRbR4X.G-*('$p BNqm1!hp< JXD&P d4;38c.voIOO$ux%  PRO*S*9NjyNSqEr&/ْ\T埾d?`m__XI;E< )2?T ht,.JSEL3C36H&f_գ0p%~dy+(N,C&$+BNJr4L&'Wl"(b!|h@HE|nD nxy^hxOBS"nڼnE18ס_]G_CMem ]fL EV/GHJ\ϑ<08)jnEd0p2'*~ԍB'2!.l`}`T7HA]Y#rIyaemBޭ8U<. ȴ{rFJ7*Hqx2(- Ùf(nCӬ8dWy7! :vY@qgYF(4%T9=="h"1jӇo2Ii 仴(L=(V~G'Hz;ŰUqCtw&^28FK"y,E!x3+!Lp)v)b@ۇAAd*njh?dv J:/i޾eSVZz FHpz M >uXOȏDR,bF)6l_)$p#Ë>lT$AܘP-Z,8ÕSmLSu@=^84ŭlb%&Gei) l^vKw_T8Ō;~ 29͜/S(TOPK>/čPSF$ש$!~8>l!C(?KE<2pLYL42UQU; 8f%KRjL*WHS%V$nG;-wj2L' o)*T\Bժ-oI'τ\hiܬi|tW NKB"9&^wQߖ\ 1`Gՠd^v-%bIf}WT>ioJ}2U 7x"7ʬل`'U wK6d/6]Fh0,sl`-JjC EIKt^{U(ib 5Z=v J*:0c9E`D`e?LbGxV ^r Cip|àf'1MSeTB$`#3{4EXBd}xn($ _09 kGy F#Gb4G."+Xn<9P`J2C0ehF21hlcE3 ,*ӂJ :"Cb瘲']ҕBA>K?0@a7 + *TbEa󈁶*Ԓ},@Ф1 \@;T*9i e#2l!(aXE1*V[-E!F486I&S/y(",~jIoef, 9Oe|I6{2O‘Hܢ-QƁZ#1 DP`t, e<;nTH9&JWsGq1Epv[KĠ,=fUS}u#j*ZxT81z+5LtKVDKRȺ:agyÎ<Ђ r><."!~)ANLDK$1~.4 &mhcvT"f[SR&m<@'*ֱK1+[1/H{jhJW2QQk?{Ms,eŤ%|}JF+%|߽Jx_] e?Iv\s[y&BSU0rR MO%& n c(8 `{\VKKG;Pe7 b  BHӕ},?f"&To$e.zC1DK9>#/c#< 5w oMq$EVUEnHM1Sl>jϮlS2BJHeБ;YIA@O@?X41"eL@*PÖ״"b@!}Q~R#)ϜbZ,KFIYP 3Qn0YBOskQ@󶠳9[윪ĽZ19TBN5 gGnFpK3/7зs9>e Oez}89*V&9ϊ O"%o<4 3%e BE߈M;/ST+c5}=jO]AE>5=TS~vUޓ׆ *1#f󉰢WdihlLH]͕ZLí'r^ R7?i|d'5u\$U/AkA=b1Aye@ /EFsEED:iDv," tl/7hQ/6OQ6p$PO;?؃qۑ>\fxlLbLUDMa!Thq]PIdFc6!Afb'e*c>Mr-As@#%Z[Rk5b2RsnCEg+u-5|X#ET@ urvvefI2'R0F 'R2'xFO*b؆{YwS-Z\Un/s\\BpfYyIR0wOdK#gY^Ņ0H#h%cmXbȏ0T%S"r DH1>MG@#*a)yXYb4fAX&\UR3!u{JL(F[1(@N+aY?Y5ZSxC/?nȔ+SGEDM)[35k9R>3+!WЎA"/8/ A S2C"J+C(@!6h''?f"[e?EZWMDW_t`&S]G8fs#ghYcR^p!UH~#”fY\CxT/79ɸ$S8MrB8"":c quAI ndZ%0ng_v p".Zv1$XH>ul&fwh>!vs $AT_])5sfSy=mf1E,)oAmAiY2'TFxGxl+ YDhmXUn ZWR\yXsown{krX: xWFbDJZ1pѤMAف26w8Oq=9iv~obq $c\gMlT*粒ÐbE#[Is•>h1BS|jY|ST[ȧ]%{2C 5lwdf>&y!q6~DeLHu9RTDцJj#R(; px[=YNq$7aox\Vb"0 b7 ɏJl@"L^ӄ`kK\aD3+hXR3w<'LY=uyjK2*LA縊å17iKKŁt1tgran׺3,Vp:mΖtt1(Ζb c-J'~T04E׷CĶ}yj&%.(ʹoK*Sgc$sb֕| Z^4EٳԈeFx<=-Jp% Z4o>#JƏTw0 1z I$2հ.=ṧ)ac1d+K: \ /؆Ɠe n0r}E/Їb{{.cWQšSdc𐃡ńX>;PK& ~Ѭ1$T6}80y5e/~x2Kݔ!Xl%1ptdqФ'8p;0F揿Ȑ`|mzBpruWT}lW?0 sI'tڌh2ݜјUzxc E0]Z-GFI|4l&?j5Y9a !--;9XyAo|XXJGvG>%Ġ {7{F!(3SF9Bp',&eZ셸\>Ef($>KA&Ò.9BYA"@d0;@[fW8Po|ne"Хy ,/(3M;Ut댹n:e}\%7_X}-WVx;ʙT+p U d;>!dPFka#y枵ya78a_'$K}чJ4 1PAk"csտ ʺHMRKWG-FĩAhz2[--K pJJ!4pÈBNCfNUkCTX#IWޥ0yʱtZUBJ&wR#%-]zٓP9xOe{QSVEe1)J\f8sK2qH^U,<[͘z>u]/P,n%`2'#6 iQ=mtZJjNSJ FײN7KTш' dj{駋#\FS3kG8)eqh $ԓ1CZlC`!6qS4๫i^O$sn1ld0iwAՂU0d?iiz}|$$fyp2,s_^+\ t%Xd#9lqZ,QDH!€B1!bDC Åbb豛e$$ An^ION2s=WOx>4kK&$F;e/ "?:N3a0A#8EJa4@ّ ұ%ǵ0%][)?meSŢt\iR?RBQT95 M2yG'{憦 MZ(QzSt3+Q┭"Εc2`e<#[1P2!ե^/[2P#% sVb9ݪL`Q'cڕ ܜ_ʼn%nH2Pf .sLJjſeٚolOpH̰a6Op^M/af025Nit7]hj w#"8>FGaejZCPJap̮( %#"l)B}h*I]гx(y$a BnݚHHJS8'@'*YĈ> zpȟ (BЂͪ6&]2,_ΒYJ26Н7 "kw|0M%ysiN`PjɁ.#WX,s=3kՕ-ʼnגa~p=)+nBj\:&M0@#LSt~CozꫤILWntnlSknG~deqH#o mC^jNvAQ$e&r%,@ݾ KUBatׂbxU>&ϸ޾İpۋ%M/ɉ:b?G5X Zj͟V1N&Ț7-EpdA.gW01EoG&yʍRtW4-FGCj9Yѷ߅bW~R9esfFIЋ9,fy\})Nbd|Tjhݘzec0ш?81@*lzЂ P 똇|D`Ip* *l+' O&ͻ/]qjSʉ93nSҸ3j3P?"@Mq79BXʾ2KћvPYB*xYlZj!(&Y C)ڙƫ4I&+1V*ϛD0ԪK4CH`a6.i?)/$a!ߨ;Y B4P;]}h BPy`̥| 14 =:;C[ kT*6į㳘۷Ke+%O"kjڑy,.izBa<2K1{CN3ez SWºdz|iޒ' ˻*J:jZpNUHlLM,0,74K4xc3+84#j;!BK ؿX b)31x @sI zx#} ؊ eĊ PPҚٹ0[˼1'zq+6!_KϠ)L[%PKGd3TʦM޴͉  4D";&P9L \3 BdȴoA*|ͥ|4<ϣBH@òөr0Ceb A8PɼzX:)2ЇC aZC; =jt,8ӈ5(J+r2k۱óӔǺN0P$"J3Yô_F1bZЯ=hإL !Cs{q y4WM/k"c|ב!5T{|<+Tx;!M2;[mUZe[^5^>5҄wT=$k 3%]ڲ$ISgÚk)+Yָ l$ }Y=ِE48YM6ْ`eY YKa+F5 46ڼE_}tLge :Dі؇|Ki Ċʖ ZW@?wݏ| ,QVײݭ#L^ `UQNL%<\PN![ߪC6fc[ +ȩՠa]Y9KE+$kէK5m(l%Ca/СA{&Ȼ|VxVI\aEe_`>NAҵFT>b"J`tq2 h{b09eްF7Q ҅uT+F(H c;P]7l!JS6Q !i޵rf,^\4 e++ (Z! 0ndj 3h2A[N\. uZN]$A3ic `='}P.&: y#܏HAgh(qQ" PL gN8Ss?*. 3i,k,Hƙ,VθR t"U;e?NҸ۳j!F#i[ѻtkm3ȩM:!f̓,YTό086)3DLi-Nk2$3nj{TBI~ ګ!!%Vj¯'A\"n-7&% a.94@|[ ȫY1 xʒiC(F~0E k6c-Dq:WSi/»2K.CU;8lkBL}8Ċu?Ħ]WC833|{zA{GR/gO{7Lz0F"?D{6{/|W{z){Og|W||'|ˏ||??|7/}Я?G,͟OIRfW0l)!,Z h ( G~( (}~e~IIg@Xф󇆠OGG$,zeF2}4pپ)ӷ È%RX/cĉ BlM$Ƀ^#z!&YP3֌ATAУ>_&jԥN6Ŋ*צYGjj֯]J5kڲe:\!˕FccƌIsJwU= ox;ayʝoe%{M9 XԾEoI&-o7޾.ܷzʈɎFƨ!.,їY׵O'}|߮zճ){ǻgO=}^lW2䇠ur{M_' |q|vX(xGR*/>a'W 4J0҈.3gbu;y]NH)$(#vU d#YyѳP&$3 \ Fa Fb!~ z*Z0rӦDVOCP5[q|R饭iF3ꩣ*^ꭵjHΆZijzsjn*C5j1*.)Cmz+nOkRjzJ-,Nk,K0Qzi^l<;qĺnKRsfq +r2nL m1;28 WL1 m4 ̭K+5>8(h!I&(6ʨ6RmqQ CZܘ7vi)mCb֨J{쥢5vs'9:()ꚗ%吋l,hߺ,ﶚ~O~xZ^Œ`mV",q~y)^T>5&lU.3;O"|fMYJvti\jϲzh}S%eKW/SJ)S%0 /n]$G7*B"U%LW׫C 1jU Ǖn.{c/~鴜kUw5i*WEݧd ƊYKHbf" Al52 sp*F/7XSbۘڡT$F*jvN&Nݟż9LRX#B[^lV{dijwu ( a &"L];9N9hC@;jhdf-2.9/docs/hdfview/UsersGuide/images/icon_hdf4.gif0000755000175000017500000000016412050301073023410 0ustar sylvestresylvestreGIF89a!,@9hFL Ĭ3|1Y%~Kc gyDc{܀=j}kz؏pEᐐ;jhdf-2.9/docs/hdfview/UsersGuide/images/dataset_2d.gif0000755000175000017500000032600112050301073023566 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,3M:#Ӿ*\0ZB!Ň#fF =HrI%QLIe|ӡCqVͥMaz Q͙,W*U4iӥNBԧ-z>A=u_YV^]mڪ"2KB1v&47/ O 4)8&ǓGDɱƌgvfϜ?sݙsǔ4t: Lp&Wf r&5qWmқݔߎfRlJqA 翝FwѹcOyl׮|uI ]|tr9hrQr_toN[~ ha$zᆮG.g lw}= w!xm!cJjGfO:XTNiXVdjQ6LZ [J9WBٚl&h&igxy2pBL(J(DW,2.г>i|O2)h=5j)LÈ2 CL: #k;Z+:CE- 10;L/ K&Tf-kmg-j6pa{&mn&o.΋yƵ]x߽!oɝұpsE2| G sEzx u+,||pX$ ~jr3]H 5-r>"^74OLܕLs6c|V=o(öaYi+MpKIs=TnUލ%xY'(pnI ()C2b^ $Z2,C2zGʩh3Gz2Ӯ 퉊 #뫾kj 0*W b0 ? g:cC:9w怞'>}ڳ;I}t\`BѹPT`Ⱦ) &)hEQ0ŐN hs >guǀ|Fw مs+4@n;`,h| J_3 (C:*T:N` E<2x@ OOHӌbݨH7 aj-ڑ3mJ213^ZTHBksUm\V<nN#'?BN.gW*ʠ> /t2[Eh9k^E/1\!bX%hC+\XY `—2{@lm+[0ƶ2GԠQ9]w+u+{fW.{ 7A~pյ<ϫkUu[^֯@P?:@M`#0-lіj ACu;twtta1h9<ZeYZCc;[jx8MuNs M><%svJc8k=P1Pt} R8:ҕ>`g4kn{˹1힬 洲 t8e\zn'ƘhG=Ќ-/]ny l2պnmNa[޺ܭu^\S׭{>{ٻ.}u]mO۾6Py\'mr{ .pQHs/^1t 8!{ǘo/mzyKq(Q|gLTF!A $;bUu7Q WVCvd,8G6H'/W8Pv"9ws4W]6fB `fXub8r'wEG KtIufptm& @gf> ` Ct ճ(ht >j'w8f*hvwׅv8h>?D@&N k@ex5] t^%&jjyWlfk|k6yg]؇kx^%y]yl_V{mmwmoo{ܧ}T}v`m'a}m0nX1w@gmN-D`coX~j|}xsC!6pBҍG2W2Bcp;c!^S4hVqw" F_U&&UmV' 0s֓D9 *99ˀMht3b3Džc.t"tKwu2(uagO'4X1`7&pPk:`h s PJp`sHi`+ T`=wsؔ\j@| `^zՇ]Ćyxqylypو&mikkϕ]e^$zVjgO%OlPP%mx_{_$QAdo$wAnņ0G}~7P{Ag 1h~DA33v$c$67U#G3:%8&(TT$'%Vv`Vr^Vrd}T'o QObb -$ bA @P P Z RG0*Z Zà2;*HqP P @ :P1*?*j( -@wTʠF`s`# Ѕslhء?imjņeINEolj{(kǖVj6zr\\lk k]kUx阞艥xA6n花vmD7}׊ܗ|IpV~}1@Ɋ!Oojn} w34:V42)3co"ޘjbWUocx%O'(gi'/G2e :b p`@"ÐPР ʠ࠯ЯPZ렅P "Pv@p : B*w  "wS `+ ,>G cwAsaAii_n^Vj5NĦȇxYr9~Vj7zz]ϵƈ]ƈa˘{(_^p[O{P҈X||DƘZ pԚDJv׋{닓긆[oDܱp&XAqԉRUZqB9hTyS%prGrGG|'`(%"!b?b9؛e ¡ ZpjbXb:<8ʠ* +0('9s` y] Ð* PppHA*R  p=Tp@ SI Ѣ1QMhQP6tNjj^58fJkz_d hyG^ѕOŧx6l%ex{ {Ynn TA9ȗnȋrl`C暰y t}&:}U5GTuAK5!bqXTFgF7H*GK}DP.fZ&:6Gaa`̾ >& <,j @ּ CC>>opP|,H V9 ЅʀA.KĐ ({Jٲ6P14Z j{PMDFjѕeuوUxvû^Uz\7mɶӖӢXm^Njpm÷X*w1R 4oR|QF*nB*Vm(ԋSIC5$K4n3.Tq,58U!8Nb;boX'Q2d}sG'ew%1E>!f"A ͠-Xc@>@ ܡ*ܾ98Xk\|찚XqB( @%[t!XXJ1;!Fp`Mai*,B@,NN&A˖^L[6lx[xwjsKN43^3ܶ8{_ym@a̪wQTXaaXD Ry\'S)R->Sg}p8CEgsUN"#\F"gTU4#uӝo3bX"m8Eds C&'؊CXv8&Q&n ${v،` l ռ @P v.vN璠n]A9*8 C0n,8l \J*!{=rE =:ZХ[@4 |u؆2}]m3PUx_H;^L`Xޒ̘Q'}LS6RiCN52 W&cgp(R)e#o)SƩgTsSظQ\UKEUn6jbsT"AbWdFC7 8%›r Un8H\EAʄ>3 n G .?58#I5t* ptC(mt+.{=$JI =J(]\ T\.|a\MNDԾNeGAV@n`}Qz\a/R2$8C.]/NtCZ~?]㍝#CϫF%7nDcT&8nD FQثQEyQX'|n&qR&WVvk2&P!J7?6O3t"X@>fp ܟ`R vJeĖ]JlS&2ˆ@$ .2I&)z 1M-]f27h'2MSSp&M&g4j0UTPDcVMzUiد^߄E VmZgI\uޝ{]{:WM]7DlS1bMF'`Z~|0MJ1)d3㠣)XgՒK15 |w(ܠw햯=8&c>o\t̛10]2;7uڛR&PUΏJe+ZF&QfhgegAQ0@eg9TF -P-(ai'vyEw!fQvqgzQiȣLb }2J)5H$ Ϡ  pÂ-)rC-YVϧƀ)4bI<`6 ؐ LƂʩȺk:8Ԁ7->ut >' d(,{u&ˤZ}BO5S3bɹ`'Sқ&gu*-7c:[K.ҵ`jȸ-;c=NOf ؘ{o6݃n^[.n&ZɫY^ţm6O/SƾCIC ĸA@0pO#TedofY"*`-y螷"a Zif:Nh`dIARz&ӤR1 R@1VɳDM{݌oe0-kuZ_R6vkS^|Zmj}첀UJ㵫woGvym)}g >탏>6܄2 ?1I1AZ$5 > HQAV B%Bpǁ$I1`%.uɇt҆C1pCF4"7͉1_'?z+[V3:^Ăַ{)^L7o^#=эCcX=6uT'Q>kEy3\S)rc!5y/! ;eEBiutd&W2? &֍*As4dMk%,DRƤH/6̼pKzP4 i.(A\혷enCa6M[?ZL&eODӰL[#e^9Ed3yP'2hD%:QQucA5v cv(T:у&MÓw>ﴒyR}3Odj%+}{lD[XrLgD6vaDiqyVw$0 VނֻLx1Z2O&X@"!`JU-bh wcr$Ajw%\ІJQKλJ.QYnW#fmxJfͣ<œC_x1pV8?Q dWq% Wȡ-Ea&z\0iP^-YK!k!c,kaJ GaQ0}KX2PjT%Φ8 VF$ Q4YVFS3RxJuT WY rt]ryu>E4d)s$#FC e*M23YO}˿1ysclS7謑ee }pJmW%ҍKgإ~c:Pr*A#9JJ-T& 5KNfۤ>Mjh~ npۡ0{X&ɬpytVI-Lv2cHyys)Vo)Kxi\secHkL2BS^7(O9 T[Ȣug71/߯^*lfwۛa}v]xp㻱V- [Q {3ަ6No(a=ߌͻ|X :4_T} &5v6ayU \#IJR{&>!8=+%z&F<◜>iԨj⭟URu_?; d xykdS6ocS2.U:|q .kXBJ>8q' ˴ i4a! h }>D!e QEC CC  )ln^vS n!2M`}hȇ-5e` YLU2CV.?U_4oT@NA^:UJ~` O>cLSBDNTB]k䢌U>p166gUPpGنDV.~qXWp4qpR]}Wnel ڱ 'm,NPhcrZჶ)N^4MAhrnօ8LPNpN?0d/?[EeTDXcOd_^UlooV]'J]cVYWhctOscڰ\U[lM[6Tj=q[ GrLݪ&4]%m Nyp moea^dP bvn=> }`L]v2s5 ovi&e^5vh~t~|^Fh!?nZVEEJ h~ToU&6h M>h \X A !A7ZdžNLX/zN DKIYIz+-sرaH"#29PE[<:C4C<ٓJXtȠ $;RgT G-XrӇ mɴgQ OUyRP1u'^^{J^I;Ufd9ZU_ [wɐE)uOg Z@1 -,lK4-Ĉj4J[-@MW(0#;쾯NqgLݻ`2Qr"q^>\Hqx=Yi= Vu5aNSWY蕄 bqxV=9x!l&^!PEFHab+h"V装 f,Tቆw(YiZf9Ќ)1a4%c-jk!e#oj!sF^&EJg~}#SQ&VYe="BÇcF bSCQZV5POHOtbڮ":0)X.)Vm7뤧 h d+JrMې@3eK 릳SVT2$E:鄐*mH۞Gk`dWл{flT;XлbY׆k(m20[bJ&W~A&ʀ'"=-Z\IMN$eu\hf+k&l-MmȦYp@q1XqZjjhkjbh(veqjðQa(XP}lCv`(ׄ9a6cGb ;}=n6b_nTE9B{g`V8is"3.EϨuy0FO'xReO_&_YT(_+O4.ͧx9~I~Jɾ&ըcjdEƝF/kC쬁 (gi=러4ѣ>܆6'GH)ՈLŅ y4c(<Ԑк,If:O9KD *<~‹qg׼3YUVɨ 4r<$sd"uL$V6}le,B:REYf|*\4'볞G D![wKZGj0.F@`K5o:ȝJ;+C&r@\]VJӻmv+@Nˏ鵔_3%Jl&ftyU<ї]Gڿ)0ceK 2B̳ 0prt%`Tn%5qgZU}†3o(Ef3@U*֔[dUTI[1`Cɥ 2LrKU]dzL|4 BEnDzet%98J>g²N=pRVZA,C,)1-iV^RMV$sbuv;M`wܧ L<^nӪ\aSyg̗)=@f}7H@.d?ccYT*>6jVAiMjj"cᩒuО*iMM6!Sd$AUU٤5 J@ F<%;EN.0<HLD7ND\AJL#+$XJڡ)F]HN3}M e gNTҤ+b"XfԚݥqLLq Fj) J.95&!S=ܴ$vj'l'}=VNrb-(q:axiZgPR\@ilvgm3Cg$.hYf u?vqWo(:"^'+MOAQi06M5$be~!TUԀVڹ2@&Pdm'* ]& 㕡ndZ Z݈% ׊9L &Ojj|XѼMRiށI`!j{&I}4){2*FrHOf1(\Jt&pR_rMΓc^^( YJkPfCY^B㻦+$]dzjܩ kIfr ) "žbU6yevBDNyd hvvlwj#Zc ?E1aE!dᖢى, iꔎEd$];AN\.jDf}ݗ+>%]n'mvkq^lF6el#mt =t9[(縡~ fk|Luf*}tܾ&ivfknhr+ɖ$Xώ;l`U nʭK۸ &J&LY'(Y.jJ'Ҟ2mzB!ʩnr'N-I]n,D,ު#)Y)H1!MΪ,n/zV)"b\ܺ).qލniЇ Dvm*9fmkrŞ$!4(iM@nX5i&3:!&Dmnߞ:4FA/2/.O5Z/Tɱ/S?%O`j(O195qX533j.3R#I0Z'l@nA)u3s1X.q\u*v+=+\w=Tj8[0 :*Cg[se4HCtH/ gj{4F6װ֢4PL_ \L*Ym:lW![ti/޶U ӵIu/*?4+u;wו^1LuF`S 1ecovi*e^5fqlnk4TSRaj6a1o{qV5\8]w+j/Z;r}7]P;ww[8I?xw%1UWhjժI*C##`M^Ҷ|o/6 #4t$C$XM@\95 ggWrgvk#1 wsfs0m07vudXc6:O,u˵e:\}ugJ6f5߱>ekq[?ax_/fx5Ua gocc0 U'1V(Sf2h oBA4tH+rZxj[7wVc~6 =t{<6M@6tYFikw{ѴWsbTl/vyKw6TcXz[0߷|yzn ׊gq/wc09‹vc;xxy\ؐFz aG ZܷPȇқH0̙ |3Ɗ7sֳpƞ EM"ͦ?) ʧ5.=4hP6sUj=dU:ɓiɳX$t[8*lޞ0&5ԝnJ`>F\9&`4.S&zF5J]i4ԓ}ښwI[o j {&eF~3{.@4}ާsx/8.~n֯Wk/l3"0j@ t,B4RnB; ,1A*F p.F(DO A RrQ9 > W<쮫f F3K(̒',1K&cՖ9eeTV})7P[s?]C}p;IB;iD d ` Š@!ٳ<;eM#`>q sM&zTFlҋW I%+@.RY^L&rv/ =e<2A"CIJ*ѪKtu7A iu{U0Ds]KMUi0jZw$)'qy3 )G{ v-lbmk%B~΁ e DhX hFb߱0&;L;x#dKЀ;p!npb`V0I(#8re,p\ >s͘dDh;YB=EZX@2y+7 +@nT2X'?T* UW 6PL@itC.jKŜ'iuْSirFɗ82({<8\4G:ϰKSP%i]S$9y)vR<qܨI^YxtITBN*q|`X=\9FaV'Hܔ?d^ֲc\nJ) ׈󶝑̘*nKd̃3^.̃d́5EsqiQ3:}te.pδ&''`:e݊I-ZuRmG{δԨ(y w }iP1bLL7neu=5( *;aUl&ӵ^c7ZGKCڻ^γiӾ'2mxmor(=f*Gr}d / 1Ю00ޒPMO4Oȃf3Փ$UɈ '(VlK1NUr"ɒ9kȦP(V܏zP gI5pjWawƄ8@ڞ~57G&(*LjtO) "5 Z%a~T <$@%]D{jCHJ=UT1'w`Tu2I4&r>T ?iSԮG & sX >֢jn?E)>Mu 8]L ECԑr5IMǵL.oy [Oq"#pB!ysa37{,8m9:R;caTo4`iA5Wʌhlm  tKBMFCO-!mxhmbt&>vgOI"qIe a+8bUP;'@7JtI7tMt EtGtWt]ĴSς;khUJCղ6k3q-A5%3*ps?`QJWl?!M8OU73pRvc[qPSt)uL17xfuKS-V4@GfW-T*'X,"ΰ3Ű9JT,+OSY3A @aH FFՈVӌ[ix(U :py' τY-ɕbKen- f+״: &ۘmLT'l;BnpMu 2qs,7PeYqETݘ\֐;{qԋ Tx8UgX4:f'=,+(ĕC/’uE LzczT٬ͺDV$Q"eXy8=}~%X6vJtU%ڢTzѳS˒J+џ#ۃ3uXxZV;AePk |ኳu飞Ǟ艞˾پ^þ~m~> ?>۞.u``==?E7>Q?A? VYCaRQca`'agE_K3k }g}_c_C=EMO_I??U?"ͤ4'!XB$>b >|bH!2DxQA Y4(QF!a&4y3C"o&ɓCy8RgJ3m߲eʨI}jO_TaF^4q] U_ܹpצշ,l^Y~5nTU Z1/EqB2ɘ5wysa͉5?n|zƖ~cԴAVmviՕkΌ5oܙ ͙6ՌC;1u3κ2خ>z4p.N;K {rS>puU4yWTyU=qUW\_Rɕ`VQAXi5=Rai4$ФLZncx|U%498T_"^|奌Z܈@nqEeV^eZne^~ fbIfffjfn ʤV[z@*ucVO"Z3JVw.h4h$Eڤ[iTEsUV^(Zzug[!RH _j飕zJw!H nIj)iWKll.lo2IWE֝.ZȭZV.jjBUtvk*ڋJJ`jkQQ$Hj^l? qOLqpyV+V=˭S ڕ*G`*+_oid˄:g8e^JZ׆{,tZsBsꫀrHOMuV_uTUYɕaQMY_VH.tNwʕ[ nda`54eWeVN%\U>`#Z_yoιmLR#z}1Ϥ.~4Zmds:{^Xo8y_}oɵ+)r%a;!Y?o>/5X ^-K]F6o[1Jp@,l#`ە/ixשxLRB6Er oz Z^߂G%0ia 6Bo wpT1w0mPkkTYirBT4.mW;DMrWfuυT"=x, t:7?n,4 hpTt쨨Σ5RypX)dJ1Y"J6SQӗt=Oa`TT9RRtիrE*8:1hݮVTRNϼCATpL*X *KZni衦 X)Ub|P2aUD J䣱zHwZFf' CRUE! #Ufd2-ji%!k^%mb- K]>jqJwbsA-MADE<[ҭL_DZ*RqM=-h@>PЃ.#=&Aaȁ" FHFFKSR->~z1DCj>pZabPqN{LPP8%I:T*㸨B qkwd7xC)r Nˎ$)@|Z}0--KWKtc1W4Wg&cP02u\?:VK&r+DUec ..$bvup0v[`[Y78#:`V,C`m5] # w ,(np>f.DEPlqLSBj3.| %>vx.=sa*8SS[GE 9%Ӆt[]aq9sN*g9+ej'Nt#x %w+{[F nRGݚN8އ+ZGcV+Z\L5[鳾T/$d`Efa{++ Q PhQ |jI_+R1Z4L|,.ׇ!XF-DKA<0N<>.0Z>_?q/z!/_"61G`#uTJQtW%-WUw\Svx1p(RQp"3X(".QаxQQiqzwy( 1`7S]#"4BEd gPVNrv[PGUvP4u YU0^ @8C oU_fZ'QZLShRl7 #\ ]bc@s\ч\Vu8&~oȇ]vXUH[64cW9eZcqZX'dbfhȇѥueqXRbeq #*R5(A!n1 *'y1 #x )7S`UXńːH$8"v#`PZŅ&o#j ]0ePH!X`4#}M'&YhiFV2| t~?)QxbJvu} *@%:bQ}LSF}T|*`h(/-Y%Jc$~<LJY"?yQSYZuXVV>ّP)vh(kBX$PwYyAv&xZ=nxYzp+FUk8 hz L"`l2((  j5(?{VqUY@Q( % FQ3=$k?y9B(.mpgr 'x &gr4x[UHR1@Z%S*Xrܷhٜy[ox 9r.'j)9T)~|fner0u}grrfDk؟䦜n0c b 4#O"`t#UwFEXɏj ڶ ZpX S( xQʀ0ppF"Ty;S @oaH{h5׸h2"BR K|B֣jbcGoE[r 9}U1ev09g]S58b-7RE&@[4?JJP 2a艆~\pe^U&iJ%ר90ji%>u~6r Q<~*`2'vR$"O29ie 0PgPQZPmq@ FS]Sޖа,` L2C% ilD1R#1J[:NB=($N"Cʥxq*r|b'*"5qs : N\"E##ؗ8Ɋ1ZSq$'7=z:#MYx/2{ )63(=ZCCZy(M҃\62OF9dS¶Kh<{J[ ȁlCs;flǷDǛ14a QɞA_0ʫA\1qɵ\1aˑyn!o`|aflǬL՜9lq1,ai`q##-la8G,5 ϛ̠QAϗl(20_ϢlͿѽA10-̌Q7: 7A C-EM7 ԡ@ ԠI S].-X|`-b6MF8=ʰ n s-uwMxmy{z }-؅M؇=؉m؊؋؍ ٌ ml,|Ε,k V$%9,qگڮ] 6aۭ M]}ܱ}1A1-;ܲ-Mqq =߻-mMn  -Mqm' qU)n"m}%>+-"~*,+>%ȝAC^GH.KNIܴ@NLnUS[~);&n:^>n&adh"~_a^nk>ipsmxv^N肮r~t~znb:^@A'nqn㥎$.o"-^?NY빽 aNR)N05NnɎ>21gҾb!N9i륾>N^ހݴ~m2cO. ?oܭⲎNqB5n1~Ӯ-)M^LnE/JX~TW K_NHC_Q/Zr?^NaOfU}n/m_uv{btdc_w?Th剿$>>=+A tBPAC5 P@C0A2Q!p)<sla>0A15&@*(}bʩK0ÜJ,z)SZrH/N& ȉd4 /vFL2}'EQF*RI%;RN+ DCr34RQ7K3TUV;UTW4OyK4ssCʣN# YJea$Z1v[n$}.*K8 .]h]wq7v᝷,g58t]jwJs| >hݥ7;h5~M_/ާށN2X]65nGdKeUE>dmFjgwg>Y-i&mzeYꙃZf_f8y7bzsuofuFmHJ(rrʱr3j9gJJy-wzZzY]uוjz&sFvuMg`27ܘ}xqv%sսMY7LKL?z_n>/_?/_[JW} T@zOS>E~K^TYu˘ YֱzK2뵎y\=u.;mpޕL i=a Q|-7g*XD8#cTE(jɈF+R"h=:9^>6w5+ppBֹyEO\,: DȔW.Iʡr[%L1T*KyJrܥ+DW2e0Jar/Z"tfĆcJc #&B6c߂CÕ}|&OEsTJ9-4R,':]#TypA8UAP<. G6G,},A b>X;wNj5NE~l͢)l N+\$8Sˏ5SurePxԥiTVu(Rpԡ\U8YXե:UKXǺVu,^kX:צjUR^ŊWpxZJֵVړ\{=_ʡ'Li(gq+ciMє`~#2eG yD,3cB r8W`D(,Ca2Xq+bu ѹ)h0/ Ep4*9Eyy)b-3kJvxAcZtpA*NF V 0  ˔k bZX橇W|__(%W -֯KY.*U,fuGH,3߁U@ZN<]D XD^Y?)Ч= P։ys\p3q"%]!-VGqc\6cr4Q^OYvD aokz, m :E w(ɰ 5 WpW0X< $x,xkm<*7\Sj~}>*j'_ee|2"E(pUਏB|.ט׏iQ+-!\Mm}ԟ(e+9s"+|h8"}(.$;#@ӇC=sۇvxc.٣(H(lol<+Fy4P Q$ӂE(E +Hz4=58r9, [H.k43*#?b$f1eS@EʙjTH1h Hѫ9[Fęd0"l}IǫvP40gD=;#GKjO<ʁ¸CqI D,d(ɥj.ITK.+IM ̵khhI0Ɍ d(-oF{#KI# J#@ .1rd|hQE Z)@$he)'ʺ"2@=CA=#Hʊ{$#lѻ*N^.5I(Iݗ)jއn `}ZZVԴuF ^U_=3vȁi޿CՄ4FPsRP%d퀭0 `h(XFàKP>tXӫbӓ ppN ӊ򁖤<`^6&|#sur-~gh(^>snT_b$;N#UOgl$`JiPH=KWU/mނ֜i:HH-1?tFHH]^Hӷ&Wg]7Ce^];t,bE&isF`szzk1e<5wl~XT*0KJ1 v 358-j۠}𿂡Ybo8:hHn]֡ Q m$|FAr7s?yp/jw~m!t{WmS /jI2yhY#oj _2o^y>NNxBtfe7~.ǘW2y^oi!y o)$MOB#{zyaC{W/~ȗ n7xwblPPQ%bxn1xDžxS{_7~m`Yyٟpzz|~pzCWtsWr臖]ypF|W|~Olf`~?o/}5ڷzgXLe $X@B۲!Ee xaB> qő CDi?Ԥ)b4e@icR) *t(ѢF"Mt)ӦG}F>iޤQRÚQF"0a)Z;>\+7׷$B7. "F%ve_B B& =\פdc.C\仜[s<\8tƎ޶Fu_V8\h0[”yqMȔ&SPPNcϮ};^IaM!WU62VZLY&be%}aiW9YZ 'ĩu%k(|I'~堂ڹ.:蕑Zgb瘙Z)()lBPhv*B*gjz裪"esBJ&JV6*&hbN8V2SAeLN.dKoph_z 륺rkzi9ޖ-Zi.~[jKo[ /Aʯ&i0}4P6Ac.2˻$'1;[7SCϔYAL4r@t \FCqJS}^OS4H\uXK]5`/vRMtiOfPMvwwqt ڂU@8N%=O(2bdHKJг / ΫODdS^Y~W{OUn>F3߼CosH2?w I(} ̥$ϐPZ缏T G@ >ۃ_W@[ Id24!1gQj#f}l!M  Eg3L* p<`L/U_;@!Sx e;D E!^!#h2f1ZLcوFfYэCY#"8ir ۇ9 J'(BR}Lu(aGB.ߓ(I'R"?(#L( |RW?$*g@AxRe*o".Fc"U)~,/aQ[' glf1C7&et!9͡\a:r7!F(ʥ`ɲP2D"1UJth '@9I;2ǎ}8ǤK0LHBU~2J1y% pOK]G14!aTԣ~r UT!B)U/Fr,JhӏTϥ՘0T1%U~lW֤&I-I2Zm2}zL(e[D~hsR$$GCB RB ΄!GPc G )|vX |xbI';R ^wصJiv%JWtwb۽~C2? E̚e_W܍lYyR_3>\\A$[8] ?R,9^4 1DbUI1)޺j"m/HBYdRSBP'O% v OD&(pNe$B5+1BltᗣR㉍W5&)&է1=WSC/5$;B2;gޕF# CϓM sjIHgN]]@UZӣQ'S{R%c5JY"_jzjk_TXq3MhiWI!=$"[Dk9A3HqTD$zȊ-i]]-jmMqO vC.tKE(T YT1hYE> @u>TJ"mǫT:0Vi|@K{'Kd$N]r|^x]k}krV[#lzu;w^WjثgV`cF)(6y-DLxHyE;xޥ~s7ߩLb2>2KDZ{^4ZO3~Gf]$⡝&Dҩ/7 Tbǒ6V#?)mFe*?+Nh ;Uꐀ)UE+JRLiRӼVbթk1EAՎRDѰMߎH1TP+MV(aI1R r QW_} * i`TXqv +EAQYY 娏[PPJ4OH"I7qE\>YD>,=Tsa M_!!VT>(U4$QyV=T%w0QHa]VܯTHiՏT,)VJeaѠ#)aQ_ XPJU1+T2`aM.EP`%'I%IaR2S e$\ %$`*EMNNqU8`m "`Z!]ia;"xDiݔT%\ X}ށ-&y%2Be +McbbQ&hPXSIRTSZzzRㇽ[⭏+ (62UܤOQeaJyam$nZy`y C AC4ԂP;T"8/p{ bz=QMugNDCM ]"}.5R.T/߯=Ua'b_WС MޑReժQUP_ObeJjM]fR}f\>KajU_S]Z$j!iHgR6Y֏R eh=ieэ=+ڠj~VkR9΍TmT)AJÕ꫒]RE*pAY40 E %20A(娎ϴ$5H)Uvͅꇅ跕ɾ$fR)T'6h+=*|Tkj* ߼QPN_k[~ZRҶj_ *jX9v֥>֢6_-c-Zʾ$vz>e6ȰlB4`PӾ2nHNRiB=L-Y2\Bɀu(_*%vfDM)àV.%ZxDLZKO;bKZgku`9g=Be݊l.Sm3|/h^h ΢nB-y-ZVj"oYݖ-\n֕i9ɵ衮մ WcjZ(Lrp]\I P *Y qu!,(ܞ5jmPplwEEP=p pT8pc/VTRS[jKVm/w/v-m.o +Zq(2aԞۦRUqanf*tBOm%1fTe ~) kTNkfPt'kGOeHy ԦhsQ $)CsBrR+^ /*.Ez- Cx^D=x'=. xEe2 Sq5112Ҭ1*G$GE~8+k:-1: m:3p˾3K*;Gy.:s=A3<-2#Qp>B@0lr*T(,C>P#YD 202 SEQ3sMPkDG5Bc3F:3p+CS0/t_WqV5ҦT5U4Z#1H_5832#.\gVYN;3cu)^36#()&kbtf+THKUl^&|L_G /3-T{v^ϵ2n0w*1S03y6$6kC53Wc7pw#'-҉v=3{h$Hm.(D{mT 6o7sW7;Hs;shkf740s+;6#h?G|[;W:Ûp[7ͳ;zxT{͗z7#6~8xiSlrvW{Ӈ_ds$E EP#ҏ6ίxӺ2w۽Bׄ=㽺+>w@=uk@; W~':#{>ۧ~M,D׽݇~<h߽K~s>ݧ<;+CF}k>7S};{W{K*,ޘb>pv%X<d-$r? ej6 A%Lrp*˩;I?swtύ(LLEuL½nzr4B] :R;4ɴczK ~M?.>. bפ̌.+R6KNLz*EzR 6n|N/ưFMٯ?4Il%VXa5vٸٓXC&RZI(Qih7!jzR"(_<"p5{'<\w!KY/=oR |s֗] g%g[bpMgQ]yfuqq!rvg!忟y%XAHTԸF5эo(G: mtH9Qx H?֑,$"HB>rc"Id&196~|| stFDcg7YY˞rcBp8adⳟhIҞִE-iGk֮VU>RwU]beHms{„?m&}rٕ܀Nb}ntK]]7ut]Nʭxqw!r72/|u\}mo0p{VIݕz Ž0o{Wѭ()&A68lhMGBم;&qΛq rFB NHC DZ?A˚L.s^Ǽ+W_5gv<9hs,f;l6f<ςlh9#TN`L*w.E@!gducrz\@<⩏B \0v`Q]\+.g?)/ӞH8=ox^fsSmmrvsmH;` >{"^wMou#N3]3s=߃a'ġ4Ÿ{#-+!̱:1?tZqk?W>aY-s0P!{tGmB+9ZgUL#$b׌S4Da'ތg;-$۱_^5K%ĝp8l4_gg'ХD廽ܧ2{w;Mp?_ Ƿ.w=-}]?vG?u;|2; ,C4=#ψALy u$cH|'pG'|%*p%T&NqPwxi%oq2OɈjM)r@qaln~pmMN 0NЏ OZ\l^D!@ XA(+PANs.H% C\;pSYB'f0t  io&A%!xI$kĆ~`q6 {P0 / fX[qr_h"f 2@PQ$Nmp`5k *xT/^GwoyTPag`orodI@sv  Sg擄mPNz!O0%`!ӏ#QP.}0$ pp(„&o#H]*M&-yꐄ̑H|(jmIkЂLgB 񌛰p\-fq  lQُ/ϒ ׎ Vq .2Bq,/$/7-G/% ln%,p1n!\Ce"qnCP`(Sևq@0p*Hl}g(ˇY7A)VnU$2%%$S.U "_Q#38?R8-,Ŏ  !^ȘO/#1Spq'bBM-033rTBt`v+ @'}@W Rk-rv2$ԛ49# %qQ:2:)2/Co-{s$ 9U48#r"1$'"7 S ࠅ F!R=1(Ɵ{f˱5sG窠q7%t*<6mLwɜ. r Gy,NET!3/GT9O/r;92 S,;4.N9s o ჭA b"&*#$ГH?X3.dxq(IȂXu9bp΢=)G|!Xh vfuAY$N:oD:2P9 o79oQK\aEumX?QĔAl"$TUAx%t&sbk1(Gurvr}0jqk $+3V|$BBBoGUcXj!LeK\uZ[:eղ.KrEՕFu0߲.oeõ\E5W(>*?tSAjUkG"B2x&`exg3'V470MBtI"B0Ҷ50.|S0sgە:6fo3`4Nc:]W;D/0NPOޕxW^$ukS#0k'iB3Q1>!pi?5rrg}P6!OpPf8TF'P #"9EZղ8M=tyWCtD ux a2&AS;bja7w>U7= 7!(qgl90q ad1 Q"ՑҪQ7#{egr#ERi9eZIzOV\/aOERrMq=5g]%i4aj1*#>-_=b(bax71{X'ZIv7Vu8asN%A Dpza1#c Շ0m4o$gpx{|QpDN}Z[8i 9-` W"syu1Qz`g]CzY/gw8p!0y9rWZ'8zf ˆk%b~O#ja.!ٓy3 h))a!yv P2!GU=`sUsy|v'2QAX6S4xCY"_N}Vpy\4| {6UڦbWR, TF"k'≍Z"2oqn ugrT"?wu`oN~qw Qv!kDW[M:fxp49 ;zii.$0ys5tǹKB2u;b8ٝCoL䜧B;N6+d(j, ,^{Xɀ- &67S:x޶* Qa{X:8ڛe=rCԻPY8fOO ټ[{W};7hS88-B(n&'~9"6ޔ Y[.er :[63j'k/'%%ӀFËC\C\F|@3U)kwgJPy=SAv7wS/oڳGg(5c]ty}yLNs=11wxgaCH,toTb)=sN:3=ރxCs8Gq<'݃D>iaq@^q4+'/PO^5;'v ¾S#^'eXi' 34hi&Q"%ĸ]5m5dO3QdRhTronϔ#e^'>b]WUc'Q'}9aG0[smi7bUo^o|X3Gvvq'M|P٘نW'y8qzؕ떭d|uz+Z'Y?Hp{n?a0E pLzf4!\! k@"}j8oF}bB#O\$}q}H%ğ@ J⤃W^LjQF2V &zg}586>zm=m=Jq{0=3]{o4}o-e;x/ݷݧoZ{XcÚ2\U'V޵1+Zoìﺾ˺8{ܫG\.ٹMW^tbh_7-xus]!'om]=FUM5o4F4W (@#FiWEQ&.AI2("L\5(hPA)vRVXilh#k9sR=֨׍4ҕFx?ՑvtL$Z>dVG┤>j+R7XG5iw1ufcF9䒐itV]WΩ]>ioި%$Kz1Yoq{Ad|nu/&z.md;;Vʦ%2iEZQ>,b1PCP&곈H2bVz9 Uv|%om5/vZV^fhK]e\$\qkVܙw)֙e۰-vb]GX_ĽWd}ƛgarƀW,cY_f}~1̲"uvWdfQL{f!bq`.`(D# ղ.zͷߵbn8,Ƽ$ATpq˒W=i%Zh[RpS9>Vnf*%hT*<&m~I;>֬rubIhsU#ګ%jΉyaFߥY| Ꜳ 듽~%/X>jR\îc%NYW E1@ =%qW4xz d[N -sh^f6zi򞾠q r8>\R>Bif,.G?zJ/V w9WNrC"tT~‘-m_Kl>r}( u P ߳)N?QZF"*rA#`DǥU,T# Yq͇}KItbKXlCw)^N8ԐaYPF01I` @f:3D$8![Wx-FTӶ; 8D *e*oF9 -KX8ȏ&kI}M Yϸ$̟z\92BC1MAxBgih) yO.TNXHJJTn/jw*'|C_jN9-er4ԐD5¸Ql$%EPp2A7p(xZV$V=4 aT!ڕBƼ+]׻uv++Xu,FdUd[!<5eYMgC 40v 0WZ,k[ђmcO{Fv}mj[kZ6.wy.,͂22Em<[qz,F1f&kXJ]S; ^ʯfVLo~kځT-0ֽu5oe/Y p)`:/9|Aҷp[b셰`8]1ck>8-1C</X ~c<[71c_#q{.'ؾ{* Ah"ƄJջps!ɵr4BMǣhB&Z9rY R,S#:&#=iI4R?e1}>N 2SX.]nհ6s} X@ Y t'O J@}ݘwuTًkC3&Hmo^Wmk˥Ӌb&.ܳзA۷"P+t7XF,<74s*{7EShl}6Cu:}4cKvC2hT6wQ!C(H**Z:E~n]b3zQ#ړ#E)&l@5c0Fr-A,e)cja:atxdAA zgQk( dAc6CEзiLd$GHViqԯ|u7˶fhC񜥿O2T#Dvq9{TBEvQH s&E7nLehJAo15F4MUrxUuTE5Qdž1w4uTzbt6#w)O!QbPE%l]qSO/x(b t\$nZE~7{2zQ0F&NTAs2TP13x0V475"7m;xM6|hVRU4h|7QZ_Tɰ1pppvqpKMРm&NZD.J(x'vF[2n7ÀʱD,-q{xH'ՃvKv,p`Z:L4!$"ZpX1^o@tQazQvFP(p+T3N+5BJEl( 9~&I~ Sg)(A$TYsGpa1.݈yBJ$"4s"8G1\`֑Oǖ:ʧYC9S%hTi ?@~ըh3yVl_DU8 o*ԌpU URcYz|Cx&>rB: hsgV#r-dmmh5kEgN78tSInDgNuDl?ɖQ*aܘ7%B5zwTIlq-@ P'JS~nMP # :@PAK%xy,2G;46hPDg H!Cl SWot!.0aA՘B8)4N2+Ț|j6lcj_7rc`%"n  1#4:1-171#w&Em$~{GiKXWP]16 u{dHCY|$P888 a B4EumDD2 )SQEU)F bNDo TXI'YyJ蚛! ?`hEFUzYDVGT5 by{0`XcZbHѴddKTjIqyCilxT8a &z:(ϩ'+0JtB4Z(+Koۦ4*OȖSX1*XN{(I 5PvѪK|8d+w'jѷ ija!i,چ 1&A WzZ"4Vᘨ%pXoyA#w&E%˧o/sU*J$7M7ON |/(I | X"pʟX ~Mj'Ј/@Vō kCl{WK1\wyOp'eG |'UJK XDM49QCDk 8j@ؖ~\ٟwd!}8еv}ʔj Vͪ\( ?LD\A 3)m k+2T+D wQ{'&yqHL3PjH㩌$-OMwG~({kl0Ty IɤOjTeYwkzlo*wH(K6 4$< RɊKhOtqox!lGdJUzHJ{Ȉ6KPVfuEn`kؙ0|9Z l="%p0tݓ0ɜ;9P1Jp9uKsdH/C CRM|Hji9g>P\ b)"^,ZP okDG:h9~ Z>ioPƏp¿zm!"-#7DfHಿ>1EP@֧ @ 0 @ @ O @Al1bH 0MĒiR60"aB$bC,BfH%MDRJ)'S̒hhęfN=WTHՃV/Z=}˚c:2 5UE,>B)&$ʭ75 !iHW\''i4Ԥ>-C)*󘬰ƅZn bD {CuMzZխMtv֒OHzxG:j}h-5h8&!^N䴭_ǮxnLUȈĔal#ck82!|@߳?O2+i.Gr@PA#i} lp Dp$ )$6>LPp|!GJD 7PbC c1BY1EYEz)ڧ7ݤáB)P㍱N0_$L`-n P$ !aïLQCHrଽB;sO2: "**m$vb(" TKFM;=TQ)UHRN4ZjS^UJe*TPgkVOg$ab( DۮKMzcj hvS4:53]uonݼK:ƒPO> s?;PlT?C`vTFEOz ( 3DxbK-ޘdCbc!TK@vVH bܹA cV =H2mmhrfL*eR9uFZL$9C*;v(3Q=11F%+6 x-|LqE|d#̜#u1Xivoܗ҃7.Cʺ0?Lg1}D.3:x4nb6)O2+thCUSND-TLQnCbI@ m{:+*)A2J>X 9^ -`&N #(A֑|#W(F"+#8DRH 49RҤ{kZiݒB wJTC@H{eHXD(djʪTnm鱬.QV..n Mc ,Sb.3!Qw?wu^QhZa0wNIzѨb15d:lIwIzPrߧ'x| lLfc$p+MG?'1}'أ de.M iF'ROK#h2VaK2^ Uvo9!GhVG5ug[EJ<369}M\-,$f=rY ^,<ұ~s!Tg=DWE&қj) Ez`] b;9N0ЧUjQ$565WbLTl0 '-\_X-"`~n8`2رF_C}k$wMFLi,} @j2vۦ?~X2INo$w }E/SrܫeteK]"WI(j$Z؇"FBaaPx(z e`B15~dP+0 ѕ+7Л/jpxa:X~FcO&tFs-t=!Hmy⒐Kf+XcX`h ܻIQRaP@bsFO֍sDHP7S;}{?f/;3 j t/ 4 'o{m};? 矾{?ɿ>{̿߿?;>=S>=c?C? >? @7yB,M@ < ӻ# bøa>dTLȜ d˒3b1恃bP8Pk& E7U;C4̺hï6Pf[w5 C A4S- 5h[O8@:J->Kkmy Q9j-=v;ፐ L"1L6g^%fuvqd1#Fg"3Oq0l\nM!8zb7?"C8:`GTf4Nӥ XO]P]O{-a`ܬEY^hF{ITRI6̺FRݒn$Z0]KJXS]țj0jd6=;,%#yɚv˛Vk0~m K~>oCNpwp~? ߾Kp GqTq/qo * Aar፧QnOY刨9@fr:b:r,e,)G`ъ-''Gr@,ߒ3~66gV:Zeq ӊ2e+=r+BeX6?#*tAq'F2Z(|E;3-'F=C <7U?uVWVg՝S X{э p)J0  N6E >F5LcaZ vv=38#AB2rB(Er,y_`n/怊=ww`0+=^9,wD3s9JrsxsOMtV $?tG(k(?2xN$9{|xW磃L8/Je1 o#m1ŵ(0;WRa0dX7BO}-<~׳w Lܓƙs.yd^6ZxA{o-YZEt&&{9+<"wt<فx3W]w3Oca|ů|Q{?30/,EOHǗ{'}}P ͍Xɺ( Joي-O/ gw'66VbSLbaB)bb?la٫^~|b&}8_{h_}hn%@p2m"pl2aP iIMPU[b9H%!i!S@BpWuYMDbU&1()S. IRG*4^$-vي&MR]и &u!d!(:Y"}CSqyV 72ayH$1QtyLx}idhhp[yGY48pi7tZ>&>[Epu<<2\jw-j[lќjgVjO2(CL뮛n+;2>*R+oI;۠2FC"q$P IBWOTҟ|)̰C!(\h4 v O]E^d&y\#Kf(|g;/2eT,S\^%p* dPLVz:_14qH LYmSi 32h =qfjw˔Ollt[oiB]s*ws΁Hotq0:Sjrupa{o8堙Fy[J쫠> SZ|חYw}7>|:iMIeQpxg|)bltѨ~Y#Yp#tRlY$8d"IƄ jq\ҙw|DRA! F~aJ k`^)gJBz7 &)Bf@ xDqT-pyr?} bxCkJ:"@Yɇ;c ֪V!9}\|pٽ.p؇:H&6.z!G'6#gNT\ .wK"k^KrRڃ0x02 Bb,oI.UprhS&ىM 穵V =4]I̳af '>c!s Ϳ-)*}tB"|%CYkvj_bi5)RdG{uyk"Ӟ[:ՑYJTÛ[n!_'qN9(NVCSVzUŲy[5US4wDwopWy~U_z+գO9lǧpv1I,Om 4yӏIgbYCCLģ$?Jj0JhJMBn0n8O,5" ByYdnliEI(mQrϵ$u)*Y PQ qad yuECmB?IJSb֬B# MQK`&4jTX FSGp$uNuiT!CU!&)a1O_ fznCy܊hZ*-Oi‘g&*iӦ3Lf)KVnP"NBމj%U(TIǁpz`JJTId4`"KPM %JDuJjlEpVHaBTW;ψJ%ՃxNO LF1Бu4F18 NK*9$p(jivu.fijhg(hk*IBHL(Ш((ިਏi*i$Q.i)4)֨f$b^$i򨘞ih#L)2–ji)Z(镺)Vi))֨)&i)h2*b~&Ꙃz*)(MF6lJ^F@[n\ `JǶN)*𘊪a^VN\ETHETD+U%ِ"ZE0*Zr Lq[`Eb(H\H[U뺢mLk1^HfU,,I^M.CMHD.+jZ\EcpTM/1~NǹG0mҽҺģ X+Aٿ` YƘ`1d А␘ImS |nѡ 5gބbfύk%DkJ(0|9[XxlÄ Zt/ D`h&`1S, O4VXGD#G1(bL6'SԠ<hBB[fյ<7sxcdlS{P~ 1p>w$tVLUDU|P"y!enq**o]]PC˳Mj .1//+sƄp5_^pO5:Z٧=<UT Hj)7&@ ߟsN05U]9" oD_n6LDqCEؑU0[NOi-M5wO`QSCS5FI@޾4ҨId>Aj(b#ZXƋw=Ф 8=r%Ee S6Rf4ʖiZK(PrZlKPa(c0@E,Ŧp*FUPlUX.CL(E4JS?f +[\CJζ+vP]U,Or}*z4$ cġJ/ֱʔͺhM XY/{өr )ɜ~naPOc=URaoIKݦl>.t1mɏm ;17I2eտo_>jdňf}L+1Ȥ!$ )> )c0  0EQLQYl_O O}F"Fyǘ "4R]bA7I( {dFBdJ&CÉr0̠r,ƻ1<47PLIt-;+:CMk*IT,s-*2\Jl$B?+>]FCR2E ePKQ:5;L6cC/h54S]656[ժm뽦hhL\+@D(1yaEE54qE 00g8(Gr+b1X!|Dr|C(RɣԄK.[y7ZG|Ӏxawh1\xјG6}`jc#+ BJ u61!mD.& 9dHI"đ 2d$0g8lbQ(WoYiY '\NwCE~Ӛ ՗E1#崥ĉŖepIR)=j( h"g1,^ hqmN{ 9w t1׸A: ,AChX I(v*PyB`)ְ.Bsb>8-a>=ֱZYױU^M]jX6֯\X-KVVu,bEKULXߠrq8HUz>-ZvT!Hr !0H`u.},b^XC3 hQWFFl@9@wu_/}I2_) '`-xN .53q L@Xd~(.ۆ er/M 6p5w/6MSKY`_\d8y1V5]>CrL@J4 )Z>H"5C<֨0<3-}$AˎDqzJ.Ғ d[߂cM#<S >̰?3L#6X=n~ xz r&AP/G{Z t3"й| oӊ*dw" A@Z2b !ts:5ȶA,LO){~A 64lhOH9d>)ƚ4A4a=pzץ)YU 'FY ae<iBrI݄5%OڂOh (S( s,emTW0k+G=>SVLBnI 63V,Hq &$H@4"t` !~ Qp/XE Q e<ѳ+h)R,=Yt! ̼\p,G˞Ab0Z = qC 8T<BF GH$2m&o%d`TT{GD')(N(-R,DFۦ/7&%*!.b3 40[54X3&s&5s Pw7ʭq&>ue:@):q< S_b тh0+TR+o(B:&*L%62'PB'/[ "T6ĉ04!M61F74^BEl+ zeSSKeTgQ0B"""+xB(0a R3G˓M sWnB%2" (3a 75,PX?,u Rj3O*c`*ϜEv\i?&$$bg%cAbWRQl6Xo:;x4, sO= N&A @s\P"Mq)p d _5_gG\GNO%$1gNK'67q)\4FJQoƃV+_M|3;9QjUXqC6x2R7N1 {~4-Riߞሱ6;BHtDA?{#[9^|B^(b)H="148vc50]]@FEp-J_*=2\O 2&U2KeVejR&krD}fԚLRVYtV Cd8bO0w,\H Tfq9RTP.{v)9UD2"xTPLhłaQӢ/bat"I|fƣ:Axu\ b?\H@a]cpӔUO\(b3f'ez#nwFK}tO9Q[3)/h.]+ 5fqV}%QOqƸT8\ǂD696pM-M9,(@6r*(kɏlF) AR/6)p[$"W:A< \CT&DIf&V2}GX&QFJ6b/W8zkI&;mxtPXKM^5Ӄ[CZ )kzTzEմT'oiOi< !īQT ɂMk,Ҕ#.:X7kiXF3=Ii4n% Ru&mCnprK c4knUi=@ҏ0,^f)[Ja9JА &6yp*aJxJ.!x*M ݤR Ҫ ʱ 4K>`˯ >ݵ\Ί (k3=ҪjJ}X} BAӕ}׿*ҩa=g}˨J]&+ @j!˭̽h=]܍ \TʬбBeSD `^=$>|92z)Ewm'@sL, .pki/lL[J^s4^2'>QQ L+$FT̯)֢|s>tbqI/Ԯ)XX3[1睾|HC磀?2?P_`Lg6k/B0{E,B  `D#d?hdt'!D$$HJP4_Ӻ{+[)MMܮ"k,l+b/HTiƸ/bِԆQ&gLP>'ПÂyԨP@&MPPE"MF,eJ0,ױ^je_.+&^ [\h.V,ZeUޱn84b\WV\n9 ^f9-ܾsݱ1 v`ϡu< 6b,4組F|6¶~E/2E}}Xrhد` WdZD8 jB<< q"3/4vLhS0uPVU6|2TOՌTV'ʼnI\-\!j$9|FӒL[t&ihYh0:ǡWU+sXI*Xf6W_-uv۟p!j&2d%EVp|mP/6&fu5֢Ģ żquy$:W$lN[7)KL&gyj|-Jݍp >w cdP<4\|̡ Ѐ']|BJd0 h(>qC $CJX2&,R|v%!I)l40'.|Rn$EJ$d`O1mP^₠ .h"\즌tkEP,"o[Ā8$qyY '9)uSLlC;-pSB$qVk"}k-)Ls4= _Y fY mqIHJ0w8b݆4hAFPv#U6D퐅Ivp.<&[X ^@B1_J$ 21Dc~C汅%!;v9x"B!)a |]Lۇ6x 43 @':ʄ24qҔԤ(eiJӓ&Hi:ӗt-}JSza*&lZ8O-#pȄRIf0ɱKt3H'/u(!bdb _a*f7X .ep5-eTM ֧-\a+7Mb]RN%Tcŕ%/sX¶@1XwB,$ձ{cIf:lo Cv%!!>t%= YO{h!ɏU˅H!܅a-NIC(/BQ݇/_2b EOՇ!]Iȳb&69!J +ђv3b R #ܨ: ʍm+}T]E;fmmkU BmJՄF5O)j\EW #REo1Z0'eF},F&܆Nvd&4Sœicn-Y0bдK&XubKIdG1>Qu+;dv̇y)},׹G-.d1}0kuj|w!y[=AF#]HUC FR E_xJ=0,!9ІB3hC`{*5:Le.;Rjo6ḿs]F%ôcp1VKo.M|BjI$jNT~`LjGw A暣y^C'.월rU!CI2f4{o *'Kʈg3 E`5db!hh&􄻲\/%k"j=*FHcEV &kQ`ýˮ?"nCۦFPW؆/䑒Ek pv$J]xlvW" sqJǒ΋X546b̋IgfiMձ*$zR%xƅ:{Έ2є[0iqG\>߁ڏK\AT{3I΂!brE|էod17C.41<"9[L e:f3\# ,O@l5P@tQ! {_$![p lC=11k 8!WyO75 !4R,C/P4O3g49R: 8$ (enR:n, ZqF Dv8& ?`c9#.qR*  b (R%,FZVTGrqu! p# b"fg^ZqY5VH PyB 8b lʐ%*+ro*?wHZdJ  h-& &7q|{~YǁDm[ Qvہ(%=aCt0 _c>> !F‚ 1t^ D\dQ  ! I^$AjZ(mV=!%z9` `W3|3z zA`>$Y,"*R&X2-Hqso{MY)V)~uSj1emh#eB| uQWGpd9[Dwu (tbbxUg%̒BӢ d-}׷r7^A.hܱ.[[ʹDY.aM\=w%2ɜ"/׃2߱2݆zHSiT<$fbn9UgRJSS5iu~oUEsaf8Ë479A;ssx8xS=&hp5@Wg:uK K&, Q,ahǟ* *pU1"+k- XWʎme.so>&9*m4sS hnq%J/Iɡ:ѕxShus"|W/*h]/,ci;1P$`0 T¬T**2,.Q 5 92:M:9*2z9#5Y:Hes2q*! mAY&uB*Hz~nYj(1XYqDrV7*W7 kѠ)}[ky.1q@&uEO .&2FCŵEZ]+^{cˮ"`;kjCh0 h i h`ru[r+zszky˷swhиt{~[KkbK;zw{뺬Kz[+ۺ˻{;u+[}+k+ c ۷;{+̻Dä"ëF<-KkAik/Pb;2a}WIfqtq  |skd9:lar!FO$hG6Š&jló||[|UELiI!'Clĸ! >17$sKi&2>2Fѓv(v,sQ .v[WtB*D Iba9$wz>"$\1"U2JqQt:DꞟɪԢK=fʽAU&JʄJR҈vW6q\(T(Gp̗aJq)gn ,Ro&6ʿ}FN$1(<D*2Bq=Ⱦ [Jˀi*H1m܊n:ESHFmRn03nf>R=UlKu"tjkƱ3uX XU.r|Jk55E\򙰃6CFjŤVz#U*ԁ#աEWF F*2XF{8AMywE.w%m 6aW0dza_zzQ;iaC%e4g1-q<:| i)g%cءo媂 :jDey%]Aـ$ei$*.7)泳s|b(4Jz*+w]{(}8Qՠr(e 6+8Ѿ\DZ a$y/h]m2,>uS n>Qo8S SY6B$*J95)dҪr^ N Tx^hz*ZՂ$4򌥹':+a H'>cVFtV6:h6X>+}+7wˁL\7? 8Qc,kc+gɯhmj]YMmo4s;7 ޟJD'2F1]FNE5 ?-"93ƞfWBJ~"pHT=V+qX5a-7:JrTt,A~Ba(ޤoQyn -Ta,Tz[9ثߓ9$eudMGDbzp:HZ )DSG8|i%Khc!fh3fho^DD5 .|&]^hZ3(tfp\ wR'gVc\H"4rpTf9@mJN]@m T1P˔mRТPF8#1:B1EPQz{)S}+ըI3>1fj IS4ҤTSQJ e죗&4@ԼQ9LY4  x0`ą+,&b 5 e̗5g漙01eK+f%Te>m3,O]ͺ#ŋqGTR2} ᤎ =&c2֎#Ǝq9[#Gv2ҤSiL +oQ(C$ѿH!<4qp-":R ;,OH(x@en$"@ahY{P0p#-;; %})ziR#iPRF4j'p B3XkM6t͵J2YixZj˔ 4SA4tPbt1>!tE?%4D4K 44/@ %1D-HN UC-?Qи#$Р-@6P R ^C(;r?\He YCde3 `2;p>*s=YmGuW (p\$r s}Cz, %T.Hbb <}0Z㘝8kWj&#i&}K(ⓨޒ3y00Pd '}iAZ鵤j:Xzk8j%hP^~)d4[nVf5q>2̳@K<,$PH\.-UCkؕƌm+v^@汻ݝe@4=_7$e0a:,^)Wu=)l7?.Fx@:FӣF$zl(G=-@J4 b}$EKQ)ƚQEhaZ@Ta2|2.PM8ZV}M? eKKO'D)J:T-U))n2(?Mn1 1>[FFʭ12DVj(E,°q:mbIbM}(eKQ `YR*7) 3T[lFfmS 9c{iϏXk~h$L^-& XqFPq305+c0<m/7qP1$&)eO)*mv KB7g'̉ OyC99y3Ei9G]ZuymHӧ{_P Nah:in)qO^6܇>^[-&; FȃWˈlZ~ގV"7pF;xyZղBdHVCF#dD:>4 %'yɓ hJ5TNHĦHM4 ݀怺. mN_.$ {WԽ'#:-T(!羏]$X4E#ݶ!Mqj1KMI6hygB)^=_Ұo3goNۥ=_|{>JDP|Ia?~|g}a_>_ /#oՏO͟O}sݗ㻿>#?K>˿ @,?{?K?> | t >> T T4@\@cct ?E% 'rZ1=s񊦐&`R}5W ؅7P/W˚1lEE`Pص] %2W;|Zj< "/_6BL$yF;*";F) ȍ(I˲,M߰H{yĈؤW (2 0 NN U,ID[X2ɥLDjD2l4%[ Fc\QűbasM\#Oız ( -q)s bDOۇ'&}(ȟ`4]0M<ś0|(L/<Ě_5s/Y6ȓH.ȟ8CڧB/j;zIҰ@$ [/l"11"K0#+*b+DQ?s:Hꎍˈ3DH#iB9B: ĺ1˭`!K!L덠KL ʏ?K;JY%$L,|$Q :#K PGܚ Ǚ) 7H#0 %TH&D0`PEa#;lD۵|]>5cۂ6̡5܇vh)T;܇L6k)4h#O;0YP= H?*1* *Ч* u *PƱ<2-+,CfYQQ25YuKg"؂Ge426%#/[QQ҈h9z,euD:(UZ͸*##r -pºzjD'!1hdíA!|$v@MHCB6*Fl ʷD|7 = QI a.YYՄaca Ǩ8ͱW#M$ ^ $R! HHڌ(Eu3/3s5MpڭXL%,b YQ({g ,k&)+!EJ*%펊/ީꁹmB!0 B&}.K5 UP^sʈ|M M討OQіd j+l<%('^W1:HB 0n}$>Rk2Pߢ(LȜ"KlQ\VUӼ f) 12\A>_aHL UJ;r}&;]%SG㠙*1ګb*Y#YИH}} R X*%2CY7ٜ%K^ GIZYu#ceZa_ڊ Qi~33$Ada⸹a\$ 9 5NZ%C&ҲuYL:=n0Xb+|K(k8z40] . ʟ:+fnf 8E^"1"22 Egy>z8eEU VH5+sF(a QPW1ţ =h`L$Mb}v *asd23(ٜ8c.UjYv̼52(Uٍa0 eu0,  EM&p$V8Sq]!4'l #f> Dݩ7&0u^LdcH˪܉Xb ;e.[:@[Q  ބ=DNedhi 68 @ aըI>:,ͣb.Vǐf3,-)d-yq AU9RA`4h6uXz( 8FfHֹJwUo Mh!.@QNź ;_]2"oӁ!::w6:yӛ J5(gԨo︆7YgP^?O6)N$ 4:A& $ . ( mSDf|LqL[M6ސr[`ĔJ bpy!pRwwUѼyMǘh>x5',!two.:A=OĽH@w#tRBGY81A A_EtR&=aGboOӴM[6`^_Q .jsA*`ZT n0Zq+$WG*a *%*UEv٣QSQefbs6Wys/|{ z xs e|ДLLʈ |Pa)&c&2M@SJYe@-#6c1.YR%k%P*q TK6t)Ǜ>ٓd̠?mD 5ȗRaӫUiJֳBm$+ҦhXҜXh uWZ{r;r$a67nΠKwv-(R v_P-ӷl=ԮٷO4cm&P4E&nAO|9ΟC.}:֯c'mlyC۶7mL~$Ӽ _޼WFyYUIJ'}DՁxLX\p4L)AXWmEQ&fyhOHYtS( ]JIFY+jOchՃ NbM~4gNӈj1i"H+52*3 iEӚj(>DSng& sLdZVfjF{!$Q:HZ_n4 q^uix$$ΊF+i񪬷;jl!Ih*k6k׺*&+h*n~ k-;j6,2& j,#kkf kmfn28hr0|C]2imgͅGOHJL5ɒIiEfAJM($ˤMRY-q-rͶG^ץ\fMx$٭##t8~xb3qX6=hM^qJSnOY㞻0Ӿp.ɘwܭ2o7 4y\̣=><2Dc>S~bi9Jz2  1G@D0E@ $S"$)cMb'1YʍF蓿(RTh D'P)R"D% $2DpKZOdp&KEf+QL4 L$- Z¥ĄGĮtiЇB蠓|3Jѣ=BA{";c" Oy)ΜV MTوr04N2g|R6B r;c1jDC\*"Qy\VC!UU6j\ciףɆ;4FODDhت B6}H9Fe0{|9I2&-7af_UJ&dZLi%Q%ɑmgc Ҋ%͍HBe,8:iZ:01ie,(@~d_IzD6hDMb \J׷uZ4BY!ppK] H#Jij걚2ig6Sn&hRʡl e({Le;"UТ|s TOU.D#8scy(DюB:P%5MD\8%0rb 3\f08(#8 Afh"D 7B>W+iAGP`IVGu|ukQX& bHg?Р@SFӈ={F%09:`G0qi^ $4>izɞieϳH$=1k_J >$ hahe#.]QmLt4ka:Ԗ*)4g]ytoZ N@@q⥪QGW>0<3XTqF94&Ac.5 wK~}G~I'ola@L"\wbcǜ|FAÌsP< \_nEMHGO h (m(!޾֥WF8)DYS.|3AhPDc7QS4ޟ wU48+ڽZitbGՙޙ^0pG;]/wx2 u7Q3 ).'+^"nՋfX.:y4+P4Q1-lu6U~9HiTӚGl2Y4D9ٛB(Bd}ąJAN;Il^u}q|uQpTMH]Vɠف USd N<[MTp`V& _Z)<>aHMdȁB[lnGl&AuE "!Z0]T2@GT_jx`QI,(ls(M%Gĩ Ybp\)+"!PrC-2GqU^Lz|0 B831feqD~2hi=JX! Z@!Ja~6^ӝYSVKփ4H=Rh7~u"Ӑb;ކbd67bu  X؄6! FZ (@OA/$$A L \M.b#$̈́0V"Lҋ%.>C ]*_VVX8YȆ.AYF;آ<%.¥qFk(Jl >0D1٘_zM6o1f_^D?zDD&@ sz!}tW`YGN2X&fj&K* Ξu!\?Uh]F.CfB&VGI* LLNL]B'&HXУZd8 vKk=g8UxEMԹX@B:@Cyd[&^Č儝LӔ.݆$Oy0 @ k@ <B+uG< D D0 DR`0BDfj0p&<kN`>C`eĥ'e}D9RUp2NkqkZFv&F Yg Mfdu^ $bʔ $[H(q0̟(k,֌\-t=ϤNm MAPBzflc\B.1 aHF@c.源uJjY(LnlQD)ki]:=ԂDIڣ&d ]h"IaQPDH.0.Qoڕ.~L+DmOM)bT>hBKxDRRlo­lI]֔lYlXe3J`:6&c>DBhZ8 ]x, Z]\M—iFwH*xDǺjmA~ݝ9Hv/NIE q ?\~֨Hi]a_Cx^RI&s+`lF_œE.wk|+ 7`cb9cBOmqHcMiLlT-䩕gAQV&9J@S;]DBhHL#ݕH}mD6Wu i, :Z#~D!>`$j{ Wz0m~}J;ׇ;O:!Fud2s Vaz~H n7W9EK d԰Es$,1Z0_"tM߭tNNLbj (U /q(CrU8CuF=X(F&d}s{; |GxVWd Ĉ5l˯, X d p0K_ ` |L`JHBd LT$D a LbKco 6\˸$La;vhx m3va̳ 6oc! &op7Gs%Ҁ9sFuAlwrTw#(xxj5Ik?͂CO RS}(M? eNЀ'n33V )9iS7&uoG>LpxʤaMP20KMq |뜹+N+3Ix _ 0hww7x'ywcwvwy+OFOEID(-{y ix )AбKxW9*y-h]yyU͢\빟9U]axV-:U҈M:Xf7w"A1ə"5 &>7*e8kd'ӰW ϙ=}kw\M\c5"0)0@%d{\OUo{ؘ]{;;Yb\'b]2z7l7$rm|ĭMp '̱9m#ϙE;)]f Tye4y,.<}q_;'ZA'v%;4+=\Y8YV =ׇߝo]gC'zPcXh7ԃ[QR7GrD|'3\_jЃy-=Vc.&C^1e;`9V<\{>bՋ~b-9ꧏ)~߹+~r`9>T%>,UO>{}+?ۚ)hѭ^I#%<$J,G3M|!N&(&CBcBlD2I1S6LAb&d`D "iR}mBqj^ cPiִygNhz)亓)1 :6mʓcҢA iE$v yREꩍ8.SI='4T;2 uS\9yUo4S}j(Q#y}3AmiLiySz5}wnq%?F/Fz-SVFAM4%[IәWna1b |ХGEi2m #Pѐw qjFO/@'.g 8}B$oJ+<\0CK&I;P*IQ̱8zG.ko#1q#(m҄2Mt`Hٲ.]0FRz'7*}{"S"J"2Os"2ڢ:$IH=$̜Tm :+LqӚ4ƕb+0Sur#L=uR[7%VYk5UVKd5҈&(VZ6R0Cc<$&yC9/Jrv]̵>҇L3{J+}1fʧN]8L&92rH>5VϢ1"E1e"aOx?6;=@1TK Bj^tJÜilyfw&gqP1$RjفQΊ|)d4%IjZ K`2x{Q+R|^|ڧq r ױ`?sÌG4t: OcOe&PBS(;G}b(^xW>BotyfFo uXL_Jg?sZhw)Ґ6Z$2|[PZ)(uy5\DK-12QZFBR HG"RFU1$De.x0; ٓs,9ǬU\ψQQ9۔ˉ_) z<2?m0Ivk&#.qD TCn+K\ (RA!;&o3XH@%cꡏ6M ERױnNsYuZֺ0Q .KDeShJV+eN"Ŭ7"gˀgՄJj8MNְf2> " C$G@) 'c,='4A7lXq@.bH ҢqIqs4'<69 hEΦ Ѡ7bBiJ8qF`GEfpŻuF0C@w pDT.4$%QK@ӈP2FU:u4I=*Ts\QVS3Ԫ:WgTIahH$ V4aEYתֲi8kYߊy+Y*֯UalZJض5zū]X>v}-b^_ +Wͺ~5`:Ξvl`KWU]igV֭-l!X~"KVё}eJ#`$)-ii؝y:ެ/AXA1IbÞ7]%B#Pf(I 7z$+HVHDT  ޔ!"7a`C1*%ѭ-4Dt׵Q]A!cn@O_ oCI 8̝ Qҏ:#@(Q bhe:rm*6Ҿ(;6 qq;/glxb6cg*ڠfQ Ǡ1jj0|)hkۏ鬕8қ􆻆PRu0dл&!;NH(dRQA%xwx^QC1[~V#]%aEv׌=-k9踳%w2產6#oFo7eAMqg7La/4'a(̃;"~^B+3Zem.!$70$xYJ;sqkx58|h1n2͘?qblFd9o9ScIDR#RTL^bvRuJcw蠨?Wy%.PxP$'#w1+)[?Mdb75\SehBӡ׉O2'׊Ј,\.?lYXC:YbJD~ BKf~ D\\PS?~?jh#Bh>oh1)tIH4o8BIa34!B>P(L1m.d*p!CRP"l!L+$FB?dB/bde*b}GXx&%g ++- $>PV= / _h$mMP܄nA@?$#m8t4.=mceZgdՆ!"!CCL="$+2d-HDR/?L1xz+&> p?J%@P/SJC%-d/ouQS1%}tFddqjs0EQn,odM(Mt##~~#+$QH"цGg~B-S"eل8em rn\!ɟҟ ҟ!2##3r 3B 4i4* r#S!;r%7!"ARj%9& '1R'wR&O$GR&%R"YR#[(#~b)u/f[@!4 R0iH M8ZHZ$bGrrAFpsI1v7H(HK҂." 2m! SR100C"2-210 3r3335033S4A39341S5E35[S5]0a4I3O36W5G0s0?7=8u738YS7_s4956s69k354S1o34y39s6e6)1-1ZS:+S07b×Nr?~0-r D4Gٱ1chInCC(D7TDAb?s1D1ALG**1z$,BG4BAGsG#mE#&Np?qޢ骔. JDF$BGxd.4GLM?)EHGHPPA3F馎O4P>'U'NlԈN 1"pB4TAEmT%S3A-,K !%A;5EűSG8XRG 0GC1X,5UUҴFy$XW95D MM;YM^!0!PVZI/uOuUyVOU/$bu`5[uŕO]ǑbK._H/!/ӔMXT2N3p),)e>OͱHc@oi[`1fFO{@[T5dUTb4Cu&B &ԠzfW{uGEdG;nOTXr_}u`[!oM}4iqDX7_HGa>tM@4HjrÕ\oSp!31Ir?oQCʌeR! ώ^axH/wܺPASjT7U{G6b`[U)~`2L'4A4AW.5bq-My/ո8@ 6s~G]sKH_7tAsշuo7}ykVz8 t{st~1|s~w;H0V#N=Ovgn4hˮda1@Bs6Ao㗑81SVmxm7A@,Qt)5YMlj9tܔl2B!ZUHD7`ٵk6KesWUWq7QU$#+Uyx>7FQrRtb$0ciLsAtZ^bYPn!Y>[lY-G=)~ormAМm$fHbW`oΓ[TY 4xE=s3%rI a՘sj5qwV}5 XGR.ՕF\oI6_2`sI9'ِ/`s)UM8tlіn?o1 kp+mV%n7Ai=>KQd\Hw.+8{Op5s43᪳ک}N3˕|WtU@3/!GvXw^~/%8yY]yTU{}\3H=X17PWyhyѤm$=[{ v5-\NRAc򗇋׿t^VdYsu,WSoSh/վKgxxW!yJ0 >1  EGo2Cx4[0ZNڧOz9.c})6f>5iRL4MBiҩLL44] JѣH*]ʴӧPJ%&Ŕ S뾑(6--ې\8Rȱe>vXi*[5!HͪYƐ) lcɔ3Oھ#ʈ! E zthE(‚uϚepõ#bv#)X`B!C6]Zl]fycG_R%qGYB? f [7]`&uOKG_t)XW0UMi&DC&?Me(,Urь1VoohO<ӎ=#; IG")@f Ic@Ic@.IcQJ\* &]eF٥VPZeIp)'cYgd\ioB&Sb%xUc咍2!M&h ⨤jLUJ&ŕ*무j뭸뮶 P8䔓&.㓤&Hi8RI WVkf֦īFCLNl 4HS^Fֻս2koK+0Lioo;2q'sqc (/wl2# /\r7[nM(h©>yH/U|$+2R0R\2$#,v]SrQ7lX][66Wb[g7^lY'זM1|iOiki5L?`mcͳamΫf.7a^W:w {͸ |z :\.ǷN6WLC|v*⎙mT[8:7jπ`h%_Y~`Rt @Ѓ[`(N% 5h ! YC B`H& 1:xCq3xý%.rrSEe4ZFG-mW=⑏{]lW Rg0UOx>9y4hAP"tCfQ>3qvJQFk*1*\GnM+\#qk^ײ 6z,_ۊX*ְ+ZV`>EA/  hAfĴmJ Ϯ mkc}-xr[2< Nxt׷o7܄4W q[Z=nvmnY&W9)nv;Lw%|^-/zkW7g͎Bt8 Kh!b-MhSS?!|f@0XaMAvO\&K/(F|'ǡpbPD4 e?k1c$7y B| 91 #5}*[]3ōB3'+^ zPW2r|=̓ 2r7.e>2\,`KVSѸKC׹(.wU!h'zgMѱ1Rl ZEӃ%y;B=$-;E }w_Hx4~7K"+|EàeA4K,btZǝ:CEB}Nڏ^g9=A@ XZb/4x{?k}//YIkl@F?a鷞7|w%|oGg~iz}ncw{7#7}zXxw~}{'%|!G{ÁzhP@ c, !1v>R@Xm$gr!0'HHAXnQF8EE؄R8L[؅p!62RQfIjρl1uQkc8loktl]Rh!yXo66pQd.bqZ'mkmshqxpy8l胎xtXKq&Ȅ}(rqh+w8SBvhEVױ'(lk5epap}.mf)!.7|&|R|ܘ|y|ۨH|~ҍ؎(눎ȎਏysG}3o]w,Dj! .wx>wqyvsW2xɑ{~w! 4x'(n>98{*vx iP{",tG Reg Bp1SZcF)iH i\YǦfF1UFsBZ6qAV3Nf7F[ױ`ZtZR['g!Z0ևyf[hQchUh`Z [qZaV졞 ✠ Yo7h]'qdbi( Zgك YBRF9AbU@ : `t%ٚs%\wh1bex J!A\0 c.ZZ8Zug)\`u\G5VjfPe1Y !m gYsfdeA s5dedhq0Jdf0ʟfE !?Vfe뱥槔OFxsjVgr!kZ:jkn~qluFV*Yƪ]okS})(z' &'r'o}|b㊭J4 m­|Үn2&s*%R&(z''zүR*B& k ۰;+Ki; &!DS#sHvH*[I,Jك+'-4+I48!7=[7m#=; 2q81CD[I2H˳~B ;*3c6+6N{Jp=VHt8?õi( p@S>!j 9 r9w;sku۷@vy{| ~ z۸u;뷏۸9۸+[k[u{x˹9˺+[v+뻸˻a;Ļ˸+ kλϻԛkכÛ؛;[ + {ۿϋL{国{L[̼܋k [;K-T9!q,"l1’a'l%<+,-/L()3|*6<>: 5\4,2H+6L5|K P\ò;N\G¸Z<5|7N Ś;dL%\^̸@f<ƾX<Ņƿk'\ QOL{Ljq,i]yLS {,ƌ\x\Ȇ|Ǖ2 o|[lO>izI,: p+z+ ̾ݻu ;󻽱˫l\̾ ,[мw\<ʢۼ l $ܽ| \˂eS;a>p -+qMae؅-،؃؉؈ؑؒ ٔٓ٘ي=Y8؄aٮڇڮخ=X8ke}ۜX؁m-m۬XڼMػqh:ۤ8M˝tmػݪǨ۩ݽڷۭ޿Ͻyܗ]nҽ GM9,PJEVc¹k*_ na>\ n aN7 "a!^*ά&FbΥwV<ǑgzeGa;2máYvq17f66eH^t1>q6a<sEcB1#< vcr^I.1rTA]>m^b4ON~fj*`~cޛAz}ހEyMn{>q[hdŽfJif=hr!zeqFvhqIi4w :emFmDGW7LiqV߯yXhIwJZ֭qYܬ o6L>d.idi rjkqƱWdFn]qY WY1dCj;AfHJ^?fp`7iTz_qTP5w_Q>!A4?%JkjHf mEj9͉qJjNPEOnA&qWDV]6Wk,FakFV)ezNs] GڇU]q腚VZfF\Zfg``v;vfs^dp*TVz&]:sO[ŏ.t9±4`xЪ-11qO \ ? -[  _#F}飷2}ZbVO^eUm_} mÍ?ܨ}oŊ/ɖ/#Q$ʛ/+2fĘ0՘#Ǜ Ejjz2͸fʒ Z05|g۪7eF[gUKЂ6d6lն,})eSWl˔(L3,\+?zL4MiUY )KAA4ɰrs~iR_/CB|qTO)_H\c ~0gş6|sI6mY4eiRF4҈&|eybe.)-MNf.PC^2ʬng h%@gP1*aI}hG5)D~+9::J0I$e " J8* #̪L˰C3&# )ϙ s'2;@#3Ӡ3s% 5rs*l*j 54K:4eO8.ҲeU*qU `Ԩ(+BUWK]td[5Cؤɴ-y/b!%C=4qMB$2Q>vtyd-E'yr$AS|ZP ! Xyy"ZiPΌ^"#dgp)N`-#>2KUIJ"%ZK\>.n;Z+(TʚH ЌVqɬDtW#}[R|2ڼc=.im. U(rTt[ 91r0 IH .z)]=,Np˴3j´װ qZ[6l=2(l Ie@dՐ&b ESJ:4b5a}s0A/~xWS؁d8ǃL$)A "I-78>ݜJ'vq€f3[N5(N[Rې7Yq^zetKSHYVMtqUi7dfi@6)IV*"x*-ryj>2E?f2yZ51XiͱFH%17L0N|"Eee)I"VvH(Ql:j}01Abk&@.hl>#Z$@3̢C+H s6K =1,c#3D"Cd[ #$ ҵltdBbI!D,[mTP.TE鳞$&>*+TNVFD#%Mޣz#OD OJqЊąxd_PąaIcg, c'ɔQV8(_;@)(Gڭ-q-JyhX25$ڭHᐭQU& FogSn_Yo:FRU86V'`qiB.6iM!jif/yQӪojYv =+OkxdI_{pm#8rNy/q KrUuʤJO#;2/ı*@ý#zK<ê  1T얨{Ӵ1ua}1xI3ĞVNX6ڢ (UrI4ϑoK=)'K*GJ#b6;$bV 4QBiBɠR@Xь}Ś=K!7g9j(MCElLID&s.I!> S!K4,;eQ;)E_ E\(?lMI]=2QX&U"GևXR< %IHhR>,>aERlT4:KqېEa >휙($T}lIM݇Ub#vPh#Ցy`h^Vde] ^&$`Z3g֘$Kч*xy -I-4$LdÀ\Q6: _tEb*9eXhY+uJa C{ZdKa7{Q,\GK\3ݓ$aD8V5Fo V-{@dZl/ [ CUhlYP}؅s ?xN"Ve8&& % ۑ(/F~U.(E?ǤV >ͭ?UiXRAK)f4ӰH!Ԍ[f[TRJb Bck㼓??ֈ^(K=#)"ѳH7SXur}e ;sV7iT+$7HJ%1xs2.@L2vz&4p}gز}вf~! ϰ}O}P)y8 `kg72kyד#^T)Lv\zֻlMC&`Z:ȑã|b5zx*)MNR؄ezILz]p9مᑊYP]+pѓ aIeY +0.x1ЏV-tR 1;eH D' ]늃9%a+I>ķ=^3gJf_~My &ơJJr$slA'7'wS=Mm/iI 'LC .h싢`g{$EƬAS~I ;V: >eAtz5x Uҫ$ә\rljw3y)c,_&'9{S54ɢPhk7 `^GA@g4G&|Ђz ._BB(2ֿ/Ix#F:zZx3EѡDd)}z3t:-.egtƜc(qLhl2^=:- 澥\eϮݛP/f{QVΙ6(՜{ݝ8'ЇB)Nq{kq;u]纽Y>ДegVso;nOWn#đ!'~K{5ߠ~H\rE,Oi+-Q*Y1F~_{q6wsweIff~pwSz1wWdq.qݧU(*2>-.M>>BL(I˴Em5VFıO;1lRzqKQnuFEQeTmeo2VXniZvF퓌!XEQ>]D̛-q"quћVpmkԵ%t}֛ϕہ&ǙN5ws)V=wmߊl֚w9멈V] dM_[ XayXQiqJ(i%-\Y[clUz餵m]U*aXc;gvfy'[jya֜"$殪t [}Y)j-*c>bDӖChi$KwPQ݈K@B,RY54/eu|H*qE"m׈n%nB] }r]mb{ĕbjwH+j6qr!IYK򞈰`ߎإ@5¾_c[UKeJffZV6es1u(2/'e}ĝ&^`ȠQ8&VɈ×mn+6:b0e#l< &@eĬ G  ȀG+Iԙ]!-E\C1U$#O1SC 6>Qd$1 L~)Z0k\' x\d>',^0x4*Ġǁ$*%+Sh'f`tRPNt!mYîzlx~Ef kzs]YIR)O]wg2SOU߳\pT#bJYUlQR'mNz&!%L0u90}rUa8UZ(^kz r/dDAZUf@D0HHeh"bx`3)g{a' 3^xI]{S.M[NE*8Z5˩?2byLfSyD0,kT A=qrTs\aj<-̫&Mg`Ŕ,EJN5QNCt/A݉,wo7 ١r-3.s+Sc-.s!z`rl#']e *fb;fKŵ+' ؄2B(ID vԕdIKc Bft{)2Yy TeU;lDeژ/պ&QտZC!v=Hg1td)\#>hQL +=!N!rM 1kc.LgV?zy&k]!?- iaMmt<4uJ-$Z+w@W54I%_ŕ>Z05Tvee(+I>lS|k)pL׋f²kd&&_r'VZwδBH_lU?X]2(Y-Lí%բӮ/WH! SCU? tW+ULU҆ݑIfs*h kc`4bm( bDcHjPq~-R\8S99&)"4|W9{38ʮɔ:V+ݩj>+8xrcBȣC(ݤg{V5+4A&Cg0JO |vUirkb\xfP+Q#`0gO&x] +c_HKNW@Hd=]&YePFK`'2Ld-&mEH~~{|4]_FS d΅;#c@A.tF|:3Mb]Sw!_(]݋~o^xPd\T)o4مƸTѷN!jq4d\Z^ϰ^],̹h0Ll`ڑuH@uME-ĝ_Uε>^xy㱎M9Y'юwO@QSo}p4^bH%NjƳ`P%dž`ŬBITTOUtdUZT^Uu, (u0hd!슻ҹEy}mHt^9N =\Fn 0hHluD%lbm!"yݞޛ@S5U O4*#cX"兯9޹K"E}ɀpY<(A`h _ه bQn'mٵ2O:MrQle[` ?E`)-R8OC5H!ձ#S@JQakp}ݑO_5O.Iұ 9TQTFid@6Nr͎&$Ae"nb+) J>Zy ԈM@p LaX[ `EFLR6ݚQ0[+AU Gz 0P2B|a̱vQJ*X=p40M0A ߃ͮPMv}a[Ij0 .Ŵ89Ɓ [ʕ6%PDQfy^D cظA^9^e%Lҧ.FМD\{d w,uAd`cehH ڄ .Mh PWRALԎF  BWLć&̩1.ls91-Mq_Zt.‹E^KuX\OtFsNmZa,\2Nn^E^\#: l4Z RMø8Sc=) >Sq븖kIȉLqYΫ+++k׽ 2Jl2Ě+RlJ,+V+lĦlƮ,:ʆll,BVlɞʶl~lެ vl&.fl6m,l-:>m>-Ƭؚ&lqFܝ ֭---..&..6>.FN\.,2) zyv~..Knn뾮..莮nʤnznzn/.Vof/Kp//®ronRJ/ov/n//N/ʮ/ BZpb閯/Sop /.b~gF1̈. ;p.o?/&R1o0 srpojq_0;  oGoo;pvno!Sp0q?'#1K"3 'Cq^!O/ /'0or%k%#w?1&"n 3pi.B$ 2Cs3332;33[s3?1#353[,3Oo銯 r3z37_83237s8Ks53?'2K8sB4373BCcs4LB;t6t?4C3t4S3464[4@3@cs@sGDktEWH3Ic3Kk3L3DB CI43 BCgtK 5@tRSsNLsPIEK3HK5K75OtUS3JS4KuSH3T=B3EuFRô6($(AW()~c|^E 맨]!I()C B\Tx26jGikB_SyJeEV+aSf b#|oG vl[vM KErŴ FRcgĜaUb/4.K`gU*d{ 9wwO7q*:ҟoJil8Vw?bOW5#/wyӀ(9mjh=ml AY9٧\)Y;ӳs:s<9ó9koXkV6حN#ш@*`tvƛ< F=ngMsXy%Ý (Y_tHy^eݱRYǝk Fm{e%QuJ呶)}nl${ؔYU9pڨs Zt8(Nr&6:DDCfr[LK'#ch.F;CVqﵟ˯@6cm[VRmY "]tx$=܎`rco$- i`v#ы|v =6Q *]A8Y+V[b7Z 2zƳ|xaS6MN8fPxw#UQ`Enf++2=48kw.gg@)_Bڿ6V2=Pe󀒴8ț1H%cFA4{&a!X!5z&z( dc͎|>N ~cŚ! w\"职^4-#$h(_BӨ/Zȗ4]vh%}<ύ(K Jfь%.U 4eJMN}Q}V3I5؜+rȲiF=kTV]TYLz}sjȷ\o Qeٸt'S}Q r_GMFm*+߽wQ}uQ~'jhƺ^ɸj`מ)^ŧ59u6O }BML*)̲yd8:Y$#R/*0t8E  eJFP(P!Q& 8*paF4q KD4 b0I ˧I:t)(;s2C21> =(*HB 64+S\3>C:+ L uM@LKH1-O#㒻%K¾J7@KNBrȓCǛͫT5̳LR.q,O3C!&zpH#44y0x;0ʥdnDhĐ)qB!QE hE O`Q#32$ )qE*q+u2HdBPD<\3LB$ M'؝SՎ̙[T)j+JV?2˺ٚM:͜"> 6|1I;;lTYcR6x ˕}ӧ3{%0n^-l5T׽[͢иsoe@/rdAoa=ŧ!b#*nwO.@EabOZGGLP-bp 8b ITDm4!ye5) J~*50hbڢ&%gShBVԔ)RXzIj 8{L6QlPR&X([YCC[M0.Œ hkMT0s*e:koz2,oOKP5>g6ֲ,p tUsh>E':N@H$=ľS [ w#=?eЈ!YHvcWB a`Ĉ#,C)82FB4;܁x kF 9@pڔ9f_4ܭ~6PJc$)eJb R:X(@DL VR״F6`кNo#.1meFmD3]-PlIj idykR>B5R&.~DÁFN$A,@hWWn>8K"Ԥ2IndsI hOF>`)#ɋ&OADšHa2NJ`kX)$PLdae @MmMhSSUX țjo2V.͖҄';QO)/,ivyE2i`73dUUF8Meь q/l3&34v?ES5i D4QvkdRp|Ymކ#1J~$8d8xODeT pRŜ@76gp&ʘO+$*4>0"B - bZ@:wN#jC| $' yB)(EZwR$ Fdxvf)Afx GEF a ! +bH+R# 2ț֮kkhAcd\pC fπc^迄g%&"H~ܬPΖOelhblF4gЌ |셊tȃFZO 6 \8D e!"Ck>*WL؆ Ap`2DehBN~b(aHlq2.$Bn8 -BX̰B `Rya D*D*䘔AkRȆ,:b&kX㜚:PN,FXiDl6PpHu^38)ĨMh 7\M5de:l(BU&GDoSD.א5%b+6$PL5- hD˒.ѠX' `P"!B 6PawlhlOZћ>!yD>D8E<3IFa)` K 2M^걿vWocJf(8j:ꠘV(3|H㊄14.ĎUfQ&1cnĞrj\FҢ.,|g5;0џ6@0&gp(<-g/g7j496/$),pZMbKP=d%,6 v@g4Aeh2kV,6{C.JL#y23D r34 Z4E 0m|'pȦBMg,WW,&83)fTPu \(Qv'ghq[B,OU~@Uf%cJ%u5(7iQ* XڄWebL|jol_L`H2̂ 'SpS `Pab# vii@iiijjjP 0 @ vll6  m6llVl6l϶km^(X hXpc'Kd)N芾A -&0{&=H]!f(+gk:.67 zcUj"5GmF+ƥ$86&A Mԉx.N! #7^e=j+(M«Wr/AV-(0"}'b}K}W&W}W~~1~wq*w$Zc$Lb$q1}WО}WzT)o.o6k)1hbRv7p ʵ0-");zvI,l'FS(P$RnBL‡(eY WR"H~X'΁^nᬍ\PvKhr#ShcrAuTќ*O0p^PG;>.7(Ȫ%1P7n41LA)sS*shO 3rHZ&9XAӋk.9&QS$SIu?U6kc;n7rfaN,6˂xihf^Gе$PNKr.4Qb>Ot ;\NhZ<-Vb鼤IsOQNmx3"S0ȗm8HKd5Z :z!:%z)-1:5z9=A:EzIM! p@ n]zc:g'xpzvbvze:y|bڥ[ZgZu0yǨZZzZZgzZ͚gzϺڬ[:㺭ZzezZ뚯:az: ۯ;ߺz۲3!;ZڳE#횭5;O;qРw[ ~@ ⺷8t_D!E**!RD!!EƱ"ۺ[S$RDЛ{[ɛ[۹[4uN>d#LĿ#c41Cj"CA ` !ÏECEď[K3AGWDVe[}$jiKiO}Q= JQ}-w]s={5A׋}#}ُ١=ڥ}کڭڱ=۵}۹ۓ=܍}܉١}٣ݝ5ؙ}}ݙޥ xGc 莊\05?D=( 4 ]A/Q^ii=]>рic> f@%}އ}^^>~Cc0ޣ^uݛ5w=~\Ởwй۱]}ދم=>~w}܅>tű#~7!^>}B?9>A>Z{Jh~DV B!>'I>))~У3=%>GiɿiV˿o->%#]ީ>tB&eAdpAM@k0!B A)$f …bJ`(b 4 +Oti%L 'NMppӤ͓=W,JAlaK;,UJHU֖2efMʱ/9.<+ӥU+5ܺƯ\5 -ʓ ݚD ]l&XK TVqg!.qbə5&9;n 4XT efצlBEۍ; ;jhdf-2.9/docs/hdfview/UsersGuide/images/new_file.gif0000755000175000017500000011526512050301073023354 0ustar sylvestresylvestreGIF89ae3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,eE[&*\`h#ؐ&^Lh#Ǐ Az$H`ɓ&S\%˗$c\&P6q.Ο8*NeAC! *(OC)5*O8g.;e3NV{JٲEU[UM/]ʍK7ݑ"ްv<È %,x'jǐ`3GrA{,sOC$Y5偛ʦ vMZߎ,W{>3ڧȗ%_|&I&]^]S(7=SgPדU^R߯y }uL֥lL n&LX!l0øX;i|"`"r 4Aюe yfXcmZ%ےHMqUK_%M5WjY.](D[HI7~LiԘic}%֓v)HE>ETRT*WH%Zwg}IӔLd`ei5(KN; jv_#>Ȭ_᫩CjZdPDY,i>bf?VRl⨭iVjhpdM v%X [O_\TeN2ՁuP-uM/rRI B{'46[[a9Ny/lq%+Rk.ֶ|Ŭc  /s0˫]+#2LIb96crVdeuCςQ+ۨm'iVYAOb$qӀWZJjpsιtm7 :鷿EŧTm5yh=yO 4)[ʣݶ&j/36|sK;sHb Ͻl ZMk=rgm -fakKhr gGdOM]unϾX!eLq 9R[⳿ǂU,7>E.c πzv6kT[c fE hFz‰7SdLbjk ʰ5pQ M2Ycq5*Tvw2QެDv [)vgH *$X O&OjRVrQfUfE-LoWÝ9>y3 >Hh P@ 1p4h8D:#v@GDŽ;Z6HUɑzRpSފ[NIκkW/ nZTf ~ Ri !96Y*o:٣pN,5G 0@?7 3f%Q^jֻ#[G1!{Q4;8^(q z Q5{ZSw$@Dzk(Im7(WћɲQEm&v:d1Քjɜu4/sp&*sJMӷlO*++(A|s+Gs'w] t`eC3O XDDDX8J$0mzn05 1 `i `D3]E;+GbP`)K5;x2S?+B7QT}cZWm#'\cd8c:wtB9نPWR30"~Udh&UXA$)C3YrCg{-CN  적ȁO* @+ 6RUi`8GF*nQfwcf*PZLkby3]TJc!(,dcmmG'tPe-d45?F)H1H&3&) tBe}lQhSaQ/%&/fFA[Qo1ILȋbZZ0I1yi[0y)XXF3O8PQ}9fu|8.L2%btKaqW9'JsV1$4's/2~%؆67?ÑdCHeGOS8R%uuBv@ZB[ sbaa-q2#ƲC+iȒ5;W=qQzCvoXP&? 8 6bug3|2brY?HtZZF1:\lRZ\bu(Ֆ/v%&1tF* R&nLJeegPK"f;vLk$%!s6`))Y-9rF :Qr$AbpZEo$qFi/VQ&HlfI0:Yl&iXSՖ'.*/$($%CAyZaB/Yb hX3{V>b#A*Ub-s]n'#Sx!1EgbB׭Ʌ BAuQ/u)(@):VHcU!JNv1nb@f\VG $JrKKgfx2Sh91w!P9-U5Ax!3T>suPUsQsMxXZw:F%(- cVK&'z%%DHjB(t8 q(Wc)52jsV,+q-/q2px!4WvC^2ՠ_guƷvw~ zv'Q?v%ЇvJAHGgBR$U-5&JuH{WfvDrs1۔kCnkqIaRaIr@^S{}eMxbѸ)] ;if+{!+5kL[*ړ)Cr;2к4q~?>7>bZT{egYPɮ'RKk(?SC ,d([e@7ڱ«?Qh RǽJқmÈ,ރzrȜyyӟ,ȗȗ^86ɡX5!X  -hl1$>gE.,NX˲5ւf5\̾l-!s Q-襡,ͪ,6#jdNaNۃ 6əϭɘFȜ+$"m"zM}"z & '-+"cohbbg"o5;=6=-:}:BJ<M9`;9}18?-%r54Jc?=974 BK=7.>^>= ~ML7BN~nNO^2?N+R45cXA.PhZe_lV0VFnNyRnaM!>:X)imB䋮BN嚮xN'PNMbc.jDN+)w#n<^N䬞r<^:ʾl]n㥨,8].>lYpQL^~x:i>n =R~큎nc=2nNX6ǞζVl,>N/s~L#/舮ݮ1+<4NNX1/?nG6EȮ$iq>HFOc=C|,EE N*Ō}OWn/l\.⣜>lDOX`O6.~/ܣ:~A4>+:_Nl?l,Xڮ9NPN92î?s/Q>z$m}XP߲֋vB&F/"Dz /v40Z=}՛hҡɊ-|i%}$F#u$d΃7ds0T&"E8kN5 `ɡMѫQ?G$ʹ*dې2=-C1g"Ҥ#;tk`O/$pL})Ou1@rUHo#Q0VZ89,jd`~+zk.m\ آ ]֭vs'75ܛ%ܺK,ajg Gߧ&8eOm:+HNL( ] P%nB뭾ˡ\`C@붝hHp Z"jCѱB2*A7('K+X+Drϧtp9rQ?#f".ƓH7'-z6h; ,8,FGR 3@"t34Ф;j+cP7fS 3y:lM40!+>DN,o~tJ|⯱TDe;Ch%GmV6JW\K7b#Բ45¸*{23ŮEMh 4θhhA;v'|*d-B*~ 5{r WōEJFȴ2ط>,*_xY"I|F- Ez?*Ìq+R[(>=EJ, C=ZZt*[v' Q]rۼ~k@DŽ t3L=e|jn2m λI: ]E2;VDHsES镙:ڬ:kO%{s,:f.{%0|U+OeNHnO^=o?856yPYf 4HT C[Up"&SWP$/}a,BF= Rzu4A4pաnazSTGUXTinFnl-e’Dla+LOiՒbyB-rs[Do#a3 KY.Ԥ*g-P% F/PDh?PtuhD%ЅN(APF G!QZt"hAKҒ&T(F&䠦%diǬ!1*T`FWqK!Vȴ'$niL419JIJN ~מyjB^l&e(#dE+Z˺ Pլh=kZϺֶʕuk]ӪV5l[Zַޕ}u\Wźuuk_zظ`ƪ]l\7kXi-6 yɍ[~ -cϓ&1җshE5Z@41躖R2W q.$DBJÒTw*x.98i#ͬ2I ym}O$*d'\7Xy5[#1Ƈ6p%;jR彎tʬ2^8T 3H "H /K=%[ڪ5uqM&9XikcwR%3*ɞ]FYӐ "Yq_b /3 Op2 ~~*gZ#K:Yh4 3.Nmj,:d֠.r+T9" b +%ǎ~d86O:,$ADrVhD28ҟPl8q3EeB77҈y9eL"hPnv:mֲͮh+(9Z7{/uE4ꍐz!M/_f(^<$ ]T4J|Be4$ZeSfCCB]\4J\m+t"A rɪ;ڞ]w1^,iGq۪K/ebzm>$o3Miꃉ h 7hKu4qY=|Ke}H#^HQ.0QEQvȁ.hКQd=-؄U!%V1̕+HQh8؇`ЁH}l) <LTM*0UHuQKj@] v- y+}%H V zEh9PG_|廓:)= c3 l⽶m|): Y r!vBl|h#`}؂PЇgHLqP4}йz=YXHLLdBCF7\_CUZ}+;#K@/IMҦ1ȣQ Jr *$OSJp<@$XB ]\Ab+hŔ@]emzx0b3݂PT-4K^2UYcB5hī}ZP܊I`%*6싼eLYu U-U^F L+0e`>xڭ,mmDN ļpQ@76 QnKRKW%Wq&@S3J02C<\ | x e& װ-A(|W;h0_%u|65 囁 -b Jg, H]cB,M$\Bag5 #p#z PEUmPd]L@|cMQ%p.ʭ$sFOZL vxh:Hp[$cVh\^PڽO!-f~7xrE;'y!{C@蜴θK}\7 !c٭5]5ebψub+_ pZZZ{-VyZ_:S Hlu$iʧڧ4+ PBX448Q ]iUʨe!QE_e5^PxGK􅈳MQxj}aȉV>\U[5exje-NaHeMR$}QkQY4A5YK' ǀWeRzH'p3I4$ 6ڕo:C6 S*pƮ X%+&V(Cυ@ h$ϩTŠƳ'fP!lo5V@ѠJ 8‰̬\`XBUW RMViE~gJF^kSBZ@UtU`XDd(\ mƐ#_,^4cŔ44 3#F) sK79<0R>=:UgʜT[-KRA+m 3O;C0ӴU*S(̊ЖY$2[LÒ\p̄'&qČEs4 W5TCX(PtJŀ{3IҚe^Ðp4\Qӈ,ǹ3Y I(FCoWX/MPG{'XS!~y,w5ADw=uWPŕ] A[eA'TQ,ESVZat,ѕ]Xz5DHG|kVX4D=G^EiQsL:M"e-|2[bF59^SHbeqxqQEME_L8= {X5H MfIWXIYޙj%4RYC)D"!HFdT}R݅裭~d"R_l쉕kEb\d.mc=eZ.OE)3 J1Ż&mnpi 0ٷb6$|%u]wiD (Aҍ|zT ɈcY=a˫ZȖR,ˉ>wsIU!ȐUUT6O8$D,3K4hB{ζeXR}L䪛k ;f^x} nr<&yFý=]W i]D<'S}֩dԄcxk^أs5A O`9թP5IŐ_rO\Ckʹ}md6hVQJ5mn۝stlf"?ioƥfMIdoȟh`G@%  kӐNrib(hkP΢B=qt p}_1~ÛF`j(0谈E&r|De$RܘjbX(r!.R"5q2=?<A8縱m N-<R]2r"#a'9IO^cKl T]눱Hʌв#:ˆ'4QA.ǒh!mnyȶBp$& 9# Ae@ VPL9yN~g;5A ޯܦ8tAv)Ours?z~'B1BSKHڲ?GXK^"T0K1>v!Ϯh䴄,UH0$4alr:EFڕGLjB(I|$$%Uyˬv%RI#BdV)'k3JfWg%5/%+*$|+%?Y+Uc62g=TVs_mdj=4{2l'ⱔv sH:UI.r+ms~PDž cS"NJBC((#jTMrS.@3"ҋ`VTAAY}A?9bAk1T+Qx,B&.o&%ʨ=iVfT)񏪐Yly90:IyEkJIӕ:HR^J!ăZzLLb3LWoU c'<Ju2{ 9*k*Ɛ0D2'4;(e.NR ﮩjJDU4؅+c2:mʷ3E,QFԬ#X{{5۵. LHdWQ!)*z5Qމ)^ay beԗ̕\q{ó}TŶd|4V%s; q1=tH7I?J{\왥{$k'ws@粔=kY>BdA6j,|$ (+7y,ۻPmAn2+-[cM8[Fh#kTg+we L]YoT&GQjʯ36s#$˷kQ[>$ .GpŖ=IYOHmܢW7=o+rR+hN_WDe]h"ǥ.#N*^PZJPw!^,|,NͳwgkY`⑶OaqgӉߋ%=bݑX,]'SIWE5#˦vh )EёtYÍĴEYȜKZٕ\֒11H=ԁy݉H\Jm=Th ei u+1 IQ% e`ՁDػća\%[,hᦈކϵXMȒ̼Pu[R&J`SU[J|{Z@E~Jl5IQ0eU}%z[z^߉"ՔG ۟_KȄN']њeΔ˦Y۹rOil_(g5޲}ήUH U~tȫIX !t, щ)MP\S5S-ڑ]b~9 ~dW#PA}I!"MU0Z,M}`Ng$ 9 ꔿY*R)IY0%(Y!su$ڍJ5ZmZjGh]\M`1"J$)]9[NEƎ^X3\mڋXR5 Ɲ7%ߒ ,E KBLHՉxIQ@g}'~~}}ڧ@| h>g~S|hFh*2@n&(gz$\~'"R>':hŦEu[())&.)6>)FN)V^)>Iv [c`)))')Zߋ͛橞))Xz"͘EN4BjN>*ZjRn*vj^i4 >ƣz撪R*֪j)\1*հ*jj B>+N$ŎŎLG@(ki0+.+^TfOMɇ*C>,B.k.@ G̃ 4V0l ,,&+6^,.·+R,Ķɞ 10.bkǂ(iG>l)N>tAckh>pi>2BоUԾѢn퐎 dh+Vl>h l,̃$>N&,B*m*(1GJ-គ^<$ .kD^^ݮ,jUr.(<|kF<8r0-n(|/GDm>n~#b/.,`*v| ޫo~ܢo "(B<@.vB/ھU(kӞn(|o>@zo^,G0GLp4T0l𳎩KD9K-jp..Bn&GBl ',Ҫ /n661{*0BТ"Azo+p.ǶOUj n" + mnC>n&pk"o8r!0B(,j p ⾯9B,,c-'1/s괎\Ȕ뚠ϲ So 7$+/;܎rm.61v)1G6[-sV,p)0,,7"x;:ss/>GČd֠im*돆q. k 䀿.óö-r.;7g" J&C!+C43H*"vA28G0HˀH3Qjt|0{)(F/24tJV~@ut|_+U;o&LZCnòZ׵ֶZD iqkb*^[۵6b76c76AYp}DZZq:fo6g镔ƣX+ctDdvgjv :DHAvqD6kn6ryŵAܽqn4^_n#tO]*^GX u7xo5 2eR#B'`O7{Kjxi-]F\u Z)nDo,q)˷*^ØKG@,!3*Cj{7wxNk~ ȵ(ST.&3r3F8z-6& 0`V:EêU7iZlɪJ8/)9G ytMxNp HpzsZio-kViq~ꄹ7zPt`G@~ǎk΃F4#`3ǀxӎ.4&Zl |k9my*n)JD3;X 3$wRxC!$ @ u.1 { Ӱ>-Z&'l&m3|n+E aP Fx*,=*oVDZ|":*[fys}k2N!k;1 WiKbB8522Ǣǫ.>3B7;+ʿ->[vtΫcfȯ7~k6^K\x{]qBqł4D/<[}*˳zBmٲPpz.ӷ,'Q<`K/aƔ9f͂9TfO?:hQGMh=0TC4 >|P㤤_;lYgѦUkkC7hbrԷ#}%1 ghUE6 wZ'.j)Uyk+X>k"Jď%PgO i1U0w!YY:-}K9ӥWm[ʯH3V8j̒3D)c9uTU}|LsZ!x AN,!'*Fhި>Pyu/gڨ45/۝IeYg]=bOh\\dKҮ1Zbْndn]VtU7oɊ5 Z ;P 뎔%" MZwF͋,}0tug/j)DEԽzl&?r)K(]uȞ[oKd>u!"I-{4`M1d/ E=pG0fle;1,D.pU&3O3(ZF Pft (Z|2٠>) Dg:iHp4c0>%H KEtd,z']hd!qH"|m$FbkܘG=E#MvVA:I#k!I7}Ð%SE0P/1E)Q޸,. ]8$(2EE($`ҤdlcFDDEtHGei wN6L$ =>I=!e>g}&Ih2IBY)c4hO#VRٙNcؘ޵Ri^L.sbO{ W5O2(sԳaF%JiX񥝶dhp@ VӾ2Bb҇bӞ ^պe4XeZ)ˆ%"IPDE#҇.]x ]vaM#N쫫հLiRڃYT@/B BZѢFeʵ kh{[}y=ТP7sV&A=WZ΅:n}i%W Tw)(/e*.Q~ J=yunokc 5&s¤.} !B2! ga u?ۘf*PiZ Na>ϮNMY:p*B5іеLk^JFaP>H-Yb+EpZմtl^1c2GIg!E%~"2ҵ/M~S%XO A]46 F}` 3@';4+gqFG;UJR<0j]+s (KLG)b WBh_JKV4FDgߘo^|j8er%6wXdSq" Ts[^ y_ G:R'.7Ntż rGbuj-RI@jŕ1#́Z%)c #<(~ %KsGwU>7l2x*90;ܖ M!M[ "t\ e-]MW -bqF${YLjC î%|>4ÑH]"1W5pn_"iI*N:.Nkd rP0L 2#B>zN#M r&Y qv$A OMc"j)Hn(7XjΛ(ORG$$ˈ(NY*,Hɱfb2$T@brr(δ&"Ibݞ&mТxئb̸iJ*.iJ+TFBL^ FjO#j/crͷT'j(/**25R Ou ȯ j\֯M11_8;9S#l 4% 8 ukb| BaS;|㊔ b7)F ِ ʏL|/Ay&P>z6MFp| NΎD%Q\"ѧITr`L% Y@f|a>mڬ2 H *& "*Kb^Xb8P ɄA@Aپ"N5 ՠؑ|nXS*T#T$25ל#AJ O(";Au|# cU5e%_MWwOpkXCU#KÝ d!܎#WU# P_nfD/5[0Q"3$>${\_1!ԃ+Хr4/'I/HnINal^7\CvVB/3`H k>pZ)Ga6yGVϲiaM(K” ǒNekB"p ܲ6vvt$jTlVRREyn1g6{Ru$ YRb4gOvj]n4 yrm0پc,h'VI% u7{SHKH(Gp<+D٤prjS%uo&JS qGMD*>5Rز v+tRЧo6@A]jN.RZ**Q0f6;tV,D>* +KHoL`y*hX $%w/nj ܐH@on檸% Sgu lJJݷjGD a:;;4ѰvulBMLԚv'X*?5D.PPiðjx>}#2*bRwq(O}Ԭ٨f]F~ŠQxb#rDF!X ّ22iBu\Ӵ~B:v۩V%G/ȂIa/CXcX\5.:ٓ` 3RKi+Qn[w+t""{ " y9y9y9y٘' 6i1l)>XG6kh/Y#9_Z z9z!%:)z-15:9z=AE:I6Br&e.׭##*b$f"h#!1fZ8+B.h!ZC"g+={""9")zGګ::zqڭz㺮ZZڮZ: {[z#۰'۲+;Z9;=[1[5[zuQ3v*I~4fh/_f; >lA5 r*bcMe7{7¹.{mTJû[ۼӛ۽[[{ \T2>p 6v'H:Mt(#KY #EQ܎RUYc e|]i|c]m|wasu<ȉ\ȋ|{|ɍɕɡ-e 9Cijˏ<ιm#\<|\ = = ]}=!}[-q*|"4AJ."H&w1{+׺T7`oջ <ד{nm}G]m{ؑ{ؕ})nobٍّ}ڥµ١ץb۫ۃs]ܵڽ}٥V*X؉6.Gډ\`O\Q 5I"c='I' \)<~#'+/>37;^?Y-y]'OSW[_c^g"NT:m'U17r|2Q*|a_7_=Ǽ{~9nuRGGg=ŨlWP>eM3ӿ½>>4>n^͞Z9G~޵rIrfS`RzAM]?oWO hUK# ~.-kT~]#?h'Gzr~rF'$1wl[Xs ${^"^X9Q^2?_ uhZb2}@ SzKOL4MBb4,hQE1Bh:i:Z)nziVcB9Fr, sՔvIR\=W4:E-FDKll.l> mNKm^m6A$(z Qr(W8v`ITX(2$ɯ2o1lp /p? qk+PdzGi땺9khN %X֊kj᪣} &$QBL,q> tBm.C5G3.Xc&*P %Ox>*SL25+e/3rMwvlb=QNr2ITǻN7f+w#(o׍$>39ƍw袏NzRB%M1㊡AB4O n<,D A4P%EhUH3ESnDfHGF걱=_ADQ 5 /2hpԐ\4Ds@;r/8I>Hetp:E8 1b-qjŮCJra9 xьK! L>iQ.hbE@[HF@q )c.)C! j"=<`h0;( o F |e"THuԯ@Hld➿6ׯ#x4>0hdb^DpHKdl`OB[BXMs9q$m5%yuKlM*IU-3RQ49Ήp:OգTGKOO~k?G/?ُ?Ϗ??~}W~7WX 8[|;`7stGߡP%}ngfo|gՖj82zVjB+A=у>a2AX{D&q9O%8.KyPRCȄZx+RJ>XNHYhOh(\F8HNn%$z=V%@ajd"?@Qq8r{ b!u5YQ2!hjxiXb".HAXX5x1E؊xf8X񋠨È؉Smk a?る7bS#g'$B6/ͧ)&kH(8HhX(HYi y ɐvRTSGW4!%F"bc7H%U3tUN‘0-6_/\XS0+h\_ _V0/?bAbCE3#CAٔH9=9F 0TV9X/Z90QNPRɓ`>9OɕLn)mYo@)g9jil.ƔA?~iBWm:38c#2sՓV[! W/.Cbri@/7.ÚnYgWG 'yU99~電 9Yyٛ)ɛcԩٜݙ-)ؙչIiI㹜򉛠06a1˳ y6 gQswABC(8d|$A%*^U$.xTҟJuHџ'A6Q5auQ+1Y7'Zd*-/ZX4ʢ.j9*'ʣV$;J+J7G:IZE &[LjTVڣX::JjդZ*Pڥd`z\jAh8m*R U& zよ N!_Q$81$/JT2&-!;gA"r(W@!BHi=1$BGkJ:ڪ,Q%Z!ʫ VʪZzڬ:j+ʬYzثJj `b$(, w h@HvȒcj֯5!<\BI+)%izadULʴ`Dn֊Zby${"ϸX&;4U%357t9۲5˳b(۳2!KB GKS1_yUZ#Cs:#6Wsp("||I+CT+_t pߖ '#%S(^o&ɱw˷-"p۷{kޢ9vu˸+k 탯aS1ԂƁ5&(*h|Zc_kF6i`fbGp)µJě {[#c ;57"v/ !˽ỽ+ϋ멝a[tE +\ z,i09oRLB8j3Rd@VJXO Q1osA0QQ2QɰEIP;E0>=dph?#EUQ /|J*? !t^1R9mK++U;S|;V XlYldcba-¢7LҨр%C%<PQ2[J!U+c='SZs]6VZKȷ 2LHH?@5HE;€E^QoIAtJwձ#srca(jo{zNz7Ԇu1bq|>{,|#lCiE[\_Ub~▽7m ۴Ndt̴M2Qj -} Aˠ:p1p]P< pPܺM7dIe `vf{\sCK{ƍ?D?n,o;nϑ8f _S,;! i1Cz KGɸUIJc])%ME  鬁@9Jf]DwFOG^QQ͜7aē6QrDt5Y_N A T99gj9#{idJn6K5oGs_/rXL{6oH)j;2DJbm`JV~I> j ?*MoDԵV T ܦó],M74[EEd! ZU lHle]JT X]ʢ˱L_hgpeq9EpY4}Am_eAxj$5c)IPپЖ틴^ܷ>@i>6 ƙTOxJ9iU=94hЃLjW=֨QRQ+ٞ?{0SNrWaU؞enFڧ&]\64hK7]1 ׻Szhb>yg2jGQ-1dҹ+CK.#b\gF%)Q_PB̛7sy}`[;9qNS`gر>c.BEb!8B h8)~Չ@RՇ5ֆW+bݢGrΆ>8dҷנ^rLv[5v\y+/qz-g!q̓-%Kһ{ s/kS\pW9dKܷt`Иg~y} PC_h͖J9BI`b]~1}siH< ت#Xk1!SNb8u\}cLV O;-5/I3!-ߎ0XoARarKX}!dA_Up d GJIJ5J[R%:ɋYG4 =CjnCH6BYBȯX1)ĀQe5dq0[a2>VLJLT@e1JJ߳A (<$),b,֥6v!21_D]V^z7_ .+Keė?LNS[`H$XSe\@ҁ$J>IղTlXU3OByV̦F0PQӚ56^olS(ˎ)  ̣?ЙkL չ:Ix^ CY] ft&&hK;zoxt/E_ќNt!-Hэu-VKըg}ZߚҸeU55]a5yg:Ɇu]ieӌFqbo|v|g_ޕ Ov"j'bxJW)2)YVP|%ԊC\wVwq]9Uo8Uo]@!U>rR\"ʫrp'ˑR|;w͗sW\xO<t+:x, G^iZ`bM v2^ 舖T_JK ]Ha)n\"8P`N҃aRyfHRO1}k7É}y>(=d{7{vGd~=Iʯ~mO}R}^eyߴ~Ocp.td W?HE8hwݗ7r&{%%ٞF%Pa+#?3b)#mٌOH9S%p(b f*(:';C  N+.H9`}s  À 3aA hY %đyKҬaBĻ;$4 I*6aAQDHi+FYHZ?SĚ~j!; z iY;nԝ"(YM)B 9+:T qECIJ5*@;"9K# CKy C*JCJܢ: / )'tJ @+4͸KYRB2'l%;$vۢ-#%1h9ٔB &Iɖ"DJyC)Iíؘ'٨ܣ^ /DJ/5#PEqiUݳJo$#l|,k(dTJlUU]kQa;+5!i/rG:I7x ʻdωi< U HN$G 1YYL4*} S zJ,Xt:Q˗I%=ǐFuQ%F;Ң -?k) lN.AJ9I|%oMRvƴ%1ڳ͙ `.Sڳ]:f@imݨRl)H:Ϥ2 L^+^5."PN.FJm՟2I ;JFJ al9dP8~^FT2ah02OrBޭDZy?kЩ6]BG| V̫uh#됽%eo12 xvX'J njL_?IEکXu#ͮ}fڟ&!S 5$8>N} Ip%j T}3[*ǽrl+g&aWy0(8[ Dӝ*[BFd@Wh$6\UHCp 3(A2귖<, mY:s D2ˤ-o1 8a%le}z*Zz=ĦzN>Yddv WoF/ۧ۰"20Px$]ooJ~e3$:GGYFOwKې_7݅@_+Yyb'Ȁ!XװC?TUK%c<8%3G$0fg%,NRXB6CrLñɐ.vffͬ-ݓWӨk papH6g(LPJ|f5$Ud:Y=,k$3 Bh1.%[Z2a+"B-@(Ib5il:*d >e#C=Eh2&Z@1*) #ҵNg[W( C0{<ħ qi˅}9)R_1J5Ʉ"uKF憨U`yt$HS| ҵ;Eo\fE0%m(}[H HEYTE$(BY,y(d LMÓ؅ lpl(RTS!0ַ}cɐ)#죥E C)B'Ej@M҂eL2)2"4N4d#^#Q4ᓧL%?Q AĶq@W"[h%}P p@W&pF/##,ò֪,ba^=]$#dN+e%5d &)e@  5@c*d5$H;t0VHDhSHT)J.SG! NhD\Nimĉ4yP~IiԫYeZ"gFη EX*E`Gc "SD2ckq./xW)GN,%2֣ƿFpd`UQ&i:184ʰc `ps<.rMҚed`s$y|{r=vaq=E;rhԑWC) ;@ TD b.Nr{ē 35sꞬUg2L#3/NSyL:=PY"$')J*%YE] 3'S ;V/#-mJko2"2PL;ofrW΋3 dX4YP`SVÒ].JԔhMZ#ΫdܝrD)&x.Ku!K9Q/w6Yh2x5ojc/FvW|P Ѡs=qꪙdui.R>A` %6W0WEє<[i!AY<97t1fVtڑד?V4щUI 2F$D.AK)~N&;-M}pyal6?#k pPskd!_Ojֲ1X[~Fj5YE.hAD]niRwّ lI[ݕ]A(2:$=҄ R(SP\}0 Y؋WqcUl8J 2^-S_ǼYtp ɡL yȌ( NL<5bidO>ѭ RbAZ">b<;~e:*"48_t>.=#Y]$:B"]ndA[d$QVyP(dZ/XȇX~am g(O@3]~H|RVU @\?)ֱeycVI%XeXޥ?!]&Y-H\eC6_rcAF$-DbLS,L4f}pdfm5Ud'=A@}[ @ڝ&J0U2BZF59Ⱦ勜gܢ}yc92ņƁȮ Id(@tN'whF'(z-((Thv%>@4?8%h{aOjmL]0t mGGi0Y=Q|ؚ~]yh_Q,Ij`a]hi(aJ2T坒)j.΢:Yj2*^Z꣚)A j꤂ꪆRpcb*>N̠EyLl4UGV'zfX_qG_aBH\~mX7 Ο΅v}n5˃TzS-FX݈ ¦kNIFjzjBj(A:jB ltBEWl#l.PPSΔS A2ޞЧQ(JLІUHh+WbTfk,و~tbiʅOD>SD;j7:$AٞmdٮۺܦݞڢݶmŽ-٪m--2*.K^RGS[\#oa+̎P!ضlEE[j؍,kLfh _znfEӼ߫"LPp`$ BQ"7ږ>ODAPb/.PwLDHw^\Bx 2b/Dh/ޏALDo΄;= ~ҽa }驦I~Ԭ{1,нǦLnVd 4߈RpPVpN~ ]/AMp X8B LhA!yXW8El.4hg8?m R= ȢgaЕ 1*K;YR諢̙ׅAVүgq V_+'6*d1g"`4+=Dr;MPNz̅ f 2^4-WqӞ$p~of:ERZE ,T), 17WiH XQVQF O]Qdȳ,@ )+~iWcyeH5ۏɦ}@6R WhHik ̈\,Rx␯4!_Z}d,@|׫RbBp KK{f]?@X}Z3NhˢuVk2O~"+btmPF] EXTm=.2A"Hg2q,5CEndÜ`U7gmJE . 7gӀqh.j0I2i[HWIm6b:q{lO2J1! Yr3qӓVڞpbqwuZ!Et:vgmV,f탾! BLzpty7.4y?őL}LkPohR .Fz 7 c[rR!t@nث4mp(+V:e>W, \WxoJܐBVDc<5wAWcgȡ#)KSBdA۾0>??>G3@k?{#o~4b (ǘbhP>&p LC;A!PHbJ\8p#A +gJ%-bK2? i'B1+u:2#Ж%"T4DIsDVJ(KV]e&XneQhFR]z!ÃLxJ jl(8_seC/}9ZΡVtjЦIˎ]{mٰc nݮkf-v]F~.P_{zz搥X[dsss &`v}UITB38)d9|PPtf331#(esAJn9=fff))AbHJcPUfi?s~EBA 1"|ήqbcE]ls(!'GP\6gu333jcc|6AJG&&pUCBsWWp_ū) ~~&Wm|Sլff%1NklZZZobiHIRԟ̙68F8CY{cc]\85:3ff5)2"`kssYYE[`Ρnq*).ŃGetoOwӾ޽ z|$JQ@@U:@g[[*6=VJJynrZHBJfffVQUED;wYXkkoؾי!)2iBCa{6JPHnKJGky!!$ŵD)2;P\:"(I4833Pw5:Bqw{:ֺtkkmSҵcdW`lGbk)BIS09NNllUBJ:UΙW߶lQTaa;_h||>2y{˥Жjls[!jzJJJU2:!,DV H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴSs5ԫXjʵׯ`ÊKٳhӪ]˶9MN tŷ߿ LÈ+^̸ǐ#KLs&^UCMӨS^ͺװc˞M۸CO*gҁȓ+_μУKNسkνП{ ~7"X `8!FB ~X!$(!>! (y8Lrŏ@)DiBĒL6PF)SrXfR`j9Ǖai1ɚl&sctco|4`砄06h$VZqKvZi441gt:f|sЪNP:&b;q*̒jjyVѪ 谓ʭk.z bJl.Kn깫 B$Ҟja; N24ckqnKvf*q+og+jDzf̓hsǃH@$x³5B ir+N( q W1?pS-3qn_7Uu;&`-b X09aH<H42 FC89@0|vibC ;N"Lr Gy搇t˔aV2rAV!/ {9՞5@*vBx0vc5–HPm?'iF "s wMmϗEC-[e|6%h 9,qM(IIQz4 ;tᏏTd/:Lj nnh0pM !:Mbs$ q:.4Or vԝ!{;G9H!;P9"0U`|b0*0r@:=+H*Jыbx>!784@8#RO?B70X|~ܗ+tZC)3a\T4`.R`k!Ӝ! `selFm 4Dp*H}6je,a/+䮡 'iڡĜ ~Xv+AcK[ |IC0Bvݢ:0c}65PXzy:w #}"vIC\.57\q C. (HH^No9rk{sc@e, @ PthC@ "aIHV)'As*JmL nBp<,`!-C, 4JP\F;O:R)!M@xe? 3\򗵑ZReF@e_&:@nX%u|R+('X(՗D`4gX\:I@ot`9B& ])'mo|[p)NUXO7pn<#~{+u ZsO|b 7  <(E'P`l[(0dp:@?\S&0A:db W^*DO< 2\Ap_jECէ'@D'nPb\ 8 hXK` L P3Р 2|A0 !.W0Dt{= :('tntxݑLA?R x9sGBRnaO O@m`nxr?7i ExW&~$]C&Hpg+X ŒW D=p rS9Y/v)&@m-mYrfN-; { B K0;G AP Šp ` KS0t0@p t@d@@  0@@Y0P YzzDmpow`O /Ő/ >P`ypzq h&zZ00v 2 `{=( s`tKP 2 d >0f_ u }}^bH#1A4SdHR2\23#/UIX #>,1/#*#4044N1X(DI6X!v@7%|  jH`B{LX //p t V2uP t0X Ր.@@CeSW p6`Djp  @[ɘ O2uhF@hp 0`Б PY   ~9 >@C`_@ vzS&{@K@ZW_ y`uP B'}(s[L$y)G=7p^b^B{@7Fp x+0F֧:L`*^ i0=Y ˘@yPYPaj; j 0P S ` 7p X P6qsՀ@} e )SGXŀ{%P{KI I  ِ\ Op ߸2J fZ(NTp?"CJ{e,tS 2 D7PIxSO /Ѕ>0S ](q0> Ր 0W `aj А Q w@ 0 0u͗ x*)7pϰ qP \q 2 $O   yX 2Pqp - tu/ P `: (A;[K@9۱B &{2;.02;4[4; JeF%p D8>JYY ١j  Ox Z % t * O0%jD] @P *2SS`YB6Ч @π yZP 0]' >i q 0KɤD lth[;rPۼЛM{؛ڻK"˽⛽K;蛾N;[kPmm2Pv:QT:@7q G|JqPBq Ph J s2 Z S:a ", pD'p˃&K` Vx0*9B/p xtEꬥz @ۉP uY  )9٢2@tF״€P _Sꑥ iG`xhy4Ȅ\Ȇ|ȈȊ\6Bq8BAB[3|ɘɚɜɞɐ$12s BгP US> |! `p lkv d>`P^ _`|k h b (TwOPěy yx`qiP+ Y p fVw0C 99tkuS * 0C@ɷ2Ѝ;Jq&.-%"A@A2 P<>Ӛ&JfD]ovM3pO|0S f@/ ]=ǐf` @u>̑ >۠v%` V h5> Wj{0lq CO~)>00p j0 +e FC Y(9Ϫ&u؝ڽ= C07M9Q4Bx9a&!' 5 ?A&Jp.ݍJ= :Iِ YJT7;K Pfŀh p [O 0PQ(Հ@n0 >0  s` V 0ЉhKYUp `dp >N+И`0| $ l \( / Ι0(0Cxp  JnŦm-ذ`V h@4Aӷ@0s 2 5߲>l &N^A @ @`@ ^8 Ixpy  `w( >`4_HZt@xdؘx  n Tu]:_;u :+}JzY u(x.՝p@Cf i 2` Vy ը+- Pi°FP>+]+_BlbLƴW~9 !+. D~ 8;Md߶&&>&W Vl0dU 0uttxU O@xcX0!Z DZPԚy dkXR P` 0> Lp )iPͷ2@ďYvu8Du.oz)3y :tDxٰ@ N6 vPuX+=KAc0H-?V 2CQ!dvDPB >LiV:xB ~2ZrDRJ-]|$4 4sZ j18疆熐c ȐB.<'C&rC'S/_2ı)&D)Ѡ¹snCHQ*&;$AJJhgDrB6-MJ(ű  ULر\tLXNa_&:#DHgž :t[;M\Lq : lY,:bE'qUP9 SǎbjB0AdAbai 9ÃB!Ιf4 fZsZH|Hj W2!Wpŕl1_|2!N4dpgb%`e`_AMpc@mn0b!(SɌ( t S8Uٜ{bC-5P2.KiQ-Rn+&P9~"a TR ;K?.0#~؁vqƙvan<١CW@8`I 0Cmd8!QRʸaZR VbMdKAe&(7BLpwǕ?"^2,_|)Di4D-XJP%DPX.EzA 3 4e!E86yKT^H c2Dp25b2-9m5ʉ<٩}>Λ`m _;2Č/ Z'1 @P%+F{@#VEn>!,B p~2?A<>1}{ @ǓkVF\afOHҰB'00/.e!;^a" WACC<|-{@5܁+lM2faQ0@_R'+4 P+ϫXp'("cg#:H/~p,'-f 42„0!Ԇ<І!pOX?*<)Ո <A/0^  &(0H1C7p h>D2dʦtʧʨʦ$s8(3~0z$˲4˳D˴T˵TJ 9'ŃA#Qà ;p#)ʀ(5Lh,Ȃ' : <`@$L(w4nFh>p70H`(`ЄB4"I +R(W-w'FMMlЀAp!@)6j 0p3A:q X^0O2 KtzP1e#d0cxs%j"E, 6QH꘯d)K8  P UH(DU}˸ %+,2[ |RPp+D()Rñ[ق)o)#+ C#gLȃ|DH-@X@UG@ M 6.IrӲ1/?O;7AI@2x:Hjx܄'B_8NC)p, j/[hN>1#=xvl8"DxIXpUiPɇz Q uXVR! ʌ9;P&i |pVuHJpKuwEQ jڞIhKuЀT+;ἅlT!.\!;9i`38!>R |5G4G`K3XHkI ]:8ja脠yE\m̀cP yb3<ȃPs;<0`/ [ `F.A M A3oAXX Wvghlp`7×d%`uR!pUUgVi ȇuXy։ ՌA@ׯ4Qxu-KvWWJ} REA%h3^8Z a3@m8[H*rG%1/MRP]"0mpDL2XDG H fy,X/rc22:;8ߔ|B @!C jxBP$ G Mx|ȇD"p[xhJe(:\Xp.x|2h7R\>Q!NVR- As5,\ pxR8lVUeWv]xKmz-b{݅@ -x-<2c Ή^q^!0WRr(,^, [%0_L(.hD(R(!xk@f!_28ЁB#yy@dX(9IPj$5jЄj([` <8(+Uh؆ _PGT=Xh fL|Q%6bX|@ܥPȚ!Pb ]b\Qb]vm׏63v"izIQcL #€Q5w6Y 6"7x!tcH4 PxˀM5' hh 48J%!&2uy@V&,Q`|x舾b[A!SJuE$ixE3nI)mcZ<ih#OXndєNp8b48a)Ay9 p 6Vx3Є)@x LNx!kA '̨FLHطw*p"(@XGm4ȶiX"J@Ȓԫ004 X5Ѕ%tqsOXŇ88@Jl8JTs66hjEW4&ϝh9iVl%˓VQ>ˑvtyLi"ipQt%xE#`[ 8 3Z« X (@7S0à Lلmh6@@M@N %!(T7fߊ` j(HOx!i.((FhY!Ɨ+ [@?*XH)O҅}kP\o@Tv4{/V;CIm`U'7G係b]OXB_V`xhQ@2y bWj#g_tywyu7VW 'R#P2#)NL e ËL2&$LcSl*wJQc]x*K!-7=dQ-:CLPx-$ziBsJL/|1aB[:, Z5 ;,0@,XlLj"Dfq`wN;lt6yH&Mh"C悦Nq0`P.nهKSTzBh- >2Q5زi8d2sBL*7‡/nx9$)9wn%Km:y}9k/o޺宕g?'|uӧȀJ߯ȟ'` 1$Jh$Zqų DKe tIAOdX;O`S16%AĤ{Q xCDf81"MXII(20%Q L8Vm,@)Ays[ZO=a(0G M>;L6eȳxI %tG)+r."N82"1m=t0Vp'*,:,',ζ@jzK!(8.[n%2H!L.sv#D ,O9jQB /tL?:dQH5A42'i2d C 1ıBPPB 4%`"#|HD)P;q 3ZH,'-ד@eO=I\"(bge,2āR;S 2 ƨhb1<҂<<YK@9衋>:饛>:L:뭻:>;$A;뾻;k =|5 0_GL ¸) A0t@m @e(C&|Rdq@(0BLl{X]pb\K Z`44f[L` G(Ph#!)B̢˸G v(Q5iYDiD9`ќx<!0&B` 'l"'AbtB(9Mp~# )A`nE2\@IR$Pd%3Ieu@&nQ“ %(JRd(1aU|e*K]bWWa0& f- 0r\DS .:X7VPͤڦC?<\DY(˦Th,DHjDݱ -d,VG<G,l(@U'0bmP"&q 7A&:@w8 @!2$ X"XbnaY@2Є<-Ρ!WX*ֱ "AznnN*]cWLu|k_׽^@-vMx,d!+ zIU #y;O- R;c;:~ AH@PDvPd|-kY-V Z A &NpSZA>ACChG={ /%),Fq>rhF*th#Tt 7X&p{"T(~(Zȇ;|1'<`$!t.~15ܩ1ӊN_*O 9F>2C= ug*C> LF(0<c%PFlT\ X`mС2Ƞ xS0E"(xЀX|/>>@C ?t)-iD @G"b'Px|AV@H1/M `#@H^ wvPBhM+s G ;;1qi`&-yӛBCk:׈G+kJa<7vM>`s #dq-ltG| n'G2|(B*0a3 c2 &0 `1&0P/ _0@?Nˢ n8P!$F+@0yFe8F ,P%Uڄ7A#аAІ,P# qZx|C@8>BTa,C (sHV'@&P]i9`33xO/ p ` `N`=@)AC=V70)"rtkLklX(,u|6l--1r*}5a!2YdEc#-˔_ xaV|TT/tbB*H c&QbL! S)&\* n.@ @Cpx7<tL<@۵ JUD 4rAؼAadCFQ{ ( D&Cb`@0"a$$:#@ A@DyB?X F/U`C![2(u0Bƅ #lsxBG>$_FZl(\EcbR5Y#f"֒-߃"ʜ^/<B'lV&cʖȢ:P&ȝRfVu&&\*cU@0d; H08Dij1fC< dB ā&HQet@&P<@>tNvB('̂-C@$̂IC2 ,RA|@ 8=0$TIU,T$|{2:L:A?\Ј;HtH)x 3#X hheA>|m:(pU/a4`g¨ p(F7)2Ǵ$il4k@ieJ"frcۃ(khUeB:rDA&0Aā9xhmF& h&P@1P@C1H6 A5hG @(00hB q#-$x!@9|7 @{;!jFFA,pOR C/|A?`h ?1 TgmC)tx%XB4lii(tƺXp;BJ,L$ަ=t(B/LC$\`JO-MAXHl<.4#*&@ȃt %C!П An}ktv@C)8ګ1'H#.NNmZi7Fo(̕:(0䋚-dn`dB(LB)`t Tr؁&< DlH2kA˒`+1\l4@1CДp٠'@ A C B(XJ@eZ?tA'taZs|0*(7 ;$ C;, !a2C;;TŹ!(:|5PlʃOtt( ]tA hTC)iBj@xt0m$tO7uWuSmyHwP5y_#Wo$3= m'X LO(d?rJ<tBbp0BsӢA*PHu<09L@kP).?.'#,TGZC ܧiSD;Tmh!3,â@4,k?D<1aL98X@iBzxIKxs7$yĵkuyy݂2hvi-r3 A<f:k]E '8]9 $܏)j Y`HctAsBzRdz>H=挮}P"Q0jax0 hjsA :A`d'U.L^A 4O)0j@';< @ j6zA2\a8|9H^~P~D|{MB!$@,C|EB*< 4eX97l IhA5eu>uZ??'?{p7?K O??0@p#SL4K?a:e/M2= E&#KϟwsH(vNmxuP !|D'HYf x@:'(/S pgvH؁ ^pR</ B!0!Pd ?(b#a K? T?C6uӧPTdIS2,iLˠbiF Q>MۂkWaE9unIVȠ;x1OL"N,2h)NI%)휬X!:lBßT2n{ Y4iwHXoY>ι\S UdfF -l9wy!(DwBcpDs8Gz"+ pyjPSt(=7f! =Y1iC28 7h nD?@PЎ̠3#y(0!`PjX /\cp*TdRQ@td3 Ja(bap)0L<5_*D bAi mcANx 4Nk@(hjGb!3 #5*сhIicXW,.=uyG])fΖTcLau p/j!Yw3 @ @`'! DGbue""IE(t (JwhB+F b+e+XV>Ph(MTdP#q0@*` t C&w$@t䒁b˅A>tiih# i<4O436AB`#Eћ'74:4LuZKC !mM ^4> >MVqTbF'>3-2S6A) 0.`9 !1 7P&|18C j`d:cD"H i߳ 5'EǛ:r=G)EXzd ҼI,@)9|A:a k! 5 #BB tpG Q `T5(BG&@f5"!2!40 |i$@x |?Y ` ﶧ_w|ɷ||7}wb 7P Rw~g~'"8X ؁xؼxhSV&! ja .2JZ@h&fS;^ mW3q.d^Zu{li`Ja0CuX[N7` & ~A( lb|# :.J0?A/6B`2@a?B!`  )-195y+Q!U1 C'@{8 \_ Z.s9 afٖhA_9iٖiGzĶY2 >Jl 2A,iK>J$o%ds#` gd.@m/1|sZGxgXtT8=^@u!X\}& */X@M%`[SgP[X1orX-:F-p TA)Θ'2F@A 8CaAa t&25,`a`5@@F k8RFSW ᥼R$'a+C``qDaq p庮z:ZMN\:yY96( &f'a ! D()=:A2(M8m !ǐ>(ҠjA jE/kAXy:a-K@[SFwNF-0X,htDE8E  @ #BA d!*@Z|a[t dСA`=V>A @1 KRn@>oJ֯覥 '/T ZZpcJƭz׺Zz]ܬ ! AiTA܁H |` ,ŲKR|pplESTN5+ UY+ѥjP)&>.Yq C0MS8i8dlJP I+[9͘ C"D0b$JH( ;ـ |uS"D;픡\8Hի|/#{׋1zpfdM:sܒ`#QԃN'd%0,4"?XB!I(27m <+,A.Ka*RD:PH-GDLT d$t@B#H9bJ.$MK6K A 5x24 >}XC*|HAEQsK Q6$L0{QHAdI* vOkQ$Hlƶh͑:hT N;m `pGm10 ((uO⾋ '0bz^x{{OG _ȗ_;, 2HS=}8 A!YJ1!D!#A+I1dqGĐ=$H#Xgb"҇,TsfK&xACh (ehX`ϐC q,$ nƣ+|⏱3ah4 Kpopĩc\ᒫN:G*vEBbExL_Hܧ~ &IeA 2D>BЁ(- 0Uj LD'ʼniB"` '0H!#Ax8F(щ'!F0hHjAؚY4<,C6u( E,Ari%v;L5!KFAAap|*E>`s\S΅4P&Џ?# &MD+ T(n<$ 0SP>W}t#&[$0` 1Lbj\@3M;![ugaP} /FO|'cgxh,b._8& R#'0@*ȑ TC@ np@1`q.ȁNtBD)\4)HF%,a2(*Qs #Ճ((i@9@?@%IDJ M`C9ycJB)܁ L >(0ORWB4Ѝr򌠽s<5+ Ԅs;l 5aj0*9'n`Q(aфLBA@zeʮxԃ?ny?ouwOG"PФKd60S/\`W-`sByhې>p" \"abj<%1 +U2$> |GNЀsÉ`o (AQRPa sB}>0f0A݈] Ƞ7a{'q 3` SP y8Df+aa/LkzӜIKu|V0FpaR_Jݠi7&iÜ9PTGW `cMw/`k{I0$ϲkKxP .P6 #;!iYB L ?HH f<;=H +h:Ё<@2R 64Z>Z0F3z".p1Kv%eK}Ap3@SP؇5dvPa?@EuRJm$&J#{@<~ HZ 0Џd!fH@Cл ~/|"?QxPW=O^ףW@`eŇC-jK [8p&L7PB J7bbtd";)Q !ЄB+b<mNq%N4('#@z*Qd<9rTwf'pU0e@ E3 @&u ÐHr@( Q@^fH@ ܐ| $ > d4S; %P u.oGIKȄMIx@GUhWY[ȅ]a(\C0gbh]moq(sHszǣOx (4O W| P (T o`oopA `c|aW p GDD `CcI&M` r  }p%dk3I0v ,QV V fft װ ` ` @tG(U3!P DEdP [hCK+)Ii ` !)#I%i &+ɒ-1),Y5`79;ɓ=?y WZGe F$$ 2 /t@P e6T9o`Ffh oSv@0A$A " db0*rKT `7We = P- ^  f@?} ]a -`K ) C@PDq@& / % Đ"$I׉٩ɝJU@i牞驞ɞ,О)IU I@ *JjBO 5GB## @p 4+PT dA |T $FW v!EP h5CcP`(" @` pGWG`Jc^`^p4P8x5V@ 1ېP$@ @$Z): [ +k$Y`JHp 驦 ʪyڪz }0.p ګjÊ*˪ʬm :H){p$V DR4H:` n 0 Wr 7D "]zˀ0`!> jP >> 7t# ` g.BQ"p`F&6 /[`( ЌoP^ =iz (VM  Z P [ 7P q %hpPjmo q+s+0Zp @ ʩ,Z[J0Z | Ky۩|+~@ ~9ʫzzzʪ[ͺʚt @ [0BP@( O0JBpO`|w5Vb55oB) 7f`Ihѣ> *`cpcq \##TK0'EV^xdV0` `(`9aRp`=h iʎEpw# (a! q0:{ Y@Ű vF{:EZE-pH @  @ +j JЩ<N WĭĴ`qgɟ}}\ȃ$HInISDj2/2h*ZA u 97 Y( b!# [<`p /fExBޠW.s5 =dP  j4 p6@. ^ ") y1@/8b[@t vvYĽB*5 FИJIP ͰwǬJ~: PpPx,p   ]5-͞ П ,ԬkZԾJ,Ò[@$22F @1mAc|+Un e7E\ppT1hϲ0А= [k UhK #\} &d@`rƀNwPPWJ, z90* z ^` cI pW 1 vS{y2B ݰ˽u +L7 $M~{V4  Ip Ƈ˩\ޜǩsMn.6#$ MQ2rsv0`xss[ @)1]((@ e p ۰ 7PGWÌì 5ИD  P( +N` @T@ pp=cp*pn. )(@ q4Y[ F5 u7P e I0,0 +-.Ͱޜ; %-J, @y김M P@]JG G:anp O/ !3X@PL p}>rc0T ;M |vyrP#7Fga؇UWG 0_`F rPWaVi + z`WMy1 M)L/B{fP(pp $˩=,.iU0ũJ с0 : ͩp w?ԧƃ> DL# 1N$# bn r: P`08GF 7УS!@ p X }X)Q OܙD{_}Q E N08 P,O1 ` ]+.2DF-[lG$N萀D_4nȑ3!DR2xJH4$1eΤY͚@Chƅ˹srUaSQNfrm%\@BQJYjF+PsrYZry&\ać]H 8cFAݹ[mތS„߿LʇRhfӳMyQ'Nq&5jJn]E`9!hmGhAABж}8е߁%KD?p@>A>xX*pTa1N< 'luȌ3(2nfeLa F$c D?!iģ eZb +),FԃhA4hb. gl"1Gh6Ѐx, ! EӻG b=#8B5qM87vC "!Z쀇,b[` Q,3B=4D02Xh%qP&T ehCiB=aE-zQfT[A6QZiIM O+eiK]RTL`*BLx t  ܁ hC@ڐx7H4 h3Q T۸ep8 yp1,X X 6Xۅ ,|<•\Єup@]p9bP;>`+cA чPMc8,`S|#"[58` 3q=3BNyƳBB>7~P JaC%oy{^W%4@^Wo}{_B o_<&Ђ&X fp`G d4nӸԱX#^vmhHpGX`ɑ@>1< cEk V@ ;,[D\ϱ9a n+\XFRp"`k8r\ pE 1C }p u@5MX }zM`@EJcȂPz@ ]BwG&v}ld';lhG[Ӧv}ml/`vmJ8&7'KAi[7MoyD}ho"gHHøڌ$ ;ġ հ@>i.B ˈ@!_@ApjFbcs@(n<HVaaŕ@1AG,`|n5ƃ'L gsU8 Q;53.'أBgdA[֗#O00ED8`Kx,tb / hD *Dc|ޚP`"v͙^ !@JMzԧ^gI0h^}ձ^Jx{CP8A|'_g>-|“0{uH7zs t <P81D@$@$8Ja`X[@uX@p3cD(hX0DXHPivX@,x&gG("0(UP0shaiRjy]9؇r{7*#ȀP țbbB<Pɳ'.;УlP蠑C:ÐQ(BQ' >@ԧC_= DE;=C{DQETD M,>OT>O4N<*BL?ȣzsh#nhFx-?iن|HI @<pL(8(;PĊ.>p\3|`z{XgpDh3FNp0 p`bE{xAG ΪzX9a`U0*Y`pHkC&ۅ]'1{kߢS; ̄ỉ,z[;PUIL2P_Y4@Du#8Q@z>=Æzn%HnثJ@DP$E<(BY#KQ\MDP4P,EMK8) #8!ЅP <ۇAUئADH+ȇRЄ RRA4lO8 Nv9u7{Yp>U `ep_(K_}9謦{lK(1@z\{Pc/N*Ȋ仾49\D؆!%Ѕx!Ȁ'x"(VYOYӁ 6D }@QVЉ<$  0QSBPP OW Ku4 D(PWCQQM-4ߊQK~eQ{˛ 8pHkh1(x.]\Y! 12[hX=O 6Q]F{]GgP g[4[_xZb؏;}Po -vx1"1ptt`;Y!LCYT[ghhxrp;H`)Hw؂Ȁʛ.d5{OkV#XkܙVv%'!ɥWSJ! 4Xvs]ԭUWXB]CѴdKM|> XDKWM^1؜Tľ2{;:1>ȱx]%?谄lI ƹz "M@+ŀ<i@,nĕs1X(rgu؇(G71nڏ1zLsdkX"$37JTmH&TY}3@g&]Lx.5 BWH C{5du\P5TP(IO\/Vu( sSJ`x1:6-o X;={W}^]Q]KC~Q%XeѸAwU> bL b&Gh[\ X٘ "mI,,R2عXSc@`ePUg@8lZK4zvq->xf=`P7XvЃaNaik@iY]$؆ _}MVa؃˃\{Ifx IX/0f(U[S s Ui}PmPuRW#CVN,ECjRHduI>J0Bn0̍% mm_0pEG.x|{a1? M:hj؁!ȃaF{ZG>p;h;pN7by;p^NT'(k8X4j&\PENYYg&m\Pg8ԑ3>x0']MЄp.1,UO1(hk\u8V`@8ĝ \,#];V?.oP# .޶o>F RXu ;x ؆mhF% _ph.@x "140A.LQˇ[X+ILfuiK|wFE[7KX%5H,xM(en:=pF7m=ag*pP\+9hG* 5xM!xXL 0U,{tHtItJtJɋ`܌[X6oB#R9@MPoYBnQuk ˸>2r/gR]|RX؆_v@+hY-( ܁A2p# V %@{@=Hs$Zh5':_hOup܆zpz Uy}>kU>xH@q}؇SL aЁ/ZHV h Z/z'w`Nۃ ?DZP:C_ELLj>>%X ,E_@?p 8#%, R e5mhF `n9%xO y(y<ةYS@@l'PUtUH8'%77xnE}%''54g"^v@XEӪ*:#oPkp(llbrA1He;(t4C>ڛ|fO_o?*u8!p "LxIԝAŊtBBqJ\M&]vpgA5ƕ Aڤ(ӢM(nɷ䙷'FeXɍn i!5ϣbU`/*UN KAlBv&#k7$/" x{kI%K6`d7K&fTx&VvVTχQzsh#4g͚kb+Rh1&/,ŊȒ!:z֡=h*"Os@<#}:֯cϮ:4/~<ϣGO߽}ACL~rB *dCsH!2t&G(~Iyt6$b44bL-X;27Q 0dGe1 4;>0W_9AX6,HV! fD-DWZ,7l7`"|Jbp=C2"9ʈ5΄>bpG"b4‡p#H(l*%0G\pr.sL⚫ګN@- ["2l$4R+,b;tЭ߂[ 2.BF$<cqdĄF yD 78B DP6A@hQ0C`R HAS4A8L9 VWY&FUČF- <ɛe%Q1M ʨR.4}(;ÏXӇ3΄VC"VDLƽq$0t1&2 6I)XG#V4  `j`zS - cLdS:xh T5A| T`; Or>Dc + p@l" ؃n0xR<J!áaAv/J$Dg-g\"7Rnl:ڙuv#x;Akrd2PH*) #!#Ae '#Abxd?a p hP6~.tkD@"c/D`` !0! iIӛ<,G<0X E(.&ݔ` [G{xc ȏ4)"4Vdȹ`* w.)2" @ Sxca:;v)cjCvuN9p:D2t m?KA BG@F/H"lc5F v!5d"/4CD`!G),_By8XAY.$7ANP@mpWx ѡE͚`(- A'H'Lm(|r`aL&GOC)E``Uar^ _5ቱV]!rUBLD)%LLB(<68"Ă1pb,܃x QB tOlA!C&hYY `aH^.1_n—YΝХh-Am5B pBX҄%tJ"`"Bg:A83Xq@u5(5d3tla!oF*Lgq6^I?9LjAgt(\&T  |!r 'i>2gAg<-$L*|$H&t@)A L@>lCL3DS &ādH!V,SB %LLl-A5Iӗ›Gx%~l+4BgF a1z$70e 5@e: "@= < I <jwCL@GRLar" `rޣ&d؊jH  4<@UôBݒÈf.ALݘ+>%.3&k1xeR.05Blbhe ی+8B#8A™N l`504p,pJyaBA= hr/@I=XZCN}/OoA٦"zB)&PCtB'ill4JC,0`@5h L9\3A&A֙Y^VKlF755]37Y/zHSFC+h" Le,@#ȁ>>>C5Z@2p.!D9v$/,Ʊr(1A~%rC1tB5$@#;V( E@'L@p0@1; ȀZ)]@>oEPxU$.x[`Z![QVtA#, ' ED#Xa%" s,, qY,P.7􁘊 @ @pB?plv U>>s??>g/@AA#tB+B3tC3-HT-xBI 09BlC>_< ȺَNQ,GP.TYߌhK(yل1O $8x/D$f@8,Ll8|;bȁ)P£4ݍP@ƙ;sf#TB)d=3pK9pm˱Za/6:`r;qrsw|t tl˩ ((M.B#\&<h A)GL;``Ex ÁFGeИAL_F[$wAD /#LpCa@bm=C;@U\A;B;8eT@@7:>7 xn?So DdʗaA* BE l-tRJ$[!t y0/?תW%wSď]Bl\@,B)$QvB$B&Zg ʼHSGpZөZbZ74bE((’%~i|DC#"+|ڧg8,Qc(pB1Bi** fBj ⚫iDnZeQTCu n#4gD[inVӊM ۄ0Ȍ,TW}5 bmN:Eӎ;G%n$ & P Ycd 4Yj#nDf{ jJ;ȰjP0M6)dPѤ%h2%\#G (ADz鑏_tIa"I$$>8FDrF3 e؉o> ѡ7K+ )NtPAQE;/ --!fJ ~Sn5ˎJilU& VJշ4VH-cVd}vcsSkvXBƇ  iP.#R2CI:Ec܉\_2)j 2Yb<UFSt 60,عuIdr;,YznP`y0 ` 5a x89 ! aCHDq3T p'B< ؇#!U "*\ k?؅9@6`_iS `\lDG% PpGW UY@%q2(DQ 5eȶE$`ʇmBD6,$G |$ZN.PaQe"4,dq /X" aЊپ`la{B%eP So:?V%x;Q B wr/ATYh)Րܹ 4( mL[0l{4&mp‹!|dpyJ"v~G`(A;:_c@Z=> SAYCdqCP T@jbPEO\K06c[EYPD4LudUmk_=SZHs@Tw!&ƚi"| LTnrgTlkW n69u&e 6n i 2\Yp @=C4ANb{ʄ-r z/ gBI\PM-<yX$4@ < 7G(N`3">X-ȱ,hB2AX@ @ 6@(\pߨ2kY G2Ze+TiHRWPy |I_zw_\T+;UqiR m^50ቖw:(A'd<PP8`}/_  0.K&@ ixLcؖ&0\"p! !Ĕ܀m` `e!8!R`Ġ'a8(ʢD^P`ldDj*Bބ+O-& Ὴ0`S`W 7e   Ye* -l<`0̬Ʀa@{4A^nAy^`~) vnHaL&B $2 4$tAE8! ph򡸀&0 V$ 8![AApBTh@AoK"zM+bl++|`A֑QB Q 2 ; !1!!&"' *R#7#;#5z,0#/X xG   %! 0<<J '| V@ `|2+cy$`ʠ< W:@xa ڀ.n f, (&AJ`kJJA0#@f@ !A R! ~ ! 6C3Cb+.@[5_6cS6g6]sB`vP7cl7/!78bS999:S:CoL b |dL)2a@J 4d20 ;1!bd@oabaAJ)   8`H@ 8aV&# v`Zn-,%v^Z<.p*@darDz+K8%`xKLTLǔLLI0 lM_CM5 LNOTOOOt#OBA JA،@ L+y` ` (FI^Z nLBa5Qܰ`t^  "br"J2A>`v@J @aa)I 4 fAFk=k㘯2 yش8$Df@ J!MT4MaЫ(+ʔ+BY`يV`h^m,Hzo: t"zr4@6]VeK{WdddǢgTJ@!\T`+R&bB:ܷ_aWOy @pĭښ:A觚HZޯ x1!Af@|ew|X I`A̍ FQpH@^A^_!jmM,"C7eK[P{:phj1[һr[ -!5n s]O[[d\d6'! a|ʊ=/BA5R'`!a 0n@Aӎ!LZ5A$>G@ h*& B![xL P l`zrarl4PA,Z۫J֋/ &` u!}Q$=-#SH)ۦ ws[7~{~{a{}PMt@^i dAٕ]N@$5!d @р4a 1 ܠ`   !W0ܠIARfb&|TcA#0rO#1=N4!TtU#d cfe0A(Â"8>b|H`|h *հ*E6aQXiAhyVZ[Ȱk(t&6Β\jso~٥tMcmjĶvْ njXE7xe1+(>LT#&hF>K <  < X 0!!L'0WMXa 84E`U$WhR: $̫bVq }РX|(2yb?|c9\#dȲOaؚgתYB+> $矷 褗n騧^m^ݺZXIp!qW(݆M7%SV=rbqpt3+LF"A>XP9hF(ȃǓ!t<򑦣\h#}\%AF"~@>X@9lcZJ#I`ypF  nTa>A b؇ eB4*UAA ༰ /xAC!`aJ-J gjQZ4{c0LgJӚ4; vӞ@ *O$ԢA)RTv`PTJU>P@ UbWn )I Ur5`23S P2Q< 2X&?!@!2#|aE UX , " B(^Tr |p(i@> Cܐ @B> E2lX-'0BVPT}AzQ9?XH*p`qa%Bi.Ieȯ~~8>; `r' |cΰ7o#S e VLJJ " P~L Z7 p@(J,pXq@> <` G)^mK2659 3.PD$"]`! "t]Ò ȝ,>2MH'z 7f L)@ x K1}p@3J}E CQ­Us\ki1kGep 3 p_m /v m7 GAgrș?d bd`._'JQ'xPGK 7B!4LP{ $>GІ64RNxQƍ B{y؁8SAa>xACK$:FK(Ѩ30  SVaCKe P-f@@v=@j9ԠL1Z]E㤲\l~sao;؁OO$S` \&lnGCXQܯ]WAyO<|B?hO;~==L/XSHNީY i&v (˳ #P ;,ŒqV,*bLYpH@#nC qRA#Ob$, p`rAVP-0-ez2$ )zl71+$A^RpXrWzkaVa&am{ mn&ߦG0)f@Y2%hW>6: ϰ ~wveГ0@6qBOp:2p B ܐ;( PXЀf XM3pf֠ې@ "Gg 52]OpJ D` "@PPUQE0 ?Pu` " 2 j`vStgAR:BBwR ; p0{1ɑ.yHR Pae$`qpޒW ?9b8W H{(na~臀Hu֕&m[z8nd鈐h\"#t S3(#$' d0d@ Pr$@ [4` 1SP P|P0 D  QeT P  >p hb0]`wv 0a l o )Q+9Yr0 ٟ:J$p ! + 0 v 0 7z7I;p w07 vzyxam+ZnXjƢan!X1Y 5%$=AT! 7 >`pt2 C@%Y p<= Q  t xNUOA (K "`m%^$^ 9\{a ߠ 4h^j{PRr'E8BP~klc `ҡC`˪ytwbA  Y` ,DY0:[{,JP(f0[@Y2@/ q  gt@Sf`p y0 q>X! -W0 0 P >2@D+  " iJn&KPQ?{l[ Ag;0@8 j )m DC C p_Ki|  B1E{@93kӐ"{ BEз~1-Ӑ3Q`Twa PK-THyZ\̇~!aK<kI:3aAt1g dp'KSp2p 3+2  ,3;Y npd 0pDp % +@Y/` ``ݣ@U5TT CP _[*jcELP @9{#9A"I0ȒzIx8$S {BܬbWP |yyH;A.h9% % z)e9}\nMmbوj1 Y5q|{ܓk` f`d d@ 4S Ր0K@ p aVN+K3P`J h##*-#= 9SpDVPPT E7̵<\\kQ?` { YOpRy+p(9wh@yep,P~-ڬ >`ʖ1z.z.`$ꠗKpV-J=jVa MV"mIN* 2` _`ppkp ttSJ W@ .d˂ > g[>;_ܠp@ 55P .(2~8ͅb Lp ޮ`KGW1 4P8,e e{p[P X [@ۗ&u+PŲuZT^S;:}6slfzp]nar.qan$I" zBL` +0`  ꀥf`XP: 0 ؠK@ c 3p Z& J :qJ@g x `p0q !Xq'Ե9`J#C<T7db|]*߰o7 !U p"uʟqEu$0>^~.lie00Nh P68&4 _ƒbC*#F@p훿 e` cf0~ `yX }j05 Q\ iN@ )xPs-c %@fO)RX#7 \ 1>R!|m*aKQ1):oΠ l+P֬ejk׶(9Հ %_> 'KTRTr-:?_1eUa!#OA vO> h ]PN=F¨ F C P P+@@@A(A3i}"DP^$G4r#ɓ\K UBIEArj„"DZ%݃FRM>U+vT h#Fz%PI–H$r "afuKV #)G:D>!O D?i@gL/I`- fp`Ex,|c ft! _A?еP@ B(4mL`$DHi - <$ }n rj䰛 2lCn0D܂]XB >4pF^RM2SD':u4!aZT -fhZB0y"B1'] vA-Ty(P "`Kۃ&77 Rb0_2")2B(сBȈ_)RBh5<`)9 hSWr9OÄlSX ` Ut' K*RPH0L0Pŵa~:$@d'Q)qЀU0 O0Zψ>2ë `9꒍d]%1K\0lCX(,)5!,~rR-+K6Xа# aa9Y}4`NN{'gC+6ePعJ)mn$Vv2|*_> < N4hB  6;]M%^ m ddJh M,AnVhA 39cs邕@ `@qV'g.D ӳW$Os)UH&@?X&@Pdhi>$`]5CgC!hĦq쀜c3WjJQ b=x.B!xCD"Qi4(FS( *- 4J;V(79p2pE1( _uA=.n$ٖZBFH`T/K#Q@M r-bX$2OKFN>$yX'gh}yςL)@xZ#2 @&Ӑچ16 .LE QcԧXx0品% @ޒEK6bQAU y(De8^-*&UxX` BQ<$NY>ǏT"䠭9Lهʛ [Ny_[@|N:V,Kn4a&` L[=7pyH X]CaؚcQIT:  h ] ]xbFX.8o bBNUbA*ȣ*C/axKP3Ypk 8{s&hJH21S((=!# #cCP&Æ滸*˲#s 1A| r³Bsv%El[K[e"sA24?HlXP 8`[ 44  X#橛b`rlHȀjOhRZ%X50)hVR'!7@`aQ(;+i4ɓDɔTɕ,:ؚ<J| O(`@a i2 /IDL;!6;(XHL2x2Hb/M"0*!:MHGU( $2Htcp!X4<%;A`LAPmȇ9pLbh 0ӑb"(%<*s1`c@(Ȁz! ! ⻟n7뗠k'&+Q(l`tN>p\ QOuOO+pژsΥlJ\?T&B3,ІJ@T@)Eŀ ؆PHрQ Nj,ax8('H[0 ^Ƀ pjԍ1K= i823"\AA M~GnsGሏhҗhyЂ,ԏv+ - a1Yᔞ̇2X3E4U5e6u7M28$O$)CS< .qOOj Jm! )HwʳX)<2 Mr(À p6<:(llXPmX2 5xP(Z{<ѹ|*#(),6դ9<'%͐uS@S)ԑ8 hMBh0M|9؀؁%؂5XЀe؆u؇؈؉XS،X؏Y N`A2ٓEٔUٕeٖ-AĦІ4Ȁz[R 6hYMX pP` ) H~)p<(,4pC- ?cL-9C] #L/ Q ȇ <ȃGxx(5Ü t$ՠS<@HpaayЂ|`Mo85 /-jb +}Yf~g~!]qxHB"s\WG`1>跣J\^ЁBI QPsW%>X8$(f^\h艦芶茦h`hvh&i~hf`5`隶ABS 5d4hdӆX UIɃ_"EȀ) :A!7Іx8GA R% MA!hcGyn-Xg^=PgxHB3JPSRs}80~hv\A:c2C "Q=ԸH*(@.hn\h(讂*@KnZh?((ȅ*x.qxn醂Z`o~&piVgpe'l  [2RC<+$hT] ٘ b YM$MAJ?H 2(( @iB$+hkk,gނh.%Kp<~@܍(PBb2Rr>% >`(,-dttHmClM;#8S;nᶲH\$KhfLq($K/Sn?\VtZ7uT\uf%t΅sK\W*ngvh++7[GFjKmx6[Xc!0mar8d9V`LěƃYr0cX8k=Ȃ~ xi^GrmNUcRP+pnѦ+8> URW"Bb[$iagd8?`B73 H l9(͒t+Jt`V/Z*e'{FV.hZf\@H?Wȅwg~{{/OhGĿP!C '*4@|NmhxIF5 躳)mKڃU"8q8Ha((0xz=rZ_+f pl]mN\4Uh9P} s<Z/EPg:Pu<@M iHiH &Rh"ƌ aJf5c%$-?ЪY*2gҬi&ΜU\ B\AVbl+(!)ذ2/Y,ڴjײm[7Nn-  t4 [$H,h͛,hQ*Tgj|ϊT+D <2yTrdT#$Ncxѱw{([G,Bgys!YPNa˪U:7ؤˁ Peދ{wŗ/ޯa~^^k1 )[!|9x2" V8JFqHłRJṿSUABeH3%Yd3hrnAI>@,@BR&A]1d0qA(iTS- (tI(q qv7NksEuw-Sg 4 -5k.^:CXNBr3C 0'5_SĤ1jIЬgENȀ `tFаRm&M +G 8[06wx?8ȵ|` ȄB! !ov8rE+87~9́.Z0-gYktYOzo8 Fcƫ7C!>0ƐQH9H]" !XtMZ${H%B Z4L-.q8 {1(!(hE$Z*!e,oY@$8 \& K(MilM`^(X/ T#@4|0 a+D|TFh3np< p1`-`7Ȅ&n!<OD(0pC  Yn_ pڂDba&!1>EӳFmEJ]{ރ:A ED-*#d@˜\q N*Ƚ /yu׿&u@2|!f=+ZӪֵ6ad8?$sߓ=)R",sI_2qh)(s ?/O43˳jZ/Dsd R aPC,xBX A5M1ȡ 2c ~&d`Pj/(oP! ^ܠ?ę䢸n8{qVPu]pՑs(ynJ~&A?!A4S:@:2X_ڇ[Ёy1S.F-x&A_?и8nbKK?։53qv.* Ȁ -6|pmA   |\wTCUі.h[H =fm@CuS^butY /ߞ79lbp}3mA2:F3-u78 G4D 3Pߕ0τ)|< @0sp~6-iSP|3$E7 9%-M?ۗ `D,C4P ;$ hF) 0&:G@p412g=@ ܕI%]h\14t++ p8xj#61+#H @C'nB%0­w{ c[p ڋ.k;Ӯn;.ӽv;.[t~~g1Ul= 2 !t(E>8 L(P=|?1` NuyN,`JA`*G3˺upc%`Z$0N>1uԪy@ѕ:[h xf& % *޵K6/? _ , 6> FNRn n9$`: @  ` 0 ֠ ``l $F $TC슯-ipR؁ < <yQG9ح$Ǭt4Zsxa!2TΙϕu5һl HK-NQT6yAd`2^ +R )Ƣ,΢\ -".$`.b/"$ 1 c#21.3# 2`hU^DY\I؁A)L@(A)H J*ͭ٢<&h @)T3t%T@AO$,_s ʯL40AXpz9 bIFKB@$ >yR| !$ O/ 6Wu@I`'EeE ,_C,]X /b:,Vb2́X.b(_,FV.[0_B$c`A c N`6c1 3*_6ɉlA(adZ6pF؄ ߼ c 1 tBB'@,M( <]&_DZ =tarʢGJ_NNK@CGjodA189N0U"Q69L |J BXTnR T'_L `:t?C)^ޢ-BF?$܀?*teb\A)D́L@p^,0`a bBc*#cR㡛KfByh(G1xڕ ƀ āt _'` ?Bz{G=%q ǯH8p2 ~I~y)BIzq00VK=3˭,|2PbL @>\L@ ('h.^<^ *,"6Ã'8i!&$*L,:<]APk,"3ha:& 6f 1~>5ŒI;dȃ6Ȁ&xƤS 9<lB> leB&t:݀Azzd _87pd߬iT ʗ o1HÂԙ-R- (,D A>\A~pDU 4|BA:LC) &:H0XA>^S{`234ʫ3 N.664eF1 GE8'0044ll5`-T j{Ap  H1\0usXSj'B7Xр[C,AC^-I1 HG (b}R 4D, xo+t% O:H7^t-+P(_t@_j0 0$__Ұ4#6 ##/LN&h@=߫4t oj0a .bB`ߕB HC ؁0L/ $Jr.o 8vN C1Up;d-XlA&H]5t 24$`A!<׮„-_0_29̉6s-(@R?BT3uQrTO@Dub5_#  YhF u1v3] tD%˕%ig1flf!R}p tzZrL]L?s"DzadGI/A l@D׀#B(CA8<m,m1؂/+ 4(&Lb(eB `6ADu^A4L(?$X-N* 4%Ow@w-wyb@4(9p4d:L6|k 뺺 "\03M,97$jJB&Aip?Kā;,i6S1fe-srd-4p=o/d!dC6,3HT!_&k`t|rV ~L[Ź9vC>(+Wη-CqBBmϷ& 6ty o(^wy 5/& 46c:n6#v@țD^ nx?>tgzoM&7jAl 6 YM?e!yx7BfGP߯\3gLT9?t(iǃ WZH-}Ŀ0c@te;<B+z,R07<:0jz&fbFbZ3Z3ZS^ 'lA7|BɛGW_Gxx( 藾黁aAc6~6[{ b~~9`w/@@~g>@$ ! @~@A9~@ \Yc,)c#ܧ |??@h8`At(aC!F8b1fԸBAj޽GL:Qyʕ,atK3ie+:4usnUiSOF:jUWfպkWyi gѦUm[h'`h]w t{Lt`Ç.XqcǏDrc:+g\F*:tiӧQ V,`ǖ=vm۷qǞC տ o5hҴyCw3`t;xwwzlJNS}{Ǘ?n7ĸ~W|n[4ҠcdA<,P 5d49g !YAXjQ" αP14(r`ǧc !ю} tl"DP:([7CƟOLi&AZ t|OXUn\ʟi4 CnP,$};n"RG>Cd246?^G:0bZ 1 ^͢żLIPG%C&bTK%{Ю+_n_ .8C K`Ldn0kg)rkĖ)nYU !L>Rm;ùu&|o:n9loy"/zf|19 ZA_E^ whuM[y߶?-l1ӿ4a&hn<,y t UU : &ֽ|?j$p"ZP~`#((E! q85i)xSC 2  %(>ۘp?9nPtyb&9 ,(B/1e4# Q)ESV+өCOY&+JILJ%g^L (,# 1N?J8,^PJQ@4)QJUq b89)dT)t"Q4  9vt Hoh&3bf'Q5*0 BWyͭ|k^GAR%pU-u),Rδ*MqZܢ=OԠTE5Q}̼ ^)(踊dt)+`T΁љ<$`#e5YњVm-k z<4jBB2<"e E^@,_Zؿ>b@"G"k*X*$~+dXgUS1S9Je~*U!LX`%}5qGjˏbiBb0YRx$Xw#<(ֱ>W`&ZPZJk_۔*ahth yl怍|Pmh@ @)nIx806VͧAxP MEM)χ]&rx2<Ơa9U򕱜e-oY˓R{W]܁~bs52XXĉZtIL7yzfUo|u,s e';a@lN@h3 n1Pkvu} +iY; '%paC sy>#c7d m.PNs0pӝ&r/)S)sT|H9g!"\] ۍA`J: VO/xlخ լ* `  9LņP[5- SKC<p4Q !ds*t%m4o|Ip]6|%pֱ`kIT08@7BZPp9L)xcL|s ]JB{HkTFCU\gJ-p\n\Kp` ¢t]`a(ez|d:+08A k&&-܋^.(( ݴB `:M߄pbˎ/j(HfHlԐޯGt8̤ވ z>!dRE@DzF :˦ 6NQ HFV`A`UVcD!vln@+(+8ѽϺK/ pʲ`*d/LK`TZE|,`p)BA08?Ard@d) q*QlĎ)q)Gp) a>!!!&rqzDO`EP/XiakF\GUjFGl,΂qmz$U 4 hqҠP 0 _Юʺmk*!m+q./P5Va,"h>)cRHE!Kp訠 1*"R)q#ߌC ~R :5Az HX%_.8b#,i´ekteB0C(v|l$B~*˽R +ҳ k߫R,R#$f))i)AR\V q+F& ⢂zdM>t!աbʠGCSbMao\%Cs)vl6>, Shhj"KX&n+ʑ*7`"n7nS$)kqAtƫ CBr-7r*sq4seʦ<7tWvtKcLto!uOtWuUWuvYuiv#I(qqG>`Ƃvwyyy7zyErz7{@{{|ɷ|kcP }Q`A}g} ~5ځ 7W7 ~whwǍd*CB`k)-8&Kcfrm E8AXA `UJW W8M[K:HySHD4`XV?"J4W㹦቙bXQX\E Hc\c!l@WxIXG8٘ѸxC2zx$Xr O&{$?a`h$ ad>cEl^@;F:rQU&HuVtc 踄axi[xaۘi!Mq0wxc r`z RDv)VA= DfOC~BSu)̅B&W!l)!g~6bمEyG8eXY鸆8AC 3g#51&&TA^J !;)͙Ȱu&!C605Č嘖x}Ys9 :O؍ӘHq1㇟aVCb&: n(*MH)zd$7&^,9]8mٖeX :Z!;%0ժ17*%h=sޘ"z0o bha;Akv~Wc&6A)r@Ì'[!8  {Ӹ :3M#8{_1[R]DjE<]:CK n`8U'e?v`f {xy{!چ|M(v )|$z_[Q ^ELp(YE{p8: TbQ?|{ڱ{ٰ۩#۰ c0™|5<2-VaZ2 8˵Bsa !IInH@GNtX%w $D\I9A/ %8rMvx8 ]3v=+ D l!1=ӳ|HG=Fx;Y}Č=i}!{}]*$ q؉؍ؑ=ٍ qq`j  RG e ` >.E' 9,Mˢ=M-LQ-&c]a>!+i_l>u؇p>~>~q cE^>`Ԗa>~ɾ>)zDz=}SU^ gF `@`   #[ݏH_HÜ><(̑TW`h`@H `H=@@)/_H5?/\b+O4y KPcI>%?n`m$S|!btŸ <0È%N1b3nc @&<2eiҰ0̙4kڼ3Ν<j8xM0B$i7&LK 5ԩT' CB4l =\2FZ*`fw*zBWjZHssl.1vT cT KÜ;{ :tŸ@v4`IP\ͺUد>-\ ApY2ss&Rgd;/D825mZn?9U X 4oCT:,N]@USK<"b}49c5((؞KmhP'Dk`9P^Zہذ4t#V8aS@)dӔ9 :*v'ٍZ#p'F.ˬE>$MZ(^kmSO)<ת&­ hC:ݬP(J;.6䁆f~cyNFc/<^NL|6:h06A$ T&r*L”Lsu̒‘@Be 248].pˑ؞!;FS+yRWHO*qbht3-t6l wrMwq2t96d5 [px:6sLNy_yo^y^Nb+a*zTz`x+d C؍{3ξ|O|/|7}߲C_}o} -!;]س~K~LDOߏ@#+, & dOhN P >!  A:ЃOC A:Є UVءo{:wC<_>W1B'2 ~PD'PA@% jLI! 86a!@2 J֥2m5|/mDts1Ȗ $?2bC@vc;AJVpP )C oѺr*!_ɸ"F@kP t# hA^v@kK1a*B镁܀N2bGH5A+FД#&D1ĆIiI`cVʂ?+&K%LH aN%S m J찳sh" UI:t=ALZb3ʔLcy&~sRP%`yYhC:meEG8)2SQ3 !TBڲ(#0uiA 2&+9¸{$0~eEJnI@K |c<PB@ xP.`dKYE+PlT!WZ1E#jHb'xWIV l7I.~P wI|s- ]54PMHB 7eC)SM ̕!d-"z!T̵2"k;W&P[,e%))%.L 8GeElt,ݠ H-0B4黴9PnB)!`}v5Z[Rv[ՠE7}1AvN K9T$-#aGUw%vT4h@X|6`ca e& Zp(uYvE.+xt F. H^tlM7cInj Lce.!vg-*dBy}3]ng ̹mҷ>*-6M_+;O v:UxF[*$^6ҙv]F+, (7 @OB{n xof+深&T*W'bCE;M%J254ʐ,`;{ g%N|,o9Se=4 „y}D/:Пpc1qEYJ"Pd2 S9 Ns%ܴH!HNtn'ehYh3 P*qn7+`6fR+ +$bqItQ\y6V)H2"96InIA3 ^8 2\%i}!y99.1Lo tQi9)Rvy. EiiI7ilysP &9GEM PVvI>h1  )eH=Js ;pyZ>>)s0n$3 i`哜&iT$ "6x1k $2)353 `0Q/@bbII!04Ab/y20O3Ig 3h:ڧt1{ > t`rXAh%"Xv*@ \$Ki9@ZzBsCs7E*Y`7y p1/:7K/8H@z!*!:֩٭Qu YY4I◭ªojZff za]0◚;E[%zC,J^ײ8A,dixX  k. KB%p(L*i1K .ZIiY;3.ɲ V媳ukFڮB :G$` YI hb& 9p+f9YP +&-r 1=i%yɶb o !${ 䱋$9@91AșA=Je0 + П5Ctr݁ " zQ/kIsq)PX*!kF"+_it#rkNq- lˁ.)kzY-7;[p3ЧcU599)xG9 ] `PU -v0ѩG BKa!]S.JPZ7 fZO Pv@-Re0r%7vP38,i<uJ`PiFR.-,id] 4+|1ÒzC6sYo1 ƺ.D *$/oy124 ]u\ت))ɜ3y%@Zr-).ںH쬬޲ZP]ygѡ> Ջq"E!R(!ƍ;^\aH If<2eD-&4HsMsܩ'ϟ=s ]jQE])ӧN*[ hEAeѯD Tl(F&]-Է]V]uVsWmڢb<`Ä+N@#,Y@iڜ)Si&A3:MIш>mIc ie[0^y3]/Ibpa4r'Ķ(D˾?gR}N^>o_IyǞyGxGك@-VaO\v5UUuZMTJ'n2&&h0XV&5Նst2e!M`K8rNv*o7(#Z&ꮼxet}6D>(QC-1kIdѵQ HuN yA餌QSAԺk{憡ʍViW': ]kWJW oQ׾0+\$^V2L\pbe!Y>?Q+ sNqipҙTZA{ꙧaZfR$lFkɆնox5^ʋsra{ מӌ_=k 9m? Z+8H'7 *+Sd.AK|ͅhbsz$%]"G_2lnGWUMzhe;WrU0UUyUE93IZh%~SU~(LuʜcEO&غۥ&e(Q԰yjJfRT#2bi 9S : ֵa@KKC67Lkp{X:! [7" mr[}ygs EL*(%ug(Rω ҆Q sl1Qn2ҥLu^Ŭ8/zEYqVL"(nLLf{S 3> mH*˄bvH(rhDNr#bpFiQ#HRY*-՚1p,=Sd;xa ҁ%sÝL8&P5\C% EFETbŰhBQMZ0 8p$r"2QPX\0M,C~wx#VN* :g ]|D7ҋFWסMK9akbSadW%iv'F%_Qgj4SҽHNe,T3_hF=5W*ƪ5h]D!ԺW+\1K8+W(­~EZ ,o(hha4XX &-y f8h37%}l֟  'h >Als ੸B4!0  Df.tH!7-uӉ^8V`dnTzc_1MB)R򣘱{ ~jP]*&D.Lm$W*D!QB7&+pENj02v[1 o\W̸ƅ !*@  2E#J=Vbfe,ъj,9G+ЛK4bA ZY2p&[t']pI0 4$6.QԘLMŌf]RŬt<i|0 Fm%GiQJV] IvI@!KPxW^CgFfge'/-c2챘[ܿ3?@ j5CK4j Hk%ZkQZ;E] N \@ۺq(hv8[އ& YP("seTgi!s4ODY e& k Pg(]<&IhT@uqM0{"WֻnI]@4yqK^,u,y4f4J"|*u[-sSv]DHVė]%cQXv۩dsrтILeCIbj6anjwDV9}5olh#, $Yqh]ed֣⅘k-px 15;>>[o,* `\\gPGPyP%h@OPgAuNJg,{F[FN*1Eps`ZKg,h,t't [AhMp % 0 7 98t*NA `Z% i3 6z"c_׆:^"3"!1|2)k#e.L4k'>Wy<jUlw%EQ׳nc!Iv|Mm`>l$G>>`'s283U˗.Bb4~\5V4wbʠðpP'ȈØXØkp!)1D . C@5d|wMPhNNd4NN>GhPx/Ԏ}CfHuMNuhOedt `p"1tՎeg"2 sq VhqM\4Lu$9pfGnk$`:1+r_0]u%.%o(_uaycnbm!QڕR1;:2rE ]CI|{{;9ӔG+0H4$mY|a>aط"rPb JaV~Uܡ~P 08i`iI8 SVB P8n+6T-8yFhh(66\!-gCh,8t+@NZ(VHgO=W[5Zx'ihdY4sp0$9ON7X5 `{;Sk;FTk?)E!%S/2:WB c!&}ݳ.=C!,%`ʕVi_xETI>"Kd&T3FI `I2'EUDaFW.;Ro A1h,6~Rb(~1 ` ` K@ W 2f*Y)  (=1@m0o@m@ZOC$(@3PqPO~ЁU E T8$q*؎7uKȎA pru hsh 31F0F:QK+;vP4F@Z'G_3;WXd`s1=ct^!w]:^2=B %_mM&mD;`'As;vnF %FDRi Zbd׆̖b4+#!UamQ)bF??.F?55 ^ca 65^ K!bE CfP X+#E-/v פOyO6w pX[M f&y \+fsw+@ԂgQMXKz3s! 7 ;I/Gƃw!SBVE[jQEg!VDuc"%/j:X]Ss#{#Rm0삗,*'>ToR`KIjDLuSEH4!gh!b}⇋Q*S35A 00[; p[)þ@DBBDĥZkt~Fh{c!,27B@%g Q Ī=l Ge2k/t$=öj1Q1;9C`mк_»CQw__1 <[2k2Br$2?SR2|t6H=x}"b%J)+ ˰1*ZȈ[\Ȑ<ɑȏ0P0`Ȝ M#7 b .4.nv$̇`4#4&"q1~}# #}m۟a۶ r4u&~Cs!2qѽ(Cv# Q:IM#=at RT"ݹt4S;yj][b1zf!{~(=+g2;2N/n0[Ez׬2]Htms vm۶нsk@"=pfhXc@LS(-PP I.ń~q*)A^N޲Nʲ"Qi O\|8WVʐO-fUeO!T|'Oy&`Sa%M\l|etm)j,%{,4A%pH24^SkjTgF&>=>D}{9aV]ʀ44o5vv([W?ܹ۬G޲#ڷH^#95L-յ-<4=P9}OOx^EoG!9jR܆7/8,75gLq;ۓۖ ]FŹzY1{Wj2ׇ4akR s$fĞsL8AHs|,!?=}Tb(U>F> p4A>MR_J45L(V<gg_qN@[fnxw.az o8ρl <=%^]XG@cCPyMij DR1l!D|2=3|[]TOInǛ\bc]NFHJ^?YOtSol-CX34m|3q'8m2h \Pae% !S ņzxqH5]!b7i U J@ UP'orE*6PbȤ!.JD5/Z84'P>k4eP>q Ň -ZtQq wm^ 94\DR͈or E8$KP2eMhҠh4l44Oz;sjؒbɜ4xN){A۷؞S':5kۙ={=ף.;e7_|vk?]!ؕ_+`?T B쪎,H.B0ºr2,i+pRf\(R܈,.K-P-*e^JriX|1 z"e*Qʒ0E 龢4j41QF/$4Ƞ1lʯ4@3331H̳4x+t9l4b[43܆+m3ߎlچcM8,z+-Q)-m}^W'}YU}tVY6buXYs-vYa{dhF[q oρvܳ]So_hVUsx<~cz7Iw˜@7A Dx K(P+t! _B0$ chPEZݪ3F4FQqS#CKJђ,q%W#z$h+򎱺-ee[έbH`bXb@Ϙ:CĶKg7i1rbಥ)NzXaCy1x~˞ [7yxSx6ӝa u`}#?Ovޓ4Ѕß(@y'FPt64jA5Q"ԥ(:!jN履;ŹS}J:1Jэv|4KK8hs[h21jO%ѬGN dI ,K"66mrLۯ>r2ڝ^̈MqNlkytBRt_MhI9ֺُґ z5?1ms\viIU*glV:V+mvbA6}lV5cM G5f8f,LPWa~j1Ә//:wZa&[}c VV28 6o[ZOܹ%J7 SY6 ;fի0:wg[QW{͕ 2 U6aov}7q̲2_B]6pVy}l$ h?*o+h/r8J,kS<P;)-,C;z) ;݂h4`#:C5`,*)Aʛ=c ,AR3x ;Sx+䫷Y2sbBS>8$#>(o=}67 Ka(::>ps(h[02E3*,o/[*?2Dô`('7̮4+b>=sda{6*-Br"A'k=?r<ЍjS4P^4`Eb^b eF_D/G;[ҋ<|&pK(}JiTFc\FhNeFjF_.Ix:#|ǚ+56p& ʂ%\r{*4(I뒽R;7C7+D1 (MtDP<0HZ;.һBMdǨvĚ|M샷;xp۾sKU4#ΌHudIӭ <-s6KCHY <&[>̔0¿Vm*;F;Tss;= I=/"N“LJ{9[ z1N0S(3勊X xx:z%1}ӎPRTc5+a=6\=KS?)|- Hİ,@ų{,u,Q&\+y74%% l5K*-9{ADH)yԸ1Rs:pH9Ak$mTHMn,7Emj+Ȭ*L ʺ2 Q9UaX! ױ3( `\6М.d){\م8TIkʳ=1hO1(*;rLX IQ5$}{RJ\.R3C=441j5N5 D/]8<քѼ;7<|#L>HDu$4!UӺ \ɹ3e=Z:V< #Z;.ɖ:بPH"z 5:Ya \156({}d @e]v8 5)H5Yل݇I^,ݡ;L3"=[RPL>V{QGԇ43BHE&__t6@GOd' _d,˛ɗ%u:=0T,A*+LM3ʉLPIR //E V0H1pgBaP-8NU&a`8X拠PEd-F1-0fE`OSH`dSЇaSHSȇ*8fbB 59]⏛= 9-,Z$0GVuǐjCeg9=;[X /R4h[ue6LK=,:D^U".DÇ.C +9=Vc;njtr<Vۦ&ZL`^][XƄPhȋEۨ[W=m[ˍʕS-}P}^\f\fܽއZ0}j^>}[-%f;HnqbK/ܭRu:"7=X@Ṷ42ceǒ`je> .y˅Zk]MXq΍z\[Y;zU\h0]Za.yS=Iscu 2KV2KL6V6860̯dE^SʨC;_E,ۜ,ԃ13z#ģU6ngJTTEë^d?*HfVn<[, CH۫Fu~EXecee6Uhʼn*ZvV56Vg'ShV gי_|74hM-^z#xСą4.bAsh1>$!Daʁ^v}3 g!B -Bj`G;dSgIs*pdPN WFW6ԝPEZ'H(”&TNJ,JkB-?@,_vʄ]qZ21B~0ݕܜ5eyXm>YƔd3Ք$Ib jS昻V9c]vZag85ԒT_zDWl䣺FY #YbWɲ቙YeIechEW[љ|-\FLyazgF_z9'DE#A$i W>ǽ>j4K ~v[[}5K({ۍ߭upCPAagIm5&`eA3ѱ8!i(֗٥^Y>}0UJ2zpA9B@SRɅU뗎y( jƠ/r{2d> }FU:ϓUYD$`Q?gmV@b lPpXFA[.nq)@kXJV(5 ZԺ8 AEM1 W\g< vYVg"hdS]RꇱմKPU 0(ÌT'F$5?Ai,ufV=}y:Ԓ1,.636f S#+ӭ3>c)ņ3է,?\2U*%d u8~Ұ! @%d)\2qe,L`RT/uIc~ns'#I5= Pr k74%0x0'\ CnI#S]<1KSkX>M{Q$~&%^F"KQ I#]ŏm 5SUծ~5T$+{ vw,DcX",N7djtFX7BZpծS^ֶvmW !MqwضUoWv5ޛn[]n}/ySpNfɽoj_ oW!_:lójRwpO]! B'#ﴖbkI҃/#Ⱦ WU+ -v^ӕm^>"ّݧǢzy7Sg4v wkwѻԨ[n{/^V*UgWi-m-&/k~ ZC?I^eQ|yٛWr_zgE^뚏|hO >Zx#&~V7mi.o3>rXaY~'hD't;%YL^+L`F_hV R T PHZj1  iIE PKJ0ό ЕODK' v ȬQU6IDD=1ʔgHt !WU=Lm\KjL   ,V= PV`FU=3m *-!LA U|g$FV  hQ`FVl"TӸTZ\SPESbKmQZՉ() @JА0]IIpc}D;4lqJ58}R6ɴJC.;&" a`8crH+ %fT8 GAN*#2:O@pE4 -eDC$HVm J|=p\GĪ5.r eԽ 6]KŢ.6J%%c6b[nZVFX D"OQI?ЌCPb&@4֚ "LEZZIT!E#,LMS툣1NE>18B'972b&A2e \PCz$S0oLB`Bsqs* ?5J .F* U&fPe̬e UYnN4Կ@P'rP(lIV̤&"^H5(yӔN~ JfWp tVURi]Lf-c fHQ# Z&z fK`m O-!o̊#MVMFLxj%)ybŔfhfiR#sUB] Uf Tb!CՈNA$eq%JX`D, 6dN`$ "BpU"bIInHj+J(?bR!Gj"aG}a`͌P"pVYEx.B6Vc3=hxҦbTBq)^T$Ԑ EQdЏI2 NL%l Kdj܉mdnf".grfY-*dOcN&jF7R MEPنJP.&>oo ca"a#pVҲupKsʲV:[ X Uѧ qXl";Z% QnDnA T,@>J'b̮s"mo^j+ PNGO N*7 @~j"F) 4Rabj'ՀLf9џl'm2*U@N*#YfMU#2`2'~l€2lo&l~=&(]1& 1hsBtx}&(C7C8Usa%&`ҙ238?}B1316=OtWRgPGC_CT2RwGAZ34=#@^+`/UuUtXkDGwCG-F|3gGƮKSTY\F"jiJr\-mHNiF$K)4!̠#Ś K9^NHzFtXFhS(XܓeP_b$dIZ"^jKb庣;e&elnK ˥N ^0ƌsո$z; AxPEAlJXy/G TqwNpp|jJDw՜%+$NFA&m=@KpqQ[H2gF! ɞc92'%/lnEUD*XbL 8JL /ۓ~]mN|+x^`!6maٌ#h eybsŪE4Djx .%Nhd9tR RW:ĕGz+lPpe=Lֈ>lBqZY&d¹-4`Ny_ oKlRa,gI̦ N GJ> vUG 0Bdq Np'Dz/ SQ u$,LIQdL× UWmTYĕL씣U'{ΩY`g[|5ܡh32IOfmX\zareOK B7l7ܥ_pgݣ.ɰbAr+34r [O+3L*K@;v" " %tBp;4ڌBSeY $:@/4G HSk ˜`kQ)i"/Z0>9P4Ir~Pt >JD#,M"SQ)QIMIۓ );:*+ lK8:*\)/ʋ4҃?K1'| QkmkW&qL/]jQKCFKe$m8ѨꪏS4D ɮIޘdc1h4yr%԰}.?ɪ+@Ϫ[fj\3 YA~sTӞ b-5l4˳Lɐ2JfPpL IHӎEy`CydPfV'6Z&T&56 =؉!LgMo<%eY |˒S$^ZѨ,3"j;ЌHB JܜrD90c [9\x\P JX$h'>MŘF!T2-1:QnEDeKiU*#YFQ?u}kz64> "D`/2 оG2JI*d5{o4)ď ;22C 40np{K4'ƐB2..[0L F(] 0*@&a j$ۜNAyar[2ưf;Eoa`'`SHEо1:ҧUNxOAj6VH$%!d)EmUjt"S oclox%[mEA8E? jy;dN8k5xDƆ1$:c ]ג ]ʔwZrrp;vIb8\%nb$k"V A.g@#}Caev"dNqmxr" (Aahqup;rXE[Mǭ.q( Jפ} &VBdBL.4(yJ(1 :ֈXCzZEG[Qz#,:t)y^̚;Z@R5c,XaR]EjPM0Hb1?aKE={CBLä yJ[ה&@̄$ y]BI1,v94  },oK4d#\A\1Y0@_C;ӅE"LyXa\p A )s: 9h h/;YJⰑJЫ0>I 2$ v3&8Fc,Ԅw'3I( Fu3 8AoOJ")Y<51YK꧶l$9I*Jp=G ӕ.!/br 5h1"0]*{e:nUd${035'7YvgHw3P]wc2[ 37&% 8WBdVxD0~L~cotv,Ej0V`I7jTУHΖ }OJg4#A;P, ;h9Jg^Z4uQZ_e&5A$s.T`&͏E,> ,X.@QoyUgbM6#%)_ k>M;BBʒe3:7V p Y0U39dWž]~*sS*ޭO 0a4|U2hx]2ڿQQUw|^zMh#ĄKf nStIT̃B!G*%])'e) #>+$)vZr@a "m+kF +Gkv*#f# H&衊rHpbvdG!dฆ'8':A${F%1zP `XjB M(::c\=y %@쨃ZVme`> f>H3^kj2 l"c&R"{d_tJo^ !D-Lka4a\h']"#r+cVLA(AQLgɖ e ʚ~Y.ǍDE"xtVฺu8 Lqj=vtr ೔acb%-wì.uvN¬'Y NP,D8 tNd~dRMȢfĺAW>4Dd:D$̋B(%i:sNѴL>P¢\&hFPhmdGJ|$/ԥIUW?njnt-` "KA XnB&Dc~6gL@nRISCnC*4< SClF<LYR+?KRWp%p" Xǽ̄_j LPh敒jaIm e䃈`0,R(^ 2HS124Jd$oKT`]rf;dgx)#z%>P9mn<[sZfꁤTekb*d>6$q*&O01l\&*LQs$+~%o%"m9ʫӥذbԤc}tPVL>PTr&Fs}b&(F12md6y./Idt;F64;5(G2A]:ܸGdN(:d6& RXDsƧyFm!sN(L$溒0ӓ:%G'S^apld^zFT6fLtVY*-/Sq-F9D}J3wH. jFrd@d4K7hՍΓ-FYlE!Վ^p'uZ'Id'Eo8&fGp>.&Fk7$w6W~E7e2$tƭ ̣n7'`tB!r!m0FMKcIkw&J-xFTDGFH`&&|eD2D1w},4~1lZyȫdC3u ;b]rⅤC tl*`" pE{rK28|g'Ucj-Q.tLTLs4OpϢzFX%m#}cU%ZR8adk,bW} GGnB-m[\P aGA:}e,c8"H텒&Zmx& yhEgGCtvQI3y"&z)A/ E aLS 33Q6j^F|פWPYЛXy֘ud h2h'mf+fИҫX+'z"s h3"t`|3JVK,H7lSNS PUFpGdC#-hj֋'1FiYjcuP^O.ucҠ{ ǔnvOs)ZO86"&tyt`wB:xspYiKg|EKbX V'm9.WCwn="cV0grbAڢ3pVd[DIQgV2f3AߵA@8tQ zh6QТh 7ONSxoL4~ m`X bq$k5cҺjiH2~ б!22J!t"+|o뜈q k5)1'`i$K{L%_2`k-aL $%_aDJ:uP~xFa)W;V&ZG3A)@R_g|$$t ~GeY8(QiЇ 2G&WBZ/.ϸ{Lp Cf ze H䦎X) kk7<!A a6KP!*!DydW!IW.7{.n9zzIYP,"SPt9Nˆn Z׈swr% &GK1q/UP"1zt1290HKb'#Es %fф;/H*bu12 Lz3y/ֺ{e7 %hO n1,/<F7[|wy m_BΑ5 nƖE/<^{R2RИU\ɏ؞f99GχFÀaF8a4[ΓWŇa3-qyo8+rGV؅H)m/%B+vn{9AIve\gON6n޶t).>p  =BSBhfGAdl3,ҿ-[]i1ppW{Wvp#)G,{ܗV fժ#jTZNWƠSNJ)1'a{AS z,Y*&aBto,Ȑ+"hۧl_A[`[Ϡ>˱O8q95K})O 'ڼ.Bd}=>pXŐ>Է^G (QaDђV8Ph=Z AF).tQ,S[+͊"۪r!vЬW(ߋq=z֭^[lxcI刕oF1ZUj2״Q6- mbrLf ;)ńǚTСg5btQWW ./ClylM#"[{VJ0eDݷBLqX2S-: @3 I`U5V)Wy:]ZQP2 д#C4 ,m;$L{EhY2 MmA9\AE1XFE[iq'xIfaĥWM\V\F9f CY6q!UuUQPaݶiT*䜄rf&GzghCAufy^VYEq[T8Ճ!Tj?*dyTnUMebEWY %B&륡A,3|Ĥũ^BBML +J,RV 5eE=.1>C 8,GJ+T/41>+ÂUw-)A^xg%ie^5eqm'DDf'xq[l҆V\Y겏%qjTq˅T"Fɵp,vx:ƙgyVWi4fiʀC^z!a$k>1(It62"nQNyȆ[jz_zhkxc(gB~%)^_u<:^U͞'/ge_i]]{9E]gەۙdʅ՜e/j]shZ&"vz RgJ!T IW!peJNBT([w2~•Y"ÜG}02ACa"%!P$v,bdB`आhh*(_xƑ҉?Y ☵CCVxKuP ev̹"CFe-5jCsҡ!Axeb)8+n"_dxVQ#[wu jvS㢴gI>I*j4.5q6q!7/Nᓣ֥pЄ!"'* |Y"iFXm9 yU VfPKD4>aiJ? 1퇫%|# L ށ|<'-p.XQ?!nGT(7MP1:S?H> ᤫz2&zrLa cU6\ (dMM#SPטH/iRAv;&+̈!E#I*"yS;YD!6}"עv {KU Ɖ#fG&tTE c\( uvezͩKnTSwѪ%*HBE&kQL⩙]Gjӣdi% npwlr:FZbEҌ b4)l SNE+ U^W}V\lx&ris}ޝDU!d)RbvI,=ADZeIOMDSX=G6-)!T]= zq0 vIdWq”"-m5 VՄJ LifCVQ$^:K XVUKũmQly- +L GWc ٠NHwz nT?#RreK+2*D:dV_5k#OÌJ5΄ÛU5jΔJ$SUZ=,4iyIҼpLV!\~5Ҋ&ͤcRVi%JT]oJ5LVqg%7Y*17&;Bx'3%]A@ͱ'!1@,6"[%TBf;-..-e0>@eZc b)ȡ(DeW| /ΛJ>@ ='jb<{$lX3TM ՚fmlxi}*Irm&ZkHNC]1ScYj^H33':_3'p!'fs>,GS޵aTuaZ٦g2bM3 \r pU b7c~S'(QPUchSOaey[ 5 4|-/^ ["yс arӅo 1Ge&Mk%3^ݓgo%c%|tD]SS7?KB.*]6pX8z'YT`lC'5cx<eE|h'mWrKQ6%YAEIV7@ rC_w2yB c \  {1{ Vp Sxnl4S2%NB 2 q0 bP}|P@ G"{W-2 z'10  S/{2 01GGRZ)wME4a37]Glgg|k'L\RaZFK"erwhcQ9{"A/8z1Ba1X N'a#Az<2|R1%r;Q]0"7|$j?bti*A(^69*)f}eDF52TbV]yJVu.e#vi*jTT4mjJ~5#%6SVv&(jUhv4U5)xQU8 o @9S "© 阛o '3=tX~ׇEhU1|w]z'QX7x a0)) '5]zg ,y|טjI7!Ghd%1[lT%n\E$EDcFYmf]zb$)'6YgyqX,tIl&ArH`gfkrx~eqЋ)(%)MTF p0bE "CH6vUVW;RQ#2@3PCA%8/C{$a˄J#'5B11BV(]_U a4#z=qm+Gt[H&':>t=ViE/Y45yf>ZQ'M@yLJe&aRR0P1߅W59+'{&>(f)dpt) VQ'b"^:2"Ss+lZGakbbv́P! 0i&s+A.(!|h M(ʯ")"®aN&:w =  j  h]hbT%d +Ov\UdF&3[f\,T=ԁqeԹb#m\d2:WFTCte'W`m2d2X˖TdLdG*NXW A 7e_UnABdFB +!h[|oE}Ȧc+/ Q.08y$!NЯIIZ-+---"Ѱ0.i B;6⦰$EBs o2ļͩ#o&ys4 bLUVK^|mTcaY`;3 PR&#(E`Pexbqb(3v^edADx@8V0M*A;6R*:rđT7O. =!iPoz9/DS cb/*QZ7{NիbJ3 G%~#w<3stokփ6bDF\&٦ֽ=!&i24>8\F5Lf h=agq}4RX#],@@x]ѴvEQ G(z̦#@|gFmtV=[3p6\zo`u.Hd>ANґQ/kWÚFՈǜT(xU_>zeJ$,ᾅypIOzKaxcA 9СG;8}sᾕ^1 }Y `bĈõ"Z$LdydPZ$8ZKRz/Bgey8`SJ7Eh2+*㲻J*6ЪL 譺-1:ͭΡˬ;R#I{Ci ,I Ih7; jy چҠ(w-; 㬳1v+({j1tqK,[ɮʌ#S 2$e}Qfh܋F"R=6&PDfۉN6$4l7JZdƉF%ۇ'A!)rc)29K̈́S#2FäNO50B;B.6ܢJ'4, 8U$A͵VӸǛ nNreJz4yFiY+ȱQUn#2*kޠNK&5&QP "=nIҘ=Ј4eAN@Ny<fTfqPe\ҜO6MGd0]?!Nqsn1QF3.w8!!Ɂ[kN6W Jܺm9$5 R)QvVhZN74ۛ^7ɻJȯYrY;*O2ɺ)2"kT&$)eP[c#jzAJL_:& G BLMۨHD# ;(Ā4`ű@Y9E\NKK)b.Y >}1o |i3Fq"LaP|iafBB <=[oO~ T^5G;XU$/n v7elْo&UJ֏Kdli|2FQAJZC I^ylKk4'Aƽue'bJP1O`0^"5DCʸ +B3Z&7}p܂K819ASDQ[fZc.c@ ɀ>2T(hۉpH2]u;(M)D>0L6oGś''Au,v|*3j[bAEIcZ mb$,fTITK~S27vGFc}PQXڔhvQ/_( -^Mו?A|B1!dфjhf؁]0i="܅u <5"$b0 E"!õ5r)3Z[^­j2峜 +3MG9%eujciF)8cIId6i͆ا79+d@)X&8h(tN3J Y LRNJFXh"/qIW"3Hצy3k[®5OYXy` 8==EROd5#`P>1{Ң!d~K꘤|]&E"7z4?ATMwM<%8~ %0 `Q'`%c]70>UJTu4`pdݪiVŹw_* Aɨp563q02lpF5+c1ЀN(-CκDȂ}F`%].F՚jdzZz 2BxE#U 2ǮI`O^m~CgѹeEpVo6bC0fն:<}]z5R:>΀ 3VlbG#b:OݔgH7Z]ۨ'>MfIh6fvJ6ec)XLRpd`]wκr2X/s[B> L&İҽF4DB 0PAx\$"J4. ¢d.etЖ""BEO8MgYSQrεTZҥy 6&aI~{Kbm*OJĄ1IA0MѪXA @A3%Ȉ!?N 튒iHڇ!7dښ7 ч*𨟑"Ȍ=›#z0*q33r0{K)1k+ 豪 DA i/P6+˚(p .(j21;&)y <ZK;:l5H勺 {T Ѫ6"A%9ۙ )}'Ë11eɡ !^(3!"GRhp/Jù@ QB0A`6=rY:d%rz0:ےCZ:/CùmLи, ! Nt71LAi>;S/B fl3)>ۯ( jǣ!fƿ"ES$rshH3Al<0Z 3e"]3JK: SKaZP "-:C!Kk/5C_o SjX۟x8=YJ L14EhIDL NY{6crp$&񺒿 9o#k&h!&*R芉dS*%# !}'N"-/JȐ6@ʠ`ٚ!<ɎqZR:L#9(യ \GS3Z 9:۴1RD0crHM٩ ǘcX)DBK;C-̾S.pCDN,ȕ Gܻ*M}ezκЂ_LGtE x W꾆aLAIƱ :6٘'Y:K䳴(uL* >KB.$@C, ;U`Z24dZ٫$3DƘ.T*ʝI=:H$C[LAPGHiDjz>4\! M0ŻEX+wKY*2%5>A2 /VICY1:IDB69AI܉!699YrSDZaK,_P\°H UXVIABNdC1Ɛ!KnDSʌ; kA'Ʈ!x a#:?%ClŚft+K[aߟ *Lܒi::SKH6aݴA20B,Ò+a% Lj2rM;mu3 X32TEBFK[ Ĵr?Un\$ ݼEu g55 c@FjrsP"DC>۹XCtW4gDNDr>O5)a>$ ͥQT$[æ.R'>lI8dм7m\ >aN_PIf\1`FV4>R+.qtAJu h,Jn\ 2vfM*a`l݇02Чc0SRHŮ湔dLC++lk3H=X52t]FӶ^:$K ]UĬ BtCѓ Aps2ܔı,ѮSQpҤBrsP%XW$ + S1Yaߘ]`EYq7lf!ԥWiom+`/^py]R }#-fSbN> oC-ߒuuC(m-,Afm{1Z $0ұcW2hմi|l3eG[~])>SEЅ_8+`y,x Jf(/pM'4P<Y:MW D. 9HEGXGru1ҵ+ %Qs~ ~LFE_J"̜|6I֕ T:>|f<Ƽ`ϿA:JaVRCp9j]39̀Shh(͛ŽջWYճB_Cj,dqT¾=ڄY8qj 0, K8,1DlVO߲}A;Ho= )3͠C$0F |812}&6lhrI5Է/’SI3Ə=9F̹2N/ZDPt 5'{"%P|p_tdF-}z7c͖HIRpaty-ni!5wQ4RFy*$ttb{!%1fv79gcWAE|)gs02܀fjbLivF"FwU{9}5*vRǒIOcmT2(uLUE0]YV f)[1zHiXQE"QZVd)݀]e*G掠^͊]b|9P\unI.(A'}APk`{e2ƓQC͕dUb@9ٲM$z c<F higʀ yÚѠˀ"-efOE`|RՋ"vFLSsB'N8IJɕj`]tPePzmvm61щ¼y tQ6 E誫(C"\^;\͊b;J^HՃrWP#mW%#6W E+qLOlӿٔc^ֈ%+]TL>1d(ME =Wp%%.R\}}s^Mѻ!4.N}g%Ӎzq0fo5T]X/4sW7.+tFEXc@f9hLĵ%cV&hEp1AvVp9I UD$k&Њ$B2N')ܮ7lceaj inԨ&!C44>Ncٛ֜sQ,׌~}GPv15? Ĕf66]btY{B"Vr*_Z泖I&.ᒴ?Lha{6B'd٩# 0<ƢǙpYdShpO"Vҗq9ORC H*mf:,#ipRCi HY90E$;^l)x PT*Ҙxh`Vș0QIWR%S',Nrwp7AFJ2v y ߺg)Ŭⱆ42~cҴ2(XJ=w(**-%1}}Y4$e1F)b,v+7C2p4C TՄ2B!b؄2J ֙5@+ŊQV.j%+[eUa:WUck\V6Vzel[ kV֑M,ƪ־5e,1(ʕ,f N+]7Y鵶k;˺մl5mkWq+K[Uicu5lkU nXMK1bfU-e/ZQ,p-ms]`\ep6~Z]s[վ>l`M™WPMoXm0bdZAVe@X׹pPbf" 1+"PbBq?~ALJ1HJ2'&AE@[nd]C33mf'ڰ' t!*T2Q@dRM.Jc;9KGaEq̮4U,!HqN 7A=nj˙R; .P:/46Ck5|Ә 8LkM*iDu-("9$6p) ԡ&LÇ.2Sn1:O=?xHx,#nK=dDJ5uLZuHʹҔCBɞ2%%bOHs:JpfeD, Xc|ʛ]qfO\ga(/_Ɵ KuFrM-#|R2 %CFƜ|H AÀH.{\*1Zz:C9\\jFZd.$Pw,w)B)2!!-C{uĉT bH $F/+ce(Dy2'/VҘJGɒd7!iOӐ_ Z p# ixt<+c*풼0kU;gQ5t/dYUF,LLʠEc\S0 Nt]8T\ dP ۩?=A R=dS^ ٙI\P@ͅ,l( Oе]N`-8c@ QVą8ȮI &*ٚ)D,MeڙF [͝AeE Y=O >MqD BMZ\L\/uMIQ5@^OTTYdmDR&%JQz gXaH"byLH 0icR}aTމ ʞ LQ`Z$ʢ ʘ @001( =miP yTۧ"?5%$1^  Na&ZB֞ Fɽ!.y(u]Nn Y^̘1MDH^N`,Ⱥ m,H=qTFk bMMU$PYtc eRL!UUEXSh!ˎAQ ߨ<]o^^Nm (4=ނNGSt8c,hdI$8ժ󐏴ɛͥ,ݓ]ZPT%F)ŋ,ZhzM&]ao^PC nclX:c%`iDc 62N r>RЋ@ʐPIXQI٭ԭȶ-! .\+N/ʛM. M`7Vc [G%ѥb݀RLHsXGHNUR+ٍ|d G[(I@aaLON!=iaH*GAW_iNa!f`nȜV:LLV +|tN6$|( CR̥IuWRȸ| |] 1 !7Ŝ!߰h-`16- |)2O`HjcRP)R?HFE'8 0 #jJ=Zn<6 PjF+ȓfO}\)(tjlNS!HԎO䑄OGTL["Ȱ$MqPu2 aAM$^YPHM!" :kn/y B:F>fӬ?'Vr |VΔ#ӱPOCT̡g4)\4 ^% $Fw ho|t'alHlkeː[?[>]dQ0Pn'!d휏ŰtT./uK& ^` G `= MlI(:jT!J 8PhL} uT7U`(4dW@&4q. Q (u]rذhJ[%ڌWe8Yla읇ogr ਴WϜQޒo揈d^#Ao*#7cfM'쟶̇/J\ ᖉeld nJ{<U[f]b6Q3iU=G) H7죖I$'6Q&L:b/%o 1Rɹh%gYaPeϭ" \-r+M$MAr&:e( UZ1aKLD;ʖ}FԻ&dRlLj$vdER/u 4!&D2pTGCTpbJϥTo@RDpCe!N-kXfqqj)12%tUxFKKK<~FoӨ4.=R%ԉ/ԓjig9ED9I(gQ0ip+H 1ã45h#$%AϠEj̑}a~P}"m!N7q'[a|.cGdvD,P/\JCz<M5YOw @4$05BR54p%(jCulA<9K$R7<"05A|9AuvSs9Cy4 {$03p$yTG!S sF%W.Ղ/!fӭD* K 0 _Å$bffvhT,XNn=t_ ˮ]dJRJ 6۝p}c)$>TA(Dv=>t@4(#|v"A4CׂC0yvȗçu³C}Ʒu C ZLŏ,qSY`g 'ޭiD cagm(6^ת*+!(+d36,W'qE&URURRI'C c +q-dDUMBV52>_yE!80v>hz(Dsu#?T{˾P,BCDˋyZ>,CzÖ3BkA?vk2 =omXgI]w~UQptQ2P˔R6PSAbPFb,]11<>X̣I*'tHɇ6mJ4DMAMnH!k* ԦIJȆFW*hѩǂ$c٦ikȅ3ҔiRdy5X:RauUh$զ-22}EK^44ݐazYh dYΛ-'CYи/R2NνopC>}[B N]Y-cܷOپARvd\NыV+t۽E7=[8ݒN>.LOX&B/SM렱<:эAgCËPE-fDCk[6A EhkmCpEq'S?6-C2kqX L%A3dr mSJCSRGѓ?42,1ukt(3C-\7Qa& gkrJtURQԕ+6QsNKZ3deI3RG YkKc->!g/vg ref}׽PQfP*CcQd 9Gg 8[7>eLErSVtƽ u F u45 SfML7 {yWTcfvEg"}6 N5LQgvmYhRvIO>ƦYzŦ3|AE{mgzF7 Oz,qMiĸf>b"K7ɰp&Lf1ky;F=,O LK&цkQ"I \B,YkoTƳ):˛9˕Ehs#IxM$w9yb9癏X2ƪ VPNR$]wҊn" wŪEze>ҧOk)TwۜhV"+^nK79@Tk@\J),j8t7]Ҹܺ2\|!g7W/踔.wI"ؓ7`0聈9ΰ|qFR~QA_GӦQ|3J+wi3T謳#цV^R"C0*Hc#}Tk[/3] -.;4Ξ%Z|hT SoI }`95qţG,vSyEg rkX1tv`ou#?͉ FLi~NDh^k"+LHnfPJ8ͧfihc.˒KHtLd* lK  ۨ,w&즋&N*h,0 l>Cgb N4R#7x?P?Z|hs]g^nPf8 H ]n j>eD<0wԄOjmuI +(IgL Ӌ꩟4^軀pͽl+pEDnF/6/ƫkO-0 PiN:xo'5BMlsfPrZ(SPk񰒪  ̪QG.uñ*1͊Xڰ Og+UR*gB ]OˌO ̆ҴHv:qMGHGtؘ*XB.ҔDyTnl/Y˓D UcpY6˼S&Of^xJڈwL2$Qq\f}O$͆VLD' CiXDP*쫆ZlKpR0'@Gਡ fА˞/v Oh߂J mrI oQZ\j^h)n0Ar3&qTíhG>2 p1#".,!!'b>"(0B>*+/n?B"X$S+ $ &b"D1(&&,2B+"$:b=s+"11JB ޢ/20+b*N"&1"$+Rb&B%SCYF"EG_>%t"("=GS/"%2b""-%t%2b1I4?ct"@1@ T'nt>@,EKaTBqt1$.B>e+DN bpt@foDӎ)Gj]z DԎDPL:\XD䋊qWE*9H HpR*KR:kQ*?3Kd/N$lڭjfdDK%^U9XvV$[d:^!^IhY{iDRHT %(b„bgTMЮ*HFU U3F$VJѺNDcM6 jRMRwbwWpm[ݐ%o8# U9YۀL*m7l'Ρ6{fښಘi|JL4-YnDHlZ#OLVWKH.X11 *w@SI-C)@."& dBG?)JL9O?7L*p@ 'b%PF%Tb.Z-(( #bO"*"HAbCCuM%AB?DC/D4JB&B*̴K3&.2t.9#b$TP(?Ԡ*tt"#U rdG43u,͡lPR8m+1 2]v{PAUpY4Y vGb45ʆoh#q`ϧ1'rJn=G¢{sR]c40@HԔm4%u(3 CUAEY%XQa~)+nU= uO;4aEPlCX] O¤as)Vf#\%c%w#e}nIfU(X'}"F!EZ5cDs=lWU$fx'fBeZg08$&^&zE U#xˤ\1h 7HL4bN&@tDT)>Cl Lp'͓4"ldC+CBFpQ $OG!q: ܀jх"r 7kw -qtg)bDF29R4H.W앤Cw\ ha>\w*O qq0 Kff6NY'zZ{(\Z,afUg)n*NėP/ t**}9  F}D:gҳ&ܦg^Ml4Jh-ɐDsaȠ(PښoIIGMv2a1Y^Ģ q}T΁t*$U"M龥9Ȳw{FbY`paGxYO4-zQw+et"@ҸLi*=f th2n$$5R[ݾ V6ېJӭE[ژ21 V- &3Qob- Ly{ F2HbD%:k^{6"r &+cc'㸞mjmI,~Zk|+l8:BQT=':(m~Ұ0rAhCV{h"#4aGe8֬vo-c}_U]).=q*$Gږ/euft 71DE!pN7dQaQ$4+2 \24G+9mH҇>&N#xG7WN/BxO6 ?b#t=Trq#W?xipCH"-X^52sR:{7$CN|=cc<}t*U><WTX#9P"5>%>vmVA&"p$Z~i ʰ  5zˠ 7 e4j:*@ 6ZDjPQ1z`Q>*0;ZQ5J CJ98 CVʣ@L:8ZQ_3`ڥGzGKJ\Zp QZQJGb*AU*e X}uQB Mjʨ;*rJ*Jk9Z g*AbV: S J꣩VMʨJzSʧeZJz*Z jmDqg*1G\A1a@^&#cCLf{66!oB-m'Mnd7ʧcJU>zUjVʯկjˀmjꣶʬJ0¬ZK L*> *LJEZzۦ[!KzʐW!ˬW ;@=˳ˣ Z!c*F{:z>;c:`+F˰?Aq*7JˇR{"tH1u6rD@ DqBbyBjɗ+'o)pO)8U22TnAŅcK~65X22T7Ev:ARxQ$UQ"Brax.TL-4+ftG6! SM‏A2u5mxKXp2##tAO5x3)+@X4dr"wVX4 QRB{܇*8Eq Ʒ{21$4ٌ"z1xZf[Gr7lW"gQ>?m{dZWFLWDZ$:,&LR~V5d`&g8}x7kE 8BI $K=V)AtH!de.(7'hd-5rLd1 7{xr1QIIEAs5dagY=N8D+VtNycLLJ"b#TE*)KO3d6Df\oX.1HHڣnׂKdqL&QKsviZ&p$&zlAhws)Qo Α_YtPRy,a A ZTJ \@Jy* &.Lb#Z|I7!@.X6N2YLf!8hc}FzWՖ"waތw=T5ruMCVh{F3{C-BM2(JRI(z Gof&I+R*0W  dpF\1+S1:+LOA6>&:0u"S&< Te!0Dr`H.s";80 US,PKT'` N+$N%lfCL6#>2o#OKyqɇL)Do&ʟgW츀\n*d6;Q\|47РQ9IT.c߉>!"DrvP  u3H"YD sS ғ^1 +'5K'=09 :@s _ʲ~L2P?I'9D6a^S7'fFef(Eߊm''aÎx^I7\K5 z AaX bT}%2\ r 8ЀGhg_ _m,::iɠT}r@%Ծ]@M8X^4}0꫷O_…"-\`}jmdo} mFhl7OhԷ%Uej%4.fN=vnٴ@l1T]:q؝2*hإaAr(4=9dLf6ScǂA,qs妚)u(D%3Ϙ[ܕG=CziW j\hQȔSC7~ޜXӇF qwű' upww?9~{,cj5;. q/fe&beP)zlRc0Y'IFBISa0}%HG^ԧP"z8RF&yqI%f 􁦐:b*|i<+n48q&a">zƐ%8Ы'8Ѡ|To$G(=dkO.xC19s 3„cս"Ҋs/#9 U3`ӍB L1+6=T-Vlk0=hm0#dNXoLӦョn:؆jV,[lX|SMxҤeICPqEp`M5ڧʈI*zy8vQ("h-`'g"̝NjOᬰdE*ڪge4BY*5R Bj3+Q.KƘzc*y@X2#`Ïl71/㦛S\mo9s5U휳qw]R8wC[ݹ}.24nLq ^\GO] 3@m)| jOe?hS=EW ~m'4'MbDDlcӕ #&HU~$US@dR)EGֲG?+ʘ'q 擘F#|T^Tk*~;Y&bKi>х hng")Ш2ifhO$רL(/ nS-gkݬ~0:Zpc+]* w$yZSaR42( C(&ChK̜5/qK?yNosA)^—l2hr71"oό:,oX&y`G0h*S>'r {M F[j~WYVk)ӘMT .9<+&m7g"~PƠ [^oEԒ<^􆇷9N +Bn9y]&NNV4LeldaMC!C aрu8R5SaT╜a7 "`B+Fi] :[ԴY#X DŢ35F2hܤzt>Pi 0КO3u' Ԛ]wtWTX$W9a=qG$e1Ǒل*2u˂ 4 W4PYMZF1*9b 5:Ucg]1 K]xBET<1%i$s;JPp:A&%gZB3EѩdtCdFUءXkL=O{yUcY :.zr56R;MPbx?cn2?ƒtO`59e9]Q[.C шכ4FMй:@nXuv=9JyuPWDs.LFm(UhInSUO#7vܚR6\2ь A[\6jY!*4nNC8 cn6UdwN*|G36ѯCE>ܬoS),sJN !پv[ڿo.ylGг,. <,J-)]ܻNݕqxsv&.T\il3TYS/лa2ϦqYNSMZuI<>>wuJ'2m1pg\'\+;@UM=E~q*tg>Ή5ܾ{׻YqD+{U:P=%4Ȅx41 X=ɩ`+4:%Yq۠5+( ^*IAl95fa=[k#Q+O;C9-ұ ž6S1ѵ>Uy7;*e CZq#s$zl3SCAԵYj7$ p+ c 7cMb:>0]c[ϩæ#p{+?Z!#;FeaPhFhtCD(s9:"q^o,Ǡ\qGǒ b~HzHe MG̪u4Gp|MrȍƝJMΘlHڔIlH|DHp Hh̎N$\ 4ԜM|NJMJɪP״ȪN֤ʬM4Nd\eOIDNgzKDa2PMИ( } 0jücCܹK5< cXþ*+;jёՈb{ ȁ8SҢ R'@ ދ 17*R8jg04!V E +C*BR- _BGjxRT,5=@3GUqaR6EW !˼;0"]RL߱+53^@≘ʫiM|` x[y t =<T*֠A+}r!VS#fH$0V$+$x00,1A9:A@8SQHj7ΙB\Ҿ?۫>3ӹ+AC?pԥK7;RV ] ;9 !vK\#3; МS`D0Nj4u HG:4@X;ܡk h9K9`CKW`E"Ur1"ڴ2"ŕJ?L13 =z0*u4s9#>ZAJ=H5=UAӌD$y]`M rr)Y 4Yi]JV39 \ _I%&񓹶9ؕ}˰$ :[[./2ycYiU񁱅KÜ١1ӥE?XX-9W#:UH>r\yBҋ7<4Dcs\ Z޲]jEŪk!qY z0LПPZ4(ڇ}@S߾QY9ݴS7]SpI꽷Y.:5["R;[ ?9_sj] \ܶ+|:􁗬i|X32B:!U$~}=Bb4kVa/8U39 ȽQ:_yi=.ue>]SZ4p4|7Q^a9d&:fv,E1 yh-}>}C.X(K=Q}RfiLzp\}ո gzQ S^ч:/bXhe;6þ5w:fzi9ՏOZCR.r$VLGD86ы{i3ʍ5_D^a:6E3rIg" gQ72Z 1X:Q" ̿rcࡕef;s -Zuͤ~[}8}`],x> 0]Xa`-PxP?Chq:fD[BT:';N꓾^[[;I%ÍILYz.3k9(ZNVCe0Y[YVSE~˕B Y%Z?{yzצpiF-1k݊R8P`8 h a0vPi EpPf`|g /vhzh1ZЙ r ъdeX "hHrz@.p+ZpnJZ0+ qRON4-mI?>bQ,{1^ Z]ac hIБ!E#?G.  4zx 2h vE ሐ:BY(0 ax'2Q2 :{@ $1x : w+xnЋ hH\;TW o#-mt\n;a8c#]gY:m|!e꼢1J)gMaИͳ{ k+?`z5=a7^ģSlB$4CbV aH 6j@^^e 5Hb#g Etk OP =ox Z=,ٙh8|-ϮvvI>$`Vϑq,Q 󒛎m1W)>64nWŤK_>:91VB/KFD=5ZB\t+WD*Vo=Bj7,|n @ Sh; G2Z 2}SP)l<=#3o2bl^PJb|VB\m}o-,Ysh %ua. ͏(dc>S46dl_=ajʼnPO7n>. #V/M}q,;vWy9" uWpL3r9EpeAM ňM'箽{4ͻ]w%& yX.dȻi'yɕSx1v.>NA7wMs&oLyN[lQ6Vo}D} GPt4 h!N^e>MDyep3)y~mPwm5GF]{M"VY 7$e}CDP f &p 6U P$G!E×0r !Èd`%e%>i^mqvNe>sN ;:0jtEZ8&euAnI/} I"!4)GbAEYtiV(}^HFn^ώvFz(} vGdgBuF+G&D__ *]mWKl9\al >`%z._EVGnʢxҤoed筸rSq#SKͦgR]-"cFsDžS(%#*Y%NKVl5Tܘ[Yu!^%J߼ (\r;µ6Rnn-}ce5KX)|둸+[{j;S.$+^x~_lqbԽ`\(Ðox(6Aeh=&x,cMMAcK3F; aa"Ď (naѨG(@M$-O Zr /JaX(Rb.ʀJSHwtaƨфryePn [>21"#G((E.bh@TZ_ط0{RQC#.~$cOL 973ucg0 QAPG!Db;W>htVΫ=rz6) AmGm^ˎ4SzFHG A$)8X>|\h^S.DJYvI2n^2 E5g QKJjӻ<3e$Hw$I#E:.L>/M)b8R·Ml8e%mluSEI~,>Ī X6.T[c/ 4'DTy(Zg=DkzYiI>aUjv@}3c#tHa d21SSH&,*1hƏD)CYӬS"V%=R(AYMAp.1gvYeJ bT'Ep%0Y Ի2'%3DAFv.-(0R^kc\M{"2;c 9^$36s,?m+|!רC}㗠'(i/hI7 CΥ~Mw+K oE>߁*`~U3qiTR&>E'a_'+WǞ7/܌s]Sz٭]Y]ղ2Ya:˃1碆~$b*SY zs Сa9#G3GSEjw-O57}w[&b\gwz4)ƿ N 'OztG|sy'Nf~ *I>y$YӲ+eƅrM2Z  J+PǕ= o˃rh:G 0 [eY0;[2%hM(!PgM0Єg2<gC>< 3|=CPBo3xS~o&X;~ ټ-xї>7gj׼o_}q{M_7yw_~ȝ>y#a^M^IP u^q(())`yyF^99emČCԌΐhh4M}(օD݈KS$YݜAr nic[л\@.C1 _q d^ aa!aG^j!!  _텞#*C1@^&"#a1P"bﱟ&M^}bޞ(b$^'ayb"' J" *"f!͘!#`IV<՗2A8TkHzGpultΧ5إMl tHb5hL][QG6FyUeNFmA:xt=lDVIHVR^u˶S񖶩$& oXS͗s\ۿadK$8UBH_ŇHUUH$Ỹ[RV Yx횈HCˊWK$UŊ9mFԉ9ЉNmoXt]_8@g yLZ ϳx= |YLH#aUIٵXZYE=tT ߥ8E}KyO;[qRn$f`SAfS}6qGc]eu[\g.l@f4tlj@Ӄuc:Yf^Ӹ̑VODK{T'LݧVE`mrwH 4،xcA4D4 YX: VkQޜ#ǭ>3)ӲWSWl~[g:@9~2]FRi$)ţM\Z8Y]dx!Kb!e\wǐzLxg䚜> WsLЖ\-f" 'S&aN"'=]ू 1G)L`̄R=@`Ƨ'89ZdXU.!l6$KÖ́MHڧ(#Dz)1SNZ\z\ Ge4 SRaih4IlFvvPی]BKUUU؈-Arj=O8R)4WEPDV6&p889[5EWj^-gyT\.4-S S($1ķL Z6MUxVl@jnTEu)ӕU )Վ3T]s͔q&TO^ &$n~ܡ.t#cY a3U1 S\̢˱|m+]Ka_x RGGLB$@`fH  _ 9MrPQ <*%Qn-uWR%>)HF$RhMu,BUFӰL-Ʀy+6$˝>L{e]a}׺Xפ+rocxͦ}>_>R t]ŐlnŧpT/aUoR.~9S6JfEjnc4tlќ]FͱLED٤ڪI nX݈oEULtY_`zT΅*E vglyPƕz}8Nq*j85\|)Pin੬apA\>*w5VLԬ!qncK;TJ\9/iiֹ%~̊,^Ək䘝 p`cEDPiqFQ4$CN Kj EC<\S`2\)ZNO:Iܔ>\Y53Uy<|0G0}E@̉)hA V\ʗh"/ˀi3( Q iA#A}G ׏Ff.Xa-XTM ŰI (뒒iXp\~˜%S5L@HtmRrJU\a̛[rUYbMd,KDI(Dpljxl; Mj8QXX0ǜ>CQ;Ȁ)DC-Q@nޱ wXfDͪݲ@Pt(FOnTA[oF/fc>,̵&DTPˮ|kjwWج|Ь&lr2ɥ%E):A^m"ZJ5_X%px$C~qt,A˿Q4tӍfjNY-k\Z,1aܓtn|.a #Ȅ qe)pׄB[h>ʼ:ܧ) XI\Gm @ Y40y0NYIhD E x*4(Enfҷ.mT) "wTD,/ ڥX.Nt ڪAZfn'|op芥.#K|Ыǽ#^eD~u2B0K JG{ RlD$?u=tzK<4J_0'j-hR ejXZ)q$9)Hcz!G^Ѓ>HBC.dFiDlIFz.C#Wm)=sHl`Ld&˙Шr*)1]sGo=' !7ܼ\&.{\Q p;Q:-;~y}NuWx;VF*RE)GC1s7hn`RF*LБP3TAdMaI4ۤ*R ĀJ@q#&˺'ٝ+Y`.OeHh LtSNDf| ƜK)dDiQu]-*lû6gLoG_eYp.ܹ6y6S_Au;]c΍چzYʮe3x6ϒZ&QFRsSY5y8VUaej*U/U7`ƒc ALaDmA<3L4{9rZ ȵC$hw܄wa65H'y>ί -N@X6)ڷL<e,F0AS"Q.Dz}&cG#搡G})G/Z=}3kB3}:#N4IohLɰTJat_͡ziҥf>%ШV[iPmN-qfS*V{Zq2ZҡA:UW|FV4c߰kKw,3S0mz-*N9a7VQ nm+Tefz 7pZMz|5ٖcĹ ya/z=$Kѩ\8O}1/PV!+4|z췮** ,/S6Ѩ BԳjE!})HNfd1OG~XcQr|l1R1s1,ZR̂ B6y2Ctp"83 4-s|:k1sB; 3r &hA0s5PyK5TѮS Ǿ**JwSQeI#N4.Y1,G1ؘjLM,AWa|LCoP\ k*\/5Z*z'n4l+ F&k,կ5S7 ir3B%[)5HS )BNZ=-CȠb5lԣj*]>GEl=Vk1>/Q'04UglzbGJvM6S& o:`.E1JCg"6_{~Ӡn y3WjgP2nk_G>;Ol* cZkO}Ꚅ%0c20N kQ$VMXNn^XaRFU5u9}Ez3gyЭ}'O7_<L_YǷ9Df} YT&~tȊUcSULQdgiؘfEߡ,$R2Y׉!U]9iN E. Bߖf~] ц1A6\ͮe."^ 3]M(_I˛;]NCZ_۸*Ff2q% i^C6^ 4@K(#Zմ_dP675a~w-]lִ&oXl3LȂblna[n7W+9@1xzsfRfH-R@7̪gֹɀ\`)C}8J\fA,M{G5 ʉ Ջ>%|ifvEZ)aBKQ24.%iTqū80kpBt.akJV.yPkv &CO*!T91IC0ctٌĄ[Ja`|.O&&h؎xJ#7h+ &!/$4@ op샭zAޫ~gJU蕯˝*iKjvja-P˳" Èd+ \˲>bX@B@rK˵̲$ l" ZK2q֫ ̸fZ,nѸ諶z,ZѺK0 0++IkÜQYk뱚#ūѶ  FlXu\ 3q +*+1k#Lq7,"Ol&/ AY%2ddJBZ ӊE|dPMM\@([M&f̎6rɉ.ԦfE"\%l,npx20J[Hh_r6ޒ-lp xrZM\&*#_K&&F(r'hmK(I&B(r̄m֬Ѥ(*K'ވj]hͥ r'oxf)Ɛ+"[f"d9 Kb XBWUfXN5M'-ov¤^Dw.N)m^Ŋ02uĄT鰦D:N6y/_:,oA$5 H򊉥.NMl@6gcRBSjmjBC= DGfPl=Ky0i8gs Mn}Ro;'쀂pb:p6'芀K-Lħb9'F,iO3*POGYOK؄6<(jNgj쪥ůwPͶJEdxA; 'g`$̯=0~N3z%5MNnD5M8HrGA5-ݴH{PHod$g*$g6J%3/mruMo1ˉL5-CV)-po GP5 +31CipPJ/|"Ac0B3np`鏂L~0OQ)-n0I,p0*Ej2LLyaέQjS0Ncs4e >t 4g s,JI`Yh̒zg@/ySㄑJ~f5pPc |_Ɛ\qY !w ]iSHj>k tϞ4:17YH|#; rg7x*hƇ Yًezl2NIb{ ZeP3e;*~%8  eT~J5tn܇A]4|.؈x'rxVB'dXRN|lK? IRI<5m {HVˈl9hU~ KjPx{Sz)}FMH$Ǣ­Llb9'@g8C"^oBfZB}e K%wJRTo*/~#IUVg"V""vz^^c._V޶C&mDPҥ@w iF 1H`qXP,7NxhWS?H?YEj}%gP`zLl8˕r}gw~(Օ(Q_n+#g1n;nZ<-7CN>L{x{T3uegĖe~J3 Ň-8]}OPQ

hiD&@F 1ڊ`G5 Rh=^<:O o-t̠v'G{2(0\u\o]ŊC6B+5BT0ImaF ٘T!M{em%auYt6QԬA=jSO 5%5K^ [q;*ϻcv6|<~ %KAQuJuD|ťڄvZQuSLdES(3 Đ 72#Pʰ5&}%ؚiyWeM!dW݇XBR)q JWT!]Xvږ=t@Y(&!jh%V\gvO(k]Q ^}a$ԕdr:"nm*$\z:aOEnEah|ڣm▘YRHSKXrzĒܫ&_S֜PE2]VEV(ʄ2QW[q!Щj4z{SRvmj-<%U5m+n*Ll}Z[KǢ6ޝ]TYĕfO!pYmǪ '7Z"ݨft)oh:٘sehU44?Ukjt1jpxIgU"E\uI6-(bqi Ux"g$|ߕK.ܱ׮HwFƒGוT9U5o&ulA欖Ot` {gyKMGْ^7^Quא Gߞڲ `M;jpgܩl|) uyZCITKd"e)bOk,1Yҕ!QQ0 8bI] hfB'+ I(&vA$[EOK45ɀ<3:O 5/̐=M 2K_+|K4!wY,H$bO.\@qݦmsSJ~DHjp{npv:;! {jˈm0 ݀p0\l؂wAHh)X$_AD*;AIר U&#&&'E=ɲX2~3yRЧ(,Y=e$0I|,H( o ;u=NyM]RJ7x6AWx6-,UI)')!.9V[h"XQ(t ۽JSY4!In7ɟgE*61)Yhܗ^i-[_ Ev,"&ciKɽYNML-9ƃZpkBgN$=]J@ugt*qh0+^r"ĕ!_ "bm磻E15e@"c8TDAH64_q!VrDjmY*oŻ+Վ굴֫X%0@JJX 'B>?bTN[!w#x %lV}wj>2X0G4(V0R\ߎ^~U9iwrKΒp1./ua۱on/;h ,M3Lic2wF6xg\*J#kt3C2@R"W_w~c7 AscjbYO<\U@:TsBy'!VHQVXZppBby1rr*Sxf+#>qb9U@eXv9n VmsFX3(VE6u@tYuu=k#5 wbpR]hm_LѡX>W$h:)^xO554x^u&oyCmn$*VW{#2VYH8''Y4V=BG%0C(&"Wu?gp67$6am\*\8##8 eaQrGYSx8_M`:wtEE?FGoy䄈!Q?>=3W24RQ&bTN1R$6q3eE#N$&zx.h&D'%:$e%P[k J'urP'17ʀ4jPT;?^4jDG$D-0"8C.F]  LA2 qk iTqgb~2%Tss~a7,*'B!#6Cjh+DCo{OV&Gfhd9Aej*A[H8bYH44Xt)FM$:(#8jlg7Wh BNXcpr/~uLxh)>I7! pa$8Twb6XђJQVxv'uX}o34 v%nM,7t3p@Pr5rkVC\$! (` 03zU٥*9&iVQ qA\ʰ b @`]9'OhICʅ%9w>yFd-%  9Co(7JJjFɡBEЖ15$JN#N-tnL3@ds>pR6vpJ`)m/zW!:4+5=Ho!JƁ(68CEDr75STm9?dVPbrdQp1r,Fm=wR epIW׉)WUj44p+i(jik)fE'Qg{/CVr8c\P\Xf9@*27u^2JRZ^3\*BFs!w<)%Ȃ8kZ%72 &0$H 5mta^w(U.NENab/v{bJq"Հq$Hڴl*J*xv4H&0 ~TmmhٚSu*'Xd!YieEQ8cM׸QkҒrS d1ֳOG8)M/aDwC:hġ\%jW7(bgLUJTQٗljYTD<3"Q'A5v7ޔU*uAZdbY-V4dbPNlR渹uv6rwTҢQ):uՏp{!0K$UR1P9!+#7!8tt$]t ǭ؂R\2xQwp&*(|,$F[W\Dfœ~y|C$0p0 m779bKG$#WDc˗=H:vz8$w"""If{8%5l;|t Eӡ?pEcD}ۢF&;].y—ZysPYB[6R+j"Xdz1'],NĔL$DeôIYPBzX]jZxtqrST3sm](QiYWKUt•V(֐*Z"z0eQU=<ҵ͸^'Wwunwrݣ!̃M)9EB6LYyb9BTO[UK_=1.v{A2B!UGOzga%ݑ-瘴"v%C1:qv̄URYcX1dڃzXBASǡ_5 X:R:+ݘ!JRB=r"7fl?Z3-B6 8l#8`[Q>dxA42r*u̝a-Aܓ,lys \?aF81GeMx;؟,vςJ߆1?un{DŽ9+-[^g*bŝǹiI$zoMbԘ)ceۚ}rtC{q:G&v1DR|I$%7kM$/raP.P 0p "#]u`}{U$UxxTI1໻Cz8]3.Sq(SX`B:2ePr00sΕxOU>ÁUd );g+AjE6ςVg6ۂZ-% H(gr@(310 8Ë~VA_V0O@ jtOLEv^<5jIhk{pEa֘DIW~8mQNtELcF['c|u5=F{sssSI.WNK6̨U!ih;ku<2Ti@0.b T:_ئ B @ ] Ѕˠ VR l(6E E ÅX#ņ5=\&QEiZr%Ɏ ChB7 t ?6 J1ˌF*H0"ɠ#CDi*W![1ڲڞ;΍HvLv{hPI.KqL0%. qiy4,I87ěаŵIފ9Է,Ze1 Ǎu>ejj_=}^yh~2랿@p=[OϻoBhp>B %CSƾ0 =/ K4~tBs<(R]l=#y$5Z@6VGad6t4|DW>ӃpF͕O[WSjԷ; 1bֻ QawelMW:hNW\$݀.7\u.\ok5KWgE_ef?瘗.0EQ{˭jU&ƷΐQ?8ꜳVP eIbD h6դXdCX9֌sdkrm\ Yɰtx% > f X'1a.^E c*UP0}b#W^}6z]Sd"#&-t-e F,Żb4вz0C! =/Shp'­:2#ҩТy˒Bգ1^ip zidH8X48zH"I߻vi,EPJӇKD<:zN܇TCP8чSȇ1H>2JNȮl4d.Ie,7)FD'I1[/I,L[18Œd5QEcGP;iUܨ/{/VTpAv,5#503K:E)T<3j#-A,ۄəhP!!}oQPhbѩd8T<ҥ͖TEx.SH+/9a)8wã2`Pa9!C?ayCZ)G š>/2Ci+O"g0yy-?7iJK=_y: mŸ2%y#;є-B4v@sZ9:qR#U"Iڣ*9+RQq2~J[e4QBs߽S(jP-ɸV#Tڒ2 \.G~[+A"[;B=b˔u.b垖˕g)2<+X׷Te뜔]eS[,aE`17reI.5> QEA(cXMt"/]! !m! ˊ3<#zRbR!m6SS.mq-#Frqe.|Ty0hp;ܹ9\5`F_0:M1&*~B ,jTumG !:.U\-E{2dZ*E`<$cۆH^A[-/.;h`- $<:5݄϶FZP*Z#"֌֯sG kM86wCFy+>z(9ib(дhَ^9}С9&֢)҂i\i$]%mfRgTJƞ 0y@ƬJ&dUf$ɠ,ff E/! A3Wdӧ"r;c3Zz9H":)sd_rrw ‹rU] nibw` L "}e5`҇_v9L"sЮ6{L&ιLRlPۛo^3D-BAoV%gO@$'f/aTA<VceT8ףBaŰlK=%4Y붟7iq;ȖkW;J>U2i>?&k$dtYdA 3&XW+)'q&R;-CE|!wkBݙ׶Гjbr˵B ǔr@my[f8& S\t$7{RnջBi^6GJԠ,VTѵү5%4Z2 A΢r!Zuy\qW#YԴa "MK'1p/y{!ΖRc5V UTI.!;SD]1NU'[U(Sަ?ILgx';-)+:yl52ڟyV-1+uriW/}ۧl߲ 7`Á)^4q(`zMz4>˔ mYI 3$F 4*j"Da1X𣾩$)"D,zMlJd*XI`9>LXegCU i`;Ed0>jŇ(U2F>$6/Sb3~<(kAc .d%Vg13cGXo~9L6gS([ RaK=6:"O aVF1#HSV~0cHWDžs 6m CU%Tiy7Fփ!U[*g\VdIxc{AQc!p2=x)Ls@&7 J4bHgU0/aHEfQ-wmi( >d̳ 32>lDjFXڥze ~%E`2Eñ(ygY$c\,\AXU${7svgjj\^}enCkgs(>F4%R,c@LO=ub/ A)"})E PÈ$OÅ$0(0bV+S@+wl2Z"O&Z(5ULy2YXgXG~^K]ߞn@,s8\| | fh[<*Pmua|7|@(m"++=D#5-'K/r j mHД~J=]nkX2oA8V&խ=&<9J`FŽu{bm7Z=Xz%YSFR XƓ{ >{e.V%.B*U6!eD# ɒ @nBJMr0i ;r$jG IͧzV٣SA3Єo‚Qn64_ICK\ѷJ,9+npj=G}w]-\![DEJDb |Dbe"a+Q9+ѲYaRuj (Jaf&\p|Tl+ GI,rMROX0Ϣ$gȰ7v!%լv U7K!yԒKz8L:ԕ]:Jwy/Ţ]hݒҙC) D1Yp֮/u0=G:k}FL<ӪlKE@E]4 Ѓ]=E}eS0kH=DC- L!gմYEGH5@`\!4 CY4KJb\LĞ M_@a(U 1!S8@DW=aHe$"/< 'J!"BdbaEGmF!tʓb< %:"'.y `dHcp0ud .e hyHyU.  ȡ:DGcJtd qӺ=!cpIS1HOO4D<FpSeDyX\LGeFBDKe3ŀ)Km˧HtXHG\{SǁZ `3"ei$IIKǭQOiђHy`dx\HX1vXSیQHpǟSy\|LԆv@C$= UD28N G95MZrXP@dr,BDĤ@& 2ՐQ^DCdHQ8SEJHN9(#_HKeΊHwe1Y_Cf-DʡbHɋʕ|d?JyoWrK]DdZglwdX;`խ$,>Ki de(dxݪHm%YӒJeD :5ӅdMlQ5gҌbPV|`%=驕*uĩV \ ;YOy 螎1ς 5DrF|XS&\~͒ݤnU\ (W@ Sjg,C8Ec f@@4>ƧM2Ø qu6=*qdҹ.6I{8ZMjمє^jL`αF ,y,Ⱥ(q_oH(f*:ygJUHa ]0~̭%ٓtPI"ՕVa5ͪhKd~\1쟍ִ!gpt%D"(C(H@<ϞQVʟ~$DuSj$Tv֜ŖIK~[*, =)i\GƦ}&,;YgS+VW$8!v^RgMM `˞-,^䮤dHFxɣ f-J:t$ V*Zjy5ExMLCN\Ohk MPe|Mn&bʭn=,J̒pKRNiz jȓ64`&.߂fiH:VrU@ȟYGq#6t zZ&Ff񘊖HJ:rh% w&'= 9dJHђDrȄs%E=B"5Wl`.zH p)Ɠ5UdM C d# q)-=hyq*.ܸ*: 鶅l=죉oi."dz`mG1*®jjpZ&.ζMD`o:ll)򘬫(kŬ%Eji&O( Rk*,uģ:gA þJn& ׊ G FG=1 3 fR捺gbg^ia&x dj1nhl7vX,:VjDq} nV=ʗHtdl#^k1GK'8s l؜m2 ê#4ZP߲D QCDW.#@)PhעMm4D&F\ qmɓح3Fq .O<ͷ-FIAɖAվ]4*JSmy`7ǘpkPLe301rR&5Jn ʟʩ礌Ɋ ejbFtNoٶK ÆOpj^6ta.QHH㴊`Wh$m1M1|ZÜK\Ɨ]0<{2!MU۱Xqbg`B])hHDőm>*&>^Mvk5M+k>, vݛ-[np0lS{VSBȻ$c`> 9N.׆fz0SO nyA]h&PW@VW7aMYE!IۓbDMR%V0>IofHΦk)4TaEB )CNei9^ SҕV1(i<7cr4k;fq>/J1&݁vtfFF iȎHNI7oζ(m?o9ۥp uk渮2p &SER cW,Vh_FT^0JZU[[R,6#iL%C89L4OBn.Q֧c0Í̽X矆&{0S VЃ̮r7H/doVHU+X3q4GAk0(\~Jd.OlhhŴA= C >1DpPeT/;5lBtσ ԟdGky9{dvBj%DiT0Z7u pM*ZЂsK'0R"f+m\zE̫AaHrŧw 肷iQQ;Ӡ(ef8  \G}YW/{Y+Q<:0h(FƛJ >!0hi )E W Q&GXO2+Zra)䰤^A馮V3;e>ϟ %ea(1 4QCJ1:T 4!IGI*V:'uSBX \&i" RYeԬ!5jU#Z`A쥯|4s((>!)LNo b; V-4n:%QlXX],=&7d4Xh~:"k{5q e+ػ\/,@ҽd~]6Z<+o{3ri68+ά͐U`7MRP3,iS @!4(J"gё؋|nE; (}&^Zbq ˨bFO{_ [e٠MTҧWs(6FUev9RnwX㚻Blf[jmT:O26ONVG'+eZf6Y;vz eWKDU;ȦjosKEfxTb zi B/ 5̈y@BW#UW E9-96>[YZ:S^6F%*ܺ`}̵Ţ E\foݖҜ6Яqc.ȌETz1PKMHT%ӟ||Dz6~/#$.iV:Iͨ bedxq]\Г^h-e重;`"0ԭ#lv)kZ"J+Afy-=dfntvE9s_H * 5I֋RcfnBsg7kyɶqǪ$d^=7sa-Y =b>J:fBHuMb#Iz)XW0ME1]Eʨ>s__d9(+cٯ/g?_OOȯOЏ `/0o 0//Z/PLPԯFU4s"^P 509OȏO//% /ʐ/"n p#ʏY0B0 #r)b@\Bb%l`:*)) åøN(|DHo|<`Q6~4e7B;VΨg181*b=M7t:.-2l!S(G:8(%|RUPlRGfZR4CfL}"]?zԆRiFt#b`8a*XIX1P)C܀)XFR@I#)q}ϢF C"& ƀ$P Ϩ)+1=\¼i# >߼ZPj(i8fꡆ6jMJC&'b}@nCS&+#*x%r٨lu&TKjlXV/KNjlg/m11&4Z+&x>"D0QѠz" "4nGΐ50P0Sy0{00:3 %00:ӯ:S s;}0 0SOc0=#q ;9<p8sB !/ 5OEC8s oA< o76GS3(z3C//wO'[ z"B^\䁄qQt  gwR&bƴ(Bl&.$ R$$#&P#:|VaTQCU:Li]"[ %~љ.\ÛgX)QS(vb'BQZP1/H>D艀7gqNwRt*&1ҊENn~T##q (*ZY6>R@$=H=r2p̒~*@;e}84l"2#H t/6FR~dK&,(<dƫ4S)X"1-1 rNiLg $")tcd`P#3Zn6YOpl(C)2(Zi JVn tUl6tv`mTjl)d_ ^, R`E"n.!Wppwpq3jqq!pq wqr3q+ws1p?r p;WsGWtAs%7t37tUwu)uEWrIs7j7qou't;ww/w=wWvx/yEwGxwuwvWutuwuQwp-"ys-w×zasiwx}˷y7{QB+8/# $nv ׍Bwo׍B"v(~=$!Cpw3Jwwh p7)~~9؁H!xW%w$WpOAp!8e~G Xo~8K؂G 8U8I3K ׍RAUXox UCwwx8EDc8 q؁)XY9XøW -XXX#o'o'# JyMIWYٕ`VYKyW X]Y9u9\ nY ry{Y9ٕcYMYٔy9Y99 zٕ_9yGYyKYyyIYڟ z~] O f#&z$)R%z)Uc#ڔ.z3:q,Z7ڣ 5V):VY)եQ;b~6=)\DuK:mfzڨ:55az "P@ZYCک:SBUWzګ>j?:::wzS%Rگ]AR:Z[隰6vƀo'Y6hVҦ0lȲ㥑D"G$Gf2sfَ#v6mɳ$0LxPTCfRr$0"Ch M=!w%ZdkrUζlŬNT%7;j_O*I3Ӹ;*JS[}㽵{A6j[/ӻ2X; f7;m̛YGVcTB5<CipmY:Ϋ @nK4R7ͻ2U\Ri#!-c *q޵Spc;Ҝ|Z|e] T-DbG14@6OZ.+5 1wxDe=Ne$RRS\xL.Lm' y [z6~6nTcJiխқn\tz R0g`#.ن=ds?rntnچpl+sn=sm-a *0T&փo-8?l]ȼm,cޟjlOKD $*3Ũ*,eŪ.̋ƦFO$EfXH=J2.aI"SN6ɸ)%TMM*b]E^,mP- g[~.:/V&Mx)&s0 ̵ʞJ+W $6Mc/I.H| |' Fl4^nh Э$ľd)eV"@*y!^0KC)^AT<rfV2ɔYQYǭV^.hWVi蝱2cp)nM/\X %w ^L bCP eG/Z=hFo2}E-"ć [^}'-xbh&Ɨ3qXK9rŘ'qShS+!N"lZĬ'lxҪؘDE:ܗ&[\_Vl&ċZNIX#IQtQ(v9(ʗl-VrhixvYoɽIJeцmؔFX+څ*[ڮMqQ0I\Q%֘>JmDs&qӗzɻ9X1b| U T41AuMjHMCDUP!4M]mjUZyUdGsdOAIuNaT6Lr`H_$f]eyR9 {ѨU2WY G My2Q=XrRF]jr-GU%^ىh萊&.)qqlj4JnI%bw>Wע{}TaV| ( ۃ!)z7S%)oVQ|!2wR Ġʄ?eI6U[~H)4(O1vg]BZunqyةd܂),Ո۶u2ZiUQ|•Fbva&a6Zq6/lQeN ZRW&$1" Vqr!*I%IƩyso*y:gUrC(NxJV:9DI1(s+jKTbXmU0>P@MrY;yMq{2_VX6kSQe3z;ULj*!-ܠ"KUtT" ^TNLRĈXT 'ٞQZTc.Xi#,}uE=ޙ6%&uDٲ'<=Jnx!"HND\F`"jO4 %hPtażS}O"luT~geq_酼X) `F4jiCN>L2˅P]cw4S+@͋q`\ lLNBcHUh(!z!r?n^e" ):PcQV{o 4T߾p4`0Ep("{N3#u<(y ԑsǥjf@Ȯ8ifث98Jڂ4Rs#䎑N mJ١xN}]~dk{?VreQ*.yY2Y'J˳t7%*_toFf2dat5xE'uz!4l$;TupcPpP F0]pP$l]CVAtD[;'SF1W$!a\#UA2f4KTU9f4IPTwgL"s90iaXa')UX]sĖ+S$,=V*B;HfFTS/et^7?Z`̗CϵCct+x5?r'SVt rtjx@R3)#3mV|$^рZ  )hr\  4 |WA*>(W;4B(#sdbW6Nd@8)VFCxU5rW"BXP϶/X XTJf.'Y䘆4 c&Y2cIȘ&Р y3 i /x Hc&Y&Uc)CI;yNu1q4fvf EBo#//,C4t">0R$oD[#wb#DWQ)Yck<⡅0Ru2אuRu4+R8D'#:Ú,y#{3H>cDv|ՃEU8a<9xzbdGCb/7gG/PaI ch 0 0  `ii& `i .g/iKfrIfJGSeD#8)BBc5GF,<ȥ냊hթ;Iv|3D|?A 9#g7&9+xB9>z26UUtS{Dk N#Xěk.#mI<7ϓ8wT?5g4Hik\0ĺ R)Xw ^ɰЕRfr>ra\brmEoZ}HF` :j'*iݖBJ̖<:TԢ~ tF69oT5}GF]n9f!os6ni4Un1l rllTkekiGqrH|I:[&|"9J5rUAiFI-!6r`>a:&zbYhʸ˞FY c2 %ڸ *J6q nr/?ei%\vS" ʼn2YHCr;d)܇EP皤۾[T0Zj YY  ɸ;n7$+p+T-rAZr#X ( A*V]W5U!JQM/Dܵ1L:VtsC21l'% c~G"C_JQʤrieCW18| 1\~'5;r3ZLN ӫdw9Lk{kț;<ɐkhپsxFB*"҇&F9jzA/u73NzFw};v⢺ !Y&G+,mMuZx"tx<5Ԓ{?"[vH0?PB5ӫQȣce/ LɊkLЈ7@iR'zq98ڽŲFK|8> w34F<]I;`H,jg ?zv\<w]>\'/horw2 %ȼPQ9ay\J=գ grib)=k˔*@ =ɇ,Љ+usyz=d G7ώ) n\QlijWR9( JAF-`%G;B'= +(sm7Z1 0v1z9 X<ݶ;>TOZELGT\XmZA+JxbY2y2NazSV,pd{E&2R}RR}z-m[%WTF+gfE8r$R >j4==Pv@*}6!ѝ4oC 0Vl~&^|ebhrwW V4lx|\h㹦IG0׼,΂f-f\_2 lu}ps߹2 KGu۸ʇAY$#@9OgM)QYotL]Q$LQOEKGZ2Dm?xRGs1Bk)ilFFWu"B֨H~8.y&G:Ni0 o0 ipn>^^ro~Xlc:=x%gtWv!US-V.ay3~%Yq@ܤLD!bD^hDWdr[i²N9geM.#ųz]+nsé63-NB dne>)|*8@GHP<7l|1 81@S2H`8g#,wHT6ܚh3Ӧ+\N8.% C77"uo2Jk v׵1S;fx=)YBb~SZ}ۧo>e ҋbh-wQĊؑ}G 'fA>"lRMFgM#9RjÅ(6w1!BBѪGȑ#΂,CNlA rhs—#b8ү^b;fV츱a݃vLikİ7dPΕMmʝ\٩\.W ۵ֺKt1͎ :)X lpų7g'l[s;.%ڱPuz 9KLp3+*$ 돦>˭RDF12r M4I8JԪ?$0+|M3Oj mJQ1D(fy>kn7N{KRU8So*\ANů*X583@sXr\-ӥflSg-Ue@4w2=!S==pdM>oNKӀ3jRg)2*6s-][H,B=(e+0vɷhTF݈03Ӹx0IoRʟ819"='J@2ʰיfmCMfI[!JpT5+^S@/Y5lYLF;r`g$/وfiY^mYA&6e"Ycha2RF JA%#.fbd=0Tǀ'm#KNSŚCdPʽVQ5M(V[KMtk+!J& 9a6MOO^t =2]#P{!lA])S=b@pЊYPwj$zNSg Lu"8(ŊAC 1A cŀ c0<<{i1G,1cpqcX >@qYa3NY|bx#c%t\d8-&1e e #Ungl۸epk\B61cxf3\f?99lWgЍt?r d(qi\#ƨ76Y!βq-hCѻf1]b;gvNljk90nr}=4XΜ2bTCyN?f88ѽn;> dH7t`> }t1w , ?  7$GD(F#" !7ZS>%Y^r_S2 b(C F&2adCL '3zg=W9{Ћ^߼= ѡQ br8e7bF"4?BQ}d-/?dӏ}ezCd߿C?+@s>T@?c@d?ÿs(@ĿA<DA|A,A AtB?z>ӄPЄ*|4Bg`( /,7 ! .4î9C31645B6ā07\î>Csc+?1,P>"?E?!)J>>FCTMhİyJ>&lDDkRSBDK ?&@YEd]4B[^dB'&D!F#$!A<; KFSdalDAFe gqhG8hD>uAFhlFdoAzD>md"b$FR D\ʢBP*BoÁH? ð # !7rrbÒ dȌIȍDɄC@SEԄ?J H@lPEk>X?LU I_\TEJJFʯLEM,D^JClog}JL;jhdf-2.9/docs/hdfview/UsersGuide/images/new_attribute.gif0000755000175000017500000007037412050301073024441 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,e Ӿ}Ѣ-KP!Ç#6Ċ/j1cǍ Irɒ(O.R!˕BR&͛2ssϞv*94fQHa\2ӦP2mrժJR:r_zڅ nvgӢ]-[f%Fo }aPih oY#^1ǎ#C–3tK3C>e`br_ zÆ ]ݷ_e3 =7X&hE#9J%PNن$) CVhW&{(*Dj!5gv6iPZO4fT(X CV lm&9iSpLO M)PzUUz3x݋&=߹&fѸ_c֜juV\aEHW f—9a"aVآ!>ab>Тaj)6iz8nEeMW~fx2jm$(?"2k(n:%W/a5eUBPQ`z']HU]0Jzʜbz3q9f|)o #81I;䋃$Wa)JhJפfjq?qB \*2Ul^> L%UzPڔB:d;*+QK,p6dF5A}V"L&c+6+HMڔֵ6S/WV/p;8Ͽu}}w`&z݈'~@q$"#)LIDHCCюT,  `#ƦֱZ q9C iA+5MS4-1Ie~/UAzl*9%f~Kè`"jծzhczGuZ0T?"p!tP`w-ʰ])Ar-P D}$c>P~ QѠK!By#\ b-5Q9Kf,x-Ӣ27TrqRcu)ayT왍\yHM*"jE¼[}W6փШ4 Wx ZF:4q aIoBB*S TI mg!Y. d_/YBl cI.YOtLX K-m)C*+TuTJZlb☼.[p=R=vM3WۨAPZ(-̻z8D Hu19 4€>p}j^c4}aE @%0iG4diXt=ً`0iF's2²8;KhWh;PЇV-/ceVC)J>\ښW<<4v.΋3g<x2Ⱥ(bjխ%$Ixo82|@zpr?lB,XdPa°Q 8) K 1cKltJB75d߄*l w gaqܡ4R4?M(966lrh~[s 1TY70ob8Zb&̓]1o0Ş'OZ\/apnת-(>'f}U0-!nX/ځOj, @AJCMkO"FH?Yzpv@5&;"Ly*e̝6FGzɝv!99vr@\٧0K8ax"Y%5=cF1# >0ZWy7z0z` P !` * )XyVqC v#Z0C@p PX0ui f)} WYE&b](tFPb]tt1aXecDD+U63AAv.~;5SG!w?4ñ4Hl?a[ \gW>#rdA$!;Ix)fPf=-T%wZ*+0 VrVJ\G 1>A`DC +:v첺+&28F&Eԗ{L!"M.ǶX5 +Rx|TLȖTk723tG@Ґw$Gf=wgK<<6J4&Z3(sRf6h - F5Z18H8Z@*Z TOzPA`ָ&) |Y9 2)Y@ YYY9Iz29K3ԩR9Z5:h -@鱝(ELd)H9ݔ rws>^HsNHwdoՔo~oZduQ怡Fuy㗎O3.p&6~g.Y.H^pSFp8 1䯎~ s!<tRr[r^{egF=쀾LƎm>_)MH2{nHs>^Tz4(&_LH>2E|YNHUd>荎8-(rdݮ@d&gXߌ /,2lT7.* >NLL~`NHnS@/㞃O(rW^.ZNIEL&/_`N 摮^v`~t_9E?Nog? ?8//sY.\OM(o5?~{݋Q7=~gݾyQ>$_ y>hZ?d^u nTBĮ,~N/o"?BCL߲}ыVo>e͡> ֋Q_4z8N81Ah K2\eȈ&];"J*mzC1Faei Afle47*LΔ9$8Ց` ^$ԕjXOFMXҭXWJTcCE5V"BH!ޖHAJؘUz3|9$N#Ǎ;.һ}I-꣉V0ߎvȴT3 wdlRuQVݣzTo۸iֽ3bkEL1מz V3&;|+ꭥJJ&f=><2Hf;ʻ//2̪6CsJ - #fC(ACkHN8 )Q6lN d)'@,2? *=ɷ697=8̠VzS/҈s L8pmKXҒפjDKK&j65q C먢IC# Jӯ.nR@,vsJHOlw,jϠZ1J$?4Ԋ L+0#VTl(XnB70μ3pQ?cŵ6c=~XvD{'CkQ<0053fӮƗ`>Tox3=VKݣmZ ak}ޏl@g皛U+}@II.V~% s=i,aF$E?*S) Yu;}/h^I0qQ2NdjTh4C gh< ѽba,Vo!&'U-{ڐ}s)| =˰Q& dԊc: E&ً{'5F<泬Uwb DIhgB }EIR gEsR6|^?K#X +- *E/De!تCT Yd (U۹21sט0vQY`tI )&m/$̥4t<ߙ|V.!oDiJ=&D'Bu? .)i g [:ŵ@]|:v<%('c:7/׉0ҭQ+I"%*9Ġ(~ EiPxFO7FC"Y8VפEVWn DAu1|'T9nBfI=!xy]mS6tad̲WMb6Nh2u;*Z牽 )n</<ڨy!u44# [@IfiöuU>mV)ʐg:Ol,&ͣeXD~RFӠYe{q䢽ɞU,&X̃-($( KsuNaBT|[yWϬ,Jwfpoj ÖA/eEʞ$êti[1+ke8EϏ%HE), 8hU7)#(٭' :s2-Sё]Zx[jׇާs@"=hOdm"exDnO/E͸9Ҥf륥+fr<#Z?z-.(}ai@Q~򔳼)Q<,wcr69Os>ѕ>|IWs.U9ћ~i^0/)H"1sа/y <}nB?xG|x7|%?yW^O"yy=v[+XLCe(!ui &~ض}u{Y2&[>ǵFl&}_Og7 k?~^LG},l"Ff*[0! y-FjΪ︉O3Td< h3># !8 d ՙ2&s `sޛe@[.;$3@PȈ ș7̋y`C?A!:<"*Èh 8܇]|I-@}0 t#!q}Jӫt@[$( /ᵡѫC(гACUUսk%VR880"Kʺb+)7iƘ(hUosTegV >y݇TrT#1ң"-IIh3`Ak gyW$C{ʟx"`B˿j Kd!h3o,/zXz8cԌ[m0gi]jIWH#$ĺM9YY٠%ڡ5ZEZMڢ]ڣUڧeZuڨ%L@K < z9x0b8鹔1ӣ!9غj̣X!% BАm3 aX`M,č0˵̭\\ -č\ѵ\݈=U]]um]`]ϥם]ԅە]ܭ]] ]=^-M]]}]{.R[~&9?KL4g7DWXz( % z`6Ie uN߹P!66`z@``Hepຸz``.a ` &vna`6avBK,YTZ=!oʪ%4).+,(t ) (/ 5 rq )8c/Nc6V 3 45c6c7c8^9c= t*;(d>6V7C1BdA?~,.=# #)I/P++kWi,t9%$G[CӺ^::sb9:Sfcf[fg6fbavfd" "&̫j3R 8 G{J_ىVz[HV\P`NM.fhheVnvh`>hhPhih>>iN^hh>in鄮.iV6ii鞶hx q(˜n2nq>1v ɿ07Rٹ@J&H⩤k9.lblĶ8ņ6lanPEDn'OF%*^o DX/(6Jˉp/@>܏I(ƤjI@LDꢑ%T#QnyekT憾hn=uV*n%n.꾏NoYQ\-e٪uJTkdo7rb%[bEZ&IԌٯa.mbX:<`=Q ?3g#q_qoqGOyq8*)eHU{!&Ck%%i]+*Yzzmw3]\i& bQ:4hmْ..ֈmkˊq:N <==g:'ABt>/"2k?|o7X=B{G4 u8/|I੘hrTR[yK53Cv }hшL[\Y&QEY~;}k"d.I0HP}D'8#arGvBvRvo̗jg_Q"HoOeeeAG؛z!ć&[fh.&24 RLAA#h0<.7M٧(}[6A>elƔV8L*UqP16dѩRYSLj#M_ar9<ђ3h]@.uW3{X|YiTt552-ͳC)pʃ\$H`8O qSYgN}&\.e4R'ZSeCO_V(b@8R?fTHڸ$9J"4HU#|)N O)C7ĀXfnPHi2'#}1ґ0b(H(rD9W!Fй$PGO9UsmTj>Mze퓆&UAtS(hh%S>P k)UT1&) }:l.zJdJbQlLAklANTa>.q{XAW%+ 7mv]fL KOH1YK dbui7_*N %S"p#L)M^TRjJTG#}ciNpj2AOˀԀa%/ HTƲ&bqtʺ񦵼R5[}V}[U,o2Xǐ&Vs&AB 4Lb0uioM a4ȐP *glf^FJ$nz6(nC3 "$4R^lrJ[g)يnuhMݝ^)~p}~YO}{]hQ:%!wd`\u*2E5V"YF SM uR&gh،D _5/ZfX2]Iү* \3S(M kKbhE)QU?HI(`^a GҢ^} =0$ 34GKyIԸ¼i>lZ"&P‘MQDbAе"vѧUmIR& ,Lo s菌Lq^Y!)+pifcqXLXL!~ JTa)IjJRzܘ(4!Lqv"SPmc8Òx K!=5(KQcnWbFF2`ICR)QϝZBgzWٰOCj(NZ}gJ"ɎQ# r䦓{,RK,)Z221&SKZ/Xu]>֛!L|o Ʋziut)t!$RUB&YPd,jʶX56}♙=@9>N,O,(yK3ARBu7a6^)Wmj*G*HB P]&!(炢ns2PFu ].u/z+ZAMz٫`}K;-p+KGx &{K~7Uoy![d"8 f` H?fI3ReUYSmq'dTIC&d%'yNnr27@YI$d&sP,0o_.Ѭd09cf3&3c>s6YZ~Ýle&[K2[2^TLUGqQ)i>W)H9~ ("}Ҩ KK]gv Vտ=Gf5ldO[~k:QnHU6EdKt*|8Mҥ!v@2\vv˞ eereWmR Y +6^R1=ZLpzN1TH^G.iF!FN!V!ES DI؋=V[ˀo!Ug`M"_;!! >E$-]Hœ(WQQNUɖS(_-*= fu"U a "**"+6EhnvB=MG#I5HՕE$6g'u# Kjb+F4N#5Vc^u ]C.O-YQaR֐`H_$_4ĈnUK@5#??$K0"X--HD$C >$|pGXWԃ%X(Ȅ'zbP !4?$NM"7](27*W ^C =<XY8f)OLD0tLxأ}> ۵IU2@HDM@E@.܁_tN%]%*KAΑ,O<0 R>DOBpSIR'0 | ${p"B&t)=pA)XsbP4@g<@OpLA0HAhf{FnXLC${,H~L4dM@{ >( zHH ]H,I3g#hQ "C$;<(WL $_ʬPO Ahq[䨆(_z@aGU\N|f>GVXPs2!6D;p)43A>`A&.,_DL vG;@d2LĝN {fz@he]Ý>1E(ʕ^*#^pvF|2d$f$;@ֵ.āCGE(F fi)"CbT^@Å,3F8,*]hOo2OJn+b@6C %BFs`P ;lfE)EQC$hEϔP )\e0+.Dx_e v+fl"mTr-&+FX< k-bfhX́ .(Cn䉔 ) 4p$z*..$l*"+QRRj !ETޤ9P q| ʮ^oVLՈeMf f݉QPol #l_Bi}bjE̕K,e"msa3OF}HFROH >Gz2C00 o` 0 ϰ ˰J(].~9oontGc^hȰQqܨe /# .v(׹͐ax3'P\_Eɤ ۼӼqq 2F! 2F2"/!#+r Kr%7%C2#k#'%G2&2'S({r(o)'$r'g>vTIՊ9 cS XvWtJAeZcF0\UsZFdsWlsu3663yU9s3;3;3:7<5s<8338As;@sA3=CхۉX rq1.pIKU2s4-IJpDN7N> uW45M XSQ?5E5%5Ncu8JXPW[5QoT{%Wܮ2x,NUlɔPS`й:*MqU.r`dgm6fsv}eevhiviK U%pqPaٕV20e}VeZ2۶濽7-@o?* lRW-j4j~ڎѢ "ilF.-o 1P/;7 t]RmwbZ";F\lTFMO@19Kro}}㷆Ol wѢe bޝ46 H|(zxtD\fyUʛ&"~Mqaqh.qn!G G0HTd*ljGMgce^Ǩ?H,ZLqUT<'(OLhAL.`HX*EDX;_T[Hx Bcay;%UǘqS]D g C&8%iT;Ogް JkmE2Hdlʢ LzD/tFW1q/2Ť&F0;T̔RFDX<_<6mysms(u"#%X@P]$C'?!֛\]Po0 >C#5RZihxbN<I.**o}Pk Eh2p@ R!R#<&B14mlAS"-P(/*Bq˯ₑ4 E qEBr? TP& h]j)9 #$?;4Ԓ5.:D OU - AqUW +}rPd B4PG50;R*BBZ Ṳ)PT:.I]mw H.ymGFv$jrD.N0`V2,ǭ+,KTW(4&XdEM>YI8KeWq9umzg}&衑.:QNBN,WbKI2 %Jk)rmx2Nj5Ӻ>*KE.?Sr-,S $:F;2.JNuds?tw׽q'~u哯zw>xg^x&aD =ssN͕1ՊMiӗm<ɟ#eFnQ4h,[2dTPp+0AiEa=<(eL%B! MP+ 5ΐ6 KX05=t!uBH X#;b HEBRb.bZbWɍDQ[I s8M%N-h$U+t۹V/mjڨB/aSst Aõt5ԝa+o,RѡNV9DU((xL:Ie3+gZ’+mKYr0]YLU%/eAIaC4Dk4.ik5ViVgV\AEJPjP(e83Y?3̟#@ O& AЀ:M@ЌVTED)Qz$LRԤ-(%h}P*5MHYv4~9+/[dQIE!inGTH8!h($k RM Or4Z*WUtIֱլ[EkYSU\-\պ5k[֬U2JkazIJ] $RWNu,é]T+·PjWԱn5jSְͩR{sԢEzD\>b%TMXՖ [T=U[`Zm\ڤaY8(vR;U/56խ~SKG'9+BxO83WUBD+k*cH 4pSMS8y@"ez#*}s忼g[~-Med⁍]-el}B փ8hLar琏@* d B>b`>8d%%@bda Afʵg I5 t.$t`: 0vR(P@!n ddf X Nvd. ws|Mhe#N(.!:"mf <^x/T,D+ (K( )(rr#2L5@&:Udo>ڰl6_FZܭ&D4% >4F^*@A+^bI3xDM\KݺMDh0NOlH61`R:516 7)8y[ qʥkot`ND#^j$V`Jk$SP1( !! !7(P$"RG>= Ubl!|p"M&rD(23'^EE| smz -hl0EFEKY¶V@[f V姺, o N,7 t9Pt"h. e"QA Ǵۂ'>ZOvdC=nv@/Ad O'B#Qd)CӔ)'RLOF k&45`3D3,Pi6,N*BrS2T-,)/D4J./ƲxJ)}2!(&jer2BPbĠ/W130Y@"q/cs"!7$MeRU)Q2ȲH%]T΂FD&TEmrFԱqg-j,,6^a'bnbGh{B2sKBRtoPT/.R.8 .tDt8BApr`N(3E= P"V̭LU#b-J̵l.D~t~LUUdg;hdrԲlhHMFZܖf5n Bb D mm` &g6o$R73ltbI #$H B,;7.IVsvEgP7˼v>tXdKD% t6s5EFmfW<ls+$y/9ۂro AzqL`ox$LUjHv߀+ύE-j"ގdAN5QTeZb&\IRc9@#,sFn-堊9:S\*ia;>ۄsNNLƅ=PMJl**/n hk _IFFc u q:ez3J|hZh[&e\U%m'j۴a55ϒ|꬏d2u9D{>cl|UE<6n9U2TxsNuP%-cۺ_d酣]}LenZ\-z2P5qfn;*<_Y)17G^sN1&N]JxQ]\R~.s[9YTkۧ 䢝curJhtw$C(@RH(k7qE(ةe'mIMņf;o6؜陞k,aTn6~X5M(I]GrYj"d6} TDLSёݐI\m4X LVU想 ɸVfEg4m m6ɑFTm{NeWU eK$"GnLqBWW gC@W]ܠk+9z 6Fb.sSX%`^ƚÿ#łw=e=zj?6Ta%`8b_=hmzt`CeJW/=vܷQ>e9\eV"KJ/{I'M?v܈2σoOeB]ZN ̘M*jTR'ʵ/k^ eط]ݒUQDڔ[6nZ$ z߮\IF^GzI2e1g &թ1yJ4іZfž {&˚M%',\R$_ۣp6ny<}-o$ydy~T|p-ϼA7g|t:ͦt)5Imu}' ti7`I5wvY){MzYx\iaLq86g|'\,ie{u2-> 5=[r55]=ui&ӏEg`(@!VK7cc|BUxr$r@ bRQ="n'K ҉BE)6Y%IYhR eou'V!"Ho~6؇\`]W(ҤF B>8`H!䓈UdE!ǁGڎDg煉ePZgfy)~ezicRi>ֲ墘dy˘H% ,WboAnvRlm^ӱU]ֲXt9Sy.ax2d:X,/ê -nǠi 3̓,s3|s7l8Ӽ5M?]I#}44/OKjRt[kty i/9bOڡfؽOy:$Xhlޫa )In_[4I&aKDT\%'ܛv9'sٜ|32 $:S#'ĥޜ渏~y wySЇNo?}Whs٧Ky9 %((nHx&Ƒ)5I$#JI$f1;y@eh4-@D2G *АRj yBp%3\=eC$0`=Cp c5Q?vC8 S ܐbe '"UpcJsŖ-#" H6 \H2O[S7J?LzwL,w5!&iULBYW3ɦBE5z<|Y(_YIᔉK%T;\NTxVs #,};UeMj2rPڪfSr>0vH#Mbʔ|nB,>Z*ь<4s{W t@2E KGߝz(Br-yyfECFVT$M= PвxRBCPVuUQ,ɘ yUƀۓVgh.b)I"?fF{YB+Yi2'_2P>$ҊA'A#З5qX  BG轅Bo{aW<.xKH ѼS,?):&\6BZlhT&M_^U]j?$'T7h3$gYڥj1Z\`4D'3ZJ"KQYwlJ-]b t;Ѳ3hHZU/Eyĵ|zaS׾#Su!iK [v ~E?axsT+Wj4"Fdd k1_]L2eAx4qոxp=Z 0*\ WQAI+BbClEwmaDE(VO'2*#C.f}D"OXDg\]Eyzlz{_Wy@tr݆PboHؾI2k*mmq[pLTAkNח `|U6$bʙ$qzC'd,9rScZ+.qpbzxXB$EġB `}$#XvS XiE\պ}5Ḥ?Тr2`(Av ]  s2Y]Tb7`/g`!a'N3#9"T&7t"6]uVC+$)&״dB7fMt>!& 9,аqF jJ>[|ܦD.<`"|F(w1t }plWXw0tBWZ}eWh j8wt ACC A#*Tz$f2@-G/3`DR.V "*fU.277񴄃1Ke!j 'q4F0$| nÐeb1BxjD4̧@CP?BT  Ytd~r I\ 嶅 wCICP23⇏10Z}ѐ V}qPAF'#C#Bh&Fe8dER"0r$gaDbW0FrHRMlbZQ&'zg&&x*!l-\ޚy[_++{]xfUrg"vmA@pq,?`#x$7R hV HVnx'bvTnA-2cźKL廖2\q v|LީBu<ǭ ȅs\T&ԈBJM戋$.!T?fHʱ qVh k">Wˠ zszCjsrS .7΋ObceM ]Plm+r5-#MM M M,8o/]ټ(6m-M&8*V>q>dLwedOI`rIx.J25 q>KZgcI"UabNz'w2kq$Cm$ݺz=A, t]̌׍Lm88{]ׅۜLͶ3b0&6dl-7&e*Wˊr&SJ7>W>kVi3\47 0Os4-5Ma#ݦ[C]#47s_2ԍGTύQ6OHMRCNCM &p(W dnb*^&U 3i777h9d1FPȃ<Qz&^Uwo|Ej)~Yy<3NFQ!qu^W$byVhC.<&=5Oe@U3"G; K 86PUjm: h@Vif&i?~^-SF%">Jh"%a(c^-@ֆM+.- {/>%&<(6m(CsGɦ6@.֜vNrVe.ʚ1[ ! P ?]۾%+ԤGOHKr[z)>b--$sk-)8kb2Z0BdYƄ&hO<=j)Rє[Ԩ4:uy3jh4Ik֖bqF ղgaMQڵ3Q\Sˢ.K̲%Ֆ˔ltBj#H4i29zhөUfMүM=:vi]I3(b&> ڵ2סH#YP̍D}rK+G&['X᠊N}o߻vzl_b  4@Ӥ-C5t1GmQnMBلPt G=ıG"w0DB2J͠<#pMpJ){R P,2!qJ+<.Iԓ (PGFQ .$H. C Q;l#RLZ/<4I!ALH3ó0uDKi4@#4J-b`8.14)J[S WP[Ҽ6J꺝$r׌Wi3?eRE6\sS*S0ze=D[r7хu8<4M1`wt6TDaDI;bH)5H9<^ueUEn4˰; n} 1Ф\QRRt CQg"E:(w$TH IS;4QKTWR yR]4Tq^uĸ[]rTPSSudL-ֲr+:=DӸ[yvl4_ĎK.EXgY\92[JZ  >liL~2gb'棗>z盟z쭯~z'|cI~gIC%P{#8r/}D`ȧ@ Z{a`@IyA ;jhdf-2.9/docs/hdfview/UsersGuide/images/menu_option_addfileformat.gif0000755000175000017500000014024012050301073026770 0ustar sylvestresylvestreGIF89a&3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,&EH0Zzm  th@ 8PcGe˔5&eL4dJ`I,&M6qiL~ ͙7YʴӦhyJիXNM3+WYm:ii4eц]ZYj۪WiR@OCKxឈڜ7Ӳ0zE,W;焝vN18$ug͑/SF=P@BDH!B!MC! $ŗm C\1 "h"Li!HH]/.$ N![8R0_c>Woh9|Q*;%/Yf‹9ϙy &ZHE4M5?Ilbc~5$jHB9mnKFau4q# |% ݋ET-z+Y*}Ag9ernۖ9QB :*pG R:I $nD&owu7Ѓ~42Ze Ba 9 8DP9.P*X@0BI6e> YyVb(c$90֞J#U{ُÊz1HZP4n gnbKn !#X]_40A9 P5Cb@fn9+\+`߶Ψ"HYRH/LntgWfNG8T xQE'- Z D-\0$"^OւPD!9Q{* ZATl6ґ4|P^x/9-CH;'(L"% r}NqGabƎPdZڲ0 Bf Jt4ʔEdq(Xգ)>dʅFđ& 2p eZUW@qch/}-hDH,,;EE.ri'/B´ i!JPC ڀ´%m!x}99SJH47Bf[ Ҩe c _ *OD 8001a@RYF Unuyū [(v[8 ZLlWfq3f_W.ޢkjd"FPL06í[ 1:7DpP4hSRLu~N; FE*7% *`t $q [~uI5$zk<"'vVJ$7vyeal>?`J-`z7lh,qc-"S-NQ,4l&xdR"bVzK\vyCzu`3 2VGCK:YRJL&t{ }W7|w|z{xXvXO2q)Qʐf.r -&dr7'% gFˀ\ *HFЀIj0 h)֑ MiR İ vo-+ bBAѤJyVMA8Vw"K"9i_skHG10؆nE,&uy߶B.b#մBZeVJ{H,Flwu@-f 7DD$ 6:cIsD&I4c!Y P` aFpP"9*scf+`fA -hs&s0Ó>~CCF=3 kR:3 H8TSD Bp VaoipI o Nhjyb1!n8CkJI ww &MC*ajqDIX nWfw!ZukʴWW&ȚLvnB)_L8goaEpc a YDD+% C<'% < ȣ<` 7T hѐh| 8serg&sƉqqx6i7 Xvj@Vj up Ƌ@AU/mw/KC-bAaW8MWw 8b!!+b@2a:6y#7Yy[_73A"JWaPښaXzޒONrcsc9cb¹10 pr:tZ@$ SR'2 ARR( 4}*+\zaId1]) yo^1$f ~57,.ڢc8z36d 2(Jvn"1W[լvwlnXk)FjyyD#ɡcj!6kkC4Z ZZ[ZZT*[1@[1#4(a=.%/(ut}qh7;4ח]9^ a^^j?T?QAcrBuAp_Sbzpl@0*N|Ip69_@^@%YK7ŲWOʚWayw%v݂LKzzTʚ'e;C1AѲUkjY4d!1[K{qq1aJ 1( 3!5G'F'(ұcT-5AJ[벁O \Kea2@gK73;+CsQ`ui nmCA!SnO*nFj9b#tm6F2Y9I< r2m#4;n(s\طR2=:x2E3AI($Hқ8FO8!.[-&_v@ Vv#,HaU[AU+9I|7; Q\ЬO[uucC6M:NJ7Oڬ(b`:}*: 8 xcNg#7"Y sEɞ-a{A)> I3Th#Yb!z{9 +kkkK͛ @(rB:b(jqņVI"eZ/¤ae{Wb:k+ikj9w!JN8B*FbN3pu{&, շNz{r"̠٨WV' AY8Za)HB‚lmxmܙ8xLd9=qK:tj5c`LkD Ȅ O7aɷRA™}4ٙ(Q?7AxIcFdDEXs-Xn $Taiop]?@R+il?K9;!VA f[7 BW zi (MyCA!@aCׯl@{̴{DL|!X>!(KQѪ!!=k0v ,]<$ՠɚَmlǦm\M1\[@M?:dI6[pX!ObzݷF&:"}ط'S  ^I eYuN]xh`"/. ]1au$OHmC,WvݽM~Wm1v#HKz*\ A[e v3`ڬhomܚ-w4f3KrT$@ -|ߊd//b0 2PS%@3#)z)4XP),>#>ZI$|n!Ir#o!_4D5CTkIu+#Ij˩-K_R?%):?o0hj?Our} @l VfՅ(^l'1`+p01o`/0ƈ?orɏO_`1ܯ?_+`q  $H `@B+ ,q cI@ӤlٲhCRʒ+K|2>}/WfMYz=D m=GWL@{δԘ8}j}L&XW"ԬVEWFʲN2|YkײslXoݧܷb- 8JjSJta~~hJmKt꠬ 42M6r}?}5 |懋'~|e_jns({.*dj6.q.вicK2^qХjV`3>P/[+IQNzdrc`6CJ?ߔz%0NZ|:.]K&91meO6tL>5u)) ͣ P=Og囐 ;.lZa5IlGgܡ =,G,g-ZUO1Lldirt nPZY\Yf m pFivb1ft6h69}ĵ/=lU<OJ%H(+kܨuTx˪;ɬڗ9u/lbK%.î$Ӯ[̲J2Ѐpo3'6^#㋵XE FKI{&txTϽDUr@Hd=l`+86j۲FDNZzМ흷_vu2;yh*ak(".@F%jcPtRs.Fbi6_]{<ny8RvA.SfQ2h>GX$%# ;o6O豈 h rFLӍ2gzrqZ<xc9YL͡z:y}w=2vɰ'^>f<ێ=¶݌LZ ؘ+|φ5k>MPlHxWg1 o]Gg?N.E2~z+ ?P]c!%2}RtrAlẹi*2MBG@gJ=s'8S"{Ї0@+"YB)<ڇy`=ɿȇ-[ h1;ah)|zdƋ8 2S<J#+g:`yHCga-z=S. xBzLeUL;ŘLɛ̑I>Ly~|TH -ݼI@}HeM1E;S4*zٟYĝ2[+z2˹1I!1ehevI zUA8C >#DJJG+GvMF-`F[B}G;DŽم?e`B+0MIh{;ꁪqF˿`RdۇHDv8<$ RxA4QhPhHGtGh؅I<(Yt}, "]<; PDNH8M Cf|vxF0q8$;Ղ9 8iVӦqiF)f;!6~F4x{[$k%HcIl4%J|P ̽+(#`ٳɰ)q2fI8!Z1J Q໓aX8*^A̴'o [ P(g3^қaA:-`,|.K56O}< N) iLDOBñ83 AriRͦ@;4x]);=iF) 9n=(2ӳa) :O@} :3%K0AweUyX;n\4 Щ*K9&-y5$,@Z["zzӋrf<zʭ>:Sb+!XӴ5ys3r C= F(1PRq9:a0ڸnK.Y)&pL!)>1{b׬sqJU @B3:F꨻cTpn4cS{jJ.d~jXˑ@}ȁI8`,>ژ281π@8ӛ:*5党W@%<#;X] N$ `m48c7J:/K8'"ڤfUG`E;=},Fh KY(f"q%J؁Xnn6ށNeڨʟh:eij)Tun/@uQnq!'Pu_/Bzx*hhIAAd >/=kjZ}Ža*~-`'Svq\ևT(zWKyRQOx/u/rFUuSg{Wm ^ze+ "c/l#X{2ۆ#q0_Ͳ,{h#$mK=J#Z |q['$ 1k0-vht% cFY7Y|\'Pvu['u|WWuTm &<\Y<PXHɟxMz՛ PEa-cQO8 ND,ڼ-?K)zFo9midPɸD6Va4y1c5b"0'H4<q'#2B >^7lKpᾅy.XQ%;("Wm DQW}4:p2AzF,O틱O1Pˢ'f`υ ,p`k֜yJ Pc5^ң/tG]At tt7uvV(NY.ږN Ԏ Ѱ֖W T=pa`h 2tWO03 M!p,)%LĐFCψ{_ Fc_&^i8Pf>XS-p5{b[E2 W[NAS>NMQܨ]]qvThvEg%&Q-DC^_"]MH{~XnyDЛ2Yk($Ff6xّQ'dIy)ޕ7rީ r鰆k+kjߤv](UY,FY$?@S9SODNRNrm~dD4 )fy6tq&ef2Oq|V\Uihy<]xKY2V,LϞ"j34 ' j^ D9u9E%&fɚJMj\_FiQ^*V^vEi3qiQruZ|6ٛܰ (FR4YQEI瞛 v䵉:gvppڝ:0\m%bȥ)"G&#CY cE&BJ}ǹߎSn*|;9dKqh03G4d~L-^^ɛ^^ZDvNd-oT0c&;d~ ~ b ݗ`$iv4Хh:k f8F3A MO3IQA4aeh6>V`Gx㶷.+7~TQ9yA(!=8A PE0A\ V :GEq-LB˚><`Im.@&B)ƠF|_P0~`1|2)CE32KGY"Dvh#AO$ !‡{Vi N>T"ÐIb2A"`Or9CZ`ɦ@+xJ̑*V8Tj֔oUz1EMQ|b! pcI T5[ $CӊhM3ZLx}aH..a_N:jzNxE]e#0qم^ 90 Eef'=!;下uŵ$QEdB?x@=ֻdqa6-o v/4Kk̹vX籋+(U^}d]KckDfm B V `7nA 25 , bM5C:LRꚗ沦=;Xv.֕뮸2|s \Q(x/*2 0} )xr.H4ȸ / W-T{FJ\iS~PMiVZDwF#CwMԇkҺڦ2ElXNF\фas8X[IPPAϨq)J#YDUH[ )fcn 21Qҡ0^W I^ Z0 5HMX%RSV̜h3ZG9v=O8@ḯH&Fb xf쎅O"te&WSJ7-5XM( Ǐ|/54)6F E>:xku?pW+?jXȆ2P"&ֱZ{")r@TF[ =j&5X/RQṲeF|iUg9J\djl,fWV$PXْz @@vMmd5Q,Q_]@Q])K !1_ԽеS_Шy=(WP Z,؜qtk S\`}ʭXTdJ]9JuOSaڸ]e1M| ^$F*UՊb\U3 ^| NS- %R{0ѡȣ )ΡF&J^D z jd5Z`(bX ԉ{LcՖ9!.O0MWA&֘L^7`#Ӎ9eARG1U:^M_D#2^9jbd$G.~dGE]T;U<dddLA$MڤO\ ݰd 5+RCzDW#&֔AG%#dVʂ!b>reM!Y0"`\ad J^q$P|THfd^qBhjJpfKR8j~l:8\`QVX|4ʝ*Ҁ ]ሑN[ NY^2Pdc!GXU{$: 'Jz_V %^-ܥYϸz ]a&%Q WeQXf4jRfRFfg>(X)^hdhdVkhliVW\.y R$zA| h3AgrE)O^da\c$M.!]e] Xo <45'TyNA-Os~b јQw@d:hhRif戆*dik*ýECk@Rf2jBhBhk6`9ӹNÌY(Wc#1I7:"0jyeVq0M|qߩg"|GD )KQx"fQeD+mug'Iё^͠rꈚF&20 W52++8!gNXUeM[һ˩Mt%HMS݌,rr)0lonAefr SB!- *nU ޢ|eX]4@lXކaMd&"+~m)|' 2zj(|,)_Yca!{]|fE))ӈ)-P * 0jОt^\"k՗:: .lqYƑ,EdRT(P@J/h'\iPNz:SІ>|O( [jDB@DdUAޑ;]])}l|lU`KĀ }, l هΕQc5TS-|>=k\qvO)WMhq#1'7!dBd@xq&L=W0gJOxŰ[nzV’zv}RJ$KqKZٓ~B]Їݎ TIVM%fE]ʒWZn]EnF}|n o6ݭILӝJ3GtE^:NB=N\YAf̃`WrEֶH F0^\KL Âh 2Hq2Y 3~,LE,?3s&@N=p4$s](?oIψ:sJC܀ <9SDKJ1mtJ;o3TAAsNLˀ),$tMEIs2Yq]{ qzCf!P#pNǗ2Ah@ ^'Up!jU4`VlRH1I$S0"I>EoUV(F!dX"lE,Wj̻ y6$KPuXEYG6ɻEPE=mAtsg7wHNfLhS]vn#xatP$g,B,#$YD2P4Bc\k7`E6,rFc#v@p(*uӎr̡+!lbܵ~_-+-73&>h̎KXs2BK9OwLpE00T95 0̃JxϔF̀W&݈N}CN3 mxEKiy4##1Vi^eޒ exn~-֠'x bosv#='8LN •q>  nNwHq-1Vl&Wԅ_H8 ]L`0V];BHTG0D{ſ{]Y,AT;YLW\r7Ā</xObjIxxi{hnA(XD$,Xr.R &V[3#dhu.@Cc7v;R +<"5QNa.?Ys oTh2HHB=iHYO넣h$ c)KIwG:#I>.O/e+oYyY֬; ho3^!C0ͷ5Zukۣ8pׇ fk96#V ^4 a=v2n O~-1dGRwdHErH&C3N! ;O)P3(0$ )baÞL#C}/yEZ #}:pQ,D :)z0H Ezl [D2>g ! )#'ÔO*c@Ka$h *xY5}lk DB,nI5ۇ 41 mts#h8σ60.Y$;vMЁ2UsX*kճ̜̳VGg̳, 6Mh<;4tRU h;@{MWVWX@_[N74tM73vܽ U[,+5נwTwŵ`"}ߋx5 z2T-omWJgU0h4t-2M <1c`2UL=C!nh8 q<]#T[YnؠbzT A_tfegzDS/%V4{+;McZͿ 4B:riӾ66DS[)Cu2'ŏM9QEb/O?CXe&as ~+Cf7ٜh7reܶY=az?jn8 o˩!7 Kooou՜ܒԛ#I,G n\\.#_M D9Ƀ%h Ա ]-c`wuUVzp@Nxia]';Nӣ֮7Ζ;G)(<,e,9(uw\.gǝ9<`DNBP\w6d$ѨFų'uk=W egcVQK-CnZݤdׄZN%@ibQaZoz a>;W:r^SۯLNhL l#(<7^;"w,BgyΣ)غU9>,uYNp{ (nw PYl`Ӥ>ґ0p1Ѩ2 ehBIhAp1>mnS׉,HO}%Ĩd=ɗMu$ԕtfs.Co <\I=׍ӫT(d]?ձ. hR\F&β6l!Y5zrDG@ub>SFFvj P(cG`['jjA.=PK͜x=J9XyqG72]% ;^zƑQeW[uՅģ#=Y (Q9m/q>QiJ5vwA)5-M5qLgQ*'n0*q2 *w p,<1*>Q1{B_B'm/#]vA8T8zo>p-W6o,`CVNW2}%Zk*, G%9V1l}UZOj$IW G\7\ r.]ڏqIK)zg %5,#FJIvRc{aZϱ??vF%VιUV b/Ol]kuꊙPט|\F޻Q%+v)b4F o PfJLi(fbfm p6A RΝ+#iD*W6Idʨ*0hNrHnrE "!@!$F#%&O@CO4*C @vBdx@"!lC d#N"@LZBCoA" 2aA>"<~?X2!"aAF1$K$aA`bh1?C#1^ b1F4?E B!?ݜ[# Z0aA'VZ蒉@$jÖ-`G<歀.W mI, K! E4Ȱ'6`*4xqҮͰlIօ*f 5*Lb~2ad "(d'1.,")U<U) }!(>A21vA0+c>td1poIr%rt/$څ)Ax4)d !A !1#//b&d//"EKXJ4 M/"spfZͬkPP%gL渊W NuA1X`'s~qA`&, -%b /r@C%`- ,PFcC1"EbP)O?#)x! A?`Z&w*d2d0B!B6$uS'4"a C? "+sBsZ BdDs>btBC>1^ZcCL]$Nkt`[H5mmZma,ot lF7IJ*bZm ]$"aƤe;HW;#H& $G>)D(E:14B0&&m?B!)O7HNzT.E4:3؁(DN#=U$r n#+xP+W;Q!0KB> BWTAQSgRl0R@D5w}ƌR[%ʢ/\iz͹ʈ EXRPG(tY$q>E3#+G6D4^7Q$b$&eF4RM,ȅ1.61G3K,:$(LbZ2"3nF,B#$0BBqC44B@o r[U3!Ђf !,1s4tbgL81dW&*@?+Hx ,e m@d"h͞TTJTO]LlmJJ]*[MDb)-ZPP(!D>6c~@L=1%b a,D@wA "fEDTxA&pt]/MKtD>*")R&T"+30o>HbZtruy/N2N>Ap4/'Z-7F&Br-tDNԱU$BEmeO*hĠo0 n]I/! nדFo$Sv!H$S/+G tKj^ Bpb,5@T,qcb*b``"I2OzASubdNR,ADlf%AATqZ3'v#Ímx5@Yb#`;GJ/`(%޺nI heP*n)ED(Ԇa\nЌi750nZ8ҼE[3Hʮ0P\?HJ H^LgCd+h&3xLEy [x#BB+TU^(„,b4% 'T$%[zj3jk!mU Mr6 lhEhxplK*j;svo,;sڡ4f ; Μ+r-ٮ4JNK+_fiQg4$J%AZ,̌t |f<(0p[j+↲W4hQ8d &C[-leJaSad,Hp9KhO%H='cly/r&z% K/nOĕ̌*3Ƭ$l+8P MÖ XH'Fe0})4] K6>K$,q0_pch Φln-l[bC5'X_l08~(隃ls(4uFo) n않K/օ3lv"Z96{$T0o+ol੬a6`h3w*Sˮې*IbM&J, QeJ,Ʉ8-|pN vm>fL XN! wJk In&_:'`3 z j F'+ Ͷ|g6\]꽆fӉ01d۔n23ͽJu L˲É̻bihl Z5@dm@_^F9۾ɧʞ,lIne˞.JIW2zۊF\k:w`INnh́ԃ;6E4]X&JF 3%5'(,lȩڵ&YR<<ќWԑY0ÓQ&,xFzlkr›}ܳDf*M[?rp~s2 0Kx=VވIel ̵4xv7Oƾܯbxc~(LQ7~(5xʍ,0aJ,$l$h,=uy Ԝ+#S1ZF[R,'jM/2M@Ib<>TFUO.Kډ6PSfׅn%W gm5i]D[e҈Å)-e#(0h1VRy)X $3NAҷK ݨqpKJf#E [V2V=6eND5rjI%SlqYV:RVTeON(9JJujT_L7))!nŤVՊ᠌&l2R(ʜdu%{gsHуy)C4,c:PTpBn40 ɬu\jT^ZD5=)c PѹaOoy0bs<,L1 ge2M|JTaV&RYRw$bR2v1[a1pƎY+{J3'S3c=2_&C6a =P7gL0̓X "c=UR%}*Bt&Ҡ,Y@C&S7I%5ӳDqT!B_iGsa48~ݽ%㶕nCMHj5:O4Й Ie,AtЍrL#F&(K\IBq)Kqn Ab- "09 D\(3 ~)>3wɾZbm>eP@-I_a%L2eQC?=h{\PL2-H;E ^Ix*pPRԑXɪ$HDA%›5EQ+5E"z{Ӣ(%S` Z A!դ3a1 /&G,8cV2᭥ 9&]Ew>ak9#z&"|htk8RFׄ5:>+' ֛2Qh2PkK2ˬIB R(e5d!\X+?P!j o٢ &Dvd(sKQ6qrtH%X]ͮađ=J$My͉E QhgY<Dc>xfrFW463MkrGtb $NL1g UV@TE.ӝd4FYSEemsR%4Y*Ez>ϡ C5)D3iLfM%QQUrՊWrK<$5ZEuņg:JqETrDtR]]ck-˨GA3j,kM$Z _net3P P%R9D]~q`nInu>Z(P`x,u y+]]GA֍זRH}fXTfӪyJٯRXi(IE(.hXro16 QZ!ISq ZۊT'4MSe)lF2(GkKo$C+F` pT%5 kcr|KFT;w4Ʉnn'><:5MqM.QMu2:+̟<H7{]M0ˏA*_tḇD |+p IG|ZV5,+9ιAEnhy劍yDGG{%uu Xs³;^Mlp7؇3_ZH AQ ۉg'Zٍt!+?xjE p`Qo g)9(︙Hs"Qvx<-2qPiH ) X ;œh R{nRy7{ʼBe%YrȞdjD'-R޲zu}t煋d!!!.wJ9/A"r(^w)!؀71$YulxOsCzRHcȘDUʔy~ʅya`{2fmqNA>BG8w~"2bcciO7mȟhx t6Imyh9˲~{%c㹗{ʉ9R:%6O(:Eb5Dܹb; cY7{rRӡIX) 7cRDc9۹z*:{Hx)LxzlH t쑲3l7x|xt8XTl}"s74,.g,mxۇYX-eg+ O|HԦ0Z%DfJ)|dZ{:rE%fzZti"0##:*ct6`c*6GډtɟHz8,9y79{ⷦ9EղԸɈ癇)Ay"qkc[{Xݸ}iEo9yZ'Z`,G嶮h- 9~G |b8%_˓Opc*~+2(j(IZP JcySzu_X͇2-] ZׂD,V5DXr4)8æj8AzLvTWɫڛKdQXa~l~׿r;i,[Y8^X*v1XgBF+~%8uxq)ņ6I{-lTEf{Զ`|LBY7ܸx :z,۷yx,ҋxl$ 'EyȄL*D}-I}'bEP8UV(ac'cCx\;BJl; ~$ #T/n* ikC ᣖ|ġ@ -{D΍mMˣ*-BbҸ{mk w`}->l9c;&OۧK>,1nbWccOclnJiI Mv}好xh;]Y~#(Y=iZ-J VcW8_/g$W\jTe,Az(̖,[lzǤ{E  `+Tx:}7{4E7nXk\7)g){~Mc׶p-mxa2 8 cBAl"y>[J~R9Շ|b KͶόق{O=y]T󮋄.~4EO}N9gmbxQEɡ'`L<bkmփ爃r~x_T!b|;TNI ܞ-W/h*9IʣGɐ!J&cE IN$S`HU7jGT"aUB;[d]{aLz-kPčTM l&Yq,TY2P˖quG)U9K;vZҐu %[4ZAYw^LW }綥8%F&dmqq3]8 :bK̺PSbmiEGz۱_ |HN2غ:hK\͸^kH"h*DllBY&1é+x$s( CK'PƈBr| ?<0摡#=?4ь)b0N4+/X(Zpo7lH]얬 T*'Lo*s*{ˮΔtFۋ[rj@%4N+A6Y&e[[UV U؈{t-Y%L,ɎBK8' *DO%U?\KWgݺP&}3ϫjlpl5㾢[46 es8Jr5e:B*._4I%[JԌ3")W@Ĩ!MR,#7$پ:dx1}h0d8%0}Az],'YeF$afI L vdBWcpjrS qS8wnX N5өk\JeA)}n&BsxjRP*e L9`gHAfOM a,5 fo+Qf#И#aAYƅp)豈D QD«>t!E*"W7 ό=MG-SDCQhAN3BQd3ceOUm_绔Fm$kY ->>fTsYI;3Ŋt@*5t#ˊ ,[jL-jF m8gP q8 +Bj.N8IkOR!˷b'bL<қM &cě m[;%jqMGׂŒ(lʹrP}1s<1)E%Bh#-#aRжTc4撏-0SUM$B",s8"YLy,M!sO?';B!)9? i}p:{y@ٵ!p-vޔe‹B5ŷgt" d8'4i|4w{8; >*&.Z` x&!)~l)sRJ۫ٔFTnz̃,D&:"&&ArE\YIoZfTjiѴVJ gcs'B]qU;jAEߝ̬N5aֲ~j1&6FQGX0⚝YM3`bTYDUK@vGv* :N ۫Zuk^dbނ&*ΚnnVe }x@4x,Iog=›N.|5mAȚdKo6)Er =+}=XcGR5W1vHb^Ar fdCcݛ""e"s&BO.26bDjt1*vX(;C6쮢g"jͣl- XtDx}]%~]B[keсR^{bngbzV۱7e蟩?Mҩ,ç%X ]N2d ,H(52nY MKھJbQL eO^\9 =`+-|" ~da[FBs,A-v]P3f(cx;i ɳY! e!0!^:F>ziI3P"CO)\˝Aˁ\Qzb©Љ4X !)A( -4))z+RLj1:~8:0ʊp1b LP~5ʋ4{!Sб)~Z N i {Ya+s (N1$#ԩ=2a<nC; U3R#5hC@1*6CY!Q02p- W)D+j3;jÉC p,1hBSDr5@-3ͻ3k:J'7{JE˷P!4Bk49)r鯸Q Dk$x[Tʈ%a!ɻӁ ؼ¬HI4Q=[LŜ;*B <_yGZ?K 0sLb *~{,D"k!;щ3~ #x䗸K43GT+7c5h +a 5W(v(t7Ɲ˜#\GC*1Qcżj$`Jx&T ,#A%АÛ;[TXjAR)O"9Z'MH;bYW9knq{$bDK*!,TB[:b Z3ڹ|ĥbU *L sÜF iE1(@늛?\ώA;]AĊ-h$)L MbYT3M3c=#ZI񏍊@ZȔ- c Ĵ@R9Gd&u JTɐ8t GJ KsDz&z4{F{ŭK#A +8d! o d"b58k?MQKObt,z*ג%.=-:0LѬY7rATQs)7P i +\ +.eQ&Y\k^."l-^`5S&Ձ lM`80enu_hUyeH.VSX15P -89ш]7Ȫ؄5蝏&(+^y"sPȪngP]^$㢡a. [U".ʒZr_/~ 5_ɉU71 7#-,җY.!kq0֋?I*4҇z4r6'LSѢ <4^PcP:M;SQn,l& ΀tbߣ]oK'jj" f ܐ`PX d|ߩ'&,5vaXRV *y̫Ta^ea,䶚9.(BчM(M +H >h֖(Eւpi&aaE&*֎·.8`"j,[!ClL(RA٣*Ok2\!;ƕJ:Q DZsZ@Zh;Z`XkrhH6zl]in_k7a[Z˙窵vH#[WUQ+]Xڝ+P>jf ^Ն%`1ۜ_VhoX5hn&Z؟ZmPnZ (l8-Q3K|43&NM#("\-* F [3b.>ک <^_ FȄ_-'UUܭpm."7z.pi-jT&"&/b? סep`db6*iS`SpE+7j"X蛨e\-:P&':`jYfVߍ^"n[+03"śi9 38#%+$Y d3BmU,ȶĄ]5P4 Uz覅U>cή炄oB2k:2H`[&ڵ`m2yoe 6&z`X!+gX'm'Ԋk}a(eρ٢h6}c}eeZUFw`w֦O=j 6 eb'ٞ9VFhwj[Vp퀧HP*k?Z춈T$˴:4 x M/@LIyqd>rE֝&Wh*w[͑n^"`2^Qf"׏f:u%5]8?VfB.ڐn8aUZo-۾b-]_v+\ d`&ӇnR䭚%aX}bUVwqtϦ#57h}T0*޼,F`ӗ*[t/Iڻ: J~&{9Xo}GoAeEu*ah.WPz:V1F :ܧϢe5v0d̄ Z$2”/oL49RσCN$*D͠M<b]VG64֠X"Xp֗~K+ΕJ~PLo,ӤX2Pˢ)L [)P _Z:p#ʚ[E[wkJ=[2͚ȧ EBsiL+:e.TҳLYDC>KPC۳ƾ.K\ƿfUeZS;`1pwVluNC/ygv Ve!]}ն@'\Q~@L&p(2#FHhTco$WdzƐLV"CCٖ iq~DqYP $}qy)s]E3}\)fMq{`dPJXx_pmFE91ɟ(\mu'lg xLZ|DvPR)v2o!Ƣ&92U'zx kmbyDYHAKUrv+ѣB{O.m7YkbnEdU[5hd 5ح˶V*nk|`RF\Ih[/OPuġ̈́2,梋2GhM3fŷ& ؑ2g.MU)zy9mj%lzil"hWDZbp{nК^'h>ϙe5fM"\ [`َDJa]Zfk"3ʨ1oyձ5{xƧs)AYG~Y7ȟ~n~=.iۥfTsȷnxi|7-`ҵw8#͕ݺ eZڇ_jJ"liI;4h N(խv!4I)4dFZh1rZ2?ahm%}GHNoXU*QL " s BUiY$R+hWjTuы+gXFQ5 k5`皥[Zכ b)_zT/F2Cyc^ $) )5tb;>Db*M듲Hdp ]z," .P 7@  9F2Dvay$),#֕A7VZ /y`hF\E@ uуSY @#.rh aGxa]Vqcpa,nn5I]S,9s:8koL΂Y@j";cGӒ/ONغVع`̔F_I (bRdiPhǼ(h4.9>xYF@$  y^8d.[ ;q xH7fgzمp;,5*=sa4.EbA3V(2iA{O.J\JRg=;i \fG;2J Eqbp d 9=~χh}^Xn).at B XvZ&r[gaÖ0wqxٻdlĎ8<!x=2\ۖX[Ń1E|` , )wACp8 n]yМ2@C9VC9rAA;)Nax< 2xQw| .R\3H:rfgS^-_LXqUKI]%dQZJ[fC) qbgG6NjNk#XD߲  Rѵ0>(ozh E@&ɬCd3hJp'"6s9>e+B08G2f`MeVa!ȽmGy_DTثϟgZq2lE0>֭Ń_4Ԃel 1$OGeJ|ӟHygEG 䇖p^=NJPpB@ f^ O@!DpBȘ!0`m)yp`a G;P}!Du!mkBăAÃM!3 `=L!(Im!nġ=Th %%>=lĔD^%ޚ2 C"XkĝL⸉hUAE D-F5FO˾ JӈOjab#hBʩPp <Jlbtr` Ve&*!#\2Dy FD9z;NVpWy 80$#(^xq\dɚ124EBʎ2$T$s$X9JJŖ%&p͎d LiɼH(ԃԍ K-P|_yULHMT8v)9Dufy$:aLW\ZE$)ƃi%.;,vD%eLEeffVa@!^!J)q-B(V4lO c&\ % Ń&L_&!]E%gJ̟VxH)ŕa0ŕ G(C1"6Ϲ ׀Gi_}PaML_ML!xH$tI^;'vIJ z{YtvY[2&Aƀ灟i^'F >^=|E(|y}FdnuL,D>(=v]8)Ɵ>pUHT;lpUV7O5̸US.#IiG )۹.pTH<,؈j opYAQ|HH` ?mSf UΉ&%+itVV䈔QL̉U8y CV w loXLLdT&/YLSLciWFCMfoMe #e%5bM]-rǝLlR_Qo՞(00CѾhVZqOީnmQ,@pa`d F00)i쫘jʉ& Q'‚LS !|(l$՘a8쐋VGP àtP )^ug0b2<jP\  x}:?Y/[1k bL6 NX2R#- y*"oTQM]lO(SAc/!Zy FNFRYP #J'iZ=XkHZLKicFlVʀB MRvqݏ:)e]Fe5܍̀GLi ZM{~QD.BmwS!R|P2ƠdH]0RU0}lg^T İ2y6 +:_օ|GHevut5:JY2T>J?nZI hyjSgN{ּo`IS2S(rvUɺh:Ő|+ ӢHюNyjEigo eC`TTYy +iT/& ꈿ޺ocfl7TR>f-,I hEs? lۖWՑ 6"l*h6;_Xu*W{Q`Ź\? lEz[oW?޶`SL>uoxخ7C]HI5.cKMtI?LDVG5 {1Ww8G|BQd<4unԠM43pۈ`mqM8'lHosfи#ϣ_}A'P߲}[^4Rp_ԨCPFF+iH]bE k6R$6?Ѡ@v츯Q8iIS(eꡩQbEc$F& 6,Ѥ@#vĺp^'-k͒kTZ=~$ÑHy_Çmkrr)ߡ ?l BxCܢTXrnoG+hGs{74÷ˋ꜌P9\_ޮ(u}*|Io,{5Pf S7&5n8z,F  ɱ8+Ж#L$Ð6k*J(S:(n&XێdiԒ.RkBJ,lL2V;p0%ܮ!D~-8i&urE$Q#jl75|;OEpÔ1B&3T0mE5D86Dлjî&ʘt>u[9t2}\)*bJv Y0Ks%z4#[>cegygSë(Mj/ t׫fδ%|J6=Hy 0 1arI(_߬C޻G/f1HCq 98]mZآ +(f$$MwܝH2ɽr6Z";jهB٧>z]L5GuECM$cXCҊ>kiW݄ǀ+JM=2ˊB!KQcYgXQ$}#Ihq^vP=>$L<7D6c՛e +wZ2ʶ* &vI!rETq;i3"3!cK1٦_^L̨|6jF\5ˉIԒ32+ѥ;aHHu5K`;=Vq^4 "y<2W(L|ۚ¥dR;ʏvY< ##aFMxrEaQ,hE"KVK*nDҎr㬄qdf)D,$G%"DMkR&75S| ,͂I,TĈyN`k r]~x{W-e;SVR1%o SUUP,Z+K=A"] VڙՆh_y Dk lHBBˋeSeYbw=œyV$o*1tJ5=nCqpUQ򔩌ۻrWM}*.RT" :ibX& ;M \g;}%dCJ=? l/eZ?ynPЙɉ/,㥵Ay9⻂l86S&RiyHw3>V9:i_عRRceϖ D̙^셸X6heFAٰLKY+$n]ns+ֵh`A"^F æ;]K˘qˢs ]ӉpTMRBي.%bV?}o( W;}edyEV2"8Eᚁ XD; hLI9˙t*7{3&f r""&y,qK!ϗAGu'(t v0YQeNet7qbKӖ;wr7=4ނ(#x'i"u̬v"6d{.oDJB2#%%v(!Q]A "0QqƑq1a1űq 1 1! !! V3! @P 4Q̔Lb0v?V' Yf H&'&'Ixr |2722V(hzg~~))2*r**CC* ))*+ɒ*2,r,D+ϒ^+ْ.-)<)@ 6j+iW`F`%%{*$D4eE958>ssS64@@@??T?tAW>HNҀJ2P$<:IR4$6%j.FT0&"cI`ep%G{tGqGiGTGHtHt^4I}IIJtJGnTIt0:+r/l"Z=Nd^9`چQffF4ItKaOP4OmPsPPHQq'RtRP Q/RKBϸl /< b(gjTR2N:Iʪ|ކ@o6Wi&\UX|5X-YYUZXWZY5ߴZ\+O' t|&7gv;&?.nfR{l؊AT[X{[Y`?6\ab6a[%6bc7VcK+kp$0B`A ۦ]W`0T֮0ژOk0tJhhA*iwihߌj-VEVjӴkjkj96>Ba@!܅'_ aPoHvEMIU4jz@#jTIE T)M$3a`&r/Wr3wr%s)r17t7wt;Wt5s3h(24u\Тuv" c7,ЂvaWe,/gt8ҤuRxxiHqz{q6JqP/NǯHg$PmWэurbmb .#.!dv*$y   \r@Z772GcAN)d_sDSLzі]Lޫ6|ETi0z IRr?.gLPf`Ȩ٤[Y'xv!A"@ a,]#!*yc ).}h߳ʹ]O#b4Юy%0<3C$Ht&ge(1:~̩xVGn[V&n{݇طݸSBتD(sxP\8$ ֣OA a c%PjHw~A b!$* y b@.F d˜d鹣Y^ەK_xV$+qVemSbvJILdiSLZD͸&3\E|6^uͭcS*'EbDFD]~^(:~~ڏ`> ~a ` ʼn.GEp ˱le)oe@ocGy^4})^܇R_ɓWFh3OփǏrqFA'P8rsŤL˥!on^egn'#QJף]"rhq*ޜ)Zω⽊1l`DlRǼ*ɗbȗ4/b§u^]Rh`Flˍ?z6s"ߕy$O$vee;'raedJT}>z6ݟ ˏ5ө_U}\}UՒrOygAAt},qFxfXM%uL({ WbEd[(s[u5>*u>I6L8DW M[.NDRN4(>MASd0?@ "m>ju2]Wi e]Rl%-C %c) u2ny(LrQDa-棆meP^znoA \KA#z] 9 SmֲmJ~Z#ydSa~a#)dm}ٺ%4ʺp-IDחvo=#u݁ޖF^i4j%1 2lj(#<[2BOvإoyUM4tuB[SFFX(B{SHӶKώ_IKWkdUGrhdJ4lgIlhDmPOU曋ئ퉡DbEQwE4]:WK}E+U`CêEܥ0,0j`E(ƙL'l]> pv0] Cܙ] |Vx"A鑔PC2RnFQ~2u1n-%[{7Sz_.M ZXP/m$:KԾpT)3 -|Dhu(/Z o.L?_K~$/d2/Zms@Z (# qݖ9k4V4.K5ˆ bHP8m\6 )C "u $ ePC :͇Pe8hxǞq 92vZՍ ϊsrCU7 .QH?-]׹[Ž-ivyZ|KaN_0HIb]/4fJH !o$OX# Y ה,ثvъ}q*+aJኟO|`e1R_hxe2>%pc`O (<)q), \#Wv:`&lIKme./q9LE#tyD`fΦ$0ˡtx3&I-.OHNymH>?iOmWx_ʚAD DYd# 1+J~IXar%\uQ$Le-E_릟ФZW ipasexSֲtَ͠~#lG+TѺHQ&# 5k@Q,8.:Ґ$2"(u\HߡYJB,,"ZK[6)4ا=c9S3wu䌔 .E'`5_< ҹ$)ibtv+mPC{`ҊvJ©߲i4LT;kQ p mQ$@9 Fd^sV&YL7e]j "vgvT>Tmw,/KQPeƄaRz5&:J %|PWy3a_o[>A]ViWC=5+>.W}qyW=g3iW[!DDhzءE~v[i_gRb-Q?夈!!A-9tvGNWK*©rg97lnp6(=e3l/wUOY\Z &WLY+-(F(ŋ{!д:65f8ixiH?[Y::ЕINGԙNy\YMeu{]Z8fJb.B!U;bW(qak,Q=roX-.E{)xu\fVt,j?n `Ug]ACO}8xRϓ%>z҇z;=ʈ9s'' \4Y q(Vrq<'.!-/<,2l E#?Jyق X-Q.&c-2Y+T"tGUqAV4+G8">y ,!cց&#A&'9!D)#!x8Ba6!hUbV#U\E3?}#4Qf5*rYN}65iXv Q`N@ab^" !ْIQIVN%dIxbOFGD#egD9g\4(`Lq3TJcXW5ֆiEi#X 3Y$]pxiTi$MOup$)378BdiA d>dNQ"yQ,V%wde}4xHާד4gNbSaCq#S!R.xY#gwwdhy!/qPx4I62x2_#۲kp(q37quH._-ђRuku}YOpn+Lhy=i[aA.N7`{dQ`,T Ixt^u}ǁY OB:9lB+Նo(Cd]?NR؅b>P@+F]g%J6-xFci5ĸ-ihz" quUs KV_s4?"57(|ujKUe+i'u85&4cfH?[z,zx 6bR@(?ȐxA?yQUe}vmdL2$8HUu՘HP"rW+ʄv-hR™R&$P]f_򆪘.K.W"8rQ|X$eyDGiRu]cڈN~E%zizsW\uzkt!{zQ2+H )BUᨳɠ$VGhU*Jy֕D8UW8CHkTGnjs O] xt*]_ K'J)EE(lig4zyiUR;`us8h" @phJk.'/pQQ5]u#oEeFyGi7"u63fQٹpYo*[LY%2r-> ekܥ6Q (uǤr٫:H8Bb)\):!-[ cJO> 3f (PGAv@ +QFwh&E(bHQN-2R/vzhv%%= "y8w37̥KY uӕM8^G&R "b@6,58p<=?9,4L:lA\7l5HJ ROSXܵ{Y{(BWy۝~p] *l1ogukE+$4Y9b[bdᗲdZqv% "\Aj@FDR8-}ݍLuZ]ިiښ^Hnoܜ{6{$Gm[m~ lwɍod(za+is$:[K,.]E׍6{_l9$ j`\YZS8ދek+z/^[:_wȓ\W1f}ן?(/A͐ Jim>ba1t"MXY<&*HJuOQIɦD(*L-ӆ0ծf,6s.zҩ5{כ0),*bغjPY kWe^mbar͢uuelf ?Q%WB7xIlTm6K2Fh62.5[L-qu[MwDv[ֺwC\c獆y/bM|Qh7Ha E Dq@&wH14t$azE fG)qؿaERZƃ3R_pXWcX h1 =P;әض}V6?]:ڵ -"C'vRY! rjZAlP w2X^΃w}}|=`7yAF=|<97]C߇}.e=)?oϥyW^<3watdB8No_;Әkd\8@!QHۮx,|oO^ Ǽ53S:ܴlPdb 18aq^?uQ $` P$_8| "} G n҇/?ߧ9AlN:^4 b@?ULp!ӑoh'7x 9|[2p xiyFu*ttkr_ v2yMWBx_Dt0tut7t8u6Gzo 7jzviwI2znn {)WΧ\ 0ѐ[07x7kzu*ywYgx^x/x?gCooXstx8~ux}+yoiNhz7 '{GntGx'p §`Gxv(&s%h^;u3uׂQrNj)(zrxlp&EEK`p Oj7wqr hVp|]iȁgHm1s+x}musg_(UWpǸ7vr8V42s_rkpmĀ s a0@qX& 30kXs{U@r F`H}u IuItV79761}؂/(s%h^،hWx8t~W{ ǍǍi{EXhs9W|1|x|y2nhtq \)y9ZYproQy?GivrtIjfowkkmvŃ4(cᅠ0/hu)c`Xtt9tL'cksrJsbs_=uX_Q'9(_=s3'_6ڙ@gA'_ AlqlfjVk{1!ǜ%&zFwg}{>tw~7ppg~W~W~I`9} *W smo䦖Ԧi~s~Rnh N79I_-8ti^Buu3GFztҙ>JC_VGaA)婜rUju`vwj6n&Fovmǩ6SjV%t )guڂepͩ4ל]w6Nj$Ȕy^1Guu(_<'KrvnnzqkƙMi (tʹ5Syɫ;jb'r9I٤(_2a[řr٤IulkoiVqK@ʝA͊E7sktIikVʏo_Bs9uu*_Vg_uxLunjiб۱"۱p0 {&(!?@*#+,۱@@5d*ji.+5˳1+3۳=*k5KJP+@Ak>+;"B Yjphqj{l;tVGyuis v/tu(QsszwZzɩ :i^GzL:=)WjEIGգs-sc @0dp@07cB8ji`9j۲{қI+{R˽'{ҹ[T[Q'[ ʝrپeh_N / Wkfo)mv ⶚&,ntSg霙ɏWOKRi̢n\G֌htlLnl,t|V` ,|g АGf0H鹅۔5Ikp'8`q8 zs "2{q, {1@8@I{qQi͉ܢZkwk~+*xܙ c gcr:ҡ+cI^* eȚǭj 0w= 9p@ @q'Fazw?ܕmMqќqǭƛ,7L"| x  2 vd@`!qv\ث z-{BigGkxJXkw$טk {nQlYcʩ&F@yh1 FkG-Xl+ mב@Dwp Wk8H Qx6͉ؔ(Ġkvm ]t[`r؂hɜk^7iP&rab˶FX{Fx/NðF+qzk;.kꢖ'iUm<'z t; p}t]zZϟ& <sGǝ iܶǍjȍ n㬷: @@ ' kk|j1g띥ۧp)|e|20a:r0H.fS>jؙ({7N z͍j}kE_i^J7װHz7 fM{VlСykgur"􀝞Ν t^a^fJj8lnMñY]{w7 ЬXɫʶ]ůa*~hOك`'cjPGׄ,ǾkϞfjl̦5\ͼXhV.*adzE B vMⲉ\Y#ɢMjl^-))`@Kv2(U 0Ȩ Jz®>0jvD\V;_ĝ[n޽}\pw}̛'$0@̙Ow:T,xhSE}hzɿpEظ&*ń^/>LϽ,*@a+ Р!*$K5( 0=.M C#0+FN5k/沢*2B p4Pc }QH5b`% %ɀ4RI&J qT2-RL)1oL3ȭb-Q"2*5𲚨3.SM7SO1ZEJC(P5 ѳ V.= # u?D/ZB2$Wb@ R 3"2@  Ul(=2 0T*vG};׶ 4UJ+z&UFe H!h=f,.FJկij^w%eeUF[r5eH!֍&WH-C]xA}n\5!H<Тx=SkXN j|^ֵeʺlXX9*y!.,ZF#̅ܠؾ 0UZ蹮*})Ns@{An+HW* $<;D2Ib`9 ׄ6,5 z4hV0\ .`-c*T«vݰvBSdHpYbP@,.l2Ws*hx7zˆmۅNsw2^iw7L|݃W&. Msފ-Ac^ ;%Rx&g"!W\Z7ÉgzQn±"W$*dP \.v:HBA_{sgNt>L9<# wĖ bAFnWI2iN '^(bb[ vf&0y! C;]BBH2> Pc9XJ7ȃ0qE" #?Pe㞣`[Nё>:ֳl"Lrt@WGMBlZNQaԝ fqp5br1d(lv vƭT$l0z;Pīc T6E\vc Jr4P5-{e<04nEәNnwdb6M8^HR[&!u!n&PtfL¦fc%My3T}' jpbAH#BS@џB 򙧅 UoP眣> dId|i4Jիm JC0NWTp,E6`nBunxu_\u䞱)A WàQ*0D"F:@k.^256؉f4E2;ЕHͳF2 ]HQi!Hr jIIJ0Ӿ˨ӹ*E/6J 91, lQʎ>HL3ipR}ܟh6aZ1 Ed2@`%& PmefF9ڥ7CfTˤkZi%i+v?g 7xgYDrV2jzN v*lz/Ph"5Krݠ~AcPr ]!ьAbp=WFZC//2bv@ {ZVo%wkZ-Ut rH/"=D"KcusZcзW-_OÎ_Yyz2L܊, frm;s^uGXqPk<72TfpY-GBU[ђƔ3jҒ! )!@![#ɽ+#z-Z̩7A21c ½7Aj d ?逽`5!BQ1(7dB$;9{(Ѱ٣ȳ ;YPԈ9J&C\3̿C<@>?><2CL)C:,DHJ LM;N\A93^4 iUDT+5PT+AYA!Iv }P2n1Z8`X.!=Q ">HGI(-4(Dݘ.F/n}̍e$}܇Zߘ{@!us(Y! cԲ ֪+:}PU v/hE%KZv ܥhݲ֥uP9SR 8]D$QV #?52;pv#3,1a/ 1ɖDž!bfbM.f*5(=A 9R32Y sK0Au'Q PP؈eЄeg}g~g}.yh6hF4cVL\Tѭp .\!$" A½9JxŖNNSi~~~酞iii^h9>r@ _ByjiTñRiv鞮iVnv# , hb;f@:7#;yhܓIQiSjlniḪ̌ͦlnf_*i9?OPV| L!#L*T$-;E\ikij6nkIC,CB9Cypb|(!j0S!Lf\-$E$7һnpګ^1j3R*]̎e8bv;;q4Em[j-n:Ф*&y`*Kق Zlm2تhѸڸy)+A cmn DۊL(?oN* _/-,a Ze]hKH_DS&Dl, 3SU.zX #c'd%sUuy$6<"ָh ܼZ*/X++L 2MB{C0h&_WDj8w-#fuW)߅q$]Ujycp[wQ2* V"Wv)z)?/JډTbtlyr&ݨi+Eիhتxh#;ʟ_ޡ` ˏJzL|X O$ԪeJ /HjX$Ё׍Lo1ܑd5Β7\Tp񫈥 }M-X Τ ބ٬e LZe${aG%[2Ȥ[%2F;04 'Vq$4,h „ "G>z"Fo_=h^ԸO2!%J8rbhdDX">D}E2}( HRǔY&ȏ!'$*tG LT"P5 ǒ-;v`=j-+bDEB-C(;Vի]uz4$FҊw[TeFXIQVͶVlsgyre͜u3jc8zJoOk3;g<2B;ͤge3b#W6ZT6g)pc$I 2V{UDyxZIW!Xɹ4Wav\F'`Ywqe}=eēMWb}dYbSb"n#Ly_I-dkqكbu6YL>*r~TgP5]PZ%mfJ6؅qޗ_vo`@xHTg"6ucxAצLNAj*z뫲š+Қ믲Qkzl? {la>[m^[lN ,;.u@ʤg.ARNoLlѬ 0\0";jhdf-2.9/docs/hdfview/UsersGuide/images/module_defaults.gif0000755000175000017500000047061712050301073024745 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,-(eTm`e #B("ŋ3bhqG $Ja(TvrYʗ.cSM)mjRNP>Cis覡&%ӧPJ*(QXufU]"Գh.]T[pʍKwݺx+(QU5-ӵkoG><2B*9KΗkIZJ(cnruj.p7Wa ;7]/ݼCp}0bN>hbMY=e+FoŇ7Ozۧ7^ c}vtRIҁ,Z(5Ƞf.mN%b'*5Y]Yg<)#8eag嘕N^yՊ(`eRf1>$:%KTVJyYR^e9]b}UbRp4fp#L6Vg!&SĜD5(Q2QI &(19i;-0KZ*/ #8Lw>b0"Lꮧ#uwvME@$>52" -]+"[,-Dx ۚA8Pk.3`LyVR=hgHE#G =%[/!N˄(1KQxSҤK6xfpR "GV2(T_Hae̙Ѭ5|s9:,M~aU4!"F' Ob4gBU_B&R7&Heb[G(N W@.Z`Gءa'(S֭I]فnF>0zj02+q䚫Zꩼ,,vͮ^cú>{Nmwr͂ O{x CBRKf SMR]L{\6ɎƶMc_"e npD51<2~j0unH)JSR$R}nUhlTDVh<gaDq(>5k հoQ ~(I4A #uɃ$,eP@IAkCUhQu)HGr $ @@plb~{dDD 9&x5T+uyQ$e.?CP131M+=rDaĞv)=X3zڌ'>iӔZ=gKݲBPsRZgxd4ڝ5BU zija!2AEJA0X ZYLMBӝT5S^bG-D-ZNSaE;z`QͪST"uXD; "cHIQ#^ r'<~h-D!!D@ѐ($ K\agJ_Fi|V9^XT{OnS)ͻz8ZVx/uAte.xj'D}t'zJo0a60]t2^YP]̤7=]5R" oH&$,a*28nP, qPE L'i^ŅxSeԨs0@WB" ȠhlBЁLX%"P.vq4Z|W(7+ኧ©avp@! OuT5TWpŴr@ PkR$3-K`SIK(!eY<>I$ ؇00 #ՕsUG>SY6K{!]8iwW|!j_fxkkw2RmS}RqbL|K(|t.C_;}qz2NvkLp]O'S,{AȘ;Q" 4! ` )*m u,E?%2~MLg&ޯ  #^WUWV P^u ?>á 8Ѐe%;@ pHQW0fe -u{  ѠU ɠIAw@Tps#Wv1Y<`v.{vTz6^_' T1ߣ?0V>Liha{gzo B4lt8ZUn^0W|eLx%4Zz'sHzg)Qz'QMgJPYXv(z|ƉgW=]6?!X!Lh5nws?3? d\/"}l j~Qt}RTјS=7IQEFSs~(7T$En&fQ4pXՎ UPc8c+:FX Ў0 @,n.,@uwuu0GuRW@;W €בHKXupz #QѠ x-`gvFfY{zzzhh5^וyƅ!w7 J$LE`FvO&Mu[U^43waOcz^Il{tipȊzΦvGJJgMaf#"c1lQUYmh>`sc}oU} VooE}vܨSGE7hbgb`9XxPՏ`М)0Y10 C0n@r;~ XA@8sXА|E cX% pf' f:`8XXPt?Xg3v aG"r>/N9G`o7jn&c'F[Qpn)aYE/@ Q6lú9<@q4, 1RCCfRJQlJ^Ĕ[XRX. RBЗ{Ȋz۲] ^TB|EN$:/ƁƱ{ǭd`Vk Fyܰ4˗{kQlz) z%klVl?/s6CA2s4c%/VQ0H#JA"H42"y`Yo}NtIњ]3S+v6R-~8*,0Rʰ[U[Z[[\ ,Sqd,~2ߑ;!Yfa;RQq2ZwhQ2 "g. qȮeZW%VǕ׿ ;ay5ue?+hyj*hⵤXM\vYNg,Cl*Ԉ=(%"c7!}R9e2dq",0^6_aTVԧŬ qG{M4~NtY͊n<Q4b͚~;:A.M;oof};ruu1a3ăC-H푂M(.=aQiKR[) ˨1D]lxȋ&RC_4Ȣ"څZ yD_H\%xG leד-Qzg5g}FΛԈ^jK.6dIDQ7"1'`.&!Z{)U&P6մSnոF1?zbixwP}w/ ?/ڻwӭkk<"nڗW nЎNHՎ s!Ԏڈa9.SۨOT9}2 HKM}۞)^z-5E.}/L>L&6=eI) [S $;tN?^(|܄=R7)Bq(!})r6AM ޭB1r=ZJjX(=P:# 6b"`5i 6\U yDd5jVNn<]?&*!$9Dw p>;PxQ?w" = I'L9I0^}s1!~E|!"XH")#OȐz$'Qy P GEok)+1ǒJ,)j8+ ):|zABk؜?.*/XK;1EL22KTHM'VK#XR;FD cM.YɛcXp f}Xckn.u:[R& IRHqG&irDviHPBC>&/vPz>E#rEbVP1y8VT?}L6ȍV\@rY)REKFJhALUe|r&Dij Q9IM mjVA[\A*tJTa¼Ri[~xF=fjxۤ2 Saʨ Tp fzDA/1c˸h]$201]ģ۸ h1j|c4Q#P1H:ʠ#$hG0)d$5.l#A}@C%HHUte3~4 -9Fыb( yɔܣ(dr+]LR2EL\c+MIJbldɸIIsu ')yt D2bNm'@ )r${uMJcptC.4hr6B NH+ڛAFEJєT5FcjҖ42A,RDF#bRŠԤ6J]STRVjRUvժ]*T:VnUWR}`V1imRVnumM*غU.UcتZ!k``5 l`Ve,T:`yle)u,f"V9m[VpY˒6fV֩J +T>ץnv]ZWӽnx+5xwҍAuo^7A _`oc܀毀6X/op~q a ه}$>qI3tγ"~sceh3=38;QIq=J,jzӢFq3=g5>r?]jW_Ƥ~5QUzԦw6BjkRUIUC)ơtxSDZpsQ%"}KyC #ӡꃌoG}{)|NyohJ⼆9M#\^ƿy~+80^\N9Kqrۛ^9N|#uݽqw\'xIzLOd=R NR܋N$omO\#G:#u#6_߆Pxub{c8cv#ePNtƣ)^nz7/qvk3?Y䃴w>ۼ{%_nS!巓)\ ߴc9z~9wy[] ~ף?o/ЇOg7x={4ujWwO{ǧ?}䟣>|L2K KqJ?#9˸:Z+kpK>? dڛ@Kuq"K$?mDAB@l+@ܿ?7:8QCۿm:h8N;è8Da5YS@SL?DC>|;KZ[;4AmC;FӶ;>D6& [^;SzC:(\% @Wm;F74CR[8@htm49=Hd$DG^$:J<\: DAL<3NC룺7Q?jt/xd$3ShT5!3)B9Gt[ N ;|{F\ >t#AIFYld3IzG%>&A\FFCEEk#ʀ[?\R?IJGvDD@>T IG>S? =TKtB A{@4ʛIǏŵ8Iid~7z >40@_AtȆ:G<8ь>`|FcvK*$GƬ$LS9[sBFSC3NL8>~;COk=Y>$ȭdB/8IQDG$O?J HdtLȣ{D L A0D9EJk9 G\ԩIIT9CC< OB]3;$DJTJ."U\L e̛@V:#r?$5UT^4P[sq;NAe|O<Ś=rU6) T?ͤ MQFDI4xLC LRS\;uW/V4}ɰc8$7z|M>@㿱&[} ¦9~3 ܔ(UK"?1KmJľkiF3B,Yy:tMZM+ 4=eWyNlL WDܾFA`DȴTQՅ{WPGak}L@} $5=Y4%BK5P5XQ-TRˤ`ԩR_צ\[18G%c,[51e>rWe z!9#5??L4L<*]`# FL\d:USr}OA˚J}T~,4G@z3*@\H LB^GKRJ&QOmt̛|BLDمYdL=Eڒe\25T`SI5!:QWY{{G׃$C>wO;f>Aٵ$cS-$`Tμ_ lMnP$hw4GAb`^d482>8 Mk?!|D=\S4Z]"$5B.-mZnbT"ռ=B>JD^A65N؜މ-L^ZJ?>dO,J`bG}KlT.,1.fS\ˤhH?l5hUfýK9}=iS ̕ƮʣWH$dҍ!dMcXk̶Հ#=OozT}R1uV,]1m6x2| hݬI5Jmc\@"HK$dYE68۬*U%Y$XsMÉ-hWtY{BMG}E}RggfN"E:n.lOlh9.L˸9]r\A nSDaUҷ\p-BsLBfBԞh=$ Nkdr>V`jp FDbP>J_)?g7Seͺk^>5>G[؜>A~īlˉ-s/ O>;|ԇR_d}mtqL?yu:VeR'UM5O_u_`tnjnuҒ\eCzK%Ԩ nKS}ǩdдEnS~ޕEch¼Ҽ=rvOD<+m?eе&ucue6s~ẀQɫj^*?qt<ϳM(%͔KeR3$f:La^x Fe(Ł5R&M~R^5a4JSeuVCpna;A1T՜~ 0J|N6z-_9Q0w?Ű_c6-j[e+PnsCf\^c>hY8rFK kȟ_%TC2<j67uW%nӣ _$VQg |Dֻ}b['5s((\N|p=Pe<"U@E|&nхjMym|UTdtPUœmTvlLCeEX`}ՃVO_hI,0!}Q|@/V|ؐDAÏ 2W>. 2G;i.TÍTdp#T bGI\ք:+3Jj\1eؔ"EAI]81Έf4kp$̩ !E9P`)+B-8*cZNԩɃ5rԪ%͌)K *˝!mXȱGwSNM;R} d2*LBg 9eʢx|ǜiO"?ѫ_^hڧ? }~oАih`& ?8>VƃjPH n(!ujI@ʁ6N)"HVjvgTP_(=N{=mkei?N٘UiYNiYUQ[ցUZ'QL$ԚUFbx\Y&TM+aYpQ5(kQZL!z4]M:J)dKe)o^jG TFuGVBOKzRF:lrjӰ-쮶kKFj-z-;.jfDP?&wZuZҞIEGZ~R ǩn~.µYsU4v.B-IY7\#f[YRgrʶIoh+9Soz{#utqZRJfRG$HI6aRYU'OnF#_]4b"'aB!"ѫsiEZH+ۑQcN0)Q2&mqT/sۺ][cI'Y)ϖ1X:yѶ1>utҼ_M{i\5mҙ:XOUOrNTyη naS.IJ,ID5hHxգM-o6n$ex:K"?*r:N7ȐTLwsݔ&0HfK2>tR@ 6#bǕ'0b2d1Ld OR,S%xZ[lT5Cd| ),;O M`آ^& #" b;܎;S,HbCs!u(x*( [IEe`k"(Nl1̯#g%54O}̟>i lX1Дޫ&\\/KX#IHDe4)2dMM3 wM L4(M]Њ*JPMcRZȑN cIS$07TP:7W&hJ?JٴP%-VhӢh$ LQ){1  w&5Ce!@BdÐj8@` ]poQ+J q}pk5nəv #XT4ڮM xIY2 knFtotkIKxMF+SMPbv1t~4Iن_ػignYfkb*XÀc$(OAY3+M1I@5hDF` ET껦^XyxV5B48$m 5&,L' weŲn{+sUFی᪓b;wD-B=t34ڬ[-;$"S$j %tjIZX 3RmDh8U(KpZ;||,SOvEO]yHb:"ь.RY24$߾tю}t'ݝ*QuEIJڏiR߶MpZcgFfc"4uw9EcDShLX&`31|d1`e1Hr d}$C a<\ zt)PeeLx9`x ឥ2C5 a2rpBPec6xnYP<?3)(q8$#eIY\U{^jljAd%hRMEpNY{3x+#Q?,HDdCCl`>Vǡ&DC>XgqʎȢ`(-2RY(,B,ʟ>0Ľ`TM)"Ȝ=ϥzoScr|'x2v`4#8 t:B܁v#S T XNde\IOz}TݹCF ILT=͘EYiZ6H~Zdy ل$^SL*64WP8eϊY 1M~ŗ4V1-$ϊmV4ȃkIcp=fm T2N(Be)Mhġ\>#dmV+j D+E ;F2܁υ]J=)(L2Ai2(,]?PM)lkASaZЉMqQL^a\ GSGF~Ϙ ͜NF\dg NlRV ,aS}'u ψT[67Ad ,I K&$$tefVh^=qJ)&@DxJà4) ="2zt2LVcmCvD-3(h<`\у5:XCD S?ekn0_=йpe`9))0$ga3tABAM`=:SEԬΥYx0Y7 Kꒃ E%!Z4W<_˴UDTI]]KDbz bㄡI/үEUHL5ϒOiաuXLӜe(&ɤi%ĉҌߑ._0Վ1K=DC;HDpC$`˖jrgC-8;<2PDlԁ܍`D>,b)CnV=x2 =AF$5ݛ202ll&E ঞ}i(Y.Ö& \= Ȓ nIS MbG81FJHiU j".fm$A"GrRokf ~a&KX|WW8m-0L~R^-J&% E6_U)IV,RPZxa&"jTfPUK"LR \>\B@ǎa)deiBr, g&cRXS6 C@ɀBVx֜)i"Ā9.=!]uYr~ep % %NRd9Ez O `$r6V%=FJ*MU+o)eNbN&(]夸gYeL6j()^al-X>O+фjFX\ M-$NHB.ǀdPD%%^QdF 2 tnUџ )Dk}X+i3u%یtSd+eYk$2kwy$)Fca o Y(Sņ|ຏa- 2W-F27w!wʍ%0mjLegOdSZ: Voe4PbpdOEiFQR)X#n43DٱlTA=Q-7qd/vD)iB BA ,Ge鏋ݦlsQa-%`[4  S!tSM"pZL4EU@ {b&릪LG(UZZ9I5'_(WN!,) /U~lʼSDU*!ↂ.'MdjpNW7Hx[xctcxl` 45ajKS?mJ-ORs|p609/rz[Ej5J?<ӧ~,-0 KUwW^t.Q _S5F UJy' Z_Mښ|9sT)kLz&UѐYsNzhAq<1Ѡ97QΖCb:3M2[t y7!u1LwdC\Op y"]uuSZgD!v{Ъ^5MJ!UF!&̝ + !v%ԪIk^MeNċ|H\|H ȃ|HxPRoP>@ek戈lG7ȅH'3h>ꧾ1eJ414n-4$A>11??'/?7??gp08d>e?Ѭ~{:k?Ǿl!-?m 4u]@'QہjQ@,[lhBEj`(h@-JY >F;r(Ȃ&QT1,_\0%̕2͝2 Y#͞+{ꌩ(љK 6m3jʣ4%ʣ=~l#'}hꁦ}Qc1 2pXn58gFT81wwnS|cBٚ#HWa +Âe`9Pv*qY\,"S`ʙ}a:dMixŹ)icɘ˜{1]זNk!x.w]'nZwu{4ҚF~ۿ7h6[wu^)]<ͱ,?M_7u[Z+)OMn6&DWzD{VH 8vO PChV.l$I rǰ С$+ߪLz@2.rmD/ TL"vd)b xl~,-AMȺ( .FlŒtLmDkx nKMzjl⊳oj ʫwX@}0Dh@̳«k g0̬a." d a b D8QNa jBa2q NA BfpܰkJ(ǼgLo ̍ǓHLҚ@)lkNLH 1ިT컬 ̞w'η˭vʑ؎,/>x -*֫\ oNڈgTɌӌ.v/h @/#a' @ NJ>ʜE lor 6rv9gBAJQn)2)c Ygyx*; q򒏹 JтDsTny"Ʋ|l֌/n^-A 0 yLpRʆ0J2hy,%UJӐ Ju qpNo,e.6;j|Ԛ+pO,1Ku>k@I=K) o%w&B*{ 4p/%NA Ba h(!ox!Sha?m@PQ4a @"6<)"B,TB)0T2<#C! hޫzP(s8|f.upi| :* ˀ,( (mDM"$ۇ~|tLi?c'rNe..s.oHq֯vBV 'CV J|@v+67GڌwZRNjG{Gge6(jeehB rIK//(~$b H RGvخs!"t咙3(HzPI@wa:'[ڊIPB7.zɠ\Nx R(y$xs 2j> )dۜKłlЭq֔PϒM.6\p tmr jT.{wӬ]8 ܰ_Z'8u/-+4qBC /p /kWfLϼ*Pqϩj$k2 딿$mpڒq77Hp,{$Ҿ ְs}+|z0Zfwzr {٪ƬxH2Ǫdx  0 mE'=;z o*022Ƃ̾&Ks*\]u$(MtJr/ A٨9|ֻojskڽ' -yʿf8G=щꄐϸury}l~p.\/ kL >{_"A6Ɏz'q Ǩ؛@}_wJ$Q!-ƭϊ.97+M,X6z~!Lێ|2\ )felH Ҥ/C,9+w6՘mgǛBة\M }Yj։8$ B 4s!°D],=|6ϖN}σqr/M!:тox[OOs|ՙ ǤUу3 2I 9W#O}Sr ܣ "PZB>eozE } -} nȱ D72<_h .>[_}C_}{=3}>o߼o/='o?_зxk ?^ QZ4'R }4!H -R2h 09 m(Jt=! Dꐈ<\p&&qJb hD'pC4oC$ Q8ĢH(c,C(nabD)H\ccD3qq"sh=1k@Qo"G5Nw!ݸG#bu\bEE<~)[0W0TFLyʅ11h҈` tg2dP"Op*h#iUR*MoԚfLPJКΥ riiά2zSLY>nLzγvI-CTήj8Y;2."rMzD8 2x`lK^(b@ ԤF]]M/%=<]:`30QU)#ibHQJR@Iv/4\`4)1 SX(Vgk[jVB!ߺ!G]n2S|F-6ѓ4!]~-vQm y't %4y’')O>w0>0̅D%^UgQp@75ŨCډMP%=XI.dhC-Q]i#(GB9_m9.`cъסLc-ެ5or0GCu>seb8l8#'[TP"};Ořu9Z{94ۙa*Ej*Oy62#UrΎyfդ5`DP6*1? IȶC^$֢6'e_ۊ$%59 }̦& 4Q'Jg4Vr23F d*VBe,˘X6'EKɨҬLy1Mi /hfMziRʈ?D"цAjܤB MK..=; Q׆$XeS][fÑ2<;|FghStOE[B8F9oO, W`u>k EZx+ f8\1)\2w';K4R/k/X9D\Z ynFjGuxu==E/fWVL1/T&VSzҙְUٳC!M`RJ.hUJP~C0OT [8Gh"𰛆A:{ecp`&]]}/w ~]oQY{&Z5U‘2ilbPF^&{E`*yhsC~hN26t Wqg!0&,J7zex9s^VwTd"r%ExAR4)3 n'p 8:yrWs8 ہXwc $B2C',1U#'p*8hx|v01Xvr%qqe2^yqdlA5bf6+tuwPvh$155^.b/eyWyfPUU(WRRnؖgR8Vb|zgӦXp[/27%!eZh62gȷ)Vh+W _6|c4B$x.!/d@`!,,AtGT8q %(TW$G{Ca,fu }V8["i!&xV}m6)ZN҆_6 :"z xToW7][z3GdV[b3cl-0(\x,W?'ٗre4RE}c1%iUc!!p/wO:RRc_g"Sk7t+:SgobbaV5򘑎(RB2j ']Ȇ~(S8a'[(iY$%&3`W4q:!\,jo.R3jJ\Ɨ!&Ey``eA4P'h)׆* WG)%t20 a:dQBb$AN8r~16+2hZ",)锝:=7+f\inVςnHg%h:.d᪘Dfj[*aQs3'Pe XWX,uw(i(tŐe !oabvY,_wy8'mfjptY$ZNpF%-XqnVK_ƉE+`dUMzsrrtt%\%ڕ\bQX2rr@ʖ2!8d4f]XO҃ ;w)ʒshawU0V&V$69F"j[jscs՞_qYaZwqhUn9s\^u۰{h5q  VNM8#gdHiN'D91jy>wXYU6 .籦ťi}Qehy$6d"Fw(A{yűޥ~һNhR6f)iՑM&"q7#V\SVzurÞ)v \ h_5kcf~SJ`Wmk^}IE\VVyg7htX2Mʪʺ&#P ›p3CY8Nx1NCzYH!1^{`ehvB˜o&cƍQ! N\13¸fk÷)&R/7v sPx|m5kDҴgiefQtZzFqxl:˨;Z\^@O0qPRka8Q\X ۻo%) Cu~Yqόc u*!/;ҧM 1xP卸|F^+s7u.&+.a/CJeq :72>#aQ{N>8K14PmyMш5Gqց'7'O2<ˬ(Jmz;H*eh?EsNx%"W'Tɨ[Tr5EӴD-fV٤ Z+J $f%&~R"qVhYe'hvɆ* &ڲm;oysCU=؞եź pRx&B["67u݂$O|B۱aзTm#9Q /6K^7}1Zh[[ES(-masriƬ~2(Da\9 G# w2#/Y!Yj0` xpt5e uzߩvn,612C{_7eDf^ sq' (˅)3O;b4"mS1n߃,0o^^z-iI5a= q$QG6ٙXXr)*g|{Yny7ѹ2"ӄ5P#x"s3Cb8VO7nKpWwtI }sݘuv1jN(u><"}6Һ-|v5:~klnl1AtG+/Z/M^˙#Ix#jgFMp(zBSYLs&dg0Ƙ{z,V)TC+r?ζ1Px[ɀҢGFYei~b=sj՚il(s 5˘y@Eo}%W 6^z4cnj+jzpI UT0Fe4\2#AP'q|O24 U0& zx"FBp@zb uSV=*؞l :1BT l;sf] 7r-+'ެf>\:QւKۢrA1^W.Îê5kQW~v-XĔ+$ jVūmr_*H\ZP¡EDXXSeBq njMo+oJ͔,ñ+ 6 s. Lr<. .84ZI"}8I 7IRQ M"4 ֳGļS쪓 jzZ .ZJ 5ӄc(;/l =L%5Y_c_7/#ƴͽBL@$bO$jzi?% e:'42 (F>+AE9MPUEf(yd Z-ybYd8{Ebx> 1y0%cEJhiiݔ#?kV,OV0Xz@:93 Uo8)\ B[JE/]blB1IB/6,kғZl eȳP+O*‰UKC;+eE<9~-4+qR;RHeLcIYFQSOkL/?Р.zSZ7,)|c&ʇ_gL('zJXEcp(עUZiښ٢)MgHމTZSJSMR^6eG_šj~$MpCvh$g1@B"U QspHAHV/Nc)B8#8ߜ%J_Y^Ɩ)MC>L&e #Kh -5>L+bG4hY0-`d^bKf$82Ph#>SAz!9@y$A/P]Ԍ,q^C \-pm=c3}#FW98VS= GLbD-4$DL`Ƽ<ҍY1m5BBJ-OL7Q+1rE|Bҁݕ0AѮ+a)KAsrd9˚LZe[*W|x"Ud?cU(nG5"@#DИ2<(3(qO cРg!< E`۰,`s@ET1NqB"bQ6V `08]XL#ٳ.CZc1-qϗmK-4}CYDH ѳMk+7p\#) +5]:b`2 N8|ۅRJ`0'ԣ V:ldȂns':ɤEOo7 j(HSm$ N)m]u:t>J@={&%rÕW'IGiYEzi5!Efb)Jb1$e٣E5؃D,{c F`hL}late,m2"!3.ċ h6LhA1h${YAE+&Լ,/,YDk9X$2vΦm?KVE&7z-(tPL ձi:s>+<ʪcRhqpߚ4R0iC(֨.PqQ. wgхq2(^4OtJ୆CK:rW~z}={<"z@h"1xڔA l@F$HqqOΤcL"VP'S$E~5ҕfFS)ڡvW}ٻg3z yY8A|:4Ad\H"||8Rau/|&(>C}P 8s©Ƅql.l_]uT^z`jU435U]Cj7R_ͩlOMtEmC8oEXʬ꯲L^45l^2Ⱥ`rIraV02&Mk4PFXSم7ЁZ"J `< @[Ѻy+%D:S `a,n2;Z 6 yR/CG7,i! Qј0$Y$a舢@هCcAI*zȟ}-zΚ,RN.b zPȭzF$yXk-][,?"e@e ,sa@5$*2fyBV"1)3>S1Ī)bR8[S"RuCD! BD)dq J![ӽ !ys=qs! CDX>CY8L0Q +)P\ֱ<МQ̘H)2|y9ˑEWJj&E1 K9V13ˉ;MXɑaл,a L}NLxy E@L\ A{PX&  5f&h`y>>p F!t:CZ1: s18 )˜K!S# OI۫ d!*:)ɚCgsZ>ȭϓJ:ADӌJ% qn꽘Y+'hۀ#XB$?P0񤐎C1@ @A"17'/Ѝ KRSsk M`"J-FL 4xKwirP܇P(c0Ořzس>E#!z{AY>4i \>8()!Wث+Yk!4v (`JPo 5c;>K(RmC((+iXWj+:j\󢪤(XSP'X}-Z:#JHg9Z%\6IbBʣhߙ4X݉+X? 1Ń@COl3"8H tO >1:1Q<," Y2ɭxO ( W7\|܋UzF\A05Deϐ\<(C6!umn]NI[ `Wd-!.\B,]kIiֻC"PD:Ȩ1 0AZE/7N?LYމbxh3V-'eW և˝ ӄ]!/\!d)H1Y[SUDڭ6Z=) XrUM弶b U<,vO$Q e\PcQ&!='*䑲/Hf2 }<zMn0ӎ-a8r5Ћ _RǑY< Y)T7b 5:.^oeT =RcK em< [IIR$C1+Qd$G4ȑf&WTC=t/`Uz$Z7e /1qkInDj&ce !;AQ⯱t=3ڽQM` yS {n1nQ!%T; I*W*)J QY?tRP(f5b=>We [yq OgC{ŶbcΌL M Fڢ=`pJ&~k<괩HD]#xnw+H"*_clIbAؐKpɲ8 %y,.\zbjLFm/ȁg1oa鼂Z +ڢ f3ϒdI¬R与=Z@e_ɪ=**ܖVXX63'SFꂁnק-[91U*$8(Z^t^Pd8lP2ʦ-S7 PAdVkovmnbȻ#݅cJ7} yb_aq5>f( 3d6*]Ć p"t|k>6w)jBϟX !duN) ^*؉Ҿc$j n #ʣOB0Y7 WL-CRULWD˦0EIӲp7H3dDrC?i8d)2C!O,|b0kKbY){>NCNAa 3iqdҡ>3k#*&onޜ|1Թ ܃1B 7V z]Ko\ VEό5<cFo}Էlz `}Yx1 6P>ҋ ɔA^\1K3N>'6ԗ!ʉ!2txTјt(q_ʎ-%"-XtVNJ)ɇ27J1)H8ג ڢ7۳[k M2ʢ-bń'YT#ei0R$Gˆi4bA:xulEnسc[5<,Վ޼oO9&تm%+ī&}MʴD;wŎ]8*ƧFtrn%Z["TG }vŔOt`EPs*IGQ_tv\AeD~0yRATHc䟍 akUTaTfӇ$6cEUפI$E7S_uU@ZWK%r_r\5a X4i tXmLTdшBj,1bga({9Xb4u6aQAJ7)[XޖO08rI咑c AU=IQ"C=d]^D$RJڝ խºOfadBdL^+ tbV^}5V'ZhVZ=x#::]/Qzԇ \_,Q_^ܭJȓ[uXv{R6FAV*ZxJ[ʡT BinAiZ*{:%AvBn9`o̮}SYRڢl7 n݈TS.-!C5hS.g2Kv!{ d)j-UZx.|T.j4ݛ.DL?^EOyGS}Eߧ;P"ƜS j`u$Wi4L-Sgaɘc)@<̛pg&!Igl{nmA[$οtץ.Xmr+Ay\RR2-rMM(e.(pZ;TF0EsP1Qt BQ6Fa0cPyqG#{8 _E@4Oz]_(M$~x³1o`TSiс/$1X৲'T`Y3doucܫ}h hZd羚 F@IC@EeMA4F4+ r[]ǐsjGȇc>7*m,l:SF+Q v%a V; h]o3"Zt#c)Eڢb(:Wh;'AHFWx00jZ Ilm/+%圠AjS*T jd[)^L-'6 M.OR)FE Z¤">ېE4G,3V!CwL*$H5R*Ŗ2K<j'"= ~F--Ua 5+lq9 b櫶4jtQ ]7 MûЪq> |BLPhWUtH"lQwaloAE0&3-u|~V%GIK4Vꐝev+kT`8_؍xS4)N̢M219Fɾ䌓~V&痥pٛDzs뢍@WÔ|w beY񟂾r=Jv(䮒)Q<-I񵇶N7{?oŢRF-bɹWskp]f|Yܮw1T (*MxZUÐ8+^53}WI؇^kV#G]"L|Y:5w6QUj_:B_ [%kuK :s!5#u#u#=Rc;j$C$94c6>c6NGn:*82c@bF#u3^7$M278RH.B#4$F>c1e?Ҥ>#$晤?>!Hd6CKd9d=QcOFVnd7RsQ%7eGFOeI%uq#G%P]eYe7J9eZr\QNW£?G^Ir^E^de_v^$J>_N3 ^F=J] kg,gALBAmfnfmAnn&nmfmgo&n'rms6ng 'qfuNBotvftfwvNt*qަvfyZngwFgnvy6gvx:yu'xo&sJr>'p.~gs2r~6y"gfgg|&w2ng{Rhh6(&s֧s膂pR'|g'2((u*p'(s&vw itb'Bu'¨)nD1M_Nц`heMGOȚjq˚ CV*EIj8iEiIeԩq DF)p0D ePkiOP)eD*.٨ĝتj2ʄ*RjQhjp*R)*2*FLk詵FNxjFΤ**ʘjGꙒtI$*++ޫBjĸjE> iب~ģN+ubkyJ[,%AQ$ACL\UHtͱ}Cw8۱e t͊lV,U,Kc!P[ )CyAŬgݬ@~9[_fP&J([rąm. DtM aEEئ~|XLP#Vz= E%24V.DDWd-QQE 4mG0 H.(d#Va\=,GlbUAeJY\U^C.AEԃV&WbaOO'W?dTeH fb/LseBbZo_d6^MI%bjdC:&@f8fdX0oLFBr$/p_oWOdc.VW`fa_j/p \rK$eVegF%J6QfoVc9NqWLDg danHMgbWǁkxDظ>3DGt򹼡*TzNfոlh !ZD]4EPm9Mnh1WUd$DN2N4h\V`}SA~EՊIy_qVmֆDU\ۉ\D*sG_턵 !M0ײ6E9Eܘ6N}LlϤ4AOdKD@$JI@ex*)FȠWM谈C\PUrڄ1"LT WaDfI"GR!I [Hn}ˑH`=x؆w(CVp ?RETEaQ"nԖ tB2KE$bsqTә!`bo`نn`ń KSUҤu6*ȜOp ٩bؐ[)gII VyK{D`[SLDbDjj\s%Oz P*9Q #ܔ|%EU7E([\[Ekq.QRd˒<; 5x5SYk]y\TޱEN XY|*" QDP9dqS!9_"-7\k&fv w)ڶ{IC3׃kwE[ TC5y~KO"ᴙwߍ(eN$􇨜СKFU x[ĄG ]JxWGc}Lۼ ~\ѥ-/p=VƳ4#95M^g׻5X,}-ގeoGgI?X8UY ٨6;[T ]TӪwK<Q!Yc eZmVY/rt;xllt` ^W?g?8qUֿ*шx==!+jxYPKﱔ[ЌT/|_HV!D,E8dXUE+уfvIh~59_V!X jD`v"EXQp%QRQ. yݺw)Uϗhm}Kۢ%H«IKӓ/rm>eՋVOe ۷p>}A} FcX>z5F\0!#EF;yRzqA1s(iC-+L,Ϫ!:hp/!/T0 ]I44\NҖflЭ[pC @&"+O# #Λu-nLj >876N- > %g7zC%mu0}ժH = G+p'%58tֺZ? ; :76j5$c +Y a#r ͖fRLQc441uW׎ ƪ>C@5P;< ^{ #'dQF$EdmhΐN~jWOZ*$~mtZswUz)4M!~̖t#̲W4y=FNTKAL==E׭_iJ9@RTQnS}jւK%Z+l=lK/jJ#a,*8MrŪ0FQSNlsFYy/[M~ȵhZY_+š\d4-L&HʴsjM)(4vdMéH'4 D`rfռ@eH{!@N`^+C*|%LLyNw ~1Q ; ƅ)fC$T,+7s_#l>%L1$Lv$Ýq]ݹ̰Mq Sg),QAX84irt(7FFY9`EQ[[ʝh-ThPR W2 Sĵ^]nO=q9W,g(n *?e@o'!d~8PC*)^LK)@dc}䮄9sʵXjq]eb=8bXf?L*foc}m慝W @PZvVι@t ϸt{!2l[ A!\ȜR]Q!}~+I|ᫍO)V8ɢzӠ$' )lQ[*K.VRZP Kvե΂9£rHMU"+oCJ@IQHttMq)5 %pkslU,P)MKFYElfQYs&dZNHrʐXeF@]V3cpca{6'`Pn#uʐ~U$6Hֺc `J@Zr65o>: Z!/Ǩyd_[&#eeiDr*0u2$R  >γ@#Wa{֝T5#W8r˶n0PfgT /e][vR}hBm<B[2pa7A nڍ(B#dEYդ~s_&-mg34V.v鋀y-LI#ZՋ856L\GСMhjţꝹ>s4n!GB:[]tR{*[G~:vl]|?FFk0T9&ͶLxVui ޙ Y 5#(.lVC6t0@&hC Ơ p"@1-a,"@,`T\þɻ&DnCfXA Kb|#1ʫ"̈́hX`PCW&(,V]]PͼlR jGT/,[N): 6A^ܶ(Ťprď=C)܏Θ'0Lzuns>ޜhF갖aXO^iPfsX!Nb Baab n@. b@N!J1 p"bmZQ4 ONk7aNJa1Ar@}c.8<,Ζ$[ܭR>B 承P񒮚f\`{XP.JW.%lEvnZCF%>Z$ >JCFdt"샸u'˱oy2'z ,  Jl!kfbЈ%Z,FȠc>|"x!PvAA771e5@A`+gP+?!,+!4.0b`A`3sl&*fT+zjUF zL<|{H/Ӥpin` ƫKϋİ`Y`PN is>Lk*tM`f=иt4ӆYI*DVdJr+'k\<03B"T2v1rBBAap @,r! e`C$B'@+IC R  >F*!,bB>@!FFCE?uFcFmtGsf?GEaFA?wtGITItFJHEtGI5KGytr4GGF[4JBFLK4L4FJAaMc4IotJP PNaImJLٴP#uRLR4GsOm4GmO4G[HTT UK#uS FJTQ)UJKtFǴI}J=FMuhLNwGS-NX4PSKߴR UTQ4JTKV{?{HJkS%QEPKUGZAaLTNwRF5bPl,&ĴCdd&(c10#Ar@Ma N.n7bboq !B!-\1p 6 K̎4DE9PyN9=x4$3DynBN%ePZ?0_ q$\JB0L5"kEple'PZ MC36ìJ,j*Th,$5j-BrvnRǕ|+;G)lICX,>j6?&Vl6RNAY>#q1CBL,/~ *%_|hK|vY\o ;F)< j9qc$"?.xa@RA"ŲD7Q"+|? NaenMAnbޠCAR&ж͟H&c4(ܑebf>O!<82Br wlJP2y&Ƣ}J _fDg\2B% ql8tbǾ0dD*(X$A'0f焆f(15i**ofT-Vt#&W+X-3[: Go7f% 0fr"/1ˎ+A4! 6Ayz,"oQ*|bAnjiwT Erƛ `P7$ ň:rl8DHȍu\^#,Bb('jRo]F]mxJz˯ep~d \8L=MTG # sI, Mf LnKÈepwm/T&=>OxAw;AKzF6bVc N/GCTP_cQ `T-N#-,fiz =6nk a*9Pi&JSfCo"e*,qCi;p^Ș;6@)m5!h'yzWB~F#ʮk (hb2l,,rn\XE*WjhH eGDږ)6niLY6lh#pn5V6hdN3v~npϰƹYI$7#.'nPr| *v/sT#Xa~fj&sX𴄦VCak>s*$Hj 1hȯDrZr z-˰*hwN+,8nbƜ$b N*dH5QXt +i=鷤o/%n} |nNrSnXl!knr{\5soDḇfPВG{LpPHS8Pa PX[2_Fbo2OZvАZDzbͼVhJ:O0~W1Ĥ; !~ܰYzgFzzP3$9)SċFzSD %6'֘m-gܬq̰>CRL -̵Db³:-dK_՘3hʚ$-p2^ Il*QS͗nYi=X'c:* qϣ S* e&@9; e""tD28' =3eS/ۂq3*ntR=~en>E/xRdD=H/|Ͳo&mz eKݸ\=!ks4HG)b:޹1AܕZEld~EX\/VwY,ȥ}4Ghۊ$zRk]_ dža4WiJ߬C_IWPe$O9ܮY4 |ϬEQh#-bМ[\q'{J$[ha[07 E'`4zWh OzU$/cLj#:tXOD(E%a^4ʆ%!gK h#H mΌseBMzDFם`K>M mB0I.%RБ|[>UX4Ѷ eVS˖Z ,C ﲗrΝ3$ا:SaA:n5qGM;Ь:Jn jjaA1(cI.Dia2ll1a<tFh-Jp] ^B-WU^QmB9CYZ]-S^qFFJ}e_aeJaiVX58_ZaY WlƝ#>q]HxKBl|}%o/:dq gmDVjbG*n uo!YA>CXQidS ]S} ]aV4XtAxL`G(?uJțXqf)H T S>XQ!WMŠG&:p5t G&BeWWO%ȘI wMcR1Nd!rYXk M%|ZX8XRȪx(u;*M fi6ڝ|۔":O sىDz,0*khxM؝wE61-at0䒋Vs6bFnJǔqWuFa%vx;Ǯ]~iծUw 7MRB7fRk~xYum yRykM_vo`UR/uv:WPyHQUx~}ÿ[VF4vF Fi?I?i>/>? W O~|`NЀ x _'X a 9#$] ~m(AoC!+!#(>$!( EİheSe\7O+шHzG..nUh1QL#C[Z0Ŵ'tTxأe*HҰ$yppղoxv! sE8aqe2yX&ʷ5.#e.lG$N@{ +ndrRC\q6MUågQ" <5PBksWL `X믮%}#2 UeMڗO0nГPZ&-te R$`uSYf2Bq{չM`~ԡ?w%HPa@>p領 +YLEfطCuc]g"'[$nBAQ4UN$ (Bz۔ey Lx1tu,\k2qc\pzHpiF%^]ȍY:QJTsi5.L l$Q3[!\ߚmj{R,qVMjxjV1jUe8 W*2㡝t6%IHk4{y8VU4Yes㊤Ke}le>(2t!w#q"J'*%̂ŻWjDm5=OĹ\TWdye])]́w_wwXE=c7}g7RIL*<!5;f5zWCioږ6΁f26|!/["Ju''"fl| T l{OYY ܳ#xvEy^R #!r,`U#b(+2:e2q1&u"^@}u'b5ae7b6-2bt"QPh|c'r|2{(dcA-:U#X{:Ee9,s!n#t\C;xvj8T{a#o|:ukBL:-+!!RqvQ=;b 'z pTvq.<^+UW^+#A#L2_px;8X5ABncFb(HtR/],%cDkwUˑgYw{"{s{+sw]\3էrBYn_5w{x:CiN#SU 3-Dc_"2Zq:aQ'[zR1< VP qEb{ F~т5XX 'nc99VWBD(I7-yr\|r-Ug)9l;m 2i+exj( c7vkCa0m s}]V86l`U^"Dfg&naEM'h$'S' o|55mT!OBS,牏9v4`^ahO*帘t4;BTT+lw &Vcז';2W-WVÉoEq\¡+ŏE9 ÏBͧ*͵x0Cmix$G+*y1RRU<'%fS"hV|3'%+Ŗ݂MChWцSGɛ{3|[:b]2/ʓ0@ƦN+*+c\\HiJ}}.An55~RR~K[۝'xҝ Eؾ 큹\Y6[!9sqʳs9e`\TrCɊ{]p{P#U~ >Cu>LU++TF ʒēز;Wsxhs;.ʳ:8z cxE B~&+|+{Kx Tbr]qi)J"[E|ŭi4K} in̋ۯKʤ E bV`1 eq*+ rRY#e>ŏX}hux!rWtrP"#"-H5E4$V ~z}穋s0/e!wqW,ihdb)wKj=v Y2REJx23KW]<s{̅ȫH=J;a&$az3=c:sWs)X`n2' Z|G%c 9g7 X W$;\ĩcv߂g$V8mWRbIc6 8cC\9ya _e#o598,ҧU.v&Së?_kVzNKU?̿S]c0%d bNcYvVV0?AZx;n;x bB=> ES H>%~omκI5={hgn-'n1 .")|3vBZc5,xrD)<X+?+ꟍGv}? Hu޵˽,"*l K+op,|mK%6;1Gʼ 1lw 먬 f,2 mŰiwT83MaoZKM4*$HbH0ʲ V5Ps߻}=,>ڴH4C=-Zڡ4`ebp2.90ch)_KSvlH4(_3*c  J, * J ; / kϒ ˧"3H'8$D3Q|,6ϾP8 E =bDoE<0Rˤ^Dȼ G&S(KBI-\ګ$ԤMF "{@Ӱ12+1LH #ٌb046m4 "ńdQb@Y Q#42i4So$,#k"ă! K q|֪Bk*ًE<"א&p=ym.pqEɲk1ܘ X$>ds̗bW0][ҴC5w 4;鄊[̆+ΊRS*cfsٗ26.\_O"s#nΪep6hs6IAmVfehc5#Ƭ4 ;fsLaGu j8Y$ f P,yKF!g}{.Ni'DZGtJ c؜J?޻ a@F:>lbrzƄ ̻d6"8BGLMUhr@]+;V /+Q|Q (EFӒDá-9ݔt;iE. XL?vQDP`25Ya|M(&>snAI$4 ka[Άd9cָځH.s(D7}FAe9 H>TWQ6..6]\됱z2 >4t]!ƇVs0h>4w c рF;8B4KJu9CUGTMA(`N#5HčwBYKZ[3 K $PZJ&!-.$y ~lgU$¦'%Nist/mhֱJ4K Mm|aB#IL2teB`u1Xk B*L>TbDhPæpF`}cШk纅!hԢuhS˳Us8]21 G-$:"ṿ 41:0Z'i7+ȍ5oN7OFǬ(?ptB5kN.dشMI\b%Lg!Y'Q,o&$YNmF7N/-JѳpCuE+ }w,zs贏2xÉ2.$lCPkiKFƃ#xq6n\4nLVAᅄK5Xg4 ."qgQSCGSydBleFw n0ea2a`߂ 9o)ö$)d2˲<ӣ.VMxk)JDk,e|V$ -#ʗ2J_9%]}h s^B#M-`HzM57qFzuؾ@>P+,lqӢbBf"!,ݠ1K HBIrLp$SHÔZGPu0MhR"AQt ~7y2Dh0q2> .$cBtH'8tZeh _O汕Od7_?'#]ӝX(v8[+{( dh"9z[:A;Ȋ % A+dҵ Ȋ-MPC%Qa5Zu3Oc' 4 < d6<3 rs{P2B"BJ),Q0բ ں3:,ҭcpA@66"[88. 8BjD, s v{J/9$$cX((1z1&)P` r;fdh؄{1{3J#9 );#c =bPpa`y@ v8 ,dͨ%A Rii@B9Ae%юI~d Y #ZB^q s6Q'Ð5)zB\üʣ zܟ<잡k$MCJYCl2! z 2t0JL؊hۇLE؉"ˣb*—QQ'LU-zvS}pQ^X53q- z*rcJɱ 8TR0tK8(q{ C!B($< vZŠ|CciD\Kz|fRx@~i %ڦ%ȡ Z*@92 G,TđS":]RDH'ъaQKK MxDXN 1}Ip7Xwٌᙔ ЊFXÍ }D iר AΘi'rhPеڐ׏y:A {Z_;, ;>Ya5yIU3չQXR@04I 㩠=O^'z0,  .U#ɼNsd1 4nDh'hi3G aA=B$ӧz ^,3&F&:z T IÃx =h< ɠHݓInYOR!;?ΣɊUmQگU~D;BKhZO<4# 4TxQ %Z۶C"s 5,dɗ):ϱ]h,y$zhsDizPh=㔮ePlHL@ Jt'qX8<N"_'<|qYO.i_[5θ W-iiI$[a0"lD"̋btbB|B_)9j i-5؝4]yÞ!_߫M$%6t:i{UTVIahsLh8ܫ02כ $]DF;GѪjۇSzY1P=<$2ڰŭٗrB5y%Ci Y^ >b%N;@r S,䦏]C_2Oʌ N5{Om*v_0Q 5m;Ǭ;ZmU&[h!O^@MH;e9ic'J"hL8ЄP H5 lM^CZnu5(;ĥ:ȫ>11,8LT2*@9d; X |faʺ ؙЭ  MRg:HPdWxbuOd; "2;4rdÎȈ3=-"5SG l!v\Yg:^OPi6'!oKyjB`f3LPi&;F~[{v.l\gl6{4Vt\H_dBdIhaƆYzR9sA%@MntbqD?4HG# 0hjj(Aٟ(<>!>:d?Vi ZQBIƣnx /P)"Ji/ʯX=}bc}=.]Z%祲0;uqΌ~%p6} tnm_<:]%DUVjN e c-F\HMki#Uːh:";\ٯ9ʅD&. DK_\9 \m; p ;PO4Nh!'v^#$ f,?m{IؚS :׈mpvLuMw 2Fw!t٘i"AKǖt%&N.[.䊠.-A\syJ:iesMoCd)YY4k4!!9Ih'e P/ ӯUQ\.3DidZ uo f(/nڬD>"2-Jyϻƿ]O%<,r3 ZXν&ȭbFWo+ 51.5~-}}i}%AYŏ\挺fmiA[1bmY$ِ!'$i Qv"a siVQh }K24 0"h} $Hp}-4 )Ⲉn^4?"8Ô I.DIÅ OFń/).IÜ!$},)LʨR ѣ}E 2P>ź,R= h`z,b˭j,۰hȖZ^.\#lx֭5S޻ч$Yb,*gnNV̖)damN$YYt6m. ^xb[mIeR#=So끚m2ʖe$?|45V,MՈ4Ewei2u2MFVƚTm%S|VDtIN_ui)N oXBQl76LbCyWY#$IIvQ>IMd%IZ=o] QRXQVXf]iuYgXXmʈKzc4g!8pAՄY8s&Ih`cfCT-DfVvE[ni8v~}wx|MyN(mQ9RL4bl2h S&7q%&eeM"`J[EsUt%> E͕L駫"ҵ⒛ŦkeBWvo,)֢6rmdj?2yt:TS=$Z.qՙ.Ubdgk=wѤ0XiiؕenW2 gMʼng4`[O%鳣c!q4ļky6g@&,ĊV3I(]VU|#`3 G X-YYd7Ty[nM MԚ%t\Ս'>"mq^wY_RUyT훶Oz{ou[VzoR ߉UɦcIXn{{s-v2^50'ִe(a.J@z!)@MIPs!hsG(&a U@hJGc"Dz Gi6L%Cp#Jₘ} ~B)`jTHHYʙ(QDYRlg*LHn/ @娌\*T$1n+T騶9fD==[#Z^Ak-0Ȃr(^w *x/} RϲRD3::әDAV̔w9J?@e >`OJ䶤z̧>I3!Y`"d.ۍ K -&, Re&=p0!$T$b\K< 0B̑*a톓W Efpꊟ02 ZԖA2OgEyCox;?ia;t_PC'vBH$9QEiROjx9 7{٨i )LKOyiԔ=&b")}BA`)@ƚH`C)hT1dʨ8=eKb)PK!͢`-.=QƱi "(ASլ(QR^ч[J(5:Hl؇rS|;'+)6[`rG 2BBT|ڐ:FF%2 ,ԵTͩL5$(.)#NχJ qᷯm'i VG1{Qj\Ґ4x=Cn6.wAmmV0WCLupx?e՚2Z ! : D(n]E!MW^hݥئɇcYC4"Q6&y"^2"l^Ve=ݜsF>RUC?+;{BK-q>f|kf9,  <1ŭ^ײG)äzMFD1 |X ߠ5mQBI*UfxR GY[๘"ipRO}!FOELpaDTμVd֑]v,lQv`IdDȟu݌=pYt٭]fAQft r˧tHf|H m 8Y`DSKUԺ̓c`TF:I ϑL&r(:1wGaͭM~uo CGB,\E5&d<`] 9.qY0b2 Q`dIp)NWщ*FV[fIo`5GՃucII$ncE`8eKKuE| I^Ptq&"6ZSN`H޽죫EO$F9Qg(Mξą؜`B=aϱG(ʍY,C3a_&XhCnBa._*)-߀ZٍeUjgfڤ&10jiheNg&x aCYhu&nxXj6'kfrihjfu&qR'qa't&ajflR=fafvfl*2fys*{f=fx gtfmbfiNg&oBgrngt.v~&}fu'Rx0glgygRtgzwg.(wJ{sm2hf礵fgfWlvfw&(CqJ'gncyhvZg&Z'!rgr'h>h('֨敖s֜أaU[ dCCJ=LBi)i)i&i jj&2j**^j*Jj򩞖jVB.fJFiV*"ꌢ*jB*^2jNBj.jJj*&Rj2b"벲"B~k+jFkR*^kj*+j:*ƪ6Bjkk+)lDܸ^QD# B,Q@QFU@P@PDޞ)N΢J&mQRDH\'l=u!fxμF0^0-ͲMˆɚJMG|miI&fئmP(HnJVm.u&W0tmmu-4-nlyɶmӊjmrIVǣϞ⦬m]nbժ2-[--`%v,آ `m8/VVDl6ծ~m"fr Z M ]i`P\5 F]c븘|t@rqBJf)5&e 4<NJA md.̄G-tIɎHD-gFLt 6켮m /Vm$.)bQٟ); o,>Kğ0R8H'󌹄Fjۉ#"-BDy :8rL0 Ѻ-$P? JDDJ+,\4 L8Id ̗ NHV4̪Ce ̬#;o#z ãIc6eZ:*h$3ϚJF*/{%]g V';(Ȩ:Ogk%_A=oPUCOOSڕN<VM$2Ih3OQH-6o4hQ{²ڄ}iVi[Uˬ8Cu5Ŧ\I{5 hmˎ,(E5,m"t5bXjY < ϙ4ܔcq7up;p@4wl ֣n}@)Ճ2BOOwj/uUJT2]*E5$S'u$iy/4s2\ԱKUd;DŽ-e=߫fy/ HSeD9p9 `z QwCCf6,{^?fDof!?6podu9#U'Dqc~O@꫽,L)AuPLa #L'E9C.-z3㜸 o:]Ɇ/8Ok`~tݪ[^|6/N^RY-DOF䚎p &N:3eECZKLshwoP\yl!lubYBˡ2]/E0+?qځFO$ӼRRY6~MK@K_3,5T5 zIX!& WsBxFl5 Lduq d#2l:IsҌIӢJ#lQَú }L!p`*\vG%>hb9p%)dRu9cgSaAr_M"d00rG'Elh:'.G_Bj%~R##.cIҐLTr٤|H4 lTP l,NHD}.$MiISER>(@MBS2q<mLܣ qF^q]B%iQ13IL{r"#S$я,J(dIߚE4nndu># S#Ȯ VVZ -Q5m{'ѥۉ$M$^#|SXJF=dOM;YV|(f~t0p aNi% . >aR]ző)шRei)̣Tu&Jn3'΋t^jFIl$ZH6lԍi[}Tyv ι.,±d0tGX-qd࢔=MCC\F70 A]Ű-Cbha-if*e])252%=[DhuwgIr|_V%i[ks)bpZM xAJ$%Ek٨(]peR%,̠wjtGT\t洲z-efROݩ2~r\0U{6^\eܚzݦYQ%ɶ8 VP1+;Ú8~-Q/%Y*/aJ9 fY*Ԟħ nSKPH^1Dm"KfI~CܣUbZhA jfRP+|YԄ0P~bQḒCrl\ Zt {֌|Ov"o$ LH&r#^l .$Gwh8> 5fE@JKF̗p"Őz)}*?GGEͤ#v0)HKMD 3.¨)gѤ"҉) K%"}"!a Na&! b`j~` n@a 2Baa b@ b]Q@!a7ccpbK܉b~.(8顐Z\8*ĺtH' K8&*D} 16pe꩘FDFk.nGX5dhd4c8BȄcx秾 GayD!h;^b`! =B*)a(ssQ!+ A P0=8D!Z\&n\",v(]]-%U|%PtI&/<+@"-D]8i$tcn6{&vpcڲ6vCd@†vOF/{iF+ꀂK!**–&rw3;bfDB1PL!$hsbw7"IDxIDtsS ID#f-@ +vCr7w;IMĉ0 !N0/Ba(tRPPaqw .uA)7=MP|b@ 05t`r,*QxG .6eЭGi)< خbqC<-:QtXR&X(<.~^Cs*BCG$JBYf> !-+-u|tH<JJ4 _ BJoL%&i21Ü>!fL&XdJSS#6@Fh=g(!,?*=-Bd>Ab`Qs\r--rF1iSxe 07zFD ؇18 =CP t $Rs@J"cBx"?+NEKVxMJG|B/(Y:nZ` ;EBz9#:/Q9X9^BH\uؚ]sMym0a0"+q2,E?Q/PA"(O:5l~ψɜgnĆ3JK#Y}P)בuH£ex5܄:#*&IN}pHz#(>9Oh`mu4HF1w{xtɒЬ "%8GkЬPtX01|1yb^CMS4 1zjzbmfFb~.:rgZr'DFnȆi z`FҢͨsW;$"A{IoƁz1 ǒHK18NEsCn{]WLkHpɭ6Jt_!{9P'pxyLSx|-(lGb';TگvVUjȮB2z۷lhPa} ):H1B=4h`="F[XcD2ZAyCO͑BMo4h>iVmHTbT u%Ӯ8+b*5ϊ nLDR5{qO^1.M۩/$h1Ж *=ƛw!x4 4ΈK[z&+pNGI[0I #~E:(É3:sim]p3WމW36P? F{p3ֈuѶ!5wD:\[:BhiI,3L]%d-Tz%Zn!Wv@QZJUŕSK%a hNΙyhF#╜kbn)މw(rāƋY ]YD^OR6o7$[FU`Y5H)U%!*SLeSӉ tJYeV\Vbrm!oYbE`}cPnӍ^ZS{I^tYvjKe`VVdn&,bB@V2i&W>IT%EЧ Z!zXL5&U񗜔!V-VnY\DzWQjmW&[ny.t(!1ޕ:CbjbuR+5bcíj&nHIVA,=.fv=a#P ش.+'rZ[h.@wόU.HCVmgrpItI<iMҩU(D#ԇF2Y*l+nZsB xnJk-㨍B)1Ll9njf&$Si\ :*G~v],{zIvRgez |i Y ꊉ(jnާf%X\c lR1d' G5LdbV@W#9 9QI6CwĢ0(Jϖpa$ˉ(t-,F;g*:nfJRh 9]@vOSZy̽,P31 $5͌I|pk47U.$oj! 6ZTfsLIZfS! 9\BZt.D&'MUvd[uJ."n@1e*YP$z(CIhҶ}j$|u:/=*bj7IcTF眃U*aMI` tB]r j/c{T,%9 kƪզTH c>ףmRpzKy˲ #>Xa{b/bE~Cġrr)'>S+C^Vu9m'}ʌSg푋ӑ%6/;2=0N,%VdOwjF .2qa/2æui.HYvÞ8osFth8zhUSP4\Ch9>=](|̯SuYSљdP޺P^|u.N?H2Ö;kϊ `\k+$İf3 msMӐ>r3y[ Za;F.:P QqJmT6G-)>qϡi63>"V%߿͔2뚽3g]u)xn]Qt,{̲9e QU?M$to˙z$$z1=q=j;#q^V:ůn % 0בNws|u2;kLfL;Ă<"55 NӦZ d!ƉNejFQYX$؀8/J]ei$8Xn(e`7mw3Ehyq.ahg^2f-_kgp怚Hb53r(u9R$UeQ8#a0ARV1= {p'sv%(v9VG|>^w>* @asci -rHs5@_BSap#7i!x13l2g6"qz@fB:'xMt?..($)2"n;:#w.:"8l1~fhr>%pʂ#cz;g5 CUzt& ]w)#T"H:+b,H5muxفz~F>]Cwq)#tkÆ,7i$h +0}uQ BTQA T8[8XH_$pf"vm.&8̓o'g@wK8L|Xx=;6._gU*(ahU'/&rH(Rg1VF0O7RƊ_Sl 7]:e)g2y4ՁAs;5^#U6#%Hp8gҡ`}TZe{2S@R4xVB/?)(9=_SuUR"SkxCzҖy"@!Xhb^)@/:! Aj@UfT?T06(i#ҙ2ReAfWx~2́vXn*vqyYl? قa?2Fy73Z+h Rm, Uo!7'dV$su!p2nWI=h'laxb nZ4r=!G8ʧxWs8 unvV!I%ݡcZ|yx!7^ ?%6 /W4w+PIIяD+ j!i@ ZB>5: ;y!>-92pyѯX+#}q泐Ye7U3!"g6 q.\89v5AX&'mq50#=a)7wsp"5y[@qe9C)~CxuzѦ.'l< n$xփ"*01y ^^: TB`l#atht%2V:h5YJr'^*g+hB#=/" D8!,71.؜aj=⣪-qK_ދu-V,({5RS^_cdHzgd'}W#;;q7TpY=6B3c}  ;^i@=w+}; *##jh)3G/fS|[o ƿe&Vw-V3 ]޲ q%(f8{W+*.j)!LqmiH?SyR2D%gZk1{̂|3e^2&{G|B9Um<b^hՉqg=+=c7򿵻 oc=EZ@.pv2T=*( XY v:y{ml>:Ƚ & #l-%tgʺi"ҙVm% Aiuˀ }g~T @1}bP|p YUoyw.4+xy?v WUƕMjҷu_&^6 ih0zSO2 p2 %><( /"GR$ƂU\!Ĉ1aā1N#Q ĨӅ"F;c LaCMw;SD25>z(1`k`@X@ bM=5Wx L.Lt@Di*}$BI&=r~QJDmiBg^fNoZD3${RIETRlm *[{e&47GM0b' 粑g;"6h;TV|(w45(4PEE?a؎C9PAgpՁ>a~N "*Eh4Zq.^t8q1ǙէŇ|,sv;Q"``\jFeocX>vq7*sHPv9ԖF|ʓ$Cob6aWhJC)Kl!VcGAL2Hj/=fAx \>GL!KRH惷MnKBځ"C!c>dvD ׎ EFS[&dG}TBj(zc IiO}s!30v<f%D2&!kpsb2'I,$@.q*p4`#ђ&-Ck ';'Z;2?]"T ty! F7`x #В eЏ1 * Tb;ccdi HP.ȶl e#7h8bS6h01 .:7(0F3 7ܶSh}8i 9PCxZ@scd7Gl DC0%{51@ TU9<ђV˗L@7+٭Cp BU4̲q$A45@kKӲ{*kA)z4rb_qҁ G ( [QhHq}L`Щ46bE/Uԇaهd؂ee012Ba]P1J˾- z5ISD^S=ӇĚ@1Ȝs4Ш0}a21*kJ(uʛ !A5I7A{9ImFRd9M׺i k M9r,25RbLSC>ꊹRP*`HyE2¶zh))!Q#kˎI⣮R;$kc|F)'qZ  CB-Ӑ߲ɠyoMn@Ta髨jҝ!P45:j 9@۴A':ZrhGGbI57m8J -?A)8Q B*_%A#ɳ(HI6, iApqU %wx(q:!&٧RYU@>qF"JSU0|1;d-wNKAst(ǚGOr2A wL% W71KQ$b L@@|0M+MuT!I%5y ( $"X*ÿQ qQIhOjIe\ q%4$|xnي< "Ŏ1 US QU!bcuA*Xvy 9_.k:9#YX w9R7|Tl@On`Tr2'dOVΣ-_LZk'9(߉.)!s4Yee]X04! PP!!>W9iH2f#۽ Ζ~@-G"fyT.ȥN;ECO3͙V~Xv&lhY-!z 4$ ^Umf&F TV:8U5郍idB>d&X^K.@vjNE(VAWI@ =Y"}ɱaEUEO2 d.zR¥&V؊fLzJ@yiՇfWe }+oQ'8HI%wJrX\S04X%%9Oq\$&pmsv.0-v`cQE.2y($6 tˏOg8OYM "ORmޘm=U%?B53wԎ𹫣!饜USVs[rF~LdoZh& 4Uw*|{ͦԶjT;6-JFNhاl2}EۇPaz} ҫl-zDaG=n<ǁSeHB+Y΄,rz:JjeЖ-je[KjČV'mԦhb>TL̰,PoŒ;VҩY.spŜ"6d\#?kY$=ydʌ+'DYgL

    7sDr8EI"N`4)~SXĒ`NX~ycj൘@jb=ʤMWWquUWVYJf2i&U>i,F&/$T>ClcD9u6'xBDi}f`ufw 5}}Bhsc|QNMd^Re#ZL*MTKE UgluHD7䏘"zfz&^9dh+|1^Op):Zv!j9QwIG*{b˩!rf\iJ&ѻY_*y@!H yf6 e>S=WK>Vz%RlA#FmɅ1f_!zùC7_gpw.'mmڊVXj-Hi!'y-{8GmG2Gqt iicy]cFZՊv{Kv|FE`ɰ0"Ewd4ظ},7Q}ň!pzsu-/Q=r/91ohUPVPAHf&Uib aBy){PUoqu^!$L "I ?n.AɆ*2._K*8<>ʨ+MASݍ|glX)KmAMspGBS[NCgE݈֢HF^3s):ZX?xZh寀WNb!>L Ġ>D[a6UluLU D# DT4 p˥JV4L[fF"@QFL~u|[[덏rei2qn-IQUi<)Qro+tpGN4b}[mR0)h:֠PXo f O.slr5iJaEt.K8yUxU8R hV L0iQ aEKP@i$ae]FdP\ R%\OʀF|d~":$i>,o7[v,;O..ir$58*U.{%.32YI}+\t";U Juahʃ@fNYC?G1uPUT*2iIХejz~gg~j cBReRjżf~%oVey&Be\%VrOVڤ=O`4t`OEP>$h苾hh&hh򨎦h(䨐ƨhʨ֨Ji*iꨓR)hn)B$)~(Ψih&j)(h:))*i)h)iiibii2)fNi(jf^j*ZiZꜮJ**ijOТEXDȈLIܑkGXUkBXD"Zq\xAk؟I^EE[J<ŶbRBijǶFFrko+(+*TkPD k*Qdo4{ٟAf]&Ŏ+R,?{IƚvkQŪZZ+"Ģk̂ƺƸ⫟dкFn+kk",Zżkt~mYjV+j -mE·.)2^Zd4d$ #hcrmä^m D#AxPRJ mK9PIۍ,YJ-=#RɮĎ7ٮH. 2tQę炮XҬ}Đ茶=S< mF8H╩P/R֓z/a@J0P"PIEud/K=g|_%QGL!Uj(AspG >,WEUE \`(r(xV2zҦlqmқ\6hrΥYgNfjgsr'cg:.$1e'R&Ԗ(o~~&:&]vB{g3Z#qB(g]R~g 1{"2krW&e$[+2|RpBe'2"m1?rM&ϥɱ`q/f!f-_ghe#['Rf(rBw2puwj mY1[%$2dE tkL-zkKޗFf!G-&=>F. V) ɣ*zAUla?kYrJPtd)^Oxt2t`E| i,~^ ͘Bt f$;9%0Ӎ/ ʩnZ6#a tK  M\O;.Y$uen}O45uGL(!Yq v/Lp/w{ \.z\SȯFALDNQa^0M wō_%aVݔvTA9Y=Šx.a-՚PTυE>SGzG7QWn`zmS;!Ѓ2\`xJ={7yWypH^nA$}U=TbSN{_ߙbAnM#]⼕l =YڬJﶜ5Y3i _QC~Gڄ;VЦYVUQvɠ/6,A 8|;+ #巔7Y\mڜn9qѝ[4 YO"8d9M,$x?Knkd.`$ZΟ T Kyҧ^I oksCu ɡЊ-ukJ~˗_QTlϫMkhzՋ }VO߲{hUܧlGFԈ#h L)Qʃ$2ZdzeVfݾU9CC)Oup'\VI:Y%k,V3v'8a 74y?+‘TR^ʤA));BuOU$}f0I I|՞T.abF)BRZQX S;u>hq73KrUAy< rQP[|s,n#HU"mO2d7EIL_flZGt-GЉB[1"5iA tOlhNnV7u&rBxi.h)BMD8c53{YDHqG\F/lE](Or¨Á B5mdW,8*Cf͠BgZPg3d+BqzI5 1z\]=lU/iT* ʊ-4W1kbOZchsd 8fU q=QQ*! :e/2(Ġ'Tw毢f20j'`;N< 4A7dlH":lSS4$vsTa&[10fU$Ad!n2KiQ{KrDKf ]iJ5RӞb6q\ %fo`Ce@%pIB=A lм{P<>'t&DG>&汙w։eYA3B6")yHUv;4wh3\5|e-)q5gz%Nד_.T4i#x=%jHi>&vI ?N+!ZVb;6k5M˹PmGU n“z.(2OQLE+݋8J ȋT%V*E`p-F:Nꉧ,ʮp{ ūV4`HoJ_#gnrH]֫h%; Ɲd略{A/]\`6RQoJ-ހgʢd:~L"3.zU-lD:8T=o8.k]!"$oHy%CSVDP1dtlcA"ČL}*]5 7} \IK) N!Vֈ0D"쾂}4NΫQjp P ST.f rzK<攂*, sil'jnb Jf:~KX羶,L8bpxXhHb@i)@nj$Rf( NŢld4F=vj%hiTxb&، Btǃ(({0KhVuo`kh.Q62W(02:QTj7@Mn4s^@#B$b;"a AP d@!HE @a%RB!`1r if͸&|&k'go4OB*s%W0%0B1 JmSeڶx(vHs=c +%8,5!oI/V!4:Mr(֢4%" at4 wa&rpyS$tԚ4$4b@ KKTnR/ZK /\9TJej*M^(@ǓdoE :0"p|LmcK:NԼ泠NpxKTz秢 *:Qf `BBa4 K@ 4ۮ) )Kfӡ6&`c*i%_MC? +4TtliBf[d>eD)!O!r3#2!Pr (x Ȱ""A n` !qЀ0eK?Ͱ7Y\& C8LP;1xNB{еᤝa¶͍GH.7oX{6@"_~bV2) N=AVhhD4^MDIVmxQgQ JвABSvei>2 )UDI ͪcŹּʙeޱr5((6 q#כtf4Umf/g? Vw~$QCl٨Q;lۖK"n֐SFmк S9 Y^PT4JUu[Uq_䵗QŔd OWs^B-{**VTSa\Qt1B"pvTTl,PR RJv}D^m"GqeOBkh2btˠA AיUGU@X7]qy n*VgyYBEo]BEJQ(^/y7J8%]|]%⑷&&+t4BݙPz`ʙ:gUak1(yfYRUmfz{E9IY4)YXy[砑E)"vzxf*gLKbU>҃Ba?FZ,9"b-Lcb8UVP(^Evٱ+jbTOJit5b 'qr:~.L8״Kki҇uUܨIze$nj]VynM驽f"j8[لU /I^l1oGR5FKfF{$ +ʘϲ|SRJyѾ Y4MYHcUe9[(^IMՒF$ YmeKBFvM (dvHhdaO}~ۓ~ߣ_~>o$O~8} @} Y0̠* ς4  ?:$a 9H=0| GC⯆tafXφ l bC8$P41GJ 2 q,rыg2(5~эel͘6j1^c>|c3ыl# hG8yT"9RfX!FG2i&E6f)GTҒxL%#Uz#w9:Dc3yICvR%&iI7t()UNr .1YLhz3^d7%IJ!)kQ&6,`)p;xWg#ԫ C465>>ĄIF^V*yBQq.'}֥@ū(Vd(8ʚF6 /+HS$72*R ' ŒݔjhӲ-d-XBT= `ҞpF_JR.2f+)[ĵS[h"I*U)~m9|(lYWwU A–hG%i QK+fʻAR\[pv> (F2єG# -$=KaU$Zv ݡP% GAUTX RO F3 98z]GB֝)CZ4, -Nor8! 2ȩ:߸)!UHf#3lx_M}bFmp3ϒ8'Gfy=f%A7=Dނ5<+M[r! '@zfV䲠5&SlD ..c2à BHGT-JC\b*tl+Wl/<]]9*|oXXNW TDЈT teك߁ H3ҦJMęZ5%ݞ@9~y饶;pGS$Do54LQ`T@L2Q)De39N@&~[6Th\)VZ,K]b' =a_VYhL&i)l.O+ozBw'Q7 Jݫk)#:#.{ͦ(i+A4:d,93bU`_vniۜ&9ixOU[73ww~Ω :Վs"؍yKžeOOw&NȄP:Z'8jQ2@S*P34D%Lm*jP$Dc\~+ Ea$o lGŋ}8F;7j[5v-~򲔏eWyFܲ;T˟v|ݠu[@K+YJOˀuZ|ň랋-+:']G,}"QS1Rlju"3)!rQ-]\QOlg%(_&D'p  !(}RW)F-#]U3Uq$#|& V @Vz"w8*$_uH`|Sos*,aq/w.b䢆"9wWvyncX40}Qc(g)FuR#B'R~_Sv" rT'7#3〷lU6wBb{VvmSi]0 $tO?f`Eh<&&P&rib=mS&'Q|6H(3|^XhmZ+5Zc+X(n7tMh*'d]Hx!6|1k"0VCd[9C^4,job@`(]X4|2-S7Ӳ"5s'L#9I wxV|'##{cg1IgSRn 'H9тAA\Ā%lt76&#۶9Ydb7U.7R(tt%QUFlT"e}Fb`0$U"c2usuR~!(l2cqc"c]+6tֵcta4iZcS5}nFe;χdXa]:bi5;2q#zW=!mDˑWRIȋH 0p meg*G'5VmA#f#Ԃ]rs.vC x{d T-]nk)L58hubn=q)҂WoIgT"r+Zb72Qr}iߖQ\uG;wvE+ h!r9-<|lG 8"{Q OLnWU\Ԃ$ @&d)EՓG\%!#/FYXB2!%iTd[UuۗTv9qw- :3N Y<"b]҇aRmG/bȄ_ڂJi-'b P@H)r4nlg(f=Q o%/顶@c`@XfpG2 zkE1l38_*m\1]F#Vی4 <+ >PJlqZڑtJ!ŽI'8Lp/i4XkA|jR XۂAµO(.&aK%<4J6aO@F3먅7ЮE1L` )Pa 7>R8a੯z;i"`2h $pCqyΰ)ڡ[@2e7I2+dqQ1s28#+R !ycŘb/Pa@M)DzI d }zS1Ȅxh| @va/x.Ժa8}% Q;ZBz`<BqE:;P{ .2 @-qa1S 6#pP_z8 hS!oawѷ-9롓#$!{p"0ʦdx_ FK!+=2Z>[08QIW<+4jB ,Iΐ!7 V1Q;d+Qʾacu+XA>pɗ@y3 m$ \,#4̉[XAi*1̇@ 'p ˒{%M Ї":\QRr0KLtÏzm-0p©R=Zv>Q  *XC=77{sF)~kJ%Ztt}U*"˓5Ye]Lp7q=$+ģ29@qL: !G=Pâ՜=QQרܷPIX ۅA@R"MyLjCO|q6#5׶"BH7mS"붷 MߔYCI?cQZ335Rxݙ]F81雏2JxKk"Z=<̫ {!R-m5&ፉ bƈ]K`ȏR!ɔ2,m+V- y 6ULWzxL*a Xz8Ӵ5:XxM2$!b8# İ('S#G9"!GQ( bq~5(Rd^9eiصRJ ܢ L-A]p5 T4!B*r#^ s5ދN]_P-dacf>\Q`z" Nˍ}8P}ψ[(rJ>u3%jf-GSND>o.iM 6ep-*ZV эOoS-#IQE'#Bb,cJ"=?Ck6R&m)f6`VѢ'K#9UkQE.ҁYp  jZ~(gF$kƍ6%7,-bqS?5g^1pi>9yj29cH(e=O7vA,Q{YGi9^ȅJA_{MCPYEyQbrbk &LY~i 5"vi!0w}$)SQ^Jߡ<\TUv*W*_Әl@a76ɦ Ъіk!:wVDx`"덽Է`^gqMW-h) zW`TW B|,53Y ?fmyad"p;/[ ֖L/!7 vY{10 qǜ҄h蘣1 è+z#XoeՃ0FtؐEh)ۧ#e(2h )h7vT&S3zܨQ%ȏEv\eD"]CSâ2rB}>8F0Yb|ȒN[]V ^RG$;LsףLŕM', قGZ|+uaHtd~LD¥{N:ZŮmC}Prd)Sc}{1}[h[9\MTڊ&}IQԬG΍<&YP)[,{AO>b@kFKw&,#a-`TLJpJPG]%m"%_]4>VMo!Up P=c%"ZTeyEJ}mEmzCtLsYYu\j!bS%Zb'vQV}QGrr{eX\m[q+b[/Fec!W9mQG["iP:vJVChQEgY88Rs*jeg:cX6ɦ[ 9J2=(F4A3_}6^ˤ(&dlDI48t2hd"BiÝ>F'B^VIs ބTZWgG&Wd炴O#IjgP]dPh^ >)rU);ѓhnI^WKEayLXEb_&W졦ݵSRdW=-j$D.5d@{rXGw#cy o؎nKlDMY;J"y}xUi ^|}XEƀEl=zѦ بJ5}RaִӥE]nLգŒKȹvںsڪSNN-gvF.Lq^ :Mry*&JN66bi73R۬_fnix#ע?U^$)!QFړ@pmTq2'5qCbZœ]s I#ePXzϰLث4$YYֱfhI$ԲVR4,D3xbkTibSz:iCkOcO0㺘!zTC$Y5|Zxc&HM2ӻ[/aN;@Ϲ1ml|QgLCCZډ~ɮNbhP`j!2 |6B]-2Pb*l69JvRKGzErDJjm>{[{А z0z0Z9& Hk4G2*X\n9A\mB\z DE J$D%v KhE֩Gn\["tͲdSFCUfD(nsĘ $i\ufOށ>D6_ȧ%  u7cjt>‚$2vʖd"-S@\FƴM"ߚ7h!ɺJ 4JH64+97 $.խr+U9E;vG8MDdId҄3ȾnDfv*״+. Na o32i<%JSfmy& SHiu>᭓9E)E+_XV^Mϧ\[]gn)EAs K G7PTr23)#1p Jnc(6҆Iwbӻv2jё"z]]EPt? 0wBw|D2h!$b-l#>húI;CXK?R3=6c3mTbMQFg;Y]%^<]&P%>څ71O# +r~-2kD N@eQI $ߙ|zLd&&$j(k\Z. J$`C#߽ҟ3S K8E;Rԗ.1dgcFX+ީO30 1UޱҢ->%]$zQhw<4㌴!uT-ADJWTN&XӠ&+/ciNXYZ3 M䆇.뇣KK]!H2$y6-;#C'DbPCl.Tm^ \$Ec?UMڬyᩞ:M-lwHYmI  mƼEFՑ! )6 Y.=oD8  YV읻3\|t 2LCG$59&@ЩƁ)ҭXE\ HGaȭ<#0nehpEI|UȬ lXǁP2IT& yمYHF@dBx(]B4L΀U0D#Y̎L`jSp*ILĥB `ƬNj*"@cFZ+v .ĞTv2kª:q*2Frc**J `***WVY& >kS Ͽ*>X:DP++bۿfk>flM)ƪ^^jɦ,։VUū˱BlFL\ .6,Nj²b|}\Uy!O$TaSƄQHDx b^(C#CىJI&J]HMEk1DQ-tײ騊jAڎJlxE~KO D>Q ".cuK`(.#`pb`*J2Ў4F9J٢턬\H8"ia<2nXxrŭ\ʅM)EZv&DoWtFJZAEx>2CHor&hJS%YBt%\Z>$eq&gFdfJF&V$Ng&cf&q%EJgDdHf&if0^p%SNgk/pU6C '^jM*L>tdfDN'f0<&pG sTV$;$ajOQ& $ seM Ze0PV&_^gE#\צӮpq`w1#k&Gq1 ^2ϾzlFC`şTȝPGP̺HYO.Ff jɪx=.a.(FStjٿ,L잴2aܫEuĥJ۰_e) OelordEHG‚,2Fo +rN:GL\Ӿ^P,y*JjhE2.$$AD7]Kюŕ̟}qiTMDrP}$dV/,wSàmvZ 9OvLRvZ@ : V!fam\ژU7 _p馎yeHiv! =9md-M m. 'uLiTיQg\lJ6^p G Ȩl.^e|%#}f` n^}T().ϝ5GT}ޭ} 6USG\D%؊f/ҘQCD.bR5톌 v ?ׁG% ]xkד)qٴT)Ճ@57kȩ[&hv)K/MUdS;)CK@PM]%^'-Kc8((MhEf٘L $ݲu֒lvu̯1l3ǿSa;,S/}ҭ~*ɟnqo/$h::K=4JJ# #ES=2i⏣: (J+B.T(E#^ڪ d"3(kQъnB+EO9 0h &8H"ZQ: GE.* ((tcAςϴeI#67Rc4PG.&58D6uDN$ :>0*$.sg Me\׽aibM`r5;{b1(Ƕhp4hM5ǖ:j0錾iB 9+W?͂%ľlćrP_9'Wm:⁡ DS\׻+J$/KVB%HK~hLh-K\S@nC1Qګ] QYBZYŢWKS ]rjgR|kx-9rz:¨:8!;L,(y)\FQ44z˸]$/'M$=UDdR&y´jAr-S-(KXV3 B3W%ZJׂ`·.)] f%i x!.ƻɝ^)s[!uW5 *JتⱘZZfoqXZ B%!]sZz l@C̵LVu&?$6ih2vֳYF $''Ws!D//Rvh7&;ebI b󴏍B~4<5eG*Nk:t0A NyO$)Tɣ74SNbf7 ڐ%ө$TJbbfϜrp,.ee)NaaR樃L۪ک73[ԅ}Rq ab|!92;\qFrF| 3 L!][|ѐeIiHaCP,.?HBٔ2bif7&MnoF6qr1S?i3.jiے['G6kc(yL%1qh,'&~*Z\2!BA݂+mw ӀmJ+a!zbf}!oۜma)Ó$ e|{"JKT|oMs)!j'kむELw cں55sn;9&%7Ϋ fkkJ;e=p\`륷~nvmͮkT GKN.1ʎ % EYnM ~ed&;1 *n<2m[n0W=ҳD/m~F[)kȻ+' Oh.#-D"lbPŬfW6#$6l<-Zh*,Ӯ%MN%fW 2\[(A%F<;'δ]ATV~x2R:g8P(]s1d}Mt-YmѮ:WSB{ݤ,-RzKF/kLJJY_6I*4o>D=%t,.ȏvARzZ,@ݹ\LK;m-TChkcRJ h${f-w7mVl7g$czjn-OAa*A B*sc"AQ#eqa !+wAr"px4!A MBǖltg '>"PL #LjIvðpǦMI>OTB>GDEtDcmqGStFm4H>ctF(IwHGtIFqGu4EtIWFg>KTEtJM4HUEAGFôGIHH4GDtKGNK4F EFEPFP>bQCLIuHt4Mw DP 5RANG OMD1UMNOuJiTNPtL4EEGUKTKQL״LNSTUW4UTWUPJT/uZuOEuKIXQDTTLDO[KOagdDQf)B"bdB"aaAIjCEQN!@`ne`2A!6bo@@A-M@ DTOT$䢍FYZ_+NxI&(+=%\D>\dd.`'nOldTn[FL*"Wƪ0W&cFK*늓)bVvl*!d|B*b%/ "91}/fb`_;5 db~Y`ZmfcnVi$i}Nd@Kb`Půqiw(!x,#"%P $l1CAa R* Qdq-Gd >-).bހ >t@YBnI"!d;FިJJ$g'JuhX AM,IʩvuK+ q^.2!JD聈`EbD8Unpe#S;e!Zz& -vXH<΀+q2$Up(`T55FIɼrjB0BX3H*0u6V)s$% "_2 B `326t)!a-B$X.Ty7.ƍJN7Uօmt슒nuLKsF4WawOk{Lz($6 {cf!ayuLm%Yf*;ĮL xൠfGEdEF|r\%/Qa1.`ğ\O% o).՞<,IEPD=G@I!YVa u??ю}+As 6?kxQ- -cjQAqi]>wЈ&*V0ͨfKk!\z%N|mvk c ffh5x'1%mėsi}gHźtHC2w X-<;/!^7紮f(0DFIJw0Ժ b($ ~J0=Ml 7#R)$X`Ӌn֤Dj"*fp FruM9{+#΂+d{,¸j? [?(/-&n{k#( 2tip1dWj 2mLf2W 5錭"ms,(-XN|{0e<&Z~!55xhyZQGzrۙW#AH$sYE}ޠ>E-^J#a1烼&JSRvi+7iy$b5e!5y_Ԛwv"n1$`q"d٩]MsZo}* 9hoW i5^cuݕ^}'Ub:)eșLtE*$&J.F)vqJmY?O))_#RK)֕QbJx4ƮPu4U=Uݛ~k}핏}Tǿy Ѐ?1s .aPDG 7vp"_X/E2NiCqLCI2Pq'9T|X#N1NlE/*#a cH(M\c 7Pd(+vb+Jb 3qZt:1$/dDIPBKlr@W(=NGkPf&(2)B$T|jCuMB9L B5ƣb,RO_)zAW%3n>JւRWO =ތX*)S?Mʬb3|%8´ZHt3Mc}iX dFjz*$pbk7qs_!RMz6U' x[1}$D2j)41_/o<]$mL{g$f_FMR7kh2i HiehDLpj ӴݰJCevQs)l5dU# JSաHٱs0m9S&]-Pu?u%툸教S>o-(n"Y~d!j){#yerf盕l^Ljn_*z֨$-vU?rXވȵuyT1E_S( 6Oq12)jvΤ_GQ;f7zvaXӱb_sj3#!R_~O5&K7uGoȵ:LQqH35a:W([U]yjm:_(bӕt evV'O~ҕ8&5#Og*xlRa0Nqd0|% WR!X<0ou6hc(xRIz$6Ul8)@7Pq$7&pPb%5g~1,4;cfE)ʆa:ljZj0f7;1iq8b99 |K(|aGz , 7ysyugr2B@2}%.tׂBႁ`^#Ckz(uAl#~U`kTd(o)1ZX_CO$f4{|VhRdžxip2ffSBk^)ҏYg}8~MHrjX"u1UrPv6(geww2pssnAnr!5fG)'-8淘Bb8eqgSj@R*#lQp]U:G;6*2V[IWr$!On7POQxHG"W<Š,Wv_A]ih G(/}yUS".czi]&wzpl !E#ny[g(FrH+c$qXv!z96*Y`9p74Hhx UGgz5m+Ul9tgXbFr@1Ew*D&{f6hIW7`&0MvRgOȍH:TZ{2Oh0 +7kR,t5' sUGvV$gg4#ӑvk0+Xh6"H`9i0{-aj2 74Iʎm,!C2y/h46 z]F(y7cG])ZyȨ.Yt3:SQ2" S_h"w{Z. y0 %OөA 2!QE\Rg*Y,98[gQertsR!f4b)cњ?ry:f%pB3{IWc7$+˱"ۥ`1PegIA53C/)ױzf#R6"G!es."MtѶq%2c84cgŠ_%+}~AXSc48;8'I\?q%gb&'9+&e kc2 HS!SŇK榑,.u!'qdj?%,h;R&(*9c+$ );x2WjsXU_F"B#4* Kg^*V"]9wOuRdqDDn 80xDjHa$Mk; !;`kgjc{(0yk8frxq2`hfOo'Z*6ty!0k;r5Re(ך+՛uu㏓ ~l"^)%75vJȬlc˫էP$ZUtnh)WXv]Ѧ7-}=^\V¶u ڠ:#nq1"8 )ΡұwXmf7x&5 X:|!}15eS BoBrqMB;u޹V4mW9R|76s[tei'jvvjwGEN79A]^31Ulbt_odUA2&:3QOildm ^Mã$b_@ œnV7}|QR75lW'=u ru[ފ=fgvu=t6HP.8ǒ.`iT}.;zVl^Ienj.&u-KaȨŭ6]~~8U2҈tHfpq~SREEn5X ^'p%f"61=Tu! >aDrCšu";qn}U̾'wC͏chsE0<.Y53.-VRBq?7i{c":;%85w#)plOgj*9\vt`/SHV/Wa`,2O?uuq'7qCᶄ >cT{ 0w&~^G"I/V#KA2:@kʹ:)%m/ZJpîs$Xk<! ޶ShqkP273,L5r*'vź,Rf02L#c0MJ(4<* MC*,)!fKj"jZۂ4K ҚJ鐴h,C>L%k8WF2:J* ) n,Qփ?R | j5E'Ff!jԬ HpSI'Ͳ!bs/]1vm> TQLr7)TQ«&)3")}aLiÅs³QU&ً NJWÝ)xGoc*h$)b ԀfLiM=4DU"S$}pJSCEV{gbj-L: fk}іaUsRrE(1&ih Np8$_7^ Aw$|nfʨRbXEKxlɺuȃys`>ZcD|@)_кn=UVB},w[7T;T*՝[GhK0/ߡ4 +F=4PC J(et-)ꔻ2gEb7IZ!g=WB6@[؄t0ޢ1 .DTtPEx$6ȳ|b-*>>39*VR]Õψ[)I.?P@gĽp3΃$Z7,Q0h2MƓPRP:hRGX\(Gq>Y gly$1TDbBDc=ΩVP240&G5#[r@(SՐ@ak Yf p70SpڗL ڠQe#(F"4P;& NlB$O=CZ$5 Ck2<)|L;AQ6{2))N-$;rpO&O*ђ`#@T1"%&K"@pBbv姵gZ9 ,>#Qao2@ K6,QBK;8Hnxs[Z;(tzMQU)%l"*O3;)1q>yE:Vw&SjMUˌN "VI8ʘD8@åP"Rh@m>P@ChmzXOD1(d#o4n{bTaC"AbmmE Qw2jL zQBz(w˜;ɋ҃lKہz藼. #gbKo %f_ S["p ݲqq(}$Q"NDzZ(l x4o~vv4k}C NyZI{x zE|:2Fl'_[eƦqҍ3j1 tٞc$F}* 5$2lbRtNnZ&6J͑>C/:c*.b p?;hhU!G&QhX(.m=`H@fA}qH;4K}(Bk\vrpnR`h4d +| x`x My6v ?:jz&b^]H$" k7 ޔ1`}ԷZk<j#d-9x[ ΍.@Rg:ҕ{w}?%$?{ q_\:7lQt>V,*YB#ؘOJVG VK$X\4(0#ڃ.Ĥ8IЬwIə~q%C^44zb-}4.0nӇSXL.)ZxbIY!Bp)e4 _[&4b+*A\3 Fș2 2/OӵCh0S`d)X]H$Ą0Ò)%,2ci|991 ٻij?ۣI9ܑ-2/SD`_IUD)ڸS );4k>J渹☍ڰz1s8Ҫ6k{W**t  \ZrђxH4i G `Pc; ;@P¯4-/"'S^#:M/a( ʉ BXm-Cj&Kۭ0vhHSE T+"Ba d!3PyVꫥa1X1Ւ+ak+*w󓹠^J)ՋAA@#,BEN`|F$)sLF[V >`h(7ЈPu(ZYB(!ٲ9XC.1X #xLXQ?Lr%:[2$J*s[lJ)X~yL4nZi%JUiL%[ "L>ŐPHFgŤ/+$ ˣD-ZbG-e[Ffu7##ca]BK+-yXidM4]{a\<7vW{ E뢚0p$!Q,R(=*+Z1{PW=)@2 P3l})RbMi] ( ͋9?T3iMx+>$#PE9 RE1SE`V5Z WĪi˕F%) ,[at؆XТ"i6cAF A#ҔʭҶX$KKB p>z,R2m271vCىSM1uT-M0:+g4[$9-AR_yk={ b3!A RR&k#}['q|)x[(AL,`XU19zHXٗ`I؉ X !] XHi ߕ1rW'DrwHFz-:C:y $:Zhd > H\1ª\9MIܠE)3.PJ^#Q`"0 )@S3Ńk]ݔc>,;rƼ<4 3d4>IJKEˠ&Ϳ!1ȄPePNMޘXM2шF -#սF~3i&~ޓNjke!CS?Sڞ@y `f:NAYŷ=m;ݾ` "5[9mhŎ3[q`DA.{#g(u1f4jaa)kh] m_uq܉F-gQ@fb~It e8#?*ExُeYd6I$[4Dq\`nr ؑI ﰢMQ؊4W_=28*kS ^D׈n\VEf[]K7<X ɕP m:jT@rb\Q$5rM1{LQ:۹$(B.z28+ d A|AXdE1 U# +it+PI`. YaP10$y -ް/o`;aNQ< :tmȲUve~o豘v' ?Lw-tF9 \y[ 1(A&gq,TboTϠF_jJ],dZ8mmT9Wˤty$^3ts?$A"\\*S" "顰3~_pĢLrfJeQ0`et_IZX M6_Z 6jXkj}qx >uJ660,d+vc% ОU]8ԦK/c4rrmv؏ڐYoM~ʄ!a"AJdP :\`z b,@Y_i N^FuJw PL߲}-^B ıo},3l_Ä Bc`h#x4-Y)r"=!)ӗ>k>ˠV2Pl1XSdNͦw-z &HxlvǓV ]wvK.ee݆LaדVVNv$G1fE~UUQcs?zEgl5zmVN5kh8Qgo՘x>gu%mXVPVv_i]uL[S6P]lcfujhHE*vLMzY,-Ƀ 1(&@z!ˀc|0CbFiR͍KMNՙGpH9*٩v[ah^z_'~EMf_g]vCJ'hM^/o9Eڗ(w(wԵT5uf|"jzjVX"z1e7x9.+=lJ\{TUq-ZR=IJԌ$0 [tS$Քo oPT3[Hf6ZX(&6(:X䤡`-cqnHXш!N;hv{RtLmCOwmFc[ctf{246hwICW|j^+pYӅU>|_uذxϕhxBy!rgdho曖_ڢy/ΪW@+3`t5cQ dbҚlf(VqX䩎!W Zz)thD'52GO[[MZ ڡ!Pm2XJ.1ć@Bq!6Ӻ|UR%Q"_*#P/I+Yb7,R+3qy&0-]qRA ԝ s8A>$MD }x-Yd3(xӯB18T%CETh4%(-:zqxѨGt $D٤0 \('wz]`Iz5m}^OL@YYqIztKT?OD ]je4&3é !Z1!Z0p I/b( #✖4$Bf ЭD :WK&DwcRJ*V?"KP `&]F 8v+gbRd #9(,z!haXOBϲL%OiЛNPt e(WMVM2X}-VPJGrޜS1]ӂ."B0^ È:IkcLְuRd>6 KB̠AʜS {P2q,ҽPBR-2u19jV6%/C [ʫ哪H%S$c_BhdphOD?@[YgC7;եgaHx˞M4eEbLˎN [R s27 kn=(K{FOwlz&JeeFOIa ,,îUFBQ_Z!B!F "MH+h,F0{TJ룻n^8Y} w%"A2t׺-D:/j4#\}vɼӎGԭ[(T=gIWќFs=~^M}au)QF`&fҼ9~Ce7NNuYs[U & !LUH`cs&xyBD-DDcF|x"JͰ&jYu 5oYlf-L(LFy޾>UZaDb"s^ቊ)QU9uZשO1Z}*pWoyVSdQN`yɨ&f@/yvo@7Y{ܪlƍB}}|wj[ɋtHeA+}v/N Ibs(&U?MJpMT])Wn0Uΐ6u0)R$ qOL@ڣGDwLq" H^MRnxl} ͋y$NϜPE`ʪO4mZ=M\q)Z فYʎO8 @ 2Wrܐqj|Jei]օR:E(LD iDE圼W܎o!ٔ8KDyZ5^$SĐ U ^ɒ_hOp[eUGx(fzR9OX- %G]P|VaqSɭDPv`iŎ\?Ok؞pYn<>QA]./rm@ ;bU\1$#Չ ydX4L[:HBChDH$Jj&XH18LM:!*CJN$D$LXC2N*IeQBKK1$Ib2P$DWVNeC^OV]VeMX‰WZVreNaTNeX:dJ:VL[]XrJ%cdJdNI*&febd$g$f].Hf.Afj2afdd`!.ORZY.mWmT$_bhv[6AarCBg\&Yt"'k"%1x&bFPV]ij&S.UoTHNhJT n`@V:Dy!z& A&DH (NB.h4"@6h&(hf(:h2t$肖(~hjh(h育hV荢ZڨRhZ((h)6h"(V(Z(h.hri6(h2) ))¨ibhvhf)iF蚲h*(.)^(FNh*F*jZivhAx)DEE ^hCD\NM{\GjͪCtݪpRܬj{tѯR Dr+䪬D"~+2Э.+ZĬ c*rnrHW[zɯ*XǼ]jr̲j{+pj+2lįfѴk+JrȖp,˾*v,z 쵺kΦ¾ǹ^Hl~+ϲ,+b6k*K'Ap ;i~QnP]I52ܐ0M]E]Hx NBɓCb-M=xJr妆H(WQ^SZpOQ殇ܡ8rFQt\QDI,yJ{FkZiDE|nwTǨLb.JYK P O*oHЃTQy.oH(jmEomNo9eP>]D!g( D1lx$y%wnfoF&cpIPu6$R0x&Lb&eqhcn&yP$ ^fj. ;fI%gfX6m6frni'e %1wZJ&%$x:f#S }j7_fov&er6dx%k1yKeKLpYfd |qۥ&}d_`#vd'Qd #$$7& eb:ecrUbq2H$.tk MWC m J 8Mzk?h(*kLP[Jk_`S؞,*Ϊ.3_<Gl?tMDzúER3KF3!6,vt:~"!EI.=lEsUV8˹ jKr EԞVsՂ3Ų?%>l4E3kԟ cAC=F 9l zI]]QDv(HZ$Z0ք8>o#1p &iDWޖu 4 Unty.rO< dnvT <*=WJ#p|Y)@ ? LTնddJ$]l"hU<؞Fz.B($\ =IJ|^4.{Pr#hBxO}۸c}V#F"EGbJ0G,L$O`M/E1AFOwM?y+ơ2|IshZ"S&ƝhZm˴՗o~|jRiRc ߞUK25͚nSIxkbXO| Zj42I Fd#6+ܝDkʮW,)RayμiLug8Zbȹ_{Xd|n<2mZ['43eI}B)&1~#CL@nN{2nS;o2D9M,Zf2H THu#*N5jKLZ=5MH%֨5_eϯ-_=&k'V鳵]~JwOڀðEܒU){T#O?6+u\[z@NRJ6`.{SU3i?tRh5It4U,0rYҀqܵ2q\X-ڳ94ϴNQ"IWc؆j$3iG}Xa5vh]tUTѦOgӽ5WwL[C΢,?-5Nא:T[K K{݂Meb;UP-{)DmtP2Ur,i6-l~SN-=րf~m휀`^+x ѽԼqi%a_v>dڔr.Plb!`#4Ɛ݉Hv/ڐHlokrUinq!KOPylS*CmK̥?CkaᐆvOJ-EOϐ2=l@'hky0эt5r3,^eΛDu6V/c7-mGcGFYgvQv"G? &4B# ᷿:s-e<'h+MIX$S1m>v /|"CYQ&|t1L^]F&ƈy,Vd'Q1SgI\,Ŋ=T!CrTGC0Zdg]F 3zؚT^+O}($O=41,g?)ZvZ@U)p]͗`QcVo+ wnBхPǃ ƮyNaP;hiCŮqȈx,XʒZ_Vtl4HX&؅ViT`6kX$:ek¤fjTI񸙲C2!aNs#GCY/DYs)t44AEpRږ/SaQRnP=5 עmB`H-eao$\wS̃ @ MW%c a|N.#>riI1e;-XrL\SjΜүb$`^%\Cu0"bυh"ɹarzPK~^|mMbI@*0ˈEFzH*&{DCziKhd\8.N2l0t,( (%"o D;cE%vޜi^46Epefq6&3L48.lDHG# *UE%nb&Rbj4Ca &3l2 GP6]pO!_(`g/3#'dmƐb%O?"].h0md_"rIT/E*I3J G W?8@N:vu0`tmVh X(8xj(ⰸE"e$g"-R'n O7gg@oNKŠ-B5gb-A l2!PR3 6% ka62b`6_V<kVIfKk+O:Om$XlLchQrC a/#e-(2kNf8lF\y<*CGtxI[:f,K͔@Һw6y(FmW֤Qjx6hF1Ʒf(gEDIL9&e!^p@ 1I !v#ALAqC,pAp@ (3r+M$<&Ld<*Ţ9Wa.12e|N\Ԁyx7'#V*B$,CKy M"LɢBd1 |PEJ#:m'z t6?Gg甎 evU}n=<*QqmҲh{pkGtSNn Fkt$ PSfIR@ĥf&Oh5 cp{\VwGBRoCę9+:tSJC+bܽjdy H\ lk@F)}Q8tƚ ȧ%,?K,cfD#6eBBه go gb\ʺ3R(1<&J8J+5iKI"j$Yåʑ?ZTQ:dƥ?/W[*1DU&DRit8YkyFݗX\Qng}5Ad}E(]XUX~qؐnme%%ufwOUDHcB5!AbC y DVfnXJFesu頉$Rx~lwiO(ˠ1 GEmtWoFZ*`to%SpeǓpgaRj|ҽT (LDӦm$r:U>*^(r8U,i -*N_duz$ 6vR.&^TV]U3AٻfۘHM9bcw-ॣEu檳k K~њcF*\BPo5E믘bC-MD>J\B,c[ *& <2^*ije"zy b)YWKz עH_}(T[({ESۖJc3>sx/ѹS,\Gi5j:j\rNUbReam=qg?z44K`zI5Wf-wmpn4v& 5-otgTҲ<iB*CѤQ2 {=i:aXOßϯ۟x*~{#V >4σ[ 1nptM@Ib!%@04e0La wBQ8aH P{"(GmXB1 RTl S2 eFt#eя8ǜ 2x#"8@qc$)E$!Nfғ"H$"ORc*iQ1e.IyFܥ%{i`Rt,W@.<&#iTsL- Qd&9RL0Y[ 'ť4I|0i}>!nvQfi!G+te톄 mH޹jzVɉ3ӂMLiu$|_4.w8-TuV0MVfo~񦹢g;mT%;Z;= y%e0= A!5QLxm Z#Rգ̇lh4![|iH !(GtAiQ)v8 ز3SmM:ˉq:2+{F"zj[l<;#­Mkq8+$rcXi(b9AYRB[x*L{gwe)Aa46 Wl5Z$"}KSEhJݵ^3> 5>41 %VYMDf>x(ꢧQQ'ʹT' 1k =,ʋiEaGN~ݱMb ֵ;;t\p#Ґ夙3.}>;LEp"t Aia2{PzM1f[:&r!I2}L"!uGe@51d(&zR A$"ڧ$,}4[+{l:Q\/\z4KE2b ,,;!X'Z聶1VSw9 a&y"r*F"0 e;HG-Tء2?%3}E&X-X]|ltC)B#}U"C%}%!Cshb0 }7'0i`]'r]8(? r*8*Ab'F`pӂ/-!vmi,6`2>1ay&&#oC)[xair*4.egE"0 7[~R^fWmFwBz!_f=0SskVcc9"Z*}z\rXs4!h3Fec1,_W)!0 h^BY 8:!+3_ ivru."'2q7vc#!؎N&ySVrapjXT擼b426bŋ~Uu2f7^p\"b{`tSfF']izF#P|b831GhA3Hz85Bc5`lGzSug)^[ith1M9,dX E05#x&2:V #4p'Qy}z&%q5(t}ӘS,׆oIeQ1W3sesU$>yhs3*%'v,*WUpzх6ͶI^刳x3R3,, )4a3͕ jeGFb_$lR%anƥpJs CKFѭBkGx:_Fb|[n;:2ZzSCRVi1b֓[jp`ףDےcdyXZbdmz=x), myTb.z3E/=j[o~!gsx%Ɲ )w> ؙ' XK^i0oT{{ A1 >!3ӆFR#:n!)ǁv&[fpmFxǐ9xw+؈kF 63:sb0cKyn)s{aDY AV9#@bΫu`g7ֱ's2zz5Fsn@p1c& k%j0-kc$lUfrl)hFSg(cG0KjԿQhTo9!̐zj:d}%mgIu*bdǓZ*xɖgc:%!#oq[/Byżs |06g.$45o0ɜ񺆫.8gvcfjEkg)sy_*KU=[H⻔]12Q W%$,]>6i{AR789(Zʻ}V 8UxEQA dx6%|udCu7xm#^T{Z.c;hZZ"n[#jWXִ5ZC㭊ɼ[+!j⿽U>ly]!\h'% 'KĈgf#뇡retjGCל}#9@c6 _Cq_2) HC)6q~ff zm8sofw|k(x*zkYK!Bs~y܆ v .ReQQр>h"-PΉ*=^bdl! "YTsF3udGT{F7xՋ0$n:lv}'tzQulb~Wո 0_4j~X(k:|<&YZےn]<0d~;ãg~FICyj*Q W~5QO]>u h#by؛yȹ{SKLѐ>W>'tBA/}+ VO_e)< ʼnIo>B>CDI$G $„+.Lq7G(Ƒw%XQKQpC r*P ĈŒhkerA&ZQX5k̛xlX#%7c˿d$xq@lvP/HyfEHvcIjS.,)R#4tWi Z-[漝fnQ:=MPS.FPĢ]O24:H 7՝)V$gZΦh?*K&m9 -R"4ȿcj hT" uJá52ڈB WBM0XPZҍ$&OI(T #/EtĚ0̮㪶BL8Mҥ`GhMv3¨p:#R ";b5$+M?h,Е~E:VZE(med=IM+8/hϱ K̄EIDҦGʩ6!8k͠Ebb^^LS&fc܈FulOታ@jv,((Jj:^PK4mYl ]ЗVD(w 25 "HJV0GR2uހ`4- E>IցDg3(2؀꒕)%/UW"Ӭ4fw"?MihZ&ڵ&jh+D"CVPZ46W{[ʢȧN\>S2nB(Ea,J2լt/1 q|l[ZIgVXLESLG\t39q "X !Cd^N$PC){Y`¡=d\vDJկ&ӾԨe7TL&)0qbMa`O4!19O04(J-\R^`(I @Q/QdȄ!aT\ŢpZ8e`߀\ϱ "z(Uœ7mp0.Zv El."iB vlN ,ɝaИb0A1E=-"[F># |ؑ3#JF?RBx'=C3 tQ>XWtu*Z NYD(vWB ]\TaD%OKLTKi$0-"RIzx'! 6 k"#%0_,S*}ki,[b9Kp4([ό *KhLajAUNMQCLHIQK9 W+5us1qJ:w&x! )Gq"_s,CD rHja`K\!c>Q`xn,"`Mc;Oa":!r").q;{,eDcH&j6R$ց>Q]xC(xCY-}hKؖ)HbB|V+=*k"S*Eд GIl2/T诿EYWv,+S3`Wtnb:SÄ2&}5[>- GBP4TQ| g;4[2누u>j'pCkQk4;1\4gX>Xͺ}nYd<^wcrՈ.G2 `@ qU1Dæ9#= &u Gފ H1ʴkD /ߨ}/Gis&Jrc~S=gY;|حCCɂ 1U-{Sپ#hR~6#qaWi7< -IV!ب @jbD&4csS1IvpH$<ʶ2A!uoGDxXąׅ"᠁GBdFǀwێljH @c}h!W䠑:翔->̕ S9a`=J,J$EP+<04PӲx.hj ź\3+(s Q"K9q"0."60:ڥDa.98 F-JVS 3 2.cMԹɧlQQ)jʙh~2&kȀUp6M8)G+-".[6G$E{R=àB)rӦգVCIQ3IP lsSj.9#AS֝ANe&6ۖ}4  'QIҔȔ^,4BGYJkנ#5-EBL.Bi|I  5hj2( Pk (9ԐἘ~<&y,H9X ;^kLxYA#l {{)V 8 N;xj;ABڴ8.496M5y:I=1-%y;,.%b ݢJњD\4fdx'H̆eR[(R8de-sU,p"P;"ܪ2!b/C^HZHޜLÐ-(2EM lzY -&VBu,-v:!\zt =-ֽΊ8Ⱥ\?I,al:K /̴#\ T ژhf,!FZr]a!D-L cZB'&Y瀐ċɄN4#;$v4բUcT& PXxa㼽!~(9[XjN-zǿJ%ہZ-YrQHAl^)MFS<. +=m*٬9TƐv.| )\ ٔ]Yy[T [ʡ1-]N* Y)5X\M+e-X~ByEc͉f4!'`Tm2}ueHLHZucOzAi&(ڢ"lQi<;琁 9H7 PWZbݐd-c.Lb-'JjHf?'X:d%a% 3 d[:LBo5hni,<ە`\(Ҭa9VGP4([^7ncmZCD1`9IТ\- 6B% D Nyy|.D'vB" rFQj3QC:k1Fv4Q5sR5ig}lȖgo+o}ͨkA;0-XaҏR׸˴HxęT p[p[Yt/3/0cXiyR B'§Q3ldaLb[]JV-&: JzX:hH.'@|M"dx2Ls:[nW.ܖyk;xGJ+A ʡNU uF\XveKv_*V++t? /ojfC:MXbGˡayy& MЋe"1@&FbmAAe2[./7{7^LBZ!%*V3PB aY2G 7&ol}ՋF0Z=h!Tp} GŁAܷ0Zƃ!A{q>bLbɏY&ѤD IGK!I<aŎR#2u9O 뾍 5 UhO6xeı^M VH}Pdˁ=wf ta\B ZH؎5k*U 8rHFSn:$IA).KmeN^Zue\eE1eb2ܧ)$PV|bDɡ5ODvh3>șg׭8QJƹz,K:hy/:)x4dUDT=OUGϙFb axdE`a.XgP1Ut^pGGRGQE`֘gR]EUg(a-A}o Xd7Yg,މ'iS5x&1Ԅ uX`Ny=P5FVLEL=ڡѬOM`>btOph 2 "G)ݎ3EK&aYͽeY W5\p5 SuWYuUȦޅzUyU[s-M4yr+kAgV.p6Źu֩n$Oٗ[1g.)k%R"WX6!LZ}Z$FmdvR!]L.x i9l唽RlZj$m2DY[oe1F4it>iLmW '`ct)$CHFX5JK9Fsґʤ~WhyL8`Hllq2Q`4^UpGI,<"pL>fW9W2]VT-Gl&X+ƉL! fbΡ[Xg8[vկE=NDZJO)ҵhT GɔȰ 4%$EE3ܓM'vQ8*a3b.>/`v#I# xԖx w]GZYL5LZLzoO!@4%<6z笷9lIˇl_-K cy/K9tRjUt捉E02$I0 O,d widز#[Ȕd) a^I ǃB59ej@ln9p`CNu8\HRs9:E,\v&< ^#^3̒MsC`ĄdAL^26E ⍏>ShnQ%aEdJkT5;ج."d4ZWIx,¦79Ġ[Qw1>QIϸ)pRH-EcZۮ> }:ʵeIXâsr+YCɵXGoiGs+BzS)c<$,i%J!4 E@AS;T,3E=pూpm8$.uY7̝Da@*v}Vd"`d_J L:.D&RpL+1Nf[hf`k$UaZ |ԡO pwXY!F+q ˡFQ-J1IΒmSc5t! zDŽU!ӄ}TEXh&T,P&PG'yCH$-F@Y  ]9Q)XXT4i@DӇ9ŽH <ϲXԍ Yd?D`F g iT&"b!d#eO]= Ze7bܵvU~M?刑JnVx؉P!b|ZZƗDJic#ؒDr^1UiU^jiZ`2lZnB`e%bfe*1&((CeB5zfc&di^#j^U`%j&&efdev&dr&ffdUA&db&lzfn1 kfc&q*njnf.smZeڞ_"&`v&l2&qm2,ggjgufp&`Z'ezc%qV'rFhn{b~^egpnr&~fg h{genjgtb|^}if}flowx| t&&f'btqFsfihh>'|^&h}(~e%Z*72q0EhL4XALp$p阦Av)A&))i)鞂)i~)*)iꩣ"ꢆ*j)r霆jibj2کjvj꨺jҩjj*v*+ijF*ꥮ)>벺*iR+ک*+Nk*Ʃ+jziީ)mK*iu @IQlZXVf\pDXCTW ,dlw!lt JDXCD2~,r,j[N h Z,llItm0D^,ʚVچlPZ[J[ǎڎǎ8 S&юWy\,!mLRx_PֺQymYSaHdvl>-Iƾl,rRK}- JHʔDhRR,-,fb"lw--`lqLJXFCHUx&2pժHZ 4͓;:LH )RN`W=ƪBl!VTo-B|̓Bڗ^RVxdŌI4XJwLtxGf͈2^/)Ze=|)VG~̄2t"n> ZLLo9DdNO7D/mYLJ̈ Ub=LG0 BČ/@ -De(}f1'gheh:hg1kBh}6fy^|fqtNz~6e2&agvo%Ϩ!((Fvf3rfh~&rzj2'.gl&#gq*²r qj22)2(2f"hs)1)f(/}޲n:.me-(i31ϧZ0qp3eꓤ q~iFx@L4G>,W tm!B;Nm tUxRhϾBJ\,INH1_ -(3ҏW`ݮjDZJ i (At@4D 8MmZ^Kq8-tQl[҈E״nP)u \ ƚ^SMٚOj8tW\YJ^PJmQ侍ĒBSlQB ʾ*YE(& Lp M-Q9Eqˍ ; !`5TGXCGݻ H@1E%JF3X Fw?[ M8D^9 4M%͎B JO~+@ ;Z|G/`l_`IR%o3Y,\lYXaDXXCIU~Ҍ"P^P21@h!} Z-݅Hoa"E2nm98DKP"-_`dx89`'bh*Sll2B=T'0Nh՟Dv 1ob,:1yptRHeK O<߱u^$L*䉡w= TUATqdYTMeIh~2LatQJ6R\Uޥ e. t&lTbuxtUFLD\YvY-I?wz+RpǙ% ~֭=@ЋFo}MA cPDa,oA(2$ƎAa y$ȍ{2ȓ\hBI&B(_JT A8|(Ig+RRNzqIERTKhBhS*T!,SvmocĹGtݝ3.It_͸UAՙ1/A1΅lZT% '23YFSF}QEoU9Dza?m;3D˳R 4Wmz%{{wF~(>p&k:M%xrL:@ &T Iފ$(%ϊ,8몣 o̠H 2*!(#8o1HǦZI:H/mLI&D[Fa2о'ȸ[l%B$9| .S*0xRֲNd>z4Sd :8kT.GVj FL"Lb(G<4@\arɴEӎl՞mλ[\ |Wnf|q9=3/}uּaeMvQWQ[gy}y族}X^F;umS[h FhǾFv|ߗ~ӝ %} q[_AU}[ w d׿`Bqp,!6}|;x 0DB&a wiW,a n1lZyHBv0 @+jB 1bktEPklhC2B}O -<a8h)zsP#W*C@OY{֔-k[%/q9 `r-mYc4flYLh1LibL.4|46əMisdg7i d3;9NZӜĥiN3 :Ng4GiL{riH5t"42XO,:JMo"-:`Zŗ+i.y0ب>$Kk%M'ND.׎T`E*$ XAѬ^0&]ȀL![W/ƒbbaCjZ#̻G"5@dX[ܥ#J̣T`.MJz¢S I#& OLhM"(tQn.c^`>X,:pm&Ծ.TBKzd8QAHQs N({e0/S1 Mؖza6U>FM;fQuNF0nDD\QD,Y^|%- n<2CrƐ0e/;f#f:^p(2z OO2DQYޥ'&"@$O.Ncp8# ?x!l5>E2qVM\lYPLQWHf5f mZ"Q'C,' #Epr'<-LK0=aƱ=YN.pO$..W6 4f[lcT*CB2 mRگ78@/M1$o3)63Z0H*.ؘ"#'8^Dcr3%=MIrcFz0B5&sFNձ":^1V .Eyq,C=0E#M70=b\p"1.qP "36lH4R3>+ mD^& wܸOL`\ 2"T[?QA@8^d=VP0B-08,VF̓<\:.10xcSl.R5F3V<|%F2o8N1-F yEadL֮4:(_E# [t88̑1])M`o*?5RpL-{$#8`+n鸥TFoH%5@q_@.ӾA/& TqTJ9Jt[eU1-CE&Zn"nBa#[2@p5'3Vo%@nzN ^|TDr3G# >-7FaQ_"J%6VC;8Q_p{^XS?4sJ+P e1U0CTQctM.UR,)MDDp\/>OVNJPOd](Re6a<_U_6ȤoMK616"J c̷0a#r=t_S6)%/ݎJSqФ ;Og3N 9.\ ,״vcе5pYL0PKtb+aN#e/*U1\iwCN3:EIѲ}OGTT Mw#VK,)\%YBO3d}@:*YW*c<5XD7]W b[2|.SXLw D 6V57:`MdnCd M=/d7U쒲LVX+n;96)m:0vv`9W8q=E6gH-=I`WBbU d2R@*ോ D7D $M7~{ ocWNhlgV! >XnanD4xoKԏP6WцxEJ]k_ L0 ,W-N1隄ttc֓h!6tR/+3TBZC pC4L>Sޘx OHeR}Սl׵:m'FլOPN[ۚS%; $ĕ]IFL9xdKvhM{MuQdT<I6JBdzwt{TLMF2ATa&5B#Jne97E 4$ drK$̪sBͪXZ&VrAX('d%Cl+^Bh%P 2nф]$xUYQfÄyuh19Jn1xyx-R R i'YMX̫ wmY?=IbbSIRfg1/FE<Z֣ -d+*'hgFfF:R0RfhF3;ԛfXݨҤg&k8j}8VѣPi} Y]洲[4E1qݙA靶:ESϤxd`usF] 2|ڃL Ra/E"R9BNA&1BIoc@;+2 YZ1T&^2f§gT~F=x)r^_}_ERC2p[T4{nY}?hYv%ߨu-΍o،p;Yrd/VLJnH+6;.UR^J4A plvUo/&dYc5XU8:xym3TžX/LB߾e-ۧ hKOYāAah$z K<cI%ty4 2gJ2[愩@ghʼn?"PEKZbJh[1VVDIr<1)ׇW)vmoBXSfdXu)Լ^b\XՂ!nnBV4[UIJ)եHϾlU#]m{qШCmMp8[yEdy*ZB}.h0in *ǾNVi>VEֹTj5M)Yx {eR8`>N-a^8Sfu[}r*Q~IgqEV;TleUwdX8U}udGaf$%w=Y%Xx@FXqkQ=5m2UL YveButU_}i։址ٵIZ]f[IҟsWh` tdiN}"UQjB ]"FiQBF!JQQՓAQVG1H¥L=}tG\;LGbzrZ YJ&bn{㏒ZjFF|(or-5 v{'Yi]JmAtb'2btג;EiIXEbm茶G \:-jWgXSr'Canx vhUc.1p@N;x]}(b2-g??"*3CTH<,͡]agֵKZG_kՙsFߦ溙tZ.a)V[H6'VN.ק`>aswͧ'em{UQۏ nr~|;͆uls.x6'Tϡ59ɚXf.\DopD`qYr 1d9`H> 0b yRD%? g%H0dp"CW`xp$ј ,GH% < )kJ&N3xsa IZػj'Hc!@\T2n 02'w,PZؼh暧gQʌDlw}atB1Le_VUŒ)KS[Xg2䤌֧렎ItForedvTkHL$Ygt qb4PD$78( r̃ mk"y-mHFq80$[ B WINƀm.Y;*@x^ux6LScJQi|뉡RHF]ZmEl~㝪U "yj'Y'Oӌd10]qcYzDj,A=6F,JՏF1Q_S҅EFq\˥+a4GL,P$8l2!`G }sO}0"H/zUJ$q J0(_- t\<m4jaz׉嘻N#I)h]ш{ zb(ոqhW?VAu2N'30FeviM {;<+]-w\N]Iu#+%(QQl 4ǔ%fd/iТ1?sj1LnHVU^U=Ċ\n]p,{Oh,jHr)kNEbEPyz4u(D< ))yT =plJ;} c,hkK(RY2,YZ݊1˧xh.hs= HAjWٚ_rj`(e#(4NIcף\ꂤLK ]1!FnZJ\7}bPb&;i، =]QB7XD@QOy! e-+gCMq98xg@p((y`xFAPe)>* \vTr9XP8gN>J.LtrJetxTG X%%aNEynM:uqI`ZŚZ.^76Ԉ- Feࢹ)^>*]?6$:r+bSf;x5r}"x{*g} C0RX{(h({5 ~B;48"&;Oڹ0G=[scܟmUTKvd2?xIV@auWj'vmuKk$w8@cY8("抝Kx%K6'3CTw3%%1b עQEoZ8Rn(S$b?nq娐G@$#.Wv{u X}\ 8'PN}Xpwch-E!]7|wwq!y6 f8q}7-ws`+ǒIpW2傟R] Tr6SkdS1Tcaw:ñG@SvD#EWc^KE-$_?xsHW\Lo 2`a#֌tT'xdPS&SEaxe94w%BIL( "ۅ9HF%$K$;\&/9|W}/Y}GdX{v Y{i,8ɉI~&9|wwhy)](c4T7V=Wd_7fKAGm1=sh0u>W9bBL}@E&D'f5Ңwp.'6e#̈́`P.#1c^G.TIz؊;9yg:|i(1fJphpzalZiziQ17v26Q0GQW'E#/hKbuVb120<# RW:xRSLyׁ60|q=HR= 'j2b_4foyM8vg<=^co y$(y18:Sc"CdF2cTu;ZQ<;Xfז9v3Z.d)sԙipUĆ)q٩oL,QwW2>5 ¢VT::,XXC% cXnXX]z5bb ړ0ڢMڢک]ipڭړ<ۤ۰-۫]hrکۦ۽0ڷڹ}ܪڿڙ@&NB:,kQXY=߬&~)~2k2vt=7$WdURRבffL j4ޜFF'Y#DSI5N<GaGGk)DL)X5.ʃ#!.?ͭ@EGKA2LEy8+ `I$".!Rw[G6f-r"8$.eFKx~g-AysYrgT-9,ߏ! =LU2T$^j2Kua0dZT_EȆXa)d1A ^JG4N2HIG^$x|U`Wl* jB'fllgGKgEbIXzˁ>i[hUx3cr۝d.V-(+#XlDZ9]Aj~$BRW_!ؽ,nGŕ6D.ɺ9)]ˊcHd6J)Ce{%u"ȴ;%ŸDh_'nY;;m~1tAA%1Ď`c^~8sYYG6Ԙs*]3{b}m\UFE"x ;olW&'ի#&[YcIkB:6TJsW&#q}j իYqun,?RށASF3LoR¼jM:* o߲} փChW/Ĉ"C8Go()A/.nDǕ+FQċM(Qa‚Ǔ&,:N 3hчwfಛq9pԨ7^!؞5tO 八'}z("YǢdt@?~zvhŘB}nmm(5l)QEaJnΔ)n{ѻ_+HlLn]pOnKg0੣+Vu!ʎLf̸rb =l6Һ;˰Bm&~zK4X T/ +m&:P#*35-nzm#s LJ>Dm':,%C–k)I&tb&ckΐ WʼRN! 1T̩;R)' ;NҶT">5l"JPF FO5G:&jM40I)IHpQs2Q%K>Pxq6HLu׬m1b##S,0J˶J5J+(ô4$j_;qP+㗳E4v&p@zE7<ŖR.Sz_д;\"{0@duhU.4{֚Qޑڶ@+7 {Ar$j539,քtkN>kV{.#24.ksfkt1U/,j(|vjv:]/ QC-^:'3w8eحec4xD;5G{mC)K+MdDъN>9BmQ143{-E/=*Ǥ)G(,Co>I@C%P`TJMR:ԣ:Re*S:զfժUSխv5WWNJUg-VԴUWUk]JWqZVua[:XU{MY +.ZEdjƮUleYRvbΒձf evmm hV ˈms[eVJokŭp"܃(W ur"v l}{榷Xm  o+\wy_Vo |Wnc2&|)L_Rظpos[b>l!1n7Xн. o7v}=&%[c טIfwlc'NQ.GVB\l[0#%{ )n#4A p@;A{s >Ϡ3~lh?{h@kЄބgD[Zт;-iG_ҏ&I}jTZիfu]jXZֳ#AZӠ&"\:n5lQ#^tMc+cϿw-k/ڶu=kD;jhdf-2.9/docs/hdfview/UsersGuide/images/image_palette_modify.gif0000755000175000017500000073422712050301073025740 0ustar sylvestresylvestreGIF89aW  #EA]>@qͶCGT ]>Bom1ERfffԱ^6~&!)l_ېMF K)iE(->NT߅(&3eSQCkn67mso|f5U[=5 jC:BZ^^EAB.BRS~ҺggF_KL'!A0«nJL-1rq(]gҐJ/<{{ffi\^fRZ^e킐H5=>RKvNEH&18K7WN_mfFR݉Marop>H~ (#g~TofZff桭=D::.6~soJG5̈́Gnl]AKphjpmƬȴ3")klJ+":0A)CFCwlZZrߤBCH@QppKkz㣥֥c%1!RSTUWe>am!:[?ffE^333μHRW5R8>[Z{u4x[q(dthxBAV>J,z登̙HD'4Jf-Lפ]_ZZDcI2/jvzMvνRQ_JMfy{NIUvcJSWAy{`go'*oz󒭲z{vSRQ!g{>BS('d|Cw!,W3*\ȰÇ#JHŋ3jȱDSXtIiR\ɲ˗0cʜI͛8sɳϟ@屨ѣH*]ʴQ HJj$Lj `ÊKٳhӪ]˶۷pʝKݻouhթ߿ Lؠ>D'OǎĪ$-ZT̹ϠCMӨS^ͺעȞM${0flM Nܩ)5~\FAB?fLO7SËO|EHþ}{>"#$8p0mb`L\E?LA &Sb&m5^ z6߂QQdb8l h2N!bDvBS B|P.xH",Hw#] C|cޔTViR| 2~r\pAGif| CFwh&uB:Q \)%AK"La# ĊIay2`5 Sc A4')UGvҜ)buТA:CQ/6tz&b(|i$a:ܪh T@DIAp#B ((\@ 1O$F8('šs4Bc  K! Gbp!?!T9n8f@,߈!3P68bG,Sq)))¨Dw=UA*:$aL/xa٭2W;'T!@GT 2:`*pwT8M| c58u:lo8?PG#1!48cHa"@~s0Cߜ]t:ҍ/@0P|cj\` ;ŒLzoc1\c|R"9A__z@Lk_:0sB6-ȊP<:(E!0ATD yTd! @wP/2R I~ pH(šL;cIX!5@'P!>4`ZR8 (IŤx !L7ܡOB A\1BHEuPPE,La\@s G=gX N ubv1F61L#y$B8./jE)?$1 PDF?Af8=$-jG.cQ<@j(yo/C/r7&I Gu4R @́%8jܑE< -^Epb[jt\6Z</_ʂ<7T`CZ>R[.9g\+",H)F I(E.0^@IuwU!\8um*"gu`nSwM8C;Ԡ;`A*,ucPG$b,D*hGBB׻]XQVDe:F/'O89 W|㎓ b u!0[UP!9+b+hɛG-T%$)lv ꃁVVT[@̓)z,ٶ17R^wR` qF֣d  P I.[!tjWn묎=6X{C (&>صR#meJ4 ϫ  ZPPa'A$vbSX1 tx[GoKG8c"be/  g:(Z*,w;*Cf!Wc2< q:[' 4$ ( .slFRKa^"L'֤ r)+ar/.@5Xʻ4:~5r.דP Ďc^tK"w\ i8йhmr\q";te8"mpK DomH`g.bZ_Iۑ>2S` Xw &)wuP. 0"[ͱ`G"GPo5Lp46H_ kd  1"lp owp5Fё?:s :&i!tP1k0aldhM#SF)b4:B"҃)uȅ#4*vjp`Ee3P p~*S@G" [f P~LDpZspLCJF6?NS 7Sg.vDP7cg @bE `__R1”` X` 6&32XgCS@tU1I# 7` G :PP wFG0 ^uSg \uHSXDxTOW10n5&,;T50 -9Sa+Nj"`<2xe@Imx'Va@ zs ;KcG|` 1 $;8CE8ya}e]G^_4FFz#Pj@8wD_0kzqx||!ycLX.TD0}ˀ&G+V#V3 wzg[Kb _eg6X4 L`i i x6D2 >Tj%]awta vw0yie\}` ]PfG 4U8H͸?1 P{9Dh$lw"ymp>f'+S dG$M;+`v$}dEid9*75V?=SO4@K0VfJ vdvY&;/vI +@OSrG; sMB|YCI0vCmxp:kIU@:GeJaE@"k#hQ16.zS0[Z:[vI Q]"#@Nj4k;pVo6uwД?#`|`:|b@fFToT91^swdRE4ɂ77]pvI0 dW(8*4Ҡ :PoX hs? C72.TN\ kPf#)@JI J˰F5Pk4{ 5uobC i `vAwX4w@ẹ4Jw` P`VV4{Nv( y:+ƅQe? l0/0GVE@9=0 6 Z0 n${/0ŀOLu;S*ҵ]@4/ V1eu'0h\PP]] Ifuj[3J$&ZEbVtOLc ygp #w / 0^;1NiTk@J59sBP @<"d #`vȲ]fS7.Jc:g_p:+ep/ =w?e6?`'u%e wph3~8YeP|8@`Ek~MƐE0YA 3_ epiJ7͸@"Ӏ66:T!qd< qBƠX`ss   [2 `*H]pV0ԵKl0K14E|p gP&4h ҹD.dixIRhR+0UJ1a@TEGBD#&u#?Jfja[rfF4wGJ|`E_6 pX']gȓIp_pFGl @G5 Z(bh6BxGL#YXwg vrj0?uEoExFp+Ǹb*4Jc4b@eRA 1e.Z WiztFj i>pjY' !%3˟0Y p;b`vNÉ;\eP ;Y!F/3T~'8H, dp4 p6^i a#q AP6`˃xuvd}+ m7eb pS ;kTD#3wϒaÆpax` Ae6F$):lF袸 /|g\ֻe b`1qDK fSb߀6Ɖpy Aن1 'D"! 0[x` ր E20B|H@U:)|d K"Uz+2A !/Í:f} 6I@%69h j"piV5f`B(( ,A,R!R~:@,I$s*')|@0cb5%/PkݼV .*Zj33M4c4=k HH/lAjmw  wV$5YPa 2 b~ yD`jJ;'ˀlĿu"2B%L'.p3 9Iu]Ptu9 ޅ#K#_`Glw;0P"8RAZwyxbJ kDE7hAz\hSYP!2^$e.@p̎K\vࣸ%.h|9wpߠ`Ie Y .` ." PO`C"FA[p"42Ĝ!d_ 9A9>_5 `s@$6i4F[c6"S!"@`xVEO@&EO B!5$?J:2 3&!A"ܬ2ES  Ep )2,5*MSN5u'gRd!U TKjcVj `U|sʁ6"9Vu^"T]#:`o: (}(B^u h[9HA(u="Qj֢0}jLWsIJEV;-f3 |Sj)bsgO)cb`&P?D+U*-][7X3^Q# t`YĝoMQs 1AE :SMWf]6EXS@3+2]M TيIR^bŘj`… 5Ubƍ?LXpdʕ+a͝''uBh'tsE֔yu<%ɊN,Q,5_.6ݦV7w.lͷI淗ۮr̉s+>{3{]8޼ƾf8wwX8涳;$XC EHK>&0/Ēk)2DWdZ|Dgl nckbJLB.> RKz 1$t29 EkA&2WFK.4E.5 /,%μMN;K.O?4PA%PCE4QEeQGt"5n$-ړFO?5TQ]TS UWeUW[UYgV[oe5V\wW_[Wa%X]o I eaYgFMiZkBL33o7\q%\sE7]ue]w߅7^yMUH t"$b_2Ȑ@u"e a?!u"tB&X$8~C!9 ~SWC XBoNx#ÏHd9Eb)YRj8] $C}%(.6 2q&_Hpbq2|^.o߷F 2;.'"`:%˧:/ 2A/G}jA( *`@\=XO(?xW^xwmMbv>{{?|'|G?}g" ~3U" &LA.X*710B__D%AHHpr&Q . G޸L"$( 6PgX)|ǑZ3x4!:4D H#!`Xb`Z,C80^%BG`@C>1K@`! =[H#aA/1m$C0*Bx($(:H %3^Ge,@OƲG,+.e%0)L\QtG%|KD^@<fZ`Mn>!@C3 |d\C<9x4tTM@6 w4&x0 C'D뿨pB&ApwTBJC\ !ΰ@,0k)PG,C6)]$HpP*Y& G$1@i@^br\ @~$:JHdK1T4^snoNH36\ P/XQz1*ZG9JHnaQ]Æco]XA52G@w X%,1{T)yeb D)X@c:Mz |#rb 8p>E#=H_bFM ‘%v0|ML͸Qy8v? D》˙08Ҟ('8?2C|ہPc@N|@>7{SH+w@7170D 0x?NЄN x4>5Cہ/5 |4B#L@#,Bd"lB)M`)PXex'x'X1$24C2lbxu,X,O'{&`pxX;'UyuJ`"ix. š)ɗIBD."& 8tL H`P*"GpyJHGX@8!,b/XHwP\8 z\$H!i vЛP{8X%!HKh:В`x8HrU"&H)StP $PJi#G'P${-};3 y62.X ;,껆; ",.r<6sa[ah[Ia`;eB8 8pxB OJX4S, %;5 ;.3\@"+708@1$X2\3\X@D@.?2J?4#K0ӱ0+2 \2O)|@@3NM"ƜL\Oj0⣰jN(,lAA KM)kK? 7@M >t!MS.dB' *Ι;#-40prHO P H(4xu /I= H .`G=A$Dj7Hx#YѤRdԩ{)77 !}AxsAPxhKLpAL  u W"!"R7?ED fdR-ꢠsK{ -GG`86u9Bd|P"o82GF a;aP xE6ڥwS J$OqP8Q#|. 7`B."U2kF?.Xe 0P-)qݒ:oqrʩJ.ȯJh,\X{'CT%CMK=8M$п ˵0? `H[5PPHc2.5h@20p @@t+TxT1Nt3h1o5{4.ӰC4CX؁PZ?)@lL଴'?}@BhxBZD[™+lP I պ%xۼ=!6X9˂e\\PR8(O(=/̂\JCs DB\ {RjQ2R r[ cWIR}q{8q{čI$bՈ"!wR %&!PO]'AxEg $'h7SӁ٤3IȆ8P$v { }$h9oҴ,}ɗyVT]46‡`xBxTv z$FŢ; uU]B&-0#X*us @aca6DPɅX/j=5XCGȽ=y + ,0촂5w4#G3tZP3:N*wxǴLA(0+"8L |205YDL=N~tBܲ:>M)> T@~-1,3L,3"@4TY3Pg~WB0#[`JpogP[%RRxB-=BH1H/L` H<P,Y7OΙt`!#ı;m#t SKba R+3*" 8H/X< IF#{9;X%b Xz)Aҗ``G.i'ҪȆlr$)I$ . b!"B9}U%xF"[5,; *<ž.^U!<;22XG3qȂQ0&m6qb2(XXX8 =)X,PW~b~"5\c66WDjOM66YT0@@gf B2[N>\~[@Åwd$X]L䁩 ,3+2\`L4M, #|O#TN+M?u>?$c2y} 9|4M02dfKS{km/p!GDr XȄi 򽀨̅ X +e4*8Xg,]|8)K2$uKX RK-HB}La QQEb,"(!<:OH nn0W6@A? Yxm8c6n1D8 P{qTo5Xͺ D=AOzI0˳SV? ?2o"CMG+qRxBDДP $z]^1, #eBQw)) e 'r@}_Oos=# p?J{}.X3@P.`uV 7.t߸Xʩu{S.̈́!ʾNqs {0i(gʼn28  Hph|u)R+3UboHLLA"Bd]${$I.֙3|:cJs~MH] ąNe| F]C{M2/ۯxCC0B7oVA_"Cj%J mP:7ix2ex%Ň.`mȅJG&KzЈȎ_sJ+W#s l`Aڶm㾝[ǧ,‡/n8rzh >[ z@ hTAJ yӿ7v/Qw ׎7oJ߿Z5g.pW Ed׉xH(%f4< ;H8 4̗{An7@tHD oWa <b .W]jw6 }Cx|&hYx`4Ґxa^݆ZdηC5WdXvhV8hxu & z $' A(z)VG-H,E ld!l,B)L~K˨SJ"bW:_@$\,Y_dreY8D2s @rTb8dr/A a9B`8@dП  0A  qb ]oP2%xNA;x\Tx4`4"%E>P"TBM@㉄ԥ\Q$f<#hR XF97r 27ƒ 솅Í%t9:*n YXm#8CfF@iC~X%2'܄$@*AD /2ACMSG,*ɨfGD@/x:*Db q Af$p8EċX$pIt 4>{JЬpX*q$(7,I.K$*A5d1URYY  |"Jq 1#$2!a̅ !s#D$dqrq hF1+]lZ"hST:UlV:9/!:u(BD[ s $ub0*?A`zz?uD}x^Tx W!!Ef+[$T%,a (R⫇`@@D>Ov"fwhp(S|$ĉ+O~E(?VBZS+TB /H! lȝ*bKdAĭ0 fʐ ,$0y_X*U \(2Fc81]28;t0yX9tec  D.YBdҲ5Hnd'юF@XF_BAu+:'`Q#|!D ͍>x=$au <V^2ND-N8@jd x 7 st ,/ +5 Ò`t{Zhr{ `־1qm_{ V0ծ6'xqKxl:B"J+"J%O4 B+i;(F  s?.f KEwC[/ĉ400 x^ o/b`'AW~3 סک@/Oh3XcF~#~b@]xb SpJInkYO8܆'æ#@46q,f :Hdd@/@6fpdEM铦=BTZ@ ;;٨W % 9$8|pA$E֌ `fLN$FZx 7ȓ">T$84#`%|-)NOmNjPcZ `z倎UNWQ <0fn&gZ6[dvbO(I(Q@!rIsW q& ΅H PЄ X̀ C b_#~ H4ǒG'rב |ʋlxO`1g Fribx|4.m!vyPW'lqz)Lx]|(~$(zgJN)K)PD@Fyî|;h޶`NdAMB(<8P780@dGe2E(<|A:nB 8#Ƀ,у@(x0@e'PB!(=ˎ9d=CB,D$8A *$/ ЀY$ $heX KOEDUVpĠQM֐>ER>DPɲ [2K(%dBD:7'L LBְL5O &$0C}P;!a.!lA .UWuG҂ k\JmuXÃU {t\}"&ڐ % GvY1m|8ЉdA yriHoj }lwM"jaH̀(2Llj쏾 ,U2O "(gq3ol9胞c]Qςk9nX@*U5@t@:r 2=ֈ JNu\LE;sLR@E>PKB,Xs*,4dAhWp\ppz#zgCSCp%@lR,TZp@zI@$@lW.!̯%-)2@ A!0A!AY@$ ND%4( \ p0@ t  'h3ۘ<.+4P`<T7,kѤE0 C$8B6C`CL™miԆ1ld, J$BrC07qA- Yc L`> ,#RQ $H?<}#@,JA K@*G ȧ,!> DEO"/L7h zZKo<2c h`Ƽ4h77;!9'˖p=UAo 7`;\t|q0A#ͧ aC\wx2[(g3j 3tQ[ӿA4U%o.ةf͝yg.e„֩-yŕӛ:-z3|x:s;-%k|PviSy.p"D…JLJ$C@,/BD,.5[# "J0 ,PxX< BF .y/MȈ#HBRRP"0HHjr7@-AJI'9o+㋿s$5M\F Sg)N4=FF$#TtdL2t-e?RGtxD@H@GpB!v8 v@t= I؃z΀(?wÚLR]F D uШ"r T$uQGt%([p D F JA*Na/Sg Ut}œ ,!G I 7`{ #'>ty2h)a!K>#0e%u|-o,t*<,b)<@2C%>M$d"ۈRh<3*{; Kzr @ܑ'cr`$S~%E\Y~Z1J J.J)U8ֲh2; WȒuX+jV$dEgƢIm6"%)| "ChBP73ha&C(%Kt餏 Am&b+'bqpr,b׏AJWx8:p D,JA ~C Ĉ/\0rIAzХxdIEI踇 WE \,JtAOPC> ݊LB\ v@+Oց(&(Ce:"?GB!H\~-o!I"CԧLBI #.oHS=Iբ>"A|r*#(a& HP.y axܞ#2=~|2:B6ܣXO$&i:  ְu zz`X16AtsF65.Ղ 8f('1rz&;mu+hM246.>(v`5آnhY#2վf/ 5pF'4h~r *( Fnt#p2MvdDiFY"&>c2 ƫx ΕL PȌ >WN>ʠ!  )*) $A \? @ / "l)7g0f*pvsD!Fr`-36>&stl@9bvc$hC7p>kl@n,&2tG6.Jv).n-%83h4P6,Ʀ7.<"@mhn'vJ2H4Ʃf6pvx.X?#Jbf RbAȀ$>$Ɓ8` ` ) acaAScD iB\@FI"2IT|$d@/Tdk~!g=f$`_2B!B⡾$a$5SJ=i!A~"VvȒlw= aaEDTRp)Ip&Vt2ADّIS 8@WKl΀ VHɕ<@.甑İ>h&x (KHE>/X0UG>H _BT@T T@/-XUA8y@!>͠`--;a;æT(huf\0C l48)f7PB.M.i@20)<J@6$-04qr,641-'.5/7C6{,i3ge yrf7 Ȃ*#̆'H9-6ff6vd* ;u3433 =3u\`EV$I616"$@$ 1` ΀AA  Ё `d܁ NQ@VŐDWhr1H&=RK&a !tQ6FGAa Ppwu >U~HumhLEoC!ցIBX{ FNV+,,6 a @aF22*aj(LRI ",a<n8Hr NСG ]Ĵ~,XXȊ\iUO~bI@TXSX{Zal"#?j@+! %\#.2+j0gn( q24az#D"7.`J0)lkfOv@`6e:'8l"0P2(<fB*uD6*696k,Bf e%& fc:*pt0gcjpj0v6|i`&ސuiͩƊH`j1@z!}9#A YG@ycj诱`LABC tJ_`VA8!$!$`Z0$:N`$`ΈG ` ~a@ c79@YbGЧd hat l v.rCE6e!RZ\X`M@؀ "!VKr.΅ ("G|YB(! " $Ll>V ]Ȍ2%مe`* !{v!tղr#A0qFxasco"t<*5rV U1YhJ 4!_ ( Xh7bύhm.03vl)f&f +NR#B#nbk]LsA>`״i&l9nB:(6&pd~tc4۲b[ *rv6NCNf jSki<#! yjq_`iAkA@֧ T~ƙ^@2 Sk$Z 'aHPRc`pXA<L2J Ɓ A ڱ=۵H\ĭ[C@sm 3nxXc~pgXBjue-6 rweqblnb.a))Y0kjl7 -pkߏ8mJ04e|bۿs*n>"0' H'`Bs9_лG^8H2^&(X"jޭgªi:Xw.A^Am`ԁh`@a~`_`@ր#kk`Z$뇮,II!,[a|^$Oka~JH&aL.^?1ɂlwAQ\Tk1̫~9iDތ_^eĈ-!e *M`Lz/deGZt*%YЁ&XkpIH<|   օJ`U*SH%X1ȑ=e 4СD ҥLO"o:YȻ86lx7CXD(рڶv:hP7B J( 7ܠ CS3>|2%\sO$T#OL#K.(,p3I E_4)Kp(Bb&GeT\@HUB:3/L98A0NB3$C0@9C7xND":Dd€: k!`ѸN! ~B7\x=X @@(D@2%s%~QA]PQIѭQLqJ'i4R"qK1'Vr.rAO55C!TOcm`b<2 d!Qb ryot?.!e}VqwXH`ϸ t݅ \[QUBz= w{PM'g]w6u }bVϢ7wQw# Hxޛfi'b_W6 @l!ywYW5Zjp\qX . mI5հhJjws} 䤒OwA~曟=>~7JK,; 8#+ІtJ &1LY@H($&n0NSBQ`$ 0 HZ'($0=LX<wC:Po W% o&DN0PA\ D@\ܰb p#7D| B<&a8# G t4`07ճ]i Y4vޅ8 'ޓF(j, Mf{C @` kV6 j@('8" &ЁaGC6x vN@(H0%ľ2x-AiLc{(@5P ;BP FC聄, :`C( -2%Jp#\"$:y #βPPaGذoOKX( Cr oMĘƔ+t_`»℠ y*1b7r)fR:21SLF@ ( 0#@ 8Pʆ($Rv5tG/;&lns_ dffokG/1u w9tb*sհpw}]&8A0yIUZ%3VCTm=>Xg9ʂyz桞`r፺hx0\X/l!ݨ@yP5]Z!N_Qaל5)M4 q!X"yC'pRu  ,ܠ=uuDB$HOTX.RtC pS<ٱD9]yUq OVahљV8u WiW8rHr.pȞ9R?칉hpg@>j@Gj0$w  P gP+^[gJN0 Y @sPL0. d.Jsqw$)~M /5  ~p*I& @{b(T@  @ ` bBbbY_$&9 N I(N`$m 0 s ) ;^GdGcB q, A0.\&d _&L&Ww 00(Xqw|TŴLe40e&l j #@ AT8-$PGe 7JX Q:<`FmUS!a _0hUaVVRk<9Naj6h&E;QCS@%A6ApߡO.mVƣO<E7[%VSRXAh6yOEIU&6ljPa! !p7Wiow "@]_ ]k1GGYi{@4>A(@ ΕM"- +~#(d HsAzIbt+8W 'JNGfA @K ? w 6 @ NFdz %KP/Z$0Tx0`@^/"&pJ*_ P "@ 0 :0 m Psj$p9vd@d;!KHbr<PgB  Xwu ^Q+1&1!CL)1IV ;`p / 1,/< ~ )PC;|A@'  T i"$3 EO\ heUhn)50 n7%fRQQƣ:~I+x~fE5pylf4Ylv1a{hD#gMPoܚ1SWCc 51T66y7XC!C03TK܉ B 0Xj[#Yb' dĕW)Qp8C++pZ$-pw epFoBX "!'Q0`D HT?0w 0& 0M-codE~_v&kR .@CA~K ` \µDX +{0 j@ -x`q F Js r/`R&L Y悊L $ + ހJ /-e)IceJ۲M_P}&ӓrϟ ڡݫ? )ˠ,@A 'G2"@.AjN`esR;PDV{qtRřz7aga/k<䂷`"p k + *0f$ ^j  L0&_!6v,\4'Kw%(b 1s|2L+)4)#Pd' 0Ai??o?\? ڥ ]ğ0iGMcINlahqkZ)ky5,.Cǻ7$MibRU`1ܖ i9Rc șg~S }!?e46T3˶f!m SomacQv6p:{ad8a Ȝy 0WǼW1! 4NX.`DcczA ~  @C_C'  .r. #<7C@ O . j  ;*v te^?F&5 @_p(@ ' f ?@E'"y@Bfr21W >"2siڴeY"iRaYCR0Lq!P :|*`ܯ{HĢu rfA QΜI[A$.޼#ͦ_H04='`q2$|k' upYB0>n$CN!Rr]t2GTy 8ú|h*"3JA>e&H @tWo @R.بs˹#Gcu[+$f #"%x"J |K:yh)@\NKpN:$C 50DMpEAO`lāDJw"LD`, 4y\Jp>xg+HWH;Cx$Fq)AEl )dM:pG\vԱ;)Fi7;`x#N-K,uU i`uVZk / ( &UgcUYdEm, bx~%uNX)$N"4S , w |iA ]™MX!`ƃ&",i hbKb&HȈ"*2XgHBYJrfZDp!M$d``&J  B~rA I "_&o P"|"Y|Hy?r E!' E q$ fs칇X ax2"䗝*8փ ‚!nHc&b&X଒\7xJNsF `) 8O`O\Xc|7|6 RX{%be 8_]<L<0QIq` Jّ'4hBӟ0!@Ո@oPU48Nj`2p)0 5(%D K#OPPTLwʓ f@Qg@2wBQ=HAю$$qo`5 BO=riLd( %BNРTExd"S\H|QЫ,E$@ld#\ #/8G8@XA˂#r!/8m <d(.,wX*A l>A AQ(BmwhȰNhX0a JL z2.@|9!Cdr 5 Eq HA5B2Ѐ5dB!?C ub{~@/ $ J8@4ºH+BbH@LD^zPmTA@3xG' V>/&(`=**#'j~4z! (HNo>1 $+DnJP8 >)/d  pN`H*ّʔ0BZ/"C1I@14 \ @I3V\d%1xTG30\GrOP.8K.xx4HLL Zi3xr@țhM X x8\xi bS). xP k2.iP4LC28JdBX`*`D; "÷OXqnuu@? ?0  ApjY0T(EEXppHHh xH q``šsP'{( (`p6`6aË-p,*xoaP 9!R,R-RstGz/e; + CʣA4 J£; TA@ ;Kֳ#/&(""!AIy 1)ԓ5ڱ:ʔy1 )Ñ";Iq8:&26ڏ0XzA<ʣ 3/ %NKԐ233 )(;r-Ws5,H0Gv]v6h8虌`8 R;HEPw :{/ 'FSH_ /z]i3ݐ8*'Ա u`GP&};!rspPH{ yD8xPzh|  0 hƑLqщX؇oP"p{q{(KBPJqh8Dď" ! "Fˢ%5Ϡ䁅#h)' m]%Xv|t}> ꠓܑa-Ȕ+\)&) )#kȋIֈ#T7Nh?"r!I1O"=I=yJ39l/ ^jTž2b$Gy0,za5+  !@4 ҠtmֹDo% XG9a9+ z]` XUH5Xyh_(P(a ̅x]'`&p&fZy*My1xxq 7?PD dDE]o Zi ̖Q5P{@PP.{XE"[bXNyi6]H YQ2˂=p Jŗx7opst[ux q ,. :ɺ㹺*BѬy:ou*)e=<{T@!25Ӻ;MDA37 E s#Q<$7H,*SUJ' #H+yɌV_!4TPlQ5i `#=DJ!#!1yF\#J#N.AK$)%V[qU)Ka: =ܿxp~RwFHlª3Pup3;Pc/AwBuXʰ Ň2¢|u P鱛ը P"3PpXN @8J rkB (O93;`耎47-CJd3To gp)4uHT< 7.XNtHش%pEp{n 9$I`J9lFI)GD;'u87'Hh*e&Bp j&n4,2G㌚h;FgY2W"/r#Wݵ]%-5e?A) I0D@::/Z /T& ڳL*o@/PS59RyIHԁԒ-*=69$|#"6tC0Q0:K %>l=a 9Dv,@h%\XHB*XmIl`rg"%_x4uB8eT%HB,ND0JhŸ wJ U2pQN ?Ú a:ИV-ctp>G 03 8oX ˔U!5|ZY Luȷn!f?a+HN5x5XiشTбU {' Xt(Ptoτ Xz6PQxR\B'S6׀XuFqʨy @ ʕ0c2hɟ|ʯoO'?%J 1&4RH$kETiHU1V-#^x !={~ae#DKeUnZI4"5ɿ.ʞL6.J2 96SՕw( )ţA0x_ : A:A W.]A#ǎ1jԸNjN4rGBD" .- f'ϝ| 3 Ql"MZҦHh4i.b}YǀM )VS#V -ΌH۶G.\ ](<% )S(oA秒%{!ÞIDEb/_^u!m3gR-qijhJ,k0H' A\Q,mɋ߾Q%4'NdVz`wB!€=t֡%ψ:Og.r^p"$ ..BIcO1$x xqJ&0!Y,'""[bfn][iV%#V.#E'R ,A'1Nx$М `XRA 40<,b2A&NeH/'[a <@ %QD? pIP >TB&A %4 p E ;07&?`H̀DD a` ;Q"30@~ 3| N "~-.yIEhz(I?C04tE P&(AB4?Ŗpȼ2QzDJ0]}tЊ 2= A0(3H+ tB5X`Ѣ-À;~@Ns-;A)Hd%>|%$xd! 7DI,"a\&_d1/QFVm"gв4Lsdp!Al./% 4=E'"D$Hx$8/CxOȳ A !ZW\$L>A D\8ˆ4A"x_PLp sS,*WH0-ehĖ) .m޲q#t4BVD`!|!B>AI` 8 $@e,#Z#`ţ,c eR=A?"Tk"W T;A5+R$( idEA#WB{~R'iⲄ\"&\ Ђ T  ]Bh!)j:fѧ- !@`-J*Z@XZZy-$xdu #Nn&7'~ 䘃 8C.T#3-9zS.p@,aVd@x'9?Xȱ/t(

    vbH>/P}*Z(M5 RX'"*hJzF,K H\Fl#gdhJ@IGZN"h7Y}v]H!֯vuji(gZbQ>A(}bxY`C\&x)T!PAA~L: kc[%rqB%y w F0xcCBb oHtY'@ G68AsO.g:5xn B" (Y[@tU:#MxJ3Z_7*,b6*P/:@? #C.J!_YB_W,Nj >pG8B$@L0޸zn\Hh]NnD axݶ pv̨׆AX,,#>?|Qcx(@b|"4a J0w@Q0U :%,CF$Pѩm2=[ۜ[PU.8 A"<ج#T4 Ptfm(\\ɕbr,9Ll0@!izdBc}A%e=\٨/A:B>AT[&X=0]<'!8dDBw7p7L,=@'=nL)pP ݝȷ]w[$ uaN0zHT)$J!D9 A b,A,0 eNd8S<( -t;xR퓨DiB.0?8$| 6M / E'Ḍh C_- (I BhJiJPT K ʡH0 BDL A\. ଄(%DD%$n`HhvDgzGgru&\LM>Blf*l*Ѓ3,CY7HB ^@y]dT&:Tn!m8F!LqeA!0:hFVAYȃ;`!FCQAU",Bq9=B*(LFTѼ%h=8zx`yVV%@dIтlڤ@ D==2~dyPVᅤ&I0BL9$ ⇸]viWwe P%@[,P )wEA7!j** $!|B,QcFn$xh|IJ؝^m<6K <7SM% @ʼ"QqP>FhBAC$C A)q˖eY pY$LTġdM2Q+A%5^/D+<.?@;8Y<@I@>q`j&͔& SyCez&>tȒlɚl Dp@p \'8A!L^ H-n,\&.3H:D$IH@BT0 Ed=X0T,r,G*+$0],!:y iйC $P9zB&,C;nd0pA!@l5 AZ(/-C(: 7Ѐ }Pȩv))B a鈠$99H Xp8~:^.*ꨮd[+HK7y_,aAT%JaQ9uX.DA,Ex AHKORL5YʮY*R K+e01-Yx+Y 04 4\L'*tRQ+Pk  Y&iA% F̋FJ ?tvBpHV,> Fx 8p&ЊLP[pB$paBBr^$,hRGP@>A<p@:ĂM 4Z$D]|:0A($2|M)@$$ɑ$$p/%S&y~xBFN/7X^ψ*pIgYQԕ4ɍ9]- 8Bx@Ֆ.$zX=S9B]:G,CcfGB(n%g!<"tգRO/ ȌE*( ui Р y؊X@-C$BD2PA)/QrC,<8cd' 7ߩ /8 Afѥ0v'H 8dtpB&Ȥà (cĐKSX KK ATjqQrkeBX I`NZ C!r"7ͬ@}9%w}}[0œ9B^T2VLLCyN HT 8\WJKE(0%c%cV(h$@$\ϵͻy>3Pe:IYAV>4'9 tGBU'0=؃4rE#T\ع'N%HTNdfȋԝS#u]HfW.ts]WC#x{zA;' ;'LdQޚɱE{ֱM*C\$eāU+!' cQLJD @\@q xyW"DKIx@ e'RB A:uߵжuYj+%E+JK󑊪Yv[ c3Y&* K7AI@G9A4lVsl(*,4ԣ=CT )XHVTAT1c@Pcكb8[0A! 4IrI (%6Ye3hI]j@NTz-pySA6Ȗ5K6o4oթvtz}xk;H@(}зp}!;hЈ 50f?h q%;[܇< =83>/[Pfm'qI;X׵ES3xS\}BÅ(Ix+? =ޠaHC zó+94ڿpQ,P∃6mHny0~C A%*9x矻kC(1J Ap.+м7iv;.H,|`?A4^Cq =Lߞ{Ա(x1 Wb|xdE"H?P)G1&}}AJRRz3yA*&xI* "AXҕ ;} G|@!aGȣ]x @*Yø/B 4li`%KJ(+]% |5 \bWEEfٰ=q_LbXG(@Z"ywHA!BX $ !Ż n!,=@Z\x 8@H17AD!M",GFr&2a K_r0*?Llf,(Reio M\BP^p y$' b1jv +nށTHl'bz½C6MsQ\T 8E:` ւ.ARݎr;Pjn>PT" zTqB0qAN`U|a+X 0$8% iMS懔bHH4YHA G*NT HO_a !7cp?@`_@Gd a#PuAqCX=da k:*Q wCRTSe)J?_QQK*$ l 9qA`@$t9V$hA , \:&yX`$xNL 1}昆=BXT( D@,bLd %ʎ# |.cB68y5ui1YhNތj ԑ MMX@P'Nh)JJyi |:18P,<(7i'3g3fw[s $q#K!9U5$%# NW vJp!/W(C֨A@ .Jm.!U9UAQ5e(dE1PD(`"fFխĬ-P;v>ˈ:qIB`I 0XV u,H0H"J!8w  ;cx9 UTZʿM%E#xUs0O}Jb`!a`@`DZJr3C jV7r`B&֋ PL\ %0{$ `"$Ed7~!%c))T2NɈ1br`36 8;(_y?Ru ̛9e(kJI" <`lg.Q24*DT}xA@" L1;V#!0Ubf04 7.Ѹ1i[n7e[l=th<ۜE3g\:T\ OЅlbah(g><-H7^fj dBn2@nͩ*Dl-ʮj3y pޢ;$Nom/B9Bql r8jxpL9m72-ncJGhcH 5Jश\c ; +l=p:ax*㜜GpmyDˬ B>.wM d؊-D\ /ҏ^q|Q3 3)jPJ@ :+$bAN@ȠO*$H b@r!P6L*ܨ A++Ba \`!a H%QIQѯ.q VA !,! $ଇ F$sJAQ a8`aB!`=`̄<$ `!b&f BLe#RBM !0FQ)!T&P!HHU(b}f+sL-R;dCn**wRKyl+B J  >g.F/P*#ʩԾ,M*U&krRo2jo<#n!'s/<Қ #>hgp\@g?Fy)~-۲x,:RA"UXȎXA /* BHOڎd[$s[xi,  _`XqL"a a d? A.޳0Z, "aJ k H J% 3Y9 VVA= 1HJ1z*\vhd"$! a>K<@N"G DK$ `!A(J!$^(a>@!L4!FT "+` #Hb>%"blB#.fA tʼnob}@|}>Ȍl+5l^̩=p* &J;2#j,c?priV76$|=КhOװJ/a=ۀb*(7g| )~nraZՠ 5JFA$ "a8`",D N2 $9C*(D@` !fm Ԁ $0(R@X}梈VJ*;A7G6٘+, VX֠#   `[* hI?/`Ƞ^$ XbkN|& "199!bMZ,cL /bn$c`FsY! 9 dBE|d|րFYoIg/Bcv+€ b`l-$ w,b=B{T :tz|,Xro>~5:wf(W 9r)b/g0ɛc/"8c/?,`6px~VĪXHH8@zF!!X衫 IȌ "[к": RDԠ!>l e1 H^+Zd'Έ$W|XbAݡKbT@ ~6[VHxEJJJ6FaXA2Yh%$V  `^ A2!<  z2aab]YEa!Q J&c\ 4FG1hؠ}\C!H baH`(prr/gAjnB31b!$F+&b7I4DC9,)pib<ϥ~wg7,fn4ġ2nzc-@vN0gl=+ޡ6X}׉>b{+h@7W4u Imyfg V2]7]AX"}~ HGW|rƬߋ?XXbp" % tkr  H{ 8V[@TV "SJshN#!$ YSiA޻޿%8zWF;;IJX%Ř! Aq!؍ S="`H FWELq h` `>!:¢e>$vF5  mm4QZyf3U뷞^>} R@|@ࡒ,k. qaB$ rd)svamT:cà4*)ԷS)9U*#rza,tTȷ ~W*5M3؏8P\'kn/ai>zC<›Xilb0։S|hO:.2, ,-g?J}x0хҳ D`۟G^ !Mbˆs9I*z !X DIB@ u7&dOP) ~`})^Vj*ݝ6V0R:2"sD*\ .OH5wТ׮t0dɨ~ "gɭJK4x'M[V$'d  :"Zj?Y:.#E$/_p>"$*g^2?R):tˀ,SؙW"7|N 1!@J+H!%,ۃ>yaGpB'1Nx؂ :FσҳAuB @L,D)0pˉYApPfH/'h'J'eP;Y@4t"''T2Zz+\r<Z+4+/' , :q ~N$"ĒK)H@2PJ/"P,Ag*K83 L@G$$|tA)8-\m S;lK?H$D!ȣ; r\xՔ H`-^\plA'Au"15 dDP5Cca pc Y`7A; jVj8ޑ)(CDɉ7!A,ti)IrhN6Apu&1Qa:M!ai쓛>FASs sȋ8a:֠%~Pd|f(\x…qAxBPeF$bd;hԖK+݁D Rɭ%,/l%dȅP  :qE.ԡ!ub&yY"#^%!f΀8rHBC ]utli(N1\q9ih,89AJX@|Ҫ눀<GޅvQ ? j]V@` .g AAOSAp6*tz_x!sJ$uF>;,sU=qA Pi>f6}AOv˴h,U0_еWr& Y]DԱ4țkYh#> %S?s l t!ː~ "ŕt9#pB4@%YDG6e'K\rvCbC?_IRJFwKF_Rv+"Ctc&Ha Dy]*bRX($xRHFb)2G'C*(=-y%nz0&-@]a5-JE_.'/%FF|޲b׋D6|8d%/%d@"0292{*LӰd @)~p"00 @YЊ  q#) knmhW@Drޠk\ Hj p.myAPܑ 4$R6kTj# xN}?| U# LS=\P]u.d+d3< CPVdW ̡ q!򤞕ApZ* p: =˳͹zT(%\B҂ca(`׈G<ЋJC.u]H+/)'~@dUDwb)x,,"+rJ %yvHFyqKT_5VH0Cb/f)C%G30c2(H2_4`BAB_SVd\_&Ԧ~tJpZ#k\ P+/ ;S2`T"e:YeˀX r g, Y;CCPoKsCAӳq4 2#U tkNkC/+@ 3ӃK ѻ p+:?0 m V jOAPAS |@.0 P1ɪQZiHXXm)tӲ!^*+w߃4QzTpAAkP|\ٮt\c4z`ˠHBtBBwP 0 CJ6$&`B%R+1|(bbyrE'Ԍ^iڷ*ry\ˣRx˞;DcHGؽ+% y_`[%%lC%R.'IBbWPv{['||%ʷ/. ^࠳nI3\jϖXO!gXV3_#es#U <4 Dn Q `|U`r'Ndp|PxRs30u pӈq?ΐ5Ө'+kUA.@TTa aq  N u.7跚 ֳx%=)! >AC0:@2ډEǘ; @('4.\%z%啹7‡%$ (Ju^Q*vZ¶&kˤ D}*B⢬b4z^D)O_$_J'E CbCu-؅YH=$RC"H.*`f@ /2xM0s 2y<& p= Pd@~pAݑ"`9 pԦqkOPj@N/7mЭS夹 "@ ! 3xkcg_d@50`W P` bX p< o%a;c<BL@Я\l  9rYYuZ 0'ZOd0l%O5B_ivG@G3-d^Ր$ʈY-] )&tۅ2^wKC̍aFwH |K qPNPTכ A\J,MN;v1@J=qzqA#>@%M>5QF)ԧOY\ Xe͎շkmݾW.[,XEDBuΜX\G@%KF1@N _`dXaXhpF /dС+UGj5"ׅ3~E"!X{  "CHԨA鴬#ВG˗YgCoai[E㡗y gJ1.RȐ@.RB!JgHH z /B<ƛ/*A QCp"Bt7Bv`*q13XV$GX0d%Q œ{ %K-2K&&`.1ǔ+^N@3M5Oc yJ0M4)dT0.dK'M(zN6RRK|#: MҤABQ\H"T"D5Փa8Pq X$ARRIV0j'H}h\HIKp" %' 2X$;(; pz@'pbH!!b)@IaJ#%lJR:X(ENp.p$VBϕL`^IL4P. .D2"AƘ>B8xm q;hdJi9RB H#& pPs)JQ!|R.QSosXiLc>A NC =a,"8U4f ";P5%P&/ P!|AD $* G 'ƙޔc셂L`_%CcP 3̐ 9+Tb/,1uC(=f±p=,@\b,X̮p caR@IMtbB0ISИ+c}P)Nv@8TBa8J4ZI@; QvXZ9 &Ace%71Ųdr.R.|!\ D,TG6} qDPvH2یx8bL@vA X9ļw`/hH@^h9|!'TԢȱF8Ƶ8=@Ihyq"G$D kDQ`B$,AJeqrUJ6BH'  HJtט/٫Z lX zr;6w/ԭnc4 \Z.wG ˜.#27;aQ0p(3N yIK:R 2l/I8B  8c'åg04ڎU @Gk؅E`]@ Zy J0' (Jq"H#H8 !|B bÇ!ttHQ+ @B A0lZA!| "AbqXQp79CxGup0Y6(XB#)ʂH@C[:86q$*NpIa$xrіFq c.ӯ##=@\K!]|j(Fb18@`/!;»`Т]IaA:H*GAU9$s"!sR$DXaps"}Q"G1sOL 2" qqHGH5<*x`u7xX* 2  #u().`̛IPX?Xˠ$B|"5Xx@e`i0@p&g5 'Ҩ,H u D PGKP 3{Å?p%؛ 6\(htHG4zh LzpEH) hGp PpT!p@L@#*,$?0 A 2a>*Ci#//Аgs,BXaZӶ G6`6pQXTTO4YX(R8JP(G2Hl J<8  "7 Oĕp8B`Љp3" B %KѤp3SPPJ.(th_EC Hx <O T,HI`GUBPB'$" ) j؟+Gte̾Y;H?[K4huuXđ P鐇Xi]쳿˅z5xTؿT<[qU)L34<) PЁUGw(y0H@+2,2 8"aK5B'̲YA &+Nm+H.oh`͂qȂrXO^1$HWeWxOT `c 8LDTXBu 7$/r-iyoQ\Qx]AG!ay68EDU|9bN"nmw5B eIɠ>Al,؁8; h 쵔y!% G/y5:^6!0YA0PSp]Ă527! )%Ϻj 9S858,\H2 k<Y.BZ#x pl,pr>O<FLtykd͏rP@ ?B싷ٚvrZ_3i Ed5h())xb=;Om)Wj?|h'H15c 2ڌ0 2 !y[=d!y+ jn܀jy6C% 86p5 yr7RC85S 'ځȕk" f(hUOx槛Ww"%0$8?H#x$Nܸ/n.E(;'~/8wD+] d=G- sS@h[Lb$ Ӏ . r`SN33Ή$CcpLO7.H. ` (P(NE)(2h;zڌ")?0Yh.Wh|H|5O)xXi@25XXyu5R;Drw(q5~Z|&. 1FnԨ%~P.'6J'- x~PHZ2 tØԝ;/N[CEOkeBLtA:89*RX.TZ+24b3:s*x # £(D@RBS jXc bY*8G,.$e\@,e8jW%esy.bHAS}]U_]:SJ%#TrPZA]\Շ=0A#yfR6mm17qglfn 2]IwI4hI&k2&7 0y̰!3a? Q8;!QD @w'S};1;oNa ! {>H^w/P"B" Nq%t%;ߜυ)$S>8$4=i77&mRӒ711Jn5 `3(?i2k ,"t E}22!hmiY.0œ+_\ 01y R8XG)0":-0$q2cH j"%C@5ōb#Rc"@+mh95 <#"L`z .I0"oVbX%(|˦`j\ RT_ B& n(d=a>.♆!2Ev,cO8w GW4qӜخ+ Ê`"`<pmN="'w0}\nwrSDϨH >pR@Q|tn*N=4%L4zW4/hG0:a$V`EX`UL̈́%F,9̃i!f2C[78̂E c@V<DB(7]21T0|""=-ғ &iޒMqoBy W&@ЃPTU'Ї lNȍJȉL[ANQ xN @Q9 P߀xJ ڀGPٙl u@ڬ݈w(IA%N8d['|^'#,/ŤLdL/ eydp25Ōx\7cV!<!D. h ;:@a C,"H 8:lDKsM;@҂;LK, RB9KD̩!|%Ι ,׸E+-a X@3x6 "TB%^X2`S%扉\hx YE1!S(0ۅ܅0@9$gx,*r.'9dbjb>ApZ I: yGI4KT|Ք[L#X$8 byGzāHa#.4BUY\1Z2NdԞaSt7DN Bwh.hP'B&)0 = uZgjlcat7=cTB0 $M%Ѐb|(*%T",CjQ$L@B! JC:Ă[.@H |l48<VrVtU%W=" 9@C74@>LDzAR-lD 8[),5Y``IS55g̳W"b"3]M-[]]9C&X='d/L%`["-D C$$kHicQi`M@9TC GFsPuH@M ' Íy"ΉF܇ ա"~Ԋ}^I#GÚUyȀ|Ph(=p A,uE2D$D]ǫK <Uɍ"# o#'@e|Ukpak'ܭa.lbl̘N#.}a$z>D.*rC&IhBUQNC@ 8V+C4ԋ)oy8B4C/19@raNȃ;+K,# =\4&Dzo&˵A7@,܊< E.&zE:.)Vܒ,> RSe[mbRc"QCz 8p& C WToKE,ߏ'y xH@W];0Ul@K |٤ \(LHmx(.4 @_H]_^ ENL)aSsHl`I-` DN'02PCB G(-Ԁ1@B =(3(r NM`4@(:pA% 9:SC<,ClP)#:0@!i8D,4-PBĢ 4Akf$'9/ -n "i!D 9?CBa&*D, -K,FW<FiMӜ8oIB`oԒHcVHfH+z[tSqS) $d P($}/R',B~B C :IF:<,:  ^TPr:-u$@5TWaϋtRx郼wxš-HU}̎p|q>H)@$q B ȉX1j-C|ߊE.PLKSID٣U }X#@Fvww0a[݌wS &_@,{@(C&‹l98>0: $, 0(/Ă:P\ 7,9B  :#!C,l*2TD8B/$ɭ` ə&˃fX4Ar|4-B/KH,X~!)²y/CWo|#xx@|y04q IstPڭL_ %kr&3B8#XAJN<:G:kpq1@,A 8B `$:|xFƐe F߰_ }W Y'SpG]O4_Mq"d0$OGģ6zȅ6_ ;ȆS=vLPTgy Zz1n pn+ГqCJt_#2e7ؾ'5 ."6H%"Jt<~ĢٰIgA,b 2E,$,T3C!/ n%2N*9|Ek ]&:|<,l48A r9"ܳE8 8fx,B )#Df4 zՋD`yĈa:Qs[[B4`t+&j.t&Re9Xcȴ:bP+d<@O0 8P%"$((A4)kE)Ai,C, A)8'q$ HV1guܡ%Noko_ %Q pF~e 3V'Zt̢_:Yш+(e)ZRԂlpL#(!`ͨ$H!JOjԤ.uIPr('JAP<ӠLPMIvaU}AG!\p76P! 8 {e9Zi"XF,$0 R GPDD`)AU Ir!.JXiTg6$DɧhE{PYg D"^ZYVV\48H'2$l} rNtkIgiŘme8!N "2(AZ&y@ . D(=&`P}Ad8 F |!dB (GĂD7BHp#47ܔNT WwǿD _C Rѿ0p;FRX_/5@B:gD0Co4.0G wNmF@VN)la7”y'~"ȠĚH.p`pŶ8,e7͎E.Gc TpDو }gDfA &hy$T!s%-ǷDB f|0*J N#?V@dh?^"!ceV /^+3Dh<<_[f4/Ȃu!`"3G<5EgaH2kZɆ5917zF'AE60pl \@c  J  ` \` $ϥT THQBLJ!V!d t@ $H|AhA "|ga` Vx$ ܈ A `C at{a|Vh Sٚ |г n|!R!|!^da f\ J m,``pF+BA;ENP%QDl %FN ED1O%%h+r a ! \5-0xmfqnBc >iA4>d %`#L8B]`oFl(B!`Of"$?ìR!(r fL) ^2 _~&4 @1e2"1Fk j/1 "1h!vx_v $4BCD#΁U]u 9EV@VACCZ[ORe#Ml%J*N t"Y#V@ @ AZ D A@ڸ! F@]4!b>PGp }aȁ+H!DS,ʇ|\d  ؾij8@ؐ XV Eg64>E擴~ָP %QvPrkDO DBa$2(^A ؀} ֶ mm}an}A `Wa4oIF QԌ22&gT_@g*iLQ,bJ@&Jlr) JwitK}>^TLhb)&:ϙL%Z&x$x#]DO,~FK t4jojЉԉ(5.֩)w1,k&A.e.>s@NЁAUZ,a2tr# va;K8+gA:7oޱx<pT+ bo"j@"L#g`&B]D#[<@]n(Rv$"`8!uSG da@)>$?J$b"K&1&/u-I"yj cz-kj7l/Q(f-F;pa2f #+ ʠmsMz۸ `6 oaԥ/u 8|U n#VA[V੾AVJ*-d5#NEb!Bki!dL"mۚ58 X$JlXՁ 3ƀ^ʰ,$aifV?#/?RbHugu<L  Hn,!A@cր,`6vWcsb!0zA6>ka[Bh@n>=jM?~ d@lx p:Fh!FL|LbN,?#L|+E'Jd@:?JӁ e-SwR`Tj>@NgxAQ eRLJEBAYMGWHa&"`…5Y 2X٨ z!aS1ƍ;f ȑ$O"ڥ4v *HٸC'h%m7%py.p@O I 3xJ^ySoGW}x#Y ("  DB$2QI0x !_S;N < +Ѣ;TB ~ADL2<4C4B(ً<tZ k* t2-/| zXH" '!(S w+MBU#P` T^+Q]*֫zXN U2!fUUPV0nx %~1,cGDBv~0]AJlq=GGat%*i4q<. ?(Ȇe#I$ _<$%j:kt ^^@$:3 QX-Y$h`f q̬-U l"ǽA/B)3bJ $s qx 2%4Q{~H'lp궶 6Q KҦsoQM?㹷,rA *^ 9`tgr'p"]߸Fzs}"A AA,Fyu/X@!0@he 1;cLOx-V:Gc Va;!( -B;QZTC 8@- G xt[>,ЁȠ1B wȇbW:Qvif3Sҡث$ -NS݊ e# W*j+d. a[ C=$!Jp.Pr+k6 g uB@2@ ,c (Eɀ I` X@ Ȑ8r$9)gyuEr)B|VɄ!l 0yqLvik "wtlFҔ LN^23j gXftB&?Zo}Ԇ&9I\CO0-mKV2&.tA5$0Sa9]C+z]XUDKm ~* LPRw:V"sE6 ! =A28$2@ Ԗs0RBTx R Ga "JcU "-Rz!RJ8J؂. f*!*1W[VbXSqV:4ki,B!#x:q np DE$PI$XLbl$PRaxխ碽YB!P PȨ |2=&JlX?>PX^(r5 Rj\&_08D4lzM @'1 ֩@ M0eni+sꂋ%y&yp̜lTΨhT8-oa=f|Gn?MpO4M5*gl\B+1DC6TC"DZ\rY #-@ÀFP Ei0  L G(x 1Ҁ?~@{ )p p) ^TP#s/VwtcU!y6p~˄4pady DaT1PM1ԑqN`2Hc8yK%fL}csAACdTU8QF|k{ Ly{FJ^aay#|gF7D4a76^6kcɡ ' YNґ0g| ..%E^# A, ^VUv&0_V@?/ W?`" l\"`@ `h /Sس:ՠ! b@)!@`mCBND$tG^'&c!eHmC b%‰Rq%^B W /f ji?`f(xR0 x # 0)++x&P Hr*'[CtCEZ7Dq[%DBZY _ @` ܐ E`C vv|4.P)`@*. lpT`!Ԙ9,"@8`~3XcP15]Q`G2E1-`pLc1c5L=;pP$o0Ja8Yo?;);w7E^QҡWxjLĎdaNEz0w}^և6҇<A}C9D4K6E4^! B.@ cj\Jޠ5Pk.pbP "d@"w#"CYC`=Ҡ +#~`uf"Er @XAm!&eV4@ cd C!k2X\ mUyi@Oj 0w@p?`|P 4 pV+ry,RCx)$W+Z):T+8[urLD\5rY ` R4E @ "Ee]tl@jw{ ~ `.TP tp#?@8u'W#330bяq ,s14HI4>DO4L Nt4stq1O`^q@ESc4DM+0 93$sd!57|j76kVfivOuý1 8g !"\@@v v.0-lptK<"p lGHE>A@ o0stVTl>8<6I İPBKXZB[C%<Ԧ< w ="A@ 6 K`(o'7;pW8,I[GB"qZ\bZE+A+,2+; ^:0  Nph`FC`{`0G Ʀp`-`0"-- _. T0_A Y)` L?ي)dB8HpA0`]  !@$ !#!bp=2_#Rԗ/*-4"%NuL58…#G.8|ȱOY!Bg֕N;|ѺjEOWK6|`Sc|=#dȏ`]:ǐ^VX^?~\ȅdG|]BŰo^\C>xP ]xܸIdiحdn>C A$JXdM5FDT"M '^8l/g%PѥO?gjA ”@0/A6l(]A/R>Qݻ"xNveD,aNi\d;hB /N:M4aJ$/F df@$ O|GAfxg$ADAC“7P$lJ*KT-D.K.// gO=A [7 8BLAD /, E!> u#G&2rI@Ί p DqF !"dŅ]d)&JX 7#G@B<$c y/%-il%+-V >s>2zdmpe^L0cɊ2q1d,səu˙,gѤPp1"$1 K#B1 AİqA!B~pp@48@ bl{{4Y%f q,YerRB,!D#5/>y8 zt*.}̗xC<b0{zPKcZQZAiỹ_XKt @B'QMGHQzl bu@G׉HߴJW:+)#Sci$ vIށ:hi6А8l9r3g`Ƃ:Buc ~ "A4YG(uRB 82\2׹:R df׭"0ژ" ކ- w-|! i܁ؤm;)XJREg1%c7 gl1/3ef_C"^ƅC [r=p3/lkH" d@@` _{#ߖw=ynSMCf+syr^uj/xw! y);hOxZSI~Kv⓼t(Dt.BhjY?>>j5Ê g46ʟ0RB6A0KB8s D@HR`r%YA,AY2,K7" zX@[\"{Hz˅/4vZ+?X30[Up$2H5Rs&|p'= y` Ю{ $ ;"Z5hQg Zȗu($ pN1$X4r0W )h6؅IKa0  ꋤI 0(CK2 w H&BB| nb: 'x7padH_7'"@28*<2 oFoFYmGBGH=Va2ֳjCȝa;D ,^`A)Qk3+ђ艵5߁ d" HaҳAЏ𑠇:ّݫ?+FZ?+)Ikٓ [(MJF1[2$K,=LV*6H`(7G OypRXL8;5p2r p92\`2n+/x$2Фu])5XzXҍ6L;ڗgC 0 XH~ y^X35P_hS|h|؅Yh_%]!0M %;^  Ŷذ B |&o1h{LB;2(pI'0cqbYBX# 6p&Q&:DLQa谜9|`Kؐ^@(y4HĢ́XKFc$ ;#혞 Bғ{(aɪb+@aAA+T15,R@7AHAp6(KJrqӄHȂLo@ U {T-tl; RP* H*( K/5ps<\ LL⊄P t vy{)X F50E0pLy6HXxWCym!0pz$Fȇl hnˇ3(2 &񴋲 يoM,ϹO# KHocAn˄%>g5 ߼]eJrz$)*S \8[@;9 ^{,Qg4*hh åp}q0)y\5^TwܑES#7wdj3)hvrQ$4|-qQs\ q,Q61HHp@XVaeB`b.5GtȂ' " (\d#x( ,%ZuU`w*`BBAtX0`@@U$u ȑF@+י3 Ƣ"BG]բ;5I[kLy"`D r**?3fV3dV] 쒒#Eˆ.0L[Z.} +푶G`U:-ٲgߎxKڵuaA4B<@('$ 'N~Y.Tȃ22F!|,"O  #RޞH\d `"rKK\L. k,2H!/(aC&ȧ4ub>'lȠA޼Q14 `x2H'Ex?H|C\r 4 b#1vF /P7Bcˌ?!" q"83 ' 8;&z"`?̰H 1[hqS w>Сwyީ%~Zz#{%4j(?W )R⒢ b(}#X/C'Y@,.'Ad#IJL,#˰qXH@R!NHD :0p; l1 kc@DE%b ~|:CF(:~LdDDqKI_K$2'k|bNS<($ sw;A !~ uG0-((83S.[M rFGP]i_ 5^hu6[ v^f`wzXc% :CI.#%DH 7`FL0 >X#=D$/Pi|#r5W{sĢ'?p]w^,Qz}Af}_'xɁa2bZaTj! vd#2>>)G;xC ͨRѢ7x;`@߆#1e2?4A4}<8&$QSQ! xT"P9ӡl$(AUTQ OR'4A u8P-6'p9B6J#8Łe!:p\6 - L\M$ _!  `% PpZDt@7FBxYf  ̑ X#8CǾpUd@L,68 :Pcp_s(3V\%AG7htNI9)D^3-Fp<-e(C࢘ԭiZ6hCK^ʥ<&bn#G(<@KX5 :&X!@uC6p.VuUHc#*ÁP Yw  51kd3Tsb4"h`I@"ARp1 ;(B:Q$bDbP (EST#-{ XO~HQ^d?Qih, 3LU pQb/6ze?B$0jB'>EP2 H@5 /{#v+JldPi)Ĉ%+K e5 8v>t ,A? B"'" 2 ob_ `A20@\)Q*8"CtC g(&J|ak!A}. Aeu( h -L/5Y8$6H -P T Cm.T"L.p0 CV@ThA&.1% *Z0.4zTai[X3[/.{C 6&a k*t7q7 pP$1xcYaNvYN|#!@)XJe X'5%{^WT@.D&EE f$awIKxB($h?  ,*2{ "-A.A4ᖉEcIDO~"Ц DZ d& I":4'^7RhO(JP&Q7\v$6x b J04b3 ?L*od UN,2x8`'@Lx8cΆi +qPaZNPBAu0 &8jҍcZJFB N@YaD$@C`XH0_BbvIJH"\ *#q2Pq e |S?@kȡi=$Lȃ5MX֎bK-Zq'P:A,\h^Y付  K_ 7$\%`=X@0\ B&xe$BĂ%E$ŌHY 08 k[A!*ٌr*AxğF0]hC T1A?DRB>B9SAhT@9C9TڈTEf[@X̦F=[ۿ ZȅfJUG~* h~5`J(b% dViV ߝhH Oxb!ȥ&}Oсqiڀua)cT) Q%ɖV @D;zYiW#;Wzrm 4d(A7hP̉ə`XVu]<3$Ta}a<^Y *v,{r@ <,2b<'OC(dHCn@1@!X= H*6A)!#r"+r";4MH*g9UO%d<aroeʁ4H"!ZIɜgqn%WxVɜ' |@ }cIPLɖm)nXh] @d]dH i& x)zPգ.t%р@'xCC!uJ5b]Pz d9Ca'}$S$?QgYB\Ό:A _Ya$7p/XUFD0 !pC ܃huX(CZ9U$x@% 7P PH"83@X^ȃ2yk 'Lb9@gӵD>hhJpUu^tD<لEa|1 ]H``f X0tYOB 8-\%$؃9 x@,dBm2 3.|J4aʋ.T_.ɋH)ȊD- M0$qwK/@a(XyK,DX @p$g%l,_, D)X.}N4E*%p>Ae…&P:H8XA[4(V/ AhJFE Z:7|0@ :L>X@>[KBg8TcڸC=,؍*6c q6pJla4@>u_cM@]EٔԮ!1ݬ E Fvb3{;;c<{Q[~AI' beC"%"HA&d`ʹ#I4YUtf,i` DN;O"_AEx ] oG^a.x +4o;v\fРNEJt1 ]iЀ A\O=H'Opy݌8} 8q6l@"D(;-4;~A H ΍w1;֭ WKC#~tKm/=h:smk:yr۹{ s:ډNUO6f\!qNH pP>NTLB܁ -%,`Rc(ď/wpǏXRB*b? @`a "ё tXXC2?"a`s\!t<($j";YJB$B ŏ5Pa5zXEiViZRe@ӑGpћJX#..XF^Xb1GP_||4]fETS _}􈶐#luUXn=Jv#u#qE2XXr-^! H#X&L~e! KaH(ḆǛuw䂈<``n26QEeXރPib -v&4I0zѫ=x)ء/O:qYԊ gg\J8/Z ݐ 4@@2NԊpj>nj1:{0{{n9+-Ÿs _a `@,ѯqc)X(ABB)WD @0F: _ m-A )):d_1 8xd*XEt#?$U:Nu*)T0.""eKYbr,` WxU,[iQbXF3tJCD:>|@pB hz )W$<G8؃AH@5] bl\Ĥ9A Nf,<|'JT2bYMj1c +"u|!KRag("4dioIB )٥2tǔ9S53X (Hs unʃ `q4piB<rʡfh`&/EvO$m1\;1s&+,Oyp`( pKJzBl%@:ֱ!8ᣎ_@H0<(o0x #pG $A@"`@($q 2!HP5CA_AzVw [}!AX+ gB"jTHӁD$J0,p*iYץ\YeIѢUH+iWA% :hb>|HBM\$rQGdqId؃$\!pa\R0UB!/BJ % Tb!]J0Qs b7xBK^%58y;j KXֲ ! ^ >XK8=%oj4u6%f:CCxefܓ6 m  (EhGg9(vRJFҥaSv,CB'LwE΃8Jp$%@kia0s]a>(^S+Ё  V`ȡ A=` ڊH.ZF ` `nV`T!Z:@ aW|%닄动Yo( aἴ-Z("^! $@H" `B!*`=:" XlRar ԁ F>8PI8^dO.ޏt3j:+"꘰"j<4c8(ȸb+ndCh~ 64d uXV(`|6 60Cpf<`9.M9 N/,6 6,ަcpp pR-=; +-Xm,s^*(:6tC@h 0v^ (!!o#A֡XK"I`&jC` ~ R hZ E| lnZ !$8 9I@'8"$""A F 6 | ǯ nǫ@ V!({D 4R .k~h. J!3 ^Aa NeS,H%ZQ`Th*΀V?YȈX nWDZV(ۜ  2!! 8 2` Х  % T䡴TLTLEv\ڄbNa!G l 4` 1#-bp!.G5^&ǂf+vfevp " ,P ,Ic"F&e6lC/,/.vI҈h|R`6l0&,\3>@2`00-%j-3ou9@;+VCQy 5ap\d$ :.m[&4DI@@+ afrr~@vHMX|"*LH [$A| \ "` B(`P ==[|ȳDL"N gI!,  *dnj* ~>! n4r*!q.D,t@@.'_W/EdW -բ&*2-w|,",0)z3\C\ 8dtnX?@hm^]@  xAbD ` X)N.4rb)  Ӏ`oK3h )a)#0HU;9؏Z#<2mg:;6J8<`R~bs6c>JngL")#1A!nl{۷t ( Ms"!ၔ+duCV 7 $ Rp7Y`"v~*⽁B k߸\St+a v6 d2nbؘD[O%@"a/ K\:AM@@8fAЇ$5ʪg|Ǖ$oD,e/}p۵ʝKwKРKc_o@}R@SpM˘cV-{kippK]$ 8JO5b..T>MKQ uQce)$qJTZC<ȯ,T(.֑!]%C\sxE)|lZby,uqDxz ˠu~uKw2{VbzGBi0dx 'XL00 TB@$ >20p3CL :8JDG$`79hfym:kd+n `D2Po0 0EoY]Q'dF$.E4FA%LsQ '<%tX\dT@H%;PQU?&6є;%jE[r5Y45TQ`@o'1H' rQ6DPTtIpP@.1 47+Cx㨱 0L V,ˬ:o8xf:GT}J!GD0E(~DNTPq:RʄG7"}) g 0@AHKdN#a1>VjO: bI@$B1h!'ؖ} H)vj .\ (Ý橹Ѕ* j*!F FlK)tƀJ"x ,_"=>BH $@%Aq8nas0i*viΰ3HGzÐ$Ҁya+57T'$aC@'r<%m1N:Rwh/F.iwA)8}f Dnt&O&[B0ՈK#2x+IۢY$LVYw>mjЄ&V58'LDLg򲝸2mΠAHeD"\ j'B 'ExK̂e k6\ǑۉELFn(PU/ ѡ:u+R@Xx{0 됀iB 8ߓ 7A/0tY0 /,#C>rS?v O "R;dTy,iP4DCJa" |p :+"%`I#dD!0qPXIc :6|c *Pw>}֨i\A\v8)A\ e^4Q MfWf2㷙O jIae6K2!Ar̋ae[e`/@Cm\ RL)3J/ggѸB _rq }. MTըBhL`ҙ&.> B|Pa  0#72;Ku;Sw@G$%E!O F^#Q*mF! %0" knp:  b P#:o5T 6=T4 L"^^e_ @D N* RǞP*P**B! =GuS3 Z)` ^Hxэ"rA3v3g@JL3TQ 9c7٤x'0GW/1#/T)IV߉vp  $p* *@$ 0 P0@ {P  ~0-Aa{@ JJ.3 MP5{,D'hT2!5(G g+a{ULTAd N`.pel^biu<0`.@<@ z+@۲=۱ S6%Tk .LPOg!PM]qJ Q`-/!˾\ 󐼗d0{G̷fΗb D^/Wς3L3%i~}kbqW5ٷ5Sld^͆JZ"| KH1U pt8 A9 n約7sꥫlGU _C * % A k ǫApAp# $0%~$C԰o  w'zU`ms,(#Դ ʸ Bax$7RRv27 MS@ !# !#@qR2I }j^h/b;3Cd[ f&q eq2#fq3_j JdW23^_d?3l[ 4m!\hy3.3ġ1 +Ip$w\aLJ1 . _wit_u"/kY:~+jy-Nm>g\lMن % WS0w=jAz0@*B.ﯘ P?HErCtnz}Y. "<M q LPUUA7 y@#JС#boH{ԩsf9%H5.c"K6A̵yFL5hєM +?Q ^eX"!R.>XZs,zV >[u߿A;vxڃ: j -A޽t.% m0Sx|'Gd$H x A"wtw'H&]$ڵI ޡIq$r¸)~][=ڥs^ >7tׯ_ח~~|ާQkY 6aO~x" *DX *  .!/B!1 ) 'Lo!`$P攇XGpԉ%Pw@r'Ǐu2`b!5J)%?s ONB\`J - YgX`L虥]@V]MVdYfE6 ..(XXUW+e ZmZq #7̆|/&.)$V K 'BB_2IH bOœPB12 YI#6r ;"[O؈D?>IcX 9!Rbapb$u``,5p,y-$/p9j FBX+ Q\7BD)n\+fx(4O&˜7 l<.nժ V{<ݣ{ɱnw&ܫ7zK>-ys+8ăF-Є|"*NбU2׹%/uUb[׻| e*o   )N#mɄ[ B0~AxbG|, JH.&I glhc ZqD8ue0jiN@E-QPRؼBnxChI\". '9xiNapAn:%iԆ Ԣ X ւ!3) VWH.{]@ UAg:wOwx 0hA ywg?jy Dn]F8i[ Tq:Uw3@\ @ޱ + \ ̲5aJ/ XFr\'pep NJʂ.Np`Ct1 $ BCȣkB)@EbTZ  LS0E2A:cx"' &6$ Z SP ن|Y @IeYXn.h1#x .00\׸F.+.q!"7 fL= "$ ſ "b{0#\H&~ T @LX!B44*IJʄEi 8$DPDk. = UVRgJd#~$ ͒& X=?(4pJ (2)K40 Vӫ)H87Ԑ5(" ;ꘪ D 06x ရ"°θBnΡy{@T5oNHC`s9+a5MA\NA@6qh""Hɢ>94?LD?ЧO\` e"`  P6X6-+:+W"||*H "n.`/hH0&?"wqqq!PRAY3*,IG+TAE)pyHyh @ 5hU r?<z\p.y; |h DذE2=SYL:B rqR=UY!hRIB豆k;"o &x&>z,J|?pJP {I.) 0RuI '6l{p˷˸|K!ɂZZYZ  4(yA[CB y5BP qj|8()HAф Z*+N/G{;Є`}w橞|K@zSݨ@8j^hƊ !OX ON ȒO3=PЊ,50r'G.^ ٓL@;xi`K Ga|'H #6"?L"u(E pXy/"2Ps{`"@ BP?Xu/kȆb@ `@RZIH SȅRG`I]0d HE"=҃]Z轑,H\`ėc2HVy!M1XX6!/䳣/9Ya ?|I"pт:oLI{!0ip"s0'q 2!/3R"8K'S,yPp?Q1EhY JԊ-KLL+ȍ;(AM ԹQ86ADc"<A ]c5*a+< ! ܉ + o Vٻ1DN@H+HHNw756,ILC*hDJc;̙"(0cDudF T)OH 6h# *XP=!*hW*Ň<I-t''yL`R0Fc&8&p=3Ӂy&p &h .H%%R 9w%-<_h(("2'>Z!a#=U_0 Y0DT|ȅ2ew28hƓlI .Ky6Y|}/8N`RFhH@7̣/`,Ӓ{8{P"Ȅb`K.OOXu!u[ }~&r44@x5 ؞)(Y "ZK A  OC8<@ @j DĞHl@B*YDCЄ ` `Nr Zڵx"0:6@6^cʹR ()']! fax fc6f2-, 79J&ءPh!X;|ѕt@IȲLp]3Tqp H{P &\듀悼HJ0H(S7 Ly ZxiY)'y|xa)hYHGZY/s%$wSuc6^ay#}y&СeKH`p-{a /L{0"p{ۖX_'x}k~k~b2h*C , / "5Db:^\R2AL+B 5h[ H\ AcéY7$%NApT7ymGI3ZvsKHL (Z0(ߡX}"qÊ7АS"Z> ?TX-Ek?!qޝ`fnҍ!t8j!ȚL  Ȼ)uYtmw B9ɖiʄP(Puu^YpP_7P3^wU2U0/9Una )030F=>P?Qz!oa1!xyp2_2?>2WYmr⋡:%\'ZZ߈Eנ g )AE"h4qO 0v(Й'OZPn!>Z"TnΧ,G.mtE`':t4<G <{Dltq.2M3G:ѭ E:u0' u!0L$t& {Cxe#pdV!1-xHq,x@H%BH)_Ta%V&>40 #4.)J"R-ʸK>rG\#Ƀ;8$,E Q|1$P0y!pHepIRXC0l1N!8/A/.dB: '@~J(db >XrFlP9C1iH)H/'*'Lgt~p!; JYd|tN(K088F~RTwR;1{R߆9VHH.ZbIȎ-!.Hb0h}30BLg0)nXFQ>GFXV;Uiϡ@=9%sH 2# @lBA'`7/G>=,Hl.0,,шrhc84RFiذV*V4e +4lExj"8 w|⅘ $U h ! 2"t@HA2dQ,"A .үd L'$&3DbQv(; VPHtbĺJ{i,#BH?jpE)Kg>*!{-h!C@>"2*$ #0eQ6ԣcCBF> })B+/ ֣xD0P 9DZrvbCB(\ݞ3Tt#7$p AXP҉&h#s i!x,YXE~e4 ."OApD4c`Be"*AZ0 0o @h8 <1^ Ĺ|fg%9H>aw_vyN1YKh4x@Q$f+|UcWcߍ#qʀ2u"zYzi~!B(/.Rl}@`.i)r0 ɌF9ҠGQTArN/ped HT,QB jqsD&JZ*P! 5b)$RRG A80`ȂDB%Ht$ԅtzU SEH.4HO>p -H[Ւ4 0IOՎ@8 \hf Nlx%Ё$$D8 'x l>̛%78qC'x*' Aq\F d<@.TYHOF,ƽi̹ K|@ T ŋߕ@|L~}] .4L!Xݒ$ X@ JW^EE"} ܉@R$KH˴(X5LD x, `EXD)}52d cGي ZT.tEb J ]B$?< A` qcp@BB.$C@ 9DIx) uC,, PuD8=0'`L8 B$I0A(ș:P! =ԍABH ܕGƘI|҂P,,Zگeϯ͂@ՖXq`YpHUxxN Rh<ڠf=dC A7dqDG&:Ao@bI!Bhr0;/A> qp"grn@,hx<8B,'9v2#ǹ5A|NQO|YD3@#y`]D,$"ei!A/eU C,D'DQE/QɋfKL2IOl^2 4Lt҆EHLSR7RTȈEnjcR XhZsyY5,B L,]^ V D `@ 4we bBp7Vˍ x\h'ii:f,pM(X7K> |pĂ=Q-BM_lC!܎\HG,% G!PG0`.pJjmȘxUU<}eWv vC,4k $$@_F]2 d`vINRA[ն=fGAf C<$%C)AB:|,Ȇl6k:aJ'd)|0 C,|B.#'PD~A'TE6D- .hVX/DP@hp"Bm =#s;oJ4''w4@.CvChȃ10 jF,TpC6ă%ÞڨC<ș:@ d8 /!zڧGQلhHQEӫURb^`* +SץY4@>HZUOL0H-e% Ʊpʏ`n+d2^Op "&?9bY$p/)P9L f$$ԞA&MCnZ"̂gvgh,h,:C}˪4'\'<8<4hqpYs -=nW)> M `0t'z-Ppa 1 Fr.;/MCMdRm4ih(8.xs=7eH\ Ķt93CC4TGĉI &JC $8BO'P <")ăN'|8,|$tGs8g$0 8,(Tm;/FuFH66C.qPAk@vvq } -!m ԩ. ѕKB=6W?n^A}j}2QؽE.mҌz5-% -J ߖw8ҍ8Y1*#'7|A[  *&L :!k'\WX/\Lyguڱյ;x3RKpq }ͿEhhҴ4u$V81a4h frk;4 "@;shDQ>{݇0ؗWXۿVƽ6ۊ/y`)jo{Sb?%!APw$!r^do4EP0GI_JYRK@YP i|#đ q/!C5Fr ?D&B2!"LH #!|"B .#,EHB!#?։ŏX uԉHă *ђ G #܉$P$/*99a#=,\,ASP>sQC ,h@{](5pI%Rz8 E\..OXmuOKTXf3[e#`.K`Q &.= eDI>Ĝ!HK{ X։X8H "+' žaбמ!iX`t8`6lax6b8 xqedeH8IjzpKbNCNz @ˬx M"N(KޘღJ ڨ,.v˭7Ɯ:D<>-5.bjf07ȦM"K8۸J>N;$N*F `.AA4**Oq!gu@Nԩ  $8Ȁ`,.@'BPғB9iNjA*RрK=jB [LC g8«Jt;ժUvRuT{h ]lV<~_LZ%(Id"W,.0@Xrd,HNk!^0GC6V2#a%Br{.0Y4lrDIN8!3ё22Ui%x\'#NcNqJx JpPH)-#:E(DլV@晊e)7t:1Jql` Xh%РqSdF82oAy1 q3x bcAhc࢖dSsP4@Nb$6]5Ig"?J@( B'(G= =TH˜ A `@)/x=,oU $cS-*\oP Էh'!P%,TTB"BVꅳX-^J谉!+SOq:]`r D+TM nc '࣋2$8?V/@( n>18 tp}lw}hIO X(wⱒMm\4S:NtX"˕}nաVynEKe |ANfT!WL e+*Bۇ  0-RxH"7hILNXO]Pp::  |::> RNyEOLt.<+-OKh['旹8e[YR>Ƭ܁N0sOʘkLLIadxl\\XaxfPԜXſi&y.2x1DN\uw ȌZT<@kp /򕷼hPr5i(@;l+) ;l>^d* |O ḁH BHtĪb$baIXNHHUGH: DjoPOUoЏ,RaA!Z<`/{@rADb(XLW8+dO2G92Z~L a  !`&(a~m'D@~\l0" Z +r+" pz|az0I CchViΖZ/jF)p.)=Vql-0`&6K@-4# k`Frt=2*!xeR`F*3:3J:G>a~DijD a[Gt &J!Pr`MTĄ "$ Ё .$BG (X.҇Nh! ]O mڠZU+.P JTx/KK44WdjeF#|:M[ͬ `HL=ͨ~@'*ƣ8BkdP 2N,}q< >Ngh3)e&j*U,c8J:\P*X f8\SU)8Vjb((4Va54@5B0v`f(jIxifXN6FN02C[ S@'-f)2'etjbi:;l@i/]!`TXT "^mrD"aFXA&2"'X!$P!d$a!p!LrXJ AJhem$j 2sW"D#$v-vm@F0˦]hT"*!eSTVVX%U$ riyU@,!卌2!oD@\kr~!(Ɓ $![Vrz~ܖ 6 .@Q9Oīavaazqb!~`pٖ Բcj*vqr~pDYsF!Nnc f<N)urw I*o5WX׎P? lPh C7pbs{Wa,|U.hn<`-N+h}*d:!Qn7"7#/f>Ҡ ^9DҖ_o{Ί#a\·L!6X%@L+K e K1vNG6e}b[6>kBTt,Z(e rhXX ¸NtT e;GHqkKN$ eYKpEFD-maEm)n!,AA3b `Ob{&6bz!b c A$`q3{')zI)l)wy(uatc|q (}is.l2n1~.N59VgCc|5kL 171&Y ?514sf0]Ijfxi~0/oer3ƃpau a]@fUxj䁁e: Ϙ : B3"|aFIhDXx"OX-Z $NF@ba ֡Ld"'> JA{؁?tBP5z=l/Aaf: cz< 1LIvƞc2ŨbDzRj8Fh q{L7C6w7.<.0:<(rB1z,qI~B;#B8~$?ؠX©~ީ̒aa(F,/iDkmqᇧɀ{azWּ-h%-O*2a"hG]LKKK28K>OZ!} akx{&\V |e%+KTO_ (`F$!~,!}`{$i΂!܄ a ` 4vpyN`ul\ɂ1K:|049<.D,B&)b}ӧ5A8%™:3|țB-o.]AK= F\ixj8 cA4Ō;5^A.<`~y@;;HƄ%s5%ׇM۞pWMi YT#T?8NNK,(NFX^m?<g"(P.'X 8RJ).A1 L<\L4фd XR ~dr_|7L$PI%G1c9cF 運?"B:@S ,e)d%z 7^~9, diTre\pgM2.~1/ ZxU\ >b%%,dlNHf|*iC@0_@ `^zCL0a$Cjk&C 計j88d\dL2 7%1 D8q8pDNCԧPl@{PbNKfI}r`,YIs!|'~6qO RPΕ1Squ %[DXbWwQ? b^"e2^;GS[д 4 gu֘bium1fcx3HXvm%t4uIjnA7_?K!F "?%RTQH %\F y q" 6IΥ0_BF)F) A,K!k.2=~DF ؃|Ad.YirfW3fMrG./~ !*$,hI)揺#'yX EhaLҎ`+mo"7h#KjشQU`#R?y VbB/KDŬ&1= /& 'DbF 5+B#N=HpCĕ=~mŃ0%~ oU#W,%uCV6H8qوc7 uc#)q;R,&@ł H60'(Ns0v7x,8[O̥gbME2x"< Z~l8^p kϼ҉$-3Ksf1"4i[1YL``k gdn։F+E54Y 9poHRdgVcYNs3D|3B?Pbu#N@.bG?::GC x..<  8z!,Hx@G)T )oeu@Edj\S"2(A#A(2T#D^Tֲj~kSʿNPCxH=k z*t >.x/U~AP) &2oG@fi%t o@ (`Y~1 {P=AWin8RD@G(, &D92L@ 9sc\B$I T ؐx‰=^YPc5z Y8B,6| HJ'.0VMSd\yK dx$-qÉ+1^sh7P)<7JЙ-q 9 <3aQCF2 +BG@ G@`T Y@H Qk9'$b(_ C! >$pk`( lY>cCB)@, V'q\„2Bcb0#n?k@FAnZ8*!#BBRM%$;kg##TVr#d%0#Bnp"),%0 "Gްn"-` N < 0% BG `s,G+LC 5D-0*]_p`LjH - j? 0 ˰.8 ?@SVxCd.34`q15`Jzz]ek1fO Qc x*;p6|hbH4{6Lf1Րb^2$C3th&+Y6@E0P`1`P#wO^agwgt86yHC7WV3PiY.`pgȕ]\9j@ e l sx P5TS3!'f0m/2,3#Q5B#+@=' _P,٦*@SV"*9$5&f)V 4oft*]W4`W#^ H()y$DBTgr'&@ +B))ԃ;B`BDp ,r L@D`` P*4$A[@>psT. ^W]UCA`kW_Ėk0 `@l."Zx:6as2Nra32gM*3X&wb2kKK7|6J44AAǑ'BQ 872Ģyq|cŧ{ Nd@N+~ 4  IbfaPfah0<9P)QW>/b*zV :sY "pUX\"*ZuX #F_XBfV[3sqǚE)V= Ro@)*wq\W\ t  +B&A" v##ɊY,t>yYK*`DL^p %-ukE\PCY /ו @ k`` N0Sg r0up%@dA @HB={1lLkдNK&Vd)0|`bpǑ{'o$. jsP #2l2J5yPcNz `{6ɓfV&oQ]ڸp6 Yb[Ŵyza ap1'g% sa]33{S8kPH7͡1a 6#@d r@ w +Kѻ H3HiJHQȪ! &nOHWiJ)#(>l%t2VAlmvE=lonE L"v5'A^Z^ppgptA@B=yx&USkm$ aL<,Z$0 tE.p"=E pcD0yGP@pP) -/t\]p`Q@tY}w(*I H3Zy425+|\4R273d3kQ IM9JtJ |zgC2!oOdeiehcr gcc[|]2‘io;\1g7a aFA0OhF b0yO3h@ySAA р LX!P\UXIRs4>.luA0CO)І?:o? \oiRWd2'@xRq(eC##098WYB'v \"Pr))# b%\Bn 0+=\  cD#` /Yi[  d"ž+^XX\PlTdP \"2֤4b1aclKُR:;f-{e5WS}eW$2MN43A}i|;2BgE@q4&KT3E}f˞ ց@L4vg85Z@n P*zV\ [f@nVR rn*$_/.A9@Af?+mVW &qfRʇS?\JS"Ӝ0'es?ksU*vHL*ErYZD+ B ^=i *r:UE@ ̥-Y*+2ܒ U-` )NS $PXP 3U'zU  g`5"$J:ܵbC3zc4Ai;L>SKz§$1o%;3|^nQ5M?eG Zn4;LQ fwQ @tܧ <PhپHq8APTSOW{!ANً%1Np* 2>#+D,b(.n ͩ#su5~HOmWBkR# 2B%(nAl,B@B`#* T;55=$@`*" I|@@u Xp h]:Gr!fƒ(l& q <usC602``ޡsӑN23e3-p1lCeQax~b_je*&rJyހZA#[j  M b@AhjԨ(vP#!<ф0Px #X-e< JUUQĪdĖ卖 MUwx&ݪ+uhbZ%B&DM% [*?2\3DBlq|"DG>r%H^E yHD&xU ^a@! He! L(K0"sl,Glr&3X2ۀ3иf1UrA6⼆3kNCe!n IX+IqTj# m% 0 0 |#p t=q\d(H0!q(,B4pn"; 2$@0'( sa kxJt$ XjRT* ~HAXIp-Ա&@q @"E(, M ը&Q5Q ӧ,XhdKؠ:h)TPzaCv0!}ԔkAPm`A&%l f08xy0$(#:&b+ %oDy 6D-b : ޿WGaVB0@MK0p$/nBqQ KNѠ1Lg^bUZF.O8edI,5|Y 2 il}∋i! ఈ%MTX"5tP ĵc56P"$m [(GL) !C;!w:l2ނE;eM=Q lkdIM^Y,$:FMЍ > ]M%E;;a%#XIuZڤ(".RyB?°w :\O0 ,`*|5D!}[2>IF,<,2e4\@2l[BoP7ސ1/ClI?JSc2< ԆX,8 Pc,.I ci)C4a  /ρ7Pv1!ˁQ, A7dFnKx#` GP¢f=P1: b@ǕK pt&Pd0:$ yP7qơH!w?) ",#xHO*ω  OOb\a#6)*3+⮇9|aa7jpIA"p;!ƢD97tC2r ,R59)"ÂaO1W!r!9$^: CRx08ʢdA,CxAlY$B@08D $G2MDDO<5"* `5u`ep\, R(L\@H8 q;B` 0ۘ3t$)f K c <0s 「a]jȍ2n* Z2ۘ&l\G䘌;֋f|1& K(&N t W/d/sB 2 o>rܳqqpq Q2ȅY$RuHt # `?J?$GP OX2`H Rxu($69':J[є4*V-O!37?!7!L~,*dLqCv 'A8y7FAƄKX 52"ZIؒxK{˒jH߬oh񺉐7: 7,+" 96r"8j82 $Xw!$L|*lO)0X(X eϩx K{DZPݠtH&`f#p`Xߠ2ox ۰0%oTh s ѠɠaҥPq9P  IQ=B@&Q#?X@\{PtHzLPDZTMUU* Ob4;(d+yO.z'RV5bmÔ- CAl-HL7R\zoM*y+ٲ;ikLDQM;qAiUЂЖ:Ad!-[m+2!9Òx ⭓ b၌82فkN7*?/@$({\p M|Y6Y],p!"K (p\X*YŴiu]Ă"H j ٻ S #y,0F

    U!)72/ѧ_pO!@$<9=NsY?WB /b'xJ@ ȂIPR`P/ 5UGE"Xx(B`eHЛXKK*PAh+uU?\(>hΤVMjLͤxnLx)7*D`I8yl3r"̠2u r6@ "dD9w!nAbbO9m18J Z8E@<"47i6ҫ4(l>l6@Lը5\̂XHK:$RHPca&%`%Σ\0 \ ]Q!c U!0G9\f' x\{ BEkM"Y бflB/2|ȍ`fٛiJȄ0iZy8wp,2k…DNy)>w#qXby+8 (^BȵB/(di hc*PE*Z 85;RS2 YM*ToP^ܞbj#J %@%yG0'U,;[6` 0%_P"K/p[tX2XpN8Xr㫍" _R>J?P{I1"`{@;HpY/ l$%IHz`jV?9P76N;ѐ` # B4bp#*-zH,zM6>D[ O "x@-#1 +* NȜ^gg*Y,=]sFg *$a 1;8]J3%;ϋ\rܰi er}Da p &` eB Bڦ'~2d1xڈ e%/2X'$t, |$" :|+=H4xuBx(S&*Gtyd&!B%I 5$$T":.DN]!?JPRe"o4iPa*;fϢMkVD,n߾.ݺvub/߾'l7NuµcǠ4ziK@#`1NOg[sHa 7?'L@=; ?a#Xc駣c$nnq@+~4ZDR@6AS%$Pj&yhI|&J(~%@C& nI#JLGiNEMsC`LD< KMB1?&DG0PT\Ҡ*\[s"-p ' ވ\@ GB,  @Dn4,[IZ"EJpub\,hlc}I2Eٛ&67bǒ {ҔF:mDƆ7%;,:o☵|riacte{"x |ֲE4{ldkPR4{7g.o(qgRD#*#*BpTp8wvL7HnpA GPMe=.KP *@" VU3*Ji$5Iꤧ]o#0|WXՉ1lDQS dxT*2<-adA" 7qHx\4Jq" ||''yMK" Axj2=PHNqdbG`xdpN0]lbwҎ pҨƽtts$,FB^":7LjALb>SOM5K $k4`>h-"i%-m; N&[Φ6add$.බf2Ds92ohsm:U4<; Op;+lf 2~#8;$qMDG!I(r-߁wH@ 6}.Iv >Bx QߪFG *SE*=MU;h%v9IB!(E`"*%`At>~a] cPL > a"nHjV2qizKݝJčq @~qTIq 1L˅\Cq*ܐ/5k(PȨWú p]dX vIp;o' p0Q%kyCMo}6cc;dG;íLj83۶ic.ξ٪Y˧h3dmh1ɛ @}izJдN[qPJs4*_9[I"$ uv<+لnT|&U7kQN$:x`f=#Q.VcǪMDxcDx3KL3|̚i3\2ҬC[8\\ɠdհv24kdnHj8ia?,/0c @t  GF'4klh#XgB5 ;.@%y'HhiqA0ܻP ' @OaO$96a@B>@yiHIPCM<@uDCP` }FpGaTxJN[: DFᏖ® @ K68A^0ABxV70؃=Г=81_VHىI 8 C6L== A3C&8 /*p&538c9,ac|B;;ɏHeaV`TM ޸sTRc ֨W$inoHRsxXRlEByx!$u7~!=4! .9FD*2p 4rHF \MNP |",S8S@ ~p@X! H:~c0E,1A%J9JiIKMzCEK.ɍ0JLOeaUf䉔L! T0ԉi J)B"JqD؊@@]#950A&ă%BATlO, .ҏ@ 0^(=pĂP :  Z`hЦpZB`0"^9h hŸS=d2ﱁ< [,ciЀ)M{Q&_!q "M_i9Cֆ!$!iVxah(eHzFr@{d=t4$8.5B5 WƽCֈμ9gR' | P'6WF,-3XY㢖c,(QDq@7®x@(`tاI@ɖʨzI@eɍ)]lf^ݭ ֵeh hPЖpkJDpLyRqʚ:d/d%$I)z*PչJXJ!! ׍&ҁ񄵐A&!:^&|P$)=`eE`$=`a4Ȓlʈ[p2(28'p[BIP=c>z רt tp((z}$&R()E (}_!id:y Db6YٌiX{`M ePxax"xi" ;@M`"SGƕi;ár:BVBΊD£f<'2 =CHJ a!d؜bJĔaIiT.( :f4 @L? OOBԍj.>y>p ܃7gXA@D o*Og% $h~I+9PM#0@0:J)PX|'0YD)`))ZރEX8:0 q++'2A,C):|2<\^#>v?Lq PJqqPUuبҹgȌ2%Mr4dT8 /Q@SVPL ml,! 2=.qL/a<5%.?=3j L9A3;3Cs3@:ƒaqP\9PA,H|AR >؞Y0vԁ/JMU]dJz/G8JLTe8fd揝$JP|X %Ё V8`aXeTl𸌐Dx@$|axC+  :8A<98T#uF89 -Ld)@=EC:u:=\׵u]/72'40 pA33-Cr Lw GAMF%Rk$ըk ۺ(iϔg y ^f )},F54z|tNW4Fhi"@l\FrqA* $#ޠުRc<&e@}){i=13龃`SS$Lwn H8H@,DH8 C!Ă 70$IXJ]BLuX5L3tDg% =8 ~! ٙxq MxTVRYB%ND[qC 9AH|A>DE`5 |PX$l/9ߕK(3UIe, )fg8d(TW@4D:\BA͊# ̎740ʜe>mTMі ۱ucHdzYFqFBn #ѶnkLm+W:=8R۵Ӏeȏ? !aeK c}s?? `P *!D/|A 0<N2c o`)J &K`#/^B 2$&!C$`1K12 {J"uAu2Ʉ (?@P3!d{DOJ!♑x$FsqY#4 iҡgN=N*Y?8HͅS%8"x %\q$J!4-^NbOc yvo4)(N6J<($6&:z@$h<0ەe)$(h]vJ\hhZwc &Rj)^A0\ , #/B#s磑&[h묯Oe(l(5. xx~m8uQt E鰄XΑP|>+q\r4=㻮> SoROrTC/!C!d(VB3E'-q22Y B FFI FoHEHi{1JgH)Ğ{K!s>" ÉHTG,B 0Gb~=a_cĠ9A s4BHؚJcl 9hb(npBޖCUn2%\*[9JO_kB0bh^W?BE ֻ2"Ed]AW-$&*JIA %فB. (fC"d)! S2h @*TA@zbA40 >D+PDoD,h1ZbsJ8-.i31 c<Á5T PQ7BX8`x, >#|!ިD0q -5=y>wp~NDi=]D! =RCIԞN9w*Q ns:J_Y H\(r:i DDA aB y$BL8 (qqP@>P/! >ܸ=a Iă `1ا_d0F4l"#:=\PCsWe%!(F\%0:D5<cGuōL$r-FEږ}m_{+^WYMGl,4:0z$F#$lJObA 1$H`Y*A6@&/<RJ03`Z"2ÃvDňG #-V`YPYjHO!ꈛ R 8"M9dDz >):<r'PNN?'BCʹ넙X:;H} 3<JHDE |'t"4#BG$  -9vQQǚC=U,/K+b-d%γ#HED?tpaFdNxlLu8's`:Ji A0$tOoECp1g],x*b 2Y_&&+-A5b76&l-۾"DaW ]G$s 1VZ^ RdsR{ZU (K!W:Qx ca@dxz+UܻK^/ |Q0ޑ wMhwF@^h6}cg'p"a_YGB܀C. @$\ Gϐkx8#r?Z{(NԢ K?H*:|T%z"NQ$8m#.U\('YS;A`B9,Aa|܈D$KXHCpc!6o/nd! :4q{   I,ՂP$A "`D"OltgDoMB$jD!!A d4AP4aAHHtHÜ &48r "m_~-0nv0T*c]$ .*{ȌHY(<(2M_0*5)8b4xb'p8"//.n + {-bohP,HQENNf 0! PA =NpK-tFUTCTUUs 4-on`6hGшdExHl^v`v8sѠ4' D@c?S|1h7_Yq;8?GDH5`ơJxH~2"!B h HIf " C΁Ta|8!N`oAȀ&f2H#D0@FA2MjFS`mI ViviW `iWͩ&ż$Բ(Oa."6 M*T*rMU"&\4a+i01"TFe )v < !+/a&2Fp 堂/P`Q{,t(ia꫖.R5UWu0Vcwu73C2^Vww |wwW!WI^!!{6hAXtDgw88@$VG ;C).BD>1sdANN  aJ *IN^Ga~AVʮ !g4$!# 2\9 pf+ $#JFG 2%VX8jmRk((0.*(=pn+6[ܖ+5"mT"f"[k"8E0 )mR%56nf/c$4*"Vk"s T5- +2,.%"-C,14S[7vs3_3aSaSHT.R*IGCI{岆Cndy=*M AO cC?L=Ci&ãuN|=@8+g@j@U|5o6?RJ=F$^Iq*Az赩B6WDa BaP V胩Q5J K~CFAO\ m4$$h iTƉ888C,"* ؅+*2+e(mR&8x`[2vr'6FRy Ixb*bISfpq2cز8@v06ޠ_-Bf"'`XYgb)àiF2VK :@|ig{{axdS!;-5ID= >;gg?7ӹcu<7[/tD+&cDlܬ2> r>ǝO*<6H KpH",aE@tI^!2-q2|_ j?$It 'j*D$` V~ 8Gz v{{4hjvjX(0 4Qkc%_C$n8#|T]^"8!\V&¯B-c$`F.ߠ-4)h@4;cHbxi4Z&d*ETcHq-x~,bm7`AAg]֥i]z g~Id\?oZ+ *7X:x0B%4pze):˜0M|A0$p PUt$LtJLD$ HT >LFTEDEZTT7p>8%Dc >P: 1T8a#'1eO8OUDbU$r:Dpue"4ĺ8H'i,GF) N,Ӂlp"]1֓ɳfu dd e7tAntZYoi;} M7rl-[gō@;G&&ikڡ!. n?|NHD rf.<.b)-3hy7bO/ϐe V Ϲ8=u!B)pᲙ]Ab _H.TnRԠM5s•6AH ũ*OjSUfP0d)X0ְ e*@~C0a7$LXW A{ VF.8a '8@`=0@A"@\= I8a>K$`XYQɔ-{R@yL*WJX+?ӂERx n-Zd"5ڔ6vd# s6dMqV6 {+dġfh לNhb3Ul_.0T U# Og 3DC=QvHډ# ^ހhE%w8΃i#a@A6% HM",-B)F-q eKq\<>[`$[pF| £E0Q uEzXa7+AIщQ : z 2k"5a>džcZ؈حJ@bG(q/pܰD1_XB#3AP\!G2c}4 "$ {˘6GP)@0Q2ud%] ZNe rXCh?;BU 0jZcU6fc͐<99Np8ۺ9č5!sֆrx+kؙbҐ=[5QA?!ۍ၄)^5p\A&n4b z: F/*(  ЋB*Oף9@X AJ[ T -"(EU\~N\C24NjhCd0|1t~9)}wB +,.5mD* goYdžـld[CgaMBM*72thAǹvf5>֎9M7=N߷f5 6 F~NCS.< `l"b?0fx_]'ܙJ|xЋK9~PPY`tl9JfJeZ2ZR&f$j9pP dӟn2dQ6fAO1Oyxy1wcA6@<(rPC 22E@Y<72% IPF ]R QB $(*lIJXC40't] D*)x6# X)+u]CHXV) 8 'L . DVY^ J!A] x R!WT9D.4@: Bސ@@%G'TI1152HpjI) \0.(D@HTF\L<Ldb!"!f?aMWAQxt3w#ti%[,drw6( ) %R =Ր:А 0g!9 2zszO"c<.f=053T:#">~ү\ǔTNT&nޠq D@KW +n( B,,B|WW&A'((0CrsBBȂ Al.A^kD .[HL+! "-k]%0{ZWl"'DG5q:D %L  xc  Lu(T|T5Y\`8I8)H+4࠽xAOlbMS7KMb7Bl]  9|xwf%;q9 oP 6ҍw|gݐ.u:I ("QyF,U"<02S(R#~ǂ>DD` 5ّ ;7@EHX 4qCCT(@]а(4+",l+ 9.ܾB@,͒Á,.*5m–(n˰ЃE 'H /D'EmqԃE@P0 ٬BGpNt[wD.2pr T&,,'?Ȯ2տ!&v( ,@)Yf * .*0i!LFJRՐ$lZ!j1!D FZ8MB7rcB48r] g64Lt9X"68 !A{)@}P/Fsg%R2<`֐!S=}EQ SS@2 k P2Ly Axq.toBA"(붖d٨BDWZwBF)L*o̩:'軌*޼C\@NL  FP/ @ ?XD``Wn Ѕ򎼧,^cdd@l;l  R^ Ft0 3)3 DI OBi Z002?0*[P@~li@ow֘69LTI'6TN?M] XPUOQ֫'w:@; tm!q#АAf ;a LXy1Sg~3"# 3| } VJx.Ȑ \\ɐ`/TJ|LX  A0H$.@I(q ԩ"K6TTOj>=|Z5?WEpXVXe͆ ZmO"S"vx3Ã4h h 6|03d~vyA5q3f9@K#ʵ5fZhރ݉_Κ>tp *AӃA;So}oJe.ќKDomdyg ~O0 CpW>1DC,bSE  n2B &Xʨ#`` !ˠA!X.(2<8ɲ*/s#յPVD"2 EP g"w]nCa  Ujq&ff8rLbr+c>b뤰;/o #Kpm0f$hk4,fwXy6W0J1C`h˚A@M{MޠB\9AmꆐXoZBۏB:<A RtO/]U>a䂆$]($"A 2e*'P@|&B#٠|Ci!Ot hB7 )@g6t)j4T i(xuTXmR(X4I$+!\ґ` US#u $1!F*>@ ^<4'asH0 Bh@HL+p4=90?r&I(!a2Xu{ky$3>Ж r7(HH(+H" *H`7$08C:Tc YR 8OGXE:9* KK 2 ɀ$Z2ʀH xi$_j$Ż HJ;X`ȸ08 $f2ᨆ"񀐲Y "+A& +qk äe =P'S$ڃ< Q:'}*+(G@(#$>z4hOpRX*(RO#GH\, HLIPN2$:Sɠn=8=x0Ip!I0iD (P "?aH _8K '9IHi(vsK&"Ś[`Kpgq!n``P4RqyYLpz b5_0!.`5y7(ts BySaP"1S~YPnXt(*660yN_NP;RCL X 055X<[vjpFʸb Q%`j|lA H^"PXz&I'U"F1\8] '@ApPQptKj j i:2rK֒uGK:|\-˺u\qBԥO$*& qlYȷkWԩQ u*@Ӯm6ܵ:7|{cܛx{Mv<(WN=Jfuo7nNw_vQ&= % x=%UGjayA iv,W urҕ{ƱA ˃aW'3xx.g\o0_ Uއ% RX4ш@op&kQЙ%ܙB}4, hqA}XdIepRQG̈́G`}aR_,A$M$I ҁdEB(ΦDxPd,܌TT;A XteG] QyCeF% d@͸pMFQ L%Q]DH(aD<>D/cII8 7KԔ,N!~r_xCHM=RH&->aEN!= dm,R.H!.ggKa,qumo=@'ab7w׉qrC'Wy7fyo;@ A7O˂*y?H⍝z\j9g S_e'mv2X^\fpƜfiN8 8#( Bp(h,lR h,%BTP Ӆ*|}U'`!,cHN Pؼ n0|ىHJ >8 &B$P@"YL   DC 2D\X$#bsmh3B&=*„/A2|d`ql]Rv3Yb)D8ear9 ~hp!Y0 .P t Q:p@PƆ%0@9F&qqf!g7MC zD< ]:e%C7p\Q vԾ7T@&zD#-)DqӉOH 0D0#r`ƾ aXv!HʾB X=#H<* B!![&-0=1ɵ@>$pb(b oJq*L_k$a]kq$FA݇GCL lmNpxQ@CT܇CM|^aTBEߗӔY͉HOZ 3D(J$KF,`^!@ 'aU`htyE\!Qf9QBdB8A(pAX`T%L'p d$p7N[ʄWD4 _a dY{%a%\6EH{FJN ]h :Q0pЁhR,Rfx%  _^@zDy@ƨ=WS,EVpd= NBLL0R%$;C(dME:@K1ab e0@q0:0DSh۸vjvJ+چyJ:.:އ'pTC0T9>{tL~4 3@> @ĈG!6VqGtt$텈t;rGtdhhGH-76HiǕGd < Dc{|qUAY?WHMQZFl©؉ ))$~)J="ޡi a g%q>BĬ&U_x˼d = C!#yL!40L x @J1̈́E8KĵEŦVCxa!x]J\QZ[F!CBQ8l=x8= "qpAaD.9Xee'gtXQ8oB 3A&X).B4)%@&<çd4t.4,ç@Nhp -XuuV1tDTGL- y^&X/d; ?Im@H<9R%A=G GEOOC>OՈXɒX ScvTS}xT5HhUq F|dɧ GϋA$-A*.|.+=,ކ_PCT7EH!R@~WTŸ^XB&C!-UEdC&02 8B)H@,A/L/ñLA)ns|%V\*d%az] _2AE(Ø $K 9M R8=Ty9BTd ,78P= \tK[CM*FHXY  2+uFt&B2Qgq 4BGq_lh#@'8,Lfhp<\$ް#ĬA6FO4^ЏBbG^xā |@R>@Hǿ'FH<b ^thނ,Iȉ(Gv "xY5TB%=)^ǐըӆ$@$e`BU`IRIn]IG>^3~7o'#F,J˾ aPEm-Z\x-da cƼ= :빒A$@|$dBXpA#>My@H|%!di Zq! !4hȑE\WH,_dNDEf$Gk! ڼN d{?⊾{/!!ǂ]ooQR֠uD r? @p20Ks֑#MU7t$"KHR*(&qҒAVPH-t=B!aC "HD0EB  yq @Q-$GrQ rÔx`3;p㖳h-1V``FZgQtT͎+?bN3rTsR1 otҔ&&mLC:$x]Tg7S]oHΡZyxl/AX*ʵwxfKOpVQy>rc?9+aRq.dpN de0y,gDp2D 0OD 4jeaD6/H9 &Q!@VyJld(C!LdpDed?4N xc]2@ G$#ZQTm&E V8GLi NI^AHh>IJ`.nV%HP`H ![ǚOC7v%m$*3j B SV/Y0* ):VPL?"X.fG`rB,{a =A5z 4PA q}:P`4{7BEkQhb2Q ;.P!)9&2t;+tVaA;$:T)1 rp-ha7RF2J&À;4aDiC-R puWD>])>0 k ]W"^_W6|X 3g-XlcWa2YD#/G~:l8s B*" ,1υY[,D0:CEIUxUL Ö t<E'Mq$H`LP~8|cC|2 FR 4 d|Ĝ@G%`LRFQh-Kb.e#\˩G:\H @R0`DJ@>Gj1 wiW,$!BΆ UPȒ~}Pk QPpIpB_M@0: 共k#"1 À+PG /l$!p P؀~ h"'aAk~z.(B3:k ,Cu:2B3\,pmxo APg9b84|4L6Qp@*4-4FT'*zMw5*)x)\)\c/*m .t3gpu>C.mj/lc>C"zJ`n-¢z䂭+#0, jjԐmo5g-Z =@5xވP24 QcAl`404 N7P2J.N  .p#' M6c4,.4t<#1)!hmqm +41sg/|xC;f#2o'KvP'>2N Gxs->(a t \A!AEEfiZ$:"\E2R O>HU0z頤,qM%&RDTbV P OG lReH~bt&市ILO<%R0Y$RBɒ~!K b^Jl$!Pd"* ⡆X$QN$\n,Yr%]>ɓxa"!$`'L^ʲ *)%i   VHS a&X{X5Y&́/Yi00S*0hoa6`rC:w 4Dj:+8w;|;l`^mxUFՄ*1pf~HC*C(PJ@prN)@ćv%S ϿF1Z[OpoK X(NN/F B˜raJF`B!DPaQȀ 2AVdtHQCI4GzdCYZNO @(-N$\n %$ n$,0rHZjK{x2a![<~줇[,AL%)`E` P./c/V/6 ,`VX"ԡ!&d`Ta@8ExC'Oxf9 40mЂvZFkM4ģkx>@y P9€c?⬊-:B ,gh{4h σb\,Ȉ,`yik3PYQFN$ l{G%,A^`žI,wLJtrr#a$Np{DQa[!P{Z84K`UUdLP[,$A%[,!Ȣ~lVbǬK%ׁ~arBs VG4`Lc>U`hU`O`R~؀/!YqTz'X05x= 6"k*6$ jp+th > n?>.N%Fy#|MJ48uѡG{zP,!bezZ$<),*J/! ׿l*Aœp)@HeYJI("[ERR$EWhHQxSzEp(P(a;Nn!^nPf:7H nZǟ\[rE)e`x5UqO`ʚZ$lb/'Ɓ mqBڻ//^9§06=(Ѩ}$Stq.8q@"5 *1lMu:2,ZC8%ӘZcpPv:̀JH8 9%hנ7E2Vmd^PL0KĴdE4,KB_x:u*3Ra<٬*"\]91mڏd˚ ,ڵiڦY 7\s`̑|" V%odЅ:l%|B} 5 'N "L!Cg?~q]$"c0N `JCGR VÑJ "}!TIw psIuh&[t< 偷` }č$o$E  F=2D(X2L|K< IX"I<gLC /c=ZJ!fœ :%7(:8a$Afd I$)4N0N):$e!M)P8w;)lH/mB:gsGmrQWH/'LJi'<\_nz>I' It"?!!P 4H'@ E MSK2GZE; *;@&% aQ'4<é>H; (;먢+J<#% 0ҳhR,y34  CH JʺB?!.Ϭ-Uj'1US QL"E@P+UQ&mN'.lTV]A,4ND9x,AΣYh[2\V\wSF%{oD\x{DTX A %Lr9lT>#_:4K_] ,e\^V tބb%Lx@f;9hNŽEGH1rH'@"=x _8Ap >HO09dOIHC en1DKL]c'>q5"ղ,% YZ\|HYjǻԥ.\9K I\7PRN oP  .vbx"#AD'Fa;h%QibK \B!U'5*Py\"̹!Re98qN, 3Ȭh"+\\!EBX2W$ 2_evP1 NZgHPF̟|&GNB + Ot#`]s>QFaj]]2s5{0:6BQ" {-Z@: >C&D'‰lNr|p@0!ա Dy|F<Ù?cP0L"D<>!'8AbC*_6̡ sP"%&1 nBG&9)m7$ ,F3DĆBXB(H%ITG$+EIVB AF4M  T86iTb'cą8eLTEYt:D EcTQyjǎr#A0Jz$rQqŌ.PY@65kh(mj Z4+`\a \, Jb-"AV:*R)!e!<'6+_؝>CDCd3a>M匨"Up@\=U2at-^V/\JF/{!QnDbG%s|Bre  e"Ajѹ/E)* B\l _V"G,D uׁ{na/3 _& "{1 : CmAF&G`\]'is0I`}P<EЧհsx82QLw❥=Zǹ$_G$X8W΀8q8bw!p= !Jyos]2Jxd"!!!kr Z[IhT%ZaH 0-}<,J6X^œd/wwBO-i S1 J(a64S\acRA"8T 0&2f6/uS6&6} 1H:1ofEk݁j7"1ӑ<_PA#àS)"i&n#P5<\ 4@!!oC >! ! sS p? !CDD t& TT%a[$ V"~b2g)BwA2gxAj@'W sDH.DL  J d ' @0  VY$)p"Ervaw^H͂vEv%0a0dԒf3x1U az )`h,č)wHKpxB1.y( Հ 0>bGxg6*h+P00<apbH|C1Bf+`(˔*`NOAN|<M4>e%_&+ԧ3U|cOgO>@?A\Nk .@A 'DP8c v;LC7N0`0 @ Tj}1#06ql) IH T&Sa)y:@" Fu`mC,V=0 7& # Wa~0>A @C$p=9 uE>nX#&U@uYq@A"C. !A q0td$Z~ii)q-$[-wF sf`sY\2 !:\]c]ɨ`Y '(Hr"p&Y6")a'v^ **<G6?6E-Rig1"zxvoIٸyp.rd *-i".#bDxt+@1 -BK0<@ALEFdtIF)doL*333eNQ+1e/a{,p{5}Nad 3c +RAfI tpfj#va PNtPA~@) d](c3TP ;&Q6uAU.p`E MePсNU y6gDz%B)P&l±j|;a#Y;S #!Xy!D>qp9? 8!ҜC u5l$R"$ApT"qY$U&I%TRRR%_BYBJ(|A["TYu=Y˷}˷9kp @Fwx/0:أ>z^ia9FharJ|K:-xN+)rJYʥ] ; 'P)a .)&1 }R1`*c< +r!HPoE20Aў>O+ $Zk{/q.a%ck%YܶA:w0 pxP,L\5k 갬. ~g@PG@Gp^X^ubhNH-0z'31vG,)Fggv.,v4a` `fJ1xעgJ `Wy1ab}3 <`QQaI! O{* f4={;`eB6d/ѩ:CIN+חCy!`=km]k DYu(P @@piӸ1SG80V"6d0BX;m!Õ jÖCx 8AkБlsk '"lv `;ƛFC!Cm!@p , pC# 7>=9AIH5 rޓP>ch857uCE2A4$ ^$ fq&Fk|  A({Ek@'+-"PX3i  @E l(b?jFwg*$V*qEiFH@;3Kr-IJBI|g10#$FX*h֔(yؔ.r;KRWa0A{*+a51JX~',j:a2*|N343T8a|ѩ/>6fmO PW k0UWtd .pˠt~ 5 l xq;lSq ZAǑ;Pq!1ڸ@F5l~P(H1k}Aȿ  4#_@sUB;"+Dp bٜY!6vh8!&>b#2z C"A)t3Z/~Psk0sALaN1Jbzbe0$#Llc CwgM"_8fcS0:3,.;Ĥ_2GNBNm<&!)3 4Y`O P  GYb/ da#!W.ӸT%|JX2 ,T"Tɥ`1 .&_99"HDN.\`! >|DyK_PɪUX0!<8 3Mo<#%9|eB7$ȰA(fNH:/IĄ f0 Ft e3*X('P2ڒLvF$SI{MiH<'%' _(|$1 U(!ef"$)H "Nݳ| c{Sa.RP#O#Q'uSGԉOqY* xaC>Ab#5B%'K,G80iŒ`EW jBh.Ghj줓j:7,pDx`KApAy\LhT|!H&Nv!A4H;!sj2)4H Afj"<`'s#K?|,(qpJ(rvE0%2#i|4UW}NdJR=$ l=wA[lYUrQUYkuՓ,7vwę !0@ $XV8Z!PR )  >*gpA B`Di#Xj o h˾ #/`2"H$"f,b*@-.։ɉBy`++[g傄ʚa3t"bڌsd{~ +1 o9dP{q "Pt",;">.܉I`&P2gI~aq2@u (S'/ Ka@P"t! \B@dBiX`$ `!*QW"`!3Qu$py*:=Jot&hxTդNNH4&5* t#A 1C36$.VR$D Zu!ހ*IO{?fh|aށ}A UOz%\WaD\x$/ [HTx#\|Ƿ50XR.tQL"%My"R֥xu06 @'`z ..x d\&>1fV?*<yȨpᲅ֐*\D{L[2d-.XvFQImPB:QNĉ4P6rX#"J?J1-,.:1'nVqB (g! < neɪF;AXsDp+1 ubf=RH xF qc# pIIB)[pIRT֓hJPR]T0J@W|`A k;93Q+dES”1UeXH>yY^Þɢ'.pÒqmv9 yjtj$}tg\ψy8׹5u{V4OCvhݠ8Bj*mpc%wc+}жl4nM ݗPzTDM0)XҦ=%ZްI! 4[?٩TNR領]6=ݚ8*jI!]J RڅV!@U骷'~]`x&N)321޷p1+/6~Eug柌1).cϊ9|!*@t KЎ6vk$@rG !'^O<x3^H-/K^|;}k{s$Y.[dA$M*'_?~򓯂G_F4Bww4`>f 3Nw|cXSN$0H'PaJ(V5}k)UQ#c Ĩ4ځ) \jr ӿ&/2?R;0:RG"{Z|$0:s\h1 "Cl"Z O+OȄc4 +/, +C3mpU`f qC b1<@FmFnFo6d4xipr 3 $8GvlGv\pD*Dg={G|G}G~G%Gȁ{$H=DŽDŽ|Ȅ GiPTsWdG>XrHp< ,xXHLI\IlI|IlIؘY }IIi,= ,JG?Ƒ|JJJ9i&JoD u(JK,KqJ MM4 ||H\MlMihq,7p,1MMM NN,N>=OOOOO PPŃpWI\Лl\J$[eP q& =X(s-ЁE>H=QMQr8MMQQ}ы\QQQ R]QQUR#H&uŐR(U-RPRuRPx0U;hF0XyuXuЁ`cp8*\0hԶPD,\TFmTG}THTITJTKTLTMq_ i6*@Sk0^+X=XMX]XmX}XXXXXX]>`>HgHq! RyuRYY ZZ-Z=ZMZ]ZmZ}ZZڢiZJX΄^ =[M[kB۶][[Ui[[[[ۺuH۷ۻ۳ ܻ5IXJx\ȍ\}\SO(3  yit 586{gbm]}eh mڅڽE[۵P]ݽ[-^M^ q^aM^- ޅs L Y][|___¥[e_.`_>`^`d_%ZYZJ > ZGg2G0z(a>aN3@=hla{ fF{fv>aa V0b#VTu$H5X{XU+&b.>Q6.nE &E)S+#EgrXH c;c<^=ccc@c ījBdCNdCCF%=C>&PMfcFe^ffnfgkifjNkflfmnfofgqgr.gЂsu^gvngwf1Ђ1gzg{g|}FggFh.6f3Phnh~hvhW0WhhvIX8Fe.5grSNi^6.ufiՙVPW.lptaj~e(NiHjnj^>vjj-N01jj~4R~,P^k^kY~Yc][ZfkbffPbfjFNlFlfiTfooggwNwvg|y61gnmf^荞퉦艮hhhS_%5xc5/^nV`knncedn>nhVl.ojvlNoVo-gtփώώgyVgҾ}gF8m!~~pvmmO^0eTWk epnnke'f6oje6o=THnVpGgΖo~gі.rog6%/hhrmo \ ` %;nJ Б:  n7_cgiVivlt̎p>gowyo"7oV^m}&wr(/prrQh1_xzx=R,@y@sǦ7iƂnhNoc^漞b>>qhdNqcfq-R-o$`lAA_pfgEgttgI_o֎'u)=`5ap&t%sth uހ3 wsWp=9?c_FT:nŽh/o4q4@qGjqoqp Gwu^"tFrw(OtPܶm{h,2/o VVpYVނ55e6Z5ZvO[8Zn{xNv,=s;/q_Fkivq?GPx=nfvo׃~|offDWroOЎ{6}g%zz)h|߃5(/А\0Yx/7i٪6sW gke pgs[F6-81eknnPHdO|Xnb'_glOЂg4o7lkH0l7k|#p A"LP Æ>q E-)b̨q#14SK|RbGFEǫ 鐆ٺqWm٧%-:W Bq uũL3 A SRVf17uHǬb hX'×Iݨ cF//Ȧ7Aߌ&$35OGACZtHSDd2JRLMZQs ǐ#c'Xޒ47> %AY?(>Z8A~e trIfrT\_nN` kp`?8Ōqp9PNƀf8+tAx: 0! 5vZ듟(j!#{rv#II(=$10?&:2pXĂCY,5qh\J0aKn ZY1A2@fvcE7h4+*B/%* 0q8o@Lk&Z  pC7^pL4FQ̮8P*XE vhHY/┄!a/j7Ed0pb xl߉RBvgCp7jd>chI쨟GR}I ;,'(q}rdP0 TGWd!eXڑ iC,z)L"l9<׍a1pt M_qacM/ E@ߖdaIXƹ`p/*ީ7I QO~ X:e Oc1 ӛEL whFǚ!2;CP6$#u8QPD{wch(Zxo&"mi] TG 'оabL"N b0 @ i`8uRJcK7ܢn(07!oB[pX;-c"A7.$&=/WPW,_ a7N i|H28 r!uKƨFX3N5S9# cȪkYe+Q'AIgg,)ޘhG H@ZHj=5{:G:?Bex8͝F,ac8+"YZ y22x[,!q~\f w" ,8 Xx业1|r IR2/X,a&vj!dkPQɋ{flƣԲ|F@#KkSM^;`٭;9ӽ}s1 c2q&nhKK -`"'C`0b^ @a1#uA/}/AҠucLj*)>|QGgيXF>=mooe Y62Et(i8 OE!Ewe~ 0(,SC-s,ܟ q?mQXS C@CvCUl\*4 TZ rh5yU"PLU ܜx_CeEG(4At288#OϒiE[j@Soս [aH.\Efp.?7]4 W a䆘DX%. ?B TBe5*DQTI[^ Du A$--2Hȳum] e\I2ȑoXFfU4kÜ\*PF@!W ]c਋$։f فBUit IsC$ė0YCD>IC 'zE E !ND*-_hQ+ibTOdAdOKEE BUVKdL$!dM$W5$.bN\O%YЉZ()bD[-FYYaNCVjVC/L%#q'_ ?JuSءL:Y\(Wh !dM$d7meO>bO~ɣ @ BFzbSrDmMd-]UHj& 6[Z%\n MgMzpgqgPcM&x d ߢX~FTTTѤHefNBwzwme\_Y'mg{&o Me ^#`cP%6ԉ%~ANfBZd&DꌌQ磀EYfhr(܁,Aߥމ芲h(‰hڨŎh/(ޏ i@*)Y͓BiJRhT ƕriƗ9阒 lǙi隞)񠩛iiVMyny:Ԧ{TdCBo%}gw8˄(>2%B1(a|èuJ1v꫺"'l'Ajkj +jP(BkJk*jPhrkz뷂k븒kk~dVߺ'Ӹ뻪GzdP++Hk2Mljmq<`(iM2l:B,òDlZL,k1,%$hT,lȊȒ,VȮAɦlɎƜ~Ȯ)ɮmrifrȆѪЦi2-f@mԦI~$Gbmjrmzׂm؊ؒmٚ٢-ZnDRNmmmmn n(2nBnJkڦ|jrnzn.nղAnn-fh+Fmm-+vo imj->/bnvZrfe.HB.2\:O$p0/k;*2. oBpZMr[+pAzppopooN0B >2'X:DG~j@ 'p@@B p nbo84.D* /X.$nJ e. PBH,C,@Kq0& ldp_-!cRP@bqA :+Q p֮RrkP+!wBm$(hCm"k.۶mn p.V+2*Ā0Ԁ--6k-s/ 2228"L4# c/þS8BB,D<<7c s-[*4F9/¼A4X:Ǯ*4,3^ +apƒ2H@,4Xs֪>*s2oE@D{u쾳XA'HeA\@(t' ![A+@6A8knU*A1ȂGcC4Rr tI۵V)CWGH:4NSNU@?dS'V?LI0NuUhkVk0ɸL'(3! z SZA*B]*u֖qB`. $A  4oa6lkmV-l(B\:d6DZ\t75ynB8p85R.L@PUw.Ԓ.uHH@{A)C p'GnR֪B;r3w0Hղ» 6 /*^wx +v>6IxZzk.\':C,0'r dc~w ;#8Zt/ ֆ d@Tg1gAkcn Jp$L#sGpom.A6xs4AtȂO1.^{*’o d.7ICZO[yzGj88lrPj@~f$sq.g"u|5yO7;8-%ku^Sonr߰$_T(>/kz_~:jcxl`Bpcka l9GlV;{pF2ȒTaXʜpňfdkM^u1~B9cxpZ 9lS`NLUqJUjO$e YD.lq.S畦1U ӧO՛hb,fٛFXbm>Ž U$6i JO,[޼C$m޼QV|6J42`J-ōn!ï~ʢ@A* Bފk? R1$s$۩h20ӌ UdL!UBM'mNKMZ36Ӊbp3 nA6 n}40n!r8,>N}K:(.H>X&ěMZ'%Vr;I4詟*/ -bahP`zT@uQҘ J?QYϿkU! it 2r,|4jЩ.(%_-'oRaP"|̂`B YS&L8 2{ M{T(a2Mܳ>;@mo=xuh!hV[d)朮OwBV( iU gjFY9Ռf !4ѥ#5#_cS$ j,cwTmƌ`PfMPMIm̖iT`.<[dlBvB_C8qӐSҠڹ|j M0C͸ cc&1=ubVL hbb>~4hFW,1EC\N,PVj Y*L0"9z>z(ȩ](3cv.VHZպF:NǮr~ 1R-pj [AV5#1dx`}(%BpJ4 a!80a!QAidQ4T"N6g7a ď51n}Xө. ]x2]*S< [GPO&ûpP MU#rfVo0žn5<ITa.=M>LUˈŠoBMٜ=ڟf,&F$ѶԀN4PH6 h@`3BBm4L< EI5ymS𯊼@ 4脎8X&2 %ZY|$R HpSX1*#dTS~BFvw&({݋p`M"ŸA-S_\T |#.B 6a&2=s7! ,2RdH F(ʶأ$t!:ه6RvuO 0mėU &8QuiREF3t93)͆]rH,`3 Ni: q}ƌڻq*oNNYA0BCH. -OY3&,i -4AsTBGL,(A1$C5|=ABAD ]h} X<Ȑڤ %' Ѕgfx.n[h!MtlP2Pd8j>ڐOQ UTa s`+NA-pUXEî@ Mn պv#a삅CLf+G+IC1R`9hG =kTscdR7Y6RL';;mo) / |&Y`E:6K|_'wvC z&`ĔΈcNi, BJ a?@bB>RP0s\TT Gq(x`B@lDG*pNT v (:-΋&`B> 0M{2X@ @n`m:OWA b" > $TW N`XEʣJ΋ Zfʓg~$.ϿL0x# d*J9 ڪ VNlìi$v^͇*o-_A*f*$ +w>!E  n$c\A @ŵ@e:p{g40Rh,lP~lN*-*0# P`Q yBPfFB !|vRp_XP , p,?e \ 0Ja` %$@t .$0 _/. I ǣPj#!0-Ao`hGQ  ]`  +T`B EC-(Qդ*f"2!j s"!@&LT1@\NbHrb\` t721r q{x!Zpk妑^Ki9O.1+ȑBsFe ta7!y ోQB jKubM1A Χ-> \ ~0OJlLF c"|Nb@ oF(/&,nR`TQPXl!Ĭ>„$ @X8 s42!`TqĂo4Zj&YBdaj -/~`  ӯ\ n{[I*p (wB34"5Zs72 .3$ls ^,7e8bo?6CbzER},E&MmED+&ݐ?` `A'' qpM֊A#L4 a`Ὰ ~E @EC =MjD* H%?O0ca|rO&V`}!  >(#-JC`r+ `GKA '?(3b9 &SMI;mάA6B MNN "p ,nSPŵv2f#qB"e4% mDzPbJ 0\`*. FOFL2Kb B? ;ZCH`dU @?m'`TVoP!@LL(t]r*,:ATZB@VW)a8[ bHBoDklqaP4m$`cT]$YuG򰀔 a j`@((E( JJvAm% .@`Tt3ddGvMg(&b^if fgQdFR&OwB8Q:̷0bi3Qt \!/.8 bȔ <_F@s U[Uz$ voo1ocWJL5(%&MG$ruZ1'8'aA AT7򷢦@D3#Bu; 4^ fvAwJn*eCG؀! Dk 2X x)1C6@";ŝ9359{xd_}Vz "f" fob6GVB?^yUn(( .8 U|T/Dl(')p{p p4qtqxr+!pis!`ϊQ ք " ҋ ZkJ N3|u}@r []o7w8 X^ @Bp '9F.1z3J P{s{+ŒqcבbDw}nX(,)`&W 4|sV)lV0'jy&>A[0 "8#2 Xn: &`b2/f$Ķ!@Lx$ʕ APZU˹`@FjJ:hjXJ@ pp٢T`$z+yXt(uw-w!QTa zAljW%tI2â5zIH ~x>EF9"RwȜRamkb/v:/zc|7|+AGs_Q""pf#y! wgOC ZZpxƭ{BPzUbZVtK-.V ?ՔZRa A \3b+aj|r7 lnbI m5;F@! 䫇 WYkrt݊U q d ʅ ~XTxDs~`1$,CZ3v$orɉ/{JBPj[P B@p]1Ov_:g)!&Zw#N.mZ@I|ZJAdiiE6&8;Ƚ>A6A @14W˻TG4@a<,Hi8[rT@p?E{A , 9οD0[qTr \| @C҅?hHbOXuc#j\K=Ur72g'lYyz2׳vk/9 !y)1P'@Y}E9" Q}f tC "i'B")9ź'sZU'Aa X|!0tBOߌiZ0*b[C0`^Gݶp5` ˙o Z6>)rdV ~*:>K׻wTy K$(2. PJ6C Z]f'Fl(ӲYueąMfjSYv~&$]BHOQJV!6v4 s9 M U Ѡj_* Y5҄+ػ ?߿-ۃebcx• dpj(,RpH* w!+WJ37 P@܄|8Dp8zhܦZAuy7@kaG|1 C4J iW[G ơ'VxFaZ.n@.lF#Z+4\8SoYQ|}BLccņB0b }B>41PȢ'ׇ]UZAJrAڀCZ #DMT5cAvi]5}Æ*(Q/(&h d*GV^-(Dbi`h1Ȳ*PCEtSEeB}*pJ*iO{L)1,*>hЄP#QTUHMSNAe1u%Ym՚HEZYWŖ[ )PJ_2𼘅rE%!{cyv݅Y!qH#RfnHeN(D&n G Q@}EtyHy-Pe &}.W8`@g"XW N׃JTd(1]`m!C3"?-76„E|1 HdUL:PRv"V+t>,e_6R/QL"UdG9gw&(sJ"V(i]5`TE:i]\)B$EaG>n4ȺM#lA8! ݨ$,D!4oY,SQPL{+t&Zq(bcZՖ.;ցtE0[Q/0]*lB/Dk H``w#Њ 5P&Vf7`džÆTg;ЌNV@,+Hl; Op4<5~!\P$C|&5={X#pVЏ  b*ֵ@ lbC'yHbi#Q> /oDd$F #+(<2$7%$" ͩBh+TQcQE4 DaNbN(Fl'C//E-%,"A}y& *Y@ 0]/}X_Fnn"Q֥U?hD2k)fZ 8аHr@+>#@J/. [ /] "k#d2Y t:bH!DIlu(Ҍ<`bz6EPMhGP @㯭=&R+@?МL"kzP@M$G\!1-H K"t!d6>QүLCᐄʅRGl\$A\hoB#E9L Ȥg*)Q eM|"dXG[q"r,4< yYX h \ $  >oX(zȏϊA<(#bvkA%5~ a( `LI 6ixV Q0STc9XS?è VKVUtuf bXC,dpp=bY:G?nӏ~D0`#D6aφ*=Ɋ$ &4[f*(~+hj8J+} n9YtIb `G6[Ü x J.īzY7_OξPZ)~K퇿/P юOyP ӲuHXR FNь"=YQ qL;hdVSHZWx4QowgēS X@AFr &HV"֝(JGǵ^v9:1QVz5_X?.d1,"gtHNւ#صX! (>AȲ<ТHҤE\ J*Jxm0Ի45:(0JlaZ]@rB(YlDNtA'6  CiyYF6!mx'÷K\1f/@8S2D =_(q`@ZtepaaHA\g~ "0RH`q#q&(V0qA$'1&TDr6v1-GXw'/<UA48A*#JTU@'E`%uUddH#QStbFOeaV5h| ~",B_xPb?0`" @B = A-Q&ܒ@r"㢁Q @dp `8(0_.R`R"qTbq)v) A5c3r0T`A Fpn4CF<L@3CeAVtNvtf qS 1UuTPwEi`xV85]uhfHq\PU> tB(a8 qFXi7x@!g$'P )0 PY'pq A~;Bx5`xe%2Z#c7f%x ݠ%$y@})# 0zgkɠ=e 1PcPhl{ Ww|ٸ|]ӴiՇ Ő z8_Ő| @({SJ p羅E`Xp ʰ Vi c ն kP91@ɐp1a87邀!R"p?ː p Yp k-V05/g5#2'|BYcGcH8bJɔ089D>X[f DQB#t"Lx0qFWHG1P(PR(LT!+gt1 їpZXF!F50q8Fve aw"g {. 렚x' %T5h-0m/ʉ)k0P2Eysp79jy+c)'9٩ًz Z Y#w"Y}@ s ֦ z pi0|ƟC=V(&nД;*_`)03` ȐH>M -=$d E*pXR'ewhT  @p Y ; 0 ?08edzS9(#/YH Y0VrCH5rHIKC5U/`"Wu6gԥ]u!3tcEH`H @ ku@Q71pDqIRsu  8`5B_0_F qۧI)ЇY ;~ 'ѪnF7Ê@BxYk"L*9i w %P۹Y [°s"/ @^K`ر֨!Ng z({=Y +s@_ ?'B &oG% :A(Pmn2|Y|?*7Aa.w zxk۶oR'aaA|$EHQ_GbYnZn"n v Du !e!P^6"͠ `!l٫KI;VXTkIB (0ǫ A !⼾ԋ$Hѽs{v !Rv7 @̺;G(H Q7x#u P'zZw Иp^ Q"\zI7n7@ gP;Őu ,Z"pQʀ 4= Jp 9L}G=y)0 1 IK|SWn8Z\N@adŨhM>l OBm6 *" P " @dp.kTPR5zT=IEm50mz + ?TaaT = T(@:d籄\c3=˙Jܺl֋MY ݬ<BT˫ ѽ@ pz X|ǰߓV$x"O piFI@'B$.pl, ,P '*&&MM (05~㖣GR; ې'ӟJ0`& CcaΒA=0Kn Qna+|rVRgʰ-ac}L{I0jm>yU% R 'W.0 ~&e  A@Q/`ib7F@BTٷ :uA;W٧Cš gS q"4=HmĮޡiccEVӨ@FjTy==|$LλcB,V Մ <ā#\=zdBP+4~2 'Y8DfH1(EUbTe᧪}ՐE] A/> T6idv(KU]ІRQV}ҧl8t` *IXlPM]9l-+Al6`gÂ>uIjSrLr9G!d/ReJI"mLnA}vF6ze*ŶF6]C4_]-`ӦTiACa$f} @t”xL@ 9YdIbIʇa}%4REj5bqoqeXP#Z&`)BPp!6P` @]@b#"t(R# J¹BVxf37 NJGPxf ,t4(h&7ؠƈpÈ-'0"f2pÍ~Ȉ&Xi*pZqA jšKtTܸ]&2>2M(IiP ]N% Z! ,{pO Ǭp20"#+*z~Pi%fk&H6 j$B[6'0ӄjHVxd.B6 6R&>!b)z): :x`)*:Ŕ,6$(z+ <^٫$\q4:,&di,.ye٠8&H[Zb h> mxok9ڙ} @=De- BU /@ TFy8p /P ;0jXgEX(?qF?A=$\Ĝ!XRK5zԢ͏7 AbM83;'`L+ PA #DՏG 聥0)NSNeT`Uz*@Z $A|5` r@ ]Ymִ&l$ĥVJyxKn}_)@pЃ~aK&6腤u1XL6E'HFFV<%*؉VcNvHR:n |@(Zb $4 9*!#J8E(~$>@BKfZ`L\6]PF-͍(Coas `HBS,`vXҁ<5P獖S{nGb"AC+ C@KX $! Y螶U`b Cf)z"Pn2qzJ*b* /Gg _B>ooӜ4  DՋ ^C@fjSV8GhCR]SRF0 @"L_@x0Tꁴ j4Y1Vh8B :WPP B_-\!}M|xUQTXLX Ya9cV8Ѵ%BmDZ6EUHe0Dʮ8T G;|m&gj9X3@"h$EUbr50KfI&a$Bi$(x @ldA.Xjl@-on~ b z0&tٷe(4iF7 R\jp t{'1OQ'~q@egCvBClDE tb H xz'JqvCd{Yz,WS6eCvy~z%, Ud ,U9ނܺH(VV]UBA?֐W VS Æ0_h3xW'c+tx[|N4"81W)̊ [ |HJRZ+[Lk Ė3肳m{ *ř nj/iQs%wt.t` V¨dxA)ʘW Ž M#+юݒ9Ї@ ɂ$8lj5d)F60WL.=Z1 ~;ŏܑB:.Pyp]AiwQ9)pSwEÇM$óOi|=PF%R^/JbSaGfm~ߜPH~GT#tuԓ| 5 *fF +xAGdF2Vд5" /Vj-l~u?0|U[ 1^҇.' _', 6 !at@>,+ix3X'j .mؒ HSŠt-:Q; A.b|.H!88( !HO/P%^ 8m= 㒊L8[8ۯ%k;&9U M،Z蹈аP+'y$['h:dxy(:@8d@ P>> ٹW`[h(6C ۇ C(;)*6'9L3XF`TXQ!雡kU ~ +YA %5Ŋǜ—` )"?+? i%:FӘ̶1;q+Ÿ.ar2d:S#)74$:ehM*U8FC#?dt.0}ȏMxŵD\'G-L,y|Is6KME=f(+w >& D/TP4蓖K5tqv|wy4,#"2KDs(e݈#CHSk @ Չ}>`%L}ѾlMpR-vS$XQ7 |:@~#MЁHM#$ &}Zҏ)ʒ@BʭlBl24=˴B#8S2Ԛ;E<]d}S d肘@mmP FMlH5=/9LmDN̈ɻ(a%"MD-[Rb },E2[(|Ut<_M`ͳnq">#Vo^>I)r|401IO~\WtWnOzںGz}ẀߌaM sʂ5o^m$1;LVp` XY `%[7ṴYY9Y&3Añ&PM[袔 Ոx1!&;S0 ['އHSXb1bW9@Z8ewf(# Fb`㿅7VTL9>:Tv#̒ܽ#䏰M6Q&h]Wvhi& 10 pLhfFv&EX d;(b҈-x$1D':YrVX( C-.d0SM z©u7Pk}buzk7ܹ1GkIǍܾNԐdlXx( xB8/ X6(]l}w~(p@iF](ˮd'bf < ?+4@m/YmxIvmLfe<9Xm*p`?^.D#ng8A4P+Hafn]9fVgFr~p^Txf+/W]3oRIo,g=gbPPgvX-X \{H0`JupO\ ȅ)`V=hp~ p@xj qv`}%`ha`,Mh/9Pv80R!耛5r$ҟ>Z)/倉,\./s &V4 +p,n[j9>󱶐<(LYw?Catnc;kdCG\cFGWIԨ\#PeJ4,(Hgx#B pXgZ=[F#E``1b,~uQOƁe/TN`jOX*Ba ^\~d]+XDnyf2堕f`&PkƦ=p Pa(ZcU3+(ˁ+Yӈ F 1  G+F2DjB,B\9ȕӤI*B hB+-Q ãzḐٰJI^,u>SL>ʢJ apʇ$Jk Kվ$zihW:K8Đu!:I}T4!KaЫ: l@) @C!;}}`ޗ+>jlj6Z s0z-r*Bt^;hPK"ŧBr)] 6,>@)C(Pqe#+A(dlF`p,A5Pr,d;c*9h ڐ[Dh MX 7J2]|6l+F,IJh D}t{(toCgk 2sY.FzQHEC`qWD-Tq3(4C|EXWDA)CA$E5G#tR?)eRK/4S8؄N<=bD?8PKbeK5TTSUuձZq%S+_FA Wq-sM Xv`&G^1$^t/ |v)A4`!5l|t!X)ƢEw<#!n2Q4#"IZR a4TR AMAx1LQ+pCr @ by(AAy8,F=T.MuSb|pEUz L z\W\p# U4Y"ZHvl[GظpPs b56xͫ^"@(}_XN(̏(hQfM,\X6ֱlYa )ՖDe`*<"*3+Dd@ @.#L= Mq섖=ֺ֌5/bS"0+}YW"-j1[2~ӈ0}b{ĭX0`N31 i$Ҙsikb366pzGEQsv Yo<68ySG| r$b7C- #P"l8EKM49Q xA"Y@E&BB2p&fSp*b cd2GԥFTZxa gCOCd@ &(G-9@0)Nb о`UXbfeJpD. Ċ@ qCQZqeG A.LMe/jɥ`Ռ3K.ybi&1qcv *GJ!+K,3l DH?K(.GE 4 X-# %6ͪY\;6vRR |J3B]"[Jv͝uޒ.9wۗ2 YpZ S 3eH3,â(TQ&#[)Z/nc1^ t=O!=@TfzYi$U@KJ>VŪE"XPV(Z1W=$z*W ]CaE@x-}<քuE#'m Pa"TAVNATTD%bi4`MMmج^ ^EA#B0pitG7N n+j!/! H~9@(5$0l/+ Dvݒ2eS,\#C4 ͥg&φ 3Ȍh AqZȚVZ+8^ @)c=xD|䆜(Hv:m nTAW]T[Wx %O/_P4b?qP:Of61ԀFG7@HGb`u&]JkR^98Ei*,M+LĀ>=Jݽ@N_-@ć0P@\UVɚ2|B(*X:7ZH;`CZ 3lB-@̕2X#\L^EдU-ha!VC@P&+1 i 2 1,Ԁ(-|)Q (؂98$B iAPoY-d\.PAAAH*PY\\w}@M88DzA uL\AK? ~1]3~euԁ* 2NW@qj6A iߩq9́9X5,BZC;i(4 <6C ϮFB84[ ւ͕\P{B`_ B .@7 > Vhv@ [‰|   !Y-DbETZa @B+<`^q2D3)'ݑsftJg\uu#$rQ% EAȅè'(瀉R\)fNGp'+9g,-]z]5U\ى] IH$LM ^3"uh7J݄rVbͬh:M@#;օnM+*Ȃ88$ FiYʂ2B%*@pPi dAs| DKL1$NVJ#4Bhjh)Q"e*fBXN UZ%Vf!`&2&%BtmQ7l)?``)ɂrl`n}+$ i14@At8@)xߕpr@_vA;4ȣJLj. W2ĮYV`%[ꃬ645*_%y*o] B< dUfonzoJF;j>1@I&/mZ=گ^c04OTZA[&q)tP!,|q$>,%o_&$Brrs 4H$B вA?A ,rV/g z%2"Z(A3DRQen*22 cf9:e3&!,,2LD r@gtBtD >X#MvV0JcpX@yװD|bSp{^^X 'QQLB0S;5{%#BpU_YA3d5JӾ<5wD5v186mTgRȵz:cߐ( 6`4Fmb wAh6422$ th3hw$E2h-sDxO3556'o@ P+ 7<7 w9S/ Y/~#v/ggZ*πw= Áj/)tk@'@8bܡ듅c@D{8kW8[UL 'D%tظg$\THÆpĞ`.eNFV y+9PP;yX@G.">N5% g5Q ,xu "e14Y7CZ9+m'D|%GPCuő^#m| Ti1/vl2B 6`zHj:TԂ>l$z%+Zm Xk2A ~\8A C )$Aplo#;42&R*s;K7ur{ ,P\S5GPy@h2bGf;}; @쓥1X(FY6o&6hiOEo*era&\5QbO?!E,'&Ul<>jDYU`phFp(Y鑁#QP)`$D FȢj*T(ZCcBO]rqslBT8sc@8jͬX#Cp`df8p"\ @kO p,FZj:,Z Ԋ+{hF$ڑe ivA8N4ɇ} P0Q&Wx(fO.9O.ͮFi`{ =|I+",b-8Zⰾ G&p0c1$320̫ kNKm| h+3B7K{*8+9 :騳;o;#T ދo=kF "?kQw1йO~xI(MJW&!S|)Lc*әD bMqS=IՅB*Qjԣ"Mh 2)O'Y2Q8pЇ± v,V)+slVE,c!KYr!LZֶ4ok\7 }]C8@/{uiuؐqł ';Xbk/1DF2$d! yHD&Rd;;πFD%,q Ld13,i5 Pr%jTPx?,xAҕe,e9.x薅Ck֘Df2Lf2n!iP%Ir|t ꌃҝ7Q]tc:wwz< һ>!o-OGHAYxnG8@/ 6en3ˆJtäH},jdD#HGų-{B$#UPIV@, CP2B2 M ᴁ Oz! @2xbBGA `@ eaWt^bjh(* ;,@PlC |("lDM|bud-Yϊ"-jY [R>4K\2ч,]ps +"t#H `CBNbB @c!Jv1«>IA6)3O,8# p3Rhj`43i:e]ZmXUɇO$sl43i oՌ\(({'*qnpIQq|\yzRtda>ϧN@s .١fP!;֮(@ ΧH{JD=f!H#puOOʖOE, Nj OG6,UQQDɪ<-JX M&؄0AUAO]Ȃ,dcPk W" dNq D }@*.l=FXVVEb6Y'kXCXZ,Fkkq>Kq[޶@l uc0C`͂+HF߰n B`Ouߕx!Z(üB$#2%*E$ (+&KZ"ڀOdQ= ZVXؖY6gm-f 6kbng1N7z(p Љb't<#[6orl9t>s:`iG9YwPVP`ex> iļt+EzĬOhM3#ۇEFxR#iGټ{\5ZbQ``}t/BЬtP YlNUW*^evBk]ZLFv oXlb ܰ* @` ^,-d6 @!TKb<8`6 LAe/vAO`jx ؀X^`64Kpm۴"`6 O ! T:0>D "H ]Aa rE'iJ`A `p ARh^ YT &?j pd)|\X>ar!!bAq8DGjuRqVQҬ;Ld2*cP C-' ooU %$LvCB䧤 t8謨Z#qT.Ь D)D`a Nrka/ Rm 1^@"r0!N(,v#7 J#oM%` Ao&&+\A `4'r#r1D2 @$ nP6rk6Ą++b@^6 -IDߜpL2/ Na20/i L+~p1-6 ^ 2',3K$">S.uHS  X.5Wj5 >a7 ` @F  8b2.f f° Q s&3(“5&߲c&g6<})tB N>jw?ңP&*G3??6c} 4 Z &$B6<04Cq QRD]'|`nݴL^ MӶr@J!R!4.rKK%`^ V!%ׯNMNh tJF r@!'GPDۘr"R@@n 8D+NB8@!mZUV%0A/a@` 0.woXf8U2@e M3Zh@y &a\\]( frJA -G? 6w,n8 v–-P!Da3 C130B,dcdˮqsgr~4e *u:)q+"5bѢ~6 #thx@7A]z ";ԃj'9/D0DkEkVDŶMl I~bm6>nrX H!2MqTr+RrLy%sKx! PMIt&r!tuaWVj'of\vwA嘱J xnSpAPTum^{W|xQw* `}ky7WwSbzEbPYANZLY!8ZAZ_L\@x) *="!TS8axsS+8Z!6Ata9'@/9Lj=l Ꚙ.hS̡ZШXÚ!@a,,&O8'B>7)ܳOQfC?" ~',xԲ_JB#EQBoj+DDk7'56lQhmjk>!ّNYvXٕa9p4LAry`rK٘17QEyjza@et{tO$heE!o2vO9"}wEh !)]K'>apR GuڠIUrU2>aXaa&Zf~!2zbw8ڠ`x`+I1AUl]0$@\ᦱ.8@#U"`d'UFS u|.p4CCzuD鎘BI..N,c]l," #5#EKbv'c+C9'[?!㲡{?h 7ϴ6M䵫Bl(d3 ykuxGtloIm'A>alJ!gx_9[X`Mo@t9M#wrrQ;@9T|`TaV_7ym ܜy77K K&,2m<!@ yb aR|(X<HA}i|P%p\W@:AX@dTh <8 6X@B%-X6ؠoiAv>٨?aqǢ5$уxQ@;I |02+7zÒn?B9ʺXژ/;.X>8= %[ò:9F T]Y 9 ]cy D>=-- 4٪ m"YZƁC\|ZkD,8wr@hdB  X8 }Cl !4MŲt"KV}IN.TO*"_VelCQs ꣏M@v[ٜU)G84@#%٧TY aβhvں8pKMAVu-v36iPe*v2dEk  >P(̄4vUT1ȡcY U@ &n.Ӈ, vЇvԠmb"2,QA >#-CFx9B\AIE:L)XI3Pf(Q!3ndPfX dE3`8P@!p8LPӌVbWXE8=AV4 dN@k 4FF=d@A3N+krgz , VȮrť(F?Y<-ɭC.:j+f@0Ьi+p;n+0R.F<FKt!\p8&t~B}ۃV:A!DkV\8JQp?L`YZ:~BL @-FyH$S,^bS190` DRYmr QMUU s4V]}XeQy) \uݕ^}%vXbrpC"ܢJ ef}6>쁊5!ƚkFm +pgr9+U&|x^{7_}8( "؇u48PJQh!*A`D)ZQȈF6 t4XH25!.`C>\)4%0LfB&7INtӝ>Z"(F9 R0)NL*UUr,jWJ/XB:=+Z^-n[ש(0.RX3@-iPBżuG (@6,aV8F/v DbH&p%Bcc2 QT2+hJS l3? Z@%?Q>LY$ ZGB2$:X@6"Q"aMoR 8 ^Aq.-j-̰F ^ `C#c(1lь^ .P,pwf6Mndihxq-9Cd/(+O&||\A vO4A@ PUBڐXE*R>5XD2 # Rp? _KnK_ Әt4MoӜtC=O Ԡ uD-QԤ*uLmʖ(@OMUBv.}mWh,6X! -iPƂ㶺 2W1cIY`ûuCf^ryJB+XܛIqb(7ֱ˦N \/XJf-kvgt/c?0b/LAkdA5ln@8y"NrœuC:ν =maO|",L2 P̤!+bP@6` aP`6$ņT}3p}X)YHX껗68ESS49;eO*Twŧz M6ATʞqB Aa}R6DU kI6?&""\ dH^9`h9e »bQBօ0 /kC  @vyq`pBzyz g=x 'V^: |hg @ Ve ̧ ϗi A}J }ܷpf~jrE@ʰ!8Pk kĐ >FXw†AEAyYX)X,Y/4Y2dYX\ƀDEDuDE-b-F3ncG"CJjj&I s@#0($yfLipl7ΖnJ+qړ X8 AmXV}:n5cBQE"0/%YPjC(c oBu&7H*tI\)Z- +#z1lj0e*:sj`7K.P,B qۊ5a~Ґ PGeM( u캛bZ7¹ Nh5ꉛ` QwkFvasw! @{`e vбV! ʐ ( .P2벵0&>K k(C[GKuѴ9 RK 0dXZ ߰ mc` hK} l}DJ!@ 7Ofy;"˩(!v K )"[~X.(IXFFSg5l8IC˓r,w )rzz('觪•P[G{3v+vd &Jj ͫS 2T1o)d-ۻq:qjCS_kBY.4Ir'Fwtkia݅,-  ćLaP e0)+8 u`12" ` %|Չ &@i9 ky/P' {@x9 >RQ>GdJ#!P,ź@V;?]blHSg jS kt[Dž @L=YokjLöuli"L ":p5ոgA+iiX*+hRsnr[C3='f-(cȕ6G3! vYÕ2ER.2J2ҕ"DR⌼ f)lpSjEHnHl qbϴjF`,ݫ2ПPй%+y`[.˪Կ 4- P %0,P a |ٴ)pbPզ=]e"?w5P k( vppO`AVm@ s9 >YQMFhjmcQWT"zh0{De ;j+knLQ vWǎ}l]=i[` ޶f7ڭf U ˸jɬ W lGC ZR =Mh"'x}(ނ (=@dP(h8mp(Gq3԰̄.B**BsRB,{u3wߺ༵p]Q# hx GІG7Im*}1= ٬ZŒ*&n3U{@aR R7`p >`  / ;Q HJN`O} \n(L*7`gdS;!){ 5=x`f]>`+ ,0o}sM >] p ,a|RcpY Ɯ^=-w|ǭ"i` Ԛ= XGn X P!"^ P :îڬvgSP_ 1 r ntQ0AOYz ~L +Wz` U36!6R&"#W@jͬXieġY UGZl#+R^ 7U Yp2ኑ,2xJ z aڭY=F\h3 պZo &Jͣ\'Z 4Q`Oƚt"UWTb(B` (06op[1bZ#M3wT6v^wj\}B/_|"W. s7n@bn  aAF@fteAG Er eSA!>AY PŎa;袏}v`( Mrcvn裆b٣ %6z馝,1d٤P$o@Qm`plClT%dQEvP $Sd`Cn#dـ::  X[^Rn80aU  WؙoPt# @3 Ud*![iB0hcVنd}TU aa!@0al؀*vѠ ; p4TI/PFnPbbdECV `*/ODŅRVyeieRp!' QO 2xydJ$ #.#2(I ]Pj衈#FF*餔Vjf馜v)jR *++(s ,AZk%ʢ]J㑾 lfB̮|hpL2'43r4JM3\mZ rۭ8'Ákn+J:3('>kF+ h>)ȋ2PGRr.E J 4A1A,! eFrЈ(EY8ō|#F8pƵD e II9(6Tzb@_ Әt4Mod}CCA I(ޥ FGP,\*S(U6lTB 6 /(KC1` [JWA=` XJֲl! r>kaMַ5rk90-xͫ^@ƸUb!La sX16W񱐁O5%;ʌy-*'@ I2 G0@DŽ7^<]͈Hp2Q9Zo) K.tI=Rpks)X p V㜚 ⨌5{S hx56a[*؈GV I6ߙ g+*j msCp !t3,#pOpG{˷};,Y!kXV8, j̊,YQLɸ R-@4!m0k;`0 Aઃ}!!Bc+"?i.늢ڮ.Gav:l[#/[@;}(>mT̃ΛY!1,B=  2ۃQi(c*\`0;t>q鋊fy¾{} 𾈰 6J@c)) +ဿъ,(I4N;)t?Џ೙r5 [@h苣4{0e*੪iAqkAm3T+* <#B",In (o7b`bBYYB- ,0T1|8*Êӆd6и :-qC8Ñ3!/h=l؃.l؄:`Ed"CYģ-K\L$YP~ .H؃$:j;Rgp1ST;^$$m~d } $eef>F@{I 1ۼp0st‰02zOX2e&ojrb3K3vQHt9˾۾;+c  49 Ծ?HSIhyIÉI1O˞u 8@j~Ȏ|V((Sತ䵺 4f c:-PecA$  aLkx8CЬ$MU&h98XԔ9[:BBDF/Z1e(Ħâ;9` #tNCtULNgH́!AP80L00$O2!b}96|OFFFYZ011Ղb8[`P,P ==pP}2\HX,щРAQ-H @5;Hwz҅8Q*}S7R,dЍ| $?I(p(G 43,.ՅQ JJ wZ+08}2:6P(( d*h#d+̶jT 22vLx(R Xu䦑,R-SUPUD|Lz=.P[U]Ud ָ?MHTbVմgՇ8L X"F$"lYnUeX9"rusmQN6EQ|ׄyzmLW8~M%O_؄<l` OxHa֙,O`` ЏPΓm(%eHYS00 u"Kay R=[M|H3ku~,Xˈ눏;ڵZڸx8(c㴲5Ҙh|JF{?r [4+,R=7-1M\5]\\K>7э`<ܴSl6*LTP~ǝTіiЗYf%U96e0]U/dLWCR xqeUa݇ 1(ߑ39P]!c}mVպg 3P*8E6%}@aVb8;WV`c` VOlW͓FWV ( _^%NnOa(h:h9<؆&Hwa< GYhU*hXbsTYb xpYXj AޜХѺ3^ZC6vw  )<^@QJ@'!E1R5FVGH{=KE+NI(e1=\LJ& 6?YZ>*[n\\md.]@u6`BKkR*~f Ѕ8Heo/Pm ^U(Cy^z{|VJp];8g9\V6g݄mchsh:UFYlp6Đ6ב.4WPmp΄ɃȁTΰXimAPnbjaaVh;hjjjbcVZH:9m O(΁\GY,抺4&3qȧ%츙[Z+ x 8;Í?ˮ?4AÉD>ۯ)G?Hv[꣆AdnN?Ҿ. n52~G +S8@n\=E^a^ݲD7~n\_maZ Ǹ|wQ{6HT}JmH+10*d;4}; y&!Pg+i.]Q%HVp _gm0!DԆhgw3kc9l&4W`[7 'Ry6=ׇ%'arY(dUh,'S.//?꤆.!tU846x<9?p@g='ބ8@븶c:tE,Fl~hk5mlaw B5U x%P 0gL^Mum-}+(.#v5vT>fg sZN*l\^>uopG]Cn֥Ӆ`مT*y.iw*w~Hd}&ERY^PY&J6&lUbcl_ p@AJPM 4cCpu- <|O lƁC8OU3X-V^tJ,-1tJ& Qef! [POXl HWfPeT8N9tMt0}JJ)dضoBxs[W ((b΅TRD dFH!6 *WJ!N&5mP@,>blb'=t0;d 2pR2{Ӡr BWdF3$x'5ᤑͰNY4ӊl܉ Q43A ZAA38rF+6%W| !HjX'#PFZaVFjŢWv~ .#sΙAGt,O(SA =PfE\F}HpRJ+K1Tx O>%6p)ŔSPIE6b WM@QK1(U&ji e+yb^z b9d5B &%XE-xhx9Jk7m{H5o q!2Zs IGuiA&K7^ypz$q UU} *FH{,O{$,4"cihhfPI.Q:`EjK]ZpLlHnJu tE# R?B*Qj)IQ*H<,iTeV*Vâr^*X #u(kArCjZ-DY+ ұ.uM]p&6] 9 ` oa {1"Y cǞЅ,!0xHeG@" (Q K\&xzҕ iJcRєDe*Q;,hhE-\M(!(+&vmw^4З?cP7 AH0!q5Y0>84I i"79$rќ,8sNq#A utsrG=Ķj/E+jѫ7QGq\PhOILrW+KSF)3IM4'-IUAh Ӥ#>:kJS]ijЪV%<\+»1ҩzõpDzpX _bƶR컜X(&[fry1jW41mk NA3}Li{|EeQcmp Iܑ z$s2Jbmn^Wg@h=-V^2j< 5"F/7oh9,oLni0\,hI !>\N5kO̳ĝMMuA*/*PAAM ;j@ T4 YX")Xy5+=M,I"%H.@Pt~+$ XA4E2y^|?ȑ10&)qT7 tk܈ѓ)%,t)@ TXAE('\iy6>h C m]۽]T՝Ȉ%_MߙNO|5YRSOAUTYV55KIPݐ`\\ ϥP_`m$*b_-Q8 Z}m PuQha˱.ZMA[4'pB U2SiVWW\Ɂ$^%N3t)(n Ti@;ef*(b.uef́3,r&!g@hNii~ P:dO$ԂBZU]'~KYbbrY*:䵢6"e^VtYA+$)Bҽ)V)7Wi--a85aB*:oi,j%^nBjV"]anJ !Y(;lv]*)fĪgOh"";L6ԁ XHBZCBl1:!<-B-R}+qHə*>+:'xߗt+Q#\\U 6C~N@++xPB(:@>l Q'J4 g_쀎l(X2^쟸,+͢@͆>wA۬,:T!20!',:žm?lBB-(p 24p-q"TA*4BQD58))qTA#+ *\{y" ~iԂԀ<*L',Sڛ*`Dn& a;hn6p2jk8*IX5l 0TB Bk&4'(1"A"b2v>2lB(` uiuEr`A^2f2l'wA((`" A>CTsg2~i@.Wbn0[XA 3骓23;33l!5[36d32$e(idB@B32t(0`(&pdր3Usgj"~9 <(<#DB) DB,dA%,0G_) .Py t@?P.WPbZiވ5 6PFUOU |r5X^K7'6mc5, _)bʃ L" Ha(HI;chdqgc :cjt'l"ԉf@Ԁn&,@-)(2 7$9 %?A&u(EHtki V,iryyIV h@/aXYэS|6 66෢2jFǣVs2f"2)Al1V&CxJ8͏Bd|8s>B3O/JK+V(aYx, HdA.($+9شUYyrq&Ka I9o0.`+(Qg'[ЏtZ/z+ T狐y8PV;lhIW K O:٥8(ߋtzPCriI,wqNô*d:g+dAA); 6L;; L.@lv7raBXs$=DdcP1 ¥ )3' si$A Se] :9n(AN=EYUG6Ep!K839Ms5sPM,aO vTu*KyUT BUsN-}i1!9c73KFjFPu06spr0b4K*iR0ƘSh@.9GM% V1@f+ `#6OGmc?5`@š4bUpI.fA$P_ /[eJ ObQH",>eR6G&Gh(B6 t& Kp#f((T&(0)t f8 '>/#{C{Py$ ?D,!2_/~" !M#24pR̂I` 7 '00 '1Ol &h@!7z` ?`7[3(hpt#)#A+EBq0"jS:m0AaI+:d+pp ъ2p5L?O~ JB>bdJ1G['@#&&4gzD'%6ɌFP@  yBC pW=H2 %Xr:d&t',bʩ,| $,R-F./" pe81^08z3ЄR[MiT^j-l78@a9cG#؁a4C,,+CsxOuxO ,iRJ>Y~`L+ĊT9p EYԝbsܱ+u 0Q82%_ (uR[R䧋 Uo>e:ST+d!W;u IӟՃ PJԢHgjF;eSB>JժpWjIUn 5a˃=hV`f9 ZB-N[9賭/,k@,bO8"k'dy^Wb ,0CV )U,1&0tVp&|r>>H>̔${HD#ЅDg3Mr$(C L"jiM#ء q+re4\r/i9 xP󵻑"osxl$3L =5dS k|8Ȇ6l1X\օ<':ө,j`#-3`E{/҇^\q[q#>Pt ˖סplC8d6oE-ʔg#GC*?]*h_4HJVę~ f p T^as`0#9I (EQPVKa3HUO VEŒ5%#P V蚥Ά E-6LKI]_[t[)HDB,/^j?6 / Cy1mdlXab(cXD"IG)iDt"Y,yF˟RhC1Q"+D &U6@ zjO=-\QM]lf" wC6@S:- ɸisq}n6J=@70lx **D$`\^?PP 4!u|2hE {RJkc'V Ь ՏZʭk;w =¾%}LHfօb Ev,1 |n($+- )XbePXEͨVlg1e xc:.G:iqt!.1jv]RiB; &:{C9Jt$CA8l1`;l\*bUPKBiLc `Yl aagr-LQю|#)n7`t4'Q <{[ 9ND.idBsF.5bp \0h.t;1CqP*es[O,?s~OP 4PShgS1EI͖|AGCG] t/k4~CPUSNYD|_kBR@bBNơY,ʬ&m`= @ڴMcJDܢEڪh>\ڭݐ+)9"Z: 6!a( "I r^D)>$4  r@6`Tgj hpihv |IL8ixI#Ҡ T^2l4`ΚX 04P`!C(0..Bl3 LҎ?c!lC^G| bAll: sX o@@h2,O]G6?FO+zX/, |b/:! xHI' GK.D̀HP H⪂:/넎ZA,PSʧH3p`CN# X O(%:%N$ܰ1Sn[&dT>8P@)0r@`d @ȁ#D.tl!@.o za^Av# a@\n 8 & ` ` ʰ \A:GjH  !'r ._ΝƮ3>Z!PI@0q"=@QI70UZQ&فP=vrxpIlc &H|aOEEV( QӼQđ(1LхֱˁJ mm ( #g k e!ZF&@"DM"K#9S0,ҤYZB&[9 flR9f 8>+((!A@,43b`@HG!P4+p``$ V 娐-)- @ .0 ,|,0f0/X`se H4@(S:2QNbp@5FSO5N5;Q ~5Uفj0gAXqtcqA*f#j'8k@8-֌͒s9ݭ9РsZo:OYQ"-)I `3~zgLгӔBM ! /?O־D1A@AE MhgB_";>Z"AzD$Q E[EC&C=&n@vR(2 `H2@! *k>` PЉ( CJ0 08 H<5"yd]]ō eb?i__qvEamL kHz$ zH$"$C %{(Zad}D(o0aJq[Je$ ziCLgOrj{4'6` `2Ai aj6OMa0JG*0X@   ɴ| r((>p`n& N'T p5L0w Wrw1m@p(&"3R^$ q<5 j#PuO5vX5vUave7pnqv@W5~qX3^xcYQy]D؀z)(@AC! Hg\3QPc'@E}G-> h^Ռ T-?_KgMPeXgS`'bيjb .V:eJz`Q:dͭ`eH|XJ?%Ǩ$_4f=&&)A|0|g˫ An&<ƈi>aq45c!o̒ 18bV@kt0 PfK .Ω2!$&3/a琡8UwA5A6 TOaiBUve6o=vpnav9=zU5Fۅ8\Djۘ79{0zz) Ā`:2@궩(AQ‘32BHѝW͙UNx/`EzwG։|h[%TgI(&C-^ ^6:Z ")J؅VEOwg!Z`, djEpz(a(,itAvNJ5fs ``m0-nZwZ6kպOح,^ bQ:p0kx [ sSc@(,&[Qae_qڡ`7cy 8͂YCďfs[v-FB$,9$ X &@HatLc|㶭 YӉ! >ar~J_QZMK;ځ@qD*z<@ >8N^nHc҅ӣ9ETu ae@`cVz{``!81 >LQzBx*_{E\@ûÍ<[ P׮(5 qQ{@1'2r3=Zk޷^arH23LΌwv]CI ~BP<!@|!1%aNǙ ^! {)„"6l8TG66@qolҘˡhE@ɑM`zȩWO t飊c~ " W|lۖC NCL,92M89|[ʏs#H*!|'D,A%o-mJ)Mb,RY^98TTF7 @+a_sXS!>Ț-&sf`PЮ?З-wuY/qx6YA*܄Gp,A+ׅ̽G,g`ևG8IG6sK7/#e~YK8`!5A! 0WAA8lEc_8Ẅ́ъ!dN(cD+܅ LLqVPЏ.yJv8DN@pb+d}Lډb>blHٌJķ$r8 i n'T4vED )0lidHZM>U^ w]~yqifn،tw'vCߧŠl,Ê BF &.6)`% EweF4-ܫ JTRm`3MraPL &4a T c1bB0X>qR)K`h:Әm2LfȁzOGXQ̡ ajZ.XӍ* Á}H>19hG&X`; M x3:U@s(.A"ܰ:r GA eR@0DhD{|-ohd# +4"E%"JXz|<0'ze:q6d=6^+R;c>YR@x2ߠ^DY @X~K`w}=]#bXD| c:Ј8(ȵ I?hlTa„BZ [Dȑy+phc 8/xA9p` &88LOpV71Vx&y:vnoj]^ͮQ~x=Z+LI%G씞D]4@^@Ԋ07B3BЌ\E[B? C!E">0&C VөO4 B լjPUVŪO6o.0"}!SeY[U,nЈ0!E^E!;ɂ906DQ >cLF #a&X17;/te*8bm4tF;Kb1 (h$f: 0)8jHO@S;n(]vY:aR\PQ*)`^80G 'yp`ggn|y1W zqDz+Vz ŐgWW'/C{h 0 |P||S Π/P5@}P Fglpd`Yl/lk*p~}~& )[B`wG5W[$Sq9@ #8 h6 C%?^)U7~SL7X%qA 3hK05rv P<΀sp @ P9Waanta:NɔM)#@;9rZHbuRbehPQR ȄNL9Qd -&u(B=bLi%}d8i`:`s#>!TB%V)5 y׉gZ%$`7.Uwi{e{%`V(x6J% +1ZĦ~F戎֦vP x[8c&\ \P5ZxoȑB8 Y6iP )%V0J Xb"E/,&p !L_( @3$eB+t 8VP"U@ % 6|VqsA[rsU"S!>bQPwblga)%8`-Rwz>a'}9*bv UPqx(&|v 9 eR(OExAZ<Tjk)Af# ` )@yhy+k  }hhi y/vFDjn*@YcP` FSщ' k lFl!~*`㸓䇎8pg i gnn0pA0VYB ş?]ߵ^>KFu$L!r0s{aQ u82- n$,z6Xd3! A2v&p /%9"'ǹNi! M&vaQ &&#!(=[MxCz7fQ2re=(NlJqıdP!(K =|Z!b#*x ʱ Bp 0Sp@ $QU%, Iz"-NJ &`> )+B 5›雟#:-Ʒ$ḟbڀJȠ1\AǣXGZ 5gY=XZ zghHC /1oi3.c( Up^)Dn0  ` [u`#9d[U/k1 RJP\ 00ʆ@! rp HXٰ"G״DAhA!`/WHw`37ÕW P-`"wIt P,tGvfB=xln@A! =wḣl@9jF)2?Z҈q #~z:V%q  @ €C@ -(z*IMC^e@o|ߛ٫[ق `Y,[}YP { LZf7<ق7}A6D[ KxlPaBA <˱tSWp4qWU s PPpe.1)\BV/@ `A sZ 0+* np @ 8д@P*8ǒD4?9u PpYpb`C@LOr,jV CO! B-s0 VL#PX |“])#$R` T| r3B[VP'Ixe6xi۩|+0Sb|wAy Bp8 ,5zì)>{ up>|{ͼJ+ XS .l!<Fכq!KX:`SA/ BЬ* Џ a[ `kk{6۱S^t3ͤ+/} !ê3%7vs%')a ZJlD Rn=p P$:װ/`f '0 _lߐA } 聕o)f2& p YH j֋P͞߶y Np2pP3C>*1 T vѢ}s n }׀"R%A 09`p#q۹% ۍ:Jz+b/a !xP { ӽ-*nh~,ɀ͋[};ߪ 7`F1Κn <ڠa)sZ F LJ "n$'|^n@ ^˜0 Hn΀u&͐w^8fۆ* 5̰{0 _.o>!\d>dIE&*|,qms8$ d3GBF8 %FT9GA6>T4q΢*d7 @ib$5oYTyѱU 'pd)఍TӗeURM,ظq([|65S U( DKXXQ.}$u7&\"ya,9H]tYX.N{ٲ=tm^X@&xnQā9͘ 8 ɁCߗZ#үU8B ؛27?ܯim4*8Mv{A&88KDprP:& ldkmÈza90zB@_Jqf{El l 8Q: qÈ0QJ1qCfȊ|GJp6h aԲ~t S,>O! eK@4&cG*β@$Qథ*nM!L}m":J̢RZ F&lI'Ty j1 ڦ *xgd*mU9z4 r6. 0 =`x%dL! m>+6!]5b#]e%=P$D 09Ä=6+nO慰if_$Ma#A ]T!='nsT޾ K܍ ^ ۈA+l15蹏v: Iҕ1` J ,2lD2ʤhk.,  $ "}L8tCOR_c2;k-nLeU4az)r0OZz@'.ѥFCIxdn( 1$%كGpg/)r+̘ @3q[㱱؂)"]g#L5S4 O8ϑlogv83I<#R؀ 35ه.3"{2 జVYV aGFv<" @"jQ/U!1p ~K\# "{RAR,8Sʦj#x8I]l= FBЇ*@|A3() pb9{\ .Ń5 җU9Cd;ٖjSrq<2IX4GSm.BB 5?HmXXC?@:JؿІ}0R:S@6(CEy#6;4sv7;c(S<3 臢]<#E3E6#xT\;!?PE<ʫPtŗȥ}[&aE +3&FQOȅ`8u e xjr:ȁLo@BpFgөB1` kVhY@>Bq 4bP24^ DJ3ѱK1Q]ԸC>PA_˪ KϺ( R`R$Ԁ3L'bSЌR)]*%=@׌=/GIk&45>QX H85΅U8()* 8/S (EH2\I HcI&rOG9BR.OhVh'[ZjkUQ,0c W?cm&4-Yu Oh\y%$L|=9WDZ#6-7Lsx [i2*1;Y@Uİ l(N{1] ݲXc 0`T#SmP:/̂6Yϣ ۲Xϟm6xXXM]Ua-:hZm> 69  |lR'-r[gP[>ۢfLq\Z,F*X2*XTʽ^\CYt:f28R*ӧ"+4]hlZ8^NyUaLM)%PkeVH `C¸H5.["K#CC3Y˂eh `5u$]UU}m[]_fUJ8=1 P]R02+gXM~]Q~iQ[<251K 2`/Tې\FnCeRFiЃ9E% BZFaX)JbrOV-)V1VS8@V1-bbLfHY2]9V6 AO9V>, _sRPM Օ*C d\-|ɾe[aeN־c]$nRnO%Z[.|(;YWn3n a L.0 ýkO0(f}\RT̵ VUs k6bh P  d֗@ga S`焠b//fZ4g=X2IU6=IEܥVg,MIhRL7i.fұГ :K HUziqe!,U툸Sao j2\j}j{Fie.Vhf: fݰ6/ ]UhtJhP&<⅃U1άJ޺g. ܆!PJP|cYֳI mNUJ#Jmŧ k)ӓ4dTpu9tjapG6ݷ$*0X Emc 5b=HfAoJk>bs7΅ C\Y{_LmO^H'DTt!tɀ}Vd&t9jTN~Fљ}u#۸&Zgfe۰L21X80MSCijar![A4rm>9#@$/(hp(r (sxlsohBsg&~OythUpMJ@mh&~v 7A#K7m R2f ;ۭǍ7C]٘?Cm4#?r(ejv:bu[Az@oS1XᐪKwMs"f"'z=h{wnx/ bP (\xe3J [a|^(J恣$6X_4l P% 6ii0Md3f><8HRi$ʔ'\hV4bK-2N,5tǕp)lJ̧iF6DIUX3ԃ RT6bU9ՇIT[E#LWX U*ee*'>RfE@l1>0Vni#}4)gӆlʄVSw,R]da%b3j' NU >3>5 d=}B(tyOI`pl1d>2)Se6'z=ƖI<]H•W(@u|p%WWG|mIL4TOLD*(X,nY4Xd"p6& ڎ)ZkF'+ll]f0ALOBYt|wUQfP788LΊAs)(U@.fذ ! 8#PB|' Mrm$7@Fͭ!*)p;ȁ 5mG5B\jؐk %q(scR 1\C07 Fhr`BTB d bB6, #OCЅBH t> MBpp} 2*X}c, FmxU.[(,4a) 0 lBC $Ƙx7m Ӥ;㣯@P BPYIb\# `A SG ($"Eʣ!Aqn1 1bQ0ȀMb8$ TrŒR\l6ǹXJE)$\  (V` C؄*1/V# TЅab.L dჭ6|؇хS~;@@}B P>aAv K>)`%ЇsW@w}&JN{ S*PHMX( imuh!t +2WaݨmB># nX3=߄iry*_JE 5d@G,pBFf`A"Z |(V@fdORQ'Y)`(*7开+0* 3+ ȁ"{pKnPFbs˪yRRN7F#Ȃ*HU.`PX+P`Ϛ$K |@ЊTL@P Y&5`.@@0) C|>j1Nޫx4wQ(׵)0:A],D3MC ˜!$@-GA8C`@cBݚ>@ º;BTcr ylHI> KMhm눑c5Hͧ ׅ8o|('|(F-aE(WN Gɼ4+&uc: J' GuAݞ/J|CӖ `-.CX#@wB]vkeKB XL !J yӻ-ᆰ&du8%(|X1&&QAQWe@H,- -(^fC4xGn픾 a #z $'@B$ߚ` X Oi@;e5e ȑ0tH `@T '0TH\<|B.KPLǀÉ9 F=aJCt_G IHa'@=ljLC Ă6EaF Xe DD^Г: H ЛkVDYD]d,Y͑%^"&f&n"'^b1K]܁LJD:,0p@UMĀ`UD!/vPl xNH LG84DaSNG0VʤA\Jh_Lv%b]$:P kE3܄0>>#?c>bFlʤ|@$8c,j@;5jH )EcSHcGxQ52U,[,856em>\7ic#JeGcG_$R:xaH0 $H @YXMXYHZY}eC,!II[%[eO^%YH< 0^&[ey$ŵd0@ 0@,#F MFNf@@|,_ 9}J(f_FK]EYl_G bb[R]c=5fn&2t@gjd̦ o*Ю$'oGQ,a]2d'y&gtngm"gr y&J|zYzNEmtBg aX ¥1A@CX * ;)E`Zf~gmh'};x]Ҙw hDTIоY -zyQ†!`ERk$HfEƌ-,B`dLZ~B a"i=iS^IX3AőFZ"F}H8b\+6`N iqT6ª*ibHd@+ *8\MXAL{ $K,n :\T eHIJnj)˶GM0 k1еn){ukYk I+dӹh>+аn4VP+:@+ޫXO Ƙ]\Lz VaUMDF*hޕ t㪕i"6#+Ϝ+VĖkk,jZEkbG0n6,rϪ뵖+D2l"Ժ+^?} bPF)iwDwV* dj] dV5b>֫щ!fuR$ *nQ*-BJ.箤(|  單:ߋt. CPmeNeh imi2M$NFJo"?u^/Xoj-∕JJl,L!B1486E8INoUo*o ^(mIxBE,:PfDZ\|Bfk@$ p[pgo $W3JǐC O_yo)o^ A$m]PI`|hfAۅo,4 ŇO r]\;B4TJa ,r];`)mɉqPr ^XfM$Bl!,#\%&q|@%PqS/py,C$|(F)DB'$w1Vt!t(3:7D8@.@A)T@$d,CP 3V8dcC,ryAwfiu26ő0Dib@3~ '8B)0U(4C23V̳J9cM< t[B tu~ ȴJp@@3I2$0i\5VguV ph5XcV#YZ{ mJx]8@f2oGD:d(cySz=b,}Pǹ֫@μkԓ|*/NdF)Ot:,\ c_E=i<oa|ns#@)ql Tc>2ώ~;NMmػdxP~7 d8B.$>>Ц lG~ǹcD@=\1)hKM D}.I!sK= k?VRI?Ĵ@&KAfY(4 !F8bE1"$FAH"rqeK˖C5NԙpNx9TOD&r'*d>h*STqZ֐4b؂fD[PE6Tz][YgR Fs)Ca"ZNJ\25 Yd׺` 8ط-ռơt?LnĉCx%>4-)#$ 's.bD)Gʮ./,Kˏβ#qzBh5$(J!*p bO.!Ϲ d"*\ԁIRrqOfLxnCo\lE*~ RD* k#T=.#%> 2qXȔhe Hd.BbGp8Zr4r!'ų0Kʡ4pC̅D d Z1 (ZqG S9Hr.p*  | dI D\6~0(x"c uSuX6`., B5(MpdDB  QnbtYA[;=Dp_(Xgus 6q$zC6H8` u~ XHɊ/2!wɢ*ADJG q0vX3"E5R""4 a]R˖`$-%[_Ћ^RQ'6ca%*ֈȹ`nEpą/䋠]@eKA4`*2 cY&b,X[B*E! d#)*2 !nH}߳");BbA\'v(2cu}1**?R`#λ2aNr(8 X mje/XIwQ=02AB4lA8:: ![zxLc.`@,N\j"5a:ā !L:!"W ~ {4JEdA9#./.bCI85**b )HA BuL@,Te"Jl(;CxGH@@Si $@]1 jEF,@ɂTIo#z4eWrA":~T"RY&{fX |$zRPVr@L',#dz8} ў5j'A<#Hp6|F%C[-xqۨQө%{H/,&Ypa@&4V'螥>tʁ\%r\8xAJN( x!l90 Y\9ZH:lX _pYβpD2" PȑJc(2ƒ U'=8$.e ذŢ_*e- O 20ɟ|q#?f&b\63 u(HpAe"ij[ܶ' ~1RZEدU%iT"xaTBF93JT [~@ @@j+i + B">5erN6i* ? #a4E`"`H5 'e ǁ]-@Atx!"ʻ&#/ad\?pLF`: ?# '2zq( > BR_ŒVY/`*HDcqN8"cG} xL;!aSjXWy.XɁq-36L:Qe9 qAOLFE4A3B\l" KʃM#! %)PODYX'4uVzGE:1#h+a8:(w x\WY)b|7k ]!s m0XGl-n'3g4g. z䤢,hL}M" $z"J̫ .PPl8@ҋ-ΒXnB$]!4ѮPWba a1| W 7 D`+ %`] Ƞ]%,M$ 鴄K/$b X)") KؠiF\՜%46cj1 !G%B% b"%"/ ' #n i:AK!?8FG~R-'b6$dZ" q>ԁ&!ҮB6D8l*GF7b-K8*.-# 6V,/5~8p A2IZ0Ҡ0h9$G! #X0짒TPF'<g#0/1b2ͅ."~ F͖4 BA(0J#+P.߲.2Բ.64*8c7"O36v*M)rD( :w:\$3 jZ3!<63 sS;A2(:j'+=><(H<;?@kI/s<7e? 3?#bj/V3?M$0B҄$#6<#CA4)33CԞ0 ,0볃A_@OCg"ڳF~GEqA3G4HtH#UP4$DoH4J#/lGtI+tJK4?ɢTKs"LtM%J%""~< bK[0AtO4JqLTHJx=TE NOQst9,S# RRbS9S=SA:@uTITG!:TUuUU#H3FP-FI%Qm'XWMUT}5XYXX{5BHq5$lN7_hZZZ5[u\@[[[ [\]EԒ4V9%?@'b 5_T_u#_`ӕy"U$HU?tAR$vb)b-b16c+ U4GcA6dEcacG6eUvdDŽLHtn5"(StHU#W6gAVsϰFgVe? ehYL i=ivVtP S;v*L&kkvk!lŶkl(J Felm6n6l6lé>O6voݖo6ls >2Xp^SV U[4#>V)on1Wl!?Owtvsق Vbnu]ua7vewv[WnOx""$Uf-B xwxwxuUOuW'brgtAg 6zz zibP{w|ũv7|B}Ƿ}W)$!^VKt#W$ywC3OGsH|ٗ}}ǥ|7lK@WT@,85x9=8{{Ԗi!W," T*O8D!3#<"#שlxI {~~q'"h6N"k74H:P0>|)wD^C+SjB(jFzLFxK,fC"φ"T@7x8@ >ԣ"Bp1{/ F%9%T&B?$I؍X)nMFT[zx#~Q5yvfˆYkVA %~"n%8^BBH_+)jy1AلUxjv2Y "CXX x} 9yٹWX)8JY! m "x0^`) # m_(ȵpG)h |@pBTXrϢ[q-B ┉DQu)y8^Y%i/4Q5'nYU>-ؠh!f37!0 `oR@bX(_:+++:% Fm?mgOBƹ[kc.+œ!"+Q7J,՛aZ 0 r`2i]Uc2r й *۲s, ԹT21_  @l:?1& #3Bpxp˕me6r$b"fzRmXpNȮ Z:27_xH&04& "t!5ٛ!Ppl/d,|J{@T TQEc4w$ "{Y#+rY; am: խ9E&I_ۂAr@́0(aX|*,F5 u!Pt!B`!Z! !3<{",}[ !T[@< @猣 /j;LS .&3,Nf{||guj .8u)h@H}1PU5&!8zZ<`odArn=r< @"e   p 2ڭ@˹Z!2 ZA(2{3ͫbzz]dT 4ͻT! T! \rx#$A Ҥ ^I½Oz–*U /8q3N@\D'B ~zcS]Q$-B8jmٜ r}~YIq`@H{@Us>w (`t QpB ԻE>a/<}@d!@ `.jx"pl&5(W ﯘȠE].td&L-W@a.\N.,(X28Dի#+#V͓m |^r͘ps K: G& >?P $; P ZG{, 6\s0XŇ])֥K1!A 0̙4cr`1?E^#kX&20x~rT&*جIIJ* #M1S Z)QYL)]-l,ִL  @PF)~xD,UD|;uM',@)@_eHe` F e@F8^ c,PH3DM '܉g"3^"9`Bds&U(J JCa(sE!׊.nЃA@d9ʁFE vI&ANha2ݔӃ<- @,1ek쪠SPe!UmYX@Z?ЩdH%0e$e`v1|I_k0ν3#es!`ƌ@K8Tk*hIiT`lAf[" 1\6Ys(P7%GSfTlc^?̈́@3<pBt}{E0!~% a, }m1~4HD[ڵ4STdS#Ҵ̚kHp`bx. 4ERq)(܏"-*0r8 aHAd8ICM1 '(h Y@+p+K&~`І6D؇ ,ao܂~P2pXDžf$qCh˂א #t H`E p\.aJZ'`7v\ = B3B)E bqX5t=<{Y'p/,jp8(gBS@6@ s4Oqd`ht+O*Æ PWE(L`<$ hQO &'iHFU $O@$Ae]RhҘ#M2#1]8dh̏ˠ˜@@F  qG4uŅ<s4kB@MP| H\,[23|L _(T@Ш7=H#r JWWBTd!kWG+fY)T@h4. M@;HbZ6r{9[kbk-nDry.8u'XS.@YrqAL49~v%Hw..!{o'JBbz HZ0HȆo #3\j8T kBjT't@P F@Vda  !ElV # $tܘ;̵ FXԲ.D@uM]Qa)DԖM',]4w%fV#aXY$L*Y_*Qʌu u \R QoIg Xo'!`9lcYx)zl'fDX 8. 48x.D 0]l(+Ѭ.@ʘk @9L絇/f)p q|JɦKm%ccqtaĭ8*ŭcX&H֊ZCLCLB2#|"GkJ).-}RjOd'+_C3x} 8Y) OdwGirQ!kH8tAq(+ @@`AYvQ}PE;l$I;Tq1*DPij>unMh.[F0( [#6J ̤vÏVoa.D#sqC~UI =tn%G/!ԤpQ4d5t0p'b5V zvQ! q+' 0 0΄sHQ$.py rtޤn=$>x3 Xѱ$'X6acY@.̡KHdUCTAD2Es~'x +B9tx ++h'hx9Ai/A:xU-,dp@Q$ւ}uSڦ67aR;{m1'a}ZFp33E+gRKklhnznI s9y'Ch'evEM؎:sI7MI OG,( 8e3'HAȁɑr"V  F#Š5x2\C -9) 閑 IMOٔ8SI8HGȏUF҅EǕ'51 UR!eakɖ'Tmt9 lUr{ɗ}yLIc|x%5ƀicWڢޘ RcyٙQ%UʑIas ) Z隴y_ 58xV'MəϩYi)9y y9̹7Q9$ 0v|` ɟ j |0 ژōuɠ ʠ.9Jj*e9(" !*"Jd 0'#+ʢK!5If=#5jUEڢ=.DEʢ)p%O Q*SJN Yـq]꥞oapcJejgi!"o qq29l#wy:ࠥ2=4J&Y$iA0 03P(XU cHjJ ʡ" *'#*"jcz:?&ӪӐlũêJC0*j)'z!%_zy-B5Q `6ʜ+Kޙ6 +*(ѣF"])ӧNB**իVbݪ+ׯ^]rRˆ1Ҫ]˶۷pʝKݻx˷߿ LÈ+^̘C9ee5p4yΠ?MzҨONzְ_ˎM{ڸo{ N|ȏ+O|k˔ Y@^ivNџ8~=xo|ӿ_| h` 2`>H R(afhv zXv$͋2,b=@c4@ =7$BCx$K*dL>$N"ieWVZvIS)YI&f)gz&ofp'rg{~wj}(&j (49FsuYO=곌>=Vz@xZ뫺k*Z&k.lzR[rb+nkv趫+o􎻮ˀi4(R>CS_" L2+ܲ/l0Ϭs4s<@F']87DC4OWSKT_uXMcH1YJ4R5_oz\~}#޸ p[LlqW>9kz[zs+룳魋7L7ſny=[0BZ4*|dE`XoJc.Jm~蓯/߯  Ѐ<@:l=Z[dȧ"Ao XBA]z 3p*?A( YHBp& kCp3o8ĵ HT "ɸ2aPJ0D >$׺26̌g$cX75f|9QihG>}GAѐ H@*Ld##IZRd$& 6vɂ:ȬoDc*JTOde,]y7Җe-Mi>ZRe)M9L $=I$yyEm =n* &xIrL:v9`JÀA1hЁ"MB/(ч:4ehE1zQf]F=QT!UIBuN%*M)S5Ĕ,uJWrq[>},"Cj07J"MLaJ}("+GS4U%_M&dը&XRӂVD^5e>p}#y,[ߊW,e](JXv% aKv]b 4j( 5%g{NEU ˂vkSK[2ֶ+^?}V\", 敶lgU~ɓnIZإY+TL,Ҁ#L@lZg -({ۃ&!Yll8Z ^H 8PlBإ`,Uare/9 1q$75»H.%x)~\FZ-3X-p<8 -v=0#R?y[HI$m/*޷/:;/>-q#ʇBeD<2驾-8f|[5,?KyʕQsG_~gTMY7ǟqW7s^USӁeʤ9MD6㵀V4n"=ףE==R0ˀh Pf Ke`~ , 7 ~hYGhikN;}|iQZ\q bPbg9<;Zp+ riʰs^=ደά(堐 ~NzSb]ݝ#ўW¾몽N0.};>6~\,6"M[Y1FIӡ#q=1 x*o+1|<(} Ѩo_|ϼ1^>0_ϭ-\~) ?}?:#3 ¬0?1nF҇ oB#n0S?5jޓ-fm.Ol)VB -%?onF+U{ڪ]-̙i\F ym0ٔ]ú_j/o?/i[-A|m{ڪKZ~NDn!Xo5l[??Pu/ooLeЖ8`B 6Dxp.B`č 3 v1GK$y0X^4X2Lj22YP$M;lfNa,ȅ)_nܙ#LhrI9 &CX ׇcFl߲s9w ^s~+W'_*\  x`ǃ&<]ˑ3[eɠ ?>YМG{^mZtl!On?v#ը)4cRT`E!準\/ zWpO%/=DXۮt>R'ЁNٟ=(CI={Ϫ0" ď =6BO@Rd$XHƁPFh\FtTF {H!$2GH24(wr*k2,2<4\''8t0xN S" t<<DO:Ғs/C,)EDEDM5G{N-zUV[GTqdtQ էSuUbmpMU(mYf{l׆}Ɇ;ooZ٦Ya6%4!&ff!sT,!݈F%6sx=P;cx?҉ C <(C~Q" Cx7qD9JRҔLC*'JVRiX%,[4aoX)uK^җf09LbӘDf2Lf6әτf4Lvyr7I}2fbhS88)NeLb(OzӞ=O}ӟ(*#Ĝ'?PT/F=!z/ CBP(t hHge8UzJz$i1MQ4.i)qӔ&])oӚՔ?)B˙4Oj3w}s 'eMT Xũt˙>0trA'D*r'XZR31yeP*Nr^Սpl:JŒ'%)ŊXV5|,oĪװjc:K.ulldfdMjfApcc; ۘv`g+Rߎn-hzZ"w8M5Va7 +v݈C8ru_}zD 4C+Eu]h7NgzݻδS:q|0~eL .Yݪ>t.o_{vpN"fqVsb]0[=>uدv:O_0r֗iՍj--<_47>v+<*h&,]Y\_7˗pxkސs&sPW*2"]@+ō,I'҅pcz#`rge]G=}dbGest2q9J}ܷ~ r׺ap,uǎmr8fMlbXrqoyugxۼ!'|d I-l_Kf^b4F E`'5>;n fR#_vIqmӻ7)F4vלBy8%>d\gtK}ǦƇ~[W97>zL|٩ܤ49.cwׯM:;ggwĹ 88V8ĄtS֗XьN> <mN*nsﲂ⠭uw{esƳ_ ^MM 1{6fw#/{Vfz[z70/Nw.>eQ?wo40k+?pB>c@W)&j<#J,첱z7;/ 7Yc0jr Rz[:m3r⸘«6S6*S6,s99 3?3< S(1RXk?ws;ö[9*˹1 +4{07[) AÛʷڰ 94춊˶ [0*:cӾ-/t+} Xy9+BJ ;)26:3 S'.BA4 CCDDD(˶mN:+ 9Rk;vA{͗3#|싰:L=;:T2C0Z[d[8C bK`ߛA0A#JG5,˲R6ωGJΛFT ,=B->D"G,C1AcP\2dڬD0SB-B.=IGdӎ+!{Q| ?eTIbR+JLBdCn|9n*8H92.8J҅8y8̊njM%Lz6*Xc\+b=G$+ߊ Ԗe?ܮOŞkތ=ݏ%IJ]Q_M\Z^~ %u+XҼ酰>oUDUH~2<^fj.P[݇W,cW8ɋM4Vhd`K<5n*Q}ʛ^m S.ȈHԉUBa/fc:FzXЀz(8HhG(3'#>]Siέ;{Tgm+VnqG]1Hku&J~ie>c>oe~ic"Nj{v(@^GC~hM0[VEhh(Ѐ%|e(XVj/^Ntj0t;*O6j`gFTOmfMoo (N +m=^iؾrk\Ba5݋iS2Vl/tDqZ7Æu1g0)ORoph=tFjHq|skVeVNԣ$z`G|WpuDeyi4Fe$ fDJϨkZ-o𙘫)܃ j*z;wZڝjk} 9bԩ K)q?§ht 1Zr-KyjlvVΒN zj,s1Gcm Jn;bC. }Х<26YQ[lvTgˤQD[drPfW >Jۨ{É$sׅna54 Yy[A= vj=nZ"O{jM㕛d>ާii9`^sX搢nW629iqG>zϗ{OR7g笚^D>_Фc^q=;8? 볓W[K7t:dHIdxe3\AK5p 88KpC(Nʘ֬+Q]oV> P_[El &jtv+/|0}>q{`$hLj;h$o`^l2=8]T!zh"4 rѕA)1]y'?oo-\^ůp{51;C(X\ xa q (D"*\=T(El!3Aa1C&ps WkY0 bY98!=HHBwrL1wx3#Ndܤ`B0N ߄ XԵ.J?ĉ6(-yh? X|_GMz\IzL$gO3fPzsZ 5P2TV:Wawό #I '4hot&2NoZӜ4¬xQ՝׉+<&5D,Lhִsojy^a:F}=paiTbTϴeHi"T\To^GC 춳,WNkfب ?;v66]5S8d(li͕=30ikմ'ӽ]N⌳r\s%+Bm+ZyG_;bWU(e'C4#E}(gu?%M>tcјzu)#c'׭sGt ~w3lH4/wJa␷}{o=kz1B.y#cP؟~?=4P{0a #fg=>0cw Sus}'/xҧ?Z~>w,Կ;7~kOOPܡ=]I1 g|_ag]YS4ܭC ^nAED,9B؁ ePM1>_9ӵ )`8i9 Z2@I!VF!Z!^!f^a!Zzvj!faaa!aa!>" b$aR"#Ba""v"nv"((b"Z0!%&b#* *&+"(N")b"#Z"/Jb+/V".0-")$a.>3VbB c8m#7~8rc87~c9N¨978ޣ7~8c:c>$::Z>#A dB#CC.$:#dCc9D"B6dA$Gc=2:# D&$N@dNBZNe[K#?6%EeLB& C&&`_fa&` a.&a*a&f`cFfc摸c%Z;~ڧ=Nfaff&hrZjff<&&g&lr&fgΦffs 't='t&zof{f'jfo&xLDT9BX&Škvk^jЖNjB+.iÖ>j&-26*֞*~~Ė)؎N,j-.*RzJlB,"m-Jdeը:%^՝յA]A] JnDFlV+Bllߺ.n٪>>lrJnӊmض*VV-mƺkŪnNlj_:o.N*ln|lrK6v bۅ.D/SfQr.k-:vo..:o"0>nzoOpR-V0vppв.c.ގmr~_0 /Ki ɫr 1e AV]1:~ U1[qn.ޮ0p2/spnp7p0J-p&ﴂ-01 qfm.!1%/$Gr& ?rR+&+^z' Fg,`*3;0{ *j &/ "[w?opJW2 1-0;26_s ;W36'2jrGs3&s9iG9f0F.QO@w1,/qޅn W#<30C!3"gF{2s23Bs6"4On3Gorb/_DKt7? s6Æj4"lAI,4M94A2` P0dzNgֳ5;'2M61tO34ʵ^LWNsG2RP&s4u`7v0N4Q[iSǪ_Qn@6USqN5ә61@߄R_tQ۴k4]nb3zs 2?mZ[6LvGcj.'3t4E1(gt5 vt8b7BuPuuO3݉d2H؟=E]*[nrBwj8BN4Y+79O7Hs7OO4;wr[6:t32cvvMOrEq675';3G6G03_e_fS=K$.9*A7BKw5qq&4K\_D8qGw[w/suy5/qs[ {4Pu_Ӓ0֮+c/8ww8&fq#kv89nw2ҙS)rb_+sqk[GB7lBL|.#[]5<˵z?vӯ;}-k_ws;?@ۧO@pA>! K#PFM 'eW hsIo_4`&qS͢4 /f}I]>eJRUnd"E3M6V5UWɢݺZm/½V$ڽ[vW| XbuӞ0Ê+vlmgɗ#Xo͟eEB ̓0<1O-AP,DK ?XS=:t)8.P+.Sz'S &r'Vʊ=I/d0KB{2Lԭ:l,6;'lE@3Y\XgDp.tl=U^- Z_;tE`ݶ_Ҫ|+$4Ia2I)nVaM$va8J 4@NcE&yO9Q6aVecfmygֹgkg}磍NzhV覡~Z%azj뭝ֺk:ln3m5$[\ /O\o!\)1\s;4`jI/QO]Yoa]yiwW=xNV}?:ߞ泥z5 g@ _p/@YЁ{`σ LfP%ܟ >; %p "P<,`9Dpl +XCEH*B(B ֩΁%MȨrdq&jQVQE WωNrB*3j)>Kn?<6Or)ttIG8cTDIITH?2'UlDփII*1JS$UHR"iPN-{I\>rm*99̞hVtR0/ygR#5Wj~3Df$)LewW8ANTҜN1KKuҝ&(}'w!79O3Nr^Ӝ!PQSCцʒld;T<@4DN"ȏ`9E(35NLq##մy-)Wwn 6}AST\u)G5_R_":5&߁ʺV@@zUGqiWӜUi]*RJ J`[՛եy^Tr;,+g_ 3FpM!wbzJ֦b`'U=ZaճN]ki߶u.$_YƖxL\6I.  drs\buUr;8$ZIJ~ݡ8q|Bߘ7P~'B2;A)щ_H8Ji}RZa0O& w{Lj{~/ WߡW`7Jh`Gb6q!C A dWg0NL,T2cL&$p g/ru,a9X RNL WX́Gq3f -e(:͍ " ƱOJoZ=0/e$ls#bBk洪;me.a2Ux%?[j5BבQ&=G=[a% EVSSf|;i kGVG^j ]^/w]llՑQ'o6!s}Ho* 7ﮦ;6OgZ[ ǎmp[\7Im|Fmq\{\mynUwY>pVxoq[Gwu }3:ʚ'`pvrWxOvrJ8Atldq{ ӗAI<aaSt_^!AŘ+?`# ISj$FL/hxwyӄyw=Cߝ>&_J>lW~~coXΑ'H }5ϒ;W^O_OyޣO?ЀOT /lHL oIAoJp8R34*NP 0@о!ގiB$( TNNښG'IH ٮ; GH0U&|؎~GD'H*  Kjxb9G WP(t e%)  =*:Pw԰~C;0I qyIЌGz𤮃GwÌ9H* kEVhMsb b!;dq珦;1; p C:ТؐkQHZxtg ˰{GJ ("%) g1kt Twl% nɬ~TXQJ:ZW* pdE<)#h! UJIMbB\+I)r-Uh'!~1pbP*H&p;V)'C#m )c¡t&*!QGPi#RV~ߓ>=?3;Ǔ??@S?I<7(FD 4%`&AFB aS8/td*TCBD'AtB9d>4EA4nF4n(eXT8&EMTDK4C!E!D[TDcTdf4BqTFAHyEYGsTHMHuEmtE4DFtI4JtGKtK5J4KtKKGLtGGL%GTMǔMGJITNCLFOJ4I4FNTPNODduJMI%uQ RR%TQ{tSPI?5SCRGISTJtJISTSUUdtdN/TSz6B%zd{ıT𦌕vGv'J0fpZ'[o[[Uou\;\]\U#_bqd$-1i #)v)J-}I*2*&ݍIY'(zih*PUȍ 6Z~'h% kBwz+ 6}(u܊$(H|-c+ Jb!aB+*O#b;bXcQeQY!UJ5Mn% rzIdh {,6xTdgp iִ^cGkwH6bqwzhQo#VlVb3pm-߶6( dwhSD_Sc'gK%e ;HYp#@Wv`̮h2q !){(m(e VB) )"I!1j %ʩ"Mk:I!_%01Q)r2yx),yv)~82{w)3Hze7twc {E+84ѡ _eW&l#׌TE03 {+Xx]r}:8Ϗ3!)c$؛5|װH,78b]2WZ̗" mݭ|ez8!`|))C5nGtFƇ-6&+㤖^k0/TsvQv6 crd}b pY%l-7!(cHaidU)P"H^p20(< 0)JJ*p%w{l{Q_e)-W׋w+cB+xC8-7qm 9 Qj[-p%Y%Se1y(Nv*pͧHJp93 .m:jw829BID3)"W1'vK)H4Bt-^A~ p "4x5H;"9wu" r`S wa˸ (e3 @- y#萌w ]bb`2:$u aIae 'qMaJ+69c%)\%B:E%]a{[3:z a(N:)'c B/kOnªʰU};Ya`=io[[B½W*v$vT9aYr9$X ^?oB@"n2VWUbMcYmcOҸ )!!tbu/yww:(DMFr+۾k эGk)4ͫhi{ BAKR0c_wYz + yeXew.6bK`MRq[hbᖘ}9_+cKjK&m5M-cn|w 9`#-UW%ar/R!٘7*ٌR'0|M+ּV,a[ҍh*I[!G uPdiXCnsU!1ZS) zdKҼ"R /{|3yr2wA2A_i 11HW!2Y'ځcW!lt {:O~#o/]{0  $Ho}:v LzRҋ%˔% Eqvl2ˠ](4ڸvʴqUȋxV*,i4в*%2x8H Q|A#_IU`@7_SgemTMiDqC^e#S:(T^+ŦammT ݊^ǖ| *jXMc MY[X{rRYo%HqTNɌ\zd`P(WKNZ1%Cׄ&> aox:GQ&&;-"V?=j݉&!tq T[XQ^\e%KX(ItH!ZT40c,H'Eq58kH$Gi۠%"Vk~Fڣb:e&Ah 3T4mc:L}"ZSpӢ%zevڭ=a*- C(@4:f*+ $iD dj|BG_[e\P|-UpaJ2ٖwfн̿[\DЁ90&0x'zF%CB/=I񢾺mhb"W4z$TXw0f\*n_c|VL {p`9xP^g*Zn xNadFTFǩWEܜIWzTm/l8Ȗ>ڑ-Ni f:I)bL0%AѼk!3Fnc dh%U)(aje(_$!RJ"7^ΘhcgMJ0áO&00A,a3JD3)b/1+ԥd%QΖVt}ͱc Pm,T̫@8QB|4(KA&Si'7CQ.\ɐv.(EC20'tPSLXN\d&K(L31J@T}#yC٠~UnmCA[U ns ZlV^c8)H#C 4FŸ0oH(;zsuO#.dLjwKٜOb%gH5.h\WJXܪFݗI{Q6L d&ޚT/?Ih(: 'LB%j(E 3 Z*"3q[ͬebriadR%fiZ&5'\kӆLvh14ݨ[GӇ7hSEZ̚q/q/&᥋G f/B᨜e|1)J͍>=$Td %'}Ji2W'Vg32L1gٶ3BkՃA7"9GCҜԈ`(R͍̰p gс@=ˋa(Å'̉r19ϓr4hR:ٱ~KHOk>v\wBt?| B!oK𐟼/_k|3^/MK4kYe}24  &} b~1 M@7~?C@??Ko/҃>?1o#+;Y0{w{{|w |P||h{҇{{{`Ā0Vxyg)y,y%肑1x3H~7x9'?L'MG{GG{ !H|Η Z8 }ۧR{|77{/*30!g؃g\9w|~jHXs8$m!z(v(Q1 }8u 9ȇ 0yv _%s2PTĠ|{L {M؄w^{a 9@W{ɇ] !111Br(7  ؇ 騍鸎HI؃iI("0 Frx gY61H}"(' ȋO8b 2 ]5yWe)Xs6)izx@ aPF96ˤWYN2昕H2 c^_ו0a<؍Ddwd8XǘЄH}-IP}VX{[ |؁ҷ" }8icEt3`șh8Hi^9f SXxЙ0`)>XFiAC蒺 ɘ[€yY]Gwiɓ7((8vf0kA9XAU͑ ٜzXxRaɍ 5/!w92P)鄸޹|À Oh'뉀bٙiFZ *HȚyH? xr QUZ1N#.~\U1!{$ynGIx~J}ɋ8 \`A0*מX.HؐZɖZ | ecy 5㡥: v@niԇA: ( 9P)ט tцP J ʩ34وڃ9HrT:PjZyHùHHk#EId؉-N8]8 0b%*))e : (5kIJhJ 늆HzwhB#bLFv{ʬ؄޹#Hȋl8g u+zww˩~ۤ|۷wo 1Y%X9 e X0ꑐ:)ɝJxF6>;K;˃uxʤEnp`$ 'Pg 7 }7 s/#ëQۺ;|[zs{u| "Yi22 GָL} /C+s vh< h K+l< ,\l | \",#\)+|-l/ < ($;2 /L3|TLNtW R,LaFL56r)LqnLB,uL8,sb ,,L\ĊLMT\ Ől| XDOƠLOɋ':)2Y ۫ܩkݫg#zl2 8{5iZع+iͲk[l˴8{٘8'BJ||r+,вlΜ\lj| KmwI|ٞpX7$-(*9ڈң 1.ݖ0]j%=7,݉VkgF wԵ2wa Y험`,'~HUwHydi ֡0`9QPd^rן)ࡡsؚ͐Ml׋!ݑ$;ъ n +9wl AMtہ] P4Bw0HKܸ]ܵgmMZ!HM'ql^ۗڶ}\ڭډY8~Q L)s)yr X92ʡ4m?]iNɡ|bIٸ ۤp[cZT L;6:mҥΦtsY趢xζ\}9N'+=ͷ⣨]QΩb!1;zmtzқYmҾ4 .~}t)DÊ#8>n;W/ߪ?J=Y  MjhHH =[^Xܚ<.#{M'k/ (i4N>~Chmq@Rq OTo9^?]/bQ~ZrX!j/&e1h}s{Ffw{7]*[Տ虶lhdM{<]˲,z8-*cY 謲kkzY|ߑތ =<_ᄫf'v۸7»qg;t޿s OK+;/+ L& NfaC% (!BIh&&FiЄ8cI OJ-c$GKޔR$L)rFxdLF2NZUU5OٴQTM(ʘ!FJP$J*EM'2.R245|$=93N3:=lO?[1P%4Cd};Rm7Hr-DpBC4PDbaT8* O5uQ}Uh~ZEYc5y][_c5bcuY$fO \Eg}UZ_Ckv\o6umw`筶 #RG-A!s`6 S4>-H07Δx4,3a/ p|fU p5f-.>Y.N q}@8CdmMԘYvQw؆ιhjɡd]CߜFZiYWǭnقXN/;'7 DUP3$YT AA7̓]dWPWvtqrWG#W}qig'e3}yƨq#6eg!>jKh7sa ^SxcݴJ%!رVxehXWP Y^YQK/6k/cDn&'.vtXQEQjMH9ds+\g ]IBaN(T U B܍uel֨'-J;7 <|xfp"qe`x`+w#4}QWHZ.H-a`}kb30AMSӘ4-Ag˜*V=:2(1XI1Vr)(Q8 ⅛M#+irPwb)H銗̇`)\ (FC)$JHMQJ$ TGMN93S[bSNShCyӜܧ;թFs$>fCsLZJ?ȕeD$$O 6I#&!4a/`WҒTHK_.k#BM,&t= |ʂ2݉Ѧ`DED1s[TkT*&:>ǚzV7-u'f&c}t'7NnxI%i6oZL_hn|nIT Jl&.8[JVNrg8_(|PjHJ)69wR9t&ƴIݻ`aIGzޒss-=Z&y@ 3ûi M-L'ˉsvjh՝6+?&aH鼥R$ hb9$ Jv"ɞ.d713h}Wq^onyJ 6tЯ%vxƺql5sm:Mп)CU9ù-JոQOC>a9yz; ~z#S@@jI'`?ޡ,V2 T@s@z+Ӈ·!,Øٛ4jc)#-`IW )"ۇE8EAx"ВB¯BSڡd:BXZ-0B;*a .< I;[?"ùC.X 8|bDGd<' 5}2,&;a- Ez)R"Š*Nt @I J"E_zhcIZs$Aet قL+yaHSBzTlltBX=: Ao8tD%zJu[GqkiD1xĤvx@ucˡ{&;D@LĹ.e8R,ZHO P@I읖Lɒܿd"n4,|bG42{I:H3.&&YI^.A$8;)Y$=D蘏ܑsJ"C,#D?ja˰bsyG?$2H<{2 n"E*FkLC?c|Kq; D͓:&=_Il"ȂJC'-G ~Xku erՔ 'JN+iJLy}WvMlv eņϋVCI8AцPQk-Q!3Ql36kSVXfV%歵J8#.#51mRH1C'n.2kԳhSދ8 @ ]? UTn0Sp7nƵXc7QMoD ho\{ovE-c3S1co9=Y5FSpY >Sroi hh+o: SՒдR 1q ppLؠjTq؎VQf/o@fz=ȸ.Ï3!7pU!nNsEapPP=(wWȆmq^f ۯʟK0a=uX9/k,rU:h084rL#t?K>i'rY!n^i,IϻJa3<ͧMt~tnQ4 whNg\fg4V\l E?+O1߳Ʈ;Y+ImLfByYxQ^y/ex@@'T.qZ7s1P3&[a[J4XP[b ѩ$U_=Gt^w#&`' zv2<&NzrvZ8*i7XfGi+՝ qd(_2!$b hfyGܾy a)^ 7`gj[6bKFUWų?틣6Kרc7oi|!@RsZ.bD."X Gui~d~Lɤ~Dv~{L|SzϡNk|qLgP3 1eÔi2X*|xdi(ZBׅ#Ȓ&OLr%˓2P}is'O/X䮜="e3Sb@ ')ժ ʤyr^bxJ#Ǧ_3}#Yr2T._t75 ɾ|'A>5ibhRs2c1LhȤ,#Pv4ңEs^8 ۜǥah@ <ߖŋ<<Ǎw}bG7$uout]?{;ʞfRjI`5^Q>7D61$o#DPf".PI m (ч$ol ݉=1 TL9S:$K)"QJSLT$TeӖUfeG(dq-2\T uv2FdtB%SQE1PBQjN D BY )E6j1Yѩ_jJkTzQq@҅V$Ed:"Cі8)iM[lzXjX)16TjˮO RKJ,O4UVajF&i(sivY%lo4eq \q»Y|+lJ %,rLo o"`[eE  =0ѻm4>CMB thLY!^_vc6kݵ^Kp5vg]q㍆t}n5\ߌݎk]8ݐW~g _w銫.w#1FcֲON;ضg{׺_{qg˽zシ3y?S.Îy7}rg>zO>7~-C1Rà,35 dɄO23v=P]DU^]PWxeEX$K(\#CBD (S/4HA2%ÆE,ZDL,^AXDdIU,j_~!`Φ # B*G})9 SR @nCӴ3kUY1Vy|[GUO zl&B Jg&D>EpF0H2 FF ١@CH1<x)*(OTisѬP)J;e+S^H9%vy']LMT.rUz 2Tdȵ)Sqf8gEAiIygMa'?52ird S*S0LGCՒ $l)ΕU! WFԩ\e`Ju+|ڊ'7Kk$qM)B3 ,(1#FM |VmiQэI`IQU@4I0>$F^JIiLC$[x$>t;PkG}fZ>X:d,tŞBxݣ @MnLa ~L'ޙec XY6 tM{ckK Y4b>{y0nt,E+\6Jnvw<Cygނ9eo?kO+֪f3 ( u$!dl2l*Ir2\ R Y8DpL|r&uM$*MVs0 9p LSϥtJá"zf[gp~7ZquP)ՃOl]dqwĹ _c2TB5$1s0yhq=DL9N}!zļ} Լ9_2ϫ,"Fï:<`)Z0="SXƤF1},b+61fu& a=ˆ_wF$fAue Acؿò0eڗ}4}i=>w:?{K?)zWn0و`~M* z #\O hOx ` _ t` M8 r ` ݠ_` n hpa6 ea]]a Iߝ@ Q&)Z ba-1˰!E*™P9)mp( )|=V0!M]!a,KMW`5ܿQa& U%CɊЈ0R%=5Ӛ=#I4S+]4:5]6b.͚76.H7IF,oYPH007z4,U]'咮%AiXe+'vUuHڇЩ ct'G|psg~d}xJ=`hѨAS(6gpA. S]9yɕGXfa|hu('GYwpS}fGA(Q%ȗg[J< @4X&G6I3ٌJItP`aN"z-c"@DpzwȲW+&6#meTi( Tup&JYEEueHYT-i~cEP}ȗ*" cAFea(i(A$P)!/ |VAÎ0G FÎu8 @ +u z`ԱHT5 eGBk[G z "YʨcU かJRB0*y9%C>UGHy7J0ƓPܜF݇\ɒѵhW^fF_rqRyU׶|* i)jV++6JI%#lE$FPʦȣ4ftBx0ސ>^X!$׺غ]ޝ%KՁL}t1LLzL-mі # .~ኌ_" " X 5M`m`e(x_O`X @ F®꾮״~.܈ Lh f($(oؤNN.Xf/d/0a4oV/r .z@iOoذn.ή.֌J;pC0$bo/ƍ4ow>/D/لp޼{0.ojp.`0. _o0`oz>IL ۰ЃDdg>C[V1g.:Ke1=<Kcq=>g1p1p׃;HqqY񃬱e3K k22!"b5q[Grϱ +H$2.J2Hء"?$gqFb $ e''rY.r-r/20/g+K[K12$_ 3O2Ks4!43P%sq4W27"wr# 2"92*_s9"?!?s!糾33Gs@s%r05r2//3C,CsCG4G;+Ka3"@2I4P?,(3))G3=qbe)'W@rO?S1JrP totGgZ]}2l33q1+ʟ,k5V1W/CbWu=2ub(V+WZZ1V4/+/C1KuUSr__u`u%C`5=T%5,_2ԱTcu^_Secvbhv^Y5]5YWW[u]3v46cGs1Bu.mrm_lw6c6d+>G2ЙTw$Ӄ+7Y;q?G7sS7t1c+u\Cf3vY v_#ayazw{'6wG6e+7h=86Yn20vcvɁpwrW5ymqnߵc1o_8mk8c8__wcuq++]kusk7w3x^緁vuϷqOr2u^q'vb$t#++Zǵs˲RK&l5LvD1}S2dO7jK[6 7VǷepO1Zowk5v 8l6yyxeS8YbиqY98#wq9ϹtK7yO: 8ey7xuhy]Vy5V{8Cpoۺ :e:_;y':7;K_Srcr]_uT8v;e˹kzyq#wϵq#c+]K;hϸt{v\e9V{`_g\_9Z3q+k61B'-7r->1΀&,9ö;+<5k;Wu~:usۺG=:#=WxZ84+y#8r=]= 7_}Ӌ~/#|w+k~=5#y۾+7۾ ? xܓC\/?>=s>>kix'=_: k~+'?_'S6X[=}=e҃Fp@e)XOY4zˠAԷbe$rm}14YO_}ۧF Mj\LFM Pjn^\Y(GZQ"Fe$&lӉOAaէv OV6Y zZq-V uXN^lXZ)ٸöEש3s/Xu+ڥ 7G: ef5rӐW/ X`~,D?]/krE̱u#;c¢*n YTȲOayWmz֑ML/"!3LԼ?xkj>B #OȤ*}Z21jridR#HRi}02i!t#ʹ ,$m9ՈϹOJ&|2Ȧܒ.2Hlr2ͼrK0\M$TM̄,3*+<)ܔI@̳"CM2\rKAttC)JJ~)%2i#&q fZŜfJc$飔Qix.2%ihXe5cU6fdֹc,ZjZbh\nV\oõ[tv]$-\au[lוvyuVpw_m]Y vڄfx{Xa{m5>wc|NcC6ceu.c}h[ggW6q!1%nDxYIҠ[ug%/0 &ੑA^kbZkN^lF[6m[nk[ܪ:l\;Ϧ?﫳['+W{ >M'o!G鞽AO`VCNʣV_]ojG]"dM>L5Ʉ??{WF~#'ڧ>e~;_/};}K7"P _B ~K W? ~}hhAP!3Crsa&lq}H 3!AiHA:~"D_TAHe) &8!q"d#8B!`IBQG1Cd!x4氌Tb?/*|a ? ^D x8r#8rɞI*bi4YҠEQK:tb =" >g>є4 ITf6MnNӛ8Yn35Nqzӝf:Oyg}3@9P U(5ػ0EfKP["z3'iQ1Knh.^6'4HhK'I6)NeJ+ҔVv+PjʲS+[V21Ukb K+e -ZڟZvU*i]ZYRv,ng[[ݶ֩joZƖUqת[dkn{nsKlV*g=cU, hpt" 961A{䗿[`8l`6&Kx` oW'>Qb$i S60{bscs8:qc&xEfc\ecX cؿSU|_?9+/L%Ko38.Vg!Gyq>2 a1Tڑ. D%M0͋ޤ[f-ըI]jSթVYjU%HMd]kZ:ָvwk]zE}=jav/\[bGǦaiZک}jr۫vMjt#wM0oxaȯ d68DEGL_MWFfҜb/ *28^eD 8qw(WOr'/ygbYF(e7ωt9CAP|{P:(N Plb{Hׄ26uMlꚸN Mb`?֗Pu&xwwz1}N?;ґ]z{w~ƒ󗿼^xūcػ>zӃ^}Y~]o}OzۛE{~= WW>|7ڝ?/q;K#/~C^@~s;i˟'aaہ0 !f-@EGzFhib$2bWlD痄&F(xFfp"`2@ @n |0" zG--; p ypL/ojn舮nN/Ґ԰| ѐPPp 0 np Nx.N.((瞮>JM_0.1N21p|螎oOߎ)nА ɐ<.1/ opNB< A #cp# ;6"a R"#")r!#r8.b@ ~AZ:%fB0ULƫ&'B(X৾l$ E w:dNX(^( Pq p+qn/ʯ֯,'֒ Ron r .+31O/nOyH֮.2묮<O3's:Q.0l aSN213.37q0d12S1/2i11s.P);*r)M( 3!ݳ!=r,'7 XB%1*f&Tb\nB&m$DDzX'2A)2"Q^ "PPr*? KpDG.P*~)t洰p NIٲP=ݒ新I:qw, t- o0N483C/7sN2[5/1t3nM/s鎳olmQKN\1OhsGSW0}NK-1BAQ˰ODp<}R(mTG*=rY0#sp@aĠZӠ>=?p2${ECrFAbTxɗ`%``'`$d(lTXSt#<`m(>vєIBvW"a+(wtn*Vd 5X0dmFGRfsNQXQ<= )  5We;K56:3X/Q/_UoRNN/oRI5N7״OU36N3VRYG5P%CK66s69/mdS5vD;e.2S\VW4E-!qtOdsYyzA΁A Ρpwpvءaa ` =͛e&;]od^'_CT&w#x`em#(xEB )c?bYFuC~/bєI`bT;6XS1LSq\hᎸnïluozNT)1S;0kqp O:vPӏplգq 7paQ/QvPS8/{ ﯍o9.oc=v} *K#dv`zZŵ:Mw F ]sdgr&(GgxfZe'h%%BTti{qC}$!׷nfʀ ֠ @˳rDGAVyW'by~a\p/b(#z$Aáӷ*"c" Gr*KX} @ -A ``%<)  ѐU2q=RXXZ2j04Z3{6𒽢yX0UKP:P5zޝso[uP?KRg]VlV-t@Bajak/1Z "3_'~{AxZ 4TN#`#jfjj Õa~ `v t H;A6a5fi$0bV Ba% `<\Mj>5G6~S)t'~* } s4aBa"-_\Wڂ "neӓP1L01w=Da5QIQAaqTKTGO8Vkn{_nסv玓=6q5K܃ѿ}ScYS;5r/q a -J2h FxJBLYP-:Ԉ!E FOEB^-BU-0_Zc2p03W So bĠ4)ӰOĔYTVZ=}ыv5=^ݗf>5jnhRcm1@FXa:Te4eh DMM: 0¢Ź, ^\3hVrMf%TDYvy+折#[ vtcq)x:񌚍FKV%0ԡQ8m[;/f^u NU,ML_B ߁.I X 2h`h߂f 1j Ĝxb j&㌠Jˈ!(ߏ9c7jXɘ,b+VȡX*V! N c !BXcSJy#X`r %D BHN5RAMe>_urFtCѨ0JȔLj-@Eb(2b0L.L>(5ISE2[%UpY7=$f&eEVp\Fi%VaYe_2F j>Lw !0 ^4 !f0D@<(6A &[! nD\M-U Ӟ2&c$$''3ʈ60}D 32JB.k2T q@4@ pX12G\C Z_8x~S7)gr) rxd<8␚G^9QheYMwj顊i֮Gn)rsjfXBbxQ{'[~ }S(BTPty:ҦBD\I,jK*"PE8X+XO%CI)ı d4_X}#[p1 @.xC=2­%YLL >|h9`D,k ͜;ܣ,Fl5T| -P~mF~nYg kB1,7@(1yf8~Hv,I<Ӵ8mʨ2Aj!BX'5S{M >b#@": ?#PA8!]?t6' @^Ɣq)Cv2*diuCT"UnG9̥iOJR;-nH{Y!YID9 ah맀C:+?H'6.С)G Ru, Y ~1Hu`*%F@t8HXS43"tS[EWHJ0 /bI2e]%+[`E $*h^25 4!'|"nTQ<~c  vҴ Ɩ0LYbV4/ELi1,6(Cn"XjQKG*ː`֐6iTY*"Idn[{AY72v#J ܚP J|71HqMv ĻI 0DiEvRM_9%PfET,Oya &Ed)Kr[S[0b(! auDBX+d1 Z2/|+.sy^nEfR&!I`f!'bO anVƠĬGkx}C6ЈeQ2٠Db!ǫ(ktb9FjM$HhqE 6bn's{1TNXAa Vٸ]ըXknY:SѰzƄ,M}S'&zOww)w˥BwRvLe A0u"c $ I_n([0e*3kp@fT,J=UUm][jWAhBDce V`1N a0LЁڪYr!j؇0N>[$֦ϰz;YF7\ihZ4c<Ɗhq6Gl'A'7jqY|a1RӨ5,e.0#R'KCYHz~so.LU S*LC^q 99$SsA<$RqtDMR; W=)= K@;%g;Jxbs2'u FH&FxL#=Q(S c)s>t@fHSRCfcu7 kvbvih_0 a A$TTfEAQ*4_rcBX -sQw@RA VTbC / ,ɠ-A4B*09]M4GPXWG!12HGkH2Tj 4IXs5V34 ҦlwPen4lf W0\XZaX(ʐI6]c0w0]}4Kط u T 4to7{=!GXOqq*b#4#p~$&cq FrN9$&;L2;:9` ɂcx#KrqNTP~L=obqI&P>{tc?)Q"U!O'R0 0 iʠЖktx)@ C2fbLf̢pTqFXUxvYuA,YU{CVyOB-UaEQtja1gE1j[X)Z4?ls[[fO)J37 ǥQC)>>Ĝ 12i)>68o{2x !K<>")&`cPC#& ^+`#b?Q#`9B[10K11L*QKQSڤ[0WɇeF,PC~V{Q.3d`!xgY-)-oBϢ,|!ZB Ac.L7uRj1aqHC[$)|Q$)'ZhUT3^WIuQQ'/5vKsSIo]4 8 K( Gs֑qp^:CҒ!yqd`Äj#c[";ws."G<+=[ONaRdTWdyA7 cҏ1t:b(3iLTe(##+`>bys58C9u$暺d`: j#)xrr q&?'&#u s2r̺α?ffku(  TTeAD}Tj BhB2 %Xv V84VAek>)٩ٜ5(diLz8h>*Ѿ}K7=SQ(|R=˰7Do7ԫZŸ"9pk9.b9\1)#_ G#8(;C0'mbrS<uQۜjRBv)n])Ha0E5*j$t7$Uieqb[.oVYTpV\(eʘʝZYr춌͞Z@,*Әcr5t0 QDÒb:|=yÕ)쳽L(ޅ^Q\(C碇K RG9;`:Mˁc90` >FbfB%\ YAwi Ăwi_xwfKtfUwCe4ĦRB )ycaR tӁƩʢ!Iϻ*D Qu'Y44>J=8:m(T̏K$W<$-rzMaǝ;#(M'"p[<'=H$$k!ۓwSҧ=aB(rp58a%f+;G=o#CV({7;զCﳱ)?h@A~X,fwmjEWq{A-Ur"-axyj|RTt>ٿW?̣='iK(WB"ݹ$;qfaD>(Cn K}2/7ZL )==`OI"s_#z"1$ _ߺy:⺒ Cu:z_a(Wq.6=fa|r_r_eqJ9rLTt2UeʞY9\E֝=/$,hˁїS,^sBg?kbR1hF;yr>@<<`Ͷ,!-|ámM="OD_L1BPB9\九8UQ87'ŢE"%$%Y_{#ׄ$: J'O",ɑ4()۵$w 09qz;&75'ͼTFtAW|[|7ձLD~;,,0ƮfcA(-Ve-iNƮdRcCAA*Dˆq«dsϺ ӁM%F`DݏK pK' Hls`:E#^wq# $(r}&Lׄ1?Px!%aPѴe8$^ezC/(9=I9to-Բeʖ22h60hNp!E X0ȏM Ң}ĈA#)ӤL)é}-װ'/;}jд)4NcR3I*OgepӔ)?M/n<6lQzw^}F[`{+׫ܹt)eHh\hp+F bXp-2̬ [c٥lhZ(HzIcHe[ .}QcFZNzo!?nH&V>Zu7=Js# ~g3K5 nAjP<<ՌrK?~b;[C*,ï*+6",̣ 5ڋȹB,)j02E"}bi2!fen'ƚ'#(A5ܧ4T#4 3 TK<)DeE4QI!ILPO)UT1(}ї8QXR355UOUUR?EVPIW|N4VWC cZC gUVXC]uX[Og{G-V`Ydw%\f%WX%Wu_mw]dwU}{n5YIELǀSRr:s,+R)s)^ Ic+RLѪբ18xy*g_ƣn0ljj~iZ碿ņl^;fl踃m޺mZk8*p}f;*hk7mG\17n^sF]ۙ'2&&A+eJ0xBjԀM8턃7 3Y^~yr"F-Iˡ}@<e1/c'Xy}ߞ7yly;Nӿ~Ӟ13~㷿=p,A(bG&i?'Ѕ,y}eyE! U0cNz7u/?K4Yv%~=tbX*~E gE0daoMܟXɑL&<Y6B3v0cs|?!/|4N ~0 `>F an%@qIԒaOp$I)PTB=7iePt`RhlvI/K'Ŧ{1%_%ȼ y,KH"-’J\#Ap(CR5iwўN ?cY6P -se2$E{dֹiv$P.z_O^SHrޓDzӜ ; ;szMm8#sş3XSXPTwdIzӞVNNULjJ[l:A]bjőkll ]]"zQo;c;46ssۗv1umNL WY7hcWw{T4ozdZ_խ kZ߱kq/a͞lۧkX}M [+wr˺v(rd*nD\Nf%ieS[>Z'#ܒw({p-BjΤͲ婂3i*snI'Ѹ }k2Ыo"j۪BӇ^&{)?25R*K1ғbC"5X7(m " KҦ%Y1z1B2+r@5Z)=:X;2*=B*'%.4@-2%80@:S bЄ?"";3˞4A0 P@-FX-,Á;,Yz/r(A{ž9d<#Z"9A j6c7z E1(,s.:-ffmFfor>@p~b(Oyofe`fz^chgOCfek6&6tF.hzgFP6cu^gefgjkf.ffhng.gfgwPfv&gg>琾}Nfsx6gr~bvfgM|Pjinxhy^giz盆gVgif^x͐hP8yVVj>hPzfk8kgilo硞i HAq5udr@H8I*&Aژ؇v3+x@g؂݇EZY`ORE@]PѮ{$e2?Ch ~ Hw^'|?<'|2V) k1Ú+b.\Ĥo/a#dz)C8z#ԝ&a% zPNK<2%uu0hp up[yI)o-1H#ϧԱ)u"p 90H/ʱ&y`I2=yP6 N }QM.q E]a_NYbX^Ex-?S^@^yXZZđYG-.Gz2EeF9L{:\k*1f k/C+-`;=z@?]aot1V- @<9Fm\SF6jM v=@pRul?]!êKسI*λ=q %̅54$g&]o4qu Az4GC?$ԇTӊI0& lWޓIS!Mn:-SxRTE}Ovx@?݂n?e_Zz8`vDgF!؉ K-t. ,7So =&S㾖%-&h-]㲁 Ze3 Ah˔#M&d&(L=TK1Q aiL(jLMi2*C0(%-Rm2JU&!%)cP(xT& 1XEij(<d6H=&3 +URb@ X^vXY%֕ C(?vш Kt8V-Q{רyj]ќTi6|GUe)tjrf.[ޯaۑV dےh܄u hՕH,5)%ikTSJ>>%l=7饗5ÝWױsyN :.PLkW{ynhRqbM 1aU;"LCQ{Vl≟ 3 1C)|L l+񺫭vjQ L Jy4cA dҖpXe72OSFrҍH$OtdŇ[LZˈ[zn :bV %ur$n&eq+].&A Hˆ˂ZRt bqιwajKbON&L&bd,Q$3j~-MMqiF`26z%~`aσ.mЊP}hH SXdÔ[y#"F2l,y8pRT&".CKrC;s2\#70PvIkc!J!@j>aBJzn "Jb$ NaቤH ""v ZF`*!aR! !r ' ,b# !!""&)aNƠ-*4B'")ޠ Z+n a!bfb"& !8b$rʢ!'n$#" !`ҢI}>\x (uUX+ !h̋$L F>Տ7^HR xɚۜOHXS8I4YEJZM&cDQ$MZDl$@MDHNE T6V IURQRNv%PSGZfP 9E%Z|LJe_\%]HMȊe\HM&eey[0Pf%SYUJ&_LQ+Ÿ0 WXQbU̖OPp(W `mĹʞ YaxFQzQt(D@TK\Io`͘n(H ވ[<nHJvD(<9)J@$]HhļKm\|V܀N ǡV賐W<^^_ЍCT AV e $!TRPcH8DPdՑ0&R~ {KżҀHOm(0Mq iFeXʄU`qp^e IF^ g^m+9jX܇VPڗNb]W؛蚮4v $b9JLeaxM 5Ƣ(BPbNKYDOߔkML Ť&MY= EJC(@_8x$*\¤Wq{ *"1>x C'#ChN-V^-fnrY1 [H9^t z+rʴR_{uUqd,ܸ M myۡ},k 4,1z_uGس,JH_ hLCEّ.@Tg\DGHѥ`уup'* j)5̇ ͬǪ* HRHg(J څDH8X6O/'ίhk4W Ю8vE-îkq SxЩhmii,S uM-v) #q+ w }SZ.-ơȠBޭI%InjIψ˻i%SUT݉glTTUL -_BF1ţLMhB/1mPsHWJ)%[Jǫ >so sT xYiYUgγ{ngT >*ic,qߑ`S]+Q?ieVlwLE1fm$-) J-yYy'/%ߪ&(R IT&<,i7\4L]EfE Ky1o *=GhQDFEѻl#5R8uT3ŽYۖ . e~Jx-Q3_J9 Q 0)k\DhIi.جsSڍr6{0ye\p*.Fv\t(jz.dUڡ<7IJCDtr/wf6j#lq`tԬŨH& K`փÈ&ܪ R@VLqyMr߱٦LLbM$IRb!릊n_r1#X ߉Y[\4 *wx4ŅbԿi0(fKs72]z9+aYs,)0Y17|rXr0D`I$B'!gl|LEQdݴnZqID ')( n%1(BHE$] 7̓ En#I$ӱ:i] jE۾^mX1;v,ڂ M "5{^]JiMԒ4+xcn IK\r:x i.=3f]7ۇ3Ial>|BDB1D4~;Zmk Ov!bkO2$BODhB>lA/@p[,(Kc@"āC]@\P 7pۆY\+9Юl Zk<SEbk:#ԧCZdЎ₎K/Qt3#pQ nq ]խԚܲ<+9ϖBVJփnyPɰDJ!dATm h?/fL@xF){݁h /R^'( {t³A =$A{ Ȁ)D;;|4ÇBAID )8?OPjĉ ;Xϫ]4̀nCƆ? ^Ɠ$7* ͧ08 Hyɔ7m8x-@,ۧ} FOپz : z 6,^>$cENzԧgË$Y:4HQ`Nj=HRg>W^̉>JbbS):qaĠV4Zц )rlY5-ܨfՆ39sП7jҷ(GćTg'ԼqP.׏}CX>aq9Ed[cW$to]P0Sk.v +-:*Ԋ- ,‰BdP"\*,$Ȩ*'2IC4FJ,|)|)!X|-%'hrKJj\Q'DI/2˨BkDp3ɱ>b1'K+tdd:LVW\(* KMbTg 8.b$y0-BQF.sP;"PzA'.fx$.@GeBD:Qz^J%t 0Nl颇:[ Q %AM,LNZR- KLsH71Ϟ\D'k:9F2R)3\(g($?b>"u5lwP>Q+m)>鈞S1/-LH+g3"sSZѪnT'?ff; NJY,(X^(&D.z%!C,8ۇ1҈l2b,[FzIN+N5xcM,-1x>}ZRd*pJp=B}sNEUuZ5dG; LBsd-@p^ qΤlcA0,K4JR6VL Y4%qɪF274ȄzGxF$m/oAUO'̡]jo# "(E|\Q B7*7\FH)]&!ȠưQ/RD{"%&xYK28i,S%ҥ,Gy_8>&$LBbQic*ɒU≩#Ro +LBLf֗mWj0ְ[j" $ ]&ZӪ2#E$QҀ7i "1>Q1$Fh-!@짝Th,9$^MN)ۘfOh<['2qO~ #2I@ds}QPdD깍Jpc\UThQ  ㈳J*eRRH7**kǖ)Q(m[SiS`&=If>DFq`b$+ i TUn.AYvA8E2uhEiJ>h%6q"LFZ:̠,x-8UR$QF'ًTF(#g5Vg/Ŋ Ѹ,WI7œRCTWv YH JRD2YV+ֳdaQKED"nWi$³tñDgnByG5M*M+]s㖳VXkz""ԔZನiJC)ؓp̆cĉ]A4V>1` '-$Ta<uⰏH0ACf/w1'_`qP$dDl$5H {5{OVT4e{.Kt"V&{$_S- E RR1(ښR(M "\`KrH\"(s;MNȲVtLrSp 6+FEL_ 1&Q<wUdleEVoIe5<8ϖK:͍$Ժ;a]s䬔 AfUIcH0"t tlOƩEdO.I;PBJ8B#ᡨu#Vo'LOQPhq"Kq#s,Y N؋#8TՐݜԊ!5>F~u($n72"ѧN*1ۯ3wI!PNSIHKr% *)yLΞXJY2J-l{e̒B a4LN4!` \(͛zhLGtc`t&J*nGf2vDlfdVGJTlLbCh3@lJfV vh&ÄALƋ&쌺pIDZ0'" Hm &>c*ǡL(L|&jl*`Be.ʏ.Dj<6OpHvFkŽVF,Nh G FZJu`U \|.c!,1Tti5Zc2$` {e&a7zC/Cad ~&(ObD_Zj&ng^ls&* LƳj'|ʪf2B, bRuDn“) Kڈot0)o愑fTX6ƄLQf'ď.nd & AH m,$R k o$ Ot听1O-&iO:)b!3*FhtD0ReL60Vd%4a͞dHgsiLE2*6PU`Kj~4/30s0 0 00A>GL 5qD(su~2gADċDSgpK /,3$B'wrhFj>L2Dt6Z o+,J (b$QטojFO`ؐ7qΐ# oɀLbCk2 Bpf nypy X>xl4W`*8d>l\CQBG4 %NtHDQTEGE_E_s8LN4)jNj2ǑR yr-hrkx7S8?'=pA y/S/EoUgQntetsުIS! 2'p:#zlDlP0g IgHN o%'pj4u>F8 nBYҌ`2P MXn -K2I.]<.c3GtUW6GYFMTYEܢ+'4Zм1CLNKӊS('*<.q]]Ol3oT p0CIBN*/3!1B>܍tr? CX KsjD7HTŒ K 'dj+|PlR.Z*tD^SR|LG83]͂'qpToLj'?p$S> sFBlVj>@l(;,PҲZ3/QYpcVU0!PxʮOwrث3- ZMBHH7uM(o:\jc,iWHČ&6bߍWdpDRPi @92H-p.uLtNͧH"RNFg* =.jNu3PWH"pd'ާ#4>ˈLh,b"rq ZnwРw|gPvIfD@ϲy%ӇaF26Qx(Z&DBWrxhӅ-:&^O6hm+)XF`Ư $Q7)h!w1$t:lc0)z)qnBj, kZ.EW\rMn\X o>,ۂ8L)ujiF;]%2S6"tҸ9Uv.Q1~9,U&U]iLnsV˲V̴XCz,+jk)2a.X `q,{HmG6(䐋 ?I>/ E}>oO0r)"f0*GY2h|b WegtBX&JT3;KHt9 LBnp*i@>F ¸$Gȭs 'BH񮙡Z2Nt?Jaz4Pt-ː12"64Usptq}fT\22aB11PU^7BM"$fb?(FokL)kb=JZP;uu;R] ni1esRc蒤lnFk@$NM=29y>3,\%zsY*rJV!zJ{pKp |9QY3!u膆 7ؠd|cmQ:XV^}1JToduҦ!Lfc|<&)/muE/]df;on(G IUv{Z&=ñ34:Uڰ!e$*i-^\x 5-5F5l$xI)R@F ׸ hFI1i:= ]*{v rDq[e)4a!n(/6 yx[K@ IE 9AU4 6nC2B8?s[˃0(DwX5Obr:SQsśiZd RJbopSv0(S93gI^4F܆ q=_\ ̟;GH*'kS/zZ}Scs:.S rk WBsDۄs<{:yąFZ3*x[l Z+}llW ,~{ʾY {Z(VxA(U6NLfpdI&YnTae?]iu?iYe]?_g?w?%!U??_?}"MI $X6TÉ ۧ)eۇcGecf`a){IGzEqeKQ~FMg=h:ٔI%1P2eBc_e7&NkF}WEҭU=igSuʓ:eCL3(ʜ'{\ʞGMzh$Uo6yحiVi˓Gۿq{6n3ֵy8̧Vܹչog٬w~Gc4'9pϧ\zsEv-vY'2 w]g%GTEfUTMUYʌ(M2WT4UTSjPDISam2dB "A G84W4l s\bW1_%_6]`5SP%XN44}xZlX`hy&yG=HGٓajN~89&کGwqkUXYh]rWbXjE=eSNkv7jXJhygOT{q Ji}䑳Q:=,뫱֮z$dvץ¥Q:|PMm2ӸVLSfb118"H4&$I+BcLORVUdSPjʐDN"ts)2JrH6itc\]kWvn^9OnLVr ٧3W=ʚ֫L|lt.V-\^bMtc]RIסs׎7.܃LU%1젋+OHrNg=08);׉`G_6|Ҋ,]žSeM`IF7)os;H'& */Qj.xȖǧG`&V12h#M%/Qֆǽ(IvdT9#%*JZT(/f5F昺  +- taH.8N`aS_'=Gjюr uu]Nj2.1acפP=VvۣB̩dtVG^MnJ"Dz(Pr{]1qK{ %Y6jW;A.b{gHR.‘^1 ֑wq[T13ctEtp{nPL rܬ8 Ɋ|4h%(ZL;ݕi0RQ~ ic2$%_ z5CT%|0f<}tp ܨIa#:$BaʑnaD 9’$Q@6eC LAqR[4gªʆT 4^gbiޫZIK29:2d%#c# yzWW9UէX-v$M,WH2} YD)qb$Iʋ~.T*V*ӝԛNҐ Y*Y"1L1Q6qS&)MlWʒYp":˩/s˨<"QmD2G(kj]|\6Wu\~7?iXH+< S- ^u4M`uUU+{28̬괐"01Tn嵈MQ/]brC7X{'f24r(9 JEU]iJO؋+yo 1UTX(H/cW*#{FǯZ<-dW;iVOܩA nթ$\fQyj1&Ja[~/UmhXufeg4`c"4wAY֯&Ī7'DO$VQ0Dh-ʍ+cAYJSZ5!ꉰ>bVI LE1zݰZġP)(E!/A2pVȘ}K *-<.BG >]jҽ*@NvD_$BꎏgL]ġs` Eġ0AҶ#=z o۝4Ь& la}j&ZjQvŗ1|&4smGųTW:*J: Q1ZmU>?a6R4zÏָp+~N>'[?C5Eb y%qi43 RwTG`v$@sjC7f}@UrN*T=x&o ywz߇Jcx5`~ CfM(2tSfomDD;WmD8~p2TU{Q [u;HM"ÀvtqvD0vsqv, p`G@e)#]21|6|qq.')bV6 wcERmH%VEUm#MF_]d>I~L*59bNp6a]`VHZG ,w% y9"` ЗE&5jV ggAzTq%k zwAh&0x8Pg<*{B-p6+@v<1W` Y 3{ `EXFPR60+W  9>r]Dm4xw|XKĄ:$IE@kZ;Y7~Ea-WtSMZӇJobDJ %$|T ~*R&TvNFGw18x7Puz)us(.D@eX&}e?USXY"^"%\QrbПȁuV6Q 1 u {Ѡz:ے1 { Gچ4x)0`V[< ]Ww&P0e`aO;pUKew`yxjy <{Q(B,;Z Ȁvpv;l Z=Cd"zZ.cP99xV@4vt#qE`c1ZuùDtT3b5%:*{XvzU*طm|1fWSNgjQW-_䙉GNj:4uM9b"gdaTyH x9q\/$+1Cꑔ:,@D ":Ffa}8і<;ُvq=UȐ0)󵙠+ @l ۲Y(I wx d༰vamz `n8B;;? >Y4"= y4`ز0յ< Ga#Xw"6:р7 ? c&14:CTxcDai5Cȹèmx^箠ID qDW]bqjvRxc`̓u&sJidu59b"j4էBlr XpPuC{gy?669Xrd W++5hW3-Đ^Wt86GPPmа9`1_W SC|Zi)zB5JwjHywST;Z0 ;09$mȠBVaP:vj `HA*{)f:2p ɢ 0n߻ӽB89 mx1*Vgܷe2GS!F?bXجsWʥe_Ǔ/뺤F;rp?_>!l[=Kat`pi&oyY&:uXyfx'_߲pcĂ ƼPuJjRbgx#">67MTWu9{2 J Ih!>٧8#kQBg׀Bu4gZ37:LFɳ K_Uid$3mԠGl׵ը\c9F}RȈԨoRTEBiX7a^b$qo0 7E;t 5p2PyN 5˼"0A %V09oAjS9te["I/L!s(eCFn2b+*&X*O1}l& "fH_2X.В21|Zᆅ&yUq\D{L30ǹDŽR+Q=֩`dFwV_cd]%qĔl9(B'%dSnJ|*B1$ՋVO2}8l1h&MDX2e۸nFdIQCS1Y|&*~M"5qgҤGhW5FZ= ceW6 [ ,qg֏;LSXI!btܭs&mK>VR+Ѽ&cǫvxヘ~C6\գc^/ϽjW9;?JP)vs֮ƒd\ubkukcA}Rw9?W1FXH ::ʃ1HI鰎NjJb;#CehZFYihFb I TA$a@!Fj;$pZI%5ZET4Qc1%5&1bM4 kC(m ]C;sr9PԚ%PpRо̜\4 t1+D:1B1ZTm, -Jƶ$|7ZS̼ K [վ̻NDqO 7:Z1P;s7oYa[2jUQ=4z*Ս9e2)H#s)`/S4`4dFI^de&X[: J%2S\0}`Z&,d) H# bx#Jèۇ +bk LUi.@lK^iʹO]_4lmOJG-x32 OQbMDˇ̸6Uz c} T c}| #9)Ub]VrA;P{u z׮jw`e-sB,SpN+ewOeŨF8Qb N͐ IXRZv6e*BK44+!7!p4)#kJ Tb4 BO> C~#"yR+RqoQ*FV{Ouk['xQ΄`GACUBX8YcG68 4\RWPZ IWl|d]Nb{ ys ^MXa{{Yr,ǾmNraģ!V&wFNAW *SOA}JYɜ9@EoHƲY "b&dP;_J4*!K\M"4D&b6E QBxG*_3 ;iq \60s3pJV9rC t.w8ZAV~H) )r0035k9Nc`f3XHk! w-܊5MGSEp#ebo呤MK9Χ`;&FEnw,JW5dKpVwUFwPXz]n-F8kVֺʸo1淺]u^vu+Yؾ{x!,_JJwJ8ou[n/[ Xq$=Y*x-,b,dQ`x&}%vMqߋRdalc2;1 ?N zf1vь`!+ zo8g*n^1e[#Ȇ$tB&=!DLD!0tfYKNViBŒ LG>Ğ$*qmiyt-T;҇[2+ `Fm&`7'1w.7ݝr;ކ707m{wW-w[~G7Np/pw3 q2'w.<wN'&}szU9Ý.qf9ȩ)ø!ajDn2Nc>/Bgj_A%#̶\BMI.ۛ $g</B MIRV+iIũS*<%#Kmo[%"wO{A}|eP퓿>?~홟3s{`7|9>7} ?#@?>k@>c?>Ӿ>@@@?t>DQ @I;sP [['i]c a@c㜨HȊ 1 1Dúg1|" y;|)<=A=C1ܓ>11 D@C0CB0tB/FtTI!B2q4 )BEO$.OTSVE:jE@"ALMD[;TD^ Lc1x#_t*z !LiȝZ˰KF:-hP5pb:ZSpBP+Yj" )@*k#$Lb$+j yWɧNYI2J:ZD* VQ@o!8$R,OblS T1 Y)BbA,ԡ$*C ӁaїDP]." Q}'!Ϝ5Ĺ*RP&uiIٞn% m*#=ک$XHRHmB$!=тUj0 .T',#I!j#zblEѾy Jp*(mR &OTLHT21q LT|b1P2?̒ゟQɬ, %UQRd I啦LUR9Ɂ :}\j̞i0=?NQ/Vn*Mʍ15(rBIو*NL%U =5wZ+xu+,-DR!ͫ5Sc*Y¡m 0{gI(qmA`RaF$2+5UUA'-?:U:lhTR&H%!,nݣȶÎɰI'eQٵY= HZ0%pOӁ^cKZTٸ(%\åMr˓ *X-55=SYԉH]ȿf9q'[XAJ)}zҼ>5<THC=U׻^c^żM4ѽsSK3_/=M+/s{䋽< ; `%!k^<`%==7uS#^^УS^ѣ=`` R]>EE#`Ҽz_NޡԛU aS;"a^ԓ<b<^__4aS<כ`:3si^:hv9ffKuNyz{Fgfv:lh8g^gfhpgefK~efsF7yt:lgrv+g;^i^:ei}vN3h>vNN;NN΄dHDAx"A%SN+ɶ#AR ,Ԃi!EOxN11LUܬSi ^N41^14(S0:,^31llN[NαKȦlO3Ά, m/&!3Ɋmۆ2&.ۆ0lmޞ.nfmmZmePmml3lKnvnFޮ&lО~Tᑒ}҇M "e!Bx`k GaOoSN&L8H),  Tc p%9P%Qr.֕ Q.<$V|"BLz+IH=Yڂ)L+Gg 2,ͥ95l0!ڴ/U"lS. PR. H]XXRj\*YeT,LC$DwOYT)mEWZYLwC6bW_V|,&PH\0 8g+n; Tڒ5D*mJ}/ IWzY|c :,v>Pv?S&T-b58V*kBx $ ~eIKpx -`QdݽlHgQh1ቪyvo5Vf`JITx 8 yK#HYQx4Jt*"UëMyTx"ujhAXl(5ҳ؈ɠP A!0´M'Q&'$U79I-IHoB!W¢cSJ&BC/ [Ql>H&j !qe(xƒ&& 1 -4@"ƈP`ZF=Ij2m =.ny:F^#1Vg9=j7rRebD>M/{L.&m)?Hpʭ:CP*h.щ٫O}Y4iUfS^AMI M#9Hu⚑򡛊ZCڐކ"E@MV4ǦXѝkgQ.Rpc:Pmma&1u/2pKði)S "( o8vQzhA4AMT@Gy*IIf4!&2  чb0bB d` xV~$ĀbZ  Ѷh!B>@*1qqfcˑAtMi9ë,9w\ݐ@6mWJN"WEls$$]wË q[BevFS]% l"Iˠ*EI3#qzٚP+ cF'vZ4;:Ҝ3wLY\^%uk# VSJQ[d5Vg/A_vI]GV$z0 RF/Rs942Z` &m!d9E<`>S/ps4Q #2"^2$AJ\j1MnɚrXim=VXs]H(YMP1S3Bŭ$@s|̓8hNg%*q s TQ!ԳI ڐ ΑP+i.bN?7uTpC5ПſjtR7N#$&WhǤAi iCY 1jqSӑF(n3ŃAĖEކ1XݲM/3jJe탚n]O#G Hy@]^ v>d&$>2 ^PD].u"6-PS꼮VEj2Lh@Pٙp6}B?ގr4B!M{Ablle벟uj*0=SpH\{lg[޴əV ؾijS'UFSzTI(N)|E*YEo6#j-ubxQz7,!~xIMZF:D.#>sQo4 nx.U$hcdHyl}1|0X>h[i:E((ō8Z[]^ ^#|>Bř,B D<@IAQbu= D}4mС&]Ǎ8R!m_Q`9EB\Y]iQB=yq }Sٴ^ 8YGdTqe 4ź%𵏸a p^dV-xM 9QeGA TԂpēLl!pYQM^dsSDDvk$$0Ra>@TBOOmUϕhXSuO`'0(m,^Q3@,Q`$>ÞCՃ0!4DP&O1EDy N٣E11m=1a<HU ݊˹ԩ[QK'jU$`(a$G1TL6з 4\D3-ǘ0QuQklul-Q("\аOpĄt= #-b FMRnNPG&WFpPP$4A@]Ht Su(OAIP ,YˑdXUe#ݖ^M1dFf5N)(ҵ#; k `@d9"lyu2l@DDVi^v]i n}&*ӡ^?yg\'~ ^&SV:׉!\t讈Q/1L_MeWM heɈFPȌEVb%D+ʔb?B EY[Ԣɝly3aC,j4džׄ‚T hnPae&8Oa*  Q ^]q5 N5 }~BPyD& qX@1zlK,!=ЮD3$ D@Y6*T[͟xyxjʹV,\D_,lZ^C2]˝_," vd%ѐZOm9%ԬZ%dX_Zʐa*fI^B ЊA+<\%aUQ/>qDXXnV2pږēv H)wR2p,fH3~KAI ӽ1v$i(>SGO +F˲Q>b,aN>hOLڠT~̈'ڢuS 0),IYr Ӈf-X.5 RST"m0TKz۪M`kSv<%=dGX'19U )&6&re 4 ^ݱXqG) 1 2(rME@Ij-돞H`2qEIQPScsLUeI:,` [*R;@F!Kv@UtԔa_45Nx܃/!X4xfsw}I} =.QFXѡ0T@~aҺ%ڿxWz%w̃ͽ1DK&xNSNJQBs#ڋ]4<I[.t&;fZ^э_$cjNzt0Vf7|$U-˗VFÀߔ ׫1/jz}qK◫RBg-Mk>mɨ5#?vٞeR!n[_ǐE!dOPXJd w~Yj[zzkw0zbڒ|wxuSn8ӭ)g$+RtB[b!OT(l,,.xG(aYdY1 Iak[5jiB9nuhɳV[Iዥo&kʋ=|d}2@UyjЃǓ|h|3=GG=vĵ{*QC<K⢾ַ<̳;1؋Vǟ}˛׽jE}Kg=jM}؏=(&/+=ҳ= }}Gju=}ˣ<ܳ<}c<ׇ={}ˇ٣%a=߻>=sC#zK` cvxPSi$H?M6BO9mÉg!mLהuDhepRD81 Ō7vc48 ɱd'3hҢH;\r&̖,ETSˉB7ŜAdУ;{ m*Ʃ+ʤuĥ_KZ5:Kdö 6e[cLˋk)ZEBƙ.6y1G8yRG3MshП)*B,[jY}1ĈA3ɳaJ+P5}E7|r}iQsC8I Ňжާpx=e)B) [̾T?LA 3h4 K(!)H[!Tp: OKD#G [lDnDAG \D Q gqqd IDQ qڹ[wr#jowC J ݼc,GkJPe DKNݱQT9 Ő5@UzYBz s౎e^ŌcɌf8O7 qXw- QƓ୰4)MP*1\Njf\AB-[|6QYTbG ^0H6vʙ#x9XDˢS2AcicHK>s$YȬaْe%=1Xc> lAMhN5ӂM{ė-db2ԇ5P8@$`]NvҀdNO2I_ʸ%P$ YxJnG3*B.Yp9ocp$B+˞;iLCjdP4k@I D%-tJ衭eCܙEDf,iY"xwR5L= ŶMw-Tֻ%7UlZ|lAino-$ _BznlF#RDVr-u 4\wGNJLGkWBB@ge8%Fl d|_Њz.!ґ׺ڥxUā⴩/+ŀͳp`-DUE\nX#]3.lfLbSA_]@z~I=J_҃> F/t?iC[ԑ4W}Qձ5]jUCҨ5}k_ԿƴaʬZ4=cX(9zk2\HОhIc׆LDWdC1cbL B 19y 33V嬆 ip2p 'f{CqbÄ3+s(^rg8񍯼-%rG1Ggs%;<[S τQ)"$ϊ1=\A$ML-Ў K(99@݃0sj>O҅V#TkDM!SQ[|ya%K)l7hRw*)CN-AhDD\ @o(n DhOF \C $@kS+D,? rzTDŽ~ X8Ђ,?f !jHh $Cd4!Dgl2†IG6 4L!:+`2ЋqE꡶j?D,pSǒJhзtAT# ۢ?.hv\OspĎPEv"C!u4!y+e P$ +czcjl:IoEY.%0ljyo|kl*;E0i/?&I9@Q03F,0[¾JtK.LҐ'q"ˆZhG-u;@aD*!ٸ* l6 {b%#h~G Hf@<q__\K9oLƬg&ft(G b);a.2 Ujʠ& H" tgak.n<"q;$;F# +f&HjІrɃ^(01,T6Kls'yJpŪqgRi ,s` vІwҋ"lGӊwJ'R pE<5a$e# L<ƃR(`2::6b-d }zb;)hFH~J!ox @sqY|gZyHsX:ZJKr1pF p( n6[>A TI&c*2O-1=== '5'rh(oHZHᬧC5Ҟ^ lSi^Hϲvu&(ah/S&LUltZA ,χFi-A?FT:0fo9+/a$ish3`o8sWIi1BCV+Rx8Ti&!*aaZ6|[sT2pHQ<C]D??꞊̸ ` 5@<  L!z}6C9a AN@6qMSRw=^=ryF_#1i| b/\`pw\d 2gz7(ӏ&) Ӥ6}g4"J<_gIb1RNún' ,s/5a~NV<%&tU^-#ZEH<+tl4 CѭjO'!$Q42!enR`6%IYA|$!ba!ac g b =A b@b}}hBA|W:~ar e#"&`ږΕNQ@6,h《Z8Pp%ر 'Yx D+.7' |[[`#jJc}8;*)X BNZ/BE5Y;jvT^Cjt;ʒ&/5'ZhWwAӣPw +2 Nj];5éٶ33F15֫\Hv4WqR3u?='ϑ b>8Kp vWOS2}pܞ_$ͮ[!x'92abGv 6>Cdv^ yw3#PF Yf3>kz!U^!ta|ra #ac2)z ODFoe(ۧlYz6A>B2Ph#i^ :ɏ 2M˚F[FQ.3ILLKy깵&KDcɚ%d]Bǎ%YM2eWJ.]$ɸqǶڞe|fZy%{}ZRH>Sqg2Y4k]ލ뚛Gt|R啔G",sl|'(C>}>>mȑs'5 ! g}^sV{շf x.iNCJLuQ&ļ4c8La( L (#a9eƃj&j<(d=J_}攌d2  (F#ƒE<ѳH(mG4`Ndb{H294 Pty04 (YeTqMfTR1q:)PZ4!5^vJdqYgJn%Tqp%aEZR]N &wdGULԹu*_?ZNMɚق1czT|tg}|q;hgmvr曫uj\Մg5J{7u8eF *c%u19~JQmҶ r|u\n;ٜ,zc pՆ1#T3v6li2yoFQ e(PtQVYGg1Y;}^q`ے0`s-6Q0dD zKGʳ VjC%&vnE6jfnVtJ1CDM 3c3ۗ(;m~fm*BSEIsW+QI/gŰekٚ<")I7D &Ұ2abE9Tk5)V1Gx]>ԎbKQh;}ꫡ*Xsf?&f <_uhTyWs ;$Q>elТ 0U5H:? vxT_& goJ,B E]ZwUTLx$zŴ2-(.'?]A+ZG0f ]k7A%hҊ̖A}`E-z?!BJm̄ia JRDFpE&*z2dC8)G@qP񂝾V{ ǁR6SfP[4k|y+Er>uvxC5F31g/h!S1v47Q.AءBae2u"&HU E'_AGb#UY/Jupcmm&8ShgWHPvFk/-11a{T!^24 b/e@"Gv+-)6<6Gwd=bija)Y W h7W%ptUZy8mQ3eME.3_Q40SՉ-x\dx4EsaDhfR2tMf~w GtT`G 5R_:RN3td?f6 ŀۂ]#`5@&(i׸{!@5W45q-` |GNF$P6or}7 ڷc1 ZQv(@ إ-@ ^UsGfoM3MdF>5DD#0 &S4Tٲ. eU\ٍ%CDa0DIsvl8]lf?{@68. Ao&ZFG]/>TQM]^5Pv>T7?(C[wk@tun5_`LQ-).ZwXx_FZ>_wː ոQ_=Բ%yFiV[C#_e}6l$uL0 xCUe9- 6&IFAbaWD[#!' 4N!'LĀԠʐ27s1k!:P zPL:YS7a2BV*LǠ !6&*PӢB1Z?”(:"HN,ZIJ6 ʢQ7Oq:#VR:J ]}%INW*"*OM_JJ:II]*T;j3ʢ=ꠎ봡o?z4?JVhZEJzn *gZc]m4!*&nf_%*"pW|1_f||>HQkeh;f)>1 DžfLjuQҗ$HrQfIWQƯ*}6jKn ʰe[K;[$'[ #+;!۱6˯5%˳9;:[.B{I2k'&K j)ۯOF>۲YW$ZZk*ka;H۶6e"mVyh5~Cuc7QV+p/p\#2!qF$h'%)2M 701 8K"V뙠5kEdàpq Vpp 5K ;X.#p ںOY ZCd8.I%qKd.y %[໽Kӻ{+ً+#[꫽qkp [u*kY +ۼk W oۛ""[,\ʫ[{ܾ͛p 4| , 5u!fĊ]0$!hhwWa35_bp>wNSU1jd%c5a@R>72֝LEQ22m&cU iI[~-mVq?z׸[ad8"t\Qx5y⁅aչGYGkiRA گ t x~+ըI=yTٗrFꆃgF@ bR0fdbc#Ӛ՚C rqHR2 w"DH^PQH"ڪ)Z(QjʤJ/n xڧ2j*>= 5zmڧjN*b2z5t#Sʡz4**Gm*XBq%ztH:2'ʣ2QJV>IJW1ԡmb^M^ 㱺R.W*:z>oQnw*7*Aj{=pmV} uzv{ḇ*Ho0^M#ק50R3O6]mS HLuVh{= /bGTQ7 UYJ[ujUoȮZSY%3QuY7^]O>5>B(8r@>- 1 M DFk _r_,$o-2]t5)s }ݵ-7@hTሊEn/ O\1u(+#\aT ZoYw!+t ,:FV h wq;395YQf=bZ2!0-%h}T98{,TF^,zjZT;kJ4gjQEQx^Ǘ'DoD jkAgXt#Tf7"U]c~j-Ԇx53iՑ0yO^8wk|Fue1(Xt87No+E.Sq`sOUWdalȡ3&`/08ykiROĔ^4z)se(ZLo574eԨ1 3XZ=-y`&hb*}b\.w"DH(eX:a}MY6aVZ+S}тz(NWFlWŊEUлiߎm[wYM rߣFv,4ӫ~'&WľS/$k"Nl _Vj`oWn7+B]殍vŔniPTZkomh/_vxӺJu m |=Vj;V+.43Hj@( k-sJ2*0n˵ce@Y&}bCIʄa@1hn " JR#$H#"'*[Ie1$ `P2Ӱ!nKi<;9܈%]QX .H;PNƼD΋Q5/= Z .kNFEJks+RɸZ25J3 O5!֨{+ SM2l(<0Z͊zL?@ QVp5i)|0JUk Ա9@K|c1t~%Ь3phCڻԅ8c; oUVqŝ9@ 4Ґd MbDHjoYA" $MԘ$T%zdmI'ME7t0*pݳZYCu-7.2o5|MNshe krs t+]qQY%{Y[j̊d'ĊZU R&Cʀ$`C܇UҰ&n7D{r1gnȉPOl-9W ]H!},,6#U|iO8>r.ߝf&m_3t2R|c' ;ښSw2|/\v6.vеTA[#:mIfW]Dl]]|UxE/ْþ$F8ȓh!3_YE "! s?XYhXc-,xy؂ .8;i/hY$ad SiʐGE؇|؂ 18;X9x"BهdSS a >F Éۛ- 6KP<$0 #KѕzI )9OC13"Iۍ1R݃ 2sBZ.X|q#73#d*"|(^5[ '҈-ɉeKјٙ>+T҈0 +{ӽ 'ybӉ;чa r6\}sx?jEAH-Ezd$d@G؅#hyzh`8-";RK,y5<*皴2Ѡ2H 6D0YT)kK3cH0*Фa{:75Sʵ+[XB+P-U\Lᘇ1X }`L0v@ L‡ d L¯+0zM0e(H 8`H܄$*-!L4}@P԰}`ζh)$$.x oN,*rRlCXz5:8p:3dq:Y#XqX,:LS#B?F$ -*8juP;a>dZ?lLsJ̓:b,qZz' ,:NFc"S81$Y̋_42jH́(  ` a}SH@TxNyH aM$S؇veE|}ЈE0F&Eȁ Sx xԇD}*}HThh-UvxI:m;:9A/a|)^isƠ/m0:D$#5!DýKipR3GSW'ķ]Bnۍ$U:'sqZ;=ثK8:t#a g&‚/!>Ic`>3I}LۈмcJ)Ug< Z+J ?hBi FEO%}E} g.N-؄$OMJZ8a XMb@؈N]zӀUU<=Qeۦ84M}Gث]BąTMŞIR 1+e]Y'?<]J"^i|@ؽ]ߥߝ%E+A^u^e=^=+2I']]^Iuee*^M ߍ]^Q^ME56_@` }f^}>EaJ-^]]V]F_RA{5j S*:Ib'!bHSH;UmB cPzPNьN:ԇ@iV.=N"F\ZMN@c]݇E؄(B˥&dzDdN$LTJs*Mm&\d|TM kk,tm>A`Ia9~Y"Bq?NQQ<6@W$h^Ŋ!<5xV6q  UD҈")-f@j.8(J>m(}2*gÑcvIq9rkght.tu@3=<?qJыLS({•7/ŀ)H䁣ۆCD\bIAfqijo񊹈A z32AaWkg~Ylhr dOQ1/+ 6SA:"}"( 2wJ}AGeV/Z…(h)>>%L`ȁ-*t(QJFd0澈gTLM*dKKҤ()șB2|PIWrj5%vVȂ RlJF OBThțtvw/}\z(ݽf=Ft`eb) Uy_0h&0bF/d:Y'N&&5gq4V-q4pb&PMƸV"Ő~.+lЩΡU9-G:xCɟm]̔`w ̋_ditVZ,Gj%sfPSԐ|&W >ĠKWtX_{ޱ(g_Q-!cEUImM HJUug]tP^XiY 0R_:>Y>mR& eri&ʈ6A.uՐfjl ClX=qGh I&bĐ裡,#F*3ӝ U]~t] W Jb[Ha !x[=gT SY;!L^ WYVV"Vd6x} 4q2]#'H#1ۧRfՄ 39h.UqERx.˦_Ԍ7ֵZ}BF)\+>\Ҝ0M S K^ ) dFA5OX (afi;(Pbٕ2&C>24fxF&q鹬Ө*[Imuo&prvi"{ WŬ7e]'{fxG,]bO']ǝtk NjsE\C\ow{prAi2  >YvYy:^!St $l#V]_NC:͂7LDuH|كP-?Gy%+ ^Ή6%H g6fJ"G1z1,cEb@4SHƦ)ցOUn3L"7Q$^`m(]2bR@"No/ۏtʓ>|~P7`uR.$p,XAT n]-iP28_ w0<Nd{LIveJVN},d?)7^({]D0Eg1K@VɎ%K&h}IP#\FԨlt $M ,^bd=0E1,̠ArDh#D3"-T#Ab}TjxnHM*8ÑDږ@@ Ә%(> IG@S|SbީdJY_0i;F~@ : GV2ֽdKC؂';* /31XR b=¥vmjV ڈѸLl1QJ$2,P>SOhN \"( B'MojR5f#TR\8ene;\BĂbb& O$|͸+KLW-gv[+t慨5"RZ)%;Keb*wwL8毟J;"F2.wDq8uKh("?mF78'Usf+ >nglR9'd#Ʉ㻯xy$(o<.ݻVE1Bq֚#dSgD|%X ]1]{aU +G7F(xVRbY^v Skpt ":.u<*&.J>-Gf,Vҋx^ sGZΎyh[n TE9 _Fr0C~zf-\*SV mkpQgE?9~QL1Ӝ枩9mK|>9Ѓtϼ:p5w:ё~;}9|L:صn*;u_w;ugNL+rbk wfپP14Ψ \\Fn84dWâz8/?=Sճ=MwǾ=s=/;[m{S:n4vx[.Tp0$CG"r `@f__ B 29aH bn`mDn| g 2] " b : BOj *"2 *  уRBLF ˘m$ HЈp]mN Wᠡiʥ`>u0t_ b @ ܀K%\P"z".#:"6"#$V"$Rb&Z"#vb$b$r'FB4FjADxSUBDɥ-4bQI*"BBRP'n"2"jġe4ce(4>E4Jc5R3b6^c&B0ʀ91(#4P>/*"*<ƣ=c4:<"Ab(<2MĢ BB0*,cB:$A<$C*$DVDbCfA^dCGZdHdzlI&FFdI$D`xD2"'C/zM$ߙET %e<_dh2p] F9ڈ4N& !ހ%A]PZH-%be%[\LD`Ŋ[DWi%V^ҥcH_U-eeeL4 fpL>MCd~%jjRd  a”HicFP$jNaZb 4uR8HU|R OpNg`T>ktfaBlqc ؖᙡ[oC߼|>$(I-frDe=YVJLw(h4] O DD_"N8MѧtH\hΥZ@h&MR$f\!D(|#g1S2E_߃BR Y|[%T5Rlv%q֎X0|@1&=_S"DmYƫXUeT1|1\p%te Q ĈkjZV֥f}qn6 ߑ^N_ژd}hfqг̻)_`V8u QuVrSwGd6/^6U`D+R1+x/d/v^@x3p¡g_338\/C.4\?:h+oqlj8MGTT1Y5֎UE'Qk,FB%VS/۴XUWW4))rf*nuRX&ؼԘZD`:A|+LU Pm&>hXeY)N2v^. \P}e%D>lA ʀ Bh'4վ*MuK<b$V,1|g+h.æb<)D/Q(Bx˭_F{*'TA?1Z&_[XA >QN%61 g|v[n+shH5߹|:}a9N&Mل2\:. S};;1U'O˄1Z)mPͤI#2WUrNf}ԨJwФM6cTVOY'O2PŢHZf"i)N*m+I$ /p8I#p AP(p­-;m{ *4i@***+,ɖh- y1zB*ʑު.8*ZF'.0BjJ$P# 2 #6Y$BM(pGS01\jc&$K+Gz٢.͹8-er4)tM]ET}'M/1D/^2[-ňe `Мn|L0qք`%@(.A is2aԧ:PBUNt;1bdɑIfe:hX>e( DG!u|IpLCP$fE a!8bBpD]ldDXc׾0s(/GZ[ږ/#iᦪ@#J!ƣsvD'O@UG,ƿ(.IZ2f AhYd@@jdtjR2v `jqp1jUK]z$M *tBJU"R/*,uTtB Chhr%Y/[G2@9JNҀ~(1GJ3l"A$2aLa&~}lcXH*25-r| b #?1f&#04?I0MxT/& $ZZSEqL&n#"]b&c#/XXvxfeqI6ix>aG/)pI%Ɂ|~1)0$w[`cчJ͠4&ULa],bewZr&Damv&q+b .gdLIh3 jXxcP !Xk41)c:D&İM)^Ÿ`B\6jlOJ[LdM,NcS46*$Ҭ(657!׊55(δ3G,Ne1TDi)YT.BJzd G/i1E46Ac 3a&/1Rg;d,\IA `y*]TJՐܰ¥ r*Jsb 1I*xԠ&jMc]W2'W |@n'R jJ%Q?"=iWӫ2XEj[Tl-H`ˤ@=TfH &;ƨKhl2Jc`0!.BxhzFhlR /Fk'%xpȦzflxxȈԆH׌lO)FR䣚dRn*md̴pFo+ nP7+4v#xd#+VNJR(lζhc%܈/B6&豦l/h+eMD ̰ +&_ڨu/ 6$Q 7Jg U,gP촎*,ENHMJ'DŠpI͍z-z&^l# X̢*͔ H0~J;pÚ:aLfǃNh GƦ>e^?{o.3ICo/.&n+zsrFRm0oΖhjHʈI㧾,~HZ= HhA~qJ^ĖRԋQ Sbjl1ܑ!6 D8qEvo Mplf/eysmE%p虴\rA"·]FGjd@+U"#Vk)`0h>(4n.ݜ$9LNd,FVq:ܱbfǐLe4b7j͍.h$GW0CG<,njURFvjRd2 kRIIbe!c2  Ec̴"#2!hY2DQ6E^gL5 *erwRBctr"-S Z &|TkR?c&7mFNZN+Vks'l;4aB.8(2%(3 @QRUjzVC0&OrMujqGQF0s(V h'֫h&L( Kyβ6ΪNuFX] >7DƐ.X0 _CUhD؍lVYs(QHl+t#qG1Tmhbq6q2>_t%N&HbTuYPJj_ef:+OG& 08QGPH3e浔;C ZH<^h_S=&0I;J2J?&0\n'쌇µUp9II nwd#Gh7c^4m68ulbb5;ҠgE5)< 2YnA}(.cW9,PwauJi<ǖUbl۔貂?4&ʇxz2[oQu Y-6viB/HDNTF"|``â<a6Nf3#b*pC `0$QmISKv!ɵCXTh39сu$q(~[8hQhƲ~m`n+#),M?W멜 l&|Vc)"ȥQv 40J2aH3r~!4PPJf):cn0uOG* *HՖ*R7PVtZ/0 ؋SgK6T讜e=j$chG΂3d4ƈjjΖtbdPGlVj뗱b'.qr?SeOK)7 /+$ pLFx/g/oRL5?5UAc̤2yvx2>rB*鷠InIGGxIlxֵ FfX^0bJN_Tc *5zƴt." լXIbggNO5W]k9kpqGټGFϊ8:bg(>WGύiBuVbmn۪ΒR՚%V b~V+հcFZ*7#e.e~ѹHc~k13'W¢w gE9 y3Qۉgܲ\ 3Bry`..K2ѪF4sKHԖ\N^Wf0Ȝd"LCc/.ZY;Gn·.aY%ѫ/ ǎt*Dq"!ř]JYچv{Y9BR/IB`n?d*/)N#=N8d Wҏk+U5w6i$XFe:-u9. [SDZ1SCºF /$Fkz|4jBU8:Tpzi4Oh܌$/M7KQ8;+9:a*ǒ'7ӈ=SnuCnL~8v q>Nvi}9;+\ХѶ kv+S;W}ÿ;[lz;NĖ:Nlj@.QP[oma~;9>>艞Z'+ZY+Ra Z𮏮m Vcwf}ʊ(Λ& wQWkEIT~mtVx8\y*䧞?BC ,H>QBz|E.Jal$>\wS| ZD)-YTY5tnX%m4~sfn}l)'vW|RSgHF<<(11(HDi%~T ǵߏZ8f@=馒ʹ_^4}HoWph)Bm2[qG -X2eF"_RqL)!p_z u2Ћ18"B=scK#CU#؇ԍ M$uW͕AEqӶ~qѫAZFTG אŒVMuW HQyMց5VIFmԡy^V=m5)QI]$#N)Eb{J%QOBP5$Vi8! (a~DTmߩau" 9=EZYeS6A4PpT[B?e49D(DdlJ(iP$d2&yZ!d1hB)d]$iW!FP1gi, jBʦ H DKctIHN\_RV%&6iTXkwEY3 frQf%q9uP9Uo9(Rektu$CdKZEjH*)E^%yyH!+iC6m~K|IhxX$U{=y4B@ muCm$r[7^f#A-2]u0LAQe=$PLU@Mk(i h26jLEO(Ad\EGday0pm6)$tQWr䒐?n]. tѵ۴.)ig>_O^<CF?y/{SEܷ/ ߧej;rT;*"C"4JT+x666 / F_H嬉 MԦ}DrM3D!6VE[{LҲ7!Kح2Xr-o);ĥ/ Z:mg"J/dY,Qh.FYt 9qyJK|͏l61y(-W_ɕ22i[ހh "'ŹpJMHC &0BdLƌbS"f-ЄNonjWy99D9jX]դS.gKё8&9y)2"Rw5L4{>BA'AbT ,,YgI]gmY)E,?խtE&bɞb>]09Mnu4 p洅9eVh X&"p(O^8i=O -2i @rm)&N&:lZp+0&)fML-+HۓJlYYT`zC|-zLe&PQ0&} PfCzť óaNA-nhŷIYZmHk6ZPB$,!$מ즢+S9&* JΒ۞̢3Lo0XߘkRѥ7La rFu:u}0q07H9WuWX935a ACP5T_5GF!ayH{TP!لJȘ=K(FzN~w%VT1HH ZzM)([P֓X%tzmIs}\4¶1OZpb\fQטb\ia,@wu C=i 1{udeg#}p@E:M7nM7|"IG W* "id'-2eM4ZLB1)y60Mf]l31c#-ULxHWQ(5%CK*8,r^|u%[Ƿ4A6H;X4PQb Kl@CjoHWh#`_2}~~f^5:#,fo%S"2f!7$qUSemwqY(P")uEdw|og" BSop^Ra\P._mFV';FSȕ yʈ:-Wkg-cq11SG3psoP {9Ga+ %'g h(Kf!raYvId;ȗtt4vӒi5s'%]&v.%(bNu(z6""gu(w (Dusdhcdhach!g)33&VT%"<{%X(Zb4J4wke'ag##1`z%Vl\R:bJ!;jaoi%6|0crQb.4QTDh^wy"5O bUw:ƒ i9C#JR-g0Daeu2 v0c?Ö2nx1&EV"V]R)!XSHYY:\GYw)AnEOZlc*p(KT]5G-#p= !5Y4N>:Bipǡ@@kf碞:Q F0 Aݻ+Fj@+f~YXBwB!踃ٱm]-O]/Xmb|.0t^vƁ,Wf|镼Dn}I* %(LzaMУy"YhUZE*u0)]H7;XO]vwiilDL_c"oBizzחjbhRfe*LH/}ASVQY&M T(e[ozNfڷZ'ɤep6dHRˇ|ƌLPgї&K:MhsL >UhLmD )Ddc,͛,YH3iN'z5)Ө oU*ٖ͓Mhݰ#ϴ2ͱ-=2̮[OsHZh;*K޲h!M\vhi~Ҝ:o'^izV9rѥOiϩo>ݺN_>FTi jta!6a ی$(h6eM9@ 4&$I!0JHZ0Ȥ z*"Fb D#h ep艿aɪbH {:.b+ K p&J:)IҰ "ɨJdNR,'t LЂ|J*d54J-$P]tTjUes]{uP*Z߶;{c^}le%ĎzwPi^ƿ$ 7%f :{Á7 8Z$jaQF@Pk)(Ąr%dOL(W6/OHY^ʷ4MW$Ypf\(R e ,zi%/D2(0BJ_*9-/"Ul6*P$lPW7M9q\X V4qԬRBTMYFTFNjȴ&7'i:aզ, E )APb0\bɫ%(v5 z`_iMY \iX>>PCGp!X#, +aor,!kVpbŢzj!T/5Uc$MlJR.8 ~͡ A,%[\J$1}<*>`B֘M [q1/r e8031D)MZ {48id" G#* !M"C w}uWNDoEt7O"!dIB5'4u #,(DR,$/Ct{|Y Uɲ<3rR>$ b elbOdAΥdXDlQ3Ͱ3z݋iA002}hH-I3(QףELe< Wc6EBHM.3\⑆1PRGDEjxzOS@cI̕tyZBe*kaHe5-N&hvN%1IKD\xB3"̵UΖc$s Nw/CJ9)fb|C"Ю :F6yEb4FSnBDel*ZNwS!-$aT$MKcY]jnI-y؄\˔`^9,'@KiYX谔ܔdΒtK*B"5u%EsOC8M 0+_!R00tb& s&#QGm )GIJ1REOՐhF6W$!ŁG!: rq_@Ot5g"u'[΁j$-Ga!_׷%h̝Y(qh閞Q4hUf,GrLj,+tS 1t.E\ W ARp1JToYe27Wka*Ǧh zO4?SJCVo’x=рI>z4hEZ/J9K2u !F&q!K%gNJڴwcåaydZ+'8øzi |S)9qz & Ⱦ䚘+6½xrehZrkY@Z>ʙ_%Md' BkL9~~_|i#)/iB! [A G")m16ɢ9)' q:-{1."Ix6jZ6SJR.uJI&)CA2S HB#&t/8$78C{#C;aB9W;CVaVib)#q "$'d1̮P1j1q"s Y5<Ҙ #}Q'$K#Q}; p0ܪ,18S!K{%Zr^*% * @8;B+$ԛBZƶØ;ɊJ0  ă슃4Ȁl?, ،4 THȏ<ȎH,ɑHȦJȒHIIIɛH#IɠJJ43l .髙$"Z% Љm "LtADj ꢁj Dbq!b aJ:I@7!nY)WӫjaF:}-,4:R@!J)+Dx:g1{3z iBwB8h&!;o3ٔp ט ,QI$8 l$`8 ,t@QdtOO–\ SON" OP)EP=LBR&rʮLFŖL[3%JdOBsPzʄѩ~B<ƲEӗ[: rFHϙs4RӁ/:<ߴ/iS$3`B\Iಎۼ8{29:.z .]SG,[3#, $*4Ȟ|㦝q7HF<+HBT1QT(F=DEm4{RĔ\JBٟNHի8T~t̫hG *F X5HUIUUB< B!:̩^;}LB.;i""CdNrDd'+- ̋]Թ1zc>Ó5?KY7,/A 3ٔ5Yc";9 "S9s"c> h ^ dWH^S/X@}RZ/$^ V 5!V8V4) 59-EjKAs ّ܁y-0߉L -#I(㋖XѕDkؐBr$>Q[=J7( ߘbM^, *(*穇FƱFl*MhA.(GT0*])c s\>2VcUK r=uҦ/Q¥(QT,sq-X-Iљdr˵ZÉC_L@P(y8c5t! ًCFx㙥zd/!ٌEDgZqcO _v& *4"!bped'.%B9_E1s$[Ӛ5y3##މ&Wb/ ;8##~J JI'C:GZ!>0U +/7KCSԴH)K)JÔFNT8]/)0 J-&gR9R7Fkj;!s湇Ɍ]!t;\dt%?d;a!}[؇14,bp )TM Z4;bL@uiB M 8zY^Jß;6 0j t:G:S$ "/qB:a 1W3G0QeuզaQ"kLOf ;D]DBYoS N50<Lh^.&>[e:~6ܲ}6$S䂡" eHiܗqGl-p`4 CfQ]j#IY|ռ'@, q@VИR"jq□S¦RB즱!+ Yכ%DeG7  xcc`jsy^djk9&2<’PZSӥ#C/`Ց10s'm?[LAӌ;6]1aÁ,8kDa)ĢvSotG3Uޖ.ji隝JmWiPH84j}ʑQ߻*7 ;a%8+ix rmQSɴ ;osvSQN/װN[KΚHM4~LJ)^'t/5y@rUFv3@w[ g2 :2#)SybM%VJS[җd\+TWK NjqD4S\ & 5avu/ Ps0ss" zuzhcw14tL-3,zB+F,z"lT(@|L n18ՎtXץ+D"@ͣB FzB>5|o61hg:io"JaSR!iƶA{$/ʘZ^%Eyu۪&ӇMP)mh6 1h&Mʔi&e-ӗ^4z2F/d}Ko51@Y)sR˗j&)r>&?jgQ1e4ecbؓg=P"'۩O P!ۧ hȩ=wcǐ[n\o[$ۼ'}˓ؼ""{Vna|eN3s>};޿O}ţOʑ ĺ~>w'v۲?*G=VXT\$\(FqVUZRуSʄBBaO1sLYfʣuR!{OΫ#aIO[,s^;1Xλ"goFh>0ZU2N&f zYAi[^މb_JF9>8ш]toB'XνXc2L7 5t=BA2#6'5mhZFս&eSܔJLcDeUܜ0bdڔn<ƐFd"#>h,Z1"p-t* V7#$:)Ocp mA&.҉(&1}++8@ c@.nM{Py8xV+$$y+e9'IOAJrMTVU3 $Z -1|%,aP0,CD4aD( b6X,yA5d8YSc}"1[> M80(@Y44ݰfI_xh,ժi1Y&W;oCQyVhIMڶI,v8ueE d"Ѓ G+Gv>wq%c wcGP+zF#w-@$e*.# ӒD㹞]7(R Kr&=uΚjOu][p͕䃓r5} ẹxYOxiB"9S5vQb 3$ SbH""!F2!ƱlZH&4 *S?uiP (AI. ߴ0|TÍC>\Pphpcg92_WZE5_;#jϣY]y@BUΒʒ嵁id  FBS][IL)'g)2Ұp_Jb LNP^˥z9(IJbh8?< }"hS f{wBG3`QRfˌQ2Q"jުwaH::jHq qn?*3#EGP46MiC+/`$'O~B(u@ٽ2=n,ԘOq6uY^`8Op`Gmb)%< Mk QFq j/8(Pk@mj $Z1cEdcB r8nk|/|̅tQnTԅ1xs4Bp5 )}iP0t$.!q9?p$-N6(U 2?*,Z6;agT}6?zĈdꁉΐ'С\)~WSh%LW:P D-\)PlU iM5eަfp22.4(>r!61 Ixb2O^i(.+Mo\)J*G]@&`> ĥ]9$2At$voPa 9BIHD";- ꟷE5E7i;|9mˀ41,Hp j'3l \^ʽ_E U-n0(k 1HV PlJa(ٰMd|Ūу>YJ >@Q  UFpY=@BL`SBS@ҒRՉ]Mm`&xX5F@\,PHNy5&;ԞVMuAwUvu>TA(C0@] J8v)ri2;- ODL1P`DktLki" Оe>B(T[8X=ܐh]q\yIWmPݿ_., K0y(#ڹ퉓J`x"!JyOF,BF$H<Ѳ-X ėn"LѦ#=@X=䕫(cS |KN`F-CBAa!\FɇɀIFnwPd=@ϐDpjblv@MGD Wt2C8D'@"JK |x&Rx\o!l ^ВNƅjX Ԑ.!I[ZIhyMYɨM~ VI p jXOx Jv]F(d HUp! Ƒ@( tSH'I&la [=N]HIFXUamߡ@D`eٝb`IAtD $`ˆHAyݼ&LΑ$ǹ  +_ a& uey1DeG ´dC_1g%y3j r Y /=&We[PY]^XL@2'2Paq "F@$$Y!9VmwM)wMvil2(Z-&ln[0e] L0SiBA#J4٠G(SN7L^$QSbobTiq=ʣ>%g0_YˮhהRT.EEI I`|WCJ ݓYc):ZTb.Ir uYTIiɍkη4xUCY@R+{g }&ڧa6'ʼnHZ{Dz TC# %cd"ylY=Z:V;}}qI͢ΝSG YG/_f( MVl^ &V(GJPiL^`۝ȅ]$]J d\,2Kz.`VBrY:XF$Z%NkRҺRL>|PNYO Y\6N㪊AU XdBi XȋjW,ẻ̜DfxMLӞY)SuZW,]͞Wf>nY0(c!ߩUKi\.Ğb5$ڭ.肍f Pf*nl`DjJmBFm:a|dkw8pv8`O6idYq eE͒s*ZeD?hH4Y hh&x SaW HJk (ԦWܪ$Qʲ,xPfb,/΄$ۄ03G&1!7x(iڶnʘ;fl3wE%`E4kFHOiJ d#ޫTQɇFш' Pn%*ҟ|XD,b-y &nߤEYFdrEa`qފ%?_- Py _. _2qRTץ Gt*5*OC<&%I#᳌ܔ\ 2t%ymj۔R? ,J)#ֈ\mh-ne= VnQd_D-*Cl⊩,`Yq{.6fwEW0K@(㦺א2ҪWnH%Ze|uIeٸ ,HreTniֱ^,~_v|5dF]ʬW͇% >hH CkJE]I+u'Qd,QX$r*VAfacp-O)KV1O2䑣18wyM 7Zl\}5NA1p-2@"VEwg,LO;Uw zb JP0z;CzKSzDJ,čt:3z:zSYH5nzz:$I7Rr@?Y2PbBGX)2g1CQPD\ ] nqKM8+a^4F1UnHĝH}%l6Y)0ה0JJl t! t%0 $` v瘔 '#J I@Szl=%N8Olu/zC.ʏ:絤v $ā Χlo™p\m f@Ct.6pC`h+Lkxh̍htt*n5iLn_agTaGڼ+16*_ 8 E߅АX6J.Ju>E#KFJ0!e~Jz҄\@G~~~nXJ$ ~Ӿ#+3;/c?gk?ZAYrD{VGBȟV DAY*sP$c=DhՃVo}S/;}jФFb4jf}F+9$e)#,ӰIhbjeb H/h&I4pJ+Iӗ%PH $TWKN%֤Qj T ue ѳ:|$veׯ7>詯_6/ |}h; +/O8dp$TUp /TR$(|JM-&{ 26bЩ*lP rMeBe}I&$&b@iIx3 +2h#5b$2Q.$&`P e.   δE2 1ABʂ 5Cq,(EHBI)2Œ;N# HAs/!hsJb01%зsQ]ĵ3 TEǠZttTR4d-UdMuYX=mv*n npn]E ]O ,qj@l-7Gz]/5;RxLŅjx_T1f_ؽ%A3v4k6EY@G 4Mhd}b4$YRL\j֮hՒ"h,R#4Gn a4PBQ'cv9j4+;eV͢2(cXj *)ۿ uSrO!e\>.jG;m5dgO]>Զ2')SYOccw}ve42Y}x[ui<9.br*FPyMƓ~Ne_I\^^gy{uq|~㻿hfu^gz_ 9 $)/y99_98?f7$'!2.rTV7t R5 `#(p ҐJLk0ZXmD :/mHr%mʄ$E#HBH(h'I}4[b41MzdkoX9-j.wۡCE'Q`UNϤb nқd\/Srdb9Wֲ+QI+! hKT2Lg>e eYMk^i2l~ rԘ\Vy4Fpe2$Eh0 TL 8&>񒖰FR"XQ#I&JW#QB!- 24)'=&&5 UAFЯ1DE&wUMGީ[bC+ƈ4Ah6ʸ.$]LCrpZЪU9T"*CH( ֧,\G e ^L6i,.` H¥*>"bt]U-*ߤeIűm"M)Slp"("62&\y$xFiMLz$$d'&%%NS-ԫ~d#BqG\Y+s&XaM޺ҀUD VGJq9adqږ:Y7S&'f5L 7zf=jJ&VB tH+RXg3OCg>\bhXm"YLq d\)Eidc%1Z@q;Tqa HDKHa,[1lМ4ݡaJziq"4WȚcj8KǙ1$}=e30[*{02_ũ70 X`QLS@jRjDϒ#LKmLfP$| m񮿄g vZyc`۰!Kd8[Wj$1/ Q8zv> Lhe\,F;-([D7C}Ke$[I z$ 92FbF+u2K%-Nܰ*ȷbK9%,3 G`*`e6Df]NWe׹QXWb=8mcajGh&vZS9]fN}XVKA_䕮CJ]]ti>$B.f57 *JdjuӒ&LF4Dz;jlڬ^ /բueҳ о7Ǐ3RIeՕ >*tUU֬.I͍5 =7ԸOdӉ\LFd}o:Tu';D?Dq7υHNT)1fHt10 J.nl/ r\ 0eѤ/ 6A*C,pJ-f- 0 1j,Et+nGn R|ƠdfPbȤ8¶l,!4 6!'$MZRf,kȜ*ZT u6-oj2䶣l1R<pl&Me2N**WYp\31)TQoD`B`0+FBOs,$4C8J$,yszҶͤ,l,$z$z'$ʈ-VR j@'6Gd&K'pR r 7D' %G--t/.׉2b>Ub(tQBxNJ#plElbPc V2  |d? 31h9LXNi02aTdHZb$#C >G2xVBLYD,DV A(.-&2*@~C?-9I 1ͩ''6yR>UtN:j+2C/O0Zzzr3V~+3@c]"LH.8Z `Pqu#B 7I2aM Dy{)ۍs-3:GRo@T5%>+9㖒fqB4QeAWhtO9@,nc*DzMU䗢 +K($ 33 kz۷lh/zV(!GsJMNxaS:/o$8a鮩.$}"VzQRD8omoYT"h &ZzK*/DE)%NKO2N>3ܾ̳6 E,s h"mo]b h#0Bh  ZG6P]ܼNR;^)$Bx&(bv/"t_5*Q}d/ JL[z(2ˈ@V_{,nSuZǜ$Nȥ~Ij^=iXTU:)seFwveJv )zfLGrKL^5@.ɫC3Tk؟T&ԅ0*$F FfU\Xdubu1%]*|^+mbjLyR|ntե&)֠D#Fx4>[[#άW[jjvJ2 ='1PK"3_!FV`O*ȓwާlB,i:]r{EЪ²F1"JUp8R(dcjJ&)M쾨7¦DL+JTo.C S-Ս;5a69Ȥ&|$"k 1s)SEWKShXC)eTL2}XQfVX%4lQm /sȫpĹ1(/A#:pph_,eS8 t*:'5*[ ?0i(QzMjΆ&+>91H12!ф?˂tn_AbLtEy)GTbe%#v˓s Ez"SGq$%%PHd Kr *̌MnRa@Q4_Y4LB>#"[ZrD)YY@P@+_!\ZH6FlAAv$^49*pGܰ8+_;1zיfw-szydU*?y/ebY;Y Ǩ.rF ?[7b4^ fͩ%/;#᧠ 8jdc)Z 2+Rd]2NTCHEE[S&H2 %dg?] +eQ $+9rR"-Hh+VK4ƍGf3\;Ap(g1j9^V N_#;FCC:ctуsQT7YԕX&Qu5V<苲ص$K'8( G.WጇP's .=ÏeXo,K'G=ωa,K83KvMOOm>A鉇/Atrs yنuW}+"짵BY΍8k2H,+`5VyvꟄjlM|"VNp9HCY$CM",n1d88&[\//MSdw ާɤ]R,J>&IAd4ٓ#W%}4cteΕ/S.@HP0n>>xFA"ҘB`dl`Fvf}UMtJi$ڌ9 59g u<5Iȁ?2,csYʞ3 wធ :%7gZ`$Y>rdQUV &d]\#f*iSI* K[& x$L:Gδc̓_ ԋw71+>mD$H |QeI?Kg9puJ7pvf'j#flsv3caw =PpWDK=A)3D/KCAJ8\p- /IHc΢;/nlnI)M2o?(HpR>n4p/|R-:1L$ӚEUs&'@PVTG;LM\䝲W_ :ן0ckSN+ܲ)ߑp*&9„,3Pjkg1bڜż~}lG?կ-{=DbzɌw&Xh_Tk1Rx8((LHFׁO(1#n&heT2R%t-X)#*@Eq^< rCUa_3TcpBU% h àeI'!.DeSn2TnrQ20 h @=Q5!:b9,u8CKirS*q62Ua|$Y5fq Ԉ'F*N5xm=[s!%7Ba|s(z7KMPq 1K  aq AThCKHbVK3XhXCKsYǨ((7rDK-U!tYPrȊFrӋ6#mҖ5A^F,p.SdwO ]'c%l%CiW]s_`FIb3T7Y=f|4 "X<:<tUp`BGmnh蒪 )EVCKKrd΄PvB@ D] Wi2MǷib'1amvA>I5Plj36hs5H„s^W E`qRėaرJAUwYXy~FdU }5tCurJȣU*V>h61Db^jHy57)4'8 dN| nf=g!\k onEaAHjT;jhdf-2.9/docs/hdfview/UsersGuide/images/dataset_compound.gif0000755000175000017500000047255512050301073025125 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,H`hF2eiJ&b%j)SǏ -b1S4'S\ңGMA- QLbONJfG*ʐa3C\JL=ߤI*ժhĠzժT,߄(,GC ]{…I$dTtQIl+^Æ#cǂS훷1U[P2]H.C85Tcl13J`ǚQ>|cÅl OV貛L+ }?\зDKm|dO6XbV1#NU-[V}W_fU&1qb8aܐ bPx1`x 7dÆjȡ1D!".Ƙ" gqpgSM`Qʀ4HEjD k;I$nRJio5=4EM$)Sp!UQSW_ݕ$qmY&%xM&֛=MuE9W]p2)u=N*uJQCn>bFl:FGD5&y\mezSE%KEt4 )>:x,L3v&1BchTJ9 K@5]q(tǡVFCDc2 =c&=+/g%qwH&Uax^W5{7)Gy*~Sa2ua^GΧfuyN\e o2L" 47P-u RWChĐP-5aM efvm}h[oB2(F=YOfRm-D(4Q1Lv$%B }rdѕSlw^+~v֍s}`/u{YNsb;s}bl/UTB+U"OBYEBnyDܴfʋaRZP qL '} |h >+i&9,K 2彜5F+c iAJzAoy74ß>n'7pbph4 zYP&f6P [cх0T!Q(YPf ٞF9M 2 E8HzEZr--QD?exD". ]$>qI wQRvD($lMO]Tb,gip%+]O0t!o4:_ 5hQ+^O.U=ZmSV14llS՘%K%V4+f"@=)JdCQ$ Rjzu(?`,("`W fXF|qp2ZQdiQXx֤]1JVI +C30 ֕bfdU +9V{Z*g֬&JԳ RV1EX 0DT^#J}l5kXIN 5};䇑6"m$((SB &Q)921; XX1tp"`X`T_s4Yd &]`ozGЊL:YJ8)x)6MQJe~BRdIG&&[ C/o]!Ce20į~`~2 kGCC/Db)"yK5c:ކVUIEҴυ*V =\؈rͰXÆ1O1RPpD 0i|J5jcWV*G?C{Ƴ1lBꕋTo؂ĺ0iðy8 HB>ZyV߁' F"3P?R&Xd)Q5Jt_4ahe,y:q.:20v/9`J5ݣt'm/Wub:^'(毈8'yމL n, :8fPzqYKIp,ML(,̍6x殠] )~oB(d~p^^BV"RdS!^6yh:%AV2džw71!r"b(T2C )72X]1W WU eqbMUJ] !VYe c@DLkRbA2u85 8.а HPjXY-#E PYz T0(5XuIdy^]5Z3+vVbwg+w3VS845Upu[e'fdt2Dԣ:6U39Pdτ?A14'd\?? ^az4p&ᇒY,8"tO}KcHai.2-l*lHBaf"h!l,w0I,3iu aT]BWU*~i~MESWDUś[ 23dSUTc4b ]("F)%FOb*'S*{. j   )T3 +,.,d⠬I"i >8P"iip9/JgSY(N2٥焱N?Hta"|SA?W~;kU''XVsEZqkx/K~vP,)J%L^t ߧ<ɒpJ&lچ&pA!`q}0^WW@|H6&,&kc8W2S!wըx2d~1BS/N*%πhM. &!,<ℛ(LMcW*EsMp{%l8)76RrxYAjGHHV.[hirJLء)ƒOf+9<Ťmk"mc:m9ow(l]bg::t(c2=@ =aU"tRTnuxT'(Q;*>*bx.À,5@~ CPg.G$* R7zZWbhY JPl-#9cu}ӡxWX*1MGN[CPZKKǃȳ0ۧKh1qgrb^c%BZձDP?$ki<M3ui 1.‡mL!{H.ƶBas&EO^#,$m=(p>^x4gsR\E1PJNUSɳ<6wT5AE^עC#p8 %U8P%gn|*.Y*I]\u䴔oMm0utPZ0 0 *Z%A lz଑PηXgK;c7X!O&thNj0iaC21l(9:=9 a8I5s+}Mb2-k̓s-4$m fӄ=+{?$bh)Vm4.rRض;i;0Hf2HYmI[s,b[i}TT:vEfқP'S4! 4hƠ&F480(GG4C<I"])nj13Qbp\Yb4 qdziLh$&jT4,K1Q1+-2Mʐ#m|72y2H42h\<.&ᢋhh#H#6<DO k4 E⊃8b@9*J 8.έr(+M)&c h%hoѹec.[hIԇ>y/SFLceLOP694K讆Tk*P."Ѩ2,4R| Պ")5q?ӼQ`i#<"o`\]BK\+79M<&6x" -)Us7(QTb^ \nFbKqT((Hfȷ1n&K)2Q$Ont$1+y@.NLMc7t+ҬêJ-K('Es< V0I֔bjVр)nbX晗! ֝I>{"hJ@p #ﲊSK _xEu=S0@^A`X})vmv6H(1'/}a?"1(@:ρ|p`#=O-=,z \!s3v ̉Yw nDlR"B=gLxSq *;HR BثhI]KVP8R6%b񃋁T2(Jl0O &>=-j䲄(e_A8-QC 4td%>wx-GeChֻ1DVI+N! IFL|[2@1O"HF o~&/&( M|"]eBأ uȝ{ 1>*`'9L,kSC:>՗YڪW^ خ!<(Ҕ|7 Jϊ%P,eO yPL#/=Ud] 9(ò/#/I:t'!- U;Ùn9LCNp&Z5gM pVArV3\4V#E9TXQM^_iWIi%E> ! s2Km>ȵQ2!6ғwv0Ms)%;A.Ω#R ]Lk:WDe".MJ5b0 *w&"$>񐇎 rdx,y>O|!&YQʾڂ޴1I]zkiZ`1- CdGڞ'd۹QsН4BػB`6j`}=Z J%f99C 38x'toVp-C)UQ VS;L1JU) 8vMjgx{i)#DU:rmtLHd?zd(NK[{W)?,d[JTMm?6̓g820=EߚӢiN ]b;FJS-1HF".nJjqCjuPdDծ>rWbw3>*Uv/_Z$,h_o)i>pSq%SZki{9 Zh;^2@9G' XWLT OG\5ĀGL:T;x+>IS4"Efxcs*qo?F4/9B=`ъpB/W`\{YLPZyA*Je>All 3͟hCWr,A#:`cQF' ֳRiq?Tjt:3UP|iWd#SujV#ܻ3G"4zL\*U T JuMϖzRF EN_׏sr%|4Sqr2ۚ2zF uAJ:N+}ƀs9/F!wW 4nfy jD%)Q/SHI=Sik,; 7z5 B4Q>ڄٿ)1#䓺DS˙˪3lB-N+52DAO;b:XcɫC^Q W(^!ؗ"ˊ \.OJ-cM `yCc76-0-a4|ŏ4ȶ%o HTJ ƓÝ ߁\q?魁|b4IB,!S:x<9.Sb*$̵C#yY&;Is Q@,0R ՠHXyl.܊FPX3&F+>94YIIǏ LМα+<]P$c)<] 3.8C]s5}& 1Ǝ i™ۊJd}!<J$"  C0۲ <=Y< M\>B333;[R,rL$F  P+#!9/:܈X .޵+Xc&EafbGapcB`n`@b..Xƞ=b}a}8S aUYU[Tne]`$nZF_&fY.b.e">f>ffzenopq&r6sFtVufvvwxyz{`4P&6FVfh!憖艦芶hu&6FV{hvƸ陦fi>~gHg&gP(g͸h(f6gAmpn(vgz0 g5k k(kkfkv6 V*wiޡ酚}l>꼮jNkjq)l!}Plrj̦FgmڲҶ~ZVkjkekp@>xiʞUUy`S@l&ԯX8 v8@jlV8X(olh hl\EX0oV}Xn>>o>FpOnއvon~l@7ol on@Ξ/qlFg&q'lq^  _jpNoq'oq~>+p$_(.\6q[ʥ\.vkm_m~rqqho m4pWms0l?B׏2qqIs9I7P8lqV8pNqx.\H`}I0f}X`gupvèvhx~v{~mnngkngmipvfwϖwpdnjv&gwwXm\?pvl-[϶\rhlFȄ1PX|pe߇|؂x}`qVkxOnvv_0ꅊh+qx}K!8֮7kVwz~Im_ڶ!Ǐ.? > t!f{~m'Eo_S{ @m'r~ZtU?lw\NlnC|'l'G}z}~wzvmB!3WïlG{NHjyo}qj|hhu^-(~&;؇Z`1ed߾z[0= ͈p"8尨(ƎdDŢ0#JW2ᾑĨcLt'E2TX/C&ԇp&S}hЖmZ+օJbCf"紥[R%rGiݥei7!afw,L.J\Ӷ]{8hveH+b]0VukX[M2 ޢbFpE(ErH`]C`0NHXNט?"'\D'Zrj:pÍTd&vCug'Gۘhk>\bLR`zxY%ugmFXW@>ǔ^0eƦ`d靏=wh5'j)VQQ–lo좂IR0c!Pj*aLݠI&(Ct5]daEX8ڪsG0c;jLAZ$Ir M.ZT,[!-oG !& BJђ&2ƒTm\llztBЧ}j瘮=:(׌&fh5[jP]k EeKcfgxvpv'KRۂ%l9%tn.tuTsvK [Mi7Ҭ:iŎ5geҖS1Ү27"PԤ;Td,-*T'IKfXj ,sMgH!r cE߷S>P0y&wUwJ՞%|3$&+>@)Kd :A[f̩7_"5Щ%Lb֜!a e6%%Sض9XM|hTSZ¿?VE 'UƇ~; )(:ͮG 汃QMW(hb(+JZțt@[U e]nL".!e(b.a[!a5H=1}&H ‹q:#KBZDr)"L*X#c>1h E|$ U)y$dH*6/: sFJA%,b+<1YbΤĚQw pFDrG$*[0xB'zlӟ)0uApVNܘ ” n4ŋjv*Kƞa`6&BgaZ+y)jR.ɺ:A}I]1(ZdXu8fbO.x%󨫦j{EHy߽2.A_\9yUTml[e6DR09ë!BTiꝄnPbшvٍ\s-@ZKuWR+DbnЮ7(#Ft;.M֦}{@ URtE45d\:o$WM o_:Ȣl֒DN߇W1 pO|jeiX]i7.O~ -/j،ۢ 6.^%[F`6iK_QqFQIƦLڸLRCKw }鈗y"m[9K]WV HjJxxUE[TENwՍ߸}}EY a*JYaMG C@LkEMVh|^z͍a! FCRuY҅ձT]P9}Rٜr(=X`YL dv(2 _Xz^ }$Pqؠ! ll0E^=[VF*n[UPt+P%159Y-`Zڠq)~`Ѕ`LŧȖEbl EN%ey`}& %PFF"FcEy[ aXQW "S ,K`Q#SEldZ MY2NKbPZJQH2S]E t)sU qn@RN= iEEPV^phcaXaSn_6fX=eũ% ㏘㞐Ŗ &FK-m 6iݥt[pVb_9Zo('(1/G|"#щpk/U)o,hސBh\]nj3jWC!2.ϲ.r'aeY.21r1A+1Av0@!q °Aq1+aMUؚ 3Pj$]T w!Ϊ:U^V؇PBߊ!S9 ]3Һv|Ab-'! pinsyr.K!j/L!F3 yLރ(s=(/0Eep:iCmOFβt"JYfCSWC&t t wsC D*C& W{uWOW5tu:tHX5[CW+ i2={UUh_FRTTW۵h$5#XBOtv_ )&qwOz+Ϊ^R±%JrbۯGVA6R! (5vdnTӶ}I*@z+r]vvjG`2iP`ӵeAFcN'Z38[iJʣ0shSDUjGfG v^bz7nww4Do FW?N~eXw5 E{ 8/P{[#0nG5kю$dUu+^kw%ҩ|oq!5pfs?HW^xu^˩%/1)y`t=9jl#cR89ywR2k~$tutxh8 5n'8sygO1tv+-y8ʹIה9.A SqCg(s}Cǀ2s"Xkr%9`X,D; 6_CYz;yZݺ[#3/s-{'9EG7kh lT\㱈@uHfKDvuruxo: #~%533g0tFW}42m۽??ϊ-5Cy[_?J>3 /3?;uo Odkr3Woa/(@ЋFo_=h .WOeF38q`E8h 5Q!E7#E 1Ú ;dPB;>t"ĜʤRg}!/*t'ΒLB'ʩ7:Y+YI1Nmjl׬@#SeAAMИEWF;+DFؓ-_%&YUKXyjIf պvl]RU%vR=4*5}QH'6ht*ʹ/>T[zLO֍3dI QR'<;^q Ez:p+)6TM=z$H J*p5np$"*;@͸nNƍbb0#ܜz`+<*KjRE.+oDBK*j); "p6â2I I$:'_.+@(7GMK,ԬP:+4&A Z !i@6 nh@C30hM2+X!F5) : MLXTҧ'@ʪV:,BtKHܢ82Z شb0"";FT3tPڢNL\' FR3`ʺDJ|[Fb)nh@ʊ1݃H^Q/kT=tIRl2פѮ?ǟ% =+fي^*vvWe#>mPU=rόB UZn4E N)&U]"^ؐʜ5Ҡ=.N/*6\v@ 17wL(6]ss|ӝl>_F\3}oWI;ȖQNSDz/6{t4'NcvЊb$ IRDTiŷ % dRFXlgHpB  "HWőIpÖ}x a@am-t! qXVnFq\u0zۜlǮq |bQ)5> %D/~\B4(O3%!bu). 3!6=? 2D`Nb\7o)dU}]id=JɞR֚gh54A7NAV(F]c+(}*T M 1TTkDc؃V(Nm Y! o|+|4ctK1u}DvT/f.o&Jr^ҐDA rvl0pr^ :O-vo kTRbN5 7+LDA JS~⋗1jzi]c*1V2~d=iA +HSEFTR`<(i -R\hD0ɅE\!0C ,64QG·­gm,yR3 cHjMtIuX"o e-ՌA<䈙%b{&s$9[Q2w 5i![uu(}"Z7ϑN_xOEED9 njPf69k &85M0T`ֈ1ԍV`.a0ͅ[ߢ{X@*?Y/}Зʌؐ8vm%28#Oed~$!hb!|+VN™Egx*0;'\Lƌey { B *9ŴɓP8 N1MbJ8'R V|e#COJO`"H}Ra,1–L̩}VBD@)ՆN6K=I!Id.{9%y?b#[@$)-@_xÅ[X=_X@ 5]x]ɖwQ>DZz]cט33mvnv2D$b ٶ6iōoqN`{[Y7gI a HX+DNJ4 P[` nus pͪeh<31^?q_lv{ӖwO׎x[~ 7!DJǃw.:Sm.Kj|]r&WxyG|*.t)(]~|jcj4nsWB J YV[ `HXn$3ä5]8ꯖuk)&3:=/. Nح㼍P"N.VOn 6':FO 0 l EkBx/.,$W(+ɖm2Z0VPD*զoo熆l$b0)d<>nT '!V(Ž*╠9nNK O4,7v-pȭ0 -llN3nDqFp6,1?i,3=0a;mU-bNno [p^ Fё ;[ SVPqASB"x nH %RM0+#WǞnnq5r$@,ޱ=^ڑge%)z1&)l'd`o|c#M#{^O_0>R'1,ndP(G)EMpQKo@pj ^1P&ͬb%TPr yb\q+/AㅨV`HRa1a*L@,%VHξ QR*;R-ä73+Q!~RHLL1.+w1EZ y*%n8US*m& VrslS6a0,%"1Q;71{5K()17*EL c \(/ *&. /PF+H#0xe&< 0pov+z Aj0α Rls& B6΍,5?`;]/Ƭ>/93<1R#r!\O CXVP? ⩠ (%TN WBQ U+\`O&N@d 5l4HbsZ!)G[LeFt\\Ma\KSH]!]Vӵ\KsLgF iI'Q]TV1N%*'_?uRW4\ia\uK_vZ1h@S&cU:6dE|d5V_4vJ-VdCeb3#Yַ^TQ!r?O$. w0ei/#chnE!A1T3 chs"R3ֶvm Mc@^SVUbâm>8I 56ƺ4l4T&kmӍ`OhEl'^QgY&\K5|IߜM&+i=eӡ?1=[~j}?yS5X@9U;a.Bz FodmY…*4x`E)̡@9ҫaFRB [\1fM dYp`ȉ"K“,ahFM/.*ɨ A :JFqjhYV[EZYz)%TVgqfZhLKm^[mjn-F&ca:GᤃM!eHZU=ouly4Ss*ɟ}*V(Ra6N iiitDQTT*W~}}hʄ!nÄ'aUyUPψ.u'u~Uڑ`,Ԏ/G[n{JJ^BLU" T)I}EXwF*zdЃL i])>9n8jyS~tmAo~MZ!Tc] @a' +uܑ$9j$֢)aszDD0}=d\&".$ hrs[23GVb.R%"=a:z SWrx"EuATYuP7:ҝ.$Ӥo~/&s_'e)NQC H,5́ fC f(-$u% Da3$EaUVFÜ9OјXdIILʎ!&72GP{TeƬX)8Gs tZZgYL},IRKyMg>7aL?$($c"JZH4qiEqʬg7{-Vȕq3XIZdK(fUibmgbkCD5e6ٺ<4Hukv܅-fAZV .hfZpvY.uK[j6,pu-@_\2ݮ gjЍ-l[V-fz׺u-;jV.1q{YzFZ/gIKxZ;ِ7 wA[vȹ 2e[a*BooAcآֶzK+ .{*49qqC(8Ug->p@ ys@zЂ.4m<ЋVtGѐ&F'LWzЋ3i@zӒuiTOӠVjV{7nCj\թt?}Wךט5MlZՅ5lJvcm?Ѧ>vu^ɶ=jTЄ>p4{{Owoyηo+< L >yw;Wt;GQt{Ko .M|>v=1hGĐڤ&a|yGE^O޾݅폗6}1Pg: O\zد^_(fr{Q=gO߷Ewe|⧞ʠ=_ᣮ}C>+G}K/cG#?/ʐ~ڧ}G~w}ӗa}8H{Gg{7ї|ħzWڲ _ZVzQe+aZ5donvy5z0za aHx1Kȃ J1S K'RaV  SkȆmoq(sHuhwy{ȇ}E "1zAp& 3zADd V0HȈAqeLW ir*+ȁ+(]+rU,F^HhLjɨȌ؆g8z2ςzԘF` H(؋BX Ehz*e荘Ջ :8…[Ш ɐ  )} H!85b'_f,\x#E5([ iʰ # ]Zv;,[`^`pi8Q)SIUiW(bõo\`ߕxer\23 bE-ucE^c _@ v]v\/e6Y阏 )Iyy_up46EccYKY*[ȍb24iX-ZfÕ^_2YYҢ9XljɩɜsZ"oբQIc89YB8 JYR]c˅fye-9-ٜ pƞٛ)9_ aʛIԡ.ZJ$ +ʢ-zx]5Ya-YjZF4[sI29-ט/jGIڢϩF@ -P֞i_Ɇ=JҠpva*cJɤ]-ީf Z@"K Y騧Ք8❽p)Zꨏ  1 ǡ95Z{-`29Q*xj8jff_UYLġV*Jʆ[)cmjiDbP=i-5v: 1@2ЅYƓ9Җ\p +@0j0, څZ{P1`@`@F`Y D󀮡%B=D -qK-˨Sdz{!;F +kD8 z.kA@/N! z\_oP>^ P9J-/`/F)8-g{ v{^w,_y K-\pq{ SdkwnXyR[pE$ע+1ZbkF99 fey]z jC ;z֛Upw[Ϡ2`gɰ*  c KQh  `廅" 7;쀰0a1P%,2 [\-;KP1p ,gվ |)qp±9 {7۰˱`p$\#\Z<024p۾ le-/) q+{1К-ɛ ;p"; |)I^ {@  9+6)1  ^ Kʪ +z[vɵq g{;<-[p‹+  ?0M̙)б9欸0  (\ ̰B댸\ ;PΈ˩qͥ5p[pƾ+{p ? =[LPے?;+M-,Ͼ)-9H7а?*,,-M,+ʯ'OĦ R X!?]]p *+*7p Zݼ:HMJxyED],`U{ \%;"<[, \Lk *,Ŗ=ĚʞYmڬ@)\Z`=[p`<&+ڔ[= ܌0̜ ,$h:r>݅QNʃ̅6̼ lZm7b֗Ѽg=kjBw+ ۰p( H=wz^H ޯ Xw˾ڸ+M‚ܶ 7 `3mMڹ;-@ |p1`݆$.k:@ ?ޯ|C>w8'K]/m w:RI-cޣ;3~ |jκp}^<݄?* j',1  NV` MX ~`0)y5  Uh > @ߪ .` ]( 8P]-֢ L۵ X}ɻ0k| ʼԞ:|ښϼKk=ķď ݼˣ]\-ݾ[^-|RjI V/:+> "=¾^@]S~g519ѻ) j Ջyǿ 2bHTU9 呠i;c]=9@ `ә{\ ,5b5ݯ,M{ f^`R ̼l]_zﱻDt7[%ϱ6+Ӯ/+~<|TX &K  OԒ€V/ԎȈݟʐ Q K(pv$vˠm#d2rJ"Kp EDHh Fm>e&Qo߼1fD{Ʌ>FtY>3cjh]CT]\i) ct6MC sgΞCݺNͰcquTԤ7ݷ("2ES[@<g&_#-Xq{M RoBds i*mܹuo'^qɍJcRYЖLI@i\|X9r|F@^[axwW&hDCYԤi$&n}@J%;i:9 A®B::6zZ9$R(4NR6} kFSrH"4H$Tr}T2D?tDeޘd,IX|OD@L 754((pP ]l%>IJ{&. 1A#'I@2r9ԸԞ(&PuUXcu#h`:.Rl}[6TƪIP NMd1 !e;)0tѻLbu^z^|wUVp׽A-Onp[v5k_?3PSW\@xJrEXw]eal_cyfkf[XlD䄙tّQVXg%wL=7e.\\S6nwJo6lV{m]R?h4ubUu4н9VÆY&qt}㭱|s;ɕIOMt#.}PG4Pu OTH(CP>ThD+:QfhG5Q~T!%)HM:ғ+UiKC1e,(!l$ @`D7IU*ݐԥS*UJէ.JEEjWըV+QVa/tR=G7pE\JVիM=]]:׷j] ϴ׼"֪E lcVyk[zԻQf%hM+Zz6UmkYZƶi][[-oq[6nnm;WJˍbU^u*tjBH[j%+ tkwVdxɻYװ[-qWrU~IW|%0~M=hXx^p#|wVpcؽ~/a aÚ(n.fOש,fظ80SøAg,dI1u\b +yFn2 eWWk`]7_α3ȞmͶװ> Jzy,r {WWEqjSkyr,gF9ot|i9ge~顄ZG<_zќ^7fWֱ5X]jJZѬ~u}T vff ]ela.6i'˾mio7]nmV7ms{n\wUTߗ沁(CѸcrWz}*Zp_Ć& SrՇۚ P2XOb77?.>xBe'w9Vt+Rgqc}SzՍ%=Ovס>t߃5_GY؍z=4'1`&gYsipr ^g|Wgd[;7j:ʄ=yЫUFa~%[Rjգ^}b=T̿S'~ DǗꭃ}!汧~}=Y1ᛴT~ybr?$Q=Kc@\@?M܉xrX @ 8 @ NO߳zx>A$˽+ \( ԏ|@]x (L$&üR+A/=A T " @8p¡ @P ݐ8`Ûx 7'$ $ՓCG|D1?xB"T"8y]Dp `CXBE@ aEV|DPT|CJ⽖H=HFbCe2 " P؄| UI S?S,~ ^%9(V&^a&Z'*n(^=+c4-0(8VAFdMVjck66v žkNkFnlv9vǢFNl>nj;cᄿ@PR~@24?PeuE]''pEPVp˸B ^O鎋|nۘk58(Foon o6o&oooOoVpgpwp ov XHT]MxbPmwD]י('@'xBւ򙙾X]Ÿ90Љk.eúb]]/]d2nXLQ nfqX]Ϟ8Zqjq.]^dxO@sfĘreւEi !e+lbۛ8`zdjnfann#`EhAd=erlyh'y/<b^xy"yЖQhnv\? / ]؏?p9랯xp}zŠyGy_kw9_yvM6msq,f$eLA+?Z`w^(2 Xe}`I}߇dh\'DP9A hvR[` ' Jsf6y1LL9 MZ4T7|jzt4ρ0hA I( Cč 8X`}؏z}pzx*H IxfRS%Sl>֋"zoqF'1+̓Q䢓r,C"HFoРFWs_}Dk'#Z}fW3y[TLmѦ}϶l$- OA|[Oq9U/̛)[IuFy4[ptփJHQcšI+vdZ/I#hVvI7m4SvB޾nzҤQ#ߠWܵ>)o}[B}iϣO~}oDy5jbh* E`(EpPF%W=xw^DK0uA0C>Lx%G&EhDFbR-4hbRe3\XVa^?:`SIЅ`NL[X9 u>\@WFhCFU ^O^¤9MNdfbn8Y4c{2L45})Y^*UyS_FDIHɈ*8*SLM2V8<1<Б`XPC`i:vׯniO9)&e Q] E١'UAETS˝ v2T40IEvBMj7h{$0iH17LBo ']o['Fy#'>WA#``|iR.2S64B柞U^|#a$%˸ ؂Och.R.pPXfDO^>5Y&9TQSC^3«>a K u!L8`5M6@%45<ʼؑEJIbD]OԪ:x>5SI V?0Pʩ5Bcn"&7n"djd4ph4yѨHփ>RBQ;5UuK}գ-tj=}m\h3Ҡ#pE\ސ<3”749tr";> &) B  1a{dG2T=lVMgCP( 8js)Hמ>P/b a .|B`4@`#S= SDDf$Ed .vd(d'&~υ_ % quI}qN>uSq@cW1DR]GfE(Z!*V)CDHYDDN 12(ъ4!;I0e?\2SRIgY`s12&:U5ƮS?IT.ȷ OYgdrVW"Z C~HmE(C{1X DP`$ 4u"p E> ɃC_Ʉ6 C2*U fɈ%Px0tf!12Pe~y]I׈L`{ ;0i3# T9O8@C qPUCum#cyn$ De*p) YZ ܯ4p=(n+eЃp?[/"?*b#݌ +Mֲ eթ^DnLğ*.@w;?iz0,`*hgve!e0 YFFtU0ۨE z5_&E CYHR]pG\֤*MGޅz%{P ,cPF5dD1gձN)cvIuH>‚!@r19AcIb~P(É1"^g( Y62ی0peV Yk$Q f&{wP䠙d_n tE]HIq*jmd9` 茛$܂aShWt4nW('!I878{ōPJrkM)&P&2GN5=5Da\p%(*g(%-\taKFWuf(X\OPzqWi6)L̽`&z~ӕ"!pF+Xǚ25!QCxU4`yQE|C!|aU ׉E}GmG@ќMru.c9uQڥ9[XE!ˡᡉ{סbWv0] !_!5ȭ*bV ~!$>š#ʡ$!)fOU.ޡY̡a)]*:[,Zb}"b!FG)6˼}ǝRiLj2LK،}`&h3sGO J}0>HQyU\S1L#9# E A TGpPQ'd #!!'~#F$(^bqa, >q"$tEB"H.ğ!u (BCJK֢( J)d}WI!ZINaHJZ0>"GyE T>v4ia0!$ AR%RyDL &d2s  Ҡ :YE0t>C83FZm^-B-ZmnmVm>-}4mm׊mׂ-b-Zmے-ؒrmܪ-3:mmn},׾-:.F.ܾ~-nZ.2m:-gEGV bкig0PETЙW٬"q|.r" /"o**\ v#Àod)bodP(9펫chŻ GG fPd= Go{B/e&|o0U]SP|PW $o/GJP,W Vp}D0Ey0ppwpxPopp0 w o #D 0 G İ0Ͱz$إ ^{ =Q|҆ {gtFpELDq |0[qipZQ@ 1q2y ~̗q2hTr11 "gr 2p֥ yDSq+,f}(ESL.EsEGm&.qkР DS1ъ1ST"E1?r+2P_~ 2~G01c|k>q5󩰯;r0sbys'7mD1y sCqBss075?4+4eFVC6FsϮoI;33c0AEMGJ[M>K&PP+^1QԻ>iҘ /[5.fǺCs Gs4zPA?V/au];]uZD0Lu:g^UL:틌uy5[36WX{E,>4 OVdO59T[U3vZuf.e/i5eE]'mTC4?vH/']um^W4~T 4ςR;-OT`lFa<[s9 9vpB>D3i&PvDpf4/4g,6۴`V%o &>o/ϳ:'8_>E`xCguaLj04Dggo};-gs';Qt?DKwx#3GxVSs9M,gs_2%۳6cc R+F=w{NeSc#_;V9 6\cgWe3zWYYF|>pb yf|f5Zo51v;kˈ.64mii5b EXxƜ;6iV ,{Nfo57\qFc_z_[36RZ`/i3L;4voׯ^:k/M[x29FV-FsYsبOϖ-3KFVQ\1{ y4@W~ gT3w ;WzPw53g_LJr[|ǜ:P2KHcro02C w<|'Ef܁e|S4}.߲էg"rg҈ÏFKLgdї~;Go&8]&Guy<<Р {L45\i+] L::@Hg6ci=eK :?vaz {7yGx:gze|ғ4ڐ4n,.8*<Α*b C@*z.d#F5T"bK5ҔL2,|U@J5N#W,l!,+R^ b g=0$M)RݛpU̲Xt"y]rضp`E(QL&5iE"X7^l8EH&e"3u1yaLޙ{ꕤ2+&4NJP鋮Er+vgvB3IE* 1BB RB{ãsN;9FM0GLsî[U+ ֹUcwƻCTwkMp mTn=\54SeiTܕ0*u4p(, as762*0p.)UV}HC{VL4yC1D}`{>x~A$} I*.ydH!vpЇ JO%*@h))W\/ 6.8MzH*A!hgs%QNM\ci^.S׭A QZ$FtG \F9NʐC>z0gxAm8dqc%ɺFUV"ՑYFf"0LJlrA (q}tcn@t$@M1DN+Y͝O[F@4I =ܸFK-d fIQQ%0=23Ä3у&HQ젨( oo'9SzC(HyhD729-ҏKoxH&"#USt}D ]zbz1K)Ef_E@ўvR7M ,T" 5k2}Hю'2FLL3򡳁5z#L̓II!b]"j8٤Z!jp (wLKe$P>($0ijN3h$K.ͦdJJAszB7n$2¤C$ ?SˠG,^AӳI?eӌvK!) `l;IJ3[7Rc&IE'mԆ]Z6ʠ2dK LJ w3;{s.wAO|8,~Op ž^ cYch(vq 1PҒAIش%IN eD DO( J(Q Hlʖ j00>orO#v4P P6p(OdO[H2PXovw[pPOHP0 3Pae$a,LnGpP I! o>0&l)9.XPp `k "C o5tOBS'Q⊐!%PMPO* #W1!{p0`1oHqR$ h&4+ agnKtP).+L&ˢ1pq!QM ^0wϵ"nOP?1!"!}oLQ"]m0n s00D~ 1rڀC%^"Q,"%SR"! !#'u2y7$5P /"'0$]P)p#-"҆6H}"XB G8R,G"T#u o&6&KRxR!QBp 0!'! $2$1ML2Q62K)% 1#l1!S =/_%I.g3'41527QB2C7CMS U3Kr&R1 83/-&M:)9(]5519CԬSS1.%R5 <1|ԢŸ#Nݰ&q, @IBJ  h0|9W B)-5ѵL#6끈xݴDGDMd&EO9Mq!_sBS&;E148>sl9Q>MQBJ 2C[42/RK 20ԓ>O>]KJ05I)6aFN+ʠ4MF7ݔJ0M45TM4$R#t1NTF4!w4t9F0+!* '@?5,:0-F tԵPEuH1Ҥ0\tEzu|XSDtBkQk.mCgs7'rU>o1+/.S!T>q*LS8O4R#"s6ʰ5KN(WIH1]MY!ES3/G493L3J]MGlN/ms8!VJǴ.5?.dSiiOT4vN1rjV Wu8sYO.q5OCRevNa'eF9mN?wH5q;FTqTBauRvn;w?I1/C6^=>GN>lSzıZ#ǛZi>Zd02k02|Md r$Zc *TH,}뷆Ļe~ec$rT~-;H"X(-4#"֗XS7Sw?3};`fjT}e,I",$"}9H,5<$0%"2K8EX3FX>P% ,?&_fX|c"B5vX3%FA"k,XV<8[%؅UZ$#3B?I"S+cSK&|+ܸzID' ‡amxܖ ِY!Yy'ُ#/Y)I3;9[9?ِ59'Ya9e9Պo{9Qyi]Y=yYeYaREyǶSWy+7͆xV'X -)Gl999ykvlYJk 9Ï9 Р9ɖo2-zYz+YAڤG:OzǶ:bt/%k/z٥Kzk}ZW9UzlAZ󹦻풗hIBs F!Z3aڭ:ߚڭZڮﺭ:(lgǰǶ(Fkyıo ;lfg;) }0[?6)vvXc_[I{C{?{g-{5;b۝7#}6KQ/kֳa[m'(:۶9[w۶ֺ){koƲ9Y+W)jav?!>Agg=2d UW췅'\Ex@)7|ýX?-^Ǿ+a>~-k"حbob &p|#F&ޤnfj,kH@Te{Sd71E8HXɒPW }y^>k?;~io {_^};㱒b8lI~+6'P> kbdʯNưbW @m!㓘02Ɉ6/G0ۗo 0&jȱǏ C rh4$'CI&ܧlK;[FWe4E'}ˈ"շ)K@./˜0m+v_ٳɦXZoۺmmܵt;ݺ(n^z-,7pÁF8Zh3 |0ʂ!KVl/_ŒAkr57lƜMP'y5Gb5KdR<midԸ(rǹ-poWv2_Ͼ}H)Nmmi&MΤ(`QE>%UW;ĔP\EXO15\OJSkmV-fڈigbgcFZ_^mb!"6U$&bi*zc[lUo7Toiܷz-b3&(lf2xBqq [<1ZZ떹il:qm0Tshp鑣$3mqu4^yFı7C蝂>-9EeM8˟ڲ_V5Ry:xA;tιTlHn ZN-K3ok2{TfI7Dws 7\>翏.a "i+)kb?aR'!V}NTzOGT%;9n xaۇ&C/ЭnwC7>@")czg,P}Ss1)xD.elIa̐CrU%SEz:L5&Dz%^U;$o:ȕS>՚.])\b} HU7_q#I'jJ1-a2sufMJ,X9r"L]˚r1Ѹ$*ÞjbI$maw'5Py͚՘FKQ&JS572lmImCqYDֈRf+0>0z +f٧XS`u !WjT,%OBNpJ4Pi'J: Ax(Ԩwg ?CРfl4RS X Gfn`+M,G1&@4Ut@`;*%' WABxgH^jѱV=dbj E/{iYpixֶ +њSD$udbf+MI7lc>]@&(cdRE'5%+Rq[l-+( Jζ $\s/kOo¥(+OT.W2t b1#ڍH/-ˌOr`Nb?ydUZYdM{t焗P hLV[z²ݲnywmTS'fX>׷Gn.γ9brznGsޜjdMʧz2)H,%Sz2BJK)]v(CUNs K%ɣ箨)z(V|jyjMoj=KY/8.rՄ Hb+x#)&ɊF(xG@t.+,OYt>KqHlJ:-t4LZqI ?ثT핳Km]ңB_ ʯPfGrį!k7>[RWF4es tQ1)L +]]3.%4lJ[2ڬ^yjl>Y[fkr~U"몑b!i8NvŶf'^mcΐ%>NFnB}?Ӛsûj NfҖ7TpRoVg,S{P P'+q3gdq${W_>o HH~Md8w>a܊K]"槡mO~?S_Я{m/?ׯ??_gx.uflӦ7z H1i)S!Y"Xxg'z%qE7[`p)a`8)b)35296:<؃>8{e.xW#@ф?M; 7Sq*]mFr#Rngh.hC_%])mA9M!u8*Ji0"]"2u>YOq9EzƇ(]yHNcrv 6gR@1sVE!wY(Aԇ2xW1(*#Wux3S؇*dd 9"|oua#(/,LSXv/1h\/s1F!i4C+Yr'2 yiFII TYF * 6Z>nqrvYÁw  ) )*i1:)n0Y2[A;u jX)cU$S)Y!m0L0TQ1b/HI JydƓZroHkđom BHr7.s5"/Q"0zcF1f'h*B Ԁ=v#YMq>ؚٚI/)9*mdAz1;艙r\ə^{HLɉ4iLHfHr^nm9lI8;q*3NRa)awkhw{Yږ̙iy m/Y+ny )!aΈ'ChWMqVWXL@QP qDf1r$:{6C(2L f TzM\^Z-`hipbkXW*g*wrK fڦtڦ 4{zo"c͑j%SiZ.Z.RJkxgzjsp%:ʪQp *Az@ mJ꫱*qXºGM)#I8/ܪ& Z@СIG10Cg0SvQEFh@c$a'3GYK# ر1x|2>)K/*1{t+K/e8/벇{Y*kd˩KGF8"[C{]ep;.KDQEI/X*(5/s(#AG3:(" w/G5A6WnXub)DKl)q*v2S* @vjWjF̫ ً3+Qʬ?Z)۫\ ˬkaZ8ì˽[Khڿ닾 [{O ڤ+g<[JIXj9;кDG @ c 2,vZ9?i̡(s$?l1(ÜK'0 gr0֎!%c7nٖchxA(ecAMiDZ9(S"0ia(wA ʡiWn\ z9ٛ"9Ih[VAɔaNzLȍ\ <2Ɇ|Y/g2ʓlHǔ,(9)*y xܒ"w, w2'#6B4Y2xz&:R(z@[[FԔGt3' ?21Cas!^ yhRH a*IH# iTBI"-SYӿNF*䓭Sԥ,'ICYcNXp=Q}HIEլA BH3m|TtnD3,x6ȤL賄;\9P؃љ1ss:0t}!r?| ` Ñ\}ʷ||ڳM۳ڵX۵۸}} ۿm}]Mm ӝMmнսޝ]ލEҼՎ'- =P 1'9 G:AMB0R0urX %yL #b W'qL21~ '>W TV>;->JbPNonq.t>m/~z>|ny䂾~n"~%)nz7(,{  +Z]؎ٛw}2n# } @'!1p0i Љ|>E*ragY[2ڸ*HeNJ_ |(Sm9qllgu$},쁱:!M8z*JzDmKaǬNr- >(Hv3;1t(|m(N0ʎn$m\kuu(|96ʄǗ,[Yv3hBo_,IINMߝJ8ύc#uX'X s((hQc68/aYRT͜SYhDSHtŐ4iwr])I WrӤ2ըcri * UI]!-w^yb1rPPA&A */(qwS2:TO._/[Z TQ?TeEۧl߾e tP`4} L0h wPF2TI-]SIoD3 ˖fTe0HPM>U*ԓM:O5ibhRs} V,YCC% ڷ hu_=h +ڿoז1pE| 47bĐV/khz=/Ll3d2Be7r)10>tѼQ-L>ћP^1N:b["623_^Ѱo2VS ꍹD6NR#%%b)IZ|0DG$ĩNª04t*B4r? Hϵ*<hR8* I[́ad8eؘ.K~r G3K-IJ0O@r3$gs碩iط -j)7a }#H#daay_v}}>SE$R4(pqT0Km!|2^"b #LR:e5.b} s مPDc6 z%A$xms=4r$ ʜ/M{ҖU1Zc5Q 3K9&WU4Ma*#$=$dED#.D>ŐEjTe;0]-W ,=s4 b2ƪCdM= a$)Q =,})#[AKF#V`bGG">1! ^= "ub6͒Ng+βG#Bqqt`6z|4*>xb>_ qnBψW`u$ mլ][E¶YD(]乑Rx96M W Hl].J1:`$Iõ>e5ᰂWL]s% $ 65*Tdx P18+i",?=iY'HJ2N&مVyޤad$]L7˂bX/)ǛGh(1&>1&/ F*2`i`7\ JaYl;xb&leP.168 tÈS*%{ԽaC0iSZ`Z_ mHoP:*\'/~^jl5q6ں8yS d̰yc F!uEFv>-3ao[{SAeӶ\ n}oA 1Ƭ0TVHEh5)e ENex$^J躌I:02vѽ>R\)Y@cB`GjjПFwDed4vR*uŮxuS d,֡$'vY)cZi֜T>i0i:YI&l=wb}saն'KOX@>y4Lo(D2,IsT6+lQcP-Ms#&w7E!JYCN:՞ "D$f|\zwi] 7.?X?U[ZJ-0@5b4xRǒ2S8!.(Hv *rC,Z0^Y-)')Q[1-}y "1# 3 Ȍ2âY'4}E ͈A M"&B扺QB1#KC½8;;|BK<1̢+VeHH@ăCq@*ֹ w( PX؂ t! ph #x >+<[a ӋG{ `^)X1o-D;3w, ;018 yEҐjp܌Mˑ7?ѠT^31 ;}@0؂, 0P|Ʊ<9ȊP*\ ȸCC 6l)6rh b>AD(rK6RJ?oQPMOF| sE "-퉁b9%ȍ fQ,})qAQ*9)S   T-A!'ɜQj[|t))OŢ⯭[*JJ@-؇dBXt ' B>T$q$躦 y@4?$.ӊ PP P/BP%  M /PPeQ P mQ !#Н P -R"Q5,:EJY -0} 4%0P4O\S$-N7L #rJ$= I0CMԘ@E}FuTuA]pɪ.SK` , \FfLϖ+ع|"H۶h1\ Hy@E@ϝӚ1H%;T+Ўd bgUL iVjVh}VMPbVbebqMMn WpjWqja@WzVMx?%}@}-VEԱטXfʹXzaBd* SDcJ}hFЇaCyY؇|Y l{Ybk'E} ƚ Wyn-ZVP dimjaPoeڡmک5ڡ֢1uVe[YWH=[E[b5[/AOXPePPPbMpDύ،U\c9.&:Va?^]@dENd$UcaJ@TaH}k4`0`^a<BmfY_mV|~-vv_uƂXcq#.U:օ~h2 Ƶ1(غJ>aUUnW<`eG,II6aLi6mimd_l3i vqE`݇1XO5Ufe"ۂTc8knehRc:(D^T(+ӹ#%^}bgֿZgWʼnbmgpgH\3O-k:bǑlal6X@n`eSXD=B`?ETlLمևflޅ}ˍҖ 6h`/L#9_FmvB@0JFb_͇F6{h^-#hɲMnEH0piXQ;]t>hE]}~]^مuVvZ(g h]fKYv4Sx(ShB==.E/w cK&:pio션#?Z#eM ЇFxlj-2Ds\-k"kfFmSU"XD hئj%yd͗ Gi@}Єuq~ng|&UgqW'.W/otV1nYyDE[.msΞucUGnvd?3$ޖdEu&huFlIh}PMrv+gk\q^fR>VYfiӎ0\A:Uco ܘӪHqO#6gqpu](0NbpQwp%ej:4TffC`h0U|O޲afdƹd!E]mՖyP^F1L!n^S5\VlaJ^8fvyiF82zO*l[tfo3j'ԋQIW*cn u'vZd +FS/SWQWPЉ^D/enY7qԞ_Ebcȳ'T- hgv&~"hr4V|1nF[ᗽvhq-ShJIi][^x_{߇ g0X$w?]q^!MɈ TF AbeRIٰ H,M}1#G,i$ʔ*UN"9OF4s̚7s\J4(Z4ФJfϗ1J&&mH5UUI2}_Þt1GfDsgGF7qr34uc]93_}ՃVo2eV&LWl1FIoT\ܺwkΞ51iӠޗ!A Cpz %N8pNÈ qRMII{ᤙ>YfŰ(MMbGFLjJAOg6aRjzUdxyG 5PCQ'(xz%0qx_GQnAɛ#铑mDS>[%ibFƔVSnՓ%*ƧMg`t(F9!:()[J*!gvinL.G}\f2%J9$Sqvegmi5i{f&B*VNh*hLb.i* ꢱ..;{0\0+L0 +/<[/{%;Ë"뢜0'19J ,pf凢fJ@A T{oUսw7K)2 8(3j4{,I]1!ߕ''gГ`&)HLDDB0z>8;dv%;ݖ)2+|i'*kkguR~}oy5r;t:2?NWs돟 ;>h[޹W9A[Ȗ h(odq:גrl `=B5sPB95BHyl' ub`nu4D4 %i|7&Y$`4},,_#b5B,7BEc/hLQ X .RLLr3Et4ET*7)fnR)#g܀$[; ba#>0NX!=wh:sC"󩒖AS Q[B˹GPaQ#T ] E=J Iū0)Mn)};UD@&[P$aNq)F#V G-; >˖lb* ҁR"d01<Ɛ(e 4B;<> E2Ѫ>bϝ,""0"ɜd9,ÀC\Քĸ3=i>6(#&KE/10՚4N=@Y(=pn>"v=tl F !q@Kb[F"Q#tk̿5Vt3ÚP`W-$I7Ab;$8[]Ɏkz֍.KzRo9FN1؍w-IKK DeSB݋\,}[Z\yW b %t=jLBt:"M f2# ̩ޢE,#77"O,U 9t +5[ w:x>GJIJ@sI6iЮ8E d2351\is2j(H d[2.FΫ?ڌU-MHI+=,&r!:t[/6;lӍބ$KxFg~Uߡ8cG16Vv4qQ߁1+ J#g@<2Au#Gb.^KJ6ziuIYƅ.gt;D'$]1v"jBJn7H d vG^HE\;3,x=@Nz.+W_ժIvѦc 1޻Y^[z^y nx=LM,t{];Z8|L p˃l3Q5 1d( M.7sΑku[_5}/P]w@I^˭.g܅`B. ?.q)u=S@neu^-t$zM{)"<)_\Aj yD0h 0ѓ̈́9啀!̈́PǍD5V4R$dH8˓HJ|XIt&ډv!`Ca] !Ua.MN:\5I lQĘ(hqPt@BEYuvy(wMjmݕ;]M!>[G}ލ`X!<\QSS "bT(V}ɗ$@VDqȭDT]IJુGHΕu0u`M ӲMJ`_I(rLx-vvvrcv*mǷ]Dtcn 6!ƞIʳ!Rb/ٜGl_^mA-de!b=ƽ.rJiJ>a]]96 $ (|"EO,1BDmT%iGU.vTEG'D]P}E1\0EZrkЎiƳ9DG2 _%n $_ aaR#hcSU$f0q+njGLRR($IlTh<e]4˸&oR l 'ooRKq&$< tBtF'u^ufgu`gu~wBlg Ґgs {{K{{'}Χ}ʹL ', ΐʜwLhgLˁJ$OlpZ@d FObeP/PHe|! Ǟ4kceFe\ShZ)uI/pK4feL-r댩 M)OJ&9 RIBHI4O,) zDJن\}@Ts$8A|-*]tyGΎ&dą%li+>$4I&P*\~$FhТRMcސAMrQoiٔќN)f"*Sьݍh+I0TjZDܹıZW2l]~iD)"4Vqlf6Ȣ"*zR|c%qWx: 2Pl~_Bq(>鍨H2vSϺ|e],vӟYzEaU < lȄpyha)Q@W~?O(Х6P!ب\MAjI@pIژ Hqp )qKL F.B4D܀Ł V}]Wχ|eibhX}ۜ0yUY[>ï 3% σ`)7 Z^@=i?U]oC 2zjX,nظ |iMs/Ɏ'l/rD_Ƀsr{55]4E_1p"X\ ;4L4PdC(l j 2AQON_.IpxBf$ec\^,ڠ8z/S)0j|Fj1C&챢!qNob!L^ Q;R|k250:.di#yS>+H0B2p?&l0m^VB:E'3!a':!,Oɜ4ɹPꨵ\liG4tI6r(6?b20Pp*'a[Qu B^lW3ȭ6> י}A`wL9S^&Z<7T"W2!޿o  m cj@LPl1{9igq~dlPdw6&Ea @QYڝ7oh*m+kPQFf X`;6#R $2i?уdh^_T57aˢ f_2&c{$J,'4anJ*iDO .QG'z0NGCE`VUBrԧnmdrUm;#:xF@d\C TKgr&fggp K<( zLδ(tbї''&=շ ?}VsZ}ok}_[=+ y2(ygw ˰}Ҹ}hјg'(Vf~oKl(TKT.Hf%bDb\B';-bʧ|{0J&b% ~ɞGo<)B12lx!^(zܮ"]ё] ƪlNy)8LPIb%<—^ICuK,EHP;@(0@/E`(ڢ"Dӷξy] Էy3} RA/aƔ9fM2z&崩&M PD'#ا4AUUdLAYZ5Te]j Xab]i4Ioƕ;%wڴo_B+Ipap_ s`4eˢ-[U50 &p (h.H` 68.E.)enǑ˄>4͕ zr Mj5L޽s=ʸG߽2?Ƨg?=_mpK.vh .@w+0#lbaAy+B[CMB rCrDSqB?0•d @M kkZf[25SM#; Rr eZ( B\3](||p 0=B)<$ 30I I㍛ҀJѳѭJ$ -24RlS.3/ZSCNUYMՠ]֔D\5WWMuQ° [ybfAIEyD%um[axlelhyLB"UbCL-y҄frH&  2E Ͽ5 hX1L h' }n((5w[~9fʛ4>qe;U3cdϡ*G"lԕ|0jnbwf3E#tileVQTsN\z%ˮ IuGIv E'Lި I{KJI5`cM10/q2L*kN" R]RZjf_keW)ϻ2 [i/3L"У1paǾΕ)} #}v{Y|g3CPOz crA=&: o`2n4sMv9TNyLP:#_1u@@L=>Y3a!a`3-cO fADFӡK#P&̓ |laMؼlT,| CTbcxVk*yhl7l O.Yԇ! bplA=i'v0OUMWB8<0. B&0b5 !%"@c ;`댦tT4ũG*rX> 0zg>LA". IFeԏTtA_n~n*UhRE[ےIHtɱl]Pjg$j(^@b7#5t bTBGA44t2B0ۙ~fL>3-q.JP~"&1)M+֏N.Dk-#{vǶ-6Ӌ65ܭtңcGr=c} #oA>'h&?]n^ ^8*x[[R˖7#dk24\Lyf,U?~6c]] k#Gl׶~s 薵,M: a@AҒy g&4#4 HPe"PW0sd:‘E)(F9;}c3e1*  x($-H @ NKR `޶6_yyԆD$q$6F-r@$#ͣ\JcdJ JAđ5r&uցĻ38jSQlYefkRL&y<5l]sWA.$%Tܻ} hخ "Ee6zM c2LfLaCzXZ1 xnNκ6t z<#zfqcɰ]$/O?=HkCEazOP>Y4@lhڌvmhK[򖶭mmten3 撞ov'tcH宧c ʈ(  \8>q:$#ʾnTU([|485c|_߸,4 ,W$ ǜ3q^\=$ t @/:t/LWzӡt;.OCWugWͽu8vGۏN=/еw];YcW/o&j:ԏ4 <Џ 6֏>L (.ŀ4lDC2De&(1I(fk~k2$GV-}$oij|a4P taUxe[iBFlZY/16 #%6,}g p/҆oRQB^BfH4D"0g#R5S6$r-٤#D@>A 6 G h7#Ed8C7889'T&ْu -qSG 2! TKn"$k:-HƑ>҇XGzL?T&ghֆ 2y%l+1釥r#.-ݧ}{BB4rs4BI./;i$  4kb% B V%7Bk h%Fh% B$Bd[Hf#:bG8#F f$VkAXtv"P &q>02va*-M=^0b >+UnTNI/&K|:c ԋ|0 hC@Xr%XF6ƍl?T'%P=2d-ǺoLmhT&BpBa)KBa5K4OtU&4"#x! vTFj%P}. i ic(Q$=u2c*#L_jqLb>kp`ۭ5MI~3@B!FJia [A{d#j#\Sqcb%+?T@)JGhW4d\mbW)gXXQ%EVAZ§v6@#!dR}}@cnHGkX $$ j UB( O)ri2 ^ٸdk[v&.*cˆ-[Ө`jG-R\14Tp3oF~cjoAr|s,3n %&d4G)iL$"ZyD~A Gr2sc[Js%/[W['_ &h^`GL]90>_WbB=o=7^#SIѱ`Uy`w$yNk 目8VBaeC{%$NbF؁khu H%U#.y1EG)lCk#=gc~nUp^"wgvuhMXa4wcUu/Uu旨MEFb#QV ijT~@Dv!'}%켠k eB :Corf+4ͰZ(+4?C<=l0qMpff@(7BFTyAuqO%Xb xm ,}RMunLj)Gu3qƊojz2Vtmghga-W3盂6#!j'h-&=ހ-GJbcN .n1Oc]`0&tB>U#. =, R ܬ̓>O@0E "%m– B5Qƨ0b'jnj=֞qƒӤe8,Ұ2{LN|Zy.]g;q{e;.{O ζη[./"O/Ҡ#a 'c:Wq. ͠P o{?PV-q\o>fc`ŊŰ4DP YmOf6=C cFo/诮lӠ*Ip̽Z{ZOq> .g*]BEoSBQRu,*nױHyHVA bW$z 5vo'dD8DXJfDQ tv;ibf}}ڞK]ؽ^p ^ޯ]?!ݷ}ԼAtoE-+2=CKVZװ](R||Oo+kfI}nyqp1=B <+IMlZrAp (UA6D8S8 %mapa(Bٹl P%Z&p/ _^p"f˝2e*p`(e4)dhpᲈ+V@b mQnj I/ʕiRFR>iZy3Lj9 TР>i,zԨңBA1%X-1є kSCnuj鰨ܗK4r 7ܹtJZ9yc*_}.\7bwWrjɔ 0 +qNѩEwcԥF!#kQ'nE/VZX&qԪD|yצ}y͓mW^;jPܷl`z J qm;& e7ҼilD\mRByDT3Q1 :ȑ2>XRj PB"b4E *"E$=ƵM={7hF&-A$YRLAXJ:p@&UBZIQEmqjnH&EdO!hn)ew>vgAn4Uvct ۣ1 {e+0s ɨ3u:|*Z]D"-<]>z% VUs_[Ȧ2/e*20M)OgDdaj*}8ІYh-P,PI &>8ʄ(!8( ENتqVV*cd22pV.k$YDi3aVKqYV-Ukl.M)Cx,aiVL+aNn 6\}5\ΘRYMڹٙ=m_PJ]7BCIsk hÁkw%'jq]ppW|&5aDV)2ШM&vb~׹+y8D`,cAnCL!+. z$VAdb!-%OXtQyQ)}sƉ=zӡ,CJ**oog'0{ g,gLbf3\LmTIڔ%NלT4 ng0OUĈ@@#ظ0b "pAMGau%@s5?ӹi ܅A*F-+ p0p!eXEBhTd8v jz=^O퐢HZQD6*F >H# ˱l,-{MU4,aJ#5R'%hըMB הJ#KP:c,lTI@UZ蕁)ahרXH -ءK~&m[:%faoDOKCzFI.RˋW44&|4Q. J@!f-$S0 '{؁e4cĢ8 H€މd N0LfTݹT(TV9Wbf$̺RJ嫐 f)2Oj\ߤ<31EoQT"G`RrS\TAO":u8pD[Hf6 $|1€z)(eD" 8I1y˒Op @ӌ6p% A J|2 )w=JT,i% ̆dٕqhk36'Sc..P@2:zx dӭI짢軉'չlnJedB 20KtMDЁ~S%:p10»s?eUwl+iI/$ @P$r0@/q@z1hLa*&`+~BH&{ ,pM@7Ԅ7}t>v?yϟn+OSV)ZWҹ,txCJ|m OnɸA ݩ<*C))F(v򊃂 x h!NP0 9PKOo8d:rjo8,~:Se[E< R1H^NćBҹoB\4%2О\>#'9L_??):F7߿>ѠmmF臿b$? ?g'~~ޢm~ |mx~!؁$HXxX"؂(h#(0/x5m Ȃ8*DXX NׄHHgB(%Jg_Vc]X"- E)_DFQ!]fdv8`}re)!/xGe`e"'o%Zw0_%*7xPE@^Hx gN &i=eS`AF,5_U o {nG,2{p8##sI@1>* `gs4wu8Q]\'ST!XԨ* jBv똎ΨXd.:c4.@G)! 8G2  vPk0\S8 2s5I?j5 ?*#GFJBERZC*UWJ[=:s< 8:Z\!j:94sڦV* 19*%Z#yZi1ʧ`N3ː!2˜N i\p ! ڔ*0gF}pZ}#؏9SzteV_zan^2N ȩ-oɊ- ,2 NgN ai6e[`L,npb@BiRgU=YT-`ƆjP-D.1Fy;gZ);fH tWY` \ ]``2"{ Ƒɲ+* -/˲3W|hA1GD*2@vAɆzlIh8_!CJN[CˆH^]KJk2b|}jX0QA10nIp{ w[,X!aYJ#(N&&oUA 0"90~K. sTqXg \ 2"I!}jP{^ņv1tpwR֚HG7u/@I Q!-0W囜L,K*K W䛜   y$ +ʠE  hE 5p6B?°C{,F1&`9يp {Jo [S j1:yT 1DVBH|CM ʰ':DʧcZ\#1 l#ܡ6"m\d| 5F qmOy<{\|~},qBVŻ_LPt 0qBPyazMÐ&  BW|,ċzˀ iQ:,0h5 M˦`#a \HI | (TLǣ\1 @ r2I\A|1Β/(tG H7|LCGtTU$ g50:Ew뛜櫿кݾ -- =ai.{ ]0=њ@;*ȣ+]-h j6r5ᜀf^ɰ.\!.< \pUiU<]N]r^`o@Z)n<])۾c0:PGؒ0:EA]DFFFKB KH:. =.cNeng.bP0??.:6> + fBr-0m rNr.y?.~2Nb _^[`y {Z03 +͞NxahP>e ?ʅܕ=J͛{~^ w>Ğ W ?U@h.~@5bdBpkDn&NmU'E # (o`7E0 1#SnG/~z<搾8HOcNo 3P]OW޳ `[Uz-S,p+h&-`eč [aZB1BX+.+=U7, ,z=㜮 Wݳ$0.ܾ #pڗ^2"o8/v1T!<:IwO D Op& k>}ү oWϰ"6%/8ðh8.b?90~ĝ8? 2MHРAI2L# Fh0AŠ!&L(eÔ c1e(OdReK/eL9fLbbFr AitYhQGe"UQ~2Y5)ѥGDLM&[0~p#lFԟ#cj U זRﮈcoד`G*V,1#?zU&٤ɔrVma[~VG/ӑ'dȤi&b4ԻNbir83֭ȕeeTA4oߧwŏ'oˈRƞ}zPگTOݺyOZ0p@ Į4?Sp4|7Mpd 1v q8@81,LC&ADNDC%y1FY-dUTFgtq aTQ3d ވM(J,3R+r-} CL3(yKD6tM3ުxM5s1PCL '%܍L3,.C0rsB0 I7@cL@N?E7V2A =zcIRRT ]O{0&wM?(0r! 7 C/UBmS[*S&8!SncG?D!!Ps9@!m085(E>12a 9* C/B1?< Q#"h*Z?^gC#%egĈAe@hFG=Hī4 389ss4g:hXک>zlǚ8QN{3'=@~svNtn(D'jъ6TgG=Q(x.N|gDCh!:Ov<纲tsXFS߳T,#Re*t*զfU[N4Uh45SMXzVbgXߓ@FW/M6k~ZV7pL5B4M5zUn@RBM,%2QY|`sPh_Z-(R{-=qTZ.Un j>xz4 "m{B.zb\{1.S] [_=nP ~ul+[&Uw{&xUR״6lMw6hb^/ > {\}a>OezoFq4v c1ivX:icb9=b`}d""F@q~g]Br@zhWexU^6ESFcݬf8Y^3L/Yo~f5y*z:`өr64tl~kNZ&0`1ǵ,o{S۹ǻeG_xօܹN:*|,_[Զ6lkcɎ \&zՆfvUCakv{lCۚf1k]v;^I-p]~-zS-v?[}7]a w^LU|I5~h+Gt|eUq"c0pd"+O9Mb# g 9Es1+wn]~1ӣnbl8W?j։WF {腌e\##맦ڇqax(w sz-L3Ӫ?C4;h`453<úh 3$4A4+6#1+0$\Bx$,8H{0+X‹K[+!t[2^´*zgw{٪<ū=S<ӽ83>B+:Ck DB6;D@0} 1{1. C-sk-ˮ3 Ï [y܀p>?`,c8{8*5kk;<iv`F1@?s#Ӫ2vyy@s {҇e2ek+4AABA}Apz(~D0GH:3||ux*HlzGTij+,]>c%SB(8 P8bPET˫+{*ȓ󲩺Ȭ*è 1C5ҭ7-lJS􋮗\v+Uۭ|Jʦʄ㭬.yK:S 惾3.|;Ā{;(QL-`{ ?;1,SǡᣌIBPA<;ЩsT4PV6DLu`58tS.@T66#J4SӭCʥ7⣫ճDEܯ{O/;bQ*#|I MIXSҸCzN1sW-yB}ba8uS^8asaSF0M>ea8^ALЬ^b|xmCIMpqMT * Slj"HqQK{y'N}UbG$0}uGGH$U]Gv:Ϩ*_=3lȀC{)PBR80 C ]B+}<O>([4 uO{!P}A~+B]+ ؂ʭX|?bC È=XQزꭴBP8TS-;O<˹N, 0*&T8|x9WCA03D40{܂7MTDj0'e7KCz N>z>C#/8 #UM) EH( +XZ^XLk^! gzür{@EB.ZW,3HX./鞾r^9ۇG&ގK"*Ⲏ>Ԏ]] R݇BC/cF0F@-]@\ 艆P DhP.MЁ} *@@Z0$CFm.~ecyS@]^my63Ve+ _P0:$co3e&DZIlB_N5b?@fA^IHnO b~j5lnkndGˆo~Wd v ݖȲSf;4;ug} gP?؅I:C*gQ{ yJ,;/pKJrK K>o-:z sUZܸTai~E5WQ}P1*FjE~Fjp&mk?ׇC8E}Ђ%U/a`WC\< f)l{ՁPPElM@ m |N#}G/U?vxh |e_MH~ 0#~ ܄heH~<3vKʨ@?Hۯ~ Y qW hʸ@x~P`d "5)Si؊M A A# -M؃Y`Y2+tTF%,Dˠ"aLqYM?^MmPTM- ͪenJHȂjXkBZ5P nWnZ۵ʨ~U5]rU(M+o&Ε5-rϠM)j8\LS(Phs:զQkZ͚gPdg|f%=0uTxvzͶnTZjѢZjJ>|1ńײ`/*3H 0H0Ii쓡j {"8"1|t>pq<2D32#8E()L@&t!-C?*\MS% -+* =U,Oq$(F>5mBKgHLrğ~I@M4X@ 2.9ԓ@ LDf= E2~2P2*<tw$ĭ2ARC 0, IA앸ơ"F\ y믚 &B AHm.MY v/A6Jw"'*M;*Bg4@͚a!V=6_%\' V%C͉WaaerL`UXh1<[W2fXnIO˜ɔ"qGM $Vd@`ˆA"U(hU=> Q1*H8@k:2P%]ܙ ,* ^Y &V c Zp2&pzXFLX` o-B #$"VJ&÷r")d%#.0Z476r\cME0]9‚D^hs*sxCcdYX3U2 m.㙪Mj%p̖%81fF& r&eInv2 Wah ]fvC>gi a Fq/j [Lg9iNus@|0`&h@C &O B@xU( ЇjvDL +ԕ@2OdHL UtQ1ZM &(蓥Ĕ*`P ( )INrB7[LYƷ$E ~$PkId&-tKךV&5aDZCJb,J$Ű bk)XLA`X*THJZ% =ȱ*h_UA1 f0oL -T Vȣvr0%w)\26S b۾ؖeѵ 7<*JUjы ^akpHfncޭj-)X2 ɔ XWd u>0 IB0/*la ;\aFD y1LBhbHkxC } I02O  I0O fG?zNH )Uu1TpT,1 $/ `N85WTB( :-JiIn5M!X# VYo5o^Oδe-#IAA 4Vҍ L* ~@ -p*_IdD][qB{Q:L`1>`Ab=FJ0&CƔK2̷q yrn#c`~۹j$_kU{6h&7oN\7 gf^a/%ͻe,F70ax8yAs ˼½E/̈hDtJЊ8J_̝L"U>a:&fƒ3e#$2GQ%jz # $7w Jd`6stwXTS\5T +F,VgAu+*0[ ]-[R&EH"a@1nh0 eMvPCn:al&XKCaV>uϗ6Yo9ckN?N#}E1`.=%mS+URmXӬWZq, }"9.`]hXl ~I܆HxlsLRv|da(LG 0BE0`20C;Ѓ<&! ; !21$1PP>?UH·ә:EّСXա\ЂԏOOOV U$]J!=YMHÕ# HDdl B,Kwԍ\RXB,M׫ID)N(e YI&V&jwM#Z\p #X Ŋ`H@ eXIv|˭ᛸ_c R5[6qpeuR6[c8y1zi`5ţ2ٗwpfh[ :، + 8 9i N(1%m E\ " %5"l hI$lIƀJJd KHn# tv!G \$aQe=CHGB@SP]DT"VI`e1bՙ0*ë#ȥeHL?Wज*^&*{,^M,]&:qe ˕D`Tbd6̈́߶ZWDuX&߈bdqm,Cm9&G4m̌s ^c&&5Qx.٣Wz- y$gxGrLe̍JCzy&]Mg8 +=wF^:lNG knfEȁ5-ط, *R'' ( 餎Od…N儞!qǫ]1N= e/NeX(YZe分(H aiM!"<٨|>d  2]e,G |" ג_W g|2F-'0*#aXtQbG Nc4)v's_qt&o7vUs U[5 y`4gi(jfdb2G^ n{*yt6 ^m4}IgPoMőmiljrPD4-a\ G*GYj-3g3h_4?9OƎPQR*E=SRZ2T !"TMePV & %WR#NTfEʥu4d~yG]fB)ťRhbg0mj=ZtQal&frfvi0b X4 oɛFFfp1GVl'&-g^HqP>>ywfxRxrmxN`ЍYK.hdq']aN2E1*Huhmglq!Sѽ&0QNi 1d”Hutކ%Hi #溉\:ռh*bƫ"j!d͘Fu(3trCNMژjr_B,h* FD֭b _2LRb$D%`9f嬾q֮׼˪Eu _`8=6)BJmBd̒1^e` <ҩ6 Dgy鷽~݅ٮ,RiHdm02Vp3O8ȉd2с&ݏZ&D]Md@nSV&ȽzTM #bnN>^kچʯ,rh(,~}E F1gB q$qfV"0 v#u [\[(&-WFJpLu)2t% rLcLl*izi^A~fobzkASgBp%p84s-4e3 76pp 'R%=䰑Hmn+VOevlM=m:6>,hF$p-n4֔ ֜{,HǬn%+\|pmE"Dtc)Gj$7&32dpo-%2)+!aN t:-M-E4֚svq0vkDgmq\E'} D$cVy 1a|:c/b),hB?mH76{3O-?VfŶi0< 1ζEsGq.+1V[o^$Aj$u6h&6o4jiRJͅ#ʘ( Gt[%LOt$|'B#XEvt2oE\EbtY2$FomҬ>V hc jKͨkcKlDhx}jlf P,SZDZlFb-]r)aA^k_1,VH%eZb+9'1%-qdrf޾E >u{-mef*iA&DloLB0E!>tJbR񡌘 {!YJV.rYr2+u sQ(T@CB4|_h'Dc<Ƈe(+X{;+U Vk;$&ޤ z%K|Oy廛ɻ{??@þ \Kos?>K h gOοпO4b A t(G Q 1^XpBCBT8&!CMJ42NJ!nѤ̏)c|SÇ!J:'R8q!ӠIM tbPF!ހe֥Rlڈ8̊s@16$9azˠ-[40#M47ާqdɎCM hs&{GɿϜгl3:뮱;AǮ;B较B LA ܮB ,o됽 .KQD#bk9Y9 CP3dϱJ+D.;'1 dD)'ϿelG-0G)1(-#,HҘd1@ QmlS H#;&0m8$hg2DtS&zpPͿ ';F}lHRi\'V#iŵWe~ X!U]z-vQ^UeuVnj ]8H6]vo!q3NueڭM؃U\5uX`!hm[f[ewTͽua7Xs?%nY㎍cZdlcVYczXvvf=蒇cV _ka]elz!W|^?ݦ[;lrw^)nf}]kdևaseE7P1$1dbB# oQ<+=#85x#V,.Ni,a@ Xh&n]vk`E{W?zf[zvyEu}W\zxjzѪ[4&ڬZ嬖mydײ}A7 8PCEn蒗1MOREςr42f{誟=fɇa8jpL`٧E/2|Y|}?fm9#R}iˌO >m䣞<kOVP P9]FWet`3wq12-&b i(&&!@mdhd'\Qsnejocw E$qyTG#*]Br8 iyC4h.#WDh$itH| suBQPI׭=nQD '!MΈ Zזq0>|`'Vz\^ҴBba)B3:`&I31ꤟ4,z*Ƈ3lPrS!s\bDQ1ʰ&1ֲ6*Z$1S2È54^m ~)k0(Ί 53p֍䵦=/X={N0] 0qOmk@Y 2'u&͚6[?ȭQe:,$\y~0ğp*E! *87DP`U1~W!@.TTdvavrRbfsu?d8uQ>`2jMh]fX  |ŶQX.fgPo5 - ݮ{f4Zƪ7RxP;Ga͹z뜞d7 Ӝ&c6i*}&xT7Ηc0 che*[>}OT+p.g֘C 0H հPËS:}8 *ݘ]lbSא3UKwoXVp8y':$qS$uz=숊VF>Qa,C'ͿHeF41Kh`3斧|jqaK4/ ؅}№)Nv/}j}wJ ɛjBu m*^P_[O: ڜRt6A⊱Ռ -P{hse^_$Rd n+(fǫ̔Fa!5ħj p9#Q(4"nrX P0h(rQ ]L Џ(.RI˾cI ڐe\V|tKD [:d킥pCL… P PٮĀT Bs2e `nrNO (cQvc`06jT*7A 7pc:edJR1  ʫ/͒fyTEA {3tpi˖ÆhE!1SH6r'Uj`9a1ZwE1p*▣),=gˍ\nkm+Ĉ ! q7 2(DŽsx0] kWoT;Ez`g2QQ6QeOx#7"s#>s4)i2K'#`A64UwŒ4e BA>jH2 8AOcN P O4Ƞ$4NpQ$NNA €'uOyJ2Єo((se:o*cR%$5RSPOaN`N(Q%7Xg5XERSXr 5"APUPXF"xI+ t4NQ.L8&bFsis!K q }\~\+cJ[!Nmʫf(esɖ)Vn 7i 04c$TiU;Hŕ6-ONϐ` d:a`A4e`xS!UzDI !PAA!a~` @!hU!jk!l<9FFBSF2pkGevZv@watw`pwRNlVMlgwNutRv3W P@ws/v&< 4kV[vjVWqmv6pCcփkXCjle&=Eo {m75 f2zq/(72-JMg$/2LЮ@b#=%-{Ky&Rt?LُB} djIǙ2Y`H5;8> 2"nP&AVUL46tq#OD7(r@VD5ܵ](TWN!wtG4St?a vB[WJSJt[S#tvHX XŪ!Y6Ax Y8 96/LhY ˰6Ale GeBaoj]BMIȎ4!S45N(=k]lGtG~} NXX&#`!GWh&5*tO9yuA%1CGy~I[ʐYEy K / 9ٟͪ ْC!yu.Y7g*9ڏ')ڡ- %Zx?7a97ɹ)Y[jiMĀ0h=Kvz2H66b ?B.51N[RQI4!|2@&4BQiPv384A4~Toc Z*W<i4d º``Yk3mu+Q[ٔ:eQ緮;xp=[j5T|_A`.îBA2Su VaAg5{ )_nu@8fDLD%?e\z; ADej?k I=JPQTK9Ω7d(MmVC_ ~ޥAA#<8ȥ ckC,!s a08ǜ$y;.bDHX,xY[޴969j]jo┋NGmmq2ZK94ՙWWA7HcS街 lywTqY4vIy;Wh&6Y)y;FyG[Ӄ)XV07ڲ/g^Q۽RbgE= cRY\m-܌|fXY,`i&.cZ`Y_~S}`w^oW~m!m|wo[Tf:x){Pn6ť 0Y7vl|`zh 9>x߷Vi B >bͼ֧͂ħ,#P/cR<|‡L6b&/1eB郖@\ zXھzVzEhҟAzPRSOK,e8juE0ke##&b0a2̹sS,'c>RG8yԧLMX-M1\F)C]0b%jʌѴn8TPlc'+y7͋X$KhG3vz^>H9bs}k[jԧ>ߪT;xѫc%,GN=PLĝUZIWUv?GVAmN]u>aUBqSrTy}'_=Vs bHQeIԂd8 уAЄ]bHbCA֓dTViXfevtIL&2]#ukwsAņ&N[UcldY!ahi"}ہW3n^xJYSt}茆-w b7z]>ߓי}1bHHm坡JیJR>}AI`{?O'wtRwM ^l u^J*YnNg>ŚU'szbrWy^8,N޼>=EW})wIы`b&! {ȾJ詅ׯ`۔hفUCs`|ckr(EpFTiDm̗֬tшVcQ!N&Fi= k]-0^4Nn,˜P]~D;q=p}Uw%;%UȽ*Si=.0PA|a/u6 nm7\{&k;6U+qFV^y(n8Yg%ۅ+~S)YpbW+"dEA3%$2kpjXxM(yܡh,DYTC+w!8w"ef9Đ MJ, Z3K24vL?RR;;fF[OؔtڳTR%3˞t=RV2q-t CCsJoX{Qv#PS= |',T0Noڨ K7F1<ԠBe >4'X^h>Pf'+rxf\ZdPf0HЀ,1hT ibykF$R$1)iD!|S;&ѨT$}X6\ N~b)>R*(T>>gx (,EF5" KY.eƤOd] 嗿kg&:+DV\E)}kY0q~]. ߭+k (v gtC%O2)T X3#S4@a 07T)YaہdQNcp0rb#Ue,ISJ}Le1]SM] WSͯV!pG4r/ ѡ I2Rio(ZO r$ÿ|e☣Kv(> #SQMV$u,=kǠJ|QB</ZN^\~R<wB"UE2@pX& JPv%x󠱸c I)8LiTJ*zyqz =Ae{W.5H u韣Q`&,Re:e-QD|K*1Vf:wWTc;:C'U͢ 2YDzܐ]@"ȇoIQBb e{Z>a:<9[iQu> Uf8 %$Lk%uVbb1``L1iJHm*-b8<EփOIg! qjb:QbKT}0)n>LE&6>gEZԈ2<_dfҝ KQRݖ({O@a㷗uhK-ߢ/.RwCOd i.]ֿ3sReg.S1EC X+*$T)C8RrH /YoOT/~OMw8\8 4!tS{.V#E+B@# 5 8c$tİ$M3%Fw%xMxy9@[p`a 7 ppnnwTbmxyz(X|hm8xh{؇ȇ~HX~.Es8 XxHȊhàxx苯 8 (hȋĘp7T3`@a~L6%j ˠ yEN9xP(9qakXzuk&)H^H(zAz[{il]R3BWI]"$DŽW X y%y )h34WY3% IXyL!$sR`3{@ 嶓<ٓ>@B9DYFyH%Aw@W 8L-vmdmmX]0yAd 11X%uA1pM5d`1(՗  ْ)ɘ# Iy) y%ɘ B V#4,ٚ9I)^uٛYjiHI ƹɚ3==ᱜmIiiyrɝ,A5aEd4c3whCH bXVxUOx(y914^ZpyQd*Ux4N3#k1``Š `3@ )$Y@)ʢʐ1:*j9 1JJB;>7ʢG*?:h,GZ NovB@4,5]z, a^j`ce gi k0WAʐxvJ| {:J}zz:'&c .1P膩ڃH^ :JJjaz=ت*m j=ʩ>x:jƊ&joZʬ:D#@Dp2pLH8V_xɖf[c#aWax B{(9٘院ii +9ɰɰ)!e3-"T ~p^XNGr2\j?}Baֳ6_g.Oqse6QL;\/P:d?U]IJiSkBwҲUQS-wf7?۶5"C\+i3dBbb*@m83?ܨE7`  15;Mt(RB0O:H.*{LRZ >DjJ:@:&zN + PJ '6*$6^s~\dvf…UN;v7HUuZDakFO$ *L_VU REhQK˽=+'1Tyl=90f*˵CMtiqbɵgE]{Uk,kEF&@@Ah1LJDsbtI8ƓX6^"YMD<p( tY0 "Đ)N{ k[lIjN&:ٿe~;>I`pft:̾kHwv^ٛ[}<+3c_+~ t#ݛqj7˶z74sw]!`{pMK(MX<rY4A dMQ*~ 0 $K `,ː ݬ.K[ ĭDβKI2J-μzbF/!C1 ">ܗ}rWÿRilaK)Gk<]٢Uӏ +:=L] -kmRwс3pb,bR} {>ʀ 9P3%[` 9 `op NŚ.ߙ@ l=RZ"ڱPޙW!LZ|U6eQE\o{7%U6e.{(bn+r+<ΔlWW@m& ?Ôn}e(enY]B0s֖.wmoBBqLB2ެI̡-PLf,5Wb['ŝt/;M;þj{|lwp[V?A9A!3?0˵(ȶVXkGd;6N^43ಂ caD)^zuZȑ"C*X%ȋ)ST1}Xn'e(cI`fRM>}TU68RVb2M1E -12PdRjP*%Ty| .\wU_Prco`@Ŭlp3o|217c 71ԡQc7.iײ6 j‹zęv0.;x\yrKW2GeIXOł0[|NҺMwB# ɸ:Xy<Ȭ$ji} N,B0-)A䑯Bo9}7H"M$h QĄh- Z$2ɣPpa:qy`ev!Q#hf/}n#OI@JƢ@#:`4Ҹϥ03PAJhZL`L0H! 82I@ CP8{^4382p]Ҕd6r `iMX؞L6e@SM@\PP=%2Ǖ\p4O!N\kn9#]z$Ag 8hÈ͆2G зlAч8Jbzl0ՕRʅSDH GzL }v!d9$lW;(HTN#N}°yEHg 9iǓl1e!bZFHF{'I Lb@AnPJ#h,M2YPzbΈzzܳc%_bU=R36:#-Ђn%"&f:äw.|;h@cޟwLk(}Q-@>YcqPW0/l+I$sIf E|s.ɂ$UwyNDۛ >!0 20E=PH7 !e&TH@4xibCQqhnDl!"*z<{]Ð5c&!LENJ44dn{s 8Fg<۩i@Ll8:_sjAՠNsʈe4G:ЬXlh64dO)i]W>,c[x"'#Jz=9޹ ';+ӷH-+xl^s@z,bkI|80(9PY!iHj%B$$ؑ`G d/ؔ;\eD G0S3 k.MDߌ St}RlT daaK(S\x}ã4q ;"BZt((y\,.P  nbvCFcPȄS$P] ²})L^ZF>'؊4ճ*:]2u"C5R$U5r;M%","3;ɯ%kԏHE;m_}XJ>Sڌ դxSb(r4C LO2 Yd 2^ 4Ax^de󲙥GLGx;,}_s'iI2]@ 9H8p!F 0)z|"gb7P2%-yT40"+@ 7bS1^%CҀc R@rԯ")ܘl4t]eVp`u]!uq*jYG7>1X PY3vT O>;/o Ɛ [2ݲHAA1eE+l1#m^g[r Du$Б>>%k:O6-<Š3Sml#7")z_WLk/4Ullf0?iC&7?(E۝ei$~h4`̓ ZtaCkT*ttǑK}j l l:a`O;%jެ20ËЄacW%6 #Xr󸅧u2:k%ʉtzxmd⴪-َ2tfꔗ :PH|U4+M p$EQvtővB-'j2 ˙G[35o;ۯ:R3Ż/(5`:ʒ53*;y4Y;vJ-Z˃d'y",+2I#Ⱖ!? 'qڑvi, -;)xڨ~ɟek|Bp]2;Ac_,93S`,hۂ;1j >T6S4$]HDv(q鳳ݠ+2≶I0r=>y-{xLLHؽ4Hk 0Ey7R _ dR4932929^8@e8H$"kҌs/vIهp932!,Z۹8B۝Zʯ9uQId:saa3 )8`@Dh SQ:2H-`-},}P!Y /[L788m\/c*dIQڨti7r# 0N7c{[|E.P pZHJBJz $: y܊Lh Lڠ8ٱyG̸![$#+>1K>BB=¹-SA9L-NJC 'A,E/04ꫠvJ: +,:ӛZ J 3,цò@W+pk&:S"B=Ϙ-ȴ 3`?ˈ4==]9ܬѹ(CPc :(:93=v̳r;E4QЩ#rl9xalb? Sĭ(9:hIO܈1|39as ~$O8H1+$K y P;6S,|8 Д00{4 }0b4d)0eT/a>8Zyky <@#32z,d< vaJ- O;˹*V.^9]UkR2^ެ9"q%QAᴙ2VӺX:f '])YJIsnnMh^m Cad6\sr;i6 H,*Z朻g2E ˢue9Knh6[hP64ϫDiղ>=_&ޥp* 9Nk/Y0٪ KO#T8bHEiÜXdh(@MxaZ?ש$@NۃQUg,H\8kGӻu#'b,|m -e'F<|H%Vn=%"A63-֍|,"t"f95cކ<$.=>WV,P &EfoQ-2sx{-gaNoޝz W}@d(WM4%qW&bbf& `}$Xq>2;"di`K˄Bb9m_ 1hb!FY7i|j*֬XAi/S48IJ+ګSLGTLL6\6 -pB)%.;2q ler&0c¡-LfeG+3bI\̳τ;v;;5՞6Mxkҡƽpѻ;O ݂,Al3"ƪDQJHq;L٦dK#!I&Q|?CTyka7tCRFJxtqQdI~g^Cޙi%MQP%KUĕ0D!IaC&11Iiz*hW0LCPE{}O}E 10X22ev,󩨧Zv2aȠp-Cf}\n-gknkyn)GqkZq-ShDxD^@}UK#"]釓^!K6.M&Q .ӮhPD0hM=.yU]4<$gɋiޕ{UQ{vX&YQjّ. r{YBW9Ҋ!Hy`M0=wkmu;Nww}a_"2t>I@Sb*Usŕyʠ>nRVWpUOȉ&g xK쯲M[[mqnk"wl. V]ԣs E/҅b64w*t>Weeq#{(ъvNlovLSngA[T@b(e+aoK[evyvYCCF7%C:O^S{Z{~GAD^3)["yH?D1ʾ/%['I)֕2 ^ ʣ!h*cxND4s&eEg&8\oV,ʍqtr5-ӸWUtG)54J$ĸD󭒡l +R$ kJZT3,w)#'c&yehLN"}"t~Ns)W& Bۛj7"el){!^B4 I1A&" lkIJDBz02ӂH?3] v A@ l'+C!9V)%7A4XلAj*oKbp" {J<7cirbVqT:ܤFZUJ֨4\p8=Zf \w}ZJo jO&ICrB@/grIrBY0Md>l+it|t&Q0&E -A$RZ H20`MG#_4g g VȝPShARβ@$@ P 5oʶ$%V!B|AXin\jF-gnJY^Ut0v:񣞋VJ8>#a=kRdGklhײn􋑛{!MPi8[# n0Sx60x>S%a .G|`<V1I 6m4x񉃜ƝKAbPR \M:{e*"_|nGmTRp`QTpC\#':~$$:;USŨHԁa 䆥j Fy3^,chLcWϚoQRF[STgrm&hѧLi&HfͺWˊukкPD!Q Bz9d$׬lC]oTo-mbHݦ:Ta^iKj тXAJ4!!Tr6Dd?DCÕ)1ݳt]S<19|N+ԣdHJ3df*MF7]c1F,/Lf2:cIsKh`cFWk-:lZ)6a(κ 5sc-I(l,IKW sLtRFePj-nD]:9~KkiYZ覻Eɽ7 1:6_I' ^M9W< =7EWLEހ[CBhj+ GrS?)EfǴ ꤉) kp> U=M~TTJ@R Xp%LB& UvT^hIA,$Ft~NEAܭ k F=xԣU(vuaP]UuܵŨܵG‰\eJGD ҌXv\DŜ@,_P^Dpӗ QխLai{2JstHR$Phx K̉O  !W@Spo͡LBMi#c@EaP׽]eIpPGT4҆>VnmAS&*:0h(>^CĚ\><UƬ$ګ\Ne\rH1Q0 YJWˍ^^BY)aI}7"l 0ŒZޜ Wʹ\^YB㔸aRdbjE۹#"ܵL R-,DIlJSTT`Bi"Z1C 14̓ (B).F*2|F4 ȖeYw9%wv唲XQTzT` #NlZK N4 v(fG5 iP;)\8׬@PQgf.HdD}_c>&VdZ-q@j(ZYb&̈3N݅e׬,Yfڗ{4 N"%'hIQ*=܃1 &&TA rR@,f?*LtmbYc\-'I{ (i%Iͅ QPE{$,@9o[WC@ DB<ȃ0\E>h>,pCD.>T.tnr":$AsεB4׫dBÚJ`|,(p(o02ON^T̺Rf$̎-|Tk$g2}W;跑TшΔ$In >G bQܷĥ ֬nDA&oi-a|n+/ҕfDhE(  }͠G4b|D ht>1@XAQIՆUd C<C\EFCJhcĄCV&a4NF429b4tq(deJ@LnA 10(ZT^2pNviv=e=-.N^g {B >ݲw(ozo2CJ,Y'2p)D1,;"A'gDJl @:L ͤom Jaa4bov_{-1-++=1 iO C>\,kδ< 6mn~m|R)$m@   4'3GC>vR1~.1@  q2] OFc2$Fꉁ&r.bzܭ9}2B B=G]^KhKW*"CZEVdi(]ڑA.Y5kxЃ2LKu0@PfE0x_a`f^Y[MUCdl)a6}G>4GVo>lWC l4uLVVP} V0һ8 Q+PP,cp31@B&@.A4ë6U!(v$ gg2֤D`N(DD.f\Fņd|"(è<1c*pT崰x*WHEjJezw^za|g=*46RҵՄoދB`1UÜr;USrJܫ\cP, @A'Þ CPu;r0@ tFi=YDQs;34_k |B 6oE? 0 qbn- g>.<."t$!<4ğR`_3y`<@p&$\;q̻drg@cPq^A6Sk{Y0ĜeO4AM@ITHW@C- %l/ aH'! wrvv}?Z"OkM{^L U]Fg+L81C2)tT #;4Cx'8vrg_5=l>WAd-FqtG44Ǧ6^N\<_pejX]T32,Q)f; Jdm~jPCKdk+*mB\0@t$ }&TPaz˔E̔) }-Ӵ>e?Uo_@aD Q%(CS&F \,,J6DY,O=A$֒JB5 ˓:mɒ˟TĘfhB#iPeehwZwv h&rJߖ1d*-ݙgy\$sEel, ھ]q>wf4RߢPoR2elFoJ,Y=Q|&.yc3ayѧGHqx'|V?IǴoL<1θz Ρ޺A68>:k- CD‹P$:1X! 4P&4(R#fȡ'L-eTb2deVFKbJ#+0 'M**rj2z*&ЬsTj(8lNeK, ,: J͌=jP@9H.1԰D1#KY՞:R=e.҇苦;Cn9E`[Y6z#O-U/@!X.V4-,M,}hg(EpBJ?f!}\߅31 ߃.-DnI+L'Vl1n#QO> 8 cwyN }!I 4%  :(+"e&}\.u4}LrӧAjNMA_"P4Pmfl8ŶjP2 KM[jj_pK?#o5a'h*w }ؑm%.4F5a1{vܶ< غJ#NBv2:1iyEsWӂ7eoK*>BSMg8wpdTE"mg.2i^8dFtlt@ iPA$Pgt!e#"W yS`RF&Q*VdH7M,}T6j+U9TU'BD*TIT&@D+raSJYh(g2 19bU-ư6!YpnUVgpA 8j8rLUGp [4UK>]M6(rT&"}L 8A.1}p2T ȽzVLnG8셋+sa<d@C#% ,t5-GV1!&kUҦlAAHePlr j6(>J#zɣB:nI8$[—3$*jtCtPq ôڲYCQNL݌L9|I\ʱ44heVT'  Boߋ*'`cgž$X?M=L0yĎbN &$,sK!L 0$u0JHy,씟`9sAN1& S:% 00#SUؑ.GEcvdtDyE"qg40a_6Z^%`[Mi/D[kKT|>[AUnTuB~ G( igF5fp'Lz#}|LFD AvD,ClbNDk[[(,[7KjmYPdhE.*-TDf?T_T:Gor2⛳\ܝ4M_/5!7R|XH_$/bMF0<73D.T:McV wA\Fwc 䋂~IםK_/ ,0W{#'(Ww]i%U-Ee|\NQwH9\>Bsj\ґ*]iH$OJ%L>:E . .7X܉ATf.t/%&-Z=lPCp:ʢ*1 '.V GN ZHZll/@-2OppjElzB/D苰f#/DRc eed&90x؃0=PYnv/D/B)E°c @("4A_E@Ri0!Y:2G#q@M(042BlN07U HNkF(h)օR֊FtrZ _Her,uAjT~lt8B'D%2]CbDuD5RuR!RR%R5uDND#REuTITMTQ5USa,IUa5Ve5UG?H8GB~IN ՁIؘOhDR(1}D sH"_L<&d p aSe}#8#!^pW4&0ibjMZ32hSA 5e,P&ePӲ"O1Qmn8sŸ|(` 1L:P[q>f,%bN^=lSДN vxQDTsQiD9Qsg#RT b@#{=,T 4Ag`L<E1d@n\ݥ_]EAtjFl,OIsCwZ5}4ğ$.6Nj)68Q˳B+V,E.LGԎ#m,LHEZ:[(92]$Zc.!ql >@8w<{'Jzs /}m51l /Wa~}7~}ðf~8 x jH 82 ⌗iN) lx-rB3BиA^Ќ J72]њٗ" 1t@G'ѫ:Yi \˹9y9, 5 IWZ=ceL(Qa2e/pd#(Hyn%o""  V2A|bzas:AŔC-0aH FCٹDx(8Ƈ*6""+\ &o*"%% SJHxפh6٭>ƞYڃ+pFՊ9Xi0"L,`ѭ*9:jc=@ WpY{cT,TC& )w)L({/RfK%QY[۲˳;wCQ[ o(}OˀrᐯBNc1H0HWpPggIJ"^xV[ ! _>1@#!NDn4#LY'd7*p'D7tkN>#EK$Rnkp*zeM𤒲SDM#gK5iIUguvSe|h|jm#ԛյ7-!U@a"i]x<"0ZXuGW)bZؙ;!P-B/Ԥf.L&XK^Ϡ=ЃI'FP˼ +=3’*ח\jw&jBC,WwYЁ~m_3ET ߴ4mC%zHH`h=4Ab[We @_%!as;!W rڵ]{y v%|8|Nfo=*}Ў4'0+anRrd&@ o-mqFA,}bZ}h4=ɪ=j$.J^00 rw^ ʷe@d[J7MO̙Z z-oC l` " ]Z]5:Rs@b8180`:) ) jJ4b(V"(L߃UH22}98ar-1q+|⦶*a!x^aXqhU)ѥ%nL!%ӏ2DSoc?6DFHh=&HM(ɘAU1TbUVS&[z  |8L@U+uS5L)# xb-qGfӊ.ţB8o4h*$o&@q)s1Ck߷t@d hL-4Ʌm(kyNʸ` NmCkm|c( XZ*V rBŨ5XJMR5gmz:DG:Ul&YʖTLK!> AG#?/c;$7RW28 q /\J{]J jT2b*Uq&Ԁ Djj4+4K[E޴0 @j$]k^rV".uYHO0t.'@ |kKnI "}L2ɗT/b#؉|8jKE$qi&*X&EdYKH& ֨0(+ώ3f$y3J&o΁Rټ iSjb9,$+W* *mXn 7)7$ QLL" 2,Q=td`a6-DhSZr5.j9(tb;CNJGg)?JEVADl<"LOB0-Aa֦ǤF rDf EhJN"ۖM%,^X̛JRdЦkSZ#%b;&j}TH3f XNjSXjd4=vd(̄\Wl ֳ ,,+;Qv3 '&G Qd#ȟ@b,hd=^pWyEŽ( 5 xOp5&1ЭbB...l=VrѢ8M'DcK>-2lSeGdkmsPaA .OE9@%jdXЦ_ӪТ>GzrWh-fS0*reGӋ/PVվXy(OJiBp7}u ը/ J)m\]:0*9٦(iU?r6eo%,ànhMwvabklA9.YN9YrER."!OXc{{Fb0+] tZ 19 0C ba&jwqnQR0NO)OTs|&=@-5 WH>#?D}?u]]uhDS&'-^4%u= su2^-@HUSC] APU#h0n[e_vt]c ,iр v9Mhaaʀv CoclN#X,lTlD9X%c8-G't5h3PsJGFCF`G`ngy #UL@Fu2FwGcge'OTRaa^L҇~'('u& m?gRA5EG|4T4Ab+U80 r'gS~҅* V,v6ۥ,, qvq0vxkk20W6:O-cMw8fE#/Z Xa4Ft%$I8:@M(1 oУGрp xV=Y7[R Q1‚!P&>*|<=6^n~}x2#FB2_r#7gT^ks(h(31kdu``aZ`'@x(`ksշ,W$`aFvba!w4Fl.c-Dt-UdɆ%.Yӂ:9!tS ; QK$K݅,9s ! q p jP 6fo z 93(W=/p/dG݃d%F$Pora/7@(燴G?ђsQEL*8AT3,[,cK7;-t 3Y$ /(DҨ!fq~!0{<;ߥ) 0:Sj`pPoֱv ( I{uLLj ;MbbF/=YIFDe7Ї-I}Z#uGVM>%Q`c$KR<84]Z& G!޼FU3~d%dKeA ]}w ZPΪ\m=ΠIzHQ_LP%ssDaٹDtM8t;*) Y䁃M*  Us6IRYwidݲ+V[5lJw2di]([SJ<􅢷/>p[^4+z4>F](қVϪRHm:Y@ּFԢd*:7͠WF4^u_M}>3Pȑ%O\ȇw'̡E JgZ#ڵkHZ3mXiOmz8[e9ӮVj0Ο@5--WLeNFLaIFko1oQfE`K>fշ%S*ey 4ЈaM@ф',&Y&.@"C))!T<%6F ^Dhj"Bzq%1 %hGeJKhD$C| ~rK0M3nkN*3鯣<$Kj-dJ΄4Ʉ$)+CoRJ#3-Mڐ:RN[F NKmm9DkU.Q3*ې:Kώ+WJlǬj*Pa&IހM1죏>-:-Ie }@Hh(ꫥKad%1ˆ!5OP>w1XF`y! RF7@heda75CL0(2#(1JEHQeQ"gmI0$4-88AU;**+͓+ T*󬽐kU=gOS4n@lӊJk -gdQi*jÊ0:&=2-o:#;ec &g!fN, B'mktJrL$ǣ2m΁IcxC1a^~YFI~8ize0`%A h|`. ΄_aXUj'$9ȊNL!I9F)&V͗ԲlhaHU(ˆ"Wa K˕UG8!9RN)f- IVʉɖ2aE5Jل\&:b>%*ՃMc9mjZ&hLVeY%:IabZ鈡TLP02נA$#Ͳ3%-<+yh"a4'-eDB~䥼W$\B8+Y8,aQ̊)@dEV=a'PtƮjBڮv9ebiETU BFkBD$ И$*UKR4/iJgR lXHF'Q"BD£/"jSGMiZm&&-.D֚vFi9]"zh шA阕$TEbf;e(2A.iA8/]"ϽdT c<)^%-Y,QH"vLcP+ARզdHAZIKzDE= >4E6opA/M\q9:'S:[-- v] 2t/^F 7'VoIhu2H`s^+iNXfX'U FYݩqJ~7_ *U$x!ʇc wr|X_hǹ,\s$OtaXа1J+$v B,H2!/k'ya6eʇ#%G*B/mބ;,C4Ȑآ̢6Gl,b%!09A$X&X{Fx(F&I`B́QUflPی3QFNJ'ּ(h\.Ul=6$ ׽5gӖv}m2-9friziV-1m&YsnҬBCkp\]ld5G.Y')5'SΜ^' bb]IW4-# ͓T a<@L$ &B,b )j"dGAjmHR"zJRL].u}nrB˖1j8}I;EMPɸc*TԬ9t 4v}=ATEț]ڎ<' ^E&7.wu0F~Uω 4B6d(JdS-˺4 (ȧPƨH]5P^6p oyt7rp%t[C 9Bb(޳.1 a7Z?AGCgA}"{*A'ԧx*(4( (4j(0*#I tT@X1%&&|B'¥sc 3& ? T)#;Ph xy5 G9њ6p! 1pP#H䣖qa 2G՘FMDПR ZAC!OL$Fie9G[#?p vvӕh.<0 ̕H{t6 O8 tCO+@ ŘK 5-Tc BUL )A #R;ĈI4z@@<|*DNXτUN4h*+&G4P5aVb%b5VaMVdMVf]cUdeVkVguVlEVnlVhn}a?:٠p\ f Ǭӷ .VSO ܪ\+x E-?YPHe@f3Љ=TX، 26 i r3Ҋ 5 ("ΔA~ڣјxHH{L8GJ\Q.{M24CۺA(Z!p'ڋ&ژRY8j=1qt795|T 2@K4>S9GКZnӦE*5y͍ 6ʣKg䪵T1.Ph\ w}=3'ըNlVU$#u M*fh@XKyvyh8؇ۇa)? ~5*Q`Z:-VtS1BL҆8D ʟe42,N\:C#[aĉx ѵ \hn`T0>3IO!h#TO+)Eʋ/!M& M1n .z8E?^ -: z7ў;X.S/ÈՎz7肉a\Z51%@;1%2ŞߍF Eߴ\I@)O[Vf/ n7ɕM u?y`LPĂR ĜUƜnw\7ŁXP y;X*tzHjۘSzH؋pRP ^JepHLy?dD<ʧopL`4Xi>7م;q?w}Ђ/SbIp| p3rՖZ陟a,$Poe8؄N IBxIDHӦh!WRNBʣ4bЬPF4o҄y&+! ^iSߖS1 5O]h`;.)#i@iZv}*I3,?  [TFxB POrY2.>"q4Rzgd(xz#~Lz @ 2hd V(2jPWGA(P, WDdW]7VQR4TL>\hM|> ;2)l;9cY4MM)3MBmXP(D EyUWEtWtUwuUo 5BZEXTp蕡Bb{mSSbTJeLdL2D9#AWWYRu.ZaISpY ѣ')9%C70 9kadUS\O>ͣdnD# $9I"4KE3W!&]ط.Ia' wf߇Ąݺqz|\oa{'I6aB('90$q^}ZH#1f=DXϲUдÛ]k#o- m5VBiJO\TM4!e62˰*^MLDI!&FShf-%EE#y e8yӕKY4&>zWA*-'QcUe`jC64W0Oh`BhL 6H`nOm.̀$m00!G̻DI(Ճ~~ݺхy"2Z=Zd-ZI{B-!2$! 8e#c*F0! )Ho T2Nhhw"&E:ZM t|(d!bMCNK4MBQ/$Kۡ:3 tE"qg9T4nhns dPz\b}8ܜ*ƀjl8B޲*/Z!ԗh!`e|Bð4 1YO1\<'^K E,DOdb1ѫ!#iP} 0,B>I&8@ A(2蓰;?ޔL&Σl?+PJP 23mf?cheh&R:4vl]DCǛ\IH\W1cV!(WB", cRud1D@ TU1:EADXRVуY["#R5T#KKS3$cU %ƊL:]v:Ju!I)Gx!=MCZD u> ,W MbCȁ/a>%Kk$̋kfq>>5|rb ,#Aub 2uL$\mk%3[ BVA'g2 )#;5DBݐ0<] 9f&"Q hP$(ʠ+>JNg4xB]&770!Ax%.$ (U0vhG0ڔFCfu%g^R)čxYHD7 z4TF̤f4]FHb*Ql0R&1@bc%OҒ.\zx$Ld" +N(޶ z2ИsGϐSPjB!\8 L!\C#AE? P,VfkCGʎ4U%cIZK[}< g0횔h-k=LJ'6t"Ե\반6TDlb(w:؍Et۬dm34S5SC;[rշ*Rjb B -xI)ڂVDuթ .ܫWi V-OJ5d6̒["}Nز͋VtH"!:}3sGXͳ}P-BM]iP YPś-®rŦcQn㧜i5IGSQjBˁY:hP5qum O#91n&EКq)؎eNEETRqJ\QL (>R+U,)ܲt"^&2 ᅉȠ*jctDQ\NF 0Ewc aTDc]fu δJ5  Y_^"(qR6:T8ap"CD}4\Dcٱ ]E ۼ>0TU^E@4Epe"ߕMeIX^Byv$F*%TV=;B(xY^- VURh!%_ GVGKvZc}#X…O)@?~Ob.R*C״" .%NYR_*L؍DQ ʃŢY:[ɑ7I[X^d@A%%D$R|,JxB`NH"LPF4 ^"֣_wY&^#V&=J]D%JXiRL5XNqN=_#enδD &F> zcGE(aARU &ygMA4l(,>`%tb<\XV1mgnJL[ # h=]u$EN]փ/zAD`ղ"uD iW P(NTr]H}j`f~TuUWudNm]uIbcXɄqfJ Q<#PD0ZRƘ̔ )ʐ׋Q1 ߸% qJ]ƊW>J1ޮd̘eY)uՐca͸ؾԐvMRZ(bWwb ]@5M`%~$di2`&DBd*CvB(] gHJVHhU[}Q$Q=SiAY)zb蟶*eTX$nf0l&HnA~[Ո ʎ*{( =(#B=E&@@1`tؼf44m+zFEpX. Udu&lY_[i֧qW -q$DŽܣVz˥džrĘQE,FZM.献`M!+Xxf:}P b*f$-SAC & @l<=00 k&&|+ZO ƘYsDdC`抯 ^+vRj":T)+PRJ? =4E$^"^QEQY 5AQGQ/RRKu=IkZ,T5UW?T3W{SV7x>lz 33*Q,2A(. ľhe:/ Nlfe!=NΒS=A'(-k@Cb`wLE>BCwK(B  E2P<osdUEUܽ$JZ`T$%'g&QRit2iIr yd}oKhqs${oBۺXؐaNt/|#Xbi_\7w[ 7#Trw^wwjN)-e뷂Dt @f> teJ  @$ă<l{]FyFQ pK@&,1tD*Һ7n6%B`,)*f,]ZQ1o'˹o/w#4zHL[(۵X'ó$~N$9T[do /zzǠ:$l(w~JCq`UzB%mi1$rt.KIFtD&gA<1N8 z.s%}͡PTSE}Q't yƢq L8kTD$@2 Cw2jm) @Ȁm4'lm.x.pGjm28˔Mq/%Í[͌c%,ѷ'`5MV_ZMw Wr$UDUTJ?/;B:I*l\lm||GUٛߗE䖠0`_D?eRTtyN^& 'D4zۧl߾z2,a "iDӴ bi21oLJfL3iB8c8 h60m OSfD+zg<uV/SY5$)GMc7Aijun\sMV2e $(!sw`A "U|&^9|]Ybň-e޳ Ī';m=02ɻ%*lu灯>{!Úc.9tڒ%NGW٧3<!)xfë7G5'a :/*D̬ G?Tî@3<4 90ˢV mL$2 (!CȬM@qH!a2Q&42aˮ"I$`@dJ04zIBا*.G+f.Bg4+e̺/b"<ܓ"TTk8d>2D3>8,щ"Dh&oL[̌@3hS$ 25d;vsT{W+R{mR#"6;:;ML3vPmKSLҊ=0;ҀHY2+փ(Eu tӔ!"LN{!۷LL܆.Bl5bK#P )Xal >! p Q-Ј!Sjja`!MLQ&-`! < IhN"e Y䨥.(وH;]OT;?,R/ES`Zw2e'ihkxU6i:Du%CF;ę/fuÀ=l|U[ VI C,zCM'=jQso^%5KP'4^DIa4:&bf(YҐrP&r}l"|Ar~ tXe'a/` qқC,XBEj%s7m[2 ELTcĸ5it҆kDoլ.X-%rEߚ"$.P[KlE<-!Oڝvcu:!M[hfU( QӦ+踄!a@b#@I%1J0䒗z(# Ұ}"NNAQUsLU-cBti:*9t% 7 ir:կP@'zC]֪.|#UHduG顧>'u`f5ST4kPkbHP 8xn!ÈD;dFnLYTbu`/V%<dž 46 -u7a uK{F@> #IA /E4`3n2޲*7 05a+MbxI45GAlyZ-ة8~C\˨Rn` A2*ZhݛcSDjJobe&P]Lf.3-;Ntk]6Zƅvd\ܾZ )ĩThySv !EHq1H"b>U,J7i<1[7xށ>E,#㫈R 61g餧^3[H(Mj4{#3-"J=jT˓~swDLĝÌzÔfڃm#K54T9hC ak[<װܒok(ZLkTFӪэSI P'!Uj %h(#8Yt̘ynMLJȔlL-Z*9HUGkZE':d}"]ȋh@bH 4(}Գ\8^Zwhz^<F˛vjjîlWiR@h.,5'"e cDd=8ʜCYG\ 4%U)@^׈=|n ^om ȟ1#CX @RnQvH ]˥|nb)M #FeO|$ CKxKYfeo:by%Ϊ~c`J&S"8B4W? ao#gf]/Z=pCH+]RL]߀1>Gଉt~oH )qLù8f?bz0r0;=^t?Or$B6*%bŘ,B"*XTέ3$f*4F2?}DOhHpΎBNPD,E `D؆u.tQꩋHC\" ;A2aJPb@A$!6 ځ 5a.y(>0Np!*696zux^\ o(:6p :A1'r)/Pd`gg DLb@"ndC b@a Ls $L;"*S`o^TܐN / X"ΨKG2%AކyVpDMie@.o(-kpҐú%,: nr ~ !%"G=,G"5mLʨ?EBd3kI%!׏wN[#Iϐ:%-*C@2r!Jfb`N(TBLBaA0T+/2c1_Ki+/U:Lzf00 E^fa%ZB-n6LC tT'H(3%bYZJu/m61WJ pjFPnFaF bZALht-EF_BT8H96 "Roef%-Qu#-x%=B_P,wTDl~ 3&>Zv/[;Ejl6irhVlnRbpft4嬕j23B30aZ*57f1g(B~.Xlt2no0(Zt$QbDfMrtm2 \/gj0a `!c@OfDс`*v*1/5NbxR+6ըd."c?QdfH`@w}abТּ1+$h/*D "NS):F[P6,x/] s#&a8q1@ue,q rsT>SoȕմOb< Ҧ*q:t""q(j 1qOS?ׁցr/C3ӣjy`XfCYge鉁zZ35 E*ĔycL72Z<1c չڹX/1c9خ/1yԣ`uPJD<, @XР6:&0e@bc4OU,PraU%Q2 2/D Dv1H%3rX2RzX1Wn. QD(5?8[=#C燉\bX>ԅvәc [Uptq/[ڙLcy;7ui#ZʼUw#˧>PB4""zAF䴷N68:<ꃠH[f#]nrĢe4y+}La:9ǻiگq'C*SuKQy tUͩyYYyQc=8޵Nl'PWСf}?-( uVV|1;[.ALZ"J{şBn$8盎cTqNx6uV{܀M{n 76GA7&=tI-\Qxf"Nr9˼<*f5{|}ܽyCd?&sӢme&z)#M#! X6!p7r7v YwSgPP8hս_iHucn KĹy3'ܱw"{6@ :(.O7JeJ&Kxqz"[W^K܊y^]9۽S,rHilМn*5cһe˴nvӵ=WeBHC/$y{RME`qƿ/'xY p b߭uA\+PrN/ t_q~+ ̫VKKˣc6Bs㾭];U݈ބoO9n:\0;ռj )jzY,&M2zļfǏ CIɓ'E۷LCe2ec_PB-RuDIѣH*Eg*VOٲ}<M@+AGoeٲd WXlԷvm׸m[ԺلSMV,Bun ځWDxo*"jW+Fwdz U.[W%Ud-GՍUܠkj僤;vnǵ]~vyja(ߗ1Ox74j|{W.uVfam`J!U\XE[P&!lJ1*\4#ipԈ$՟2(DA| Oh DBCh8h$SğqmSVZVr.xZ-o$f!dUZ-Ye[&斄5Y~½Ŝ[>l0|WxQ$lk Ƞs{FB52$M>UWcJzmuzz^]ٰjQK%+l9]w۞f]\V4X8죉CDDx(m5+yH0e"ݤL4hdUOn$-s{TY恬cit([X&LO7hjWeLll[Fs+;h@izQIZ3ۏ {}hH.xŇ@CMʮt esON*ijHѭgSX+lMF6iiW-l:7Mrw{ؾȫL+'1pb84|s% 73İ?|Ft;P9хSX?Չ1 3=;:Ůu#]VЛvG}F>x/u69 r9MqNWj>P,KRa AOO=W<^OCg/=w/@^yO /sh3~{&=|c?߾ _Gk/~A äex E0]/\ݦ.:AD sMXDZ( Gǁ(zIH( E1TҴq1 (1C(x*h,X.-/34q6H.؃$胘"9Á?Q2u@ dLHh(ҴfՈop188$X؉heAs6F{7yEȊ=㊱C3?ʹLLXh\1،Ȍ=Bg{xhː!޸s3Rc+!C2 y.ࢇwQ. *-b/A4Q xhB- )!TGs_FwZh1T"3b9\nI`eq+a>ZEx [4B4zR~;s Ց0X8i^YF`^t;HR)PN%G4WbWi h,QMď&9р!Bj8/pHAĀJ Ypt1D7} YbQ$(e]E^t'fY+i)("1T(nPq3jQ0A3sd;S5ᐭ9d³,gAy&<R1S.ٚ2f%,q1`FQPĠI4rNp' 2ACD8E}}jy7WA) jyT\3V\ڡ?'UZ0.I.DӒ]Zd)4>awg 󡉆 LESB)G,ELC1u&HɒKM?I]~Ly[s&TJ^>,CRr iv;UnQ Cp Ha%8!-G1)x6Q-pLJgj0IFYdRA:'VǔXYvYэbth4(IP# iفv?)2&G@:}SV3¢ʡ0JfR c]$t[2b$<^`vg`S3Owz$ '=2G +jQ8CsݲWxZ2mcXrU4(JzJj$*NbuC ETTLGm)39囆 SPƕheH.z"vq%9, RbRIѸ$  @I02pY;Y@0@%=1`U- k R p[]$]19`8LZ֣ HB允BNf&S$.Ӫ T4$ddPxO&1K8E3- 1ii GŸv9##^{;jz BgbcS  j #v]7)[8PQ `Z/|9>&vgѸѰ[%.RA,uR|ta(+< A5024AecQ7icIo^05(֥cWEQc~"TrR?;KiieH[Y3AȒ2-se`i#rx)9s+ujI YQFF[/ U̻cQ q `[20j; +$2pĊ[;j`P9hQ @<2\\8p,P]̼͋< }1pجq =%6A0(0!_xBWR, Hv5ݹ_UtOcS][3UT+i1Tv,j,WiM"Bgi(9 W8k\˦cDy.q\"iE>CF,Br ` @p9 F\ : Ub!* [0JM@`ĸULhlԩmʬϧ0- :۫} ;0q Pħ ڸ}/l{-;h Pĵm@`Хϭjʌ JA 5ZHt9{4Sh2a\R q0]з[  ˺"#Ϝ/$:!̔!ߍ >ő  @@`(Ќ+$*! {Nꧤ /+όAp^л[҅0j5p즐Bm0跞hUsRhH=_?bFA^v' 3) ns%Bl7FI^eY>䫜:[Y7,!1:#wBu% }r#W:N-9-Ƈ M/>cA@㤜gPv=j} ]V`5~ư=sKN T?੽ Klc >H`}cQ j_ԗ }Ρ/\P\6O bƞ1`eR_\V@-`s>Odމdm"0j;5Y j]+eR2IE cQ557+a,$(s8S-'%ȧ*W-z$B#&av9g<.[24Zӧ(μЖQ&1eDSf蔾} H/ZIh )%}O 4,MMdyJb+gE;גiý7#'FDU! #´ 4˜a:<0@}{8%Vʹj\si?~)Z?cߎ zuo ަkK|_Fw:40-,ڍ ܛDoYl(MN42)AdA0i/zSL2}@Y&PLMI$dE_1FY,ϡPY-Ҫ n"8{̆ºvJ zah/^0yZ8O R"vb2TJM3Dy8墣YdXȧ&nnE hډP &19'5D3'R'}+Z,yZ)PlqY֣JFhM&WYdңzB#Z6Bt跦 nڼGi5̬72#MHU4Lw 75S4R0SzK#-Be}@P1ҘoƹE>Sg % +*}朗fi!,'b)}f@( kܢ.p 4banD)Wki"ҊU0JLYIW{c}P;ViqLv2#Eb IgC&ҠFG24`2FT̼)E4a)j_iN#]5X'.8Zr#+Awpt? qZ&ƚl5iJx/A;=_gTPpI GrD=OE3`'L>zhor 92zCJYY'*;6mzdev!_J@m͏M{ser}¬tKvpJTJM؄ˋW_a+HTC(SY96 Z X#HhUőKո&`YfUR'u9ڒ1)74@ ~ß <Ӡ!Ӡw׽y{? m1A 8`1kc(5ykzfWR*)41QFx:}a6Uׄ^[/; 8=b ŭ5~eq=S~c:mdoeŗO =+eӠ Z4ݢ'ۏMPmn3ͫ!!eI7a8TAh( ;39.3K S1 4k#DRbP "!҄B'\@$M"&\-+ B* jB$ MB5lbj,\-4C,̏)tB8C4DC("%\@7@TCPx-;,$ŽDC;*H6A$5D,D&B1941L'Ot(lB)D2BZD5MS5UӇ#*0J133B@+pa:A]T 9T5=TE%QG #>NuOI`JF5FT:zWmW CU@UFUSTw9UR4=SDԗV8QSUG]YmUEUSUIT2JF5Z/224xc4s/b"L PǵZļ.! X PX rXaX) z؊X؎]،ؐؑ؆XEٍ 4B9+k „M>jKZ*Y3YHš(["Zܐz=*<zQs4r%ݨѽ)L8r;iN#[y+}T:0);&[X (8S¥ML7Z l [%9HZF,e8K1ҬW 嫟,k]a(~D ^5C >'B%ND`Cc W,a-E.vceb.EDl_Y\@5,`tL![!t%n،򈈹[4pdy)dJKGK MeX1qKܨ]Z"?/[eA\f_f :caV[f?}3A3/A?f @Ž3 |W:Es'_8$#C|Q3(#gg ۗ5E/72:(#J,A?.]?f< 4U<^H'笋e;' 4C ESj>h<"zp.=xvQ"+#2WeBP.:j;k㱼, ;"5$+Xv$r"&kfg # A#Łv9e3bȬK3㪾~q*|9,)HGj4TUd= bӆkm%4;<)򈍹 I. Ր FIТ ppEź4!eӐLrd6A}i:rH&3Oo4 G@ZV) k 61m4G4z5tiם&ݦV"jBjj=?'LJC>9:_"9C8uɷ@}5)? ˽ßBtc78 3+W7b:6җ)XC .k#U[7TR1ࣥ!h#Ew47//#+>;8],겭U.8{Wꠝ%##mg1:[:OwqkA3u cqA3Wwzy:ֿ٣_֯ w؟/Q.ju-?q`o{ g2 v+ $# jve6Y#K/={vTps9yO1'V򔻯3O[[eF[0u/?PmBO +86Y3gDc0]sOyXd"}=r+ *CP0e-;Ar$w[X/"||>i?(,WVC*JAMhuMQ4i& HADaÈ '\H1hĈ2M",L߾S/}`Wɛ1sF ^K. (ТC*GiӧH.(SPjS6{>6ؚjiŒVOI3߮׳dr'\n+Ugݹi̩?B;כ z3Р4Fk5k}Kqk3cN7wbsi\1v>F#ܰL(L(ԫI&Hp\d.^ߊ׮^۫v'==,no{,sFTaAs$+MVN{ٕ[ >wωIi} ijxejѝS}5TW٤zRӅҧlƔU@e]תWM\9lv'.ń7qý^b}c=A]')``J~*c.XlI@q%Ԉ}` i@XoIas}=osL ("6v%rPE7)8͓r—a1j|`'yCa`z-i\D B OSth3(u9pJ`f*Zq&C.MVڥ9=79()KkSł'FGHeMfnJXhTQv&=3sSܪéxg8ET8 3`Hī]K>I/l_S./Tr)W $ }, (OybbgxM5kת}vT^Jxw=1y(1 iQKtиOfnFΪR1D'qOB^Hs%԰ꍃY.@jeWx4fjA;;r:ȰY3DV5*2s8*h .5>bP=| z[C*4!euYւuj5kXZK 4>FR/Z퉕TO#Y ۂX,QY\;P~^MH׹)RgEEJ6YIQK9x/)^ͰC70mK~ )reQ^3_2cҶYhUri 6]V+s3 abҘUCR[zl~bNX"*3D]W4 3 #vxbKodDB eK $JT$拆Gar88mF%"KP zllcF&8y $F58iKbM4u4s7`P*Xjk7ʵTMT "Yf&s 0ؚF;ʅg1L[I(qd^)y6Ŝy\[!j!lM}ӡ#U3G(9@ UV$VP q8us-_g蘬E'.bkqPs0UT1'sqKD"PJV|@{ɗO\ՂA8&ܝ(;J"iA @lA )VL@",0$hV4)Ԃj C,<*(8&,/eI\H*ZA(?d4nUjC0&.=nijCIcX=#Lc4&40B(Tף҂,.lB 0A~B&TA@=hP^FPk`ԋNaP䳀Q lQo`N$]gșg GY .7k鈴11.VNBםaJj ^9RMl },QzحmΥҤ1LRB݆;5_H0 z)&mo.c=@Vc:"2w)Cr't4n&/2`j`mAAR2 0 [>- LH,OF؛̡@qc*VN_%I!~bFPZѨ {ͧUTnKL_Nnn즫Pt4k1T4(d`&Xp u252`tK\211.fFIEV|6ne7C{ 4Wn@oqi&PB&P@$#|IP<Bv('&ĎDuMT5M{4.NݖexaY(ހR"HD:5~ pHQ)/_oed9Im bpjqkDw1ƀg_|WIwjL_j26J`JQ1]҅ZDM8LjYQwt!D OK "Vb&l-C`,P0@^$c/sˀkF/.A^-AN4j(bu_iԂ  Pr`k #"S' QSxIoBwjd4rEa@l^}e}n'_ T7Ufee,,on]&(.Y dQ8s>KX:vw}Wh oz$}]5!)8> K9)[ub5~Y,.@^E /L/>c(<Φ)s" 28cQ0@B20 @2$Erz5)*ew*Crn &]4 lOw`f/Jo4_S1|Yn#"MjQKQnX%*W{>:y.e`K%n T5[Vx?/) CĀ m2 v|៮ؽv_ T UY[w P Jٙ,5rGno3ࣹƱ+ FiLld˸+f_^f$l|MQEnWIPS%11`& rsN^ sUwV؇l89 9_4gWJV$@Wz[^4 ԷlDa"h6paÇ#B}A,8hrP\lQ}bB-Cc4",Jr_9%Q%̏p~Թ-%m87s@ geQO쩖ՙ! ̈4eD=Xç h1_K~b wA R5lľb4|02U|Z`BO9hqZz94 i׃9:ƊpDJ}n0)S&ebҤYi9e#d$Ȁ;ŎB,@ R@b2DNM4.4T290;)ʄ8d3̷:l1訫Q(‚4)j)4P?% *zd,|<s„0bƃJǩe8RI (}!%0H1 i"Br\ar GNJS(hZS:s}J̨,-ʅ.rɴ*a"WOoŒ[r8 =rmRɄ Z[ 3SuMdgUlPQGe|pb59/ 5q*ܖD[DB:q8Dw:P2#5 EeĈ5N1"0:kIuhohoE6g UYPĄʍQd ;.yˋ.Ŗ@9:t뭍eB!IE~CM=tSeP a)l[!eIK[fbp5g 5~W.}%XQoy4ujbZu!{nֳ,XOؤQgWkQ39Xe(T-_K׻bbyӨf-g Kز߮N[ے,epA MdbAw t5J N"S.lh~gR!aAIeRu\9fV w3t&"ڂFQX&+xP"df=& +B ɜ#"1 KFelncV&A P"YxP^ٔ e4QqH(4 ]LNB('Z`Kbe4*QPqɐX?QnQcHg,5:tƞEx[) UlOjO Z8 5rV%<:ISt&XMx>dU')#gS2qMscQQ4 h03hF%ne,lmhE]Bުѓ]X3Ҩja(J+aR8] 9R!Y7-T^R9{ndbA&7q:>DO&y/MeF2&U4 `y j8PX$t&he`(` IEKFvT2c8ГUY20JhjL/؝[m:/4OM|름805 1zѭc0r-FGEMhdq9/030 e\N 2G0yc=OL2B/KeIb2m𨖚\V?#͈62xwXvIy·|0d ;09*c}&ݤ"6El!Q0p0@1(] 53fI)TRLZSsVmu!BSWڃ*M_F %CI ]$L1hJkS܇G[1 > %)Fw31~#~~͠˜39>.rRWYcϨY(k>Yv7M?,̈́IFOV,h9\\% ebm$ЩKa`1"+G2 HmuB GԀa`eZY(}ʎB,bE&tB" >&>6F\V L_RήZd~.70Cje,wF B\ BŪo FLĚom0#  h MĈfd~Z4xH TP5OjV Ff{FǼ ó:@$ɗJ'eVTvGfDlG.O\õ$V #`v诸wx'U2ē8gl\oej+aN#  Yl(] Y40ʥ80bə<@ňcK A($bl%a 6"7%Ԡ-#-b'"' r`AA pkp`6s̊.t` " Z:ɟz"E-x%unB&tF7F⿰d%d _i>w KW\!P+gǒ**9'M{,5*GLQ-GlEIpLdq0\)0G Eo0eͶ|e[dR{fh|)?IO>@m FgdC˸Gji[0BB;|0m^t+1a.*[.1,F+CsQ^O7em$ a##HV5Pk2GCG+ f.H7^W2i0 H}:(iK0@ LJGEy"cVDQ4ZECAZOtZ[Z[uE5\Ǩ[5[u\]QZ[\\\^5.Yg_{%t4lh$W$'vi܎)JUF;Cz~\%cɾx|NWP\yHTc!I]0WFPr:B~v!~vb"D8}֫.rss =!! % b 4USmCi&aM$McB @VG ƃHVJrjVUXj,QsI-}"thd&D'#(}\EsYp5[-tC]o\TDtM\W[u^StR-/xfUl _,b%y0T}V8 $EZOpLYXSpDze' g0Ѧ<m@ ҇%ٖP5#m@Q+jN 4aOCAhAa€hY`!gA\0a @,߀yeImGRYͲ:Y UF AJ5ׄDßouN() 0 pVN(dTRdV)" .5=8 &׋8=8XӣI xݸ8=И㘋؎x'YglYY nyCu4%L.&G+8hVd.7Z pr97lp71ZIvee]}'E B9Xbf @j!-!5aX ! 6!9A"-TxQƂb1`3MV l3psrL>Ux8[$IF5$0:贄uޯj\Pϲ EIͶWvg%aWfY૤II×Ss0!\_㤟eil eZIP{|c: 6HLӐJl6bf-<%DlpB\,K*`&Mբ7d'j(Do &9.t:9( )ABT 08P$үƢ q@ 0!v "! ƂQ cqp@(!"44D ;Dji] W&bGEdo#iV`6vC.]&_gFcgG8p@n Z'8H˂3c Q$EϮ2jZbz?Y2}/[wh7r (7 J;nwKZD| 配E:ξP( Ύts|>Mc *1䚠>OϿ;ڤLɅpY~d+]FܚK㬷NӈP\495JI\H@;;]P-Ā+Y%e5ɡ#p4iK'Q|uC,WC|DBq^oUȜ@iƱ_mݽj6%Nj`Sm @9Gc!s9u)H^ a{G}aPL~c${i$ǟ#fd0$>PeI71H+Te^4zFۧl_=h*deE7eX)}blYB1i@KF}3*y&Giӡ@}C)RI"L)vBʔ4IRhBҴL ÁL:\"FG&aӛ 'ڝyÆ6yZ$j0# ;Ƭ9V`5&b ZN1! %wN3'Enr0cڨY%˸y)0Ӱ]79Q\mD&z r[ cٟ[޷ޗ{?~o^Фfސ7Akq5vvhwSrElE^iQE[jV}s`OyE\kWDC L1шLZe5jQ4ZFu_j,bsWu)COU|2L&iİOH(NDdBRqLugН=aw[zs%"jHݥbi& EUV=fĈc$Dqg㮟:qwco+#cŰ|U8B.r܌ COJ71P 嘟X潲 d2JO^Oܻ. wZt -pﶺetn>)w7᫿sW_ +8oۜEŎ^k߁7+x{@z7{G]A PzzP '瀹'{Šzwyw{~<7{W{ǀs (z@~" 5r7R)!#9F4[v1wlv/ve'fv\uoO( C_0rL8mxC1w{g~~wc`(~gxƗx'l|7~۶'z|w-lGwt |yxbntxwxjxH0w~wpnOLJ~@ȋ{#81Ctv.}tx@rx(#hVӌ报8&~Dw@~|~7ȁh`чx{g'1)&rWy-{}(|{| J8#--j)ْ( .ɒ(/ɒ@jPj3)i21 SuMcWr`b H{t֌!q}ox|x|r}Xsr1Ut*؂t8&*|OtIc 'ǀ_ownǍi(}'əvqk(# |Ɇw 3pPt~nzXg~ևxU)g8+_w{ 'G~Xshzp9 )ziqsȗ鉅 P\hVQb,Qj&O$CQKwSeq5/+xlVD fV)Xhw^bp+ K6aQq%')# 1z/:7:z$;ڣ2ڣ68H 3Z{RLL#cMڢWj-3,*WB*P`ڥbZ_.jkm=*pszH &v6{z<)zwڧF FʧvZzQwb h0 `ZrV1_OBR, G&juGy'w&`bpp_Pzz+С z  j1p:*ժj`պ͚*ܺڡպJ⣮Z:ʮ:%Qzj Ϫ0{Jz ) ;Z*ʱJ{ۯ+@ +* {Kߺ4[zPj⊭3U媵Eۭ-˳:7۳ +f{r1ۯ {ڵ!Ky۰+zaP b#VNٴ:5EP"FQ|+ZcAȄ3 rW Z(`h0Y7@Y+u8+Y뻺K1 ŸK[+kY{+[˼kYk֋+K۾K٫˸͋+ 뽰{˾۽;˿K˾k˽۽[K;̿[ܾK $lL1[5k{\+5L?Y k;@ 6NR< .\–jTwV41 k!% ^N.>n/>,^^ .&.`:(/nC+"HX*. ߲MFa߲=NP~K~H+FsONi>9^cW>Cvne@Nߘ0 E @ >oSP퓀>N.Nmj.Y/oԎ,"N>L;.; ?^g.?}>(UNx``ZӎE_E> ]>`nm^]N~>}~Tj0G0WpQ1 f095_#FS2֜u)q :Xb`ː ~10쒰}0P#0pǯ?Xj+..__|OO>OMoN$e`bRH4*LXQaB4;NbHG)̸`Ib*H3ƌ G|%J W,I4#F<7$ӢPf93aUyC-WJ Э6v1,K(NBsYtQDzr*ɺnBMtkŪyEf"IيeʖEf_4ӷlzq Epm_}d/Z;m12;bGs)ff2kO&#Sew+ X0ɀ)FM޿ #?䧁#IFZ e@#&ߚ, AP -p=/OpEMTA UcdD5EMuq0CJ7T1%I#+1JfdqK4FLe1 3bce7AmPCM.Y&.6:}fVe1P>AImM45[&eF2BF>e$OP 84 ڳ-~$M I=0ڕWd{u 13sf=vfL6Z^]sh+YpEws [x]l[jǍvZ}Wn6\g| {vrֶl#[w+yG7Z%ZOwC&`aw%_lcVZζ`ykcu>aw޹瞓NZ[EF݆gt}.:웁`j!&b.LǺ6q.KW3:e EB'9a$TvhV|qz9N*5LM3T2 %-bPLXW0V]V0Ze #huWg$}6gyi^zʤo^b^wyg낉~ŧ{W~g1W|gz} ׯu{\#`׽Ey{XaO|{Aς#Ԡ&h>~%A2^5} Cφ#" w寇$L%8>2; mPF6hmjbڴ9=QMjхAc )c,@fuyQV5CRҎaF0B$7P#Ԡ;JTf\dl[2YڲLD0YbZ2PO쒘$0Y*×Є3EabӋۤ,-/Zmٌ1DpҒmѬ&782Ue`|gi{e>YKwt&9MptL1 i\:Q/ԧH)R(<5LԢeGCj\rњ4fFK\,79K.RhP.Ԛ%.n~":(0qI3V.9̶5 mOzЙS-(8Jx<2,Ee#ۡG@#J='5hS 8,9 ;o`,L 8[oz8]SQjlQXĨD+SeTbm app٣[TB7A* 5&`U~\M-SMgYz~w&wf |^8nBo}q緻CWt}[ _x.`8]04)L]Xr0^383fY_ PMoЂ"ؿ/.S=0F1MsAZh gu1>:DNˁ65cdAɣAd)hpJ;0]Oթ  é":uaA?[1D;D6PDt=iP7!u;_SZիfu]jXZֳQ]Z9ǹ>uozN &l! 5Q3rlK!RO]ꈦpyěu:D㑬vح !Df{sQխ20qn˜@2M4É;\ 8>qLYqPs o5-k\+12|.4CPۼ:gy=r\ ׹7Ne ]Քe-4Φzݔ=gi 46Q::tޖnB;Ȍ=oݘwk&;C]3.^&6%yL<3=y;''5oz/>'6]yoX7}_^>Ǘg'z1}޿~gQyc/~=O锿}aګ7=V3_~?_~[>S䃆+?᣾eؾ{#=?><+{=+>17}H2p#븺p3 Ԑ6P,hҐf!-{;Ҙr$uc7{7&D; Be eDb31,Cớ.B C6l4>ѳ/|5@8T6D$9/t54ACB|Cr?DC,@92 C <4,ʹB4N)D EC2XPL>7Fg,NQ>CF hl?<#IBbC}I1#DyLY3`36 y'[3x6RȆB y*H)e4AN,GIeZvCd̘c&F~ o(~1H%5h#Zngr_H"RF"8 :`3(馒ߞ1f*'bLh*kj*kj $i*욙 fNš)wM௠h&j 1 ɯ&ì; ԛF&$q{.䞪a(ɾi4<ɺVNˀ1ݞ;/piAhLLP L~no̫i~x.̯HH<. X_}58P\|rd!k5hL}U&p|I(,L1*$5{pǙL"c4,Fq=ܭ=Cz'A J1M}Ș:->:@S-c;to00ouU]?|)'v^uTuSo}ϫl+}('_5N+2Wer8XA P?CaFhtPBZĀ?V3m[t bݕ 8<, K\NXq\ dؠtKaepWF3Ahq3R65%l{0{$%Pd y機s+ȦE~h$p/5,LcކQ{bʦ8G{=A4yFjhܨ6pCW$vd ?!_qQb. "Ad(@#P-롏F םF$h,2c8HErw^5!Dl›wGko_Mq-2<ϗ25é20DTh aD 1(t `aDPbApؕgp\wkA<Q0" .0q_ؗ,\كRLMq6e-C65 hP\5}ΗR[+5~ CEUk%ȥ=/J צD4r d- hcI4 V$r SdKz]-HSMΫ[j=DjO(D)#wKWz>>4Pt#\vXTm-c;ڦkf!ذ ddԦ&PȆM>/(Ilg7͒ l\5WLƃ^WVXM"BdQr0"Kl` BAZb`T ş )fȊ>؇J;leHo2%L3-&LD}z`Z-\{Thhˆʡօ-|+# >vE}k-{7d6i_F~D\ `Jrf/ǁ$uNNE,򱽵Sryh]ؽB?ULslwZf:-RB_&6En6uL 5WϵTwa \xH6>pOcaTiD)Br CO%ȁ86~M&)̵AWTIAAVeBB4cT?S_HTYQR=44@tiHovfS~I)CHGI3qh?'TfUsBfyv^d96GX5X9NŋCfv|52rU7bA[6sig ifF1x{>3".%C\$FUҶ3 ):(DhOg7MEoq <)}FyzEi%~Qhyfuv-kYwR54zV7~}~= ~oO<%ywvFitUuBs Rgj/04@ W~36O14Ulq],!)\\xKmԗL l7wGJ4ME:X8$/pCjDHSVE6r(je~8_ \X$>c_?P 6 aqx'n (O JbxEqX rCdTTBhT S @Pk`dP Adt   .p-@o@.0,tBkD"AFT! Wt4Pz`yxeG9ƅbUtIϴH Fи^y)o__W6?(4i85t0URHݒKeUtYp&TwYe{Ԗ2yhl1\x: mr}8+Qj;xzbD*hpgUBU`G~Ә~NkVVW2VXhqz؀߳pZ_rmHpř7P'52FPVv*7x/({8n\.¥ d:@ e`D@0/ .@-Ap SB8Z/c/[⡺#gOBZ\3l2UE{FX[QSXS+B8C/yW;% 7ISvIXca5Rxkh6ҋS56'3:eUb;#bvWx@8BZ4{{nt֮wW ['1BKI* 61anzB&tH4AW\[ȇ׋淝Drq6~i<֯p[oã2}qtZYqsO7bpK5 cz/b .7 5 !^LqBgȻ I AjG%E 8 P/@!?-Ro-ƊSF78cFLǓ67y}B"|B;1ZBF`p HOP.3%1\)CÞSE|N(SdڭrDp 5L䔵GW}{ uu.HC4nŦ6_孖g&K )\& +$KBxbnr"4U"" g'!7|CZuy7FUV646\畟p0T<܌Ễ"k˩YTK_X~swO gjb!u  b`jr+tՀ0'  z{xRop @ǀip$P4 Kp`8@P/ J*p/ U= cexa8i0El3;5Fdw:i9, Xjzńzvd_z <8 >Xu2EYd7C? #F,y [#y.*=GF0ڑf2RNrwsmr{3UL lЄ }wl(̘UČݿ0fG[Pv7^x<(p:=oӕƎިQ!k#NMx+'Œ.hPڜ8!S/nĎ8"FVOW Ro@ EvTQ+/P|E0+rə?@i9, ˉ3Tq h D'n;K/2*Ҩ|۴iřvZTă]Lmv`vx oIr^T5m0cpNeYo4FD9AD| c$Svm.{m``ޙ +0ȧ *?  ,ɑFթ@/᪠bM.J򿈓6uviPqiph轞Z(۳)x#SFsgOeH7`#P2aJlNk]Wuۛn8A-CZ~_h[ 226"-e _M:AN%wdK$<3 gTqm{'1=m'S*Bdh2$9LѓvZ%M{dd0~W_u $0D *JH>xM᫒aLPM-*EFpRAV5CĨia e49r416zrk7i N%)13mDahDIEbd-m R1HGp*#=90 +ȀHngN(*,BihE RF4RdBI@rd̴(fṛl8%9|&f$9*!Oد .G n>V&bkT֕NBq3+T1$"hUDt+lߐD.ak^dV+ -E&T}l]Ҥ3D1;K||浖[wʓZS|ZZkT2%hAQR6;̥^JI j'6bt‹N-=bpk5% i[\'rh3vܺBQliZ1m]lОt^+ZL9zAcMe>gPTYMeEBh~ ^ZO P.;L. dC O/ b{‚͒uRH9O[\K~_9ԥ0G! }cs_B炙k*6YrE{B*d8]p:s dvT=ES2_ۿajRAIG1R{ F8t  WrqyQfڇ1*9 ޷6#1"zxbjY;5pK{C#!#0:y4r*n5:A۪FYqAC"zD:j++j{+;#"%H:xm3S*Fj`C(%[4i!C⸁›;1 !ٔLټӟ Xa*$<>C>M9ytЮI4a5- rC727xļۊkI ภA!CJ|Ѭ h03[0alz_@)J0< 0+\@Y[)|2*3Ӛ" -9 l>Mx1 [haH68X,A 2sj2b[: @ 9<•"| F;&vёa"8:<ҴPhC0%֨3^4 ΫC;@kƚ'!48;DC݃PJ4H$pw&؎r,G0't G ) h)(|F(;qI)h̗%+ ɓ#I_<3 +a4x V8DM?k ?isA&a PSBȊI0"x|,z|[:2*-+j-RxSຬH^ /3ϺBCGRs) >d I{Ýv < dI ٴ{R1˄J`> IM{71Ԋl>*QQ4"C I6'qKgM ^RʣdFQA1ĨBk)4  7CC!ABLDAKDcD# NK5/L ɶj ,ǹR=B,;L+5y oQG$ұ q(#ӋnFr&q~q)Gr b./01'273G4W5g6w789:2/e;>?@A'B7CGDs'U-WGHIJKLGsjsMOPQ'R7u;FW sk;;gWXZs}0tWWs\us^`Y2}It18v16]׈͐vcwkvvjdsp !!.fGsp7.'av^u]nru``?z7n}w}'v 7xn.wgvuVg Yuqxg1`pkƕn~_y}gPuΘ_"y`S`zSyzu7x_8vvx?}HьEwϐ|/{h6J{W\gz yy߈}|׈ |7{|{wx(ͷ|w}/|G}}я?Oѧψ1y_x7g~x~O|O_yywӧoykC~?_}Oyo~}AXphSX`N<M>&ph!'[ФGXϡC]&Ȍ6w)RgϜB#hϢH&IcPR6*V;53&Ձ2iʴ,FMdh;pn,` -`uk3hĀ+W#cیFk+ -hϢ&sԪWu!aH궲EO}޿%>ZcG:sѡkl&e7[ }`a*U͸(6˱( qL 8z1p>5O NtQb艕i`z9X>\V\}|qc%1Js/fSr/Q7َf"u\h $FmMt!aԕk-RB:OitbVM&QrX 朏IX6Y(laVTM`(]Q )f_MIWEԘJsM䙞ui]hrٛ@UYmfuf6ݟSU?Y&}r1>%@ĕ0bU\;9(d1ܱO-|e /^~:DR2]@>h DNW-d=%Lpʝ>*|YJl-EI2-M4U"e9P=4Q/3!Ces#ӜzUi1X1Kv$.DSI)n/Oz4H|؛%?zhӶħ[|FW4gO2l*ށ"gJ;dQ`t}SO,tF_u`7U{U|.M\tgֵW!&eՃKWAx z"aRJ".q0zȠ! Gq``zX=8~[OWy+xe^> =*HEb]Li1NR+ ;hv@eJy#Η7 )NҠ2.l[TF(fIW+\2]iR̘t(- & "9aJQ)T*,P , UrXɋI,M@Q_0FrAyؒ Eh(!HANP|cv`ГC@ ɐ4 )V$L H4?XD [G>2_- 7 (>Cr6^ro$L'MP:"6k ׾r7e2pK-m01d$u]u;hE,&L['aij"; V A4AÈ$"@JJD+t/}2?VaNygЦ8}'1]CF8fk:2ie F&L\|dOPɱMφ jQ *wX9t(iaHי tkB)KYݢL"6v_|JPj| Ny7rt[X"-d[Yk]&ʍsK,Yd1+UBx%Qg3JdE Dܣ! db"b#V-:;NwM 2t4GZ1hMCY&nVpXg 1b*6szh"3KOĘ U{P.f-YDb ?BH{{S+b18>-X+L׈²{6wkyd6Jd 5,i(sq{-uoĨY{;li}TII3H&aau70|1iÍdeYJ$G5 s$^CFXW<1B?Ӳ /y;ޝ=]ULO$5o:N?WsLL!OǼl~'g;ԿB-\7k*$2ҙ`֯4KG"#4_zL:-cA̤kv􁾷E~1N#ܧnG&E\/ u@w d-J͛WnmaS2>d ? 48]oy+(:](P(AE8%xӍD$\ș̈́Nt_~3}5F0`FPMѻW9G1 ШTӯ [ NRY2HGД@"&ȗ ȥ =E 1 ) r !EДYȔQTpAh~ޜ%Yys4 @E(sɜ2SA-(r Dž ,r P\LĉXM%Mܖ`aEIѦa@pVf6 H uR\T Y X N#T mci E VWVEuDt aEdrVMv MOxT#~\Y m ,J"P l=NSNUP 1nTEP@-ē0 Kl#$ )I9s i\pɬ_XZGڏ! DGYȉc <`G %M(yU(PЬ_"-/ԑ V)-h#qA嬝ucq_Z2X|Iv1Hɭ\L=YL/JHbiJi"tVGBJRV PDwI iZڼ #AXwQT}SFߙLO"QLMd4;WH$N@`E"mIMx">iSSHq: Tgƞ<-^cI"$tQXdfaޤɒF\F uT4Z5NF(9Lդc~cyEh&'֩mDxPS')i}2֛)Npjӥ1ЄA։}EآoryE_mJhCərAF-.#PHl"`tLmgG؊XOSTXvĤr]HZh> \Ҩ# QؓljQӃ&]"qS":"cI߭hj]x FPlM|om$ˍ0QI$LSju%bӴIh cװB>k$Ck=Y]F\)(COhk=J IebQ7(K|M rV ġP_fSI'©Ԧz5oWS!B6*lP҂Y9E쟫*LjoS6sQlJ jΚWdlDap nq[Z!Saa+l=Xiîm5ߑo5(pa~]B*/*ك&X/~ĺyVͩV >,yE e%:ާ! >vWn-'v Eq.NpnFnBSpܞ惢ba(dyBmXlw%d [riptUp |"svRBiJ-)f&*0]|>'#CqюDᄛ zֳM_JCOQVb\W퇾 (~mC" ",+jo2-vo K_ݭPtq@~28i4>iVVnjb3!V,M59e yRT5'Qί]?--=-J޽8/H.M\p?r~`oV\XWMLyӫJ-Q'ٔ,E$FF;&"4Ÿyk֔t(KMlqV"IA6D&L$t7x$wwyyOB47{{{w{OB=XGx{yCDxRzR)W5VlqvZΙVVHLFGӠhw D%^[Y|ET )xb^mηSf7`If7yY&>qȬDdk{kaMd85`ssv#xzѯ\`DX^SqkcO`l35g+hkQc4 `r_J|wXd>DEםaZSh.:6۵_9/Ts59= bJHLy)gfz?" S_-{OhmE 7_chQx_?cf6mӥW~8'Z?VNb߰jX6_zh\_ש{'S|t84K߅5iy;Un{| DŪ '|Sz /nA[am:4ȷh2P:i<5(ө>X9-83gw^9|+[ {i]S/S&'}G9iQ"l[ =:Rc65׫zx״\CyzfYq׶6v;W͝OY>?|^ )Oyɳ 8yoxy|zÿyN[$~"iCφ%|-5bk6@ԃVOz Bۧl_4z[p@}%&F}e4Xdž<H}6?x A;Nd8r ɖ,rYsbLwN|է΄%a̓%Vjhǩ<)&3לcؕnǖ hsjѲQo~%[RnLւlU|$c_jya* f|Y(fꅝ1#eUJQj䬆imgkg7Nhq4h(;ppnʐBÜUy+ݷ=CNk 3Lʐk[;*z? \C)2Ϋb!H0*Lj?¨P30Jȋ1ADPL(mm.Ҏ#M&˽̨P+ξ~ 7˂KPʉMCh7Bo0B0=Nsb u} *S} =hbAiԍԧei&+W,-qQW(0D\1!jc^L! qJ9i=QWf8j5[dTu)X4x&B \́2b)ydIeB]-63m( 0n  PI!ہT^[ 鞤MaHG ie+H&H19򂢌cO:ϛqT!X{y0H=~;).sь/SZbA23 TVL+WUr2>I3V:YWJH13%БsAL# z`!,q`1C~[2 F+@" VyJV >W)nW<=csyj,EyAnMR$$k4:^dX(1v4kibUzH]꣩ƶoSo|ַ'kQ/i2IEwƔfS$)(qh7z]m^g ]PVeVvSh4إG$X.Y #FccQ`d_.#%V;d ΄&<axB{-?~[Kaqk=-^q0qEϤۯٮN0'яԺl:ʑ3evqt̹.T]~S'62 Jα1y%Ǐ d/CQoJlIVhCJ1cJ$`U- WB*$+-8vZOXbFX% a3B*XFDn )aM-ia.l۩hVmG}x`.轊|!gĹL{d*t~5N>'ټRmqe^l6I똝wٞ^_*x[x:$&qNv}+Ȳy gqDCk0^ Hxo?[s#MspJW@ïKqn9@jh.:/wurܶ˸v̀<7չcIGKvNQK>kؐ]Gz|Sq-wwG^x;E,;1v^>IBt;}hVwn(`r zŸ>@ë"p$`y,W\W#7ֱ0maV/!R.0F0 )G@!\Zu\ X:$oX fOfH.HoMNFAʫ/L&7G PꄢO/O.Ǝ\O8nd0a bFpK%04k( g_0֎ O Hb`T!o`-$Av.De,C0%PӬ  Є2a ůCO |E8n`p.<,P],yPO5 aJ0|^OREA{;iЎPJ87Xh4#LQ1 [bwR1 Zq.N111|PHoba1 4lb &+nn.F* ®ImH&r!2a P/!vpU&mUm'Ǒ{0)'puR'm*CP60 k%q+(͒ݨ) R+݌nswY1/'*&s3 CtBC/%'S%]*Pt(b np 8+.^Lï^nxFBpRW+0'*}7)}R0q R:8x'-7le< <):<ד>sU*S0'R ǔQFoi12DT$51)Hl !ڦ! `13aD@ zD#! @p|T$kFw<<.,Ҕ>׳>#/<3r-=pS3s@{q K7=p\ju:[>4\5:Z;u?C[J@%Iv(s!dI2!oCo(ƚ C9pQ;#B'qD=n@V bYrGxEF&GfT%7N@B] /OheMALIU:5.Q kiU>kF<ͦPť]?BkͲZǖ #6UJ6 c2vU]4ONvjjmc0]/vavzT8q5\;e.G0"}0OV l:t@r5S,S)1UBr5 ï^buW)W iOFXB4@e ܀/Di"v#J20H M"!cdnyM}W˔owPnE5nhvHku"OxW !O~ba[iinV,8yii,K7-i1i鷄 !wpևhgtԆq<}~GY5gMSiS7=8痊hx[uG+yxXl{yx!uws؋1Y6u؇\~UWyn"VuI%A%g99d T6c{=2qtqj>Krm7 a@!f7bC&O/XF2#O&3%uW I۲\0Ֆ_$֚ 3kWt= y` qttSQɎr>vH6]?Yxxp99Pgpp9GІ+LM!xTrXO,s#!0y=I~tl*qSwkf7lW6G'8PO1ٴYۛ8m$nq{eظK}Q/}񍓴y E  +Oq^>wZ=e[ƒћi0˔Mڧ^4zۨ aHz vܧd=h]侙4k܇Pch TSYNJ>;lR`BdkR`Җ-?QF[JIeҨWu^*EzJitې+tkPd̡ϻ"){;pcŃ 7f(C#Xc!#VaԠbEGTȹÁ?Ά g·,ߊ *ag"v4}I-=82L{n$<0-d 5eA֧y9PAt|VrvP~% ^}gcot Ӂ[G QfQwPqYWbDwwUvooe睋D P4+]RZ VdP8^Wq]Ԕ>Y]Eq9hʹWN2%Q9RK=YF\ԑUtї3 fz2TUр Wm[E_fo)gpQZ8fn6_[ƥ'CUۑpbΦZy%fFHe*=+-DWC닑MiuVf[g>v]kgZa1u^lqԕdGbb!wՃ腘FٙԚiXGYBօcvkZ_AuWo&numV*˰qNI&AՒF1R5Q[3NZ-OUVUע2=ULťgM $eGjMUkXpeW>(jn9lw|_ ꬅ/cͶc2Z`H#WHXmZ6Xt T=8\cɑ>3ږ!.V!nTɬٱIcb$i⎨m9(5_4Eaf{kfTn*.wo^ocmjfv։|զsy@~ eaHI*H0$#X BBH%yi\zO$#TIV: ~%hq7awD"8Gҹ. hxPU *ux9QHTB_XLeAklo!VuKk'Q"[HF*Ef2 k>yn<r.LHgcEXN-U e.[%IQx\R, oħpPȥ\$ rk\/~t< A\̿pAnI"-+odr("JVviN>5-#c'21Q0=p!ԷkɊ^.S`D݅غУMTN.^%= BԬMrޤI=M`Ҽm!P3awgxE4i4=L!&%)@ I(#I)!A(uJB%)\V]p7ivzS3IqoE&E[ҹ?8˥R+>«InZZO [ ;-8#LWz+p|_37'!L#NG~KA |\5fnlZ${”f5+r~@&%uYQmPC1r+C/>u|'7 _ЇcW~'⧾+?'y_ g~g|~}7ȷ}ǀ (g  ~~w}' X8| /1o 5h7:884x<8:i >XEBxF(L4?86H1؄O9QȅEȃD0!Qh@Xhm18@Q i(XُtHhdIȑ) QɎ(4 ︑+I)#I/e) i9i *Y9)9 dO9G IYI tF'41=$.xsqM(m9mtyn yqn)!4uM3  o0  yY#c$ F#vR8`Ѱ8UF )Iiɛ雿 )ID k٘)=r$ e'ǑCb $02bB>xKFAi6˵]_ yt)D/zfx#nAԲ>Ķ3 {˷}|[ɳMkKmjknsk6A+K{c{hKX[9[nd˸} [uzjꞪ 5x[zxG 뻿 ସToj: q0ǫ,[IhLMv &DCFrCgvJ*+Ky7s;mYfem 4xeu{n Zw= 101dx#jB7j$ o9j0! , tbv=3@ `&lԦÐ߫ALCE!n1fě@nN R 6|>ŏUe<@c\mŰk%=t/&\'a8z,9ܶ$I{trܶ 9p 'Yo9xMBɊ|  0.wH S<~n4A5˓Mw@̲˿y71L,`L w@Dlg̾Ln~;*z ɡ:nm€P| :p1ԍɸCܡΑ oF 3+ hԋPG- 9 I=M`+M؊zb@[$<|9~+ 87//80)MMM] #&>d\5F⁗nQ~aNi6l1aA9? ?[=- j@^n❪u z٘vx|ߓ Mҍl>7 )*|ߧ BA@p<`wE| O ^3sT˒ - M H ś`9sۄPd[P .9LI~GӷV$ں.%)7`QB@Й1Ф `IޕN%V@ a!4.+má|$` @<')=/ ,pIZy51Ϳ̋P(0Zӯl:G̻ 1F10\Mloln|T^/7 ڄo0w/VJ_ʔʸ x_$fUbꘜM_^-Q<Ҹ B1+1 8}.9Ѱ 3p ڛ]~ 䙾"ڏۚ-+] Y}.],xm Bm}f<8 }rda.m˩}21 84R_}ݙ>;:)N-"XrE CQ_!8O"щ*ܗK2CQՄ b(F'[D+Zy_&\aĉ/jR4zі훬,ƍh G'yʛm$Eqq `4ђm<8glT=h>{VRzYhtIl2húZ|e,{zC'o^lɺ54掶 2vNҘ}䑁h1\|:h8H}8PO@0eL7e&:ݬ'=TLl %Zce|S&KztK &cƀFP޳.IO7"KT94f 8B" }X YYE'T:ηEevAVS;\bVC:Ʉ(X $E7 d\A0 c@Bw|H&È#!ܧᇳdb0:Z¤4yـx,-Ph*hzjjzZA]μƏVrX1G\ecPl1.bPx^3(|f2jFf8Yos|g;{3g@Y~&t =hC'ш3(h^ uok gݫ%Yeࠊ "u!:Sթ>KUծ^5ej[ߺ֐bsk]3~ébf{ؤN6laW; Ѧ6ml#Msu^{Ӧ7-nXk7ow_m|\ gC8#nx9.q8ja|ּ^[vi&Lt/{٣9'Utv{>*tFO.|[̻lG]'.vgigڱuU$M~mܪ;Ql<ꀷ;۪_x^/G܁3ys/|=/zӇ~'}Sz֌έm=Ul:O m{Jiuۓv;l'~z7Nn~݊_'?~ݻ~#&K?+KaS@Ck9ӻ7[ |@qS, ACA66;LA$#B%{B8vCj>*,cSS=o@Ծkc==>n;v6\ï5 ;;/CAT ʸ}A:w:kcX[E46@:ƣ3CYݛ56i: 1\ҤK8DਢmGr,ICGs$}xGPvG{e@5|n}H}(LH\>AeCZz*ĢnDw<ȠljHȽ@G*˄znܝn΀}@xdǔITHt1}CIɚI8<@H }P4Plʦ\ʧdʥʩJtJʬJJJJʱ KS? T@TA-TB=TCMTD]TEmTF}TGTHTITJTKTLԭJttL5N)-NR{0d yEB })<v^Ն3՘UF@ЈӲdMTkVmVnVlnVpWr-Ws=WtMWu]WvmWw}WxWymWq]R1}ЄLGT3)-(eU,5Ob)Ueŋ/=؍0aUH5m,6m ل ӈh0`IEэ،=kIȈY͘Y}!Ŏeɛΐ}YYEYuY١ՍUZ5Z EYٔm!٫Bڮ}ڤ"ZZZ]ۣڲYZ [Z}[U[۶ۻM[۩\[[-\Eܱ\E ĵ\ܸʭ圮 ]-PUJ&W}]x:(O aؘXMȐݦm,ôH 4X]5D<ڮI _-_=_M_% ]uH1_ x% N_`^` ` >FP`>ID``.`a%n`} ``a6aV__E U}%UPR%O-E6qQ|a /fO}z@TpMEC4@DC@dD$CdC&D`DtdFd@ahɲQYEndȈGNK.e(eVVeEBDvZ^DֈL]dd_eOMfh-OTVfTiec>gneLeLf[>e\XY[e[f+bafcRcۑTٍ(uչRxc0^ .`^7nt/5L\R;`8dHh ii&VvI,Dfi.i> &ߔߙNajGdiFiffj.$jFEiHfj jV꫶jCtn V6iC뢆鸦illohV톈NVkO&ovﶠk0o 6oo_̓ǔHMgJ;xn]}gHg,5 `O.j|)gb q .|T$ 0x'x<E80@0m>)D1qL x4VP6׈9iPsoqǘ.DBcpi8W6 tsp0sHs97MsB?i>wsG_tuBCODWiCxRiJYu0ɫ8{͋EiT}HSO*-]ȌLGZܾc '@,1߇t߇BXlD XRaOHvu4P)]^ 2 ɕ4xݲhDi0pvXdyuf a""N2ST@m4U.jhg|rf}F6T-#vѧO `2 Zh};NkE]$)>'C28,R<FD9@`q#sr\D#%3dYz'F=_@Cdw Zd?&CbExɵĎ$cេI4p6cfPK 5l3ڴF^3MO 3S]gAT\\iLWrکT\9ECQdpĠQ9a(SZaAE(Wf^4\(f,<]DD2s!/qF A(ghr"FbcbD=ѭk\ pD-S"bKk>+0a'l;E>F̏fC MQkq,SD끼FIȜC0o(,g?Tm3@"nEYpA]kh& k<[9]v-яe3YWp=9A.C+M}1:[. BBQ-D7hgeM J(X޻jTL1Jٺ{W_zPQDеq.v[OĀ 9FH&9K?myC2FOEځ= "0l}0`4ԣdd-'2 E{_eHB1ӌ{NDe'\<e&a6 WEijY #q;_-LB"9%c3bK wAL)U Cm AԷ&CX#=yt1#)G<W)"z*[(E]Q%(jU KZT bX* *ki[*22KUUibFgHoZZA.id"MBAe"Nc, caSp!;0E@6-s2rdo !Vct hfd,\٠aRtA5X:- # Ix%#h iYe"4P 8!AF-)Bt\GAH£A¸ e0̴) 2AS}aTdaD$&kɠH=e-$ j rA3Z FPsJi=2(ZS6&4)=hB2:LHyelb+E!dŗ& G%R ( e S4h[B*iF꡻/H20 *aH5-gzgw^LϬl' K_&4A1|*<2۟~AӐA~4xFׂљM@:E=^hЀ D7*0bVI,<-P*ׂR 7=2x6#,VF"̪\pn'6[%muq5JAsq)b6|C V-[]_l™0fq cr팆r.jr- 5=)#eˉPzeRv i5A+NŤ;[RE$4;` 3l^◾kjaȁ|, _-.H@ceb1nhy0Xd-F=ViE\O"L$Ҹ ^]+JcY4/O٭BwQlF4edŕBnaTHt]EsV^lX͹qoޭ''tMXW15i¾1–ݪ_ eK`k)[O6%9'8_`r]mlÙvd&]Y;@ RL)=5a3j_KgB2j#TlD}[3ynL@5e}f( hx7nMeЇK %"YťaVwiJsn7&]M}X$9=Bmڌ@p |Brvgf{ZG?V1G)Udk#Uy9oyX5}M[ѓYF)U,@YyE7sd XU0鑜ߒ_AØFMY=)_Vm2dH EZA AK@7%d(FX!^+&̒2@XRpZa.$DFZS8J^D!_(B͟cݬ-];VӬIXb"VL#%","W"jEub2/dVflrp-h t'JV&&wM"kb'8.'|&/f{.e.ezr3ͤK2'\lV'(|b{U|$J茶WT%%''a}–>j}aT«ėD@B24ΐh蚎jDPA!J]L)kL:i*n^Šj*jX"j>.àU0j~j:U^dB**>j.b~*V****^E"k)O֦*ZB5+>k.B6;z()U@A h)j+"Rjv.ªǒnYR*R,~k2+nbkl,ll2kl*r,\,,,jjn(V)cHjZSt)T,f2G@B.EԿmLGffB0jiL# .;*.M(.#;2.@:nZbnBN^.L  \D.nFV.9nfnn.;..>nv. oj2nb®F/n:Ď$daV1tm2SǍ<,K6fz݊. V&8 …jE=:p;p cpk-fڄV lEڄ2JپDÅD>$"B tEȴ{Z+ \[ߪJУ|ɿƈAlD R.qemnYiCD&bjHTkSH.MlY(H֏qdMQEpD "a]J͌2E#2%&#{2&S|Ht>%r%&ITrW&2(({(TX2-w&cjRZ 403 K)pE!5_31la0,r+;1-csHA@H `3".Sq(+92TsS44:N:OCCt?r:E./12T@OrH9g1LVST/3.0 KDޱB0 Qw`J|K,Pu3kH[@d{6j5c31+Ib5Ek\vf[6x6>wH6.lS&02K#T5{u"Э$R R|=lfP@qW2jw?ZC1U(Y/qi_5)ZQPl(8 c򨱖H038NwurHRDm88x58JkAwVCv[㳈{S߶qSqItUox+_yruAಋofKZ K(h1`E;ES0sh}'?`&s3ADyo[u`[loO1h YKzZS ra/W9j6nH76b3l<6IXbK'vGc_sG`5$-7+:764^u_>vbZ77` Jeȭ50W;EG8IuKs{v]93pO9Se-Lw /yz}I2Qe'˺_S5\HuTP|砵6ƃ9S㸓/t:88\v/M{C:`0QwQwݤ|w?JغgL7Sw' J>}탶o_hܷ@VAeYxQ_=fT2/8b1a͎y,Xa̚bm!͠+]LBӨJ B[v,IZAӤLL7c n\sֵ{o^iBL`\դIG_VĀ#+֊St<蕔*bL1nDX} hm0P/A / QHER5lO\X`LOES8)f같ncO!.HVC':=:$HB{ ("'To+"+n;,$ț9΋hr*RP HG 4M R"a4*!|(2LMIzA7{p@g#TZF8( F Z Ho¶ӧ*h6$!S r319Hē\Dn8 :M=lQԆ\DMn -J9N9[;U,d(OP`+Qa_m L=b֎{XJ4U֚UvLh'젛觥>r8:]q-d߅2H"a~b47h",8  X&LhgX8Ci"M$=c}5w$(V{DM4 j 4NnR ە4\٥oa M[V݈ғm 9ns3-nW!K%(cT XΙ gBmDO}wsޭu#a+<𦞨L~.:Dò."3Ʉ[R&_RDK5`D R͐"y&ZrF|Ŭ'ѡ^3n; }D3F_ƃ/Qd VH5R5jW)U}ݬm>h(EYtc%ϕQo ɜ>S  pdtTD ۠,SQ̀dUC0 w6zv9۸L) 7;WDn1 wV UEYkL&d sWS$J)ar܇[G?1.ޕ!KibܒM&!28ldq_(HpbIT)HU?PHm(g(t31SFD_ZPIa.΄pJh=Sj+6yT9+oϼuE 9ϴ ZeJ 2v7R9jDbП[N咟gEmS߻8)= 1.MB28WBQAS "lB" #EIXؔ-, DYsݯ3y z052B SDrV"'/)J;5 8Μ`.h+ 롼 W#M4PgnEO>ݙЋΨ (Z]F'5P-VD,Y4Κn^p(^.wCV JHf[J- 1=ԟ˶ptI. +/'jS((d,ZlKfjJP/y77U6u":z:/:\ 8t6`ɢmgCUr#6+K QQ'6K+aFo&i0[)o^ IKJ }Dh)!&zoȁBτaC# A*@%L eT ,٪MRV4}OQY}ASر]]4f;f\ڳzMcFƞfᤋD1jH͵t-},:•t.gcNQq7A Evdk_[.Í3/֕تAӤd!ШEʂ*f22شKJ*#OuZLI; { aLb/8h]cl+)ۄǬ} ȵ)-q LMe|δK,Tx-vy`\-_9S^d }o$)aiW41\]O:GU|+@X^䀻J]w$ipi8=]Dqغgᇾx7{ /yW9_'97/ֳ"t1_{'գ<;R`3?m/| e1gLL,NnoDZd6umKϒΑ!X~/Qұőn,`8L 7!Y.K[2!KZGnͣ*d+a"((r/bd ùa*}Hƹ,)3r`ءc+7҃jc|D L"!onr. S0N-gLn3A䔁-%SQ/#-ݒ3R02Y'S3[4sNґ3%S53#Qo1k39h3r'-33%"&+s5a):%1$+2/R:1.25#2o2%ϱj2ӓ!㲽:W<s1lh-/0B)r@r)R? I:)`ƹT t+@kƒɴ Orܴ %N=mJ..a^tKq=EoLSJPorI$K.eK kJ2i&;;.TN-NI?O9J]H;S#;!SڋD!4!T !A() )+2}">F,a#a <ɠbo3[/_RV;1\2߱@2s4WuVUr~SM9 _3Y4$1Zr!BC?z$bNj#&j&\~Eao&'8)P)$X"#lV(W3%998#w£jAv:(C5e !]#&*}'-3=5O;D=7}U][=S+Qm9e'rۤ b}I\ٟj#5 ll6X]c9:T'۫}7UbB)"ӝ#}+leݙxxJi}ݿBB]}>.?7ʧ?Ġf; 3y0WgM#?RgC5ZH /g f'hBEV~g.{]#W>ݓݓg]ރ>~>g߽~w]y]~۝+ީ顾ҟmy00JW =z Dmg\inq嘘((rq\ v]쯞A}_͞G_%)?_ ;鳾ѽ[]?]k"7zۈݶ+/?xf7Bg:8*~lT;~=EΝ={_cM[Ꝿ>mמuE7 ' Dxp`Å&|‚Jh0 4jbRsɓ(Sqa4h&tʛ8sɳϟ@oXOپ4iYRԤɴohI Je׬^MuziEKo_oU֫}3/U5n0#b,,pbHy2⋇!cfyfʃZcΨ7>]gђ7V-;ahŶGn4&Av7ޜ,擯УK~fՅF&? ҷIT^yw޳z.]߯k$ĺfYmYl`g]9XҀ 昁aVjnb&ᇌx#vH!}֐uRDuAYUĴTM>DiBCYVGPo#M^}eU=AqW[YizfY_*V(#l &!nHby)'hs[1!)I,YE0b[TGDKt<9驨S_ dL܅U&T^c W[W%^o5_]l}\%V}˰n6ꢣ'm$j& FmNj)ٲK{{(*G!Pդ&ԓl-w@7 QI>jlYފXbWWVR\f_q_+"b.Jg ft6Jr+frd/ۛwƛNEʼnIʙdNT.m6ٟ$IV^I5FAZwF%9mf\%O}GmNVtOaԘZ-Μ4\+Zp,+}/w[6]<mM =Lڟu> _TTu\r5^$eu \{l_V彞,g4E[ʏF:* Z4xIr]E!*fڒ]cS7zާUT3Avd"K!’4$ݱ[x%2oS2Lo^sW?ٯB&EPMęX:&.-傜?9NR> Czٕ<)J2"SPiz Y\b⊳mWYl&{PuHvrHa*DN\_5c*s{R h9|uӂPЃ3=S hn0"+ ^.LyRyDZqG>Ϋ"! xF1>ϗ=?rSea]4Ao?xOo?1P-8NXxȀ؀Xx( 8h؁ +&8((*,x+8oAvȧƗp'jndd5~@atJQGf@L؄NPGB6GZ)1vR\g5Pf}Q)x#A$ual؆nCR7jxI 5[ZXXUd36V凂vp8~CQ,IqJ8xC%XY.(KhhYc5fWA17S277;BYXQT&rr2kPxFxE$h;T'(eR˘r(Gx1֘I/P;bxBC(hHP7/%ݨ#E P"G$=qxti$u2&`l Im,BQZr%>'9l)Y0*pJefE,%5_Uqf5=P2knpq&\A8I%QlUQ>Mi%x>Ót%dja%o=6s8YjD1gic_ByD _ya>Y`1nxї"s=)Ky,$8t14C7*YHxqroރ7C9x2\2mY%C8DU _܃1_B0ysCHQ HwթgR% ]ebR%H>ke!27꩝Қ-)_)YITyUr&ĸCamaiQ)_ȠVڟ0/)<"[C$2OHYzYj[O*ţI*go p{/o[z{W$Iw 3~ˣqmv˷{?ze>z+[nkJv˸[ i;깮ۤa YYs^JFWeSYf<%s&51D8=ړf= ul4TYV1!3Qs%ڽ.>yyKxt1=trIF%)Xr&ӺfȒCY1g7>򋿙K%(|DH.l)k[C 4汞. I.q,A{xypXdj,E0*ýxq*ƀ),P偾I 8t,všƢSyt̯_!//+&y ٓǓ BLy#db=D&X|Cy\D42_ӔSI%4ʍg&U.\?,Ϲa,]yiQX|XpZf(1VqkH'*h,\|4, ξ#<\ m| m] X7 ='AUu[`05Ma`j-j[q[ Q LFR OL[FT3Wt`-\]kvf,*n=^mKrg}iw=|=QjxՄ}MP ؊-ؓq؇ٓ0؜MGmٕp-ؘڜ=ڞ}٠ؒ؝mg=Sz*4<+P8aVNB%`z߃y*,X䁒8gQv\U* ޖ=AZQ_5D$ɓ~ UX ceDUNH^7- LUX<j1fػ^Qz^y?_=[rf bXz;a%;7a@g%$j@} x*aq>`Z)0fE ݩQ&6%XCI*94l=x*G2qAl@X勌z3=}lĸE䔷D:m0s|,s/XYڍUQy8] `XܫC>~XC8nJɭ{/uz>0~ĽN; ~ q#Dq]k0VgVdVq}3kHWoweu]@xܕY;dn޾}-G/Z=}0}B-!A EDDh>*&|] 90&raL0& S!CdZL B,˧$tَKV}RFeé1Txᤥ [d[h҄C}Th4TPR& ۓQ+:@˷%ʫ>qM njC?N,ݲtTQ p-Iݽ^twPs>Ea =|B# ;'}vcvrH}LP}yd ;$p°ځcvJ/EW$ϲIC7N 5nDLhl!E!;H0-I~2h!!VBr~i`XiE LR)-h+#ɠԂ+r.vry0<3o; S\GZR|<⌭zTJMSnk-J/$BH=A&BhO|{ $H*l p *"j)5$_DԳd3R7we,pۍZH:5bd==ĘQkEPeM%;-O _g‚On.qx/; ~8+ hhx)]OϼM}ܖk[.dte7zIJ6UH&)Wk LF B'U,L*Ď/.u#t #(zhIW2z;8R{П u-8#:'LGpzze  }j)& ;32-n*mԞn|גDC",3,Y;Pfm/yمK 3bV2mXޫ'{CJ’ꁆ6iJ#.@ՆD ɪ`Ipҧ]J9Ї9!WbH D`T4v/j&&z|Qsqء>HGˡs`)-&-{jd2A+b9Y j33j% 6,^Opc0t@TQr# AqȐ*Ep (£LYA1ȢIuqZngMʱMb'l^.,a84aF/ ҀVuoP"v mCwP48 z l t}CngD[4 giDx`ЏfvrmF1i.4HnCaX >2:%As+dX&\r l !IbHVr 8QshlnIB@I( Wن@XZ{ +@,,i]I$ZD&rWQK-'%/@vr}FCdH %HbZw12?G֓(m3I\4AB؏E|SΆ0% DM&&|da\7D$_0G-{V$VZ٩Բ!69 QBC{F0:qIxU!8/ ^*Ph8cAҊ'[E1HqNvە 'ZR8Y;d1 SP&[^1HB]o+5%4(饉4cx[)K}E4.~Mң{/~'XCB;Tm%HK$  :aHۅ`1Q$0x`#&JKclfbCr(S~/*rEa1( 3L.Sˬ[|K 26@L`zg\XrfKQeM/%V!;Y7h1T%T7E.t ˻- aD fWFڽy/U1%+Ifp%0qͳ{"I_m2G=>_E=Z!# ;RA5G*X>rҞBL5" j $=Tf,bI{! ; S`" vx草@CȶW QuqM$H9_\㚤ӣE)lR O)'?~jDu5!r^2lFwa潌գAYiEY̥.$Ѭ`X5W Hzpn[;;$Ƹ. ]YX$z Z$!gz}jq1X*/a7'D @{>Bms&IӔA"H1(+@^5w*6;1Szf)8 7'[.a3HBQx5Znڍ( }ʚ DX@H+ 8\ }C1xKCxۀ.!C3zx id!Rp)}(0M*#Ӹ!"S'!ty;5cxzxGX2 "" ,fӤϰ“*ƙӘl7eƉȒX$X ܈eC)hT2x @zl!(9$*Am3 !QAa&4, `Ȁx60 @!˖JIdÍIc)XC d1FKG"qTL#ChQB~4LHd;LaKDl 4¢.+m4W)€̸jL7fə EXh= e1)ykM$ʈ0I雡n<㘦ϔ4J7e,F2C3Cc뼔4@TaLDS.+)($|dI'UM NR-¶T8ý1)dT?<iLQ]іAQeQEEїQrJ ER %eR%Q%R'=R!''`Q-R+}1mHҜD`: ! P МK.;A w9cCEr,̛z4@iKMt)IITLUMT`)3!EbKt4s (fĴK5[P A`}AxTAP"$KF*Y8&͘Ic:OJ\,EK[_E"utd6x~4 M0U=WܙZ˭i zehp> #·hh@dsNU+IgPHMxͽX8݈Z G%'/;]EE އ-`~]w-lfa쐝L>"肉ihQL(m! a '1-P_e^< ʳ *d.0@ʸxZg=cM6~ ɮ3Vq5y@ غ?YxƆپF`^T ghk ?VaΣI5]Y]"l _ jeW_AuG/u}Z&4br^*QK! ᄖ H ZfK:NP}.BrFk -*-8"6gP|̎9w>uMh^0HMhvp{V=Ohw[QbNeqρZ堶eD i|rR1n]&Gyy#v/k noinr&hF[Gbo<G1?h Ѧ1ʷ[Hޢ㴣}b%#H 0PĔ Sv0† 5)h@iXcA^H12 Ӥ%̘2gҬi&͖8w󥤟BTW4\JzФۧlRFke^l}S=˖U֋vڳY~vٖzuk=iФ)dFeNJ1PC-SJY1P6ݧ( }`\fZEp".kGoSOץm\nԷ\ߘhtGn}κZfWy{Ơ|X1Ɔ'+T80;O?ߡBK,d 8TP*S4i">aub@C`q6\^ESW_yU=u^ځؕ_vU.xX}Wna(N0ނOaRi>QWhil[q/q.sܙI3C4iƴK 1暷0bEYNU3-Ko 󆒕1K9$V(aijzfz)R*꟩"Z*hwa(WZevQuc#8(Ts!FQw Xعt&jȺӒHbYD NaK溴k/&;94Ϝ峜ommsλoRoEf'v%xj4 Mr*)) w11|)ɕl$h|+ 115ˬ31< 4@39ǼJ7:Fm5hL3[I&3S4:mncMQvLc-f;vp!ļTR_Uq((uahyUgɵXxAqc tdRcX:?=IjۚDw\[uirWolpϮ:xZeb(c^FZ>d_TkrH։UeU8uo]"@g.|;2fpB [.#N&C>Lx7]۔08X C#N8H0}.QQ"t+1kdJ|*Ӣ.p.iW?Bjn zϜrWΘu`&\*r]K⡯Xbb>^9P"@(LIe-YX4:"%R+L è-Xnq1G,umۛV3ɝo9)b#[s IYSzhZ~qQJQ}z9y/8b\#δj }j&VP"цr8L ?G;a-H |('θKzi9E& "*nãF@~I[^X5+V{UuF*@.NX$MKzl&|_!QK<-L=5|?e#فdV> 4iN!~ꆚ3Sl#ԥ"AXǡpscqLfd`x@ŴP&a){DŬ 5)W#5#rfMo0’X Nuopx^KI3a-pYVIN0$(R\F(HGɘb;TqR][~6Aȩf7>7F_&8S*bhFOMPo VkBvla&+oh>=hV*[V?ҏ#j VFЈHuEw:,29N=$;MJC=hLb MmYUG"~OI [[&թ5B{󿱶 mμ`\ʜ^VӳG_]/ 屧 U}$3>9G[+Vӭ 5"-p'ﻮO}BhL8 _D7nX*9A\eya׃Q֓Tut4нB\ϗDVL!MH4,A KV,_\a ΆZu\ER;-DR$PmaL|HPr)j f[]B!RlP׎I xK [s'BM['jK~E6ZϹ˲`ΰ`!J(OWgtgLYLO F@DЃ`K8cLLaGaEC`u}Jʻދ9SJi!U TEQݣ#Unؐ9sǠMBMѥ^%WdΊrE5:ZtΟ( vc] 4Y!"'E>nj NkA" ;KkUlEĎQ-M1Uka2 !nRq}4,,֑uw),C!Ա괱b3޵ZDZZn^LH֏H%6[H[`ZT)C=eLL.NNKmӋQ(a-L꽳Ρ1YlT8юxU:F\`uf)E VIuFuW 7.S$1Fn\0 mJ}>HbDI]MtY`=8ZNh?6W'ݗ-YYiT^  EDh ` Ɖ LKA)eeOcmQ^u5O5B|B|qz'Xh'Jo>z>bxF?oz8ѥƖ%[T"ϋx s2ʖ!M#0::I % ;~;lYgѦ-"p%)(5q%#l04 joῚwfJ̯bbW&ʰ9 T:Il44Ҭ.QL7T=N?N/E#FOe4US!EUU_eUWgVYiVY'W]4[1TG uXetXf{Xhg=`}VJo8T@)"4qǒH%VJ:"zGmhRJ nL-+!<y­"z/Jb<MEw`|7x!cL0z^`8#1bǷ-11d!a<6-԰pQC}b(},† e`$ڰ_[\"AE<_4Tb}Q*acņq"7 I;H%,]hH%\jК{^r lQYTܙ>R0lAaAY*E*E֣ @w=aJ|) ,&9X37=`>s7J VLR47H΂Ž#;hs>)$!S|X>Il>t5\8>P TD ZI"0h.$69]oV$ 8))h'GִLГSB˄xs,ŠJ1cZSI49#ѕ$Ci}"ЇmLW.%"> dM 2D{_RW~qbb_E<,A6K~{(z,.FPz6(rTL$&$#wbK:I@2)%.$(48t+tJXJt*Teɖl$&,xy49 AcG^70xC~ڕ 6ndcD|,Ŀ[ ,PDX f=I<`.7ΡHv&ɑ\!_GQJM5E]9Ґ" ^?B%4!NR}5p&XQ1%[B$}Xu`PJ B*Wx֯Ыh5_!1cM;C(7m|80DL$_dt? q >LHBG;yUhv@VꄈAWL\e#O[j9a1Y}b!huubڑnF'92_!ΎۙXRbG㎉+F2ƐE!7݁p9|e(q{rӛȝ ʭn5~7F»GrɘƇM5A 31k{i2#(c1m q 4  i BǨjHpp 3vo-.0!~yblL7%\]EE&%F:$ xb^_#iPMNdB_@LB0D6ALoO *h ΍ ~"0j,jlVHj( (cN\Ì ~Ԉ (nHȊl q("Xfj̶|Q.q B @7hdr6N'ef"'tbV IXJ_V'"Pg^bGN+`CF,o܎A\)*HJp6 i01qC%Md602.G|NҚBmK.kǯw<l !,2-TFX[0)$Rq`kHqu0$jTfE4,D! R!Δ ,"jPjZ.74O"#o 8F oo$/Dg440&"36aop:,qf,Fs,J-TeC9hPg*Fh0smGfdh4’L_\8Im44aB, /.̎HO*2R-$_dK& DpBFCDA֓C >@$AS=U X%ZtUZR@TStZ%NtNYV%[4[JNOVF%LLE`Y@%PqPuRNuOs+jS$#]^\V o~RH /b eX)v"1p@ b-/GSv4?'R[`G-E)\Ln–~Ȱ+Fx*'YdEDnNB쾂W"ݨS:XUs'9@$2茅$!o֦0Ӭڦ3 ZC/4CSp}-T[a5ŕSq%fd, `~*OCe8TRZ6Z4 A!_5t\@r-: 1C${"0&M0z)jgkUr?elG'dģLRT17 @ETB_+$q  a^ S P,h1Q.ldJmaLO& Ҁަr'V2b!? lG' QHR>1*juv頭TCgm'$hK6TcW7א+QC8e`)D^e^"#))` Ц&ӚJrnzjRb ^%);C58z )ΟJȢ !0u8@.8dgse%[kKvٞ\jhu"9RKJi>q?fE& Ҁ̗*|mE*F(=lF(ns'tg}PdHwD/ KfOT.IFxwu7KFTh%~ƚ5DUPyMGH5Bmg$ :ok ï<K_pތ:gK.'Pj90 j_Qkgm䂲k:'J.! Tn(lhI,!R.`M!DlڙP,lXS,dzE#p3ƀ'Pb }u$+(fcpD72*6c`BH**ثXQ%s5&'׽b.8mmVpm GONvcV t!*sfN͜ b ~]Uo{L ;(v7vK^6>n%p(@,C?+#s wKdY*gwr)$wLRoҘ/# /|R{gl_4"j Q|VL2`Sm8H )'H|_NYUVc Oȗ, YE%Y-ab f*_H<5=YERpD>B.AIOCA 'k3Cg(t5̤gw ׼^"PK&&5:|1ĉ4D Xe")ҲL` Ha9WȾy2cfy\llѥL6oz,KS4 v4Wb&ǰcٞX6lZjuܺsʕ1Ë3~8rh&Ulr`8{ sϢK>=:4ă[ {uF̓weôg{3b~䂃~ܶ4l}ڣU~]j4Qj{}ͯGIN~ѷg|,2 *jܠ TN](TAL eESAZ(c4aȐ=CqˏOQHq1Ȑ72|"ƍTcK^iSR5͖Kb;="~$wQdaCJggagJ"hnjhL!h"*ITGUw'|W^w󑔝Oǝ>y)!TGʬgw. !ԕnfuo܀VD\HHZHА@ &;U{;1;59H"6Oen!$DPC;EA RIWHX&PG 1XL W|2qw<21plr2,\q&upi8<'T מ u s*|ߪvZgPx$ɺwQ2eG( ECؔ& D (h>B⊁Cې0 ̭MM4F4"r<$O2+暇HNkShPVSZGݩvZحI2+ 1=L$w 2o}O('j~'g|񅗴fF*tm1ZԆfKfkxJ 0XH$!(#ł74Dc-i(sz0;,gtŁ(;)F} MG n<:)|P_C3pB>/Ƭd c$eOcXhƔőfxw|_>ru5s+܇0T+(*!xE,i4’!ǃ2HL^+(THPv!b֦ JN_ysMղ:rRe5TInhߤaۅF$0B%!RɫXgHFvG*nx9s%uL$]:{q*sy*;{&=]{#^'"/zU"3%><P4?HBn'BiSTk ;LOrAzHOEMM֣")S>!C QvJ'm*>5";\IR̎҄Y4TJj>0l`6XAl6%Td5@RNz\SJ/ˉcy&3&_:P!.Q *I~!l++46 *\12X!ȅEnqq`,dIWJ#1,rM^v^nJNjHb}BdSl~&ƁHR }m;l h)菗"U~4ۑAJ26<֥;%$l1gH)ETi`F@G Vt8҅> Fj дCI(?v} ^.hzos29+o}H\QݕT(=* @BOP8"zrӆ!0:EX%GC$&-rG\݉[j`ѝ:)e(:TK䦍5{)<e*AMTݣkk|p,e[(|Dð7nqAjVtw?2PZG,"0Qb, ^lY{ݓiv䤻EANƕڇ0% UE{_/X#/޺B Rg#9:!b_zؿDR媝]&TV,]j*hV~3bޫ1B8s?KP;x-Co](YrxevE>1O3I9yaT9'ڙ:4sKȥ@gEI )Th)eL`ܣP[j-Na['u%u ]?_kI;Wc[Q?}p,"hAU+^`eCr7V`q`c;+_JV&e҆fvm]2\(\ (Fs2Υ2 '3S1eIaqB4ZxU`>SwIdj 0#OBIS`D7IؒCS^"! MWWF5D*|b}Fu,N8` F aSvinyMvw4m[94Bj}7=>#Q"g# 8`7 y{F'5eUvg{1mX:Uq&#.Hgd6qGSG#]&ciT?ȉh8 sKNt0VLxJ16Lv^0z +vn~An0D3M~q'\dȀG2SFS1#` hpp13<'#1<[gqBXN%6H'/Ej_&JiJ JabIH1#D%ui'U)Z!uQ}r*Mtau &fWzLn!,1$"蕉'hviPj0w1RgPxӈ7Q'xxeh蕄[N|R$!m"!l ?)KEH8l7aWaumWQ6 ږ~ ~;v#(P!VH];xk 3k4Cs19=(2{1X1샎x"G~Rt=5'mt5ׄ9;ytI*[Hv AdAR i#Sv r!(| Š7 7fm 7jmwS ʡ**Đ+v y @'7-P) )JY!WZ!;06aA zFzopgAv}'N:L*FD ȝVљY4 UM3H uuijܑ4F  Y1\V)X4MnȢ( zs7J   |c7*ZrZJŀ71ʠʢ@#ꪭ qَ qov1qq|~ᤸxY: |Gz!!*z͚ ክ͚Z窮:qqjcPqܪJ!  C|I!)=Y4|I 16 ;Q}ȇŇ3y{xgѳ!;mإICDC &tunu*D9P Vgdb }mrSZNyN7f8ńb롓Z\be̳;Ɠ{0+ilm<뾈+aWtR&FF]f4 a#o\80#h-I'Dh;'-RG#HT4J-YpfI2yR#YrtJrzwC5't8;?'q}l 34VB)'V$ kdUYlMbwT[`cZFx% 9`m¾ +@wV%z_[ W. q۱}7#a>!{xĐ |Vy̳C(D"z3bmh/U F@r-|ۢ$&OrGa{jG#wG|_Kq*puJ) f4FElz)d )(,n`~渿2+n\ 2IAqJY8)[0 9T&erb&C8Aa Q25)8ʒqIq@B4NaP\)cp@mCTsKP@ $[v_IfCSIhCJ,߾%<8abf&۲…!\7q͈FvrE&]iIPӱe>F6>.}л޵,rٶMsë˝ykڋ*;qiEohVmW=4Rf-=}ު}|P Qh轉 - ӈ5hSqEH< 4!7DE k `QG `rjEXbD(3rȨ2(qʢPrh"$s#abi(2I"3lR'!8 I#QB!\&SD5(݇P8fNCSRC-SP9mrap*ef5VZ5IF[suWe`%& h.ITn1E}-`V5j'jVkUc6-N7h]n[늕^bn5uUvy-+5փOAV-Aca'̯qښ@}zOQCKK\Dc4d|/4Y.EC0̒f}('d$Pvê0`̦d2ʄ;%$b2@C3n!B!!6ڄQTZf4r0'AJ+RQIɬ̍ \,D!܇f6+S+B*fNW=uP-0-tR3A+.(6n(V'Ю>o}H,^ؘv@+ϭ}ةSQ/|)=h=L,A{}&4>x Ie>1V@`= 10>q٤Zh"E; /.*ˍG}GX4F,#bP2`"wZ6'O*2h!.p_ %nWX25ʠ\<%7IdITr-PŢ1:RV\`5G `LuIbLre&iJfRխh5`PZe+9WfJSYzY25BЇX6=zǙX}@h!2`&*%m<IlFX9M L[D6'1!1D~.% N ?aLQLe@7-EMiJ2P1>И=dJ4qEР(|b ( "0k43Zxy% 5S6IV[ V;NZ3Iv0]U* HaXEL ȜVA@>,+f$T2F >o)2tM$ք"WA FYNB $>i3)Dr D>”.,mkUIbKEמ%1l'ҫ6+P"SelH3J}N(ʋ2UYPu]ⅻo#K#W5ot!;<˾ffY_hM"aִP3ha4z hdl}& U ciK3Z.$4CV5w'Oyvi-Z+E$0mQݚ!ufZvn1h[#+nD"؝!ߒ!,; v]f`;4Y4 )柹93sr:ַqMh_zտ]ldNg1X2-и2 ذj)$ Gt>9#ed6ċE0m>,i XCImBYr D^/Kg,^lӚe]'J`/RE*2a+[&iZ٠C+>>*< +`BUzN 2-S!1X-‡s2Ӛ4BXCNQ-.Ԋ;4C'b@ )  vq ϛ̃WH5p[)OpE R!h, S) 㠖yPŗR`:YW|X)) ad,gt1&6Aܘ2 +67g2&9+X7AỐݫ0a 1pCMׄI+qWues&Eڤnl<`+ %чUʈQPP QL$SFئy8gR{eu mYxYe٘-:ja q%}:rU05ڕ8Z: Y "݇d8Nnɇ*8vy4}0}ЇUySh؅uД1ҬD>ɐЇe \EY}]0í-Hh0ReϝzU[e6mԇ5ZB]QX]u۽TRe!chK=(͜0;t^ی}U4T M0ej5_UU wW_znd`{ ^s!ߊR܌'`AhuЈYeѠԄLX aP5aX a0h5`нaa_QX];+dP%`gZ~\MY\mMUh`-QM-hp^hk1E86&gAృ]ҍ֥ aBcziat\0,l)-buTMM5U=MT^%RQTQNR6,9NN `fGn\:(O7ф%t^dU IPvL0UuAUMPp RbZUMgsdWmf ftUztV]!opg~_U^ebPHЄVL؋a mhhPIpJa%*A9b{n[] ]n]L&ZiR~%Uϭʡ]5_RM\bU bҭ jF`%V_I\+xv&ەF1HU }\mMa`S^bVj9e0[xnam >UZ#X\eۃ>E[9kvg1ZfjmNזZm؞׆e~m2e$M`U%)ke!eEDBQ]^~ڽn]Xn~mݽֆemNoS^.]eׅ^moe^>QeOnp`钾E /vpb>SveY>`u^jTFR6SU1(ENeQ^V -!G]e^eHySPfNHX^S8JLfn /xz եڥlzH(R2GIQYd&mhhEr;oH.G GIGJJtM_mNtLOePJ4Y"v^^^4h"oIW^oUBWdo"wuoGm"edoR'u#]T&W'HGNm Hs_18JvLyhJh{}~zGW!:ھoxmXExWYA95eeCf&aH.ЄN.1'P *_"6P65څPLWU_mMZVdX xN< ttzLQM7vvmn!P SMv˸t^avb {zKj|z||3|sϧ|Xhb[1ȁWI}ܿyw}}LX;~O1 aG}ǼxȨ~~~ЂpF pX"0ψK-b8"b2biQP p&raÆ%Xr)A\@)F(0Ę8hAᮄ+ SshG ?e"I0MQ^jUa]f,SUd~-5ժgߺۖl j7crȔJ+h'y2ʖ'f3iLڧl2}˔i5k$$;6ZjI1ސ5&y9Ѯvu.sX|;kѻ>Gp8 ρyi$y_R4ׇo~ȟ!X|yىRyˉ\rzquiZ\A7taؚuυaUS-[#U 7^1rrn]x1v$I2ZK2g9pG+FO40ƘcIfhm(}&YieW-Yg&LH ѧ$Y$l%w.) 1$xJٝb:靓RZ()Q*iI ڧj&z)s體2: w7 JRxViUphL[Ԋqmrmj-뭶K ln+ꬌ@f l 6$ K鰿,I 1IʰD*+vik"`ߤLjϓ444J y<QyZGѳbcNOgsgh%=WĐ@1C  x߉ނm8C8Nyǀz :ꭧ7N~{Q=ޙ׾ޖ3P;|O8[C''d޷窫_OMN }zhtz[]LWɝOs{C_ ,ģ < R2tORfv%)Ky1mL)(V2܂,}d"u+[JS}D&\O@D=yB2h(4B,+f(Mbh&/1MInj"ˠI(9kӛDiNgsg>Yf*cȧ3 }T2PehD'zBTm(GAnn!݄&@)PдPC&@RBoMk: 4AeiMOJSiMT-MZT5)IC zb X:ҲH V~Ur=+1RjR5\Wգ_l}+YJR5*},e!KְլlIɪ*#A*VfyX!Y֚4T)J]YˢFIspg1NPwL.r̓>W}f44g4@am;-z;ʠ%3q&ʨHy} gcfQ3 kevY Rp;H&0\τs{BSm@y ~g;]h3Mf -:ItUd+OeY2QQ: Z\3|R3ի]MbRB(zQ%:,qv mC#UrQ(b}Zۯ%V9+ZbN>DQzwV'9^W,-s{Q ġfc=OOSUCa][u4{]h6:WLmjc i1Q^z x^w6M zl!G.)*Cn"|T9TpSƧ (falr0rM$kf8OC K1~v?K>󘠍V1Y]" A Xоg(ysgBm28WpzVMFvK UgH׆s4!9>6,g'zw1iAqT=@ӒIְIY]]іd YՑ  ]͠Jmک] 5umE ٢mԓ5SYABv J:W-aV&ԕYljmاa>!]HI]أeSIVܡ:镠Z B8ڦUUܒ]r%AAC[/ CYxִ)#C/+" =c8S 0M+i0ǀga%Y'HTLASX`jc*2J`2\Y`8>`uU][V7& li Tp"5^?^Sp^cі7BjA@lATa(xř1⚒ ^2bְFaJd$Hک}j[a cm`]VZYB%9h Hiܹ֬aFdgas ]@UQb%WF}#~y I;8?t00+%,LFd@+(\`%1:0œPM| Sǀ 29$-^EEݓ#E>~ M_c_xF| ƝԢeFhן>lbM=٦h(2  -*knciSl榦jj&kf 5M<:kӲYՖĬ]qŨg([du<4K^zғ.sGZ$K&!{K}ra:~ACD>EU=X*܏]آzd֦~ k ^մkjCZ1Zh9fqS $^a aS}ZŎ"= ̥e<&(ÒJ0̾_B;Tie#.f:0%f,IU.cx0QK2jCGrJdVbԓizmi ifi-m7*\4 TmN&-;f`kn^׸X;5-\ɖ7i^E;"S+t}U%& Z3"@@(-:%m&0im=$0^z0QfVjBC; jXh,âN4<?A"?ܵe!-&PDAO읮YR@AX9Jdx:Axr>AJFAFNkg}Vk3kCY^r,Sū *r*_uu(ƨf kyW(.K! ݥq$NgW}TLV.Y o$9ڊE`vY [`uE +,B-s-s??s-s[4d @ ?/?/"8t/-frt=@R*܌jgc(t&-āccQ&dq]!ilV}J2P+IqL>11*CRmqUcf 0A_m71 $C# * ƍخA`$M.h.=}8Ӭv16C46fDeGnf)w eG9"IE/2Bil!42Jv} oE:+$&N%jg:uaoE.peZZ3^bvztOL>esWz:mv "BB->B@w-0B_??w~CDgX$x)#>TՇIEiF hd@M>uյh5Ǧ5=@TGTgQW> Ux&=5fbU5\ n*Mdj4 J( z~:y7Ap'kg>Z}uƓf|DCyӅ^:_fĞrE5舞$K&h)#GWg}dv}jj{^݉@kMTcmIiJjڬ.l5Ojnwޞ!1uwew{޵/T!r*oF[=w>wB{@A_* AB74wCB%Q4R4$ fL0)$M\2I&<P-c&<0X0x<P>4Njp0u[+Q"1.85=[CB@ӕM@ C˯F|A/0||]"ā0!󼘷=}JrIY&(`$T:t)C`H'@د& rث$2HD~" IE}SÁ$U}%N{ö{jarDkakE~==xKhY3֮5k)3"&^%MOr5Uqulhd"r/%nykIJe,,h .L}*z-F.Q@ebGPW_Yt0AC I2 ELAeՋiRKIS iҠXLb>|Áز$&d VYYvt_25bU#FUBרl>h~6& Bh8(0=wVx< yG3z;NF%2?}#цAHa=]yB?Li0=!Ob@)^04L#4Y?E @LfCOP"JOLS$!`P!p7Q&bBF5 MP4e6)$i1JE%oGM@ф$F$Dr(I1lK\L/!#D+@Q-&l" ղB'SHTȟS*a=SFe,sR&[eFbhUV5\RSb h (aD#[jgY"1# g;(#[]^TЬ}ȉL4fC}cz$)4#&jì$ / hM +悯y f ̲}8Ghj(3*P>P@?0>#̯aX34x 491b+ Ԃ#>i0Pb$Tj yŠ0?4b+@ e |D##VLdY=H(2FBCqGe4+U2 #\s%U4c^=#M!|S-%P-FJXd3B+:wUU}ϧAZ @qQ)dH`G[ E bA' X4qD%..U ^P논XhhK\2aKM$I' =z p Rb iIP*IgpL`?ƒ4 2C@qQ\4 dA 0 |?-"ȡ  ejUސ+eV3v$ = ]ʨJ=TL#Bc%%eJ<E}f/O"Fēޗ@? (u_Fe#/U:SO]JC)߹jT-Rq;W R 25<% 2-EXZVgUkYw1VI­cFWvsQ+@>$.qPT-  7|t >Rx%0[$fpJPa:FXe0MiCs"yF%bq }HhM&ZD6IQ,RWu )mmvi-I]l{5複:!sz"zP>R|N iE"܏Y'YםUL.<@@T}pqHU-aQI-eO%JQ(M l*IO#.CFeZ)?u#vu`8=JT5;-9*e|W.ꞔS*2ǥCYSRl6+\ڋaLb ᠺrhz]Fl)2\ 4\%D[Alw  4Jji旹dp8l2|6хE6Lvz3 hL{MaX\e eLe7]斱QFuG֦݈rO,0JT01W?2KNe8Λ ą) Gj[惕Ilr"n1|nuY*쨀NJUCMܻ!1Gt*1]9KT$~:1pήL)]jĽ4<Nsr$5g㑤veմԻz|RJG*ķQtTTrrfUA*Z΃!lA1 pG;ю^w<`v~ZY? IʽkV/ e6 VGE-͹#!S0%?Q"Xr]BCҺ5 R!6Yxh Do 'UBCj@Jh7D#\(F^JUBM.V'ĦxŌNw&ȲłPNPMDˠygyH>{'V4S|d~䤨&(Lt~g*, {,K%wܧ4ANO =Vlvz  15vho"'$]2A~K2ꁲO)K""+d-"im/xȒ~Kb7·"8v|#]F q  0()iK!7m+5Mg"X|IL{U R>i0XT4pFs$ AL)°'HDBAKf0FN~f 5rL|KOLHL%  pǜdMJ|$sD,PeO̰%ծO_*Hvbrv@JN,9|lxdP4{|O+%,u*V^$Vzze˒*|m)".o7״*]&Rq՞ p$a / `)($c))Q#Q F!X1!1!GCh9H(q".6op=jC!:hrQp(GC@%"+'(*S|r|$svLg0I_Lq]մ'*81B1+Bf "7 "R"60 iV6wsGGϲ7*P#G1b rpF3RS| TҧS-I/:+?SSUd0T?c5MJR|Ld%SrLDN{@>3誎?rV?ȟlU C/ZUC5(uRJ=ew =NBgbGNa[UnIUI*=P02*j-7тRKX8ˑX4 a-pR7Ϩow%0w]aC $cKbk_2 +LӠ8X!84,Q1HǑ tT!t6E.q̳PrK s0%}J&|3 PH?a .wRI2+1E5ti]Pe $TQ(#{?RR,Y4=r@@5FbXW!8 EӮȕ^+7Eٖ6bkDU'a~''rO' u=(o9.UJ* 2 "vazT'e6"T5m?uW*:H2/@!LLaaSlg wܖ],5[p0tTuTG57X9؃EUPxT֥ 3h?'jW4 @ZsUpr It7PWFG qKVWʠ )Qk8N0CWrvC s+Bi7U[F Et/˘$_s_ FGtPPthb! 3`J*(b{sK*q=*9RSH| 0!Q($bҧ$!-R]4VWXVL$XLbdvo@`QxYN 4!ry+W &ߧy 5ru w:+7X9Auo!"Qb' qlrdWvZ rNş3T 5OFe^[=%vDžGhsgF]+Qy ]0GK*gM3Zs[e e[-<>ZD3_[LS_[JQ_1_cok_ `O_[6_:_Մ7e'??B__?cG`W_pU{;џ۟{ pC",pB"ň!b# 5zLرčQI#KEl8˚ c4)O%3NxCǔdZmebfRLɈ)SVOپ}}K4c#4&ƾhʢAa}X,0c}[ccBc|w1WeM= ytYWv|y,mXŋ'+vr=GΛK'#W1ܲk-Z÷ ޜdԢ㫞wyٮM:>jvYq`֛dYjcE_}Ŗq97Z GoچG"|wcڍ,^ FUL0[mW)$c )07I5Iw(y%@q2sф%]dP`=krIyf4n Wde6g`i枂)雕6UvJϤq**(skfrj*s&T̞dyiX|zWsPz=#˔Yr~PI:,:쥓Z:Wڭ:uIj>- z)ʕbz|>j.zq:&5og]j&qq2bI,?餫 ꫭ>jDž9- zTha0h5NVZ_ 214S|$j4Hd *qqKƊd֪ƛUqGb]8 ~뚱fi (9i'/yN7 ^.Wv.,Tu//+,Ɨ:~vmb/y+95t^YOo8 tgP^xU<%]+Rv;4z(Dεo1z;lq֜GOٌ$aHm+pZհL-HC2$m/@ Y,K |.xAuL]#9@ %?@Q˨(7,wZpE|=r,&RK 1v> XoT`9,yܚ7F5cZhLQ ֆ1 ~>APU3Kgj䮄iAs8ikA0Yѓ\'IX42hsNk3GҌ}{:(lnrGIdrjGG\@$MdB.S+Ç-M\ƶ*KĻ]J3kMaJyBw:&ÙBϥ9iM^M+N=kr4zbuQJLuNFLŏyTTˬh|X_ZNPnz&Z!~{+X9::jxJhˍAYxċٝ;»ϩ{y=e^HR컞 vTioUB#ތ#G!75X39ɭ91wCC"Vjo W $rO:0aYUnRVV06Mׁ)ߑuN*sԟ>_ٽ# 7äB9xUhB/CdIS.]7esrb)3m7ˡnʇ2xex R~g>fx^rS}EAc:H'l99(Á].Ӧdfcm%LKWU`QtB~wRd wsc('WnCpt#{yBpGq{%7pqVqsA6f%bLl12 Eg` LO sx 3*2` *4YqHrT%]4bGs&r'Mvm6)І \ d>:?ЀbURrU{p?Ϡm@MU22&k1/ 5cHHm%`BSbp7J?BӢ6KGPe]iRXf^w1rat8v&4Gn䊺eu-eT8SRScYF&wƏC>GȏUfLS0 fSƅcAq %tFDPG(1Rk 9 *~&'?@( \p W U. qP_%xE?rCMaI٤0k1 IϰQ :ޡiF5ToҏuYIDl3hM$o& &P68vvL=nQYѣҵ=_K76BtMp5VvH1:ǁUŖShȔSdM?`R_v8'Đ^g0g'V;[|$}eSQCjc'酿4b86W/(Pxpph[2 x|醢ІF P1`i" b2p Jd|9Nv;;'TW$`C19 C 1# {"ph0e2Ƞ,6m!S9Pj&Lj`rK9(pX uqa1TJn(10xz ꆟ)Іy7)e3+LQ.;YFau_ɞWx{Zx_`3i=?#f& 'mʉ㋧h0,@Y)˜ d ] dj  㫶Pi`IiAP pʐ0K"ʰ L[_,q ɉ_<؆o8&D< @x :n7;eҠjϱ@сp#;x4Uqile(# U; yU[=bʆ_L?BӈJ˰ р b:JmU = 0P ` j_ʠ2PKUp3mRK0b'/eMЖ *oCNudlF GB<$:XƆM(;$w>3-d,cD2o@(cUjl&FqF3Q,aKTt+cUmNA5ګa?׳Gvh4ռW5I&{wM\sF Zb0#K?xmoMŧ?KD܁1PA6N  n?j<}z!kՈ9\@j~92yhF0EAmY,Sn]P!uQIyKjs"c04~yvx1J_٘x&?LaYnt)FiT>xtЇ3^E߿; X_U_!7zϑ9#0uwx>0R"n W{: @7@ ]S\]v1N6IC6YL-X wni8j@(.pemqKh'9yXYx8YAAP=N 83eBhçX z<&%/jmNA^gLUP @`" A7})bA9 Qy=KS%x9v?@ECtIGT(ځFHwo^@=Y ɳ6s@a [r%l]i$j"s9F@F$I%qӋmV2D8Р`ۂ* )rzن;h&O˜ſ=&A# bІ`9:`',Sr]yf9:ExӠ8eR<)F %bj_-1X@0A.[@a̓,ڼ-cQmATz9j_$4Cы+Ɓ6jɐc80OH5b *RPi "nd4ek^lYoh@]g}!h=hyKw>e.\v-K['-翄5?EM3]F+Gyƫ3vd͗/mƟGs漰/+N&DK-U:dʚ~w{|\/b|:4uriO\fb 4&dM!(0B '' o!LbHC4a0LdaPYFg"m(+6N(c;:j0;Ϻ %L*l4{JOHN6N#l.ʂ4/`SknJ3=/N +HU2#3$32!eiwkspR`m;2ֵ`PְzNO(ۋP<[1-MKbMeph2:@ IA). 'B:a4Db2# %#+_+۶@Q6 @W̶\]%l.YKTæn2Pu6z N_jŖ~̸ܷ 鞹Z\F\MZbԋ%q(Yu 2{mY Zwp!VpNSrh$sxcβÊX%Kq[ϤtVHlsW[x7?YW6Ͷċm㲔"o͕8;p9FPLTׯBn I3Q\&ؽV8jAg^SOt-MezR4g+Mu;&'G2~IfL6' V-7{RpuL|^57ڝpfYFz06Y_PTgr .FrkVe3Ub|a4GOKD8 Hj21m,E0_OLG]]AdȶZP%{x08fD͊Ӫpeɍ(N;jO(WEb6d;taUhQeF%):kER"^0Xj[`"jHxDgT\;Vu e͚5͐sfhA*;"ʥ* CɗAwމMz'UwuM2t) !>;[UF׌ace3I!XP!h%lV꒗18/9 T^(9ʅ?ӊ[[ō-2eDᨻ%Brt@(kܘdNouDǨHص.Ft2&~*<4sd 'uhD`^4xys%]TJS.}&r7JJ;pWݡ %DlH_SC,NN|F mU+M**, ̄Ä1G(7x_@?)|f1*nl3K %cO;{.:JY͕<%zUlċUf/<.6oDk)YNyJrR_ZÍpY 33?y|рpJ}*䒝0pUzlٮ?™xg[jM2 *t\A}Mw /gd`HJ}6\ [S$RFCCD3,ğirI C#F0 >؜2IX&+GT u\ W\D64"1sDWs^*[ދ2٤ye:{iY68t%e#eQ)Qd3Ozy. ',c$ *OPk;g64Hk˄4 9I$A,6DALA|l|AAA8;iP$T%d&TBQ`JB(lBYB*|B'-)/C004.,3-4BIC5B5DB+47\39lB=@%@Ԗh0x%9(]|҇b(I8B0ER$QTWVT\UEPUYT\daE[EaEa$EZŸ Lijklmnopq$GFC)1I6Z"k|h;a 󖑹9,!Q<ń,ƄDȅtHȇȈȊ4T<Ȉȉ$(*[s:1ɒDɓTˣ,8I|ɕIɛIII$Jɚ,J ʓ<ɣɔIyyŐJꌤ \IJ˭t+ʱ i(=}ȁP@Yj}KL`@1p }R,Є[lb bʤLeheM@\TDL]ʬLLtMkЄ=s'IMfM;;iR/FTPGRUTUUO USu,[-p8>:[ B=a%4[ J^.UzILuY]J>("VpTYeH;d#RӘiDYNYaT}H<٬T[$m$H-$؅%NlMNͅLŃ]T 6ԉ"Ig"J)yԕrj $.TkYdY4QUM0Yy٠biMբ1h3V3 T=V,d2,ՠ}$@⒒]u[." mYGz IP.*cap@ZF.1IL+9N$ʭ aPaHbTSL~ME\(TXS4LVL?̄4T@X7L5bDv6hHeWHT¹}[!E>VQ-OU\-"UZ _ޥZUU͠aJ_ւD\{a'Θ&\u۸VdV[H("e@YkqTQvIp ĐxU1aH1Ŕ8EPPxL-T],H@N;uSbY]]}`̆΁̸3j G}`Le>rٯU Z c5YZ_UY=V3cY4fZ ֯O"`B3`Q6kd-k1JZڋ߱_F6c1j|61M@1L;BiM؂8ؕ.88a 8ɎHLhcd@7@Pf0^U͌5MSe:M|7mR%1]cO /K]_7-U1f՜I2Hg Vl`pWbKJ~5j!Z.^4"E2VM(ZV0~<1,n JfaTƸ`yZ@Ł L`$¤Wax< Pe`Jae]\V-@fPEPV8svſ<͎#.݈,T"݆DhepTMޕz^].^֪Z9^,οIZRl^>hOl_ۙI9Z9fnŲU]E.B>cM#z:y{BZEcah $D9e,uw\nUZ3a=a]4P8]Ta`f%vŋa,Hs^,ȅUTbt s4}~m1dJ.9fM胶M!ccޓKq=ٸ?1>Eu+?ݲ֬cϦcdTN髵^f!m`Z9ڼƥ@~+YĝƽKK4h(SqlaȁH^е[D Hh&8] Gg]pޔ$lV n5 id[q BO3h-ӷ>eA[޾!*d^4z]QƁܗ cqʘ";2bƉr$Yp#IB!J$S%̚'3Էrģ)SjN'-*XqL )Ssіq!ͤLeRFLaŒ&7^apdFRzv3ɍp2iu12P0L\B&#TH1Ao|GYjʵ4/zSYʋ5ĜѩxYM_( 5-$TW\ΗVO9T}I.y4LPU-1`G.(!GԐU(SO!H(~~V!"-C'NI$4C,d|'mӁP(QAtO'5V^@δ!S}xMRلR)N`z9zh&.$7$E\4"k oM&(s2N`Őj$T8,e 1q\Yv΁]Yy%x-'x*v̅Bpњp 7 ti,t.XDp ${+9|v~ )9xM+`R fHO;o~"BRp,+,g K53ElodhlFX V%Y$QNdE akIF D3M' F)G-7!.f,NIXPBq[X&ܕ(pLҕc d&[FO ]g >K*x^,xYlszWk ͪ`d4@B ]_ڇ4 ]3{B_S'rPM o7O_b@KO5>,^R.祑;c;oY8K:IF+ 8 HF(QR`yT#=8#V! Sz[> lRR6$0cKI" ! Gpzg&c=nrOŬW);+_8&J8ST8Z1< z (EsR'i]>WoB߄u-^OzeA{ы'&bs(Gčar ! PAd;](d C^bI $|[ErJ ͯB+ f/qJ\!%G=> S&(B}lJRبØ[bu7Ǭ-hJL`*Y\XO}t w$.XNV΋"]C[?7"8/'GG.sRC\VNY{"4RE1^)ufI%=JرzGMfŖ&ӥLO#.Cc2% V"HfJZ i;- $*#.p2њPJBfn%%Gi~hX,#YSc'.d3G9"F=$>(%CePSZc $p-ns/;!D5jf=WƲ iY^Ix}Mʞ$Av=ZVV =AQd&1ZWv?KΚOoZd e%R\ ;~E]ZjzdiX^p<>aKLBx~1<{+dz=F%4apȳCoܓu c%#ЗٸLlR|y61Sn1ۡZ{í!'Jmά3̀5my6(f07d>|Z!%иu1_4:S!1+Vul q˯^61@@dShܳļ/%j-Z9MgZH[i;R[YRʹygX`}$c4T NqE!*ObV Jx/О}#98"d`TzBg$xd!Ɛq5!2_qva3h&a7{/7&b4P`LV)zj )mÓ 03,S<ЃrV{ok6t=HMm7zUsJ?L{{6j2"h -D2 لXYNXHEhE ߥaaZYUL쌈ս@S[ѝ02T1b}(Qܒ XK@CtLD3>I^ ٺEU}IC@DE Ro!I ak;] 1ޡ=@DBQ bW YOܠέշxE{H_ŎcF]d |BmFu̓`*~ϔHɊHPbm@2 |hD3A4 #Aƍ"pre͔ԵIp(D@ .A=C7bD8ޅ.gܱ@4,֘XY iPH4g7dcpđey@Ci qhV!R*EYƸ^Qp\ EZ%j 'VNL̗̂"W-H2+ Wػ< =>ԝ> Y4>C ݲ\HӈRx%e,̕O!]4eC=UB P[QM=X[)0/d c c#4J(]JE}@,B(DC-@f 6Vf-IUDbZ82F !`ŤI h ^E!Pn Нm}cR=pE[N[8 P<]^ER"Z & ϏlUNwF%YIὉev& ݉D8<-vaHHhHVfEc%(s}JM:݋ , Cg -b8AErhJCaRAh{W]2D$#ԝe\ꝙAY&<ǀ/=QEEwK™mgbJ& ȴnA^&  Y0`hKlA(C+PƀPbq"YP] mNhE fE{uRS nhVXR^Z!Ŗdc~`(TCFQ`"/Nb Q0 E.0cfd/e"x Z|y I4޾`]V Fk5KLiD$4A2"+ ꔱ^d2re&.n oè1[8|<^ag 'A>ϸNE'_aɃV.o=J%җZ)1n#R(Xi'gw Y&zJ9Mlҁܸ< ]I0D 形G2biɭH/ `9ڋ. cƕ`1،t̔@aɜ"a;GBC- @Ni:)#HQȒ[BT$H (D$@@|A\,.&sLv_{$ɗ6| ܤdcESMC<4< !r0GpQ.VJ3̡ƂmGyilXX=w5aݎ`};]=< ~2 ]  RӴZ\4aN<2El"e)fF "<1_eR irl e]vFfZ#øչy*A_C0eI2|D&?hT.@&Sd'=pݖZaQd*ۡe喫r|NJa~dKP/%G#Pidz8=W%,.!iv릮ZۺL w+/\vVƕYugIJBjJ;%,9pf阅dU F4oiIF =ݑu Ih(Wy`G ΰe&Oǁ:kTPQG?iς=)ddF =uk\gI"֑,tBlT=cpI[A0^V:aZ4<-`t/_00:װh<8-tSԕΎi$U&Bյ6Q[SDVTrqR Z G,pC|KYnS#K`>X\hv*!5pTM5ͅXD"v ٷ v/rIu!. z̜HI]y Eؖ ٞ6gL-F~L8KCصhC .P>jvDT`Ate/\1Pcw ҹ ڣZׅOePȽne_kL%)C*6{_,XƉKًp)Vօ(P](o/⪷9znH z^쒂I4"uIIMYmGU "O4z*Ո$LKZL  פ$b֯f #!GJŀ S{ysyMI*W}i O.?Rg1i1޷31G9ݟ\;N~|Uy Livrإ}ⷅM؞Lך.VRM^Q5x[ZGQN]p.]/yokɜˇ3[{u 䆿u3 ŻN9o;כZ&o{bf/KixZn,̋ؾ\Rhxi rg Inpz|=d9/?g+6RlYV,&^5DryJ6EۋoYb:)1ƥ{^3dd ^l-FeN|YR u=C2 V b!/T1xaO!rgT~1@D>M2} <8`h^Ì ^`GrRGPvlyqC 3ԧ3#}3.ɡp#O5fF!{BM+̧ :cDv$ 1EOZTVDwV%F0VMhO\.4$MҤއG's1^;#2] c狙2 5#iҤL)ӭP>鷌082H3inb$( 5iL#{w?|򞫯岄*&9?a"*fy`ٴ"S 벵X+*챇K.HvJʥ/Bڢ ? ŏ*(2$c+? (TI>Φ{ˠkʰ$.j q|lQJL<Ѵ2$-< `CCfB#1V*1@öa>M 24! 4ҠG2$éSKaUYi oVzrE"c D'tƲdN"w(K;{ d[cc ,a "# RJ\4uC"W4CK*LP7ʝ]j>pj C4dia+u ZR_,=.}px-ds6M$-'Y_59Hc7M hx P :e^^&[PEMƛobV[pe><o|\neЃƽ%|/59ܒH2?P=Ϝ!jj]<)92>L]+mgm}tC z>CA-tLكkzW*##If'5o-e:Q- AiZ'f K: OnG4|^%WHT5,QnꁓU8 PfHéUu,"0$VofDm{"ޖE,nQn[(H0m_˨e$lN &` l~2.ݕZ"qboB{`A%0ʍP~ZK63HJ]_>@bSy#3CIM@ْE!2>uLK})]A+QBż xC{H9p%rX׮U}6MU1M2aG2"F>*Z;daCI6DU^ l M c7cq2%hSڨS-#Qa5jMe;ޖQijh7FLihCMnz31$ѳ-Nn &AylCSf=fZ&(/֕l'D -'N#q=Ö}",uu1-a6hiPnAU Y}`ԥ1 2O>sұ1SH/FhRXSw-QKIϊ 6_MZUXf(ف&4},JJ4KJaЄ *efAUAR8V# NI+Q'^tP"FbP ov[^^3xRW]MUʗ=Bzmb' U1ؔu) ,C.% 69}ư,FSag;z`ޢ vSLm+EĄ)yqœQ3A1xGz6Pk2ڪ>9I7fhVf41_dzKiTmih%j ]5Gl3 z&">A*%P4UԠiP5tl^\O _5+jUիv58_%ng$ &&t!LB|T< Xx{RNT'ZibLT4#䓰ZJDFE2{Ԓ>>Ss%bҐrΎ]'R't^*9Z3W,.yLJ3ܱsEGo\2ZGi*SMɈ2ngypRzLb.tV! &iP 鰞ov7MU}K^O"{r}ر)˻ :}Ţ12l11~)9,y2D@o2%PxO1̬aNve 'f6`SEcfDОW8t;yokȯ}&*&5Cj}>ԩR᎒_tB# bl+Bz&$̪} O%a$b'IM\eLOD (dF.bΊ 4kW]h,|bF,$D*\Ũ,f|FгDh~BQEiz.Qt. $!|҆UN.! b .aq` @d& lD k֋FmJ2K+#짲P{:)r" @ Aw ^%10fjd }8@EvŵL lBԪzBD+ 0# jK.ڀEt$bꑢ0Q(. _>J^eKD`$-O 2rKϠhci7@E Aќ:+UzjO@!Arn2R2-!t`Z1N&*QҼr/3ҮF#"MHD L~xg"]p[o62F/Hb';C]Ђ6 _Z f\&!MÙdF Umf: D%܊^I 0恰%KF ,nPe'^ פج*r& wEDeI ڦpԅ{>ss$ 1aT>'+ӀvHf $HQ`,Ca? BCACF 4tqn"4Nmns*WTqEHEQFH^t0W꥙H0G$n FfE5[" BoUFX^ gZoGs:Ğf;GhM!e8tNv2͎Hm 6{!'eWO(2b|%ihڤEhA@3ӂd\>̪@vXp"K0 ncrGO*y@` χT ` ȧD!NY U* oX+3TTFҾujd*f>ln>'iCcmLQ*9?yrjG{5j nfF- =OG L`r3 ?h@$k;|M-'{:ؕtٮPL1J~b ,P#ZTiNuɂw1Dc<DQH?G$T4!Rt0|.@ !&"T+@!B)JCCmm'tN7P-ꢮHMn0q퐑BR%iP=aA/ Mp,\J^B/ˈM fls^Ccrv--R7?Lh '"b (`g 5so6Oq@Ts-g]MHbOr)SyfV{Vғ 3+D ZJ  k)enG7(*5B>EV*%T D'A-slA 2v-ɒB 0b/50 ӆZ5p220 &PSP" D-(J R3>h  -OafpNDx(xFvF4F`K~Lfבett0EÂ! JLE֌t䫎3.tOQ'e_dEOx"Ncib` 5|¶,dQ 7V^S#x.T>T^.L+X!gфɆXs@ 2tw1nq2ӦբњD,ѮZ- |PbC*_}O`buim0aZʊRϯKxpTʰ N#jLu=NpЍ#6>b!)(ok0ēju}7'PyבD9xـ`s|Es[儆h$ީn)#aeƠQ9tcf)%b&&袞lHμBMMq_MFp[EJjG!PcAZ37$& bxTBjv9ɳOA{;۴CQ{S;S{_b'X۴K_W۶I}۵k۴Q5{w_U۟r۸/v y(T;۶[;GC-=:Z#dytanE/%?v6`U7–@++Ek+* krfi9.q7M1/KKE]4}!B~ʈc5 ٮR0 KD~DuPEB(j/sZ!j%#ܣi'B(g:N 'uUjie'b˽\VB\Vp-EXM'r-|TJ-,Y}fliIV;EV*/ &JyxoԀڻ9[)ЦWp+hjlF!ʕoJ.^|{-Ic'FJ1e! /x@+̅֒l^# %( ˼ۿS׸=8BF}ݵ{?f0Jr6k>E4CY{5퇷7dȪT#e SxT7bAJz 07&/*yZp;< s#pWk;"~:&V㧺M!x֤y c,&^5YjPLyt_.!:""f!0ĝMbٝۆMǞoM"BӾ1]K5Cțp)j8o|F^g/•#3U}+^U#*uǺTRU|뜮kďZ'Fa4EpZS_9|C5OdND3GCQaf2W`! b$+EEnC$ƪhPSڧZ=a")?P>ӿV Q#J^{,b܀B߾z\&>ehb 1h$Mʤ)1eQܷʕ,[K#b7ҠCRYLhb氢Eӷ"4IRdeN֫Űz4Vʼ+٨WUKv۪dʽ *1]U}&Res1 Hz>Dh(4!C>sщ"d:%Ҋ))&cs]{hζ!M1s֭?,9s=P~*7qAҬ~M(L˛?>JŜd=^|HaeO_d&hҵvRXFE Țt3tf[FAZ~Uj5dd9J@sGe2&9Qt!`S$CL&Ojn3]z1\a%2}e[XѵVrEI S]iV_ZX暀fT}U LG@GQu]HmA't '-c wͦ hRdE'Aw>i>vSxwp Q)zmanARu+ Sn7^1HQfdq5 i8ƭg}hg5D']TF&ÌTdA8 $>VMFx}ՕWpZrbf&azaxUe[jl''c 4Qmzd)԰-lG:sJ:[JJ*I6FsrFCEZ[eĝkhnv)4Hgww<ϝ6V??܁7!Jb ;3RDtTS4Ԋ@mƋ"ڊ-b c>ID:PzM'_w~|XTד\Vduq׹Fe`U2LZpEOeXٷI+wgZꧮ{WRpr6&Oxxk@٩(MCz*R( ɟh^ $YBA ! Cd-.6C\kJvRm( 1d Ex/ #'eL?Р 'R&$/% >)e.l!PT0ːR(GhKNJ^ƼP0jB[ CGI+U I䂥̏k=BQMCh&e l:ӚL*gv.Fm%S-hRI *uʇ4+f 4ncOcuBf-nS2,O! r jY1@ /!'#dH >?|O6Ѻu1v1TaE$h1PŏcKD5YY[=5f2'9Cg Oub8}BqZY\9II\qϝ+'z#4u R|bZX6$PNJX,(z^c">AB88$~aP9SA.d84s4AqaE)2/`I d"IgL=2UA#(k?r1\KtΫ`PLa7[ \`p!0q& "z =7FGxe\[c+ 3gkaR 8#NjsNXep[]Ji*Ksh)l4VBC37M4jcvЈcjqW]dduq\U(2zv•\i#Frb;L+mϮUѼ.h{vG˽u&w>iVGBJAC;6S.~+cĶkɚ<+"pLj),x(+]P&m$I6VP{Lz9>uC<.K_9l ҆&jm; 519Q0D*^4Eq5B}2%dU٩E8Aܯj{Yiǫ: qN j°vK!PF$Q(r 8y4blYVށ5kAڡi+Jt!{?>RD1{ K n%S*Ǚ Y^9"LWHcݬvk6!Bi` 9zFD#N85$@<5*q4{!y _Le<[l}I;Kc7ǏhDٶ!g{rS'I#Y@A<~!qIi=xi~f\j9p*^cA=c~}__Ε}IԶ!x\=PcuY 1{mcn=lQ)YEt[ͮ6 `D5 |]_"K vV[O[?@ya AL8}19u) i!6]Ѱd*ZX! ;NCBO_n< zT߲,!\qlmٙDT-9$ZI/R9OY` PudV xʝ;,\\TjWSёi9;gw6b@A-=Ѩ@#ryO2 bV{sֺ dDۢz.k'g}*)avۂe A!@$BH7B6"gYhpǜm" :F$aaDCbI ?ƠP1 ;w!D  $XA .dС4-SohыVOٲ}6vW/#Ɍ7q_ŋ ]V|9ФK9Re;-}Vb9rgMi@Ҽ$ǝyZ9қ@iVͩE}tTfre1zF˒+#>oÈZOa}Robȑ.dL,D-H E91/c2El8/ڤ[G#OdGPjƱO2PˢfRĔ-wp4iH3ireĐ p1=ž4xQqoK}D>y?/RpI,{颤hi})+4 #Ъp+r$R-C*L)L35*4>JM0DԲ곳2ؒe" ."&1l@( j(l6I-̲%u-,3˕Rʴ8*a*I+ͪsM ZQsN ;nLk'3lꔹ4.LЈa[ $&7'dhco|dhogV}PL`Ub>#ܖ)+5|K4"Cd Dd6'%8 jŔ0`Ӑ+@Ie)_#'6+2`B$xP:#.T;ꨲHv򄳪2Q#6y4-J$rSDG#Q3F bnKc! g5汕Xì^l^F#Jʔ@Z:cA2pMnLɩdpbٓLޱoڮG9rs ͣau[j`,m,]̽L (LG;$5n'$QϽ[‘dH$hqz$1O]2 CQnL$4bD%"W, /3kpz9%vJ)5.Q4aЩ5Hڄec׼WtlF BWa0N[3:* n}R/| .JaŤ]ab"&ƙ=M+KZD/ K]P&I9IefN8Ea`gEi[ mS8K 1A> p!VZG| Vf}*"F!\2LAy%Yò^RbL4P\9J@)Tr+eyJ(|K@X Q|Ȏr7e.! iL1i'N"!u,aۋQ,ij{C \>aϬĥ:–̋;-yMԢU˖Gng]gFy\J]aVG;2-EuND-]jU)]x׸k'v $ j^j'W|xG|)yW㯽 d[nLgiX#'ujig( Tn޹=lrpB4O' 5(C]cZM28g3Dnw"~ ;7 ŢЍg4: A(r(JCY "7Be7lۄ <7 D, D @  AA $A, L@e 3hhx7b:dJ8[1S%R. A-B/15K*7*b(-(s#'h>$~CCI*CrBUbwш r9 y'q C) 1CbHǢ7}'9 1-5 \@PM0bb8{1Z@W<@X|EYEZE[E\[dE>"P* %$D-"zrp<4 4 開!`;B%ê - 6$xG"ǻ11,G YŒ; (r:y|3!UBgw/ɣۧٷHi0 8CM[(P #1Q@t9ZtPDO<ŜIɠIJ\Je0RTGO9ĒA()ȴ)>dor&-#۩׻AvDPnsaolS{ILLjP52#ļ!Я Q13 ڑ"Ϩ +)&yxY:+;:8$4iGTɵ4z;I0I ڻTJ +R0T>|IŝJVɥ\,S*b3PU }7XZuI8UQMQ'L|<;a5qc-)9TH5 =Y袓WS1DLC0A+;?D2e DI! 4. 49%JDJt\1d,Xt tX$dAu,N0H!OA-b9Y!*;2HTjɩ8Y)=ZYiNV ~i!JȻ ñ_tҕYAY-E.EE4Gq;z8SH#rPʐ5HeT;WT;SAe~FexeبP181PP1eNeX1`eJNlEINn a 5)]HBY"7梜$+xU]mՖQ_uՖmmۮmvmPP,A@ Lp, n n,n0@. Jmv,n>&L1FC I2e"FL22}'!X&Iu\z_UߨA)ĐC !8 (B%FwC}2FF'BLA.sEv8'Q(ËJ*EaNiUY=9\ XE!SMVONnes;E֓KU֐fe_IXY>6XaNUBeؑBuwNFrMLUxzMAVfY<ґkZZoE1 N$j4[L1ۢ=锕keFe2L&򍺒kD>b(>しF UW3 vF 1`H$"hPHtQ$2Hm.D)2!GUtQJV$gZzF]|e`goAvꗐU׍aړS8_aĀL *MRǤ2"4TF ?K,Fd@#~]O_&Qq1ɨjnm0I)]6V69RRNs{LxUkǞ{iyIUZtaOj&T-!VpAH*y;XNh~~o 1XQ(,-PjUe5wc$D%bъUb(E-vш{΢5ED-۞P5m -p dЅ<0L~c75|OLviJULP*31 POKulPd@Q"h|>v1glʑ.f*L0qK_0P-o&;,nI|'J>* 4!q;2 =):EkROR3O%% XB$PS!cU>>LQgǴUrP33@i"/t],۸)IR)1#q'R7`zEuNh7ԣQUd`.۱",f)(7I@8ΎI&G\}wy /IT+UY*PLͤF0ř*UN3>1*QBAFq1̊'ȜMJ,\2v=12C1*:y}%2Uc`6fnӚ퐰Vt(W )ΆAzb#ɩ6?KO4FJP(cZo{c"SrJDz$%=RRi@ZZrDZo3v(ˈS3tN"/kx)®hP eKzSI$IuM4ޖzdSSVki9n4LV *I|G؛'iBpF0f&dib?aI'y+ LU54)aτJZhiX.mf@ 2K? ekjlDC:[7Dv6h #%јQlk?,R;(\Jy}ZMyXVs0kZE92Mgbj5wTejN|cS&=\ѻQYִ?f4-;#Y׌e*%Tr%߱62ܼ"!l_Be%ºI Ll7f\b,n̠7lnV&o r6&3CG%:Hճ}VDL},40&rUl-_Rz]Pl"NS\C72`4gtk.URe{dv`G *ýaeN|OSƜH[™&/nXtwyZDb;~dn~+JI i !it!ܪIF5`9O)$ UA@v$M&|E˵4JA M6%aK@2\C_G% YY]kc@ՒJZcE|ȟ-Q_+ Xb-,УΘ.UM="_sa-L)i;m\VEpp3;7vdU4,CR!( ڠVcThG}X HUͤQڔHbMID5RN{LFysތ ɜt٘48NRA A^Uz$dy}xJTa >T66FC>`d7><@Qx!LD/>dcMD0QdJۅYKڝ'[Ә!cDHhOsWZiVwXӰ4$A KV"XGRL'}dphcaQׄOLiEWG-׭Dg5xԇ( FG_Q"nWv"^u.lKLe8JF5:> aXY-_4C MC -B$BqF胻P%B5+9EpHKfmUS AD8ՉHQ 4ö""`g6~BW:nL,#_8jY X :U440)B;H/=ŀJoϩ2' )DgzFFX j mR\O W߫9+"Mj FhQ>eZDXP!uIŸ!4<dąL*SFttrbO@>D1L<1ǸEUr5%)mZF:K~^\]udĕ'x T} =0 |TSQ"ADkkZ^(  nC  ʃ G;@`__Ea+^6+YKsTB]BL-JZS:L$0a%cN3)QG.)Ð!=nBGp&-POk }Ai0:w0V%9ņ] -+L0KCnB4lB(LłVwC"xXGS DTbE#~Fhc XRFh=$4U=jd&eqK@C/TM_-^"> oQ)+R!X()S`o $ QƠ;NUM<EMX`'OaY #X=\q^oFu2q(1E"9B8pNa0-h/d>ҁeɲE.Q i6`G&L^ɗO iLDu)WT4y4J$ p:D 5˽`1J`YvxшY,Mq}J ͸mo""0#M,2l >EZob^W;}GPs9NFh^\FzoH6mSNO丄td1a)X%*0=`mWcVt8i5Z7.lLB)c].OE$ zsn4%+K-d (DLfavN{.MYb#H)Eu;SfI\e?E pWIך+0P<ſ 8[n:GDJxBY,,!;{;mp@!=Xm}leX|Oe~DNDrq&߅Fam8Oq UΩulB A`PҊ-JKǦi$jX:Cz%F>b2s\@Z=_as]0߸g?ԡ!NCI cRܹ&}9dKj3^S[oICE %`4"E (x0W(GŤ"SYWˠfŠ |ۇ|[<#~}[R9&T j[m@]dVs`R3h)=sh`> 4xaB_ nҷL_hEoپ3փ>e ?V|$ʑ!+;YOď-7ĸ1b+^(eLt jqeB4h&eJL(&L3pXaĤIf2bVا)ԲcAq䲯]p`F4.htL7yg̛#%Δ^H륁xt8֜8Gw'uƵ1UX$w^&6zt#mTzvZ8RvqS(1bbws s޺0_-eLaw?zQL(y ЈFBgdo+eHC4,\Khp)/GdF1I)*/T6\#h=t飕b7&17.ZX HIi2P30#޻IvϥkS2  b4$]t .aSm0ɮNu &2ݐMRhbj$P24Wbn0 zԲjBQ&hp#hQvjn52ʄIRIbӈTsk]Cl@l0?-kTt$֊W_Kg&7ci-͘sxP62(㕼DScs?NҬPθNpxM9@L*N5N$Deb$1F0:A P7lZn;'rL7Izq5м`C*@N,&{dk?H0;SPL mD3l@y r\;g]aҥ34ʍ ?,{#?;Dw*#GG)U4FLC4$C-Mk-}u4JU}5|Ȟ*RxM)#8u2)#4dEN1!zi&7gJ22LPh}<'}щ`3rH[N)*"KP$*{ń[r7P^ّ*EA24Lhы$1I,"Z&am;L rQ0_K㿴ZiZǦkHrA$-c4E-Afw(]JM&*FNՐ#x(CN Đ'@S#eWwDy,&䗻1;r&=H,bT[c"-L А }h "=,^[0,eWYN2G-Ёet3Ѝj}j¯ǹ$KkǷ Iet4XC&)lmv>3'+%bn+9RCRRHӥYPT2Q *y7pJtD1LҐ4bXSPhE)IjTdLٸ1"lʎ7gr)T@k4!7Ȇ23L4PڝLTH[w"] h:$0)5P%S<y{֪,M5n9]#WC_ƍdd-øM%#6-RqdBc)K36 *=r~RMش)<5pҁMh! \>cqtU0DdkC!Ξ:`=06D3>CE{G q13YԒgprcnĻ$J 1DjVTBaheIE%UGr4^7-6F=e8Gl|2DDr9el=ֈ3P)}9;Ep ~4F" {?'άE,`r겙 Є&$*sDn.{s3?.)F&d8NBC DhX&0n*ʔ| )+c;lVgNĹxb=0eB2Lw4Rްe 2 NK4h],C'"Qʑ+nmpB ,eIq`fRrG~+6v[IR~#2%&2+p.kH2#$$G$KR$qvd+N mN@>E ;-FE"&Bv)ph1+RrQA lVV%~FC@ +m4/K/PЪ\Qv%d o%^. &/9#QN'$Hr1ls111#1OH<&2$C%8S'6H JqR5WZS5]vgeb($2_8ֱfx3$rd 382#$ZE`EVykd2d E+>d*~(jY:wr+7&bިcn4Vv/;,_,ɰroN$2%FGJ6-%9 A)"B)tBB+CAB9B=tC#@|㝶.~~id7+0YR -jTEo!OTGKGwGު6 mbNl>5"T1$.<#'3gf") :CXbj`*;3e&klPJlVw?J\#"ENG{pQPQeQsRuQ+u / 1 <>UTCTGTKUOS1 # e%TO.P oU qVWuWs jUR3XT{YWYZUZg5 b3F>m݅c f=` A.q\s`Q*0*FI):jPND1SgaspC\rH.G/'*h|i|cKBVAdeuOdIdYZ6ePF#,)bD+L>#%p2&4Ruj8O^Zn:NF/#xzcAƂ*,d-.( ;'&'Ea+;,6"~hN b6gX1NB`[浌F5d)4gHܤ@^50A&.)خso%e-mr|Оβ,H%mcHUVș@6t"n3+2.;cs&C[F:Tnb03ɣiaeV5$ rGE;32+do.ꀘĄ 9:6S\.m6{T5P(&HG5+1LY Y  Rh3)w"LEžLՂ`| '+}K^K6qrE64Qȥ T3g8r,$D̤)v$Nݼ-bpC̣B7R<̍'0+I2+ bih|8S”D)kyBjC+_)b_ɢ(-0.k.4D- X@8mb1R7le7X{>l/tcL#b'q)M$N>јJ(B|V$XCQV-wK}DŤ2K2Kft#-ꄙ KB!$0*Ǵ )1ŔOOb1슱~JLFLfFI cCNKXDž m2!RWI#Ҡ͜%#['>VNwvw7+Mzi\Dg)B\CW蒭y zq;/1(%{bS-{YZ,@8qyn)`qNv*#3b^0 7抇bc:Mۊx|ס0ǯ䧻.wh!50 Aegh2:!Mf(G$]0.@.i>kL%/*yª E#'U$NktK<`fl'Cgd+tT鶨#*"ϕqC9/'V=cu"&#LnD&Lxۆ>x%ѵҎD4ɷ=0y_"Dsz$1b[n)[HtjcػdiZH2q2QI?"nR $b-dF "$ t6#€RGMl׃ڥ7MΌUxD2i(˃D*!Ѐ~+V!6GNPmvmUk'\dCf^y܊`'>6'$'I3fͺ uկyOijÉcNtB3inx7i(,;h۪_呛iB4^ōrQXĠ<`ShBɓōu]aG:j="?E CeE"K3S#6\38EdAV,/p]7b?yW⨕aAq[ ]/4dkcULk,asm̿nidj-=@q/Ҁuja u7,EڪNDFA][OH$\&4ՄNXAa7j)>vmvJ1Fh\&O4- 7>(蠄D>dAHPE uY|IBIԝH2d5"ʩN"4WeԓJv*/=xFj!@-4I_CFfcWXE;ևflʩI(.K(1YaJkc[YPJ,jšmN_hPAއx2y)Ԗ0춌o4X)&=͙$vJi{&Vl]E KZCшԅ䳢MjϺAAEG+K=TRT SQ~I$i1 EG\ 1 ZS[5<b7n c];EV:$5: eVII~gRF1haRE\: b6IX)ȍ!'simՆy4}HµC8ՄSX"DNM٥G HV v5i2>5M-&3*fj"^X|Q . D7/EWwEQGܟZ}S_PۏEPSeob l9(=qp xE'xBRέ֩ #CTH5!/J1e-CBJ21QjTb eME 킽e)T#"h%eLo1RT|eCETL2e5ya S!r&9utP P{ewBwx<,QA@gBhT$[Ch(D 2;TYdp$ (jl243 Fc{b7±\L&1٩ ,(V|>9>q'/*@ zE}P$4ѤwMٵzsˏP bl@QAM "\0lr$A'Ou@1m.wyECUN5qZO(c (yb $B +(1V| gabL0IGbI}Ezm Y$G6cE`&: bU E?F|~Rޙ'08Hf7kD(41 IkȄDX,+rѺ2hJ3Q0ҘKk^C}p>Y0`0&44Kcj(JqOv߱ 'R$YI4ER Za># Ҍv gj1 y 5uM"W$QHEAJ2 l6l{scm:>l(E qB>v7sF#, =v7aM2NA/܉m\&7 瀣RZE)-hp3Td 1(E> z  #@hQ ZɕJTdNA I1,c#E$KvlGuf%evyOJĕe6KxHzh)?Ip!9ϭ+B7r2`(h@ pfo1'KVq3SVF's2F>m$2cCsVU@Vuh!po21 zr;CQ?̴@cfB x'qXW&~Y^.&,K63te!'ӍRbeX 'Z72)Tut 8ZfiF%bw( ?Iv6=)(Be1pE#5>d}"Yj<#La ?_$+7LuwH] hb?Wa4wEB9<w{,Qu'43+R)HdAzLD4$.a@8&b"wG׵moJt8e<}CK(9T a:6?zUFHR*7}+C$v 2iF 4q331 U[@ 8*ffvTz!y} fmCG}kÆN!qƒXJ>$aox>@vIlٖnwBbB)KJ(xGwZ$ӃR~TS#7jbk#M~2,OʃA7\bؒ;h:Xx;6 "\6s3?I}K=RvxR5r f/g2E60Im270M٤@#TRcEIm%1C*1hE:6d ai$-Nbzg-M|Sq8$4t#:pDŽIw\"Qx@)jS}KR;bdZ{a~֬6 ^u1s)wxX@cxA0fw?\v/|)Nt1\U~ !;vW6U*;:9!4 GqjC %I(:S_UXZc*:pf?{7)a6YB~' Saj8*ڙGkfosAS85'?Xk n?:hdsFb0*,Wj1rkFpWj'(V1=)/akOv[0'.U?($7h^$~fs*jXv~vsthbvK P&hT py j8{'Q$!HrsQ6^xRHI&3,;HȀ$G4(vNCm"Ѵ~yu\B)$:}:P_4*D6Y(bdwc&[)J5\R6*Q@Fڡn>$9I&_u72=BXH RH2 KkKCZMkC{216V >?Nkcdcyuts +ģvG9>BC|XCCR?X/$:A <8,gwmK%&]h`9!F*UTL`o89D\_IMmF׆Y..+\3Ƚ.*:G1  a,?Thb[e@rѵ¢~>K1 b1pX;Av A-;G?<n@{p޸{+bBYMy:Ua@Q{rQIb-?ēR?YY9e%uG/A٬a*x9psM5S.QK8/LkfBcUM<`on8h 8p V96 !1d](cD7$~m'e*ض)\?3TgsK{2ncWB?)ZHY)ݬi8RYHy|_/v8i+x7MM Ծ8 > n&  ]1o9 ˰ vp=d!٦b:g2+J$a9?a 3m@IL5gR`4uF~vlI}N@ӱ* RvQ2gT\k\ar2A ːSiࢼ[< 804SA5nes(FMf6蘒r<6!`r_>xBscO<#uc~#GZ2Kjd?١QECg9t\G#λ8DH2bQnB@ij ^Iò{m+,ʞ25BKO'_hA^VU_܏MZ*?G̩ٖ-~5O6ݾ.O¸G\魢̄\s?Q8ʡY d2s^-N =I%#n0B'-2+Ôy *(C|Gr &ݕr&ȁ&O'ocMi(b Ԥle "TСĈ6D*j>eAGҤH"|2ˏ2kTL;}* UdI*TdBI-)ԦLZz5j֬I/Z=}cCY޾eEv,ʲkFKظ&W[)K][rߑie2/Ծlf0}Р4)S&bĔ^V2}f zeeŔ-d4e`M X[91i=]tխ_Ǟ]v9_1[#!<ɷdS[w5*Lw5{ <$dl>K :4X ,%}"+ 0J&>Z[j+@ l[mE[E_1Fo MT1DO"42I$<#IJ*lK+'J.r 0K07U?P·"Kܣ;¾L 4kB8jM1@ 1&A#I>&/(Q"IrK4FpkM8v }ޯ8}_}8d}Z>{S/?$Y[vK>=?_aؽ+Pm4}@RM&A7R0E 3 s+2DcU|΄'Da 48Eo {3 'Qc]J3>H2$^TEDL,QOtb8E)VWQ+z_^.򏌴ӗYܲ?y{x9xb_l4aiA ,d"C6Ґ\$$ baOZRg0xBͶ$ChgyRLa p?fB x t41 {a$ pS+wCdR@ M@ElV1BnvӛQ>BEXPKr=C6㇨U }i'SRd#D-r"Yk$E D/ɥ@\z./vŐF9àz FQQ#y4.U)J9uu( e_V59)OTR;} Rw:Jn*s-뱧G 2:3֎;L,q/5vЌf9 u"ԡ99LEѠUL+npDlb۰?ky"лs@kp6ћ iu:Qmq %{ iPɘN|HVPxԢ,Eo]RᲓRPʦI}m9׮zC4`,$JX{Qy"Xx^,pN&gM2%?[Aۘ08h4M][ jɦtB*M 5  d/~G ;csp޹JB֒X{L)|ZcVv' >_QNV; d>Ÿr SuxCKh4&a vw̨peNht"qeLveaO:3,Bh{SVыv MDDIK81;Ǚ5Gbnn6WTz@0 5W%6РA2ru@cAp ԄC4p ;5vGmCQ\ޘYӯke uQce_iGܵz|VZFs8~R"-mN)u+ [=U ~cp|]V2YFssQgѧ6;WnEkDGqVէx[5k)W^.ᢓʱA4@˾uӐ@a jH fG!b@Ck@84-Z -cZ^xXm(^-xO$1t!I#)g4Ќ2/CV=="D6 7>UC.Z{2Yօh5Ԣ'η|N@_nJiwͣsPТ݅n}ѡan2 )n7y᷂cj He@@sҪvvc@4'h} bKߠ g:.!e1#A"R;a 1NJnAu!wѧlY0p+r/*-!9+;?s $k,8 x  tB |Ґn zlA}y<<7?@4>>26˘'P9 vCYiDd:k&;(>۸ EWD%K2p ik+bD,9cKs1- ,8q *ݲѡKKL c329‘7,D1 %kXQBi#"{B38 /:*8}\D#ÿ!٤t% 8sY8뛍ȸL4 ɦlv7=Y+*!b18k9@"@\ tqE\@D@h č>҄4 [[ Mӣ`3ƶ&Ʋ) bhA'2B,K:r yx#۟=c!+-ɒɕy *k\Hz>sƔ5$# -3 7k<"uܬ* b)ΧB(xX,Y,3py(tCC!\? 4J2d60Mx@\+1^ 7 @ ]"a;kFs H Psq*a4:4TO>6#ɨ)es$J:ϡ-91|Ȅ7ʸƜLn$ qG|I6#Ig- @KAG Ѣ Vsi|}ʝY89 اI4%0u|05?ԓք=|r$5ѡ /kᨢ堗,0☦h O+z j#d$U`ؿXY!}؄ QPU^h(?R怡!,K7P+#Y–(z#|;L6T Ux—Bh073kÃMviW$HJ8*GeD LwЊi ]qNÄrXUTHHߪFY2KS|=G⩧&bSXS55}P\5-] \}xÇ#39%] G_}[깗 .̋d W4IxJ UW-=rPw9  E5 T?̛0զENM9ܷhT 4Q3"{m@0I6Lx?)-%V} J$Wjcv9/gW8 ʰAHJaA'.B!AM8_ MU a0 QV6IQ'i$ku:{$ 茥 t(aW{ם@MQb@0PVEjZMhpPw h0+-,4:>:o)|2# a9<\ *SFb !`UR-4%+2=t R}]mÃA& J>2 :${<ם!B0!RŁ}١0L'ɒ="[ eY҈kF$ QMM@HXc;adZ˭-u3PVIpA!epN\FQ^=`حIXzd 5z|PNH6.  Zc XSQ_݅ 5]XjH襠L5Ahe#=K<}˱BӢx⅔ K"/B hhf'v>㮡gUx[`aKflxZ-_wk6k#"3QI3^fzLHi)l!!xt29Lʗ^=7VN°'qҼn'].#6aK-GF{5VЕ5jnS~8:`fm}!ڛbЌ MѱG>6 { 4ЁdRHȁL{jZ`q\lglW~Y 0T"43:*MD5T0[QzH㭾{>c'T U-%-gv.f0#vY盬2ÿ ӍΧأ\y_Pd("=f-2i}0 :/`˒@pWApk%aLiS7eT[cM\6qdyc|AhnpF}Dɥq5Dj2)쒜xjUs&EeV3۰d#N|9\h{y^ul7\e#F&#v ?sC^G!˴GsFdT Lڰ~Gmy p9AƇZ#}M_=hBѣ^}"Hp>Iر^4zq(1} I FfŽ% DB| eƚ"CPI0I&ј) !S1Eb5ZS92Xɉʍ/ OI; r$y1È!cYM{<j*,Zw?%ZP.c8!S߂ivf3Ҧ2TVh@- /1h2M䜘24)z^}}Rc#dOwxVZY#}z(uaZY3-Z*PE7\q4 ѣ imqdKʹA'LF{2:;=[/ ~(+;em%kHsSk-[Jc%A'MEg\y>>LBo&B Ȍ+чC1 |IkYJ7 $TIw!VPY[Rv@g:)L)+PQQTU$20E~BFm1H;d QPD P"Oh#UDjجRy'Fш.X""ASP(8+@C^ D:wJc%}'Z  194L @sU@%}0D% XզpL+ڋG+=H :K|N _dFt\2hVG͙HN] |"f=}'S)}gIGRpr3aϪzEJie:WƚLz13h9ַ&&…PceBCEfCKhF4d*SUJ%PD[א=ګjDI ob 8@CadQfu'b2Đ vk&@]]%m*݌+*׹:A8R&"gPf'!gn$±jhs >r82IM1ئ>1d [`!պ i,[K1}ad(<5:겍~cx"!6VD¾ mi2jJҘd H"hn w P@};@݆6(0-Op?L2-[ZEZTkiHFTh C5@b$#:{-u#4XyDGedR @z4 4 NFBCt1uh:SYĎhév% ]Qr@Bgu#8֬U4<P"]I{**S{l+sɅ'2{jN6#tnƗ8rP.̻1ޝ\5/" S4EK V]*P tyډ*"Iмck<+sdDDWfH]T:ŇN]SH^SDm?XXHS&Z*nNX@PA (LHG~t맒0g[SuLӓU^(5;uʘ:0olN:r4hN'd­pErHHXv@ԉP8ӦʂJLa  \L= !I` G4DBDAεA")b(COtyKyEىBœ^!DTV4MF$P>1\q$LU5tT]Q AtuX|yCYUĄ}xaNyI0 B m  x  c4YUY3ՋQFIQMa5ऍ5}2אFTJDI@1-NS8Cup̋pLF@yV4WH 6 pLbȅ  ~ a^3>I)V}JgYEVMF!m($ƠDZLEMK^'1qV1 <vdA>ΠK9VaE-Lܙ}ڸƧ BJ,&AҞHQH#/OVėPǐS ▀ݡ-VE 0~ YDGű˔Q\N`td5F  dH:DoF͙Xl >vRi${˵ $9oAe*LXL!٘eyq~ٜ1b n吚 ZJ/>O@[ 2La\rݠQ#5 O 8F3.9ҸFWyP8R49\#`Yd1HtfDw J@&M'Yd!SR~Lsk=P"]B}bATj{#@)C`U0hlN_Z,_V6 5ϠCzPAq0[R،E'-6dɡJF< U^;Q>ac%z4J_.\zhhkrek+akaz5i__BaJI H[M錋q @Azآ'yXXm.nY(EKp< Iϙ,"LIJ1I~V[پHahNjtkT@Dצ{&@XyUUa(v.{E`ه-]ݗPHcj6l'$:lNU43oВD<KZqIϒE:-~Ҏ)w~-t>gC .+¨*$f4.+J4,ɲ#MFVg a*KJpҍ)$Vˣć`4> tEHFdI8H4cO~0PZW._%v‘oD aBZhhb;"F'4qy, m jy/m# Vŀ: qz:ZlOj5Er"{-##7G#4JkHet6)8M+ FTd4| $eSeHUNBÄGDW}( nGY1$T(R\IQ4O3Y3fBp%FeڮUޤUܖ`/ b:j,rPПSh,ݬb*'\og"f̐EIHP:521N4\ʝeJt"tK&&m"0LjA٬ϐiɂrЖEt;wj8EQ Սs$L>9p֩*M?HoO;HIoHkI#-H&v# ʣ Rĵ虏@3[kfUN:[w((C 'CWZ7G1Dsuu/c9J<nLBZJ:+ #ȑYlmOv6;bngK4^aX֑PqF4rF#2H7p?l?;p;9Vo4WT8]4+Y-P!D$C$JE)vunʹk,8dh W bm$6P@ʪ$KP&B|PB +C@|eB 'yN>6m̲2rx[Q"Ƕ[h( r@JGh!K}b I&щ~jՐK,:JZhH# PP&aprʬ&yI69-?  z1ʬ(-9]{Q. {m!,xd.,=ldEL/I,U1=օVtL-9J"n\ U_.65Vb={GBV{,#)!kUtS^tFQM/4Jp 7tW^ 鵰͗C|m_ Ѥ?;px0P.Z4\fIMd3)%i,a-K󢪨zzLc*MТX%裑N: Q@!)%8k- "MUWՔX\(*C$@Qlu剮Z:U($~W;=-43\=m7lG͈ ɒ %wvPvs^?p{ʬNs߼.ݳGH-I)3$5UIz)L K-U h+55I'M& &PB9S e]5(4ַ*yzúX$9~Ӱ M1QYFPyD5j.-3IOdf:,sN5I\dž!RSO; *ƶa8Ű3~T T=fH3,IWڥ1dzCow(EQ7*뱤3+p8q(bKpX,38&aJ9ʂ2qLԖ4Ab Xx3PL *b |t@]R^}h@bVNێe[VpT*m $7 NS$9NuӛёF:$9jPþ)Id7\mik8Ҟ/R ׸V#3]!{4htjRF9Qz'5GGєToPI'18!Nko&I&$1$yTÄO44,)&$,KT6Qiˊ&8)Ĥ2^Oa撗mubg7+WTI}Մɪ4╯5l^ WV}c!YNvm^RVͬ_ Y5c^V0RͲmk;[[ִi= 2d, *KMfE&OA#eFrbflJĀ,0>^2Uuv}_b SI2+b &>HSTQdb.D7+ۭ&x V8id fW5 n\c8<1}W22w#JNr(/P,e,gy[&f1D&3<1YSne 784;Fs h6Yq0f8{ъq\KI5sj@HLW+k4a0+ŭ`r0T-uRnͰ\&׸uuka{ؼHR&[MvvlfGӖ=j+6mfS.͝e;n@˭ny]otYRt8턯{ގw|OS-> M⯡ H | ^.&3 i,u1`杓izEz@ð ǹbh:.F+bdgBc7OĎvj?{voSyw=u{!d+v{~x/~l'J׽A7|yo~|9xB1aJLE,fYn&*#DXʗr3$V :{SWh 6>O%9 l8Mo#cinj4-l!z4Hlw}?QPe o/<VP /%e"C7P3T@qXD)5#)RP$PpA4!T(-pl;BKpGuPp*Hq+BB J@K@ @ P ~@ p  PLM+x,~@bL/ނ>Z%HZ9qx yJB?i8F'ĠJfĤ3Fb0$bLJ3!r,[x(1Vel*q` 6y %'E5H(AR#2rg))(2yy69(e@(y *k#r .j)k-2*k)2-*R.r,y2-i5cT&22/J`rC-F(C)-R)4TF"0%CnƥycNAE~@"jcIBIlbJDARj`Z>b2ӄȇ,dSr%K$.\L l 'Qe"&gRv"?b$BǤFrq=s2zFس23IrJyT:Z:b{rtԆA[BqAs T;(4:G'ff1S=a1CRjB94#r10C)F!XP:j ]Fs^U ""HC}a#ryҩ|>a8$g"[AS,d>S3MjhjB̲:k3Lt;& %j5<(=AG42%KӠ6G#͂J3d99< TZU0+_u"` XU Oa@>+d0EO_$!t`ɈD&AOI^w`23 LxvQgb>)ؠwt"vucxUt7 La:?.fSBPfHXZww|5|@ո"*ޚ"tyPa S%; "Rw%wE\)4\ qyywcrl!t: z["Ɓ[m2HMZ YTDeh+1!o(39wRk[o>ƻ(soqn6_p6r.yaۛ)>$rz_G|;j$G y3a:kqqQGCg4c)ZjR:Ke|W'ži2Ҡ)B ^pڡ&g 든]1r~đ*8x8W`,4,ZN"={9e4#%[bYFhClcx,y8z| 0d׫) Wљ"ԧ 4Y3s<77cxO7wĉ|"(?#_cqʝ_^2.[oQ2Ej]p5e!È@3 hɶX(#T>+ϸ$ʩ}gSƒAO>BF/Ѥ9EtNr" 26IEUgO5jR5*Yֶ=M-˓gWsmj/MtsM:LoZ'ס? M7:n1Ͻi!['}z@Io&e"F 2e˔i5XsͺC {4(i6ҤibKM/˛?>ۻVpn2.SkZVl>pa>$P T4$3O ^E4BٴO$#䀙SW<]̂,XU 4lG5217-RQCAH&8I!x啃' JM;9e% t  42æLBYdZ=&(#(%ЃVxWfmc=8c)md@nUZS]UPnWz%_eAB~MejQ:Uw~W5QSc:MLfS)eJQlUZTQET]QbNЦ1F.>0U,1,$e2SfVaU`iУ$u,#$2r"LgP#oZU#NC  =H:)#9G=<@.h}dj;1K JtM "=#>pb9><7>9{Ť>XL-PLiR]u Mϝ:>b*mA"5 $<1DT ij>}4TQm3H] fEݤcI1nloaZQg KTxB`/W;Wn*PRizTOj+e6\z$4ouui|(p4رz)Fx @% |c2qK*iz#Fh$h"PƔBP<% oC0Vh 0zsI;ZH - yǁ X5 i~d'F1D4ѡd';f-LA AC&I7"LQB^ Zءe\2TbX# 9ՊDqsd7PH`.~q #`>wF42 » [RKhz֫Uoc=|+e_Ve0jְ Nsftg2fS-\@g4$#\⌆Dd^˱>QAePw42F o;Ā/1Āb\5=Ec9Mo #eaA 5Rz G)zxN$Rp*Wϰb/Jݕ3cX*[ X1z@fZcUƤY^`ӴGSXڕ -X dT0~e~8N!LQqD@O?\fO,u{BUV˾(2ϭ;qh iX\PkA\\4W$ ^*("L& cn4R4LlD4E[`G/Kkg^m (FajW>dhR|?\u'Rf";Г7œe4;BClaaH^3wv"s$DbX{xִ!x%gB|^1yYm}u댖=s)75zz+ c̪1[Dnf-+7}l~圗Ѭ%|klv.D j]뿁ኵSdhHm41BWbЅ1 %AV7cROu(_+hQ^pVY#W)=q'er]uDAmkoWƆ>aTx/Vo+v8Tɲll\@fYyeVpW_$=Z,xugvA'>g'ZU)kYHLWNHh)Efywgy{c<'c^U#ec]ru\A?0,eQiQ>y?68 C1+BQ`Y78S2C"Nh|N&n8Ht[40fbG&Vdt<"(p\‹#*,|Șg\=+U&axzGhuV{oagAtzXz$,YȗX'>D+$r+f5<(y#fb|u5pEZ;V}v"?Gt6i_ǃ樁dhRj +ءH5Ik4S*?H {õq!o2f75؂ӸBڅ0 0i'iV 5j.@ŕTViU@]l lu pwy0Q8wiIiɗ`)8Y9jӗc q^iIZ )iɗ ri/זiٚ-v9{I9ViG][!i)Ai|i9ٙi(ɖ ќ!s{=Ѐ}U DaL$M2 p 1jFuhG1_i*Jjʡʡ'DłY#6¥e1Szjbq=0 s*f(`JozB?ZWPGڤ^[ OʣI]=::NZ_j]ڥ'Vj>:] wʦ_jQSQ:KzBsJOf:gf9JJڣU*ڤZC}C/6j])A%7$KJ8'q' '2D"6iZA4A}i-}/0FAϑ ɐ* Z B **A /zgjIگIJ⪰ [ /[V&%IϪ" Һ&k [˱ $+˯6 7t0k% Kת>=,D˲-۰?˱%[A2h6^;P*`+ж+`rpkkwT/h4A&pTrMJe[U+Kk˹빝 +f,G)2^Uk8V i&J|GAEtG+VAw~5,vKw8aBw#g{t7,뼒Y{;ˋ,K|ɵAh;KT#2KKy(*; ߋ!-Q(ԋٛ E5u˼+N;t-lC!| \[ V@а7/hq= 1t?A # cicIjbv2^d$ Y5`^Ub\h Qj|ascq\dx ǙO3vr5ymgqpAIaed3vNecA0)qd\*T?j13W Sqɵ|d[6gZAтw1gY#W<-LT2NqM{LHW^nzRuAWl,Wˆ˶vDsW|ͼye 3ۢla&1 cP{ ѻ-iFbh0윀[ɗɕU`UҭϹii*@,Q99AmCӻӎʙng[ |)Tfz9Id9ϙZIɚrM>֠~)fy@BiiZYɘZy1yoIӂ}g֍I]SbɝyyikwmNmsiI~_Ԉiv Ԉm͗y80yؒ٤9imٳ靕ږ)L,k }2 H퍫2p޸1P-a@ߥR5VzeLAAU.o NqLQ0yJ%DXS޺EwnnNzV;X[1t1X^eoOrXEVtSCEXh*ⱅXo[,S>.)nUW_~N\Vοf>VEwSMqyLc}pЖ߹}7;jhdf-2.9/docs/hdfview/UsersGuide/images/dataset_compound_2d.gif0000755000175000017500000050370612050301073025503 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,HE[mYeʖiRXEP&bHLL'z(ңL('&S˗.Qf:e .I$4i&ԴB wRJM&xMU@Ѥъbr JpLfeZ.}9K{tɓq@Ho&}`%`e eܰcbg ƀ 2h""x1Lb(ax[c0XbCx#]ۅWBm2p0Mі"]I_+!TKSK4]TsLAmCQSSiƟ~V$pe$ZcF:Z+fZMwڍw\AUP@S, |9bV~2P`eKDIaW)%R&9C쳌>;]Ij]S$ʘZfitj%\RɛuUILSť)@SO4mD 7  )CP\Ku(6dZVۢi0^G_XDz~ͻ\+8l9}kXiVDOOGW˂4͙Ȁ O_1  \dAcAQ8p1b(F8MCbw݂{1dA!)9FM%EY9FmLcҘ1S+M:R%qfja~5IbVR psWV{_JeX]ItY,)63i~_$4|IѤ uyJ&X'ONF"'}9Q&EА ^zP!@P`_6&},$'?G?C+LAwDs}G iH 27вHrk`R/=r4.~`rI'J-}T BBZ\p =G4 07%+ Uq*<842*iZݱ1 PE/!ء5;N.W M&V$#@l,X]1왟4ZʺK$$URr3s+7On"(N0bE]^f|Pq=Ad$ѐ=R%_,F1+ޣ50T%b>)SwOQ3/_)k3U.iur އv҄]8 v ;a4$ʹWվ% B7PD_''-@PRQO"}nT<}A@Y!FrmۆQ)'U`OdSزfBdG1C0OB2SS\-13."FpYbZK;MS5cP?h<+ʲ]GZtD`?cHFD38@G~UQc @3-=j-VLx17ː0{CeW:fB3! A5P P ;P:P#.. $   `` +Yg8Ir;g!bww˳aG;'fz;,xc!3Qs7@Gb\4j lN2L6WiN0C!,(LpuxC;2u #}mbr;=%'-'x}Lma_OyhH aa vH01a c1{Q\0A`G'@UP@qHbjJqb!*}@Zd3qQ5 G$E8jU!aPf]dM G8PN䛑xx6X Dۂ!-N?= 9  ڢ@ $@@6 T?t'A (1 Y2.Y`lnak4ZLJ}vxx$+\b#usL9n!@153w@…bNHcX!$k'2=?.Jtmv~'5A-yֆ4L#3: K^j?G$y`AvOG|2 o|6S e3-YR@fc~ip1qaKTuy6dUJ6WD_4dEd!]C75C Iƭ,11瓟!Z_Q=g(CQ9j0@ ! "JP @> . 31 .SB* T`*-`ZY$iyr cAIađIb9mWd2xH>c4#i{~\qj;TEq.x3rGPc! c Pdїb9 ( 13;Z=iMOP)i;1Q8KZ`?Ԓ' aSBsQn$0e1QvP9,ȴҴŖI3&;)vjd-/pᅝcHz3VVgr%G>)TWVnpTq K~E[~+"() JH,1!83 Gn?=P81> @?u!zK4 ) p? 'y> #T.(pK,-YL[Ap=ѥE9Qw1ت'=E qbQDBP0ٖwSy}ig*KNM$U4S3xgӔuƘgf*:||ӹd<lH,ljۈE-1)ܦ_\- R*40 tQR-:O4& tW9^h֓8)6=ԛ9ۦ= M:{81':ӜVsDKdqtdw厅mhWuEI yljY`TDg*6xGU3E2! r{ؐ]6}^~$  ̜u0uU:ꛁ bҟ\g {h7@ C0nPUP lu 0`g"z@ h"Y Dغ;_Jy'"=jNb+YTxee9Lj9GDP9\ B6~4,]%ټۤMfk+%P%"lAų~PM\xS)oE;wU\i4*041p?1ǂ{rlf*iٌr=MX{V'RqH$'r XVcDʁЈڨb)[GB>Y&i_|4@R MnCPty\3g* |g 7Z@2jrZ) jQ\*#0#buj>S2M;_N1@-~tj*Z\I%~d[‡3FunX{--<-*`^/mZPO^2NxbN*3qt9%:ޓ[Q) !SQQ-9'.x&xKx`&/aY1ӓ0*TyYnP`&] 06chFI'1ss0T&}.\p*<Ͻ*e矕b ʜ&ZB zRUgZp'!*LΗ5 n:< G-f]}myn&@fRDRó`gclZ:!QuQ4Q r%}MF=S1ɚ9n 0ٚ3K+} jstɞpV[UhZeq2 CQiCUnUXq<:mUϕ{iEC_icL9"/8KaB Ǣ˼ , 9)8nnhS#2'b:J7tԑ3NH˫Ir R%2*egJe6P@QPhgS3+(!;Ӻche2Či-w !YJ驓xq*zTIMwi* r#0JP,:uZöVͰִ2bصW^]!0P e0bsYhq0bB Znz O;JϴzL[ɱ2sL7H7ɔDHFn%LzmLBx7É9Hd+;3O"0DW2UZ 4CNZ\>KW ڄ+ƪc8fȻ QACPx2P>S#Ѹ]t$DD NGIm"Lʘ1N/\K$N!ǩ{EeNI:a0A1qJ\fV:{qdb36M@U.'XB` c ƈ(-DUR!h%Umˏ~83!]sCR:hH dWe*`AقDD='+PX ,h0W(i&NєG<ɉoyȟ)ț!8C dNݥ%\4ꡦ,PH0%n%GȎ.z-PHstB> Lt \2BD2Q$X> %2L:PfV%-<թQn\ g'EXzLSZBUQK2LB}f@7D>W+d#A wF(ı^k`Y],!W“g"KK(J* 2'f 3Ә4YCe) |$|a MaXSiqK [XīLӝx^hȉFU%F_T&ކRfF:DТ d>*;:s$xBf47髄ޢk:Yn1pJbj.#6Qrf3ih=aG$ՅdlXmdՅaa٨i%HZ9-OىbVH%`m)K[jS,3ݬ "aJ:ajDyZJJ$z"ȠɳGLiƑi#(WEv }$u)O1w3#L:U6suVWYԕdM1`=O}<5a Sr6Ģ\{ [p% I0$r H 35`Bx7zIoB; `4UnL#Չ=VyأCt(Q ʒGJQ$;ҩ 5B/38HF(4;'7!ZZJ8JO(Ⓣߊ ˴*.Y3H.n(=e =By_csZ!„n [=I *k ?c/ {70 I$5G)5 (>A0؋H"ڋ/KQ 8 8)h14419:#c. d95KR):L#b#4y%tVA!ZA>RW|  q Xhas4+ Iّ-9BB1-P#3;%Ι;49U4Ӛ9 [&^@0“z2=H(u:ۋ %&A‰:P$j&a2$<IlI<Ԣ|ʻ@1b G DTHj9n`, 5X"3%;ƴ/L L,"LҤ() -N8O:e)Ct-∯w6ˢ~ 'yB!4M-SIA|ZPrN9H>"%FHHFˊ[5 ¦A0D0> 9I =KA748C22F J˟8Kt|6gCS(FҺ$u0%e҅p҂ &&պ)պe꘤x)U҂xR*S1(}[z:%U2]R+S33R#Sy#r&%0]7$-iz 9ӘIbhhST:T4=;eS*Rx3TJSJu[ T8-+5AC5:,-z@@YuSN:q')*.ԅxx"]UdM=URxYuTVGV]ihH%_R`GeX:;RG`S@S&Yw%HN ۰Nk{ ~;LEaE?15XXV2mW+Պveudgs'Q4=`EPj!'EY %ڗ}YEZ5ږ=`Z]_ٚ٣啫YՕuYYZ=}1Zٞٙ=Y_ۓٟ[ھۚەM['e.ug۵Zګa\?Zhe|Mۧ%[함e]ja]ٕb }\\%Z_ZuܡZ\)ݜm-Z޽ڻߘۼ۽Eߓ50%_mh_]Z^ݕ[5NY}_@e)Ph &6FVfvսIPx !&bt"b"f&v'()*bbHI/01&263vPF78FTF:vb<1>&> v~*n}0 EF;Na@`=> H:C 1IFO dRNQS> GVdr J^e d=eDNuqd=fWzX`dOdFFrIvf}`e}fX`ΏCαbVdPm܇b(VFv8gbbr.ZoFgsv*zf|Fe+g}nUZ6 PPp_y`hH+8FmefI҇h8( aXaЁyfhfE髫^hVXI櫣0X`*iVndF6T|N.,uhfhVyvji鲶VhIqf}i.h嚮6곶Nim꡾Rv슾kCf.jl즎^Vn쨦Fb=glg#jnfn mW>&kVmlʦlߎ&)y`ke]^"ghlnon`kj~f`nV.oT]lf>og>f}pB>y@6cda#( vE^p fDj֏gNe*>^qNgefa`kF zty':|fa&\ Oq`@dqdc`Q&B#Fw).d肉6Gp-1p0VeLhs}(PX|0s݄}ȇ*8V}}``"$'.X?sHtBOpD?VK/ /H1+@CWv~*F^Fm5hDdZOT]gnF^>Z_oNufoXg<~rbEZWUamvd^>.jpq$?rcձmhm> ^xljeVg]fdr.egvdrqiyy6uq^fg5QwY FdS@8H^oׇ1FhUG?2pv} `P}haHzҶ桮7GzׇKGw.쓧yH/y}~ng_ayg.Tu7j{.|'kVgk|jlfꗗo.?kGc!iowzY|'kDk|f׾nwn,tktnqqn7RCEua|w;f}_婗w~fcƇyg~Oi'}OigOoDw7eEO`=h'F4hq47P& (b2A0-1`ȱoh0j>.gό7f_8~!S˘ԷN+U& Vo,>3jۙ۳d*WƈM:9ͷeNfM, ,ޞ<krݴ+[6ye9cF d}& lЬaSƜ^Z[/̐Kþ{jӯyCun HOObd-y1WY<܎v3h/>6ƏU9Owoƕ5v 8i`we[YIVngZoF>Gnh&k)fM{ YՖ>c0p4K2cTC!pRd?iDR_2٩dY3׎EŔYSh>H&>yAнfEړ&!>ZYm\fYMc YuYdרDGQ콹xP^sݘ8UWڛAF>Bgׄ XޜƚkZlBlW"q$vFf ' mox6-A*$ 27fPޘT"f?.7ͣF-"ǔ TPN7-Caû@AOk3WBqQTŎWuVLe| Dt7X2JѳBN(ׁ$D=δCѺPCY-wn-Zng 2FDXGfJ= QZz)Dꥅ uKyCWosOT_^6aw۾b5^>Z]*d/vBt#Wo6A;Gݘ =wJ)Md*Bo&Cݾ[Dl (2 eT)tfRZ!Hs(#($m(8F4amNPc)HIG J( b"kk͌GBd%DLdp :0iTĴFz@78@t6G_l,7/8і/ }sޓ.9gsUF0) =B~4PǖWF@P-; UB\e~1<η1E6q$ z[;[!C2 *9y%^ÐCժ8dwS&~#N 7a$x2`>M"6DQ(!OjQz()"b0\i.;Ǐ4ɭf{AYaHPIӄ4-R"τh,\D8G_m}PFGg/{v?N#*84j{FC(w x1ʼnˏ`GxS&hPUarFgب'aVE_;TZՙdOQmjQ]%*-]Ɩ"q ґ5q'YFՌu d(R>$Yd  `Y\7QLlu<93;Y LϬIcv@Zbe?s gF'mxP L31bN(ھ+; M)]_oٿYޢWJS4ux-=Ad~qreyOIF8L}!Й)`FOYrME $AmtM }ݹםUǩi!bI|1[굖X "Ju^ 6+ZnM0] 4vqXt QKP%W?QD5J_ d$vX! *.uA)Xϵ!Fq) uI:IFѧĕFcD rW`UMDie_qX}|Yt, -)0\W@ৠMEm iΩ%ZP$bttEN!0'XGEKBrINbgō2JG5KOvG`|TR~fz&A@ޜ$BaYna]N1lBXb?Me[`꠯)FZFQGbMw E,`q'$Oˆa Fv頏 bRD}yFSG^GLG2aL'(ʊJMQZ^u0jd16u['Y#8'V>gpTbiO91[dXZN, ]0^p]rLuxN=:: ~(}(ZjYUK~ )ob5ZahIĭILFڌzBl V dQ|`U&qf8\[re@9~O*?i5]@)9(yRd RR ~ڣǙhCQP nWFD8dnG.'#9jy6 v/fgfxE!^ٴMIY>cs2lZ묪#[%ό'sQsK)"!f %{֍^1夅g*b\'}f wo &9OakR{zV#kPx&W˜ k 7Y;'M8iP 5g* RDj=eHz!|Ož1mǪ|&&]^n3ΪTa6(YC[vy&{6>N3W mMnaJU"[zjVD8cg5y6T~V]F G"6:J&KI.}l&f5-0jx,Bj$d$0 ˰ 0 > 0A K !I71g 9^uhY-1š_u.)t&)q_j c@aQ$:@NyH!~I #! b3ŭ`.C -q\(ghµaЭ Jkq)% Ro׿.92s/)ȪnΕer+J]/{ W"%[19v2nd¼::3<;pao3⥯G0Rb'?ڀDq^[Ub)/#fGjcŵGo4/'Pu.t/q+?o'Ru][4{t؜#2A#s/ M?VM3Tc7rq~'gvJk17jTf>0z|{҃=6GJ5Uuj} 0M Okbv;:;"XsgBڨ3Z:9:qC>< WyCm ehw 9t12-q"#OX8__\kGT?#[1QBh1W2/fnc,9x}{f*]#̤,1C6ТuUw4Kf~4n㊱yEFKx2w#m6\wo6 xeٶtWx'6m/:3.@hv:tiB9?#9 g)Ω:r+и f2ֱs;6CXO8{'s(ڌ >f957{{Wbި+(Zb_,*yO1Ez{g3؉KA/86;\)2Arn#7|_n ApJ7wTUf{4,po40.bSx{xDMBsB{iuzē_ۍ@:7sw4h c- fGúUCp?grg/cbF3v>sC]Ʋ?myk˩M0Nxyoݣ^_ksWw>i^ =k>ҫq"^7<~Za/V>.4H=,ϗ qlR(Sl'?@죷Z=} FC })8ಃ'P#4hз,h#)LhPHE8qҾ*R&zPB^͋1JS(Κ2{J +aZ"Hh0|8p@Y+YShK4[ Cz-2%YO"\8qœaQjϩ/ ͈5C漘hǟ]mf{tRxW|x괃'F-E^setyVN9Vn^[2M9YDbU𓸽O lsn)K,ϹFΫ o ƍƐ eb0&r젔Ei뭤TtN,ziA|cǛIF ĊbfH<΢ T(۞3M,:K(͡DCKsɢo"Ԏ܄Z[-N=k+)!C!IL::C꫁TBmi4xnT'm3UF(354UӖO$s(Y^sbB`w{4(gbԨIM+5Ĥjךz/:EizB3l1Se'1@ZA )X׸WyjVnBSd*UM1 ]j-=K>jo͒,-mVmVXUmC8 9 Yǜ6Kae1Rc|=X&3E3ǮD;yN8k(ǿ;yWm6F+[a4$!}^Z(JZ^hhJˡi$b%!Y'-JЌ@zǢ}z+ fN\aI}|MJSRgg GM*LV7̡D&4ϝ|#U'L{e Yܠ5\X[>|JKƭNI䷬̐l"jC#@$H"9P4haf 2&]أbPR a9CIK:hⓗx/z߫8{~4ΔJ7lmӚBh Z.4[zH`ԺHrh 0?rw2A =DT<魘 ))d1iiePyМ&@;d8jejHIXʗ2<Am*񙧼ԕ8Q7ȉ2}e`/ ȽLn4,Dql*ɯ@e+ D {@bbXcDt3NK2u/AHM465>RB,pth.TS5ʘIL)kJUe$aY2J,U4ϫ4C`4WyLV2}18̱OC! V4}kNG.uؼvl +]g+^#g ކC0\/J[PFW( ]0JC<$]S$g/8#K)3^1[hލ@B;|g' gb ƈdDcO #Ϊ-_8{os2j}&uدK6R/ly}Ԗ}atz>)[[tO~?AKѿnNl~:}G{Vn\ - b|d$M$PҭFR/R>+d"b+N0 ːoM N0 ֢.Oin ű}&M)o!/!7q\n-'Ҙ $!cl?qJj!6➱TzbBHߔgv``V@H&*^q$)k+YRoΜQZmװ 2Q r r+R , /- P1> c2R.r+)1 %S" /#G-X-@#HgHB"5o5H+]u `"ND1ddRa V-I,q❺bC6 BuBƲ.,K)B&Γ 2׫!=#⿤o-GX,B-'C*?#O.A-=c OzB AG"+s!%>+=o@*.n>]T>tN@,!%13/4>%Bb$m&!/&_**6?P_b=ݳ8zf(m2 &y0&+D&MT*BBנ7KPF7%uʢCK7'S=#bFqFA@H;4/FR5!^c&AWUUBؔBEqTa5W' EK5D =+UXUxYU0M>F#b$ؓYu#[q\O8RV>=R5UZ=fMU[#BYÕRXZõ^RA=&V=U_GS`;5WS]T\taU[CR%Wubt_;SqciUc}TGc75ȳKHVSe/MAGvUU6f&5c,ʨ'Pgg~bPanpB沼!0@4WbDEb":I* oO!dy Ԭk0- ۳ir>6fMNIU<3d;u]/bѐ!vv4oGWxt3YR7@V[\Np#CaV8EZI\'7rcS5C!GCkTST qS`0xQ7CR4l=SHS _$9Α;,,E LCC6Tp` e8dҔنEp}FWaޮLm˗>ht 3MᾮB7IՊQ 9a[E\[/ӤI[v Lcd{$L-IJDŠ /?tX(>V OI<'f=l F7kF0w*|~4*Q1jA8MwNLVN)%$QtQUI1d!UtI.RuYv>eu^/s[XPG:VHq'dvwق2͘܂Q7BWBCVeO)XR]JW\XafzXQ^E,xxmGPI(:EQW&ԕchh hu]pbB ٝZD6\j^ ƨ]DFbފk~ksW9c} ~%QwI9E~.dv]iSRH~ReR:9_K~muo5nxnEXݻ_%z^bN9 !>cTN!"QLB2{B^e馄K)2GVƵ/ E'yvqO0gArUV1׹Ӌe&EUw_7UQ Zh-FAl!wjݶ\J|ԩwܮnٻwx器~!>.tj?(G>HyɦEetl0aha처Z-! [vbKC .JlalfvWl Yzv-d5U+В4uK`RÂ`-k%T-Fmnں,%m\Df-s)VbT\ )>. va+\z-eaB>ƵU- û)e.zx(&j]og:DϤz/ iۙUV .r>F/x6٭ak&e1h{]BX>\϶Bx3(Ăv}`Л(V FJF[O1@Q` 79tg;ߙkn =ςEh=`o>=7oy^r_{+_U|_(7}T?zeоjW>o|Y?}yQ'|79W◀{H~'ǀܴ}z З}hi`+AZ%^$D*Ztayaa^cbuqa?FZݕѐ1 bfffm=(˰ r!MxDur! ՄqxyфEBYN?8o;Dmoq(sHuhwy{ȇ}+ː }% L#Y8Lqr! AZB qq~q'g~ih]o)G?nQB2x6Qh LjɨȌ(r "؃8'"?&6@6?ʰ m֘X6Hx?xq^^oAب_2(cx|Zk8 )Iiy_\"}-Ȏ.x%X&IH^c` ~muX7`?=A)dŒxxוa+)SIUiWY+ ) nra)< bU 攺y%\h  hPedJcZZ]ㅔZ@xb]%^nIi+ cd(Y_uag@阪xXo`6fWDie [;He"bIٔ@y )y+&^c+e+e+;eR2mbw Š)dd^}+lHaI+Ɔԉ ʠUҘy+󖃍YFVaUcI ׄX/٠/ 1*3ʇ@Xŝp74Y3]yC8L(;IKʤMKJnHT9 dNȄ "%Xڕ驜CicoOʦmoz+gXř+iCZC=z+HF*t:ajY 땚XYe7 ʩ(@jS#r%Kes%M oQPNHʖgz`Xua&ehՒXک thhj}yoyj"XX)WjH8  Tz,$@11  ;eBY)@+ F`CkC+k+ nȱ$[X+"mz[+0p뀱1 %+5;CDKʴOʙ؎onJZB@&JIX1`9+` ˒oP> MxXXG@XIY3Z qX\un8@){[ˇ;CoQ w C2X3۴û@+5ƒ%[) }xx18:_H2A Zz+,` [+ +KƸ $Kn˯+puCQh0 0, a %˱"41  XL}k10\pXa@[4<69.\NLC Vp1P2l%+Q> (C\G,Ƌ?U0JhKˏ*kۮ{|1M  ?…@N m"з,  :\*}  [-ܷcM Ȭ  H+PKm;4dK o! += = 0<6 GXm< \9ЛMC؜,;,;}򼹾@Кq)Ǻ22 <Ӝ2<,tL}l 1pꘂc삇gҫݜ"i(cbĀ8mNݷ ṈkV\н1 d}֞ȡ\\ ๸gСEЉ `m򛸬칛m+ Y+ '˘ |BNJ%۴XЭX]p P G<ݩ ҽÔ$ؤ%}}M  (B1i؞{x} , ,"AY 1.Xx-F ggw 8 C P'Nu@^\kل{/޽szGT3lķ=یHKû뺛;;к  V.̽@Z\Bk%-Ἲ+Q`^B.C{=+} ԛ+ i.#'d=1ʰ0p@^\+ؽ|/: ҄ ;9~ Ak׎m˰MH+ #쌝hWY}+ ۯ`mN淂o!PLtd^ڙPн%}Ϸ݄~ \U0l+=ڢ-}ۆlڵKBC[ +>\?}ꙮə:(LN1o񃈫 ? mF/*~ .y"jѽ=} @0 ~ -MȄ >x_ː̆AZPŕҐc nDŽ%η|Ò>ϛ+=Ԝ뱒 _]۳Xm8(K0ޕ+LonО&^\_!9}ˣ=?!\4T& 3`P j[ؖ[ɸR&pS2є)m<-e@sp`eL eBFFeCLCͲg[b0w *&PH2|q P锱Ie;O\PYI:#ھy\c)>x«O}Sm!+,`0MOXXEEww8'7hSkyٛr2nաv]DؐpCg s~X! 94,NO9Oz曯[jϧ_}p@ 4P)$&BJ#e\h`x'*P%Ce\h0LYSyi4b 4i1%S*EZ!ZrAjHA*tɔI%1\$p@M8K8cNO@4eqz 'f4%epL*͊&i(I3'I.! In-EaEŲRTi P%DX+4,Qt֗U_e=U!H3OkZ[r5\tIHe,'/-y#uzSv^= i*{Qլf_GerXJcYUفXށg_Yc&sZ9IRecyfkf8JyY50c7=TSKgMQ&a FWz}kבފIT YӘgn{P&L`wI*Zaf;BfaTѵ$E:{?XpÖj^\p#D*U5}vkv_S.Kh\tym %Х6㟵~5wMr7|W}6 5yKm_Yad b,YdC`lB.c_-xA fox:w \ 7}P&9NjOA|y GiPC$bXet<j8Pl !0VAlzC 2.BFX.TgfFauqtc&#Q{c=xqF4ꋇ  4>RF$I $";H8~$e(+FOzҔ(GXR]8PRo0"F`2 ! {]H[X=p;`tAR[)RN$g9ysbbt -3ޒvGw}vގw"[?M@ 86nQqukȱMM9W0Yc*e>q9qs\4yϕns#DzixP>xYj=[%^$*2/rgFtc]{ywL9es\JԕćX'n[zXФ=Y{Noo~QJW>n-ax閾Չ~}['yY6BlMD\$z#QO~kfOPPpڐȥ~?,@ee? h+|@ @ < '1P@zDهz1$A|A <?Pp6e AAPqz C?\SEN4OFe 7,Fg$EhTHTHSB CmRSMT HU1TMK5YGVUQXFUOaWMTLeTT$i %T!J1$Meӄ)yPJ\H7AMhN 7wׅ ȸW{% ܑ/ }Bۢ`۷( ߄Uۋ_.ٷHa NX ^7 X_5\Cŋe_ކߦẕ#6`bV߿Ԍaߍu`Ѝi`6M33N/0͗apWK2 ШG| x|p׭Hր؅ =X@c4rE _TGl>ſk M4C`TT8 Ӽq52׌JM(HC@=XPd0'!3k''0ȋEЂelojFkѾ^f܎pp o _7q ql k Oqqqھ8 1T5VāPk HЩ~[?Rm"NHt'H'xBP5o,s8߇r 9+T;V#b h|\UW:%s|` .&0po9p0P0BOE Iנ + R1H+00RЇ*nkFH،=u `d[uUuxhvvivxljvq Fqu܀EyɓsWYpohwv\vkgwwvh78H8 kym8IA=KAu73 tL'l$G[lEs<ld`lCӖjQ/`[bxXd[1u,i#$~fY5Yv@#xa]`M\Gz—GAg |^pȶ_$`Z(ZV|nWbytN?,r#e76rEhp 8h]@ } ^fFtSX`v-H `ھGphԘe#㓘02%F}6ڕhEdȍ7r9u2}"W|c̠ð8h`ĈjŭuNGL-#Qy"Iۅv1 [> m&1 ǾdV] T. U2C¥ 1g6..ev{V,cgq85Evjn^o'p;l:F!+\{׿!q1P8Hcx47QjҔX`A6q2( =8dbrء GO4i5Ʌ&jDL=F!`a`E0AH4uJ=$Z[L-R0dH()% 'L/,^0pEM-hT<΅4;F#f}4XZLΡF坉Q21OqE7OB=X(ތdhb4ܑD&rje0FYRxEEdѝhU2ccNZґ(iY(erH  4Ӭ"e= 4dmU^* k e2R>k6LlLb lx~*C+ggѹj"L, W);0r3xa ܀21i1 C]G#]syZw&ilQapZj2]܀  512D22%R%2"!&޻u aN3`555Ơ;^Z#BH5Rر1!a6!?V#7m%5c! `ʣm`Vc"V䘙@32"EcHAn`3z4#/GAX2@. ..3b)Q *BM!",̅"\!aJc4*=z@:A DZ#3ZWv":LgDO*o(CMݘH&lGn"z&-"&l2- -.-2-lЂj"rb٪mТҚѾmҖ"mעmj"׺ТφZג-ަ-z&ey$d$ bȹ"*rhyÖEJC.@EC>0L貃,Rf_ChyhQZؔl.l/"o*o'GH&hf/OZ(yoyԢQH@'1#sD ;ĬvF HpiF56Dr̂,qGB@w/wdHBp$Oty/$vg''yGy?s;zrWwt7z}r/|zw|7?wL\'6t7|E$ {;8sk.[xsJGj|;Q0~'_aƊ CKд/X#v/K">s0@.(ơG p#HAGrp[yQ3u{Kn6LX,wGKCSCe4D pIw>Pt5 v5S*cguy76U74򹀄uC88s~|9Bt37/;uLǴV,w:V?5d{E#:5x_6`+ouA4t\WzGX TOxc-3txtѤ2hBL=jH Sk_0_/l6htu?:ʸ\yy|PwHwS/Byw Dg{v,\r}֗t/w'z3IK/[;`>RƗTE{z; IGMBt8\oK~O88L/\0+~Hq[/+/zDhӷl_514bD)VhqPI&e8&IC1E+YtfL3i>< Q$hKQBGOߢK戶o`A}g<!ܷT>DU4(oۂ=-0!?bh)°[0^Q[pXV6:5,DOa{U*ᇙ _JdɒLӹpSشث4Yf-7ۅO}g}}?2d Zk_?y3͍~ܫzb.ܹ'+ ! i": . " -iA M@$eH $"U\[ў*i"5`Hn.N)v z e':+bD{?Q&zl;/c>q< Ϳڑ̍~cl;A˼ ?⫰;,#hNKJFC.Lұ>E?k,RL-8=A5JNY J3ERKL;X]tNâLRQͰ nto0LSc!M0t&  CP iƅ(%r块zk*ԂNRĉ1Ǡjg+%a "d(*bᔺܑ r?kN/& PO.\ 5X +2] kTηع6G1?S<٨P.z:&q`=zB#q>0NIFI qv6͇O~QX$ zWoV>U^!`ݔ6b; Bq *|g?pu+1F€d"G2pE@E/~-ɨ<ֱwcs;bd$ tUwc=@ɂIAL (罽,c kNve\6 ${BPkUjJ E+xb8 (AEe䓨G},@8&+~+s2iPRYF8ƭU2W<͞~~Wr  X/P16: MLt(EВO4#SA#Cg~j"i]k12!Iܩt,Ƌ q–@[Mxkq<*SaR4=nVQl1T'v;?yބNv|5х._]F&85h@{sѕn{VvQ3~3lo:^p 1Cvn&:@2pС4V[Ag5DP:CDj'4.PkޟQ^$[rkZe?;$BceMw1oߊA_6 bL~~Zgb5'Sdz1~w&tթrBy{  Kj5' WGGKb4X1mOP.tKOj h)Sw7g%qO{6EfܰSAHnCnF~˾P bhzPo)nDN p0"+p@U<L@ .*0Mh"ОV-B韔! P琯! /EBLJrencp´ Wo -|bˢm,^Jdpl?npI0? KVP q 0`I#q(14N7O,F "#2+FB$!ʹ.P wQ  Bd !"F/(/ /Ip 0kʔ-|+ϸH,5$O,q pXrPQ Ynqo }-GAO0k"*  VOQ c9W/b26rՎBs(k6t7gsn"A)r)#A)/$b*A @hn r)bHa a)_&ajqֱrP/Wϸb$ɱ/q1_/A! R&m/ 53r12+s93@/P5q#r0'L4P/]7d/ɏ.jH/Q04UҸr.32#3&.s¢8S;Q4I3924]S<[s"˳3O/˱Zs5>Q>s&524 7w>sz"H &")A)a*#B(h*Sb*.G|@hAn`|Ϟ17k;˓:m>=5FItˢ̸BaI`Hq 4;GF /874G/>KSQ0T>K$1! 4J%3NK2;k1M{t78S Q5q:9q?K LuLM W:/m Q.}c!9s2-&84hX!bH$Fdl(@#VB5B2*)Bxb2< D;adXR12#A pT4E3SE7SS[V5V 5G_!_XX4 $/P&3VSzsa aWa"Vr+=SS5SN57! s U;L53/6c7d:7ƴ=35΂TbbVSf2i7vNiUVU6-VLOSM7UdQs02K6V>Sa 4v0F(QlE\/)'pY#b.+U,gZ7 WZE~\C+vv plTKǶ9[v_8FL!T<$<$$v$ܥw"drhSHS0ewxQ)U?~4Q?5ۤS]V+v+LA>]OF 6uQtUM6RWFϔVRM|3uwUW8S4}vtG]V?mJvGoUgq}{St.ǔRmR3tojኖbp/A7B2qCu+H,QT *2Ga &"):0d-Gf,T?+c7–x>!cӢH:Œ˃>.cGbWGOX"=x@0QNE1XcIYEZ#"S+,n؏VƎA<8sR*Ng8yKؖ;x$o>j[=D:XJ8RHٍWaoq EAĠw)B!X)Ykطv qav8D)&ExI8`$lG `! Y2 Z ':Z#Yڣ;3ڢ C%A:7!ڣY7 ZWkuz/:KڥyڧZgIO Z]>eygT@{5 A "6%y-PZ,c٬b<$Z(((LbnI}kw۰o7 $ /%9{?wG;ow4;=]8;Q;#{ ng[Q {+[?[}a{{wk[Kd{[o 8S +R \3aL،E0F=MSxQ}Y[=a=eUuݏe]smQ=y_}}ב>=]}ٍ}סڳ}ڗe}AY ovʆ.G*bԫW=֝}]䥽-~~A^_/{]Q~۫} 3~u>!xZ)Ā]OBo;,cNNpf YAGy>)%1~[5#+>_?me+o }@+)PaBʣ:"f dڷozFo_=h2lh&t aC1J'-FۈPa=ܧ`M4gɳΛŊ)SWNJרE&vҷb՚E*ܰiOLÈw43+fNP3k̹ϠC̷}2饱L/`5f4(%Kr}>;n8dJS*<8pW]RuiSb}.rj7;Ye%oxgW=Kg߾90"hX CpB fvhdPEiP8i@tRF"UtJ%RCJ31TQ7)>1I^%UAYї^XW~^i֒QziTbM|ldty_iš- -diQf碌6L|]L0NgjL2ExqVRPbDJ#VږRwFwuWz՚kff{vW%utWVzBF >1('Xؐa(KMZTa(lݖFt#t/xp$%>l~&mIѪay mn9gr iff ~(A!Jڡ):Pϻȴ]⦸մHA*H͸jC4 '³jH#uz<j2"gL+_AY3zX&E">3*+%`FL="D%aLvFLfԲK믻'$C. ˔O~k ()Wvp*K`ڐNTk ],󬬛|Ivۊyސ?wㅟR93ߘK7ЀStECBX#&:3jYjɈLv. 6Cq:J ږ6_i $"zloF*D/\=I}g9əo3V(Cydd7!Lq>le@g5DMk>hG]\<J$@yƘ>L(]a!#f-f5uB͕2j|)Ed 5W$0JFOHDlR4!7a~_:}I{Te{ @)ɝrozgRM[q(1Yj 5p0n*8v`9Amfe FeGQsDhkB o 4 D$GTqIbتM%B@R.WtDI|$XɷBY$XN [._e" a(,01nd&N2DVs9j.?M dTs96 NPiHtBJkF#)7k yOVl,"SbCnG7[ E:ߏ1%aHnmRneg50 3 cϰ4p}1$!y u0q-vMP:PDjc<;r6ݱ]3ȋ_ c2 D o󛛴Mp&".?i~>~煞|~7蔮.>^v4i=ChŪĽͽm܊N7 A"fUcbHe]M=ӿ O*Ӝ7؞ڮ1 ޒ<~I`Kɽ[vٴMDFi1MYyoOڜ -V0y$  dc$n|1?3!&Oo#%+"12O68_0((,?B7CG?>*{:*@hA-%L(E^~TbppӇLo}[Zfw6n[A4|0ͬ}Иk@oM<" 0*DS+Bh.i]؇p+]p a$jpç:dQl0H! .h .  R# Ԩ& 3R4虈˲K-Ӱ33;L> 9l:ز3:S@?LtOD ]N;m$5H-PL/]<ꂆȷ.7 MlMքGV "kpeEbݤ#قBB: CYĩ|dHF@(Q[%ۃнv" }sm+\)0kVSv0 -Ѿ8R+ᴸ,3{S/69EMO{ժ3Nh ;Nt@QT5NGټcNdoeY>mrT98kQ[) |0"h"1u{bp#@E0 i0-C.zjy'Fڥ(%()ur\&mMk7(hRf7 ( 3ˈ5\"s,vyS̈ZQ2C=P=% 'ie/R߹R?T>oRBi~= O0Jt7"{$#X ,i4BlD DEF"8Lڥ[G!9vH@TĘ_я\2ih 4X%̔)/kdH܎bTid fȐ?!=!Ԧ&<شC'Eq}aZ2+^GrafY&-Kf!H"*+ ,ڈ>BgҀVDF|va@Q( GAXp| bX2d$$=Itq|INqBMYW, dTI,0_04u1ߣd8FiyM:;d[eJΩOjT=~e<ޠZ*;ռ2Z fXAVrA e#xD60o`QQBpqINf"`w"2qp/SVp^ BT"a(+NS(O6Ye)v5KpLɾ՗}j}JVz$c\v]34DV^BZ[6.xL` 7X#`&8]k5uu} u[41P0Q xqr"\H4 MQvފgk4mK{“f4-`H4è;υxjL4ot7f˲K2滳ϥqv-c`-Ellyȑ\6%fS7D2 Sf X9<5]u*rL0`=I2 =I ט7gX˂{~Ǻ8N&O|c/FJwͨl}ƻƕCT1 e8 ?% RXc5%SIw=L:1~S6o3M?VT/:Sw5_=OztOzם|w]c`-{Z0Vi :`+h,c<+~qFR1X~ן? eK_:#ፉ ա&i5)긚2A0k 0 s= =@(@ @C:y;$i 2b 3:k(#s" .:8&m8HK5HjJ# *d<.$`3&,J&X B"+`c;>=ۛ @??d`=38/+ KJM/.b9CDʹp1+;<`?+E#YT%ߙb?h 6AB&Z|?îr-3 |.l̮%z.#z8A BmF;Dt2mLG2+y<*iS/T$ 3Dm p,u"3m++~G}}lFD|.ۦ%H$ܡ1-+;I R$P;]b5-9)ŜDŸ!RVT(4Db/Y6K0 |CBkF꒬LSBFD<@.[/!K,p/)@pK $Ħ!c9ħ?򓌊=%("Ķ|߁Bbd$̉2Lĝœ̺lCoLd/yL$@C3н18C&%d4h?jd%a~)?{1Jn\l21ӳ B{@i?8Me t܌.̌ηtTOo ӫ!(*;Me4@9yưG̝e?i P=A*uF55)I`K=3 E8 =L4<)e8+Ļ$QrY~" ΃fH95"g>H)v Çt$x:ƨGCZ"/RiV$OfuCSOMS *m<[QKTa4+[cG /@[cLLPF0Å,j9 V#KBbئm=FK Epn+_-ߛ/pccTj0.̅|ž2[": 0.1?5̵\͕MHYXEBțy`!L*3DʓHkJR9._sR":ElC*c!gJgf=j Ǣe 6^O(e `QobګI`]q`ɄOP`p (}ɁH0 QdihifPeHDJ}̄)>w>/CTU9Qϡy熙`dE( 8aȉe`I( #*VԜ(2BC٣yk)1hhNeVE0@5d`S[RRCӽXE@7 v h볦* H yiX|gR'^|F :0z8l *j;:FiÆmh*Ήe8l.qn>k1Xmk%0Rh @bkH].mPhE>z/֓oۧ,cH&3#y\@'HOci4Fq2qbFM/jxd3OKy#$FTw *X$%Q#Mpi[PQH]uiQUHCD$XSQTԚGQjOVcգW[_O4)HYXJBMT'䑇$HDqHSU 0tDTdMx=E49_8#k]X-Af6~Ѵ)Ay [QwbiUDH}4U$e֎~d kz\)iI> 鋄9 Z^QG6z=c)%|9GD(Hj[fYj49(q lHz[Io ;oW W"[|]I#\ҙ! y'{gaLq} ! r hZ&FʱeQNqa`)GN(V9_c̈́c(j2$zSE>(D4걖iH'I-Itv4Z-Qa&ʹO-`FMgTXiSQQ5]Gi7=ٱcHe#LÈUui%6]Xq h@C@v8>` paEJ? .j;;51*4=]q5LJf4WRV5i rjF&P8Jždh:Iu@(`8HC^<c/8{ß}!/,>I)+I$O`2̌uF&*^1N9bl\q?:T4! 1IxT1B"&H\G+G!5иp9IO ȱ!2ˌg)JGW 4Hr!BQLQ((OST"`(SHR%IZ Djs IDeӏ(8y&8yɨEJ#$4 1m У./m)@5( Ҕ8 Q G{}B0 I!Za'DR4A%ˉP(&RHJK "&3%IRd3j2#J'\#32*2v'j]6<z!X:a D*_&i{) )nMR``N<6NP<'Bj"zfGkGvЦf̅b!ǡ-A.!>!AF#^J#F%_%/ ZX"VFdRY2&gK~RQڤtj Bܩ:^&pM+-ik l*$GKf>lx&.b+$>&hfj *Nt"hmrl&HViGQg86j5>'Ik^B2L'vc⫍2҆c2d>|~v'x(ABʒgA4BÀ-G)+|™ki"|"*+qF~^ Wk ECyTiMAǒ>\FM).T,W)dZ%hh5h3d2,C\eY%+"ͶĐA(c^Cc>._n>`cBgGqRnaItak)X fGm..q>4p,y^|샦Q}@L^DXlI;;H.6&F=Hvp2bD"*Yr'c&hҶ "nw:H!d'b>԰IJ- p r$ M:|bq2~ߖfֽ.ٷUʋ1.C62l\~~ǝmIt&#DTh|pg-/lUr%.n#(8cw*FsJ*^#pc.N)z2)zl£(Ȧ"VGl)wdqD| 0}$o|)$?IDbmr&d*]fb%"g2q^Nd o$eg.2(2(󼼠@ƞ+b5p<(4(ptm2¨qqdz-Dn'D`L0~< ;A/3 GElnk t4YIkJ|gH+"JwIM4.3:.)e=S^*&,F(/@+Bd$pQ\ rMnLsٺ*hHuZoP܅j"7y yyz!^mcS(㢕fSQ (`q)ҷK+qhP,[`A!Bnr*G6t:3%KMd^R)CR(:O$ $"eSnpT: {{sx0,p9Eԉxtc4j[cN-!&(EE;%Jacbd+&|GhgD&:QHK|_|$kryr—*hOG3~zrj<%k&5yk+r̈ aQ-5:'Sj_+Bk!>﫫2 )ZӣxG>  o,ܲyal|0? qCi!H?{ 1k{&sgl3ҽ})|2+(Q{KsR)x@W/͛}QCI)Ӥ,ba1^"ƍe"&L(QT#Lo&!7K}Է6wBHӦLG&Uz|5ot(T>rkפdsPz5Zoߦq U^ZXnUm̺@ hSOm[}jqg ͢i&-beaǖ=vgMWo_G1Z.G!rΉ-G>=:seʆ@.1߽?>|HTa3ġڿEomΣ/ǽ Q̾Vg='|rЩ@jy|0B p1g QpED 6P+lb ? 4d5@Yll@4܇ԀK!5ސ:Z(LV("H(,M)r.iѧΙI‚JO;*R?P: ;qjOEͱAH3jF8sQr=3K P˂,Ta2m";굾c{LJzKԸ߰3oM5͛H!i͊#\oU&g8޽i^vu5{^x}]Ĉ} >H}1] SH~ޅE)W^_vw%_xG~RbH5e : F~Y ݠ!J,!H0$ꓦHI7\i,:;_TuT֢vR;PP*TQէ <ook~p6o-.[Z9C|bH^{g.gD׺ 0Tg}5Ie'7y֨ZU q.ૣN"k62257 5"eKڞ{f~){h}ctH-Ҥ+0A(}ahC͕J9"(Z2Q [:ޗ0xAlTJ=شoJ _ B$88!@sLA _A@X+`G-! QDwGfĩwRXE/Z"qE8Wш=%i2!_87&|EclWce䇔$eK>|} aRĀdXb>k iK50qCx02leU [rej$)h$9c 19Li:s95jә݄2oz 3 Nd\;)Nf ә;9Nq? e63Df8Lqs<ZN%hBIPB4E; ҏ.T9YqAA$5}R?"1A$""H2dWfX%*HJUUX:Ѫqd\#g0#؏+TE("@EQA$,7YJ!@!!Xc!ؒL#!-KP՚cD&hv]ӆЫ /-iG)hG^tQp=]Fb^^yl^u[[8N\ -.yx–- ZVyމ@K2fzp/_[2Z-@sbA E( . K( b`x>APDD!LE(c Q0(l2"eV&@QZ٬vBP) .ٳu2)26Lגf[*k;To-_XN '-Si2i pQ9W^^2$EC )Kp?[H*N')zJ|dƱw<K& ﳼ-W5uE:VNt5 605e5"Ա# ȗ]'Oy$\I Ҷ]lg{^mwO.[5xF;O2€MB0B,BAE&ɕÌr`_I-TJ˜|=(4,Fx]}/@Qq.N)SDIt *A&C RXxDF)SJ+:l}jdZu%^ M{כaET(8Yhh:vA^ _͗xo=FYi Eg-}/f?>a"=B7R\|*)m*~FDQ>/,㉸k+x'= Ll.T~#GLH'2F2^->hfF&\0,gҢ`pvdbX,\P/fDōB XVžu0TjP ,4#s^B2anр-ǸK2vfRo,i ]c ~ ˽fM?v^fE(OhHO>c?EOp EB~/T.JFPD/37>^m0D>m  nn ю(O'mGDiZ.Kx:+kTBjɌȄnУgS.Qc2d6ROMgb $RIq V<TF2U%Vj1S֬ /Pʷ.SvzL2Dž% h9ҫ9V/xrΫ[1y.KFEوF.!Rd,@eT?R&^eВcέI*S_--I+aX`oc2r,!,E~х<jINNq1&K/pr!xZƅ#"&bk Yb:R0&:Jomx 7!G,87% 8Seo>T8c,j7qb6q8o%&v9 s/|&a%ѐ5(NM' (7z$(Q44f45("x:""* yzM@xF'hB˧HBV <H5YM&&+N4>ʰB3#cR8f< +-yz㺉ޖYg=n}ҧ~ٳ}Bپ}AM_=)P = Q߲}/f8aGr`ÒZܧ`h`^ܨ1F5DX&͊8A<|Þ 3 -ɕ T&&5˚=6ڵl'* 4h)Wخw0(Z M0leB)ldM.YRˠ5LFd[LT&.'_^vPmAyr M4nϦQWͤ4d$‹@ *$IX:$ԏ+'{W@=}҂NGMXJQT@IE^{QFzV4bK#TY={ 'T(zԟ@'T-]MGҀaD)-E3e_6ՔI#9NRzEԊW"PX>U5{5؁svމsxpF]u)s^՝E '@[ 4h ) #o j8!C&`01 G(6Lpm62Xiplrj'ưfjj"l -&̨nՠKz%X`M2ԇϭϒY|YUn5on{ҀA1ЁiVUFA4T"E|K$9A{=5r`QnH裌C'r9墍WbBV7ށW`F<=8cMLMY"\UP5^RU$}[uX֎mqͅF0uq"VeM*(Qp,'੅" 4.ILpfYN &90&@&j\d*Ǒm^CyUP  G sTBL䥾bR|N,y"Y!锑2wGSyf)mMjJ2N<†)NeډӰP1m2ד֒yp J{dr%4{ $rtتgE (z0yg/1.Wb[F[F|[`$)vTRdL8es*Qo0',B&qo(tEb[4cz>&.]&^YD(j5`,nLЃ' 7W|,e~4A|[#sV#.[X׬͒ YcB$!?g9Y:$" ڤ{ԚX̂)&$#5;P2>aO!٪ gV& /Ɠ r.Z'nY$ F4(BeHbT*2ƉY:kDJuWfaAĨ@wYL$bPiK(1d7;cξX"_:E\eR>,^kA˭4ϳ b/ޤKJy4!=3Sp=54_&|bM$ T2Sq#"$@Vgegĕx-o \iQ "]iaEQ0wwT`HT t _n4ɡw`Њw{N8AHG#='5[QWBCuqbX07%AF 4-x@Z|x#EpIWVIcKgy4Z0m3hnt=]l5ͳf54UwzNN.@A`%Ԍc|!p?FbzYZ4O##q@W ~4V0 biQBiAxғkaaDBCQHXъ19x(a(h;QI;l96g44F4Q\ 3ZXb]3MtE.%={ 0Me3uHZT3{ Wr8U[۴'q䏃q4&a[$! Nb3|ARǑEe5BX5~H[6aY%rYB݇ #È`\efs7hHsh`L9]`BY!ပ1ιB%`'y"Ÿ.c"JBy^A3Lt>&!(/LT/}%&w6 VpX%|R/4=A&?ԏ&Yn0F[(gW~<coex/ڶ!"CA?WK5<^fb5fV 7:Z=&2'Tf:R[+ abU"ˇgb60}s2FƑ= AJue V3?#{Jlen5?<՟K(7 T]vbn h164vtL%SY~ZMYkًs(~!y=`u>^%e5~IQfqwh.Y~ph٘Gse%c N)Z13xVmt6BEAhbs_N刾~U~^.^-r^uN|Nz~>8}xo _~۲.w^e>NR~WVgo^I5#| ~"N=};iMr00H.B&"+﨡2饉!e҈J1VRʊ\!2RJsL2SC,44T343TS/*SM1 #)j3136tP*OB$4O>-ATtL6%uN3]3Q1L1M NN;Hbd [$]k1FLna=bIsi?h)&纬~1a%+MmͨQ7u1k5#K4J^PVx;ߪMOpa*ib -W) 1x8VCyd5xd5Q^YaV9dKd_yed}yPy~9硏f1m^Zgi碕ƺ婵ֺ枣~Z찗IЉ8ьiT{K4&1@bP/dO?-yhAeqǕaap0\z"Ca6a8q*b]LE>F'eA>IvPs$&ԈE%e4zI->ofdcrĖ?|2jepx L#ހ? Zff)#H3Pf ,F `', H Z0XM Ѓ(TY1WCL1 {LyBhu)Lг`<1'>t oLZ0E a@Xи#s`( 9oc#1:bDw&75KF!;02Є2.6qyk2xa8x&:Ql#1vbtoȁ烚eB&zo ?XĀbRe33Lh~Ϥf5KjCHF6}G_қx'ds\f2řMfӝ2{n&ә6ǙpRs'5:i: g=kF4ܴ'(N>t(F9{3&GˎrlAaѤ.(?9Q6i3M}Z2'F9Ӄ-]gMӏns'EMPa+&NUp}-1$ID1HC&f]1?1@FMC0 BFM8.@&0Q19-6Q0&X@RV+ѲFKNv ohHZI`0@H[fBn LĖ\DX 3 m]DqKٶt]&I0"r4@ hny{^Nt=z^o}+_Wo~^Wӥo|L 6/&]:,6[aM\ADOГaXk⟎`0 Ob-&ACd @h][%@o̢ Рahͱ$ccYƒ-leuraT$hB0Q8PՌVI  #zҫ}Ot﷟={{ꉟ߫e/_~{{7w||p݅w_{19lֶu>z9~ŒdɄL@\@l@Ѣ-.- |@ t @ @hIA`TtAAtAA,܏00—KL'ӛ)?lh -*(X24éPCeX6|CZR5e5ڄ7\$5\PH2dC=C9\ubúCzC=DGlE҄DH+K8ATP0eQEPC MPŻUDXLPY8E=܄HDTECE``FeEUa]WWTdTd܄f,fkFlc|Fon[-TZ>ZQ< J?uʯ}[=׻2 =ePUEMeMTPOeDÝvEA^_ TF%Yu۪ͪ-۲Nʐv[#fԵ%bQ=ӴCEKL\Mv_,}MȵC LCtH}X_s5VmOct?vodU܅-EVބW-t-odIv] dLE]]OOF%^aHܑTe;~P[FEe-ҍߍZ L}Y5E:+V>݂%=a腹셲fp6`1`1YoffnvӺ]eYc@ YYK:Nh n ˆ0vh a@>-M(^[!Sb=i YmEtE:dc5ImLgTΜeѭe^Z-J^5dUUjW Whdw% ^X tdW&k&eC^λjt~ meaU_H_-EUHT>N<^ ٸeeXQ&JP?S2JJ8\Y^m6v0m^8apssFgFh^0afl}X,?h8g͢a~nh&bvh6h3N Ⴆa>[foto Fb&FYDI?L^fH]Tc6ٍSET}Ӊ!2FF-ح^͵TE-A_NE EhPM ]2]UT6\>+b* >ӎ^`^xmnss1v>^ss8mzgSܫ BK@maI8Ź hH-2o +h7嫆h>~[_^SoZbWo.onhA{"%a*v&ls4#S"ӞNHXgEuޝ%=]QVkHwj]qI~=fx?iuVp$rreN,_AVn_m7"5HCU|P8nW̐7lNK?4ftfmF ӎH6gtbPyv +n;nj@n#u(M؄؄2X2X2h{2(JXVZ unvUg. Vdpn8oX_va&__ewaF vm[H-ϖEx5-Ԥa [H Pp8LU?&~󭝘-ePVD}d;frUjeU~kUxٕoe!ݩ.gHCwTTdž;F_X T1P@-X(59,IAM CYTHC*(@T,Th*Bj͙ˢ!\,ZM8y.3@*_BR%”,MXPћ*-zV^e}8-a*)մ/h!v#M4x0ՃVOcbܬg4+ ( OѢS0q$ ^M<CtRɲ]V ez2*S#f}l^oz+f1ˠq_&==w>nW P,T"LdwRvSkqq p|7J+7*]h0K*u|D4S5TH,&!!JA* 45R(:ڸN;XLC+YI-:md A?&ҒE1v#C^hXZfFJ&mLgJ /nR bHi.ĢBTBuT(ltA8PES-5`J4%%ӈ~SvPgEQAU>*RHVRH-J-W&kȮOMs 1]ĐFJa&fː 1d2I q\˨> >Z4@p[xr+r<P&t-3qiq=VrܵgpaQ VrQKA$@3}%!KX0+\$BP;m8`j!䑐=C+yyp*9&Ast$8xaxG fp8&qi#(Ix8*%އx9b:SE"Kb{@)ъT"JvfUPYKLєS:*P?G9JF:VYՂ}i1"2,>ʈ,Xf\`^zaĐ`X&8Iࠒkx3FGMb3``6E5Kpƿ2Z9[008 )@2b5ρDW(ĜL6 aq0¦Ip$`]`XLta8!hALU@pxNGHF2fK321PD0G}gf 4HQT?v6ڭE\((>O3 .j!!d}w wH -0?Ac(X4tC*l5>BCh8ւLdQFT) C@`J{@lH$MH^ *63. Y ϩgZ.Q[yC=U !" 3!OEKYO&zrCTT91DI*zPA@dh:}Kpb~R{49I 74(Il*CL!,4OQ[ri'}z&*F^4Gwy^T&xƌlZ0mQ/L:#x[ObmʀiK0_Y_ !|0j(?1--HTDѐ h,;fjy(6Ʈj`ߠvUKL;KoRȁ'@V!@{PkbX6f4٠RJpf&N55"5G`&cF)N+oዄzRId% ''}Go$=iΚ/=\%ۨ0M,e KΠFHDD\JCƑh QЇeJtN_v1P C/H/"!C6!2a!1H-D^EaOٝ];̃Ֆ$@H>|'_Ho \ZhB4 HFRL2$_Eф L̃Y0tZȌNTVbHģk,M$G[$òACڋ"Pd-&ͯM肂ؖO\!<@=Gp0; C IVPEfqxiS7ꠟu~qSvW_-|Hܟ{Y Å *Jd2Aj~(-\h`XDYΤ 9&8mIHǧ ҇ELBK "ا&Eɋ,$ //H!>.VeVR%/ $0B0Fم&ŷ&AEڅ&;іK]}|'%q||znn~lUdҎ9J4(ޣH,ū?+_yh|W*1 1kͻZ,A/!J’U AD ۰$8T̨O4OMn)OD Debj0 0`,p`,0>ϓ$2%ZEP Hnmic`B =K!S| Py2-&j`QGÀㅪʆPpȠdGT 1eL˓8A&@=) VPkL V rL tH/߀NSn55N\16) 2hv+~u.I{Y(~]d?JN/352G|&X͡| NlE\@Jᣊ -S&PLR\ha,<\LMG.:3EP]tJ8ةZip׊" T:J:ׇJ.|\ohG HzCqHx k:.Nvͳ/Dfs1 I{$323!QdS\+m]/F,܏;2 [\DDI}1FhI+ \?#4> rx`Ρ\R VAh\r[M\.Q DJxct1D|~+ W*t%­Ǐ$$@ (Ki֊ &D10@ٲp6ʢlx:-MѰ*q\%p6:sRcXT.;wHJ0d`S;5(^2ItjW'-O4~}w >u_nٍ6`|4}'0 s/P;$|Qt||ʽsi 3l+XGSJ.W'W\ZC\؛-.Q> o:s.6sH? XǀJ]'Kq68wmPU3qoy+Ҹ̸i<4C.ܪ8`1WMAfKaXu3-r%Ӻù|rۆI.X; M? в>{C5[I/Q'-MrB\|䃛f\FY67^X/[*wm ZVmK6^]\s,pa Nq{Ņ]Xs}|__mh=1P 1АDxcVuya}>(~xձUx^1D^{1?>}|1g?>ǁe_y>{D`xv3 Z0,@ .$ |' ! KB 00 ]hP}?Quf80<qp&yk/{݋_W=4o>b)4 :U@.sǬju+EC ٕXGb4~L Yr񲖱Ǹx K$X} a"#GO ZQ@> V'?IPRr|,YҐ& JHZ$;iIVAd.EyKO>l2IAF40Urތ%' IF$0 Ff$NcV2Oy(6R8B$`'71s$`218-t-e< t֣"i)MR0۞*l>SJa jU8UQ:Ԑt.#IeSv t3WӘgYuR|)HҴ5[5)YST5i)/WUxbm:R5.2\ TԪtlTu {͢uh+}HVj,j[rzŭ)'բV_M-]C_-6q.IՖ*թOo[Tͦv(uTU۵YjU;[\ݫÔ[T~/cT ƇqEYJ 3>JrE5sR'lh=uavʻ+ĄѱåE1*JO|vdXUdUƅ-T|WЍMc~*1q?]97'V&SkKlJA]Sbc٭eψ-]~ 9g98ΰ۬ 5z&/bGGa$ftKj\~>\u.(N3|%KCjY0F9":qV[ͬgU3.Wm9Gռ83k=:vYidm b4!hiA`Ҍp!͝k&aǬc 액S<Z6M;ZRל}7D)Si3˳>r馒F4S46޴rM5:6+9~5*fSvѣr'< }-5otS"\;^U]:vqUl b#ā{. 7Ǿkdx6:ĥrYjǖ8zy,_ }:K6j3>`p=ln }a,wխG]yVyz!x;}ߝdv0?ey_{4穮wMK\l ߊT0N<6/N20̲k K/Zmպ JRD-bUP+3(**+8&ے`J# OadEle#34qԊQJ$p?,N`42֑N>ǹ~MǚN|r,ۆٚEҎf+f 9g d,jPL) M.Wri0 B Z CIτ [˾*<$ҌQ̠/a(++SG Je3p¾p@ 5. (S؜/R>{ R<10q3OU [rW ͤEE_(7SpL-nB墰7/Ts&B -`G6k!戎$2OHS ,=,B<tvzȌ0Ϗϖ3=mPQ4'1/H|/ E3D 3&NtA,mф2:1km2eRrժ-qO 2 &E_5dQ S(S2DJ+ê2);/2G:cP-G5̬  OE-H%š4TPU p֍3l*cR >ENSed ~a`e@/peb~lNrj}RtvR.NeZEY*b?Sac1 tsXo61'AkJ!/S`R1t!M(H!j,ib,TjOan'u; ӄK c_vmo@Tn2v* rsxo٬- }-uY02d4=lҢQ@!z%y K&e1 Ұ` Twt`a V!Vspdg=y!pǮH׋v7a4ԪjjDwnn/*,/n(S.ЄRe֌*U#-.L˄S/j#0#Q {Ac36V ?`3!Icv|r`Z_ V WVV`MvGgkcّ `!A !Y/0SLO |`2`5 yUA ``SX{{F٢Sӊ=czW1a lac`Lr b6Zl9vv6,`yya J16q`bWYj B`zr Û58s!`)]jv+AYJXhs20ea o/’̢9R3q2 TZEr72&{>-).0gs_2E"B0͂ѱ*L:b ^wvEx%"_kr*`7,vAAhsV\2!z`y[AۄMx:a:z 6[rZ#jAa=;@[AaՀl3[Lhy 0"Ďٳ ۹}mh[jj2śM8wy{.@e۠۰mj;b;{6: 744S\۫ÊMԧ/PT 7WBs.Unh1nu:cIL$k* IIre @7mT|#c- =mM ǚBd!@#L!- !"'HB%&bIOvWbWۼhCAC 3kٳe AA{;Y@gŖ i{?h|066Zv!a3,7A :!;]՝vyf ӱЭ7k{5C|b&TM'Y`<}A"QPK]*-?g"CCt$2B >B%4)Hb"DQG]Fn<,$U]G}$n^]$f^EDK~C/b]bMbAh>wkUO=՜,>I\}#HݧvњIq 4A38㭿).=Vr6( 9\9eZ$WvSY'}ʱ!k?7A6KfCAOi[%KNt6L3N(Mi!?glEםY;8fQ߻ae#lz%6lm=b7jC;W_v7sYٽf?m Ɉ&pY2.єc`}ՃVO߾hSFuɐ-+92D<ƌKhj4O%ˌ,nԨdŗBV)seŕ+(S"sZt:ԙOY]icҥ=s1*E;?HmN^-b6Ŕp׫UUoW`o X(ә/ogI˺+W}#5(b@#i&$TF$4{)ZcSAɕr 'Aۣ%; UMf/Lj"*3=E&2,}p4“FL_ 5Z ݵE"TI>ZXo7SF)D RM"`#=l =Y@@ą)1AxJ=R=DQ>[](MS%H, `đ =EK-JXx}wHաMDDBgyJrO{HWPA(iHOS4GVVXz~^VGA5raeE^OzM%{^JJQ6[AjEra;"e$DBtNT[%SeUSk)>>6 idp o% 1d2I &SF%8O-F#Lд34(S\#'](Q6S9= 1-C8TO$9@4P=ѲC PVL>M)tvsIcYRq2MJV79Dް`>+G36M>+ VD#. r3Qz QO\#C23J'`=UgakNM*S,puO*FQbVUթj}^)*Pfj[MEVe J#)p/H9 BeF&]"Z򱬘o{Rjd0 W{ `R%tPgEj*c%B*T+.M q.Èڀ"oMp6CTXҀ1ellY/|OTe iMPJ31xvj|ʞY!. ECV-S`=a)HtW~(-s%+O,'zFT3.E|6%ZmW4$A2^Xr,2]WJhָ&,BkϚ4:i>0 (?E}e1'D8)<\%EEO:]腢:3L{q#:zeK_L)e!c16QXpvTာ8㰰zk%"BMFQwE2{1 ^"4DA u. ѵS%0&-s__%I~껌X>L2*XݎDc CUN-E] }e mhÕEխ/&E[8fEpZN}BZs!\hKBؕMхDdyݛ޶djigw_mki6tz-$ʹ>rL̒z?=PC4Jy:Tb8kcPyeׂĮWh!} slosA6gڡɗchw|`WxAȍFuF;pE~j{y]?tj Vڳf2\CNDVNyq^"ޒVAW|r*}a`jvIǀJw\.UjφU/*0TbPCɀmoxLG1#nX`fDӳ]YR6 tLQ}Rc=~E]e.#*+r){>DRTjHD5=C&.6Gvw>Q,>Q57xo!!,|FfWGDXGԂz(wA 1.ճ>ir^=6?8>ujڧl 䆱zbVUgESOuA_MVXh2+;W_RRsh]%{ tl/D 0S0b mx>HUR% nXu&t2<ӣ)ssZp{j&7. ƂVlpjC+w)j0HFtALAg!_Ej51rj$:אg(weQV.Ձrae*ד*,,A``A~M=AAiH:9\̵ec#Qp'džątKI6WdXzs1e#yjn7s+-$tJsXu'_@Swmt>1Q8 9۶A)?DS12,=5Z!|\g[)5RyBUkPY@sQ/ddirylhCue$sfw.cfeF_0y`@UY/hX}5O?)=a\S>>hhzdCsE`Lklv8ww.2zOg$h8?ӧ~!GH'ohroƈe=g_RkZFYwF9Ǜ⇭y$.`H 0 gKbזgQADF hhp/&Hj]Lǂh=WTz^ H|V jJ}%\b!cOgjY'f[i?OQ~G PJ?ٹ굒xq}s+]|ZzU,v,E<&%jXw USƉWr$?n%~Hh* pqhղwvS!weX^v[a.6AQD&7p 3EnD1&Eˠx8x:0J劮ꪮ溮0犮:CJگ%z* Wn{ { {  $*۱;+; ( &k1!; k6k ˱9˳$?k*۳=K[;BpD/C*@D1Wyp"|iBfDġ@Ue/jkf[Dfye?nmr TqypqDmKw;{۶bv;[{۹6=5,̱wK蘓 Pyn8bC0 kkU Etċʛ̋+1ͻ/+ԛkF_=zt[컾۾\;K[ž^!{ A 4;;z˾l1H̾E!'L%<L)|-L!&9 (*CB79R& ۊnJ1WD`U [Ł_AbʰvDjLŀ[F1ndc\jlig g,xll/ǻQŀӑk΃!bʠ.Ac!-ʠɣl@ʧ,1ڒ01[+|˶Ëad0 ʮ\<blڲӌN2ȼpʩrѬAę,\Aʢ|\.S <<ʫl m\+, -<ެїIQ i#>1 0+un 0){j\˻Lj,KuB [;{Լ\J ACQi(=/~vdfeijhzSic$`Rg;wLxu ~}Ht'es֋X+ْkXZL*tf}sSw%D"Wɔulٷۖ-T1CFl8x8ڧGXib{D o|m],m|C]Dj\|Ȅ}le_Y?%u߽h<1ʰ/h(𶗕f[ٓuFX0 >*LZ0 ªJ-2Yڏ1bm[Fk8e#5Vc]s?!Tjz87 CkUv3v +p0`80 <Px7= 7cN{a<އNm耼ݸ<ˏOmN1(a.=bCv9h=X1&l6|flk`ذW)>O: \尝d\ڨv̾*X.~Rj~ݮ9rE}_n_n_hʹFb0pIp 0t>v! +`ҁUvbkʪ] Riݵ  / EͼM R༖gmYv> OdJE-W]g8\ڿbPesvZŗXhᅴv2vnF,;w8oG ^k08nΈ )lDhb2/1T0TjЃ u O 0QFYk#Hp? c0@̟ƟMTmޚ^nގk.L[- A* S~k)w%hW`} 0S&q_=hJ8qz&øHM`Gd…4WfLhƚ,YPҔ\{TJ!^9ӣ‚DJJ@)tذڡ*Jۄ65ܧ+2ͽO?fzXaEN 8,Š}-63f9˺M#g{iڸưbT+bbA,FIi.֤FxԿ[\XL1I1Vx]}EL,8ˆjzMPJX[(;JYP&.Pf $bc0:NPYBe$P D3|<01Q=e:06 T74h4'D"3BCj. R,I( 0z ($y$l/&Qkni!#<&L("j%Č҉Ik*A m,1jdDZ/@K(J 9iZMKӴl#ꣶ$˫$j.RI*P[S(O1#P I4D- 72 ގKC;θE"ٶHVa`L0Y4jZ4RC L/?CPh0SƾX.[ )e QdG\pE! AAqB=DqE1_xAUVztdʤT*bEȋ2N3tzƒ R_GI?rʩP2h3z3& IR:2+0xsӶ&R(hPMNU̵>G rdŧ٬(.q5YM̌ 5'"(ZTR'ȍQﵤ 8W&ԲJz'Ab_C? ,9fX!]Ȁ `\X6A)YXA@h&x^% Pْ J/oԜ;agұh!J,6!8FQq%KkojJ&LyĈ[>'-\<` OQDi US<4%V Tmq;Q2Eva!K$,Cc)1{f2PSDN!a]n煁v @t[?+k7ŮA*_)jA")}8&qIH+o H(”dιV. Iq*Ea+15'a[A_)1]3:d6L:EQ|ÐܩNNG3Gj*^N844(3AEDuJS%/ ja"h vӔ@'"mq+/F,\sty,%I)A!'CՂIqH0r].D!>꧑'ɉ2 _*֩RndW.2$Ff h• b?o+M-D08Uo d5 qH 3l|eE# ő&A D * g-Xb-82΢3m^ЎoHB`4aIx6Z)lD8xv:d22&# FAљDFtޭnȘR(5Pok1 =%52 5 12P؉+ޭ2wJ.,{+GU-ד;q{%ET~۸hdXyχݹTis{F0P XQ #04q== ;❍ȍȄi53H/0LuAa{I᳑9`Ҙ 3d6&Đ QI2DҎeS#rb'V{񒻨0z H;ᢻZ+h@󎻛+ :MБGj '`u7`eӇ*e{8ЇecP!=0k!\7I-h`[6c-K S42~}rSZ0}XM@ۅ \H~1Ba.xrcKĝh`O{}؅`--~➋8** @@ȄLHh7hx$caQY&di=3:l;r̬3Pr,@<ؠQKa-X3A.:C61 1ᧇ 1 hdА٠هQcW+ гh!U<0}S.þc x& bۨl{[2[ES" z@Pp=u3].˜ж*/Iʼn%BS \5hȵZwT{@*t(a-~ZfRHԵҵ3DP!Ԣ$CA`4Fx2X6*5vO80P;JTġm #|,4NJ8 Kd`1IsM *8kPh]P8& :# Pc,oj,ƚ&à"4lӰ3Aɜ=  JE4YшԐ8.H)Sǥs$1q]^| Rx[X#H3;Y+A]cL}P ~+원JhH 3cX)4>4~ %ESJ Y)5[#F,EӇHHpS4 E0vdz <]kyɩό`sMROa5H5,uM3&Qdj&,צ{,З <Ͳgu ] %PQ$) #ʽ GYr{҇ =4L7D˷Аe>Q;gT5ӇzwҺ`wUtB3NpsZf9-hY)8xB7sezȫ3Nz/z``=*b6k{,cXN=yދHZ_.@UnkKa%Mmh8K8H̵E)$<Ϛ|39W* AoA&: qP9˲ eBޘUQU+i0gb7Y- 6C*"Ph] Dz ai q"׆""`T78^20(Ex>pr')2l?#-+J٧;2-Z*э@TfOȾI+SVҴ S(᧚M󺧍! ޮyx28X瞅V=N[Xc~F5;ʚ舨}Pt0|:6/ڠyadAdc=% <3 ]?ˬk:]Lj7;]4 x< yB5>T<N^M.}(ک9^/':(%2. *LZhр2a4Adkk $42;bk$W2 [fۓ{ 祌BԪզk (Rqz5/ۢYy"YQGJmd.b*rpWu:]D nE^r3|FWƚ-S OJL#K`Ԫ0RR. ġ *{((OWrse`<eq: ,ܯ;/w݉nƣ%;.!K<Jy")a=љ"Dl94#-i<bu ۶ {nn'g=wmqtvÍ?舩-Z$Cڬs>4W/Q1 eҒ'ԷΓAVh\\yTjN*s4ר< *ZD{)VFTҕWֵYRͤIgIӯՒki<Ҹq^%lWmj[Ridb}د6)^8嬖CU)g¿umn-e˸[ʥ蝔>2na'W&)iq~C| * =(CL&i~ _QQp"L A4001b(E #&ʄ(l2pq2L$:LTA&jBF9y$E8В(MdFQ"UL^>ʕ_~d}GO(FlPFN6d^NSRPcUVi2F1OvSO'^q9U[]gGpPq{śy$)WvLORm4*t%ZIYtn:,ZmQ58Yjz'eriUEXVum9U!rӨۤ>)]|=kl|݇JȄ>bLD`@ 01Q {lAфd">)s -K Oj2t (a$&.˜ pąaI2':}$Fgv$9$Di&@idfeJGEgx i'naxo MqNO*$eh8;]&-2,+Lrm4mXEtweI<'Zd]Չ7uo6z^4ܭ-ܙhb!fVᖆ) *}V5^ں黛{wJ|R| |P)z~da&dpAA "$! A< >3P$ 9C"iF8"b"Q^Ol"T1d#aْ IRD B MR\h VT^V OsKO1L\>íB\!cu^0yS6D)^ E&^;T2MJ<\d!XёrscZψN;]tIP'\"x9r{sʁ[]UEF`4 oLSSμHӬ>xaX\&V8@Pqr'-6QF(IL$I 4Lb;SHz#ړ HУMBbCϸP#Vj`֨VJ-Mar |Ї\FNId$Q6)򕩒\)ze7E椞oILE==+3$ -5IcD!Uw0t9!ʳӡt- tEc[=63X0#p5]7{*9D[A^I ,_*PFV1#39+w$9'MJYd&*$ $tUHe!lBf4l H1z͸BbExhDNI!d&p!CDr )I8Mz$`X})>ݩLda:[Wd)j vl6Ct 9)Mb [3*" ~#S ˪6`P/Ґq{"S1w,;گXcаiQj9;-{;z"*c;rfDeAQ׊-O3`u}֌N (?eBM,u(zGrwSIԶ0eG@"!B!FBS&ЦTya@$r;5ZQ"FETk(jB)4=VKP)0wXRd|>c@3l-lwimILbn$vg"|;#L+Pl %uFY $ؚ(n`qNvbuf*ީ[ӜHVXþ=I8kYCsR,؉xfaؠw[Qjr/֙?([@{,)$Ճz Id5椈m^RMl/Hܾ");"ͬ-J7Y5)YHg;=Nɋ) S@#W@AÄ SÅaOaf`!߲%f) wFD\Od3:9~o[UF__bspZ<&{Ϲ'C6&}ZEVYIPPn`֞1h$Zh(hb`2hB&A(Z|LŔ,Cƈ Eɒ ׀CݬI ਗ਼CmCmD=y8 CTMX}!m\U\G [HJ,ZM$LÓDLKŅMUMu@ϵRґ Va\oI\l^SQIVsM 8ʦtIE؋|XMǓeT A.3mD!X9jULk M`->0LVEQDp=D)ޑ `] w݉㫥) 6E}Iĉ\|Ǖ䭄PT_ N ]T՟b4dOWuLG+ (Em\Zj޾,$FƒTUI\&5 "KdH1F_}(rT!\ٵ"lP!c՟1]ͅ řưzOJ OG @7}S4&Hq 6œnQa Nb#={Y9fZefX ׮Qf=( E*^JE%!l$ε͕&lmopfoqq&loFq'pVo2tbgr.'wvRgxb'rfyvtn'w'=y$d'z*總r}gz>UB^%uTS*QVx|Jh=24#T^2LMPc&LND Qc99ԅW>Mf#e h`&N@SL!JO5%NZ ǁ& cMpEVfAC֏ ^QD ĦLQI^n(橂tJܩjd^0iC>&#G:˝XI%H}V~>4塆NJ=Z4MLBL,G!|ɗh:֠JĘ4T܍#^X]TZTPx0HV\N\UQ]XfXV|߇dFN^2V]M#%ZPTQˤ,"P5V|&,|l*,ĂG+dY&eJ~ 98½*hi*(2^k3 YI0n aN(>ЪE*EШ8zWhʚFGhD0߰MbLN[}J@["KΣDXJrl{~UA~G(V| ŽMGI*8i1|| cW@ҞR9Vx# vĐ`2FБ7N=T˝eIbhzb#&B"U DM끤#DT@n Dd(遌ߘFp6͝NlNv a>"Q <(i6N~dd@kA֡(*PɠanJ}a~)ϤBh98JFhr}kE&F`QIH[ELL^n&ގ"b,LfۚOƥMXE c.!#24P8r/ &}Jdea"tmc BS>*7a;-ɰI]=V=@Z*cI1v&٠ОwXN[0뚤H l_%N\ߠ% p_Y.\IN-LN Bid^An$pQ2NF#;lݐDS85ZI1*\\YUL&d( =&I,P<rۡv(-.WxtI&١>*v@rG ZHUI+g^ B+zUؔW:~M8L"`"LyH9h>tS7N *mnOn(Dsp2{tSH فht׋l oX!~%u408D(qCulmea_@FM̃n ~"l)<Ȁ# N*N>0ۘ䃤?q\ͅ2Y5Q*zb;fϯx>b=MŁi8X~ަDx]Qe!Ffb-M^n8(<@ӷl_L#޾eL(M8# dJf_I'QLp_4}*SF,SI1.S}^4@-JY8@!]F,0e*8U*GM>qlkTe:n6*(bz7]pwŪ߳u;U1bĐS$ փVp2bQ0.m@yz .qF"’1Nf[0ݙe3l&a1oJ++G׾{6PiZͺhI֡S zв*!h|8%!?|;Lb'$Cs52]x.6Ӭ5 d9C (* 1!蠖#}4QF88!HòS¯ߒ&4bح}|: $HrȊ;K+PLJk04*bEXF+2G ER q/ 4TLSCoH(z kEp:Yy8z=7eyX YbC-6o>(g }$0#T e-$h5Yz{h墀ŏ "ajH>ҔHF :QrUrfzXX'1.nKXf)=Ĭirm49*)2e)" +Z,J+O,HUNq8ͫNr 0(h h.f]hS-F汽N'5aࡓڏ}4sh}QX1~JTT._]e `߫$x1X'ؖ '!I.%q}C I(c)R]Ӕ3;e6;bf8XHxn#Ӡ0 e!Mz>4$$16J32M h8QTntK7LdsT˜J.Hq\rXN2ZL]F*4B/" `HHǫ LMndH()KrP< ָ a,h,"LnJi7iZ>ڼp )IV=^euBs`6Цȣ;)/@A:`yA\1FؑiAU'# 4z5,aIdDۺM?QC̀Z,8ʁH"_BHnFd7SFb#oŚӔ-84A M@Cq>JS\`"F,ZcFh\)e8v~iaSX&48,dN4Hv)f 3hqɫȫ9 @=F3Caw؞2H)Z:,ʙG RʦE:%a:߄&~mf)gGԳtjS=ҫY:RI1ew%a9-aIr!tEo!:V6$h"AG`%bKIDp"(5Kä3…/jǹXʘ:o'%UC$Je%Gco}Bwj *u6+QEص '͠ƕ @2KxDS%LLHóeeSѼ8Fԙr:5GFv͇*gyx؅K>LXlh5WTjtpG04$("lޠw^Vmyd@, "!5T[kۆU?!Pb3o欞/bVI*Tea%)@ѽ$,2lRlj4 (]oR1;BTQξY:޶CީO x r^ i„cռh5Mmu-jXjw.BB܄EDT)Y4ARALDY *mLzxG0YLOzÁA5/1 Ǟ<9>Ä;6ѳaV7B!js 浃}6 t9yed#D4d IMEhI}UjXm8ͦ&J.R4SBg*шR,GsRƈBtB4p%ZHvmg`(G@."_VU|$CD ;>m[BWc4b3& G`(([.P^fvނv./㴒Ld ?>H ŐKBw|kv ) HFu4`ZvC(l(jGx",B C$O"h" `l¢(*Ȫ .tt.'~ʌLFQqCr6줢dKU&" vhVi, ,}a xbuΊ7ش GCEg(kQHgSh @;~J=6"`rW/'s $^dtVJ3F&f+S.w&#]$>݆23(Q'(B)q|3/3v7Ct 6FDS! BjX#1,-WEQcH<b%p@BI x3*>Fאh> -SrBo&)Ӧ:ӌtM_Ѩ,cOM+'hT )Äf¤,)r~D UT(,DnjF5l}Vcjq7-s"I41EU$,FU[U^)nVĵGidSyvt( D 2+JB'Fp% tЎHVĺf D^+!Rn>E:t.OsGL Q).J C.KI@ 5 4[4I#L4 p (&0B'!€Z"Y*gC ,2[8b 숥Ơneo" ||v"oD:qS)$enn@asVP&*otKzm>Ocl!{ /[W&iF=(xOr#oFƻ$L{z%VEQY{Irgiuɐ3r'It-V&s#gGm$Z],џ@` ~d;HIknX( Wu!Q! `2B$!N&)`s)'+t`@ d ,޵)t@67+D8tPuȆqBߕbBuSB[#aHQ4μQ9/_9rtw_䠪lEfbKQa.6E/BW'q ]|=T=W 9R}UU9; 3j2/;UDQvP*70[!5&9c@$CX"ꁣ&,IĀi Nq x)adM)dPsft"RP))nr@AAASP fᢜb2P`-g'i" 34j/x ISvhʰXW'a 6P'TTՀ* "Ȓ/s362NWF62H4Ui/mwІ7*`Xd`$jZ%cfҦl$mrnKÖ{gt"o&$*!:p*cĀe2 +iCDo_N)ۭɢ`QYͣ!x!YeYKWCf&nŐDRKqRs's#)k2(hq>0(-8SEc]m2K;K$Q;{{{O&+;[۽TNù;{; HhNHHqdgo#Syt=4< V 8 AJ%FJWoPjk/<$–y1b l)vBoD etg,b N++be"6(D6qd&Pռ/o!hm`5 Fzb%ol<]-ۼ@ͣUU", UȠU(]%Bdyh +RA4i|iLiF$vk-b:%`r&h£Zĕ3w؞8Y9!U,Ι]IׂɁQd؞h8b8hX}ՂEW)"Au%>P m3lH|g!Zi+Ghf8[G=cU4C25$,c䯌XQ7c4cg4ZB`_!8i~g>m !Duyew>{^齱w~뵾>Q6z:IiVtBA˖M2<*e)Hʤ.ٴ^ҩXRb4}0괈^̺z,EF/ "`3Z^E+b&|'&&P4E#FFh(Ӝ)ѤK>4OeeB`qJpe{.,×'ƻXˋvoPWэJ\Aͼzx&zpDc$vP[\WF&^;G_{^htag6{4c%ӃtjI@`F`j \UG`P G֐AQ~Ԁ@F`[fDQ^uMQ'jdFAz$c꧓kI&i8O@.!N?y$S砎ua]E(^j~m%X uFYT:$؇QĨ`~A=VdU Yb|$h >2e2I 2bI2?yf\8tƹGLy}C(قݹhݺת2 qX{Н+ ֓[4X0w5*Zn#se*)Z>i|$(2i /˜$.-&Xd]YgbA ( i#kk>Ֆ\mxܱ;+2ʋn{"nuV5<-'x.wG {)?+y ^⦀ѹZ{-WzOQ)lȰ>^ww<;!Ѭe-Ib5x(qcO. j4Gz`d p#Q['p,*p"%Bm4ïh ~],58 )K%s]#J#8G(j $ޠ?>Kk2 I`%óKz‘w*q3;$o8ZxʫGnm IO@D,1 "1l{7ۀJH(R \2C"Y2rOrH1YԇK,MBX,E-x AB-* eJs@Kɒ9l^>a1# :%09rd-֣yl1JMQF аL Mw4@6[ םL jHE-zQVThF7Q5@ %GCzҔ~ iIYҕ,)I+!$Gsi" HiAVIYίALRS9NC*]ddI\Io&{'[͸fP4j'\^5S/f^j $ r{d/DU,?%N),摗Ԭ1\ѯ#i^y02Ȅ2Uèdj|ٯF< Su_9Owni)7we(~ ׺ڵpppvTQ$+6΋qʫz%ƃ)1,pXX`rJ&;91r-Qk{6;}$Vx[jJswꤍ&{E*7)A|+UȖ)\y9nN bʤ_!tL,# bQ'Y^vyBpB!3ι=khA]ŻzMI R_SD!{> ze2P$cAy'ɗ0曦NWʋ"PXIq Һ]o_wW[;dC*=Xf4B +K&?CACQhYVhD B3k hR $ƈŊ*] LTwiw|s;)wV~gk13C>_G>hl-&kN+#-UZ972E,"s2h9==0FGj ԡ/v;j]k0w]%;wp"-1y7;PdbA j^F \ZwفF xGӚ(0 ppqJ³ z.-Xʦa.ʌpSr {9fT)>5D4ϩ h0 G@1l:\p -ۥHB3cJFc1H)3MU&B2A SAkօl @ztwUa%bv$P`kx:`?K9 :NrN~q!)#+pg'QR0d9u88 P'Ӟ5ivhQ7`/xo- ZF/*H;P{Iت [ A)=>Is\pA1"ppjS9: X(=U5vTMe!Yk1 0,P-8oPzAɪ0vFAd % *usq{ r$*P/b."!t`[F{cpt@"<dha 0g[s 0\0{{tl.1 yJ|AhKf9 !ѸV` c3ti$0k+m%#SpL_!,ϹIU;LǴD _2bCQE8|;V1IY@䝲P;ZBO2Q Ϣzjڠ01; q i+ .2Ԕ$J ap/;5z/hq.z6ݖo¦/z/09`p©ib2l{S|DY>Sr%Ӿ+m 0] ?_8?+6 \p,+0  MJuErC3;Fb1mQ6΅U1U`B=ެX ݲuzqى&jVb5#G+CemVxDD% @Zl2B8^1,i`,X$}2p K ?Q2ДJwl8[ @ n@ 1j0Պxq b^(LyJ>sp ?j\0 ! I34 ̑ؾZ[ B܍@]59Cj 0-Q5rcDJ>(*o>3EF-NNpu{mÛJbD$KGޥ\`4visÍJǎsY?ў[Md99)H@* ߝ D![-X@Z.@ ApǸG~q~8.FfqYqTM0͕[<=hE"Ѳ@˲=3 p;W ASn١:t&23wbv"=gQlݲӛma.lYK*`k'F&ѐLR(x :~%)w!z-M;F }IF U)nQȘ-`]SypgÓ - .afyli\RԢyY/g*hytqC~veg@XhN_89䜕b@?[mMN`*)ü ŌQ̡``V.9>"wlĀQ[(ZCE bY9+ TdBFAWS[Dy>.%`#?y"SFvTb CѐLIE @i"L}[ a4@-PPB)p%qĒ!K.sXlbœ5LIld̕(?vĩ2MD9ԥšTfBPOՃVoPeڗPUT2O!hWՊj4fjvE9Fұp e&^d,6 (՛,5 G} {#Mtm%ɎMue_'C[8lz˪2 ֓>w ȑsѥO^N=̝c'_.ϧO)ZvB6֢-?-ү+.(cHª"+0m1"+ I ze!&L$9`MH4RH )ڈQڀjQ4Zul@˝ zSQLK#eZ kcY*kAYk=u@e& ,7We#a 7Q#MM>ɒ-PbFn* lNїBs*(\B~m(r\m h 4E;+j14QPC[[nk596U`zZ/wZ+ ,KMk7Ce#z\\JTlSPlۼ?+U%Է.9:tۙMnAhAJXh:(i+2Qyg8 mآA Ei`&BJv;QaSdڤ PSTrv}LTjDɌkSE %iPc4iwQ`KXʜ'"aG Zj@@$!4zSӝ(ARLM<{ӃՐ%jBnxFiz$A]%*5S4h (beb xr#b`DYJ X ׀.J'݊[b.OL~"#D]n1l% Qt87BUErǭE]غ2Q&tVW"5! !#B,iQDyH*z3׸Z=H*rEyi)<@"A/*fWfLGȄ&i%4|\hQ)@mXX`SM]AdA"&ٶ`mӛ0Qpjp e(͆o$%ENR[TY$xW3u+iTt_+`sL2OzrD0/ b&/qBtd"jV ^UfL!ut]_{~vk/;nGM+ h{v=wک!G]z x'^g/b*4Qߡüq&@6ki晢,ආ9 yMikd4&0Q!zGzB0} ȍ~\T.G=!H1ȪHTȯ1$;ˍHH\ȂȇDHȍȃ Hdžz)ʍ HCȊɄItIɒ OLfJ Zbc$>1JV}ƨp&⑁H-}qfQ[SA }ر\FڑA'503F)9:sz4!(#)QJy̦q<"4\x Ԍ`:at2 lÖP\\ռMLMN"4NFg* N).N4ww$z&239;ҙ E8PR}kܓ)wKRb ߡLdIٰk1(әɩ0Эr$0ݖ"e6gue|&g/k2 OJ15R?Kt[P0ч}=PႳPɱzMjd9 -ݔk̺鰩xhhd 03Vڃr4PݢQD`PGM"8,s>1ԇJ% Ѯl}АOL,QKz.#Pm^  6iݫel9G jڀ? Z8,ҺKVc1U\5 z,u)[ldm ^^ zD$.ͨha4l;@%Ԑ^(#4㍳rL*] (lϐ-K b9)POfFеKS Gd$3m*tINz e<‰*dLKGJȄ7C:nˠ➤nZ,dki\1b9k0I! :lz*P0W43֦Hz( 4(U1aNJ PNz蜑?^ڝ\kMq`X6CY'mPr3GhD n]RX 0e`iz\낑3FJoZ[bJQ +C FUɢIb/ FG/ka Tk71Ga6O4@N+ꏻ-<[Spj#۵WXbuG 'xɴUX5 1o NBdXG< ۧNuAXTC5m%*>y>] (v2]](r PyS +S}j8`0.IӠ IuS2׮ɼ03jW}ޥ}p|a-垙QGܖtbFG/ZL[l_4z(MVĸF}b21o$ɒ&O,6eʄ&>M**!@A)t(ѢF"Mtɠ "<>bE.Z/ZžN`׆Tֳ+d\N}K}ەc_-9Cm1mzмQPPˠ{L a=eu]*pYeY͚1ԟ 遚dk(eLRuIl"FZL#7 ֩_K=9ҩv]uSJީ_b,ѳwi.tH*¬ǧKTUkY=1i1İ2 $A}H?M50B46٤LDTH~ע/z7 OHdy[WeSW%yFB" 4t>[ՓXq<\h薆C$8\Z4 dpOgݷ{nyhVA#Cf5O]TLq0BzRڢhVSB%M) C9$J_ZiWTe$,ͺ+s푷_d!U-D#K&شF7pQ=uPg$  gЄ2t0j%+c){fBdV|<[@!`H_zYX=n5Q)DiX=QՇ$Yd͸Au2 f'ADFՙ,20.D!W@je`Q0(0d^ɤײGOck֯_%*e`2tT!"_JNGB)S&;e)ṛL/E]eQ\,h2aXAX!ME'7ۃb@hpduvƁD6afw MyQHN WQ#b1AŠ.Bb c2H %,1jcTJMm$3*%n[a3Ɂ5:H&*F5jD D7a+UP3 LmGi?4&1QqY.ce6J3GZ"O u%"ˀVarDX-pD МАeФl'N"7\,:hp,@ɍ#Z豅S!$I`2US0aֳ^ay ?#y]o*8(ԮH jU?EeOlq[.< [^3Ajv-+-yqA_8т,D#]2)Pb2*$Cw4EF\$Bw*& JVV#q0=hu2"ECq%,ή<$VѺPcm6(ozcI5f߼1Qx`W $K?f~h*?ȸhj\GĪ1Km |dФgE3"v1ڗY"՝]5 N'<բTr|X`NkYmY$7y:b(u^m,$WVbm*xYf!: i%0ªwgV2vFĄ@ ,hT%/1`"@# &!ζfPAʧ$qVAPRE,97 ;ACtmu+#n=.㵒&U0/oQk&I?ÇU׍V8Q~J^Ia#lL$xIm9b*H[x蔙6&&QIzqgJ"U~ H*&0N5CU[ݎ'd?NQk'obe\zu!ur~r FZYP/;v×ڨ/} 筒׉HEN@!o?ơu^k~*׃͔_nݮJfI c]K`:! Juřk<@XGXye=IRsuPpZx]^%5_D١ߊحPW[jؒ|\ DuA2P0&L@)<`HZ$ˇLP&܀eEPLTCȏ 8uԱ `!R ˹Sd{_ eQRb\Iu4D&YM΁ױ̺,K 6 ]W[q1Uc8 D @e=Y9P5ŀ~@}`]ɈflXEͽqȧH=Y ZVȟQ,A5OMe a4`\#\ZJpXsn9Y\Mz L(!E jD\ 4e$K `dba8^LE"Ⲙް9QoeHMЭMSE`VY~U{  M亍.Nga颟]FD;NHgpsD8?F,SOi?@Mh$h1 k-_BTPpAUy|ŎIjPW]o(2@cL (mBmpfCJ(xmp&nE&eR ЕؼHx$6Ϊݑ ( G::9`\凮,EfZĴ F4 Qu HH2A͙\iEi@a:J_ $EDo\CXyighHd (H (B(?Z$\hbJ՘&PefnЈ肜(z(h¨ ͎ihʨ iigI捖2<˂Ƴ8) y&BRimX)^fv)r阎Vt_,}X6-ћ:GQ2F/ W|4=ZaUpBVZ/QWIR.LYpU'bc2RF-hpj7T艀\٪lq`\d? p:ͱJ9=Fbճ.+zidZaFk2+~+(޻FM뼒:9V nZ\H+.OE05pH>!DXQD# n\IH˝ VĊ䝾Zj yS!_`S.x$A Thka,,ZUBmbR^]Bͺւmצ-N$J>i߾p9IҦ9.`Э}.%q#F W9Xꭝ%@\FATpnOeORmQR߽)ؽ!fyHr6ޜ7FJBr`](N$;ͬ*u$JPG~db:rooEF .*P:YVbT,F ;&~HtIUqݻDL&utgȠЄ A*[5*v a4%YMƊxF!{ZoXĆ^ q37J-|j]mʞfJn/+n (6h'(qq0X*e TbfXdPv SP 25%~GN>45E8 p&WhCRVRT܄Of*n*׻|#auDV`p ,ĥ֭ʈ-STqjJ`f2%6 H%y/.z./9qG#3 =64 Hprts?MlE'Qrɮr<ytyc#,ki=W&/-T"H!.> Rʫp!^e)OĵF5OR$DݵMܿQM,A{qhGx|x$VEmBFBsc\6qA FL+V-eXI_jlj>LJ0qU4@ tWzJ4'K4,$bUvVXQݺ.op5)YvM#0Iל^fdfadpTȿ.1MIme-oq6׮y G/jZ;β JsiHVvAwoFśu͈KVk nAFr2OQ.-x"'ǵ&,SNhP4H[JO"Kc冈BK447FettSdD)Rsn؏ $q?2bK.$k8m޲ON8ifdQءXqΒS-r&Cql{pBxcyTrX`mث&扳N8O32+YS̚cjMV_{9:K1b*ɀ @&$mb9 W4e/3GSo"a$Oթ4+8),_T4SŝLR:2as1M_~܇Cv(MĈAO}b2ɻ9rۄSاLh3FQExrɗ7}zy i'(7+fo.Hۊ|RIԎ%o_I&P-? (y6H!d6ͭ ,DjՀ꿹z Hl$qL3< }DK#JZ*' B.41ziL r,b,|IS ꮭ*Jm>i ˲DRGHhv-b#IT0Sb2z@c 44*BiTRuݕ^w [_QaaÞz1&(IZǎ>j-#Vqj롮K6F& ی V^ĉ&nJ6'@䗶ŏsJH@~; DY JFBMHQbFlזIP6|Ѳf1RI*cYRh#v%Đ~m.M@}|!8>}CT0ed14ڙW#**e& "<' Là v *&~Bkp_"tRTƈqn( e; 9_ X뒚Gskc.})0aodc +0CNjw!1oKSĤxqn`K~$ P@> QmT,ٔPѭ+[&&QP0[ZZ^al^bi*RZjuǍ{@ϒA,*|d.QU&1Ij l BDPȠ]PhL(k[=21Z.B խ 51UsKҮbHƆ[ݰj`ƒˀUɻz# Y! ]FsZasXe,M~e}3C&UMz,a ѬÌ0(Bbvқ暁b7WrMH;FO3M3]u;!ku| jQi0ɡe.c[ |ll!B:D#)~vѶYd jQ%\C[n{@:kp2 ԦhJb׎&E֛h0udŶT]xz07aȵ5OO5muMjKG`=4q-+&Ax9Lj%q:t5f:*_ ASn $ $N&RZEI;"# Ɛef=9({~5\ZQHn/ʘzJ\Ik瀫&$pZ'"բa lty,H\) l@(Ոu¿.NϤxQ(VIu +w'bP oڦz.!,- @!ͱ-ziKLH,Bumx$| hG"rNO ؂ x7  bB:`7@p#uR"p P چQ.PP,,2Fl#p!nE|n*ίn'zVĉ>cxJBP F$dEQv4FӴbBfh+FHG ht#z(Qр"Ҡ2 (ڡ¨bMvr@! 2h2!/!2&.kf2N."0jԈ>ſR. 7@ $!;b:< Fߊ>:2 GNĀH05qies?XD H3 >al(. @(v6CeEΉXT2jfzŖ GPO<ȭZfv$`0œb^eRT֩e$"(&2 ߖ7鯈3:U6I!6" ]N30Cbb[\LqIT1CIA61iZ@Ju@j)NS{ noԨ6ϵnHDddTP/ՠ) q?JnZdRE02&!H0ձ d4ZPlhuڮ%II]e\eJ4 :I[8& vBzcRnz .@A7A 3c{%% .nZQU% T 4|%9Y K,wxuPvr3r) 2p ]56SU>ܨBx^g-pIJK#bd=MG'&<;sǠiYqCfydZٖ5%\}pszgYۖ#HfoqqV{I ItNCu8#hcMX eub 7ٰYPp$6XFNXDC7hQ̵a&GD|(+-eMd!"&~,wdN&{4Z.>P/7LsAy{-]\]ٺ:۹ܖszx\] [6 \īc"aa:>T rnFbÉ8zLy#/ {#%S2& ybp@'4y?&[JƼqxE#$-KQ)B~|FI mP|yy%yJ]1WtNO6fR >=c;=R 47G>lX!C7B&w[Qp- 8i9o¤]#ߞ>ݟڭŽ+l m`z>(‡ 3Bܧ!CE! hq_}'54OL4M8;=e?ksѣH*]j$eʈe$)ƾPB&zMbJٳhӪ]Na¬z=V;2aFn$ȓ3M(@#IPz-;:u9)SϞCu` @>hVZ)Tb1, s$>EPF)R:AQIQK-\%eMv%HI `o ^y^ D%tLdI%hmfwRnITܟ3M'bGde\K$NXy.t痚Ax}F=&\$wۛٺsydԮFIQ{Q{ 9+J+E Lwm T]HWesb~goˠitP@ՔF&MN &G`E5UVi (Wu)wq:$rY9]B$y-rj>FP&E*7X`^!ITt ocweD+h)n^:7+ ]愲ʭVH`i*i-.r͟%H67 \]9ؖkeܕ\UFkTYˠtse*xЉu).O},KrU`M G/Fx~^煆XJF9=-;49t{ -Ԡd-:[G U؆5'~ 3L0#Hm_Y7( rYX¤BeKj׮p)Y!LWuMiJ~ \^֮:}zIC7>'~1LB>+̏2ebMXF= _MBS d ;#H6L" IE&r")IE6R M%IJVғDd&Rnr)QiVe&@JV.ҡx wpde`}<)-QB 26a$4*ZĸMne,'DK2DeʛL:vB p_Ɍ|;1 lOÈ07+;^4y:TxE ~hhTьr HG:ҎT5)IWҖ0ݨIUR4**FMmӎ)iKwӠ?EPO*TtJjSQFUUmVWԭt[>p/5cw* 2!JFrewMև-U+%WCX$2,c'+YVֱe%xhAКv{>kӺ]mka+Z4el[6mou+v>Mkc [ύn;]JWu]daMn"z`i+Q>V2h@Gl<5 u!uYF__*E(lna z)ވ{qNo2ʅƬhQh_|YL O;sT>C*!2Oj~{c*>A1lJn~g!L1%S7F',!>8x& (?Sqr|_#?C}`$l*F1K~1ʐOOʐ e43Go@MҴ ]7"5ywf=D-{52r{EphpkBe*=PG8Rhsb5LD!WWwL!'sr RwARE$G9hw(7xD1GrS~")t8ojD{Xj(ʠX0&Р'XW!Xq,AwutB'^s O#:dWqcsJD s+w&A_LfVdtXaPo#+ Xn6VWD8LQP s%@ @qa6whz!iM+Ua>@5c~9r8?rAhw&4U|QHk7WK3397+@tC3rFu)rΗAx1|9'n/1D3.%!4A/)Cy Rj(AP7}SݗƢ)pnA w7t'g})5 " )C@4+GCX=gN;'2^ftfw$v)Oz  )!20 7{ Vp &  c 2 x +}׉tX@7I1V` 1| >v"b3[ " Fwp@9!57*x z ;yB33d%(71t&>֡cJDr zC%R!{ x(Es4xg$*V(I7EnCSOWzcՂ9+`>BFfF=&cd1xN"ag9F؏uGw.!=7- >u GzG/M4j9aH|vH}B*,>0qEaryF.0 8>*N$ڀ]ڮА# \ {W  p`r'Љ@Se1C}hwWECu^sxC"HA&!G&~6CA~&:XW.< jl Q=?0p7o$ 3X<of|9TXts$ၒ|9\ ?p.?* 0w+xU:1ffjWu9 :{ 젠2p q+fBZ1a?. wۉj\p+fx19p: 7Zf,@ мȤk۶𶓫kj~;,ѫU"3A3۲v5?8Ģss +0kAךcr K6|TA&jr FX(P{b9yg < ZApƩ`#^eOƒ%֖ %21XKF(bN媒t!&8zf+f˯ˠ @WLa 8 U 4 m W\ gN] f% 1 z[f :G ɪ 튮[@*Ӌʼ2 *XSs{| : g[0 Dw@@i\d|'$cE!I"80w-{Jub8=3 &u05Y/v0ιr3}TriB)8@7|&pNԌtV3>b01lfoi$bPzLx6QQ&۱!뢄wqMlқu! W WEҤL 5ip'A, á N4``*ӟppx6:g< !/]Bmp*GV<:H-.Fr q y+ WLmcKJ*sw icb|دOivq5yt曟R7w"h477C)Ժ^a*Ô)1$E 53z6syxAAV OVfyFC؈sY> 6IWk4e("/7jka*3֚+Xk\<S-x}`jǨ脴\ D;a0N!˧JŴq@*T f > 6z. x[P ޼Nj#˹_p8U+,跟lR E {?@grrNzQgDQ3D* u3uOVԕ]ȇf/_ח#INsB@Wn$X,aGE2 ^L D [Nޛ)ߢt7+P fk -rM( h_6o ݺˤ񀉻V[ҏ g̹wl,;)m ڂ~̽Xe}.$J\:Υ{/}  [3 &jٕ7Cz)VS*vAEu$#$!;Zo(:E P%&,4.W: D}3y1`$O Ja$%(b:V1?68%rG8MoLrPّqs;*@BҿnVtPo ʶ`\qK<\߮Mp j `g,&3<j6h._,QZ bxq [\}t`P(/6I8H&'OsHrm@O}S0aAz .a= i1}uGr'rLj! jĈbǏ 4ZʡB^e 2MqYDe@54O4є&)kQLLi<Wܸ% ڇVEXbƍ?xR}W7 :uάŸK&rb`1bPG.41d-5=w;bzpޖP00Ѵ/2hp$3d~ &Npe%R|0Sϳb2sH'#6Ij(y+ZN~21,8!uE#Ȅ}2ԭ$HPzH3!+2w\ߊb; ]t|(+!=!3jHxNgSlF,!3;ȤXZDq2mɮmjwv] s&1YE[(IҔ):m)MJ.),*7'bxQŘdEyʩɫmN $&1G=uՙu G}Ji;=ӶA{=Hj'j*a{z˦]%l"P/=QЌY(JFy~(~p_I} b'< D&I8:d]HwbVױݬij0+KCIdb7Ml5_h%)&h'Q* ST!- HvVSJoX Z z$C-o|f]WXd@[]ոFDWaHgz|"`qg>Xn>bf ld|TZXma&o' :Qʚ`&KjOM ")mM'a9"wIN`%A/!&)b4g(,I9A3!|nA;ӱѣd"2(}ɽ {FcIY.;L %ag3IE~0u0&i,h|ӡ:s̙͗Q2gYi!FH Ƣd@4)J^X61lFu[-x1/cdӖ0-j(R&YZg%j'C)ͫF,ħ=*Qm'2Uɠ=`lnc 92x5KF"F2-4Ըe'CѰJfEԘw'x:h^ҳWDM2UkY^B> (np̳- L4Pƀ;c'u*DiUrp _ OIAXFf<))^4ZF]0Uc6ȟmXhqh5%WW&1VQ,@C;ʬ /A_.1J).r<&h;cZvcl\$dW)_j)$bu^Ed%s*.~GkUd_nЗe`;op*}$^f[!9tju;l.CX2P&tS^GzFVnN^fg`SM!h0n{pRTj2zPr[r_u{@8PliɐR(p  wXcy^u+.7yїs[WٳF!?vPx_.}K'm0铇:u#=_'xniHFB¡-cyx)Q mWAGW~}w?HjW712EYwZIma ??3@ˑ@s@|4  T @;@LA@@t A@ A A AA @! 2T@\A A ?%d B.Al l.l r{z0H7'\H  DA%eHba0(G$ahH$OL8EGDQ7GO\ă O(V4R[EcDJċ2ESEJňEu_$UE`E\ FG\FQFcP,N4EildFgFeF]\EdF+U e\EhFm]d\cDgtEbFfFmGV F|G{}Ga캟p2UP1UK*)j$zOp, $-9{ѿ(}Q':*݈Gӱb!\b02Ѷ7Ѝ Q/['hԴ#ͥY2%@3/%Au aʥ(* Rr" SQ"OSY1$T!ibi'R2u;-(=(`H ۋC;ΐ#99nUG<_-nVMAڒBOZq}z13& \h[XQ2f#|"CI>Pnڣstrkxnywδ{%$3QqbxR5W#G%5 qtJ #+JVs rQ1+Yct_ 2TA6d://3d4`)Q$c,r4 ndY1e)=ZN,;dn+jQF?ʦ.7ȄzxETU"L+*dZNebTtz3>(6$%`&G*5ڞWjuW 9f^1i͞IQ% ꒕ܱ)+A.,a%˩Z]ORqYaS)~vlIQn/S1.+c,$$1/Reʘ.eoaMmJ_rjen* s^.Bo^i=ia`'8)OR]1q.+פJt-.vUc,"+c&賴ZmF=5$f]*=y1+-fh^v4*ppwBUR4ߧ75zTꯝIK"q q>5Bv)Om KӳY"`@JH˒} ٿ:angۮlGf_̕5dnK'r`wfwVdSѠac~Bs"7.e*iy# $U1Pd#ȭa}WX9kR1"g ;LϘ1]s"3 %ܮ7;wm2$h} O> wp_=hEC}EXO!Bm"GOvrbʇ%RBH&V mXN < )T:I$͖FShB5՘,XXaOW^pƁJ7"̸Wçx%}9ʖW"xRHH<jhq>ISnW4b%}$݆\vf)0[ 33fuIyED<>1,#V}q}:q2LSf<1e2MBcbBñP|H&1|CD$`%%8m}vk)e=hk^iL PfyՔ^t5VA6 uVr+W*&$q3GnnS&^Pd(!n|5VJ#Lme!wjez$Ո&.iRH:%K\2d':YӚRz\1mGNKPM`m~ո[-UW(oԔ) ؤ[>n`vXL4Ԓ8G&p  sHPrTk&H>b+=xR(dXHpzz'8ՓTv&Qq6>٦Bzu7bI*$#M,JZ]Fr(^J销-|TH% ʺc~b}'<%m(i6Ϋdi*(ҽ,*8vHuWիc[rKdoƆYTqw~pAȡ6eT Z]R)A*j+"E^ʍnYqʀ>*@u!2!CԤ2e2$ic_Lr3r|oNf!;\CYd2.ն^.]iFȳ~r5,?5>w+r^Bνea>ncmRr :UdQs*=Vґ I@o6qyi%i)WcyɃdk8|2PrҰzя&xi,DIYG]q( }S Bj"uvFڻӋmewUMA l$ ʆyz,i bX!V|`7PҪӝGon)!,._[F1& * /LWԢFi,AjDt+MLIփFϙ<`$ѫ㓒Se0a Ow+o h:v[D CꕷQuƘyM/6}iRR2+g˖2E8+Tf,*o:3oa ,N /sAY*ee/Q1Ba8jm%yXq$.{аʶܯ2rҶ&KTHU6')N6U+bCDKZZJ @ Pµue+ &(TT D-JeӵSyqS є>Ỳ{iY-WȓR5Ԁ(Uxa~BXXk\XiʇDLޘyJGr\FHX )ᇩ^UՄeF{R;ݒgd DQWRWE<,ݚxdL"юya_[P]ܜ)SInI]tHzTA++b+b-,A92@li !! =_1Ǐb85|yY52 q@OĒ}mو !TJ6B,aᡦ\vxY1]^p}^XTHyaiXAd]\Q@ }A aDG t N ռbA(HOSS99 _ȕ>ْZIPRzUN itT5_#K(C4A42eY*C%B%ZeY%B-ô]@G- %ԗ,ew< #?xrSGܼ ,a68yݝS! ID_ #J [LmΘ!aGaoR)m'npVE$s:p>!`}m Rb6LDAχ' T"LI!솁+m (Gک$T$wdLiay 2LeHLeB!.%&ԅj2Bzp0jB8veـa[bĝ܆cxI~t،$X Y4Hddg =a)KʨMgR`Hc~m>'Ԙ)RQR$gb]24ZkٜSMKKc51 t] cfV55J\ uEaI)JrheT4\("vYBUYe\ƥj\e]ze@0&dcXEmX؛O~ߢTSEX :*=!$>дғ'yS` E$0tB'"gt*'Vn!n"s2lBl>E ӸmRefdUJ9IKca!llPDF!”E( V` T߸ceJRIJF&X|WyU֪Uv֊,0Z S U'VS25vR%D9[<؝-e쒀dH+~ KRr,JyʴeUFX2. @"Bkč^ Vftp? H,0@ D֡Fll]V<a q  TKI & Pf J-~]_ z^ 0L$ Hf&cvlEӾ%\>j₆a|8D䔖ӡGFesQYVYS2l2 U:UZ )bKOQ̑rJ  %v hI;nc!qZHĆ B>0B(y a$MLIk4BrQ B̃ n.b1C2EVĽ<a ̨Zeb2 )eLՄL 1T((b4L+%U@ T L& BQ(4(`r ^8 cՅ% Н!JqMɉPkQW6YȆ)2;yg,+Oi ] d K)dJY핥>t)`l"A=$<@$@ nDlA (C2p)OFQ(ƑbDqFLmUةmu ? Hd旘egѶP9Ͳm'N B 1(p2aia< R_M,=y=- q}A M;,Ή gԩΉu1+vdOJ1 ĆS`P`#S;YZEā>A(,BpE 0tHPJU7Co3H4P 0lA_V>C+/A4{ROI7Vn'baU~z], :5>)LbٷM6F:wDӾaUN)<}JpK%䐘 -$u2z/iW-h|\^bbG4˳@078W kZ}'*ٷH% c@2TNm(VVS7^4RZ2iW.ā2,BzN=RU[CDqY]Y0uS2'TPBPXH2P'Ci[zB cʡZOMm7nϗ{ƈ&5U nv#9& I Q!k6m2-Wz%s0Y\#KV.t hA 8e;Tm`` 4$,-AɸJ]^@`a˒=򳮉Sh聈0A :^[ҿ'oLY%APũ%Ee-0CwCez sZ:W^tYw%wS=(M) P ,د2@ ;=\g-#',݅$0eP]_>5l+h?9M̓{TgʒJ|H$w]ﳊY7_۽Vd)@G4<}>Q0e,C0<I0@HuL9 azcbx H=6Z?HSS%)-YN4`,Q@[/Z=CX/=PĈȐ^Au܇qaۗFe _TeeіջQP#%rJ٢;\qe|JfGeiNLN s9#Q%ξd2%JS|No2]8s2[SraE4rC'1.fpq3.DÈ;q=C'l 7kXBjy#jgxi )r&rFC;CM~MCՑ\h8i'ͲhD,21oX& }a1 JF0dI& ۪%}+pRFadDV!}d>ep<1 $P3(!jSHsh;t1"&,@2*3Z#m:a .={9<:nJt/oLIHt!֚ ;U%3+YL]˘^9ZJX*|bԫt)Vd@f v`u QFx|RP49' ]'ܓsV<4%; bCYKm_EF?9Doܹ8} |($Kbԙ9@NT3Ri̥L{0(W:Cbe䒳7qlc_ggVƤhmYZBjN}p"rrm52$&[CVĭoRzғī)%fp]f~f+6)Tɯ@Nd͗$(1( SCM eb!/:I 4P|2MoX۫ A%Bo$C/ӻd@}BdEL:U }f$xSq`щ ['ؼη-`d(q4 Ms2*KLHʸ,m.@򖧥 4Kw*Xf>*i)Oh"*N EQZ$^3c}+%wD 崒wcܲhKH ~ 5[V Xa)_KVu=zp1TPLdEPC`NхC2B!-g?U 8Ȝ\J3um4P $VY1aAߞdϚ<y8Vǡ|M55村qsqtʬVY6&Ge r[o:$5oa3NŜqC4۶aӁHfR'ńիa?53&cgo-S'ضe%M7=EST\@T C}Ɉhdg)҈4/j2x$/" G>,2:p~՗VX׵B֫olo<_4qٴ}ݸT]h;MNtVUy>GCqL_'In}w+zI8 !hϱe}8@ln gnD"gT8~N4(柄$bHn` 2ƃnB:Joc0fHj<054xvvQ 0hGK !Q QqbQJ"/=Q/qIQM!1O+PzF] Z ߢ ꔤTL%d0O#Zȯ44 #p&ß/_dÐ0F0 q֫`Q&@f7}v$0E7a2jBh.ƈ,qNƲBOgM.r$#0ܩ"J̪p[.Қnr(*؇},&n+)D#NN\:!X.Qf.(ID+76K)2R(2n *#+0 =27bmK ޖG( :LjƜfp }7 H&{"sE# "1'4<ЪhaFbҀe@J@C =czP?$7AG")Gi-2%|L/.%3 K4&dH@ͷ& `0Qa<V k \-шq!3#2* fs=f<=s>3ޠ=34 fNf>>s@ ?3=ٳnr+ NLrd h2~.Nm%/ppc094r9#pqQB` 0"*]I?nE sOѺ:#R V`4 ݴ1j$*/o;r9C&cK$ P߂ fT-oP:^tR~Qp쐓8Rs>fbD8F2TB;npR)R!$.RQReR;US4UBdMU%PI:S=S]U9SU%SKh~vFNzO8Ί uDLEOra̅O"pFHU/&HP): J E7 ;i %#.drM@*b>&H yP(4`A i ]6)K0i] ~Mj/% mJ) y#[Bk;c1IŸ;6[K\Q 9“*fò5*DK'j*!xϷjpPO } k C3dҝ1ka돶̃K-_T&p5100o4QĻf9Gn1bE 2ImvP|J aX?#@xIR]ˍ;)4aa` *lDPkRǡzGqoS&bΊkS.-F;OCOofk̆P4or6Ҍµz%*bc|E#d`7LC3Ѕa:Ӳn!+Wr9$+D%:6FqqCqmq+?GW 22 M8b{ ~N1?'F2*fH4n^p$tuuHW? V`c v+Q&QԨ*}B+ɐCB0%ft\Zd+Hrȝ ofդ(y5m PWTk=..LBiQ uX4D@Wohh4\;d"37Zqa,YpCu$f&/OD6"XLQV#k>|N??𮚔Nur !ކH`5! w' DI51\pBkx;czly)oWG(ken$ZVI 7 ;,?XoD < O:0OCqQ: # -w唛_'C4f6 6\jS,"Eqe-q(kjq I;n6ekn1O{u3cK_S1֥1byRvEme|[mHɝt; d KIM!q_Dl5jG7dƺ4\˰qZ\J:_> ֶd)p$ ݲ˶7 :~#>ހ4 נyd+FzR"vE"v&! E`c#n:tQe \S6FR=ư#ƜY|0x.٧Mߤ:Hl[FtY}%eJ,nOK[Mc S;84%<&Lo\Ȏ6q08v7 G#_ ӵ9~|Wr Ј㝳c#+r1]|jHk?C=H@,YA(% "A|pdWі$Nʇm)Btq8lb yƄv-YgKpmuQ^<]- N Rsꪲ$iJOew\P6˝|XƨK\-OZY@#!} 7+t2-=,F&Fa+s3s瘻na=s`b=ޠI>cOif~' $@" |tJIT ]bBپeG^4SHoEXᾆB8> P`..tpL(hh+.l(q&JQdG!/LhR"vH<[$(׈N:lMm.ڕ΃]Ӷ}Î860I$}ޜ THQe~ ǯQyEH/=j]+f^iY 566D |_FڳVА{?Ywfi{kZtZ9F$94̴)%\:JCnJofh?/P1dҔ>&iLMT,G>\D@&(SEhLbÌ5H 4h:x#a8(18 ByR9%AZYeWn)FRf f_jeaz ffn 9Iu9kfgqI3~.%YfsF&>Z蠕fj)n _Vq&^*l&(j(Zn$hGo0B Ј1Фp"% DI>"wУ #&CPo2Ko+őo. pr8P4 !!4DC2pl+Ef!#(0-r*ό0q:ss=̱9}sLܲEO}T#$Mr[?4`sYC}0mk64-w._]tt]Ͳ|l7݆۽ -pC ʋFC`o08VF;1.Bl BÈ&$ I{{<9h/*7/9&ĄI1+I(܇&ˀORLⓟO222ᛟyO|ӣ_4!0{#@b o D(E]{ӞBEkMX=bz[aZz%,8CZ{ wAڰ{ fHDЂC^?B{ף`}^t^A$p}#|>oE/wӧ򢷀k)sn0Y$YRj:]`*NzPY:Ԓed_vUJu֊UW, ^sHVyNT);=CX!M`C _M/[^ym2@T>v|YV/|e5SokJp{)77 fْ+iJL62%2el3!#dC|;{.t[TFF+MsT O*t W*YE+{R1b=O|BGSmauAJV㖬"LnKWhnaU:Ϡ21.)%,Hk ',Hn8A-g5{}z]{{GuC~߲/0 DscFRL$:ԩD DL0  71Ѐu(t YE xBwRЀ#Xɴ#(H +u" 8ȁ+Hv6(ŒL.8 LDF094X,;998183h1(ÀX^HcL]<*hgYGj3X1Le (t!L{hgt` J؆bȂE<lȄ؀(&؃hSHgXHKńa8H(1 oT!(F؃hH9(t*x">X(Hƒ؄]ȄO#؄exۈ9Mu'v*@BsuSHh8Y  9Qt7ah`L hbpbR)$]!i)Y#()/ْ7-/99(24]"4I#yE9.IC>-y" ?CْT9(ɓO)D8C\YEGd_i* obRGce9@ٔjQ=|_[ٓtyoɒI':&)~9#y [YWi`e9$ٗiki9sɘ )C)1 %70 @@Li`9aC 8  0 h *"hٝ)Ii鉞㹞)Iiɟ )Jj *Jߙ10  {HLޓF9" [Qahjp) .c*h`>u*1KP[JJpX>:iA*gJkK:fo`l*۩^"Z ZXZcʧF*Yʦj}*vBeZJ{yj:ezsz꧇ʦ "^*@ꩧej m: 2ty*ٚzZ*ujꨝʪp: 7`8 +3/yEA,002 1Z؉hyuɱqzu..Wףٹip);$<;) +p&۱x۲-80 ; ;{;/4>=?+SY[Ok˵?{T[A[Sl+P`-A3+I x|M;^4},I~&b~ؙ-;.`+ bB{-131^t >R$9/.nL ؜긾٤~8g~졾쨮"ώΞNN.M. ^n׮>."ǾoNhfn﷎~쫎>雞 O!JNNގ꫎N_+gnN?<벮,﨎N'^~~*K# jmn qoiq y 2uOdc?9p9..̞?<<鏿??o/OOb@/o?__ίO_O/oۏ/O9 (@LX@ B\8Ç5Zl# e2ň2bĤٷ/}AG/&hTfK}Z*3ZКєSm2Q&lԫʨQɫL_~%ilYeϦ5Kv-ڰcf d'ZEI/߫'Z/a|` >bƖXcʍ"dʨ1 zkteWX5̸Λ;{w>Xrd\ɗs狕~8UMwԬ+Wydߤ{6?;<2P `bjPY)(l꩞hlpzivZFB J02݌M@!FMQǮѫ 5H#mGPrtR"L4[2KKKL`2F/4ͪsN-Z8.43M]|@+J=PDQELO72(O477=95uC|qR.c$YI>L u:j&`"BM*Ee6i)d%TRfA 2iyRZjkgVZos8TGcG}s;es\H#E]>7]tmT}~sOu+M6Oetz V܇5v^59x_R#6sFAzx'P)EpD=iJ&‰bh zP  ibBeziMVfh鬭GzjꭝN/SM$Z>[)ʹhȣ[\)wr%9 ..\tER941瀑dxkhVid}P<x1DD f}0heЇkwsoǜiy{i͇|>_j{e AIMOfAq<!82׿)>Y"a΂b@"C*8"p)SAg5S"Pz; 毇Aa3lDbggȊHJp)ZSH8(0;(BP,#F1q341T@"c%Elc#grAEzCsa%UE!fRN!gH,(ƱdaT.*y^be(,FP2!W:A 2Ac1'<}M  F)B1-{,Dkb_9Ƿ1AYАAg "Fౝd;h+Bs=34V$u(@F F1hhCQ|4zC=L(@mϖ&-U2TЌs=c;=ZS&*ł4)GQƠ`ʓ-edD;ԓdVgl dpXo!8C(nh# I!dBUas_2xH[Ɯme  -C Ls$&dknr8ﵴfhл FnᆢW-nA,r(%0q~')DO~Wpzii@ORO[UQ[BЋִryC_x%k-Wmleͤ]k4U]զ"z0`8(2&I.aجF;f};ݽC1-мw-`C,YF4S`.ǘȳ$h,ːD;Mhl!Ѹf(B>ra*g41gp7895D2Iʍu !Fe¥w? m-]=zѧf_I.aAzܝDOeأCy?{^^eP7u`ZG| --(.ѭ˻SflWb~鮫G>,-Ƿa'1vq?fW޵7ͣh{\yC%&"ލwx` /[ \ r3"T/7 /K.|"{k{B ,Ċ|5t2dBO41<<2$^:LPK-4JDD[,*0Ŀ;Bȵ㡾>v"E; I46l>ԙ<<̕ᙻУ0kSė[H5ȍɮ=;BuRHB|IXsۉ A4>-Kʪʕ##D|4i R̉<7H\˟;]ɯ\E !ʜ=ԙ *$ż qA1KT|LBV\ M[˛yL5仼b윔yQFB|C8,}z͝?3.|L AiAzI{êSN<-9ϓ39טּ| ,eVDŞKK,IJP1WȴI]1DD= FYK5D<ڥ*. O<чXEltJLP++l<]t\ʼTPlY *|ɬL: DQBtɩK܇R ч?,HPh`ȉEXs9xƆ[jh`R(eZ@Hi5[RP-89|G4z&.ӳ-[ϻJ5=",[qBН L4H B۰ P<ʛJBԺPۋƳ()5RХ{˼y=ſC _S;EG;R<_IIVzc%c%MmWG<+;>D=,t>3c=C̮RSi6',V1=t4H˯R]Û,=XSS@k\W`:0R-- F˷bĠt<@ؚ16,!F?BYIk ۧ- 3oRae!E&I[9[Ut 8CK:6=.UC]uɗAGģZx*Ń35ReXWеA3PA!ݝӁ>OePD5Hӥ}V!KL ĨS]V<=h=G({EKY[伥ךQ:5Li}p+d ̷ :h CqJ9/XJHQbuLbuG|hAND+"-ޛŨ7oSRi F}Ds6 QҜjeJۣ(%` *S ^.$BDiI:ѓ}/Hű\bY>K'=5U/2JFMdL HStJa%c y^Q}4sH\Þd[s֖07$N QvbŔ$ X=Xc2OCve:QQ;,"D6;MKWCm}C}JсDu=Umg}=Y5HX^[J X\ӢK`G!L}H bm<}J8.X54VX{;YH.×Xi3D%S{]4mGUSw] û, ICR],[ XDW~ c;Q&=Ȍ^le }0bpZX,iCMϖ\d?Ff MUΦjr9~[pBar.cAmj?CG<Ħ‹Fb3EO j;3c,WQ/0$>RDJЈtkG e=P`W(m ųʜCiVK{F]PVIIw]sy؝L6oּLMo  o{k{g'廾9X9fzFOپ}Ȅ#ƤL4)1iB 7z[&GQ[Ҡʎ4O`H,wLK(}:ܗ`ǎGC,`ǒR] R 3(̢̄UhPT&4Y+<v}w;N4ЎQMhf5R(O"Ļ&PTZ64Cu2qShSsv݆̑4Y&43Bk_ S1yC,`.^]rzvw]lC~dJIEXb'm %^tb&M1UPVwB!w>1d"FM آ/3X7☣;أ?CYG"K2٤O y01 I3 a`a`Yf`jf sdƉt'ty杂`vf^>&ڧe1 p@ p Cjzj@:j;* @미J+Z멲 @`@+겮`.墻ɖ k.kl J*؛*İ"/ 6k 봺J+,Ǧ{m{{쾪< 6lG+ݐh4 1L K$GJ)>|P` I%UB^s>j6n\{FЇTF>ezCޓMf8k(͐Y QYDAM\YSWM6x7^C}5CEy=$0 T^512R[EY$ EuO=ԃG>D?=?uD&So}/ 1@?c폁T`*={[`#Au}"L̷=qP p Xˡ>>m/|3x>&|9d Di BG`)XC!W݀ А+M"V5~xrvtXAΏw[ G@B!?2y%Oz40,YJSe*WJSe)#I=N{<%/OH/ Gb#&.hIaO&5PMFشp(Mh 89eNs[8׹N.}QT nNtA6RL8qІBT>%ZQrJ'ʥa"T9KΓ4(]J[җ3$(MZOj4N5uQpz! *Nty֓ 65O3bT}&>t!M(T@?e'Gm:ӶcELVsr-1H"iDEDcsX\Cɠ0(K)vV,=Jd(.KѢjUf9f1ūp]V}.[&Ol2~IHуӡJ>-tgkL?B}d2M2&s-kU^< |(_4F!xZ`8J4+X9%{J1ւvʝ )*N1 :6Q Vo?J"U0VEC#jc6TѰ>êTuJT<ޔ8*N&7Y 2 )OZ\`vZ>=vpS;pN}fX,OK 7z0u <h;k!b(iKɜ^i1XsN$x=AޖUc{[BO֬Zd#[–u]:ظ|x; dl";كvf)m>7nVFeRͼ-LhK6 ~o?K5PH"o\uEFlw"L wZZ9bM .1F=4jF$f_mz|j8R)Zg6Ti@EjO3UָKY\N_ݤK&7-j40HÊT4iZɊxa_GNR;Q:سkO|_=庁 ɫ_\sdO}=]jAc< ` c~pA`,G1!L p_HXA(ԇ!h {IYsuxo:;._>3("c>AFePS U7\FO_YeP<*AR bY1p # O ;-@Uf Xgx>rU` iOHn>@.C(O! $`(0@Te*ꪭʨzșw# 2ؠhN(D<Ƽ.챰 sIO"cTܬ?p2[,*Д#ƅ.`%vu\uiXr*Ԕ1Saa:3 K@=L/tG>5fBfr笫]Jаjz*Sg깭{/J 1Ec`.V*QCN>Ȳ5ycI 2Bbbm$~FkUl\4|L@>sGF (W ">@13K yЍ>rB$-p"$==66pTb 0Z$!Lc33c%>ZFq*OB4&je蕬Q[9MJHTL Ȁ0jO%`zSV pɟ4L' uYtɟ5`^:Ei`PsQv?Mh:H& ~@ZtO^ޯʍ>ҺE |<ɿ\N 6}.#tyvyXVH-L_sBɩdK@20~<Kdd # jR0G;`6ϿƉ]EQFYVjPz`. /Cۀ Ӡ4l/XD$b,x+,+c:锠"r/cy9it 3ƲqYF>1;iUP; w#Xkʖ>ʲ>Z Nbps5k:ZhJɋPT΂dI2j`1_ @ :ЅǷhr1(LQJ^ *#~wҐݹ i-g9fsf-`BybA:(k{Բ02gja#sl+u/(5}z.L?E>$=+\ӭ4(_Zzwnz/{M]81Ll2}O=D" _Zռ^ḏC;} wDJ1}aΘ{͙pkkO8h+5_Ѽ ޿D0( _JNiB9lOP' a  "Jc'A=G7sAշyQ 7-e4vt$Fŀr166)0rer32MiN6 N<|}(be*+Z1fjafwGm%H~K>XP.a1(503?-G/?" ~uQ׷)NR~ͦN mUK83Mf4ilw2YT5.eH>[O{B~R8DS8S-*2EM#'duPEg ( c'E! nWl1vUNw]{l#Z_[Ρ ~~~z[DHG1P,؂]Rb~a}wx({~MH(d q71xB}a)$mP^qXh[ i/8RWEyasa 7N۔M&MߤMԒ'02 MM4Pp8dNs yt:i'~ T ʰ Г8M`#ٕ: 391 YXJ[$vYH4hĔTL9ߴMywY'ysMMOdX 5Y/g^Bӈq1M=YKV6%i_);MTYULɘG[摪W[`pa`\|Ix9i}IZْOI9AY^Eg΅߹-@R钧ə{Ub6Yy&-,ٟi J:@i@J yaa靾V)yyuy- N'{7*Z)BA*pP I;p@ a'?ٗ4 \@q/ޥZa/˕ڪ6 Lᡊ!EZX7x2tYP@ P1s1F(r1j!5[P+shrK%ÁLdڶtJȆ̲lԪРњѓ˹輒9 TӒ!݅pа?8-"iImƼ Ǻ|s!{\eᖌ!RWyWzO7@G2!LLs]BQ0ק؏yeܱ QsH:ɢY éUK t= dB /O)pј̕d*g³+ė̆LO]ͦAᨍjmٞ9-]';*J Bq""=r=Etݏ X̃Zu̺ tBeh~rH،_7#Csޥk/Z3\7Ъ!Ce^{@pmog%lhؓfЏrxZ-bjll~4;#EH:44삑Ƭ>d%X:AX;á=cݰ= ~]uE1~̿5LM; -ۑC,#^рٛ+%WK9\<dwYۿMylX[ޡCZ9@aEC+?܌~ĵf= 1} 9}'%:YV\7ޱ̫n?>ժ=+~̗}vApNΫ? 䉩)cD&TQGA(ϝe4?m{g^ؾ.:q-N`LޭL{ar>j%Z*P[UZ" p[~9ΜÄͿ2\˿6Fi! >/@*>yca1C-M߲} I>}(IGOLv3H&R(˟~4fh4m”iNMW}6%h2+ɩ@&ݧfZmݶM3-ɷuK̾0`]wߖCQP G>v9K0C.jU%Ш+YT5hPÞjR4hDYwZ2EiRJ4[8IC- ȶULY(e@)d0 |p[}\NvQc!sQh?"ǵ椊)&bBmL)5-BM$z-4  AQ[J)馤)4 R::{qB0XD0#/ҧSK,z1vhx-j(#{ xMl20XZdCUlÁDP0Y,aقC]q HW&Ht8%x ct#R=¸ cm;F>E3$Ɩu*$#LOɓRK-N09MTZ XF6H!8!HYP8%U`L79%Fǥ1ŤZfl9NZ"N .xG{CN0+&J’wN*_2s,]j$M_5-\  _a^Ai" ku*VSI'a!S[B h6vT&oÙ`Ry Mb! 0⬮49% ;Y8႒gK;[D8:zХIa- 1Ɩoӕ|Wܩ$Ϝ}c2MDKw%hB!-(E۪pȰZD,A\ٮG{xeBpTgD'TaZ|`~Ze-f&[dd9iNc'W͠cB^B5GW+|y˯đ|81Gqʌ "]C x]}t2ViUƅ[Ն6'Lp|Yw٢XFAg/oU>f צ<2Z|uUD`# w5: )o`c5`"i&2Kڱ*;X.=wBA P,C˳],T #s0"7Cf~$ mq`{ R1:LI#o_;vzc`ro+6VBG;k7 Øi9ERb2hMÓ{gۮ%(` 4R1.&B]%-{!1Խ+f 7C&ԐӬա22q 4]Q.4'"$8U{ ӑ7JQNɁob=QaSaSh_ {9‰ya8ƈ|"C-Ik =2(@d+P>Aa/Rʾ97-{{W; B9:[ ZZ=;>÷xYiJY'<"qt"4_/%Rj-* Ҩ?Lᮬ@ʹ 䞶33ES-A#E|h(.!4".К?b#$:e<8zp3ں@4ӖŠy.8Y8Zh}?>1I>eB[uʺb+0፭ bDLzYӞ#?DZ5ȚyQQOr4r :R64)A& .ע\QL<,9CÊ֜O(BQD3@PJY+j+)|HNuqP?% ?̖ACd.lOx4 ⬌P;Y[vӗ?!S} d"U4@;+% 0%V6ERѷO}.¾@p8^`3 31*Ss21}%3X1#2E1k] 21 X&$GQqSrB򃡗c -8zׅ W'GsƪB [J1cT|` y\'r24iyr ґAD>'Bq M: sY9q?`PX;}09"%$:Ac[ep.R.aqWJhZVl5SZDR(lʦmhxDP !8w3aEД?<|e)DzHJα8@]a/%#,.abi 6ϼ Y#hu?l?# k+L8_貉="^,MZ]_dҕ^=&],av.W[ʸ|ƺ ?RUrǎJ_j32^^\^5̼" - Bqxňuq' (s ,@\w4ŸT?OL F<,'~ͼ 20 bE !h !*\>3$ܘ,+ c@B+Ռ $B1KV2rDrf`(d ItFK7")Nfd ,Fu*E$ QӺҥ 7v];YF4kzDP }g=L[;>H+#*IUzX6:H5"b0@=ՃY י^4XygQ>E*R'N߉ ?q2Oz+4*tYKDl6y4 @ 9;Xź$4 S])6eh&N E X}E] j.j9\vdARDZv >zkl!eԩ``dgi4W([nNBDzN]f`$d&юx4هi4b0:-MsǪPӍ,ga-* [QRL gXe}h% e؂IHenDUJ1w4̋뵘kiў)8s 9!EPZܥ& ?+fm;U.L'6ѥk ɐ Թ|ɕ):o!`L!W-w@ 7A+:?Qe2'CiQ&#wSx8W-'' OpƫlVgq-Z/?S=;d )ԧ;, >x& Ex'@'gc Ȟ8Pp|KC!>f$^D .U5/_媖t'HNBsIM/чt)Seb.<0܉~S g Y!*g R}<.ߜm y"a $i@U/U)9t^Y.jEDMcs`&B}`sf$}pY$bdz}0+.̈́1QkOeZF⿤Ѽm4P.&wݪX?ÌCIW;o7zLLa ƀ vh=E`aDݧmmnql> coc#r8ĴJ܎ ; gnR&ۥ(C P)z/[DO1t"Bbo:RxaO]VsziHhy@ܧoQ|\NT^z)#Xھe2FoGAO#EDIrd4}l)SE3xÌ,MFZď9Thŏ@LS*֬ZuְSLBa\7f]wɘ8oD}Ze0Ip -7ڼ.Z gPHa(Ѝ(VԸ͕ LgɔhRrEK< LSGX!aXͺI֕Ô%е\eǗ<ShP}'-qշe%ma?0_8Ok%5G)L%uZQLZj!ݴJA$jXe3EhD!7"AxX$p`(A0a,^caO#8sueUevTJƛEAaL ~iMj$)Yp*"GVV[4tÖa'rٓ>F#}u}q@Ce xC +ړ 陞řl椓AxQ+6M*mωeW VAnŨXqTD@P25"2r`T;X$2`T!z!n"hHa$FKDG5qSHdT\&bjY1֋ 81VtgTKc[pF$RA=nqHr TAk¶6T0*Hi1ue>r_ ,) 0Bn=Nd mg e:RJzHD=,A 6Af5VƔkG5X@`DyUXqP9k")ޔl&1e+͑ӯN(inxڮz!n^Y)'K\cO9 B6_2ֳ c%eȯP%95< 58^/<ҫFY+S8dj4 icm&90K^jHXDD BzPCQ `k 1 ! د`A"P vX5 )&H4LX8Wck!lRQbRV$l4hC =+)p"B6 \9N*oԓ2rqlֲ1P tTƄu)] /}3$ș~.XLÐJ2ˡS>K~Wy6U@Cd}}2JR MJdךoadP (RQԵiF=0HkXiWbpޤKZ}{"#CF dXmS:ՐhZW)'iU[w$&}G(* @-eȎ*b2Hv}8>Px{ ~}TW8X(M(#C$s:ɃGa:%VyXWAE6iHd؛1jNj~8 K)6MNƅȤ_H#XqK4!%D.ŶlՈ B2`2@ݐ"aLtM8Ai(X6çfLvX$㓞b5)>!EeC}b=c4ؙP0lKj"X`4s1U4$]ݫdz꧘8aҬĈ+鍌F4n-4x6.FG;n'J:L_^W1@mRoqǂc P }Y}VEDL:6-p/•;|#^d`IoYYs1-٘\4 yB%d6K)a;d`*ZԖ maɫ&Q?a@ѬkDvl Y=eZ6.k^#]iv],dh.V:!kG&/z f>FyRhQ+HȞDD5)D!Y]@,` }hAC!<@܀D-VhH8P=3Vj\(I,Z18 LUV &D4NOOK^yD_y`Dą) OAմyD 9U; A^=H]-MĖl> bǹM(C>{|K/1 9 k ljZ;1N4T]A4.Z0LۅJ44 bLRϚ)̀ؐDHY?IEL8aHn<HDN)mz |K#RAC1ԇ`m"5|JD Љ2=dZ=ԎD!H0_zk 2!̙YHJf<>əeH D(_uImьuڿ5#bHU0o.mSnIM8T3#LO%?֋SmF@RU*޼dø ^SAbJH>`PG,VAd(ɗaW$MՉ}Yda r1 D NʓZUVlQƀ! MT$Nd6Q6JJܣ\Htf`$WvﵚOZf` . GH"̃~uRu GO%|6R6*gSˇd%f{d "pg;C'VgV(gG6d/-T;Z0NmcvV-MPB:mج4LH'r动&V'(bZŵŖJ܅lY%p L^U\֤ND$p(&A)N" *.B$ j$g `i "Ŗʁ  DaBՈ\djE+DXTc$1o ŌI`]n~" y HiCX.‚aŐE l1Y4DܒQ\E; ;"zԂXanE3Fi hmZoeTɪ.́xqd_`:NPՎf`6D1ž"*rV=!u%a[ªzY>p ="BNDBe{S&m`n[+kW$Fkp&*A$+*^,AVyֲUv2)E ,NKT]~)J,7o(_WlmUEYL>ipLR,!(ܪxpA*q001D;@6aQLɰcT^)9Jr`T[tpL.k:>\p]hajmx@ZGyp{܈AMԇͨ2rS"nA2fU*M2/F#~H}ǕnΣ4e |fP x}O̺XTL[ҕd来 'H ,rؚ4oXg*yMcb*^",#Ɓ ۰;ۃc#SE ė{"ԫjnΜRJ`D D$XĜ,C[pSv"BѩUΎ[o1,kN'.ec^JXbmե )ʪA੣[Pm_;-6/P+#W3 &ID̉\pEthNM >u-&YAACT@E[T̓Em CR `LE㩑i>?F'Nb(p҉zdLR+2X4l(D<3ȶ;kH<|"TZ E$~T<|OS;LvR֔{rgM4#;3| VP;xGXྍ|Bp6q퍊 ,9|<jdk!9,T\S`k&*}tbM2|\܁C)ebE9 mI]CԲ/uX@VOX F-!h`Đj2}Mы&z) o_=} HY"NGY"̖1U,jɗȰ:jUS3ZjWW0V@2}%d9Zu S(֕@EۗoK J)m3/}DSY}B/y'ϓ5KYrMMF{@1 hSWWLzxsр<Ʈs΋ӄRe%2DPC*enęm1rtMcd)hmm;J(T ,&R*6N 8<˫pS)) )bB߅n*jgMA 5UHT9"H6E7 b`gYAN$jX0T:y޺r?d@BIݥ&Y![湟OYٮVv|eDԔ%OwXUs)r)H 1HZȧfPx+6LRv6ӵ5A!~XCL1%P̞O0wKMGдj26 Pa=ibeeUeDUp.E>-T t%C?8Q(t˕P ,/McZKUSBG˒0!7D(MZwGݪ%A41~72&(: ,MDHb0H`+% (JKhTPL: ([JIʴb{]am3N.kUŽkYd{vlrk+Hg0#5JKjDHt4QCȑ6HNt#Rѝ\O08pO|b'[8<@<.d}vyld(ivXC{Q2WG@$H%%QG}t2'ofmj{^0s)\]aKwq]8DFR z(ŊX67Q'ЄQ ¶TfAÓ$-S9=ܾE^] zE,:a-K5m晱r)>:KW}-] 2wETNj6L FW֒M=:QJ[ X'dh0y*Dm#En|Ta=8n9UN'"ƚIE bDcB\c?T5lwiq%k*8N^4@`߆K`*M#1S7uul+`8sB~TN9S{ڌM#IDw]?GiehWԎ&BЇ:tO>HC7 "H br%i#kFKmTDy 4 nʢ#$}crKjK}KE4[CÓYv4!8Ǘmmt{FSӜLAdc7l{r%+ :B+4a:b`!b b.ܬJCSaL4ilWD/Gd?q]/fI(0?iv,H*MjӴo(D1o9XBx`@"VAف"#g d*LtYM="'Տ(ǒ$/F#!YM!CD&fʳ `"o(R6@# "Ab>bA`.8NO._)f``C9aY@l "vV*>Am%C32vC٢0b\qc0Hm3bd=̍H&"eh LeP>O6 &Q,1eHCPPMYv.$+*adl`8ub`lP!Q|ijA?:+q%^czC1&QpDMaZOCԍFVc|v5( p ߄p wjyOP byw7CEZr؄a#LŪ3$~Z& ǖ3aF܊{7BN]^;J[?8M7I?ȫIdbKP|d="W2p 6y!CϫWxE{S ."D,Ab-~G,cb*٪<*@9t%"XgTd$e"(eN2=@Ba43^4D$B!eyZ4->ėPV`.~4"$f*:^9L"#C|! [*j8Lo x#J4Cz5\q+U@흔8+) e"As,({6+0Rڍy۸&@^ÕWF"Yb㖍c$K2;ղ?H66d<X['uȅ $ 8\p{9޹*d&m'5rj0u3bBSL0?IrS8eWcRȻ9R,Ӏ,!;odpMq ȤĢBEz4'jM(+EMå"b2irXb6zů$NYD ͫАXt|I =0DV++a;?;cDXDMgަYgcݷxUcr;V4>Z׷(}([Ia4n)T Ce;x$b-vA@cYY-J]1-nJGTUʌIuO(t)[d;+j[AarIu:#!cQBl#j2Jl#ptY\jī@;WQT캤RpPːhTL G4Y,j]6KQq` dQWYRSX=2/"av]L /vͲ)d1M O{*6fƳHiR~Dcbp~M@P82BWXV Z(vTl CwwyBACj&'Ǽъrќo` ",04" qa 4YbFcA2zc@!lG"bqMgzm'}ö䀶HƩy[~#.rCM϶ $23d_0-X8`I"Emi'}fj4"(Q#eJփVoPܧfڵlۺ}Mt V  HЋ@0M_;ed;tŜxd8RhhZqݍ[̴h} L:SSCCWvƉ[X 뛿\N ,Hpm!> 5 #Qwgt1RQH(i)2(5V4q?EtFA>`0XTk1pNdQ=3G:dQ 9$%DNTmCrT@DqYa4EPXoSv#םx݅13p  t`(\E}-Tj_eijRVvCQdƛo9&wj9Xf<1PLS-WV!:er6mBۀ. m?}җDZ†⣴Sߴob'1743D~k:YZEkbJ\(Q$NSѐq8`HE F*)j%S=:BqٹS q,Uu2i W&Ҳl :( U_РV$Tϥؘ䷅D,E"=]4iE;q/2`MjE#AՐϫɹ:$U#T9[j(y]灅jX(nbT%yЖ%, "U@H!F*6[TX?vBѐqx\~[sו>ηijV&Y :~;x3dnB4ifEݬ@- Y<`ÕVzeǼe} 7'zTSe,e:QF⤌ue*"l,# ѳip۟ VR=t80,:ߊ@(Nt!;aNy @j>*a4Dzp/|B QRF6J1~>..oȋE9/NV`>M,e* H|Sg%҅s&;'9z\'>a05>0?N>"\@!q[¿!rSM2! L89t3<7 Nt,7Nv7t?jN3iC&2M0(^\ylluD<Đ%GRЎmDMӥ&KQDO:Д)1ը8$>8=-}?C !Q?c:\ M8KI.I: XcQ':2!,NFЄ>_:r!Y؟L@ƀ(ZDŽ- PS*&IA 'ħNMfz?n$j{z@ln}L n+܍b]{@^n 1`³jYTh3/j}:-(X~fzq5ɼ1ӻQ)C0܃pCd i`Kג.A_SbZ#pCTn6NHlqjG722դhNqKX wn+N+*]2f! *xCZ<a\DoЇ=]DY TNs R%Uo2F80]LЌ H gp-CE bl58 VP@`G<efQ,ՒІB>ȬGmB86rqc _\$k?3 wgIɉb I@ ZXA $ CxLf IBCb"*6)vhχF(k"PVD7r;N .vqc·hB+ pf3ytFm=VODnƶ~RP Y:#qgNw1#qu=K} _^8bBÎ $Z;=ӵ7oyK;_}-"m-@2h pfݽyfxCpQDK5חt!a4TBp$™]ԇ_3ZP٥d&4hSH9}`~ƪ띷%>̀b( .s#J&AQ`0A;GmCt^Gẑ2b;Β=V=5T7 G5CUz,{"{p--{wBT2&R!H {Q)! Q02` pqEL?7v>I9[^ĥtgI܆((6 j 7(,_w2ҡp0| 5 KCq$XMcpςAb[,}DLed:gm*r$g(QqmGဝD|{WTUCS^f@zDuzāIq֢v:nh-(HR)cw0A!gWgD9Qg8g9cBdWI}&F\5'R)g$A:C62'v%LXxhV>E[AI(rcEI}#B()ԓ2,ci'Η"}z87f;Re=iJƛdSϧ;hv.y;gGtKKgU؄pj` a0?e$W;qlW~l%hM=dpJԁXB:YW'd'G[kjiNPOdO PONDDO9$O4POPTP :Pw.ZYgxw‘nCIsx &6-FUSASA%ChBbWH&IhZ9piMxAC7 a) `4زC GUp8F䥼ɩ7{#"!Ł?*r& \+pmtt(ϟlGIl6gBؚLg_!G]> Wݳ{ 65 7CC h_wZ`Iqw+)b/9ؚ}&lA22G`3kA2vzuk#jm[9VrIvG;윆שMȆ9*1#W(Uo=UVHexFt]sԩW@BgtцX2F{>>'2|HMz}4\lV_piCtbĖB%8ßAQ]Ƙ893Dńk4S(mOG@EiI)9Rgx in'&R*RvVsq~poK5!, ^ u՝o -UloU_a5Vee㱳ԗ('W9q8֦[}Vc>&T,ZcnaךY% YY5(KUZ=Ui5SO7)~`6i P c`  jfjFaq[Zj)+s>gg~lKu@C@iB8_WQ]g[xC(A1 2@n2jnfskd@%BAkfvo%^'bq %U$,pJD5M"PBw~s;8ްfla1=8-r,r,s2'4g(AFq9o$ D/_M'b> XھzL\cپ`16SohbZhJQ(ѕ*oInpDN8@SGS`ͣ^)>OtMg:US]yM"/ރ@p3Ȑ8Ddc߼.倖С}5{oF1kӶ턽꼣s>^0rSLn85wީ4I+ddnđ-SnB}*v-Ю+} @^WK>Xp}4b Yd&yrXZmFS#}.~ +ad%z²B::(f08Hb幈p˶#jך2)jZI% J-ֻr(r,鉈?ҘͿ1^ӕW5}j6IU[Gq6Av`z`V˘gFnK =:zTDOj/0 .6"pT*+VS&1r$6pSԩ`e4lSM^rUV#.E;RWz0j2Ęx`oUBKGqO=b^gk[A]DH; ث=2ru9щ\(H%m<+DDri^Wd?q>Yt''3f)J(1EjhD&ĐL/u ws%@4^WJR֚굯T>\x8BeZfd٤"'@'CҀP'^Ҡ@H`ғ4 @@iKKR2*=iKQJғ)IqZӔu4jP?JHUjRB5cÆ%1A&{ģwXzVbe^2fC ifccMH͞׊(3gE p,Ube+odME?*񕶉KyVzK?/[< a +&ĀtCXaxOPt69hZh* 6pq!JZme]ZFdB%ܐapс iTӹ H!tH!7$!2OJv`{gg=YOe'(?%đrUdplh5 ݗ- 5SP Wo;9dZ0'gӾe2k?պ#Oa,| ! `&3@w巏Z*'qsN@X]~pХ+i-/8Mn;X.X n@*&!C1tLb0B鯃p-+",$`TΦMn)ۛO0ÝFp6TqLAhuj%~&4'ʺ؂;F$=1cN3(O@wq6C|FQc-'=<-\0 EBm:{ԬNbܠCH/F;Dz|هE$S٘y@77by:1ٚ8?ͱ$p+ljт>G":-:90aS ׁ i 8!Br$  {"YqA6;:C 0392r ³a ވ ܉3=1dBXQhx5 Z#/!WA2DD3䥿IN( K C!XO$. 3j'ڛ=|V179Z3ij pʨ=c5N%a*}:5:G~:HE]ꋌ,@pGPFsؒj\'2*#(͚'b[r K袇+wDӬp4qH%X ɭ0d a%&٣HQ0XGČ쨺2LŠ|[,\Q7!S5,{hѶɱt ʴ|(:&";Gn:I꼲XA19w y=SWV#J$[zJtP2"L!4*=$t3#4 J+MϺb쬎\ݣރ͎"F B n$A:2\(SKK2i9/)1K6?TDH$A$-$̣LcE K*y;4kX&C'284*z)R)2PPM ј)PP* )58ўbL@ Q -J W>zˏO}篏~'`g `6 >(a.h!Nav~(b$nh"'Wj@޹2`!>S>VGyujc4A.dA:)#5y#8#Xm][Z٣N IdVd =YOF~&pȥ=&|{l"Ihr9%XIQzIX}GB(q(XTF{Z 搀:蛝> +m&y&ΉwPy)ʺ㙵o诨ÆZ-69Ֆm6-솅ܦۮnK«[>/cn 1$0 3l2hbxhѢ`iZqAz>'% 'L3):r8Ǽ&}@#]2MuOK=4S 3WkmtPw}t[{ʹ`[]j]5k +Ac7Xxz}wހxw?.C^/#9/WzsZ^ 0WD#-NL@˸XFX9V#b1/=GOg_s|/ڇO~o?׏ HLԁ'yH$&Pv~cH(L W0 '#7 mh`aYh;"PE b HD6Js8#>qc8 E@ +X6`BE4,a9`X̃zc2$ ] y a}t?Q܇$eGM>dYdx豈PRt)M9T#܍ aJI2a OVK?,/[ Rjrc)Ea-ʱ3]&iMcn3l3w0$,1}}a IzP@X>vhCha 85{aPyBPypyBvG2̓R0X`ؐOV2~ɦ4i>P-£ d/N<"D[c02"dx50}`jaN!G"TSFsbjF )zS2_ʤEā8R}UJa]]޼ů{,[,+D2V Cұ 'ƯF-~`WnA\p$D.\:-tKF֭r*mt\l]7$aC *+f@` /d!cXظF)~4 rh>h!ˆPPxOH0VJvX&Y2),Bp2̪ + z,^4؁v0,8X >!0pE$J HKTb"%c^2: J'VfR`"2ˆ焁B2(Y.1x,K>#'qzdSCĉ.$PSqIH d}X 3 =Sէ^s%|J ŝ;e\Y2!?}⦕ʕյ$wΨnnE3e|Œq[,|ӻ7=a <=1h_,%MHl(X78 E|TP6@h(IbЄVjH(D/2]Zfzt?hyGxtцÒaQn"ȣMQ3+ǚBյ[i4k]hǡQ]ˑh C =N0n8l(R Ah{x _"B_4nös?)4v{h!X!XÒa؏w+g_fF1x'Xc6"0g)NZ(oPÒCuPnA+LeTouvs`qKaA  @hHȁp%#$h(/-(Ѱ.H&%S:_EXHy #3Zq_ a;jR7 Qn4BnFX$ `1a]pPuqa Jg|%m< w  @@jV%ʠa awtR 6cP!T0@xGpFа 2rwʐ3&[bzc a<BbLVdravv$4 Ilbt>y7 Ψ >tBa3 ``Mp_ta`; EG+ǿ)GG|`[p5_GNYßzǴ@@aÚF˰Sp T8 ~YH8,[- nN]0>Ǵѻ~xNwEx0S0xi:2Ńp_Z[ a\vn wtں Ll1KɑۧVJ3DjDȄL˧z;* kW|F(܄77iT;` QEӼEp &w03m` Ҙk|bGgNx];4p'gNՋaXp鉽x 0p(Kxٟ~٠MjƩLKiult?lNşk2apw| =Jo0 }YM΃PC Ԉ'>EabavvI;:] 6{_}M[# N}*'#h"0:ޯ=^Ҿ᥋޵'m)^␷PnV!~.nwNNI~6+N ^N=ۅK(=̺Ľ"_#!To( ܕ[*j7"ߘ-@*>AqD%25XR`O=/S*mĞ_/UN=\.G.Sm.k$nDYxxn~0j狮iȠ?|ialNҎ^lv?^?̝ OzX?`~a.?//WQ i_OMٲeЖ x2 >lB)Ĉ!E'*4QEfDdJ,U~ReL+=ҔN/TPI:Ş IC}U^Zj PjѡD1.+{,Zm۠ӆe]gb{7\|Z.{0RPΔB>x3法?[nYṪQK~ذY':춐][8/bo5^\`Av;-Vgz9o\/vۍ]h^m15jHmO?L?l8*o8AZ<[kՐl.'0$c@(ˤTi5 U0=D̍:;68dP<ܰE;!G!2H"4rl nh+/>/.K3L2LL5۴2 9N7l3M OA3O/s/ -tM~FT?(T9M9-UNSREtQ?dPH`>C%L}ROKݕQdUAS tXELuHOeWgED4VX* ,+7\qM4Ҙčs]um\sǥ^{7_}_8`&`F8a?{j|}g3Fb3 dRe_`cfoyfzpuzG}f苖ih饣1Hh&ٖXNkp쭫lGtF[mWl~޹~m޻n6Xl츇&=1*$zF+6;=Ƹ*;wY\p-6]mWyz]y|y*A|ե'r-zg!򉷷~g[ h3_6v:Mw8Amh*HG=F7:䍮FXNWš΅dx:uBBV%>x<0>D(΁_''É6b@1*mQ]Udː [b>|Z@k]ܢ 姻3ΐYl% i#S )5J6?a]L'R[ "Q8:'㑬Ԣ  OR)ьcJ:]k CeaMꎎE #9IF*r8w4>c!;$:I}  穻eiH>(B,a:PzZ*<%º3Y JF6ԜEEP·yϔruE>m1yH%:twH쨻Qq!1QrCV F 1%S*ƞ4#*MѰb^MjSPupjk:[x4 )RgPu;SB5 tUι;j ]cy1}cAbTHC/wD- (e$ c٢s}))Kَ6ӷb97\cZ>="f5CVct{hF#{o]<պFa@hۍ-[sݫMrc˸۷jpz9>2ױ$ps]DcZDpc_T:3o'L6uMm'D>Wv(̤!7EE>}BP;V[+ڻS<ᶒ*vTAPbUǀR$f}1F|e* Z)g%3EmlhC4"mA&sc*Wj4wm};ےuCLyYc/<7)~USkY-j6f(Q ,л]ϜlsX5WkM8S{Hb-둤~9ݛTP\GRR{딆wg\Y#JZipbZj oMz3r -kXC63M ;#5uz.}[(s#:Z,1KO,L: CG5(%>2tjP+Դ2lⱁA6l_L6Dc5, {|Û 46JT6ɓAk5iKtA*+7 Y>yԁ9QZxsC'S &;*CIȷ!+k/s(ôs=["C*D =%h:S>s#Z9}3h#[9ş8;һ?!Y<4:{"k`83F':[| 9?M& QCjz1>at5|A%RK#5E^9 BG=У7e:eEOE+:td8bƦ{f4FQ EأDQĀ4Gȅ<d3r[ȃ<#F2/fT;\3p4x17,-:܇]@ԇyPH7 d'"1h>}8!,?E$(3DHB73fK@DrGADB\ErneT&+L0R^{4J Ӽqˢk'+)O6RBҼ2G!ӳ.!:L$I";8F#BR;K9v2 s$YˤK4A,Mi[6,[j2”"K|`3+M'ǬNX+p$N8㥽${%c3xdBҬ̾2,:7*C7ä+}Ce;L.8zP8I '4A,A\Y?J)z8!l2!8Ě4+TL݁t$b!o7 ǤMF/ 3s#F:"bL=*w{GzE#|,M: ü=QQC=wVElLIQ/=%]E"Ǹk2Ҽ/rjQuA~T!93j:u#4ȰGˣ38!8l:׻K,RWDSE |2XG[RHԟ"Ř(kEL\[ƐQb7-zPR\tTJUp1z=5?+. FR}`֞e}M%Hpdm4!a2P-8!&{4(r2:ƛjH-љQɔџV.MRDJԟ/%-RQ@ҋWɌlQ7Dk?%X T\ә$WٍM?4Ѥk)MVq(eʘuRY'YmJh4W G тuԨ]S}Sok$X9UU'7[SzYwƤ;V|X-0>/%Msڜ3̢݋7\Zݳ;O׬eH{ФɾsP}PDQD3\96X1eUU}w#QӃ҃eCYZwY&eXăuͤͬu^_uw3\y'14ع,Z-S3pM`3[bވ P3;J]2e٩:MZUP^FSl=Ȧu%ݜmQͼR7"`[Y` ^kҮצYET^uLUW+ S^ PpO4<h(uC8@E |O[ ߇շI@2W8: & RE9؊&_ ]u=庻6Tux∭݆e^9ݺuc}`ËW%]S͢53R_=@@_cYS;'8Dc8G8&*uAw]f` v^KcYdYX?LeUSA_Ac=U 3ɍvxCepPЇE}%g aM]Y;fmI+;&z+nGFe.R@5=Vك]V6;XgEvfNZF^9@n"<5n =H~fNi6`:fe&TP[;c?K6cV6Z?hv?䦭iig ]Р]mcdjc}VQFh@uI42jz@}ÁE bM74|\Mhx%r% ]+g? v m!dfa5u~j06j֥h~jnv4i>l&dv@혾ym-Rv%^3<ߝl>cSjW>n^ݤ.zffe^NeV37fn5V%!8JLnlbVJ+~|h^IH5T/qNq;qoGqow/܎Ozq;np/rqqgp(oGr,w rkN0's4q?s!/s5r&Gr*8?79Wr;owq=wsszr82b5 S(Jw F#qB]) `,&}&^,fεqr#660Yu ds:v^O>k]\/tY_%ٞ4?KOCvfK'qlWer;dgo@us/Aofj:OvZqOrxuvdox;7vrl6ϱg|w_}/w@s}u4J(ʁHu-+VwEqv#?Bn7_oWv!OyyOoy7-^vx.>Egwvq+w>fryy7zuwvttt)_w*_r?7Ï^7zOnC  y'ɹuWJI/|Xw?q.f{7rWz/jxwq/v}h5vOWOɔ$w7-fF~)}j/y_?l?54wz_z~_zxE} FPe 4L@N,p2FpC;~Gҡ@.8qKhjДfΜ:we;n*%ɋaTF$Hh 3LGef+ذaa¼aT<-lԣUvnԦM ED j[ӕa<1H,ң7CUFZA܎Z.ZeRj(^!R]Zє\1;D4ڕYG~k:0a*Zq.5*Ŝ=xl%-Mo]WNϪH_>y06\q(FquTqYAq|%UiexToeT$TGEQr"gmfM@tN4֔`uFPV0ZR f>i̓8GU)%l/}MaPTGAFXR Qզ|f>uarTFib%L(Tt~ėWJ݇&FƦh~){mU_Vօ)}9*F噱n(Tn:&c.y (y JѢv#ffq*;(-IԬ iNT-N%iF^e*a(oRݣt&&hF2Ѥ8 P s? \afBy'i2k1gqo_VhYJ5e*\n:mW¡ \*UB@;VEAKРF6mP5tж %J$Ta6 hvrZGhvmVI^o%*a[&b_ ԙ@%d_ëqUE66dZW Zv岇0|؞ l}Y=ErW yb,ڈzV~-)]ߨF5ѣR+j_$Ͼi??.|.,x! j^~,Ѵ,S OV0SSޤaЂ:CA 0TlżGii&k|̄1.}bd=3 uK뗘(DT,QȲ9 DzmPbTu!`OMS X)vZJHP,@r`{i[W&{0 |^PA>W4#G= @#'>&}r$'qMb'd+-YP*QJ\²e.IKKF,IKKR|*yLX2d); Lzd. `D|7 NaRәd'KSSQN6UnRڔfNQMfj|%?YL<8g Q23Lh(h:St%A39cfT&AI[2B+\3+ >d)09JQsh@EVd:ЈzhO˔td,3~Ӣ44MWQi&O)tM"R N M6U'|j*LzѿB eLV(eYr6e9+Vv=-iCզgUYֵֺ5mlq ֖mgVmew+ִ]-n[jĝt2 >7.vK:7nva;زײy.w͵rZz5nqm// cu2ao}oX. c~pC hpa8*.qA> Ϙ5F9c8뱋eaX@fm|X(1X3rsXR񌡌y4Wb{9\lf(+Ye Oj泈ZTry9>fM|e0 +eKO0^4 LoU6OdSGz}$#5A{0pL:׾ua׺&Fskb3P3ѾIЏ+lmhW{˶᧾qӞ_]Nw2}x{ծ]r_ywKmnm-ÛS8nzk{^wSljxb+5ƿ>u\xSoS}Kwζ;nn?AVʝ^;/.0mn:np?=3y-m[\U ²~Lܽ~;O~\\eNROG|1_yB~󞧼 x[<%їUz|_{׏|k|gCO|'>}o|~քCXaC"Akn!bBD0ZY_an&a aVv`&!!#aᡠ1Mb%J"""a扠a1 'b" Avٝ>BR)5@&)"W,H^SOuRO$`#*bJ"n4~ `n_ 6 (" zc7vb"b:#*7Faa6c8*#a5bA=&$>u_݅_H58EA2&mVi,у/-UEIԳ+##6*b9. 5:(:#9P#L P%R9Lj_S`@B>_L2%MRQe"c7M8e@:bG\R\aV N-9=*m(Sa.m)c\A%&TU$b bXaV NV#;VX$W#Y.Lc(ҠdFcM"i22$P$ibT%7&fidN$+e&QnkZCAv 'eE/v$G%N^ ^*i$+m[]R48=6(^c 4J%V&NZecdOQ7*y>c;&{&Vg}&5eo"~gc.&gfNoab'~zf&y%y"3Zd_Z^R'%L=vT/bF-_ԊFaڧ#(ޤWڧƧgly:>f{Φ^kd"ixz)>egjxg^#ocg>8Χ'B&)MAO(E]n))JB=ve+%H@[=V$EogmZi$fjK(r#⨥bef. : (ff"bejVf^{%ZŢH(ҩK)DĨKݥ 6}蜢UMdŪ<v*OB$2djnj&dN|Fj+jRfRj*TJi#Vҧdk2 "(f#+*ip&Z>Vݍ_J#kwn$>)1hubd.sf&A&$rF g!km&zk"V6k濊>)꧐Fh*ey&,nhߩhS`45'b]%4(E$ĖV6xmjNe*"@fk.Ȗꫪjzlۖ*n⦩b#p$)P(\V FNSVZ~S-r( W"$2.kƭR2R:鵶2Zj?><6)j &@^$*/l`^Fz(Cfen^/Raڬh(fm%LkcoN"+Tfp:3e>mVnbR^p,?+!D_N[Ɩde`ErBD`®wJl&x.k .ks0o>{ʰ,{6vnj. (~ F/Op2g?N3$ŦG6TD2$`Uo&_2?J@jC b01N虂"*:;.r*2'-s.K#:,Fڢ_U+m\U(d>+(UJfA(t֮r.Zp qʖ2z:o̶2// bg, .0􎲽6/ tl2Њ"b-}$Bߥrd/s/:(SB^,$=8[0Bb~`14mB7(,:e@l.`KSzp.u.h60{+3nf(CupBp:6BIsS*SYA2%v>7+s3:JV3rB S/M8'9k0.R*FeʲNmN[p'/,d/5eD2MDH0-z4t0Z4U-/Q)Ybs9Vvh 5o70N/w7mnoò8;+0Kw~lNBv?u~oni.E6:Y8"7:qsj )4w"a"u+1PwNx/`t`ײcqq>~id5PC0%Vo$bjݚ8ḎKx9 yYCoYQY?;9SK$XyWos9{9kyZw9yyy99Zz߹zWpqiGO:W_:go:w::ݥA1:Ǻ:׺:z q&3 ؒ7 ,>3'CӰS4CPuT'esnIIGeWm{cw;&Eӹ_S@;Iruc;oռk;|'Կӓ#<Z{#+Rŋ{|WS|û;ʃėG|·OUO{o<<П|ɧ<;<2~jWز2)Esb=؎SJ3243_n ,8^nI=\^u1q'v,yd[}ڽ۟7}7T1PT#HB>6Q~!SC~67ޏ 8O~C}=k~#K>}5; W$}w,>WeӾH>>w~;?;~C}H~ct3$o7g>scuB`N4@hRO߲}\ B E0aĉR<(qz}hQcD /rm_E^ȃkt9͗=E^Mbmh3̓9I'ԑC'R5UM4:#ح1'^ Ջ̈κ@rU*ǣMN5jD !Vmڍ C ѻlqD̓.BtBLlg&Xrz6Fܴ-m̈rSo =1z6U{/NW4t‘S{b514i={5ԧeǨa~o?KpI#}<( 0h4% 4^ʐ@c2 k"[TQKoC%7̑cL dIFl[QC#I)=H/Jr G*iEHf@>=,S?N/]4L"]sL?ԏGAݬsdQB,<4BMDS<%et MH5*@_ڵWXJ)1̶eVږNHb "̸(- ܒ\#ZتvݻJ[m+^|/3}߷vyVr7ٍx'x)VW`ߕ7c_#ejxv-֮et;n䍑܃Kzbww_[w+{="Oa{Gd|6Xjeh36X}YָhFAzH=_U7#㥬@,6<'&<$e\HNg9 r/뙜4,- ˓C/sj9?B%#?q )?gO37\qԑsЛ؃GuwrΛrwⵧ]O^|eu0鿷{ Q(@s<ށ;%Cp׿sD路Q0!Ab XRC ˜Ԡ.!a p,iQB dLA- Y*+! )bK03V$!;̊C&R>PL{V"#%bb- eCh<Α!cq &ERK,q?DMHHэ$O]3fddIĈTr+Q$"&eHSu$ c)ʭp) 岬GGR"Y%cU,CZF@6Clx)*򕠔%* LVm\#'̺r&M 3A|\_=1WN^C8ҤB56EY!K!Pik] X"J80􋅲t#ZTD&W }Γ9&Qf \fÕA+Ý(PV:S,fZ(wΤ!L tk')]'(P%R4fTiһܦEYiL,N2T*L9Ѽr^ҍⱌXKkY# W,4V&*̡Φ)C)иMqa`bmnVokmo{[]q[\Fmnnk\fصnw ]6Wuw]R-uk^~n}ѫ׺{_Vwn ,׿503 ` kzZզDI! 'fq&fbVŸeMl7Q c!x01}L#;m#8)^r_ [&W4Fk;yWf,bd?9t23Ϲzn2g/k4,g-̇NshG3 =iCҔt)N\4i:ќN5% SҰ^jVXB[7h$_Pjq"H1lgg)vmmo[ mofϸ͝p[6n˛!w=cO2O¸ziJ5ЕYb I(fĎ,HN&NddH_OiT(;kjfALYrIecr[!1"ϑO2;XŌɃޜ)W|+ D*+՟픀{c{nŊ߉ԝug{pN:͎|I:wcwJ=xGRǨq,ǻ%<<1Ϭhb& Cf? [Ԇ#7[IGd撊,?e`e(xu9qc4ƣG(jOn-aV9V1bHG1Yb[00aRļ?&YZh>v(X0"&^ʊԣ z#n֏ 0/)fH#40(&o#ZbA"jc/J(o(`Pb//^v(]Oc.v(xWCkB#/ eϩZ#(P1N$01.h opϰ OvJ&*@,pohPF8ɰl"! iA*纈.a>9Ke Idh꯲C)]׏xm\q?Ψ ɜ{ə$NI1h-:A)#`jzϫ*(71gr"تg2TjĄ$p0tQIĉzQ>ÌJ1 2r7z¦~h%˛ҩpfm1ҠN"=(LdՑ"DBࠞͅhrEe.0i) yQh %Q&ђH r ;~r4iC6Ko%ndHI񩔨 E160Nɍ!2X $Cp/' 0a4JR$>L!$.(>0qh/1ҲP(#/c@N!A5+@YqN\" v3V*d270OP,)7u3_8ʬ1Er'*U >̖Y ? tj bT0:+c`v 0bq,өh!HvHOLʕ\-Xd @!a 6*ĨP7|1+f* Q62ԣ+xj S"7`͔01.[x)+c@(_B^*綂M2)0DkrLK)\ЍvO'/4ep`X=yNQ{"j`Qn .3'-Mɢ0)I*DLJ>B=qdFO-OAu,peHFt V#A2 Tq(d&J/IBQ}"3149|!7GJ㢴45STd"Ť_KI=? *A `d!;WH'Ph|!"G)EEZ҈[seq(JgU3! k H8Їb\-(&M5n&E1*t|f"*[cUk{n,>P!fAV<0BR}@UfDdT@Al#k <%Scq(blP4'.Q+XwI';Y,.UBp>) jL@AmI&]OJaGsO%52` NvL`)?SEM%O%#n/xjYkK*{v"!!N>d12OrToUP2D#qnԢ%tVk#`o6~QPCp7K_|bŪZV(IHU5(0hW'7*Qa|E)w.BfxGV2mxтNik;'ц"@N_59LWYoTAw0"uhC#Ico*'aa |7((hX/m%8/-Ta x"Q}o%nlbWpi6+#rS#iE>Yd%#%e o9{6LRy%"w/jkexa ^R.TE)gs2A 4A!o] B0S:"R[%4ٵ1 [> 6!;S$!ja]v8R5BSlr5YhԜϥG:/wY[0YVr9%+i^,d|[=TY `lyym(JsU{q+U(1 ‡~Qt#Jo|e$ih$rCESeԚVI1`])qƅ7)ϲ=s"5#pMXəHCϹ"L=ӊB)4Jy ?RB'PSDB{1FGgj~y .ҚڒcE}\S_|vqqP9mİqowXUXS=`mch**;5tV) 4/Šo2yɵBP`}'guv S'.A#-a9mтdz){qcݍ4ո&x5Q}/.(ey?崴Vd܊)*|`?q|zG0n&Õ߀)#q{c *Թe1R5@',817/G+DYww;+M4'&Y)sN;"vC|oͩJZ =5"77"75$rR#;k6iEqq%+q z!5\5-2s(^}ыFz)sÃR<Q`})LaÉ ưFCǁ&ԩ2'C-vʝ# ȁ3GuiO%K:B0u.CyGZ3%Ǩr-Xȇ8!$y!DlhtdȾet 72դf "b}hE2ГLQ[fF Miޠ(x>e[MwBL_L`r\q591ڤ4L^={صs^}_|ޱw]~I݂7`5a|!ia! Jb`%ާ yh`m(cQ97VEA[BeƙIŠj= jMNeV^eVe^~y$`IbfOfif`&g^igUgIL yI-i-եi(JC ( 1dBLi2 2VJ'L*C0~J&)+~Ʊ6:;mV['#[O$p) N6*eTNJ2Ү2iJk2Zﯚꪨjֆm|F&9eZqfsf_d_JyF%j.j3nJÚ6uECQm5O; VCt qh X$O 1xMfWݚ>ݶko[kg]>w$ڡy-6&{+n$x Q?vRK- XCoVo"wӳݚ<9l?. 朄$$yhc})6>l/VYVx  facnFuOB yK'핏n _x5Y6I!p7l>>$CvUxΊCZnUD(9%GKp%4M*a2al!ݯp .mR{'DO|\.xQ~$Y=UrO4"GIX҉a*'Uo 򮕏HCl2`rq\G0/jf>& 6x #T"Q8۩j${8H Kɺ1.q&yDQ-zO'ٌmlC1YF0h۸F?}"B1Y T6>6t<(XH=RA.VrE0^=&^&$D>9F,CJQaߞ:K'jң;:Ԫ:odД)UYI44 R lI lΆ2Ɏ_9/ ҔxYxV~`'ЇB"C(۾8z*-i?_pxm8JBe'Vj,Y|y p!5悦*j"t0@v9P#qǂ] Qy@Sjȵ5degO|(ήϡ zXqpkĔc+ `)BJADUMw屼#JiIUCX٣Zֿd%^N͊( EWc6je06D[>{jVڸط4X!R2GƹQ> 4=ϓl[ٍ9Lnj k9ކf{[~LRD`vDaU]CcZC']6^7cX6[Xcfc$_tcnH2Bg86IF1Kc|ZQE--$\$~g|,Ɓ"4㤉ʼn9+#HX4b|=T?aXZL= >CV[3cZU Q_KQ=1hVCh8A(`,Ȍa?4L%@Q/0e4⇘/XUH/1VD8%>9[cCxH2!;0Uu$`AT#& >Dȅ96ehwIyKJ"98(GR_!f-$MBhM!xԓ Eb4Gi|U=V.IO>ԋq\?)T^$PiDpJ%7 Q VUKHvKċKR\A"yWq(CX~rfG~TSA3Z$QcnI5D1rAd2C{'rcpOȓ@OTP8[PA[uB\.A`V9}F5QY:I6 e*N34=iy3of|W3Ic5QMeo 8蹞U$Ψ՞GD`u0xeUY1Q: G2ai["S.FȘHN7H i֘~N$aI1gBc)]YXP ,.0Z+t7[<,z5[Ǣ7[Wf_oY5$p6f|hhBgG;RhG##YhfJKD[dSeYUPUKD^eSJ!`꧁I> 1&ya(MʎASENX t66hcc`qP؆Oz,brFʅJV7c<8R^x?qZJ:8ȦB|9nZg 0*NЎGjjSh/8w++k)a\vPFR~uKfTD[XTHh3Y궂|FJk)K6gt-G1Z%7Y|i7r#'"n m>K"1nJƲ^nK|Go_1$f%B(m_KnCpek&ahqwr7{u?wyAxsDxcx{;r9rg)%w7.1yXGy˷k{u˷s~y˷)z'rZg[t Oww;{뺞uzz}g+ku\׺}k˻{kzͫ˽ Kt%o]Jp`pI+o`Pk +AEb2SX"A8)̘3g~r+Df.Eg(k,}4x|p1R㘀VJ.s.OS(? hĝx/zA4%&XE|L)5~6Z0S%*B7dTH7{h"HzVIZ_nl5d,JrlvLLw܆|cy̆zʒz̭c#tuFj Y͉HFى}4jB;eHIXEi>H5x BYʈzI]iɔĪ=oˠc~::ԟZ;HL!L] 8 %hɡX̪J#BCX@HVj8#5#L`yET`~,euDc@\VL-awIRiQD`*qáLc`In 6烩Fk 2 !7(!X9@S[](I<YN_WC4p dU*B牕LI-qiF ll|E5C,N{j" \\=BFYk'>*}EEp569J B C60 Ф}e͡Ȥ1k9 Mf;{fDYʬf 1;ћѤYSYc#߉x?*4~ҸZQLtH\iz֊ n-&nLԲüglCu!l51mڷď҈\wf;}ɳ^̜^ISi5Nլ4TIDSFX2W~vv~k+Yh#.Ps5R0y`1L4& } qPC23h1Hg>Y"D$v39-1N|1vT/LLHHG;` S)[*ސʮb.Ҝ3*-ܒ/kJ7 F&YS0@UĆ'4FT#aE>pIARRL5N?L"TN DTEe"WSgdU"II:{'邚;K4RAViᛶjJapZJB\G Q]%b)$Dە6xg+ud`ކL6q(~H hHbE >1݈-*b87vWazFS9Tf9K;)TdOOzoofj鬚֊ZzAD3CO-2vVAm\tlJ!EdempGp ]S}p G!& l& y-Հg3oOv@|EW\<=hwٛ}mhM.d\b Nawp"mo$o>cV:wr.']rYI24iMfb$'h"Ӝxt>A E*K/bm֠}CllHk>эkX>8帇mCht%O! #ÂtX"'~v,0"\ųB-uB] gtʢӕ\%j̖C ,!n 5h/THH},BR[%Gxvmq ! 5;-3Dd:;͜in `'nZd}|&'OOVX5ޑ&105f̉H}[fDg"s/N?(; eM2'Y\E-1uJ;aq3ZdIs5"ghh3 ̃"% %կEiyrMb/sÞbGŴ'gb)N?#miH:3L1ϟ6*2I4Nfor$婢MWJU*YҭuIX" 4L %\W4xkW~ ,`jXaJ׾B,\+fֲ,g:Wծm]pFVb-#;=mcSKWւֵv-^S[.Vլ_ WƂq;ػVEnb0X2wErYN7ly5k^Ξ7dûo}{_׾-d&Wn{.O \G&éͼ4զiBݰP/3bJ5q_O)zD S 13nˢ|xEH vB6c$c1%0G,2\(;u3P'Jߴs.i,Mf1 jsE!X&*ValL>0Q.T'HP I#Tdzx-1\cF%FpXt}xCJ*$IEFw 5T%XޏI7Ff A"yM!duehͶr^担Q85s4sRL&wj%F5TS=&wAcƔîmdh/3wR 71|V5qgp "2 ۄ\|ILmMwe"bD05?-jkZgPn `AV+Yw2Y<M* ;yC/@敐&iUУVs'VFUCds9>0t.}LVyUd< }3ơˋ_tp l*M#Jzѻ.v?#Q bIa¦( 4.ysѥv bck7v 込>I}> c@AMI᧭c uB`?) Pa =K )K"R I١>ZR(W#1BAE 빑#D¸R 7a!)cra P"lNz6(1(b.As2 9ap۴ 5aP%rX6Kj7 &@!ek<^k>"6 5<B ҖC>-m5<#s C5-Za'd XHA]EP5DWva5^fSVJ քK=XTփHVi*_a}0>:y8KIazƒ36 гG\ce}ߡg 0X0!d~3?QG!đ>|!hLjC>+‰m9=QMt DxGsҫ4T> Y'M'%y𺡋A;やe Z&)ݸeDP;2٪ AMp#5l}`I7\~ٻGc[؋[C A}?ZUQ=+?5q R}E}ȇ1Ae_Mb{_#܎͒X0ͤQQ𨪾 ,7ӹW“IÝWFXƱv;PAV"|AeH",كX=MD]<G25Ma$mԣB58Yr,-bա-^ŠEPEU(Bd}C#C{kDRc)&EcyZ=.؂1D}h d1V! :l8HL8IWX^xO0?m SnXKqfԞ2d FWE F@]e ^5ex!| =  +kP ,E.JC 0R/Ζ3`GJgmȑeĊEt>;c5֠V\kg]ueOgupݦ2%r"lgV2TsbݖT4B E Kթ'6ED Mi˹T4+qpR/{J#0,6s{ҁlSŹ֧BQ6(J'H4;l&}`*(*kJܔ*$)^f63̨Fi|a}GeW`)j4)r+^MDbl*ҪӌM Om˂/ P*|mזʪͲP;0Վ.㶮N.v P& Nn.6ؚdܒޚZ-2-:*oVoᚮF>oD*(SP3nQx꿎ԻF~'caY@0NV+J)"x> tRr9#2|s 0W\ƪvjpʡ1RD3UZT˰EIאt[Ժ.Qsm(cp!'I:('\9Kɏ1xiU\[*ۉ]{\]>VAݛgӕyI\qNcBQ_,׵C#lF+ʑd&:rVëUM3{NkS)d{\.̀޷߂%Tg=gdɐ߇_&{P/h1;EWQP=xW Ax%tҋԻ-ЄTQ~/]ôeA/ vKaa]{j>caָ7Q*҆=Nj2q''691@jqS6?D2>;q<$O%'p "L`}Wn p#ǎ %9谐Ɓ\rIw1)6oD2y[6 jSz TOQH%J/ԨJJ14yPY&eȚM{VSmվe{v2e[>ELMfXY7w7oLJQ>Ȓ)WQeͦ Z{ꧫ~:ҳ^ۋ|#w͇l~3{EEU>mVWi*`43H@5S`N( \p/@!>BX<%#!'1dj*ddAx $@Bĥs1,.C BY(erJɼҘdpmY'4/%{~?ǮxKho 90w"a(Oe @'1-b,c$Ey4iABf.DEfಖGK?Muj 5li7D"4"Am}~jNw3)<$;l{1CL)#80TkIP3#pjl )ŇUpU3 sJבqØ#6].F<=c $c:ϻٮF]34k†X{bKF Ndn #T ǬF|o\E,FD[Pvƙ>X\jlvl'|S hdkYGݥâ0(ԫb<Ȩ,ןb`Kњ('@QK"_٪m.иm-ڒiIID-K-C @)$#\G9-T@Qʤ(쒇QnM-IIخbn{ i/5o@pԎ/ޯz(#*EӬ&ARhAa:a8_*ټ9` kR`lp[+ZE] G0U\EIK pyp0Nߕb=DCYcgFn.䖯w xҋ.Di GyߪfגG; 1b.;@ R#072#?$$;r$$_0D1&19r;2")rJ4r)CE0v29J!z#R-a.2Ny z(W#v3+s3c3'34/O22Ѓ6s366{s=2,N1,9'%-1u\$='x03@{V0*`v5P S(Mά$RΨI!a{֬SVO!nJt84~>Ǝ ͚ʋ]oK-_ 䌷c!RUFxLT"Qux j4zE"yYKNmRlZ46ZuZǵyMۢz]n5dEtyl5{ 2u=v= t}Rm/fPLMʭ_6N>|RR .igvˑV2D2CCT(>snm2ȇHfUhdLL߮8NL7T]7u[wtCvsww%r=`wz 0=wz"7(7w4hxpQpS7m 86x6GLz6C9s8/VOux746O89/xm2]mp`0ov6|ԋ77i0wUREO8Ixxy+9P1yx;c8~{vZkP9~cwZoyùOo7~?8yy Q8os]m w]s]m?:cE@ d;# t∁tt 8 t :ŤzḺzﺮ:z {K±::#+{C{/K$_s;{C{;_[;{;M3ǻ ;| mp:8kR(8wv|>!`C>i|VƻÀƏ|ʫʳ|˻||[|||}[<+ <12Ag,:W=o҃}L~T}#U]ɗɓ/=؋<د}ý<ܷ=}==ڏ >߿=~#~܏~'~C~?>=g[k~sޏ~~O~髾>꛾~>>>٫=܋A]@,|ǣ<{}Ag[dBFzpkpOA"kw?g?׳4?_?c?#߿&D&b H 2\x„ V,"ƂƑG?idȔ$GTqbD1i:M;sVL6ϕ/Q\yiQK jp)СJ)SY:eU@j*{lZGuiTo P' LY12PF0bŋ+K$4++ sf͛9wth̓8}uΦAVvlٳi׶}wnݻyvݛo3x&CL0=I9GGO]RhƗD~RO}ݫ'KO@S/<[P<4PA,p@,A3oC 97̐@;)O@{E1#D3`Fdx 'TRI,/)Q,u2.' 2+q=4\$uQ :#\#||OsT@2/EI4Ԉl24D8 8=`O5uTQK-NOUՀHURu5VS9 URK QyPa6_[%V`=VYZ_-Vh{%WPZMU[gWvpmWl5k=pCf]a[I%Wn-Uuus|]Xaمr ֗~ucnT~nuV^tM>6]5UxfnaqcSb_m[ZZ摃j]ZZՄ7mY׏!1 N3>^~hԖlɶ{l[zo[o.\l&qG;pώn-q=q+?)w;pSe; Ic䇭% e}/_ox^e?^{e yP%x?|e7ׇ!wB!(Aq?P(P@  MDp#x~P5XB) SBfPˀ` ~5t_ ~""z@/2b'iH-._$-De$WJQ>xaݗ=]؂Ɛ5DMw3_\>Az޻ e:zи2KeVzϤ6m&sĦ2}=h* E2l{S^~G>}C+ɾb3h7L|J0~H?2Q&(RDA:rUtQ#_1~%]Keb4/E}[I'P|/xFMROR~ hVV%*<|b }i"sI~T*UCSx_j\be|%'%(-: ۰y+ż#;)UR[2I3PTÆj k`9'2TLEF'UX/E* Jǖr3 O^uAYP4..f=] ˁppLH\.DKzxo2S׃uJúz;ssͦ;Jy/.ʣZ}ᆪE8gT5l/~,-ѭB쬎'?wMh-i/1Aă/%|Iuko[+IK0kH)iѐ9^#KU<9uK4yA[fk[Nf:zZ;zmPW7h=ZC﵋p]HCܒ$)>4EyoQ RѻEP]%wda *V<r9nҁ `yJE/ͲL+]*gNjv2Ɋ@LXJ :'.y6zihlֶb D}fx؂M(mᶔivPV pni0ղPM~MI PKpgڤKJH /0((\Α~'(}}.j+<+*Š\f(`"ɆHNP*GHi毢48iJt߲(>z(߈r&N(&ѩ' }Ѯxp1*0 c` 08 V yPsZ ،.n+p kM+ֆW!+-Ҡiւ . *01zD󪍕fxNK*n ʂLnőv.p.qnmq}) L(_h M p/+Ȩ(6s9)qΊ-ݏ'-Nq*( N_ } °z) `0 +isΆxک"Rm5pr! zZ! !n u kٲPȩlI Qg9ˋԔk۠J̔Q!3DQ˂/)(khV,ELK<*R!h- ,>BΊ _o.(glB;ỉ<(hsT,Oz*NDMX|+5GrԀϠ<o r06 12!l4 ր ֠ K4x4 QMnr7c oMob-!r!tp !JaB8QmC" aM a>,@I 󶐙ԴT_`M@KDB Bg/'ǓR2CER*s(o4|>>ݓ)s)JL木L:.=_RQsNҕAkDLWE*g\UQE)u4 "=/k-u@?Kb G0cIT*T` Bb` z`fh`@ʠ !!TS7e tPդiXtTRA !7a@! ։PShMՔؼG EҙMn: G`$50Ь'wap 9A,`At*od( P'AcRbY(>)uuGuaUJ)c8)f!THw'T][mNXYCOW]/z5sFD P?mW4*qS N%nHHo4o6qNfTh!oPVaM6Re4-Ot (Zր)zq `Lz`4vT NEkWtA*S4 !apA2!l$Pymoy<-y*+[W1))S(a\L]wU;ij_8wrPCW'\AzߕJA%hb*!J6DOB(d230R:y)}x*7Pvb X||lḕ`yZ휽g Qg@NZXn@x!l{_tM[PQyLJikog4T6-OȚt!oo!'z~B[ E$=x&zAx"ohv(H܊lsՍ8o-͍&~Y9zv*uPt5CmoCJɶzȽ]59m+|UQx1J3Ot\xl`a,ietP[iYJ)NjM5Ta!?56`I5Uṃ7TxaF{r%s=o!\֛3w6x}pmio}aNWMR秧Z%Wq秕7XA:|>lEaGL`>wMY&%.{ht}\/i-OGJϧD_Ҵ qJ.FZ6ת_w 5w󩘒W[72P9'%'~Yb`G2F` qkՔ8ta#7T؝56o<ZXpRt ,Mnƿ6 ;6x[5AfTgzfz}xC|ĭG]7e:yS3ӳ3>Y2 =W߸ґ<7ov W?v @,PDeX0jJ,b(MCrQSG@j12,S"3̓a:< ;H@A܄thBA=y&D/ ŽYuȗhfj'׃B30aڰ qe` =!a '6Xq)eBKmdQjډp}*c̏orbF˄|ڷ6C긙>ȠES(p]B*٧òyT=l@t렣cw ABz p2}ʨ,P$32υ03_~p-[gD4I|%XPpXJq)~A#(RAe-;FSώB qG~+dA~ULa\, TV"%S9}S$DHeegCuydVsVAI ڝOu^gL`e/ MI@IUQtH[4f[@* O~QIk ]4U5)u]t\^ŔB[AuCc feEYh(Xpi&Ը8+ah,1!8ϸ} m/4d(n( DC1Es1ƕS"|z @Pp(Z6%C&xlA2D3 ГghAAPX4Thbqf2 аg=B22 4 "C $d 2YriPIbӤ)CIXK*xaaYPx"Qy*w\[!9D@5Qjf.^Jgu&UyQSbRJekH >eTEYZO)+O&JSKlx[[QE߅A[{v[>Ysyb2ѬK]iA 24o&HA<(| A=j?hHp4{G4G̃LEwXȀf@ G~Yr4)BDSV(Zw.LdQB7$+IZ+pNs{LG;Aď&:/nn!4TpS{BInRRcIDOUP+y_̤/Or ]'<ԔBJ" V_2.j~ָYUf[ b@V_xƐL"8AVd gr(Gy{&u08>@2b@P>Q>(Rض-R38GٿEń"XnѤL~jɌ^C=ttS2:o+ut'e.в*1 (alH+H2|$)/F"JJ#b5VūYz,y6MF0Rauw_G If]"ә*VnB)HDM4i .`=h}У(Cąr7\B ʭ <>+2jq27R$ і.)vZu2*b =HQ$l-*84ZJTQ<.ƢS [O.a a)ZcdA<;9A lq,X$WZ)*!B W;Uٵą3!3ʬ VMHj_-/*Ô,"Meel~Bu--.&FJ*^G9HCp `8-n^-Ҵ+O:tvvo3Ir)*sJFB72DjRw%)L=SRv{*TLPa ,MjAyr0nlvmpZ;@̖kLxR9m3r2 Mٿop[ c}zٴCiZCN>_W fQ]/u#k_-qaYL}ڢ`Ȁ-sGDG~F wTTwƖ#*H8KmަqLUf|xβUs&.mwx=n8yz8d;vIDaXDV^Jt&BJR+r*o`v%9[&"HJGH2n<Ē=SqmX: 8}E k1.`!S\E@@Te~4~Rb'vEkA^\ RACOL7Y?67k(W-cSqrk}XfqfHvke:u|+Zvb3`` G wz78B>cm6؀UM5:b~$bmp&|'"tDo+Xq;:QJE(`C(B<XR,x,<%,fW g';Xcpdy-x9JÆh(9wG( zX'rklAUDg2/aNM3^'NG7s2uQG}f}AGi*^Kvb7_u(f G[9xc=U &`Vʈn3bFVw:͒'fxDbtx\ѕ{Df'SbG>dnFw(d)7*ŨEnxq@V{e8+W+J+8ycr&wGpyq؋:^YUE&_efcsnhE@ ~}8EZ~ 7jI\uXDg^fNu-E- hUكoq,HXmX5v<q(t`y}c :wJXݘakV95d9S(FY@`8khUrjwTBE;!IШWtDiSkNq_{Iiq9#q΢(FvL6k7|4)ɓpm&?wA's& a7g8ar vfC@4 Ne3a3q"h*B(ԧ u%A[>Oz.DBC"OO6s@.tB)4Zw60fiUE. cAiR!#QECVt5B%t OKXB\B.6CjNiw 'i 2C!PE$O1C@6d P jլA׬e+D]AKắBE i EڬZeؚ6$ޚe !4hZBz 6{@EKӨ.2 b0/5k8g|V;+>@L{J˴O@I+7۴KK{7[[۵\P+hX;8[<>˶`D{^; btV+C x˵g+ZYk|;S P;/j{k{n˷_[ Kg`g}KV[W˹ue[QJ{KFԷwDKN7pRbಌλJzDAԻ/Ի ܛ;һ؛{ѠAЫ+yZAޫ!۾[{ O,dk<$Z' !l)\{1|+$%\{+0F\/,,3*.L۽ܬM~zJ^з|ؖ tnxl}@~ ܁|=ݛI~ qeׄ-T@Ֆ]lωm\wN餼 b٥~e.Qح^ƢnQ݅^Z&@.괮ԭNڢ,ճzJ=SNCȸ ۤwn-Fps} N5F N ț}}` Y~M$m_aNսM2m|}= _A^vL}Mrtܝ <m]͓ -޾z'0ZAEۧ }:0> %zslԜZuFkZPzW+̨;ޔi\: [贌 5,7xD;!ѨI &18k1R*<ݒ6/.7sJCKJ7S0"ͥvdq3"Ͷ`Ozfccͳ=5PBu{ۣyGvb *n˝`3~p=h|e-s.PqN)ІS(~'9-^iԗ 'y 3I r1}LD!(iWf|F)HꨆG8; 4r)rD~f ?iEWg^pv$ #QaPE>h}$eB"bP!@C[C# `45+O+J^2irkb}c}ֳA`=J)L SD&aR)AyVX1ib,8jNKF*C>Qd4Tz9 X;&MSn2(`F+hx75R:*s.HBP6J#|EJH9ir9O/5|>EQZ.9Hb!#$ALV@6*ue]Dxd^T*ܥc ʼnN8 wյRb @)y|P3?skB>>f) 2$9A"//II3bL^B!bKp va01e".w˸Ue&͎c%ն- '+ԩT U[({)nm+"mIK*㚿N)O,ūڋgR2u>J% X~fNt>I5ՑVj"RȮfyFMXIR~ y9χ3c&-ז%%a.-Ӥ{!.jJH q` Bj-v%͝.#VV-T4ZԦGva}h ֶ&FKBkep.y]eh"]"1l]l(`IhËɦvu}.P$5[moakwd[&wmme[v[3&p킳ů nmfoNu=l/[ gϥ uS$wKзÛxPyinst7'~y;x{u;wi;v=\ӺnMrپ=tDgIt=fnEuo'ylv]15ulc 5 tHf5<Ɗκ:uiXl! Pld9 4񉊲} Vp1I~cu#g#@jH7B/>S'ݘ@dmwJ&U XI0pŢHy iLmS/_jGR$WD# ($q 0aRhQ{'##'8sJ (MӔqBۋb%I@AY!2\8A 3 @\iqYbѪQK>)?)2Q ۾@4  4zٞs!*P15CP3Nsه]H5ؒ:>r}Chiz8)F !Hű!T6QQ F[A0!{'{Fjz jYB"",bPPxaAY3$1U\31茿P+k̉h̚FTy- )R\ @ePK@:ˬ-P 0` | ȗ)S :ńҌh4 BPLя) Az2$_ټG $C)Ū䙡:|Tȗ"M_ĬȔ͂ ј)lG!!9U!JXBXȬ(9-V!1*W UЬ3ư!;D"P+ ^aK? )C6&uu,Yz0=c=C%yKHm\䧻h'Eؐ|:jKQ U5 F.YHj-?ڌ%X%mPe%9aUbb!3PĞJZ|M"!*T"Jj|N[IB8KKnKQ˯Z!,`a糢ˢ}<8z `L* ‚ ] .,Dr`^%֎ 屾IŞ]6,+Ka*۹@&ܤ1bFMb T`%L-q-4=sIC]VRM<%du ]k;Kq'0ކz Sw1OڑP#bC*X0餎9uvN|R-[Yl$SUU9P)ٍ \#Zkg+SV uv# ^XS]싪?r@ɪ> A[`r;5ܡ9Rqhe Ql1.clj_;^Tk*4֤wq'ʑ@f\h*iIVvc9eNz.  {(EYۑ}c KcL~#A>$b hb>=?i ޼J$OsE*LJ6Qڽǰ?TAQYˊt tpQiƚйaQ 'mYSR~}:!PP9cjʛ%썁&S@^ȹQ.#[2km@3qR QRmQ뺢?˃r&ơH&)J>咩&@&`){-5^[T3Qw'>;⎙0'%+nvݫ \ZW!5aO3"bJJi2o&GFA0hҞ.Q8c -L=Sأ0#Vz-L>4JZdMӥDqfX̔R/*l'SʬtnM:nأ\1: _ aa bHM vevcWLPaavea5bjWL9#fbvbaObЄrg_f5aWpvcr'a0v`awnfn9m?iwewfwe'wgvg6s_w|w}vcg7wtxx/^/Owcfwv{oOwpzxdGkcv'ywxnzgeWxhOvyGz7wGywyfwuylxyyo7a_wv7mrx7r?‡xrww|a|nj/vOwoy~?woGķyvWv{v'Y`2d雜Ì4M3 YgKM >(B,~ 'c dv-%WB_/  }EW>3X`h ;8`ńFth> fDp@SE!]DQ2UGOɝ Q2aN 4В(i.-reÜL\*FKiF6"ٔLI7'ʑ`mN|(qeO ZŠ-8r\LQSMi8+c%Rʑ M;PyEi,F`+D|Ic17 >1a.X͇˨7dΟWW_~/gk.a8Aˉ?(ܐq tQWa}6~JfxEa]&z^ ezn%ޕK$^vf֧cg%AZwO!Ҋy#$<şb\cgQ])M q+Ic}(ncIʭ2, MYD*RBi 2a}2rW'ii6P+*V )$ Z$/}vnH+*Z.5S-Q.M,־~˝Kܝ{%9$vkgpI\ OQqƌro5wu}2\Ow\4QZ﷟!M5ϛo]o4zl_4~^τb|7ƥD (GwhHC̄vhi]v3$KSԝlL5x\}yLhĀX8A Ae,K:F1$ (.hmҹjaK@('E ͘Esk=K Vkѫ\Z5$<:aL4*όʾD$4J E Lz_w:hB#=,UxbHrC;%*4Jykr.M+1`jwly1b#"^1= <>gڮyi(z5Qhl>#FC@d`ź eY(@B c5b'G56!tꋁL&Mhh#.t O_|PzDQLGqb](i1[evP"tSL  (̜(rT,.Hh'ñԢ6sg<&UbӰ=QFBD&JI?)puU0XwH`1 Al!}&-Q" Ѧy~^omO'Ij\fgޥԨZ @4mmQܞG$}fNЦ1e\KS @Ae=VkSI&tOnb1J`j0nE-`X4C_ D/u S/h]0U&_cG;qklM FX W.,76.2|T}R[u_85othhfN6fU  "v"ٌ"ј,+SJn}%}8=ɐD]$\+FeӨ䳃u_x[FOva>szgk5ZB鴛W {ZQ aҿ8-2Gynֶ})#1t6ɉ']sDA7npK;GWZ<=#QWr>iO&/f2ȺE i?v.#V<99NrnphCY% ylHҐMc q/p0ָac2퍈΃ XnMyr79Rm¨G-e:65/۟2N7\C3p.qa$H^ޡCcw~2k0iGL3g<ÿ`$Ā 4[ @NT^ &0X3T>$C9)(MaK_E HӼV.5 &TXɉ0eZPcR\]]t1֘FU TOEOn WT fڮy`qOl1D,K$Q]޷x[a/Q$eQvǫ5I-55"DS$> ՃSFA`-B^mAD;)[T.>Ѓ>p(C>BC >C CTd@C4XaId=D$lAYu\JtVOT;)pIV1V-_ 1W.ѥGGQ%Fiu # yU DQ E"a"?yX E7T-aU Ԑ)ƿ'Qe $H˴5L5QҜݭ G;2 &dGi- ` PDlBXe¹Y@0(>g E>p2@,B$' A'4ۿ]' $2żK``ڏXYL]M͍bm%eLі]! JԔ\R (~]]%͇uQ SDžQm׻ anՃyTRnM5Җ5X:tuCI ɷ|>PPEyX]V\J`F:#th Đ(C Br6>BCC&$"wf=2B2ZHាg}`Wp}`GWm"Y*/\&^P}JST\ )Mr`Q&@kY %|)1P}bY RՃĕ,fc0-"aq(TIlqF |f%ҮY]š񉦊Zpy"N܅%PPm[_F $,eѲܦ|B>Ѓ.Cr2lAIHHXZ%_O]] \N9P4EZ=Y2Z\TVaFoEN$ZLp m`n4t&n#;>MMI^Z١R$ P댈z%xi]${i IyH-p}dIeA(K4 D cٶ)n!>0[Kn.Xқ2)Nd D><Ûˀu@"@2ew5MѭIFQ͂y#N3-]+z KXDe%>KI0V&.PY #01M oo% hP߼(\2kW,WۥTh#:k,K2}^pL]Lba9kWWt^gꐞIvxl߄#f+n](pD_4o8v/icϱP"s (>lZ8qդ0]-X*`7ӗ<1P6py%^S]QWjI(t5r۠٣UݤWO˒9LѻufzǙ9r K6vDrU 3Y`S$ޤFȾj \/܎TMٱ͞Tݷp2GI:L]VVcO\x6‘PF\<ݨeXo5MTQ w[5Z-IXM $DɃlqՖ"̀ 4bٞLV7.}ƾZrш/zP_4z"p}X`=-#(2>KNʒ Eĸ0Eqdaϖ<[xPaF;F[siK:[,eA!Vt`GhB]М!>xhƵkuƕd>}^DHpkI$gR$A;*a'I#8\Tl IbT3.уMqr̈́IR+`Ic~ rr& JVd߾&n9ב/Jj#$k.7'|m#pF ˯J6hlQ d$qkA,,r*̧ k::N*-%7)/d/J#2A(eFHQeȍjE" Qnͣr4!{p#&McRGM "Na34D4JIMRpĴ*UNG"6!ˏ,P.N7 >HR!Ul-Jҷ6:ګY*xtmeKwH? #H+PSF)bԖjKiˍzYz8iTbXӉD[bX4}I(ڶ, LU4s9kїmE'P-_SpӼHh0Gf0ȡ#N@1oG2K%KB&I"hiP_HE<ѥGɫYe}T JX{2}!$V ET]^T$ՓT0cD\[[cLBv@:ƅ(NT7T86y9RdfKK%{Typb8YPYHgE*J]ZYF96q xu <LPh2W',Gy8~O Ŕѣ }aDFTqN>jDZ9y 7J.)1k+F,`h yiKO*iS!ōlՂMxTxz'*MەhR `jV 2s(X%iS^H2 8WHkUt/ε'B'Wu 3X;RpM$TDm+2!%k +T>a+i 53 Q=(*a;}Kɖ4liD?4tӜO}jTԬn_ VZձ5C}kUԲcj_թ&uj4ؽkcC;Զ}kgٶ.;n&v-ng6YMlwK[IL[wod' m!d4P+ouz@Y$ 12@P(c4H=yT4+_sҼ0ks3mr+?҅~}<zM 3WǹՉtG=[o9ُ~vO=7gyϝvSTb:^s{N';g|nt?<#sn_)~=5tNU?!oZ bpNv+#ԇ&vY]k*xcH4LK0Ur iAvK2C3:qM?i"Y:fA_1/*3"i-H]Jf?,.E#%nP,'/#r"U7ք^8ȍf<&@zEo2尰BGЧaH9fd-tǖU/:*^-cRĜWQzb{GlF`l('CJEb҄y"b2)4 Hz$nkCHrNJ%!2c%%^BdfņrELΩ$hq˗b҈]PR*Zr_Cf?.Q-/zUB>*}লBJR)j07n̅&7jě"]L7 dvYƒzeТKNIKŎԩN.e$  =~҇Ŀ+] 3(jhT@ 2^@JȈZOa1Vw&cIdr@l#K0" $8ƞEN#HnB.MJlxJJMܯ5"b$p8Ƴt,AkҾOp+&~B8G(96 f# $jL&̌c C 4*rH>ʌ3;gt2'C*'t B=ME|(dYVRg϶:wėzK7Ldc}3`%'(RBp$ 'F+s#DFi&~& C1HF;5:=kӏ^[+JӱIN4K,pSHEȇ̲rV ;Jy [bc K&VPCʎKoƚVJ*l(P)ŸA:ka`+o\(kJ 6j7Aq/#-k$ N$h%O$wCMsÎb.JUVJi:;+DF'36jxr5_(%%|*TnZQp1qZiW9L@0|!T}v)SFz $ S9券\sm h<4Y'@i2ncvlbIF"+xk$ wo3MZCCtku.>vPA e2 $B}u!bevAE" #\H89NFUː lƣK>cxtHj:#WˬL9flvT.uJ9 ÆJkG@guc5`wJ\?1wc>36Kj4f&Pe8 lnr?|g(+HnO+"6A $ql!$6vxpa TbBnO/W–l BIlogOs scl!OCb``q'n`qM 9r@%!&o71B#y"aOaq۹k+r !Ytfka B9lY" !Yl6a2[lr+ ` ڑ\ TU$tRB ;' Ҹ󀧉K!#D$c*xYrgc2G>e%$D8au[6n~YE{Qw/S ZP6Luf_Jy<@f$%oUJ-D9-cT?fXGA%Kz۝#?1 $ + 49XQ4 A8!"h aUUc P;,iƴOX9KﳈA2tO11pȎԽ fS_(e`9ٰ=-}RōE{PEPjRa6qWȭdoBB(*g۬9D,.CEБhQ&5ǘ}D+ZΏڬR7kbQIŖdCmxHNvӵ N;3ק5 sXcw덃x17Md6>%7Ԕ (}!#p}5vfBi{zоVĵ#bqܐ<. #-zY؛qELmeŎIQ8Y0 lm8Zֳu>U c3KbE3ف~gRto1|)Wֆ8 dH՛Z5wQ`>21ȣΏڝ5j,# nH*q{ӨbE[Rq`xbXOG8]}p+Sǎ׽yp|:,hPcMygjm/jsYkc\ON.[kCnsn&S(VbNOSfG|3|˿ELlOyn"Іe 8lh2KNe4]L1t(}CmRohfhCVrDPfDܖ6JhNJ9QJ0>Q;1 ZetCG1?:[v JWDkemrA64"\ e0%UeWmm%d$iC4dw43h9gc+lu B#]"1$A(Rv4o82qmE=q!df$g'!|9Fch6ZUaY3PE"Fodi[Tsځiw2Xs$7yG'w'GMcinZ%^*kŐQ"#u3ig@]T6ce ʰ @`ʀ@ (8ph ؉hH艚h8h p 艓 (Xܘ ȋш ĸȊ(ɨ8؎88 Ȏȍxĸ9菑 HΈØ)Θ Ɍ9X )(H ֘X<؉ h%YIHɏ >ّW yWT07`g`ANP5Bx$ZaF}З 9ɘo阌)9Iٗ9iI闇Iəi`Iy ٙYI陝iiY٘Y ~Y) Y ũɜ9ѩɝ)iYٹɉڙii)yYY)ꟓ_THPt&5)A 0 @ ! !J #ڡ0 hʐ :Ȣ9 8:, (: -ڡ:':'II NZDQNFڡH+ X DXJX RjHJ.ʦGZeZE_KڢfnaʧXg㸦NZ+P*x W*Nʥ\z*VʤY ڧꨞʥʨJG]ʦb*j::hWjʧꨕj|*UIZ|s=VmYJ+L%Ya{ߺC11ULOh|˴["mJ:孟ue$U4 SYjB4G$2[[ /55A˳z_K0G[:5"4;J8L?k [?!S[LKʶ_3;JT:oǴ$s J7_"a"MbPxv1^i& 'E>PsT4qDFh]^%kfu!^10r{%1%We,k}!&%%2Wa3V!gnWE'J+yɋ$QTD5$NWWlgI4c1rkV}AUs#JK"ۃokNKnU71w$'8O;k^+5\ ,V<7{$G1ܕ{˿USc (̹EZIE7_F4/TrKYF"N8`Pjd R_w3q+wRp:Jar~k_X`Z71y84qk6Dvfed$3d|7evyȃXM%pWf{1Y]WL(hpesdž|Ƴl7r{2Xm3w?VI15 RE3!\pg%#\iPÇd[td05$E%١LRfɐlC2$,'w\ѹ2hW#6do,kWD|ͣW䄁$M]3u Cd7q|'}OrssvCʶPuGWoCarQL[dBozWjJ=EEkck&w SPf7 /d0j^"3&'e5jpillyF W0 bfOi9(4S{O#5>ͅWS&rZA ur" ƺV4o#a&xuc;]E5 rsT}U5Rm4JTO^tpdYF$wFVQp}v.6i%kl׋t@LYe{ b)eEtI΍|KPnpPŜ6ep#EJ2?uI`+ʣ >*A3:- ,ʉC ལ|jݢ*0J?*!ڢ3j߰(m}- C*`zM+* },:ݍ#=^ ***6z轧 n)..Z}; ZI~$J١ n<[>_>8 3n=9۽VC>^8.}]}>:]3h^"~z.:n9y ^-Cn#A *.~b~^ N6-ޣP}WF-L6a LJ/RUI[!DjĜ ꙓ)))ɚ}ٛ ݎٛN))Y)Y鞟 >ɠIIy~Ĺ/>O.(n,o)o49 *٠/.)/$-_~ mt_`Up8/<6C;Fn$}n$:Ȍ Qx 1o2 )O8OO?? ቮ??'ًx߉ЉX?׏Ŀڟ'/˔R6P@\&F<4cd!F}Bۇc> ާ!e}*EZϟ>E'she7ItQ;RzhUytԞ]|Zә"N}dίNEth=t~ݛtQGy^˗d8JE`l:;SqT7e\pI:4Rfe8д1tqYu|,\؂v+cv92ym3l-Lڃ(- 1~aýڇ\* ,^k8 kR. 43i@ႂOPF{ ,Ri̭Is5N*d).(Q;4EqT>\S+c)^L)13+j/ *3)31xJÚT*[Mv [@C˰o"KSJK6Ac{ŊV![:t9*I UY8>V,K!{se4tፎb8&M&bpMWEj7W)&*T{}m&"uMOERI)WBU,H*qcc4Bnx@F2T'I"6[0*BXս' 6`=Օ?,UlzkBdC8ZS&6Q@;8<*ςTiEQɎ>YhT2đIB}m1҈!#nX)CzZa|l,>W"L4I.aIFsv̜AKd#B:[+Yɷc}wbbqUcr;a rVO4k+Zgbyael]Joǖq:E.p$n/0[TZ*qQ^ORh%qT%;|QiJB0Vb.1Dic^I4<&BS&NƊE CXmZt*c},YfƲ:ٱnEjK KxQ,FےnҷVA`jPĕ-u=j=hŴCj`gSNʼnPZVq- UWJ ۵yI&bYx(d+LMZTvADq/qLb .Z1Pؙ$iH<=r;ؚm`'W=GR.©eeQ0Qڪ"a]5ɣV}#.SȎM*j'#OБc䔖tTwY@K^C1U{2+_fj2DjSHẽk3T2{w 2kWnrHE{W!S[⥃ )N+*ϯo>P@$bhĨ4-&Ic2BcA ra&B `̣c P *A0DIlQlg.BC!`dI~M *ABNд9c5XC긢W5נF)huM9Mbki{SIƙ|)_| ˰o$ @󻴛DX,q7ek% SQ60ّn *SƃP X.@wԙr\kqpJ$sC@ $ &\ h[iSc?E!& #:@& ytrq@>Q}H'4xBp샱 ʲigVZwɇoٲ8m&ٹ&3;YĹ E4p5X!R+`:P8"."`CBPk17*;ZzA*ZB< q+oq5,3#rrhPe6Q6Hh ۈzHУFB}XP}؂xgh82|SPI8pCvJ8>8-' ET>@֫8b)^a 4$R9V$ + NҍJ*91 IRb#0#"B?L!n1r;#.2c$,q&C/5+1h11򈥛!ߨ5\A%d#1?A[6Z"+ҨAh a0ȓ&I wI 0֪ȝH p Fq˷E(7Xd0F}Ђr7%C&C8 )83. ȧqg 2 'c"렷C6Dc%|Ҧ DizYً"FUZaDѻ2 ]J.BcϨ"siz;VJd$5G43!F;r(,!%rcPP)ԮJ #7:I(5C4\2T}P|8(' Ȅ !i%a E$,FѥI+KJz9tgf )g 6DM<|RP9Lb!P"E4DA,K:Nڋ \ @5$;CF 2PQː@ Ȑ 0l=u [-|1`1lEz 6<4=ý}=½z3~>Cؔ>T3D 80 1JA\>) Q,P.y#uL+ StAW*;ZwJ-WA?[;Fc0D0W@^dF L*HShh$ @YGb%ڍhQs’$ͫW3ɒ~kɈaȉB+xɗ(z4[7(Ü@Chx=exv2켷|cJ 6"ԎSM؄>P >PIj329dsػbQ3p{"<UD41LIw@Q6PEPdEh$`k!hRJѷMZ L$j;)!aZWo4ԭ0ߣ3ӀC|%k*ᖠ 0N_Ğ zR$ ⚤0zQʵg]mZyM4$!qթM~I<h"G{[| aҎR.AAEkha(a!^m֍ M3GAۼ QQӁY01LL4S11X' Y1H:&a.y B`D4k x W쨏"&f]ž}Є<+QG> 59̐ 2IE&-<ݷPBwg;NZC.+Kv&g _ƴʗ.$dNVE0K: ³wei>9MFJZ~"tDc)ϧ⏿XW#.դJ!NicڇC,ֳX %\ T2^{>bc,9-Xbbh*L:#sitjq«6Mfi]A^&j]T7Q/di˾1$y\QҺNrk S$@akC|n|K8g+"e0 hLdRN4WLѕw"'`6m:Cj^\Ũ8?ǂ% DS*Amҏ%w r)6Lst*K 0;Jk73[Z3@ME:3% Ea0}B1^gq]e+JB2.imXn X?[i3m:bS(!7i; ,3H Ɗ\E'^j`]Pl Dͫ Y4)AèSL=%O@W#V5x:B!F 5oߚ\$9qs%4!_\Z3)vg!3c%\+w@oV>|$ zƏKwB1PʎއV^#@iA M=O@8WښBeڝ$hPXJ ԄlyĂzPzڰ8ze0z8p'h7(z_yJzW o{e0#zWŧո{Wb@8{_8z|zeM78O{oztʯ?z g'z|Ϗ(`ҏ||(L?Ύs{|Տwbzh{U5MPOS(bM_})>z,VpYEAZËHB\/Z=T%G-'IΜ<} 7?q!ZgLIz(Q<>͙iR=FJTOcnjئJզU+T<[a…R=5RBYpU|mΚ'c Ziҟ1ԪqEږ\ڊ_;n1ƣ{6.ݮT#Ƥ8 }8i%1?2̘]#GDdD&I–קP}y~E^6߁J7 v &X!uPH ǠB2r_H,}&%8#(G$1Qة`xzؤ)yސG_8?(귐1I`Z^B/"aEP6}VXnPvG*x2y/2Z[w#(Hэ'vJv  ȡ?j'* J d80P(,MB$d2*sbxz>D^GBd(qP"$KK-IrwoKr>G$RvزE뮶0"Y-y+C;,3. k맽b,k=֋1EK|1lK/CHsts*M"0=0F!P;/͐)iC]s,x0*z7?,eyQ2/ʝMF-8ͽ2CD~)q]GxZsެk.gHC1 &>N& ҿ{Ҿ'r.xo+x+ѸQA|k|![X^B/'D&{0/xvO΂[fOһZƑli=Y"X[ك F<+{lF.4jM̳>#`*mO-J-0oS*/&|_HBҥ=^e&Mzk_.4p驀#b@bjbT5p{B U-LKp A8:' 9A&r  2"1L ư'yۅ>[vjR$پhpTp |iWtِ4|.= y4ӞH1"k<e2Ȫ'']1qݻĆva""CD](,Ɉ p)gR1{!W"&zRf)N(KuSGHZHE&K(FAcTɹ^pѓ[z-:4`8j1D%>I-CoH>oy& ޲w6Py"+-rwg-uPc0A ʓ@.zқG)R[J^Xɱ@3[)ñz[v~2yt&iC"56><%(ɳk"qsiaysUi'ݚ6Ҍ#x@2iM^'[hk_έW,nc"!2<} bK/6:KTK;4\34^\ U`8 09xi@Cj", {5^j+ 0 ]Bb_hqQ<8&n1k`1ld&{<na&,n2Y^ PZN4he ц ?[і>t@/ҁtM_zё62F MЈF3=kFzЀc-iNc֣~4jJՙ6ie q-VG:۝+GߺvEՌֵ{\vy{оuy}moG5#UkZ^~ƶK]ok3W2 `,elBYHwA )f˟5Wm>;lJGIl{- ZM}ωx⺱Hs˃jr^~*+Jy>Uv.S;.5#+EϞJ]ޚ=PRGUn;;f7sWU4`]aK6uOB:F2^Xl%!n7B.xDI>|1Wx)s'Śp ta9BmoQ5 4+ v'L k݌VUB|p$\H>byM^^ؽrhk懼S'yS\WM@ bI_M;O2eEըPQtIIjYM\]`KԜHm AI~]B2Qra u( DVG HR.-D8RxЍ Dž\BIB %._}))qmfPI&}RD!&W@C=Е '9Sneq>aCHTMC=#Dx"  ;9b:90-`iMލRSt%A>ct1ԙZD,MNThcUIgld,QUn $*~DBVt#`K%LUŠpa,-e5/*gq]Ur~vU"롌'u #I|4zDk I|@g#Kfc6!Z=y!Lr; W'SE!mMXdN܀ UR9WL<} Rަ g0NTBB2!;a.q͉DDgħ2{A(cki <8kM2%-VQI &\SrULoehs] =^vb * ȃl+bhJ)m(0jRAqVRѝ%݉Ӣ>q_ 8)M&T]8-"#u*r4rNe:kQD b{&A@Z=( B.#H";@  Һ3TA Ku$ )C20B(@Ӄ">C >1Κ1Y.#W<,E+nfĨ2R 6$ (>] Jxn(2hұ ?C ȵ K |< =pC"LrݼjD$eK}iN^(nVaX$}. 6'pZEYZ'y)bgf=/a߁i2(Q$/]rߕo8BO @!Va 2La_J(=,B<@, B4)DC-A4C .̰0B,&@<EsAu,º>H.4C k>dKx#׋%G#MȆ 56N3)S=EPcr ZS Gxn4nSRu X7^TۄN3Du̮͎$g2]̚NEUHMtiʤ%iY&+*ѡ ֣)z7YK"^,j %\r/Q9S^5!Ryb RE%Ƭi Gf&&pS%;>H@,C>XxJ0X.ASYxruB;t-`@v[r^,&;uYIjG^DRcmY.q~V[?ITJBKJe˘ESɊ4)kmeq*s-3 4?%"Hzx4G,"I3 kz(C3Bu@#Rx?C|@_KtO# - #yˤ\Co1QvU.$1GDo8BEzEHt>T<2Vc}(Tw$ #$CH׃| {cB{T8vl a$R\N.C'5=NkGoNn^Dƺq85Dh0:KC;H,"8nB}R#!涩ꏊ)0}6+ 3=":^=< _\٠R8rT*/]]ڶ"ki*hy}g9bڔ{VoJ\ri>zӷL`zGp}h"}ۧ#'&F18nطI2Mp$HoHbdDSh&E*hm Uo}VI2v9$ c<.E.Fv1$Diqqƺsޥ꠲hսy]9 +2wR41z  I#$CadЊY΋Xp軬/+pt4|p`ǍWY=B=DHq}ބƋÐ($# BQ󨿋č$o=;D*NC=Ǡ <AC "BF=L:K#2AbGPBy&I FBCQ)b!8y~XĪbNPyzJaO2PrS&e6HbBL9f"ԃlj[S.L2vz8B ۺ4ĄV8gsQ%g(n!*t̼ OI0:/3;"5 (:`.tOb,\\A阣Qȑ"/l?@S F%<(OD/&v3>MMmo;BY:.鱅`JLVwv!$HA FPjM Ԣփ";NI˗ 15%hs=Ql)͙HQNUnEԡh%ꈘ ?LshlR +]cK jsw)3"GBLԵ"m`*Vf>f͏LX~aMI1Z4HIL;d5m@] >iτƾ#Hjz'9%+"#8$ c$ J0{⍂AU RS"9!ۛ@ϕɏBcBfrm~}|" TEJ"$H hlQzYӢ ]2hdCG +"0!8+2$? yMɏ0WЁ1@=Y:eM)HaIC[fy4t'.8$¯#fX/1G(&VA!$LTI"7$f7Yb޺<HG=?=d*p|)8u'L缤 4!'ۤD4Ŏ:2ϔ:Z*I:I/~@SNLY 긊t<$ml`Z&S\̳I!4 L a|iC&*u)GM8WHx3üjѳeUi6ZG"tR%lΜC74oX _J [L8mEK+Aa^4n FC/cԣ~F8 Bi:us *I(]u#ά#l"Ý+VKк ]RT锅eD^?p#KJ­n 4m"E_f>(a"oh5J rCuOFZK1uOv`/˪aZyIFZ()ԤS$(n%3b\AVJ 9E-/=I5Z9Ь)$ɭo>3^97$`^!CNW)G&w|۔Ϙ%. Խ&i_-6I~R5`袅s~UЁL r/*ki~Ծ%|:斎IIN>{ɩhjWUIt'cV%EGUC7 d0 Wl,$$VFil)jr8I^DU " [kbvPOt\vZn3m)l!/nNN^/mgmhQz].6 rcf;BV"'Fh7RTD*64=IL!4T Av, 7p#]ksbPcA *WGMb^κK%Y<| ګnbU\Z"kDlkq>23|P.}b|]x쇯|v??m \}Lj0Xܿ5}JO&OpojOWƯ[OO ree6]tWo"p~%_te\O 00rV0PWP3`pzO^~WoOOZoop/);pXb D`pB!&!S #2MƆڌ " 1 `$`)Q'1'-;E117qS1 >Q%1S1'!QeS1[=AqY1{QU{1q9mMqQ-1Qq1?Qq1eQűqёq '1W1? 5wqq!2#)q!D˸˖o&p@#4%a%A^2&cVf&]R2~&m!(5(a\pR(r&'gWRlWR*rr+r+2(+2&,+R*,Wr(R*ݲ./K+,m-r.-S+ǒ.,/,1Ò/ s1%S/'1-5V3)S-{%S3R+14r/%3)2e11A-O./E%5/425kS. /42S45.[35S32s/17{;q3:+_3*3<52( T`6A2r >qKa&:&:j ĥ\OMƥzvI4` 4C 4"=0q$@hA-.tC?ԥ$ CCD5AC%4;܋D[qB%,B?~GEbDFqE{TB]JDH'AlǢCytB4IlG5;j@$HDԽtJLAMHהB4BE4C4.44AETE4=BMKQ4DJlbD=DL4H_tHyQCE5H PtD͊ l%Z")$2c#M{ȊUOXvJ_J֒`C@@l$@FKXqbװX{r!@ = 8XZ>u0tv><2k$q~iP YZl^ Dڀf՝BW x\$q 0`[q!![g (v@#v2 cΊVu59O`/|P) Mp% mOl0/ 3@ qpX Ѱ #W,2/4ooUtWYeVP pvv 62/'w o8 -0vpE&Rpvno0uxE \2q1wm7xmV G\rv=}^onp qo XdsK7}yzz}$(`d"pnjGDIBAM}0nuю[#&cDT{IGaUƴ>ags)oHZh=ɦ-j]aGrr.4C(JAjΦg@Xr0Da "$B"t#?<*Bkh#qxhV)o޶Xad&b j/m[2S&p?lP}v k3-U~^)b}|FL̆6Gvh MQv k*}2f5|,f\-BY6n dǝ ԺK~hayEzז.KI h&hh,/Qfc|:T飗<^I$t&J|GH<GD{~F{WOٿYE0hӏ^0ͺz]^APFz\Y(vJ,}|G2Ѡ標ĝĜLFHڰT?BJFV-ƦV?˝ǩUl4xBDSb% ^oUYd?&cfI&ƶO?Xu6+G͞ZRY̱:[;MbqcY}y_w]w0L}üv$~cƭ*bn9(2Ӧ9ŭyCuaQ>ުz '} zBȰ@ Z\P>z.ذHTdH)|cH <cO I䈑 4U,5A~I}T `œ=iP' t"ۄ reQ' y%γAE„u߂1E=+c]8Z+p[\cۈaf]Yɉ qX'ݰZL r[&ݚkF#Ĺx璘7dT!_CH!YS6#<2 .EZ: g@ GLq K"al|LG28*U]v $0[)QUumHq:CGInZ8A/:N89S))[R&SD<_\<QFfg%1e`g纎p:cx;ܧY^!m2> Š4Q55jxn7|Ld6$v\&"CӧTCyEQLkE(LdlDAijbO`|Eʤ s6RfweiEtSRR5\^6E/%in/x^=P#ٓy`T"$/#1H衅\"bAC<|Jw8o ٹyQUD 3 X\2X˦&chGŋ/B@GqKRҽ| jdd @OR.v/ {aj4T*\ddVRLq C+@i熱O^[}3FAjAھuAktSLm\T jE\lR2괫--JŒq.4?<$m*Dyvha)M"} 4D: SA!V}}s!.4 ka0Xmh>2 qT bdTSmJ椵R ]aƖ9p},9V~{M7tyKTk,"* :"7.\rrSZLCtnz0ln<)Ieyis@XMa?)5dPO:Y$ӎ7aO6P_]׬ x,E)C;eP_(ӟݿ  y  y y"y 0''y(R (y ~ ~@y~ +8 (y-@~%~7&肐' . h~7+HxGg8yUx'"U8H \K )8Bh 8XӁ;38m'tX7(k8IXsbx 886(~헁C8OH9xGChgJ膰>;  z9 `H0wb'J!If` Hpypа TGz E81pUEo d,`}:/hdl1 ֎8c4xl1fNxl[\RW8 ^uGIGkBL8$=Q="Ґ7ऐ5B(gq<=LJ-r56B|:11-RѓANՍ><3:l6#gY42rJE85QvL:Xtr\,B=aH1jLd&6y]W6ْby=v9-x/EaN_WFvJF|py$ ط{  0 iI{[yI5bFu4q2{$amL_ HAi{ ^mtѦQ qz! iiɚ|u 'S%yV\:+iZgS< M7!K.iuBvcX32wrtS0s:>0'Ad6YW1w@,%wDW=s bcDgN0}%q7MS"R"J$0vbdwscVb6%R4JS I&kMg78 kEgkyTPq`ָy#yWnovmmY ʶ8o0LeNNmJ}qPUIc0 :t ql`(4SP Fp_F H?Fv ϸFR! KJ)= f= /GJ:Gjٓ>z,V#5nơ6.!U@53%g{4MU11O|Zf֥ydִ9$6>xq<ުr2N"#Gj(LMAOs!+X'n"zvb6~A<9?@x7xhN9x`c|u fHh{W( Ĝb /;]0_A \Q ʩ&D(dCRpI :vH _}<_8lH2 tbIyeU2'B65% 86Y1ĠRpJ1cb,j=3f=N<ZS0 ^2#q$@0M7717CDW :j*5c 1-:7<=jFB8&6.1/% Yƃ˱(Y92yDBDc> v1є5!?Vɼqɐd[YVv"2C:VH;/cgF"9.ē25}\niV3 N,A9R*x ᷮU-ǤWqL'K" :\dL+Y5)3]MU $:CUt$$Lr#1Y/weq5j=L8COVvWy@5h;u6O=DMu4k:2P]WaTM1B\*L9A#{ZD´TY+\j?ZvkXI$!S"l&x~bVtT`<\CAK,Ҹ~pC"s) <c16֮wirIW{%3:*O1+VVY6>* 84r`1θzawD[CLqQ rlqSQtv ,)CRSj0:2r0V0aP=䤆Ŭ2=J)2&U7hf*J COWwe0DVFs: B@OBW!&.A\y!۸@}}&;DaKeelry]g2Q*#.8J{8xx˂ MtNI$(${rr@53;mmv5-̣wK395Zg[pY+N|XA hDA8ԓAFuMZ$d?<}~&dvqƑd6#B'bz(:CYvfFK>ѐsE$ AбfQAȈz;ՠA5wu#Ʋ{sx9/qbh2{xGJժ[+]oc۔ْsXqBCՇ;G3e[%I3dJ7OU'@FηZAeL'F,7;([1'P. 7QNҒ7ɡuXڄqN$ 8p~@ђ,Kb$zG"i@Xx)ka?]F=Am&$li8+R7Zkn:Kl62P%E&eD77eb5A,N^wϷ*B5X6>r`"J@m8Qv}CZ,X2 Ii}$ŴFn7DM:vG%#uq.1W/ )goLʪ%ť9OwRJҌC 0 YRϔp7,G!9Ӿt"ĸ gث[=gϜH2s;[UO V9Mbip)X}(kոA&vuᬕѱ[Œ=JHګLy6F=L@'0X®r"4Y~&"mV[Dfi-sd._L0"핛̮Ŕ:ip8E F\̌cO+11'6e.|wQ|?כ!.K*l.Ε.(F=Qv4)F#oSv+1L ٮ0lh O2}S/C %q_ mHP_Ŏ6|XZ=.hE*96L5}+/* :ϓmiD܈cVyTѬ#Nد79dyvƷ6G*Xф5FdH%ì>KtǮHIibd!Ɓ}4" ݎ@̔Zu&M]zRlڵm]{vۻq:ou6[r䴓6yӓ _]Skk37~5yW~tO;M3eBG4hz٧A0B 'B /0C 7081DG$DOD1EWdE_1FM$òLp,5YF\!MbCL9k#'wJ)lpJ+t+t2!.J-J2+3>PA EPE e);YI80RL:SQŬ47D2ETKX,5*r)[Ya&G: e1ЭYnc] [[h[k$h:7e%h]h5W%ڻ}7tץueW_t8_wCny!ዠXb'X#c-VWy\qUICe\Vv@_effiY{zs h' s_Zjy=yݺMe5b9fx7V+5nV밹B{m/FVd^:OFh%<Nw.q3d eDjو1A(۽wg!Kx[B>mg+Ǝ>Hgq RjIw" eR*}ꩦ $gy#}3`8@ЀHKl. ki[WE)˝dpЃ!PA'A Fz/^ q;i! ]C%?,Mr 0~3_Lԇ!/^9_EiK`YQ]י 1R/~t Znɰ.a%W9p۾7CioKV*%E,ΜV%pL& #fHE4RJgh a׎$oiMtJ8M2D K>E\SrRJigͣONSTNtsRY g!U*ȃqbDtL6j y_a%Mv&b'UkBy͡.U+υG*ٳg]i:bPP@s aFj1iIYY[O(,FL1uBܹJ P[uky>h^ ӄ$л=ﻻylTUz:I'd؂KL=ϳe,EU C]RɖMK}c>%29x z>Pɟ%A2/ dž$U<$,b}~55~IF~"IZΙ&͝;&/#h4#aSn TOz>҂ۤÊI`[ۀ9ӂ6> 襨Brw"NShUO ]kv_3<\&}JUӽW`Km=ť6Bn]Sc8KjFŎTiYk+RJvNglVE[nH(ۿ`hGH8p-]HN^Ehb wgGc CЇPH5 m ne/S9 ܾzq!nnlhC$پԆ $ژ;Q @*"@ o2]gb;LxS~gZM讕0PMtMZN?[ ĀKee@cz П̝܀en+OJC͟sTdķb=:&ՠdu}}}P;<_:z&.?_X# 댃؅IdVh8U˭‹v0F`ݩ6-iރOv`Pv悈;1 ^vI^&JhjF,b}0R@5 !X2Q #: -WY/9EVu]0#p顦:"xYt8)oAGo@lӝ2tFgϐU5pZPvw7mA==Ma;3^jeyW긵;^VwdDȒ 2=&bN5JwqԘ\UK`]--Cw#SƠ-ʻ'Oaz`}`BKՙ608`6k0m+ ֶ9V._ZLU.0-g5.ьT󝸇p}^4z[ؐ!Á:zJl0>z y!E"-Ȑ%KAH%IfYd̘ T2c‰+u0>Q*L%R"*cMV4(2#ĆbFDƌ0JZqge4ګ/})p|G_PO<߿D[P2eYFY4_-2(p#EI.95نE>knұeKz5'ǖ'R,۲6t6(P\;%<7"ԨnxKY/?YEyɂI $H0f} SCZLM HKϱUDIaG[MŷnQtJ]אwQWiq$9!C h2,#Ɓ TL9WPkI7!vZy=`Y%_GI]SMqfFa5Y̕TWA]ϩSA`q7sogRUVq1U\N`FiDVe`)dlXavX_I襠,H2ˌz2i)DP}msL$Dk>N F\W㫳y h,]IyíƹZPSՀ#=2T]uG'/]Խu5QDGE[ڛi2D*Kf=9c܀.>8DI"(OMfD7FRt+i'!I[ q"%#kJؑreRQvToHg1Z0oD^Ǥ#|ck).Vإ@:Xehdi`%uM FD쓠ٜa~ %ۘYY,MH;f**PkyGTvJy{v[/\%v¿W]F'B^G;N,B򷞂5^O}kC qC hшF r|{I{]N'0'sH m +Kh#Rv6d;Ǚf$5%Lw +RS8MI$b(NQ4QQzۦnx7,ShрFUsTH>'&l5Y޲D,腻D*[ .쎳?(LNojȻYJ\b2d2_NuP1b ;72%ɦU߬k%"Lł=v :鉍}]O\!7TWEMtn[긢T9&F:Lmīr[AnVS38a #%:"P}qP(X#nwW)>5Lb C+^:ae^ zꍝ>|:nvV6:<%yQ^~cYFpqN-z'\O]h-v5L;nGZtqIzuX#EX9@\.5Wj6_=9'Ar DϡXA_ T]vCjFd_}MywcnSL$(ya5H<ܲiy Mp QD֕DL-  `  AGPx)>< IDQP0qMZ {*TPɂ}SGٔNYvhvhM1HtϤ`&A8\DوXL}tL_!ɍX 1 =N G!E, Mq̣͜!p̗ͷMnE$#2&2.#3#33"c4&1:5*4N12c"qp^œ}Gġ.iĉ]XWPmAPε\)Uֈx_OJ!Ttc, FYXDD 1GՀӁK`R_T XVpdjF.DN mRj|XQBe xA܄VS M-g] Ă SُdVWH\ə8yOU41Дh]p[<_sEARYST}n'Dy@^aG|8]#fVO5pOTUE.]9⏣Pr& y# NK1` ]0SUZozr*:Ԡ%yI=H)RiAkNOOX(8La,vRP&Ufij˾LYyLignN\d A]EJ!٠mxME sMU] Rδ!\H ZNsTBOjפf+= i6B4ʶ,˦,̢lj5,5b6]U3,ˢl66,Ϻl2- l42m23#llZmVcn-2DP THVDжE?$ުڙ uKwq!gN:~EqHڧll{Am*9ǸgF-vsJ>ňhxJ.Q . n HlZDoX]uߎ.R )G8+Zf B, cj x:O9 Zΰ2EӺDW +Fpo>1w/.W:q_1?/lAXq1`e?lg݆)P&^~IΘyꐋhAjG0t*+a0IqnAB.$)7ۿdu1(K9iJM$M 10%(WR$/FWrjmBx1:(n/31Ջ2{/befƺ\~x҉MƌǨOJ/Cnht:c)fP)zfSO2Tpݖ ){K ཞrРt gy)9MQI C= a`M^$2t`;˄IK)j4MCMYWD5<:UTmߚ3i(/VP8%dt<7Q>C %HaHA4) uQa90 25H{i&5OƣGd9;ݣxOmHjA$sMӴלn@vde״ɤy i8Sp(>HyA'Y,@2&*?O|rI]zEc)l sDMR)+fs*a TB^a y!* *tOYH&[j>";uQZ%$uzvXFeGXpӉejV$4TӘ!Wv>1R~x;uǘo1'[J'ɺ!5@T.b@щrY5.[xx35rxn|tE8)7uRzmztE–]㗭T\f~[B~J@T>p2 D3{s2Lv10@.7-ʩh45o bNv=RwsHL6#a۝eOUp!(ÎRryu!su>Ӂ`=tf0h$r|̝|ojPDrO4yGJ7Eͳ\RuUNRٔ6gQ)D]((TPj$x5we2cڱdzus&TJSa,T=#L[]a g:!Wܺ%+Y G`Ex 'oڱ4d|'&w1g'Ll~[sV;|~Y >8O _Um 1`ix%wjO$:D{eb =x*/ێaXo{ZC2p)TE;Ȁx??I^)"ā<@DSz8P!Ahd/= E;L_}U$cH{C0Z},_Fsr_HC1|[bIhQG&U)͞-24my@e mkW/{v9QΞ4qm[OEƍ:F oܧ!CcE90DzfLL8OS1Pˢᘘa(vQ/GxQD _16Y{],|#<ZtPKqOHLre2P4@jc,yL&JsY OU1mUם+u4ڣFm0C.jjNS5-hsg.Lg5TagG|Mw4ܧ8TTv=}!$>Vn]t3n&ezyaQ4,2^!-`UQwT lAE.t*!Y!=O| k~h, $,bB'NpRs =+SI' Ȟ&]*iDA^JXjBqb|#iu1FL9@RGDW]D6G[A$‘2a<$+ɨ#4pćY FBRD&gL:>Fxd2hD y F"H7’>E0xMd)!i&& Ņf!5.E4| oG8f7˙&̴dhP) Nؤ]q"%>Y 9E#@\Ly6t>+ŧz ,gUl]SKm >$]>LWGz+X݃b9 jZ\I:z""t"F|l2 hi{Rӳn0w]"3V[r'@@ʰ Q>L4PG 69f-=2-oKjcbR@~(F4P 44$KX꬞J8|F@AM-LkD>O$6%ضԧDЛ]YJtru !) 9Yma-U0->|+ By)dxZhC ̖UIŴ&V۾R%&=̘Z,dž7pQ H‚H`gsL8{uͫ`.FyP%:n1)T Ll03 Ph|zm;!$lVKA.DTd S3q:t;.СSB:>0ZU } P#Z˔3^9+{$b_ iApC8êMe:| <(IelYis"/D8 [gC[Wd(MZKߔt1{`L\&ڴޓ pP&KzM " u #@֐] !9~aut B4Rkr胞<# OCE Oˢ(-Z'L>9L]$ 2 jDNa e l܅iZ/ p`/%NfۢNKP\cfTkMH 69а* 0Rj$`-t B+m(PlHNFO^mZ|*-IN%Q6 džF;H*v 5qIMw2 ច$!7#PxNFjΪ}ff p ~4a~HHTK.!ph슰oPw8L%d--0gL::pIX9çUj /lh886~-#a .$*G"'2&C00aZ! 0b [υǐbRlJ悰&XOX`qdC?j1O:)P]VPͪdRfo"E la!TbR$SQo/.E9ds"")3u`#5Z<E`1"c24T)NJFT .xQ6 |hOs6 S js>ߒ5(̎F.m/S;JF Do@h\K|K|c HC KH"Xf1L3/E>T) d1U'ܔ?ª KAҀ jfdxN+S(# m®j@dV,9j)ú oO4P/b#KҦ5=C\@EJD<Ųjd{̦oDmr\PO/M/=2&Ӵ?q\M0!JbN3fh[qS". LҔ@!%!rP2{QcK-OЯ`E!iAhUFG;,=GHҗR7N|RsV$rp G5|Q,Tj``ghvnRĕ1`QNUMUiz#ԘC51[T҅*7&t kvf'D1g"hj6G*)4,EU5{ +UNtF5S*m4հ0Pc( e$KMm1|V.CP2 L7R)ZLuvJ~D2^te7,CuAv1dtCaQ/cUL' &!yy7yyywzWz7zz{ ,]⍘||7}w}ٷ}y3NG|ݷ~~}'|?ok켒t$ Ag`p@STednk]Tt%Oon59I S_QHkIqEFH3biRdRVp)Bp0~y~y{z {8 z׋|Mv)#8)X)rqqh]Mor &!dM`m))6$;@@-* |`)D$mTYZQ2qфئG'6AVRLFϐ|\6@¦C"E5Gg@bB\"htَj/[}C'Ct⚳qBÙ9ymU9y幞9<\f=!L: ZUaŨ,Ӗ6ʓ T~&MN&Sm|2Pfi} _sFTNOY,A"fuBQd9Ì*-C5kX . *sf6 iDx`r0_u)CʆK ꁥ$qۨf+mFK$($zV.aSjp7:k[;I[An5‚P hQ BOb ۴C I#Qr'1CiRoM,#ܙ=aujڒ)hZGQPYMS:SV'p+eCmφoo%<#'V;pryYԿWxgwt[Ck&*BDC™k­N4*]n;uNgb4H÷1JVk_Q fY 2Qz[]@F4ڧgU'4 bFq|^ cNnjyK%iQUF3*:uT )<ìʪ(ڇs8pOV7&@3<Ԇ|r7e*=1HZ1^"$4/y~w*NG۟\ c͝ L``W R2*mm8jr04+ZɾZwЧ|H:0WSd U{<5eAyPRݐ0n޾eA B}-Ko_%"mh2ܧ IK<2ʕ,[\ Qh?|3Ν0#.GsMDUB")է1ǍqcT $8sIs 7hb~ p_!MB2L e3.4T\ˆ i~2UjCKX)[@=yf]b]zyT% j_kiUU,ӟ sH}ݝ'r[+=cYKժ7D YIDw`sXkXx ]ZgݧC 02샃a]vPyՔU=W)]`UvR9VWI~%GU&PEUjj[yDPtE$Use=ǔsIAWQwtuGS` FUV؆hEeM2H_T rEdAutwA(aD䙡 jjyj,bɚiR~u}~HY1  (Ҹ[AaUVfՅY5ݮzV ԗdI5{vai[UgFG \aTJ&E^ f:6QYiQۓIy! O1Dr&\zu_ciu>QMsH眚jU>LGA HvcĐk&ʄ2bMHcꨫNEXmdj51axW ȢwRI2UZ:gERDnY4v[,%Q.Z}d%ܕmIUmzA3M?_RWzzM\wijC&ͺ\t[2!v{? g! `(}*3 4>bq\oHvs}h{ˈq<TǨFjp yU].>` _&1E8 #^m.vȐd$;$80{)RQBORP-&$Y] p (g Z"t)z0Nq]Js *H)WZs1/0LhEc_>3T5M \f6*#i:JJnv & ^L$ç$l̆$\"󓰕Cp0$au>t[[hڐ֖OE^9d"}RƐ1Y~,}ٕ (Iig $ (cTn"xWM-d90H„tA\64E8@>A$~&QH B\+`ȦaFr͘G:DA`"e0 6( ɓf<'4=!/"M3+L8wKf6hv; < +2y%SȴCW10ҦtA.^$BOoTم >h[c 5ɷ4>A!Dc?X Oy!z[Hۄ  18A E=9ORs+?usy$&>ϋRz;û4ztEF:'UE.(cn f%M2ve&\0:qE59gsY)ó%E;xC0Ie.cj"~Wn[[ː\Ð_78T=m_[\Wyx iQ1[r$KY#A oJq^tb5.[p #Z*P/g-P39pH'AW^cR:1JE_qea ˠ t1?ؒ"7uR@de`"Z"lqXb{_AvvB.dzg–KhE,ZsQ_ q   hU[p\` u _s1So@ P[Ԍ\uN7~JQn \07SxD$b|'<(%xwd.Hsb()0;1e)4b0;RS)QB’!ipG66Ro|fMVWY&.B:4&uMB!WYql%;ߦH 2Nak|U:~[I>; ƍd h[NB ULq˰z%~6h[V +%-5QW;w_N 7v} y;O G`Glu_vؙ5P" Aic5(؉ͳ%5'2@&?b@u # C&a:1TTG.G5);E;f8u`"q{F Y }s!dbxFWs [,z Itr֌& Ǘ i@}WlP%S0 !c1 mf^9ًR`٢T{ \3gA y9E;:A&@ԔUR!6u7+Pu1kQ _U:juVKrZ:0S!ƞJ!i!A YY93"bwX#y~A2qt z q_r WvsōgSuW֨\D`ٍ|o%Hk:5 U8ritѪѰ O#D~VB#Zg\b3s=B,^VAAȜ=*x@?j"O6PbWxXEORA<"~Jw!w#40cN璆> h'SѓX.rJ DcDCqšAgW9]dh266F'77ѓQUI4de;{dL$YFb2B)8lf$/%Nd+T6ŵ OP1AFwe:w"NbiG$@h{'IyzJYY˱!sc*xd@6"֗b#%vL"/,ekb= "95MQE?TN-;vb!_%'*1uv4S(EEZSPW RAt`+qFˀc|}ɺLs(8 .Cv7x d;w5S DO)dIjQsJB$55$;-|, |!@RY3Y81 zc(SFT R-vvNW-ek9pH,e9?\<<sOJ bK<cWQTJ[HsƢRw;0B"F!Ew!k#1)c@xØS{< 0EjXM'C}rc2&D$dg7LǷjU+rQ"zmA yKyf+(Կ (_Jl"yzk/J2N;3(7 85dYez$ˤ 12܅`0ܔFU-h2'3lIg*mYt7ʐf6 G8P?!@9lBlA Di +1S}iI}q&;iћm:T$2E-wr0 fB3CBwrHEeS$6#N!N8* FjI<4C%"UuŠOod؁bb#+1dV'5~QQYcdQ${ o9 OP?/o:P9wu:&bT udt$U V16kcׄa縿JOtJ7NǕ]2f v_Ļ|Vbm&ˊ T طVFQ g7c^7%N;yw3%>Kx^}20Ŋ(>$z$P}&ILReɖ*<)sI,iɲ&Ke%zP2Im.UڔSQQcȡ .uW_ Zǁ Az6%ւA}k-EBvkDҌ9)ڤl> %1S2DhCjwCzǹF ոfHjnnqYԶdw˗&'J{յASnԨig'8ߋYhzhjTF?9b5U۪ZHY((ʏ L˪.zl@*ã< D9CDPC3D1K <>L 4hyCevG32 TG$qI"4&|ш- !MB1H/C s24M\6|8NBj-2ӎ 3+N7J4taa}4%PP:4A.(fsQZoے5R /&X]3 U={P$r7vSFPC([!l"[moXDo;VgYZ.#%Wjm÷ռ+#UЉ$آjo6Gn[M3*RYf ݫkfkF+$9g9楍&?}c 92&Q]F҈LCDL1ȋ5ܰ˵:؎*c6ar̲;R[8a:[*=wͺlzMtE8b5JDs.U[<&I# o]s]}w߃'^w4z^x3y蟗>z/+PEPmP{ք{~g|_&|_gw{~71o43J:N( \A0o`A|l >PtШ ,Ɛ$ʐ{ae(ְ-`R(}[Y'+F,+;[[%`8 6@&l!@.C T]毵Q"c}J(P'3DiK|.EoRt#&ϱq/:@N,k$h,u`}5!g:yM|6i=tߢFIWA}2S6B3N"J(䭅Lլ>BmMYJB/7s+1o">V^Po/hq&-ީ؎MSrFŕE80@$ؒz r\٦}ähQ)rS3 7>HŽoö5Bٮlc?Ҡl< R1Q}H2d?:"/ͻZ Af۩/ے[q;k/9X,dftBBsh邘65i4 -J PO)[:S(xXRrӱb)?0I)5$'bWTAa$-K6'6 Y41*:j`I`uSD(bЩNjөer蛈#øۃgƷ$bF~h(ꐤB3+Ps0X}؄+Ч ږhqyqk>Y@[rLSM|u96bCR f1wj#n R&;8XGM$3n+:i'ʸBcCuI@E<4ȁ.[P4 1=Yб(_TC4(8O(c-ɪRAcEHH-~4|e@[@ԣ{ ْ )Q BHd\Z.$z3Ռ-؄h aȁ؂QeL.8y#vY62  &)ឈєҐ8˪Ua#6Ҫ%#jΊL/诳Vu&hRƳ{θ4 Ѳ iZSCi>#a1s> XG0'K7,GI;=ȌK+BS;NԲ-h.dH:&Iu+GœT H5 z`P+8|8 F`բMHU=![D˹AK:_6$/eA >Cї q;/܄#|mzp&ݱݺv~G6(H2m,u'ڿ|XA,T ]$N5-ᰮqPE"ң] G`X\ɡ = |pUۂZPUhr4#:ё@%ډ9(V%9=A[ tm#*xy digF^3S } ̤9ܯ$ b }n*QCͳNrBԇ?Wos":Ɯ4L m]c(Z|KX1T44 vZ` Z&g8^}Z݇iΧtSI`GlzTᶽ za -=f]Z/V&-`MK_Y[mJ9?'m`g.^NѩӣMb0}'<öi,1"^$%S&G@3݈ifc\=x:m5Y*3Ѥ*=Ե@<,FGqLu6~+%\}0A5W_? D(kl;8U?: neB.s>5)v4Fi1 jia+$v F5z%R g9+5ѡj;fWe%;kqO"i$=%T>3Wʂ*td y"sse¶s;k@& wt`_/nAIQ`,c7 L1Hm'|;y7ū#CD$^Ah e6tٚ岩 'ߎ5G)pq6=F|ӞJ&_آT`f'q#+(?b 'lᥫԿNW6r2."P \rriw< *t(ѢF%FbÁB!*u*գnt^%Ӓ ,rŁjDrĸ,9mFitCL4Ҵl%5ͤPńrFvc߆ʽPcG 1k{IlYb慖]=9f\jۛdɞM97Z ܼu8H/?hr42exrȴg,kNXҬBPgv]ieV~ N]pAdQW RXPʼwXr~;śB- _(ZN|n=Đ%1F o DbDz"d1iRcKUbGŘfae0%z"L!=yH%&S[7 WGs-}m6crAKʧUꅴFiheɔGZՆv7X9FdPm KjU2xeZkX%ATݒq֊lrd6)tιdP#7p(McK2$WJ }a=SǞ$&٢Sk'D GRjҡ=ğ|"IM/r͑9Z V\ gR ˖V"GdvpQe9W(TV YJZ4RBЄF3=2_S(wvF ˈiu+ҥca@&pal/d+e}E+''}Ȩ wkA/}n{'rZř LHWduqXs'N4Ue'і:s;F"CȞ2D*ۈHR}1M1c/o =MoBU[g4bn$8aXcoq8Kldn;)לD86i6b&D$Kİ-gsSt4FEkMhuZS֐"E1@P#B "n $ EThEeI$8.#K"#E#Rߛ構,mFL 9:vjN@ $c36cmXnP[W$pљ%mgL85, IYӒhK6+!|SV&ܨ'N XgY^50gR()ED|iH$@iNbf6Ӑi5l:LL'=1AOy@hW%6pS?P(p$z8P bBPn1 4ԇ)EI*Б%M)FWҗ4*՞߸Ǔp~P2AP*ԀH-*S 7z L- vTfrhTk ʖ& o3Đd">T"sy4PFF)XiI q[5MrBt*.å,*)9I}#$'Ɉwnm}Jĵz-3c tzНtDZN n.`xK7 +ndpog &/{M,k !W3:1AS (9I1`6V3Na*I'TSeݐ> 2{Yb B2XtrTLi= NKMk eb>V2Lcbq4 4ev%Kxi] /˹UC vsi,CݸtL94s -B#Њ64wiZ ƓҫgUKҙƴTSƾi]j1cɐ"dȵrn"@qvjYlxLԘBZD.W@qrb%R{b@%QoB}&5Za0upsN-7hALV= u$rICf+Gc d vj񏗘"M]Ir{0y3;fuY]\8֍L;jhdf-2.9/docs/hdfview/UsersGuide/images/chart_histogram.gif0000755000175000017500000045664412050301073024753 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,HPM*\ȰÇ#JHŋ3jȱǏ CIɓ(Sr,rྗ0cʜIMjܩSP JtѢH*MtӦPJJuժXju׮` KvٲhϪMv۶pNԓ47gK~[ LÈ+^̸ǐ#KL˘3k̹ρ MghТ)zY4}Am2ٴm}{6ݺ}ݛ8⿅#ܸПKwNuؗk^=;ۧ]|ѓO?<ջ_O}~GޱjfE8iM=>YXOl rȡ!Vh)H-"(1x981c2$Bb=2I?6iQ>TbiAN]VcH&K&6YPosYe8flyb4$> Im,[4\Xkrlze:)Z饢j +騷+*Zk¾lZJBknl Rz+n /Z-no*K+"L K)J*luA3xxK$+r1.|2rl583, }393=+2 t$K 4SsMW]oMt__4E{tjMZtbX:8+B\4/h$/-̏ NMxn3AB^奟sǰBB0K0=j8,g"=%:37[_}{/=w܇~ꧏ>/~˿>o?_(K 8ρ&8aGd aA%ԠBp&\a OB*D i—0<!}0P}@ NrB~~&>ϗ4 Akfp9QTC -P2@KD&%ǒh~ I7c2bHp44c4aSLK#(QY΃FKhjy">ժӫXC֓!Z1-BZ;PD5j犲5skT5zU^_V¢=a1W^5Tu"ƠjV̵6&= Vֶ{ /1inc S>G({@ bb" RU;/[]tCCLF!JD~Z.0nzB]$686"od=`3K_Wx]sP"%@j-ýHF.ռUߗ$ÿ "<7S:X6;q` r/r6:/X 樂\h\ $~M_qOqbQ̅9N0y Q"K" 2Г>mSAhRzŐ}*DCѓ#h66Љɤ?KÄЦE}VCՎsO886(KeP] +Bׄjx ʈ{nb 0`ʛbpdu}]qW}c 1-]Ph0"e>pYCB(&Sql6t+]Av]u7eysgw9.Rc+VLoEkۮBjap]eŜ n6bD1ֹqUrl: B %|4qPf&|ONnЕ o*r |}xHB>.r$:&o'c1n }M ~kq^VKk}*D3:&+bMBRx1)"tl0 ҕ)0 hC3 %r!7F|[CYv ׂ% ðMUl!V2 7^ʰCHszu pDWH` } m&T)r!r*0^WB"pmxGQ69) ZTfM5 PUgf8bM"> .m bHoxx 1 xUh5 'gBv7f @` lu<8T+`bp*8)8TpFp}vcቨ؍[`wyWȋGx!8)@ } -("(_Ux5  d*iypx Р\ҐB !YBƑ )  9))YB#ɒI&9)0lJ"*v*D)P6#k%/  .]x%2 892ap ""^ywqwb!*Vgn疻PbPb nwP؍Mat!R ׅ  -v Ѡ q0rY> ЊV؇w,Β)wp6pW!p%Җ=1xvub*kهo#QOśgx0)sPTPg$p-t)bVvOXg tYPfzk9wr)@ F lᙞnJ"VH`ЖumxmI` h .YMybѹyi!7TXEsyA9S5G`P"^MS#&#H3:dV"@j:DʣL794#+a!)LBeVjMˠ)˕jҀt/!x! 8 ^+aimp y  ;uɐ9JwrR!@q; ~Z -滼]Vڊl) ]Aڅ۳ܘۅ ͆νmKq;-AٯˠT,j +DbͲALH\NNÞ2ʾoIžўNȼɃL~>\#n\[b4R[~ j:%=İ̗ 3Й-| }=ܫ=4, Jϭ< 2X]ǝL_4"/rY/ ȳl /mtlKO Ƚ "?lCdx0/OC>G%/+o$V/>3nܺ8ә궾 MٙMڈ2/ک_?/;Y!O;.*dNq9n[+9P2@Z( /Ë :q6O&O5/ *? o?h Ҁ-! 2e.;xp Be :Ν;yVը) i֭]~I ҆2!& 1TCʰ{ R+qR[Gs݅_cʊo^w؏W>HHm %4N:rJ$$ Bh 9I m 5:DRpŃXPQã@|(atDn1iREU!_,R=j̎nAӈ5`3L1e-cP$-K 铳A.*3=8pr8Ϥ B.͛<:ox㕽SW\[#h9fMiy_fy䌇Y䋕7nKfVV5#jx8vfvIv9ٞ;$yҟϾX߾Skn  77rWoYpdѣhN_oq]J_6ݦ˖5&6NK45P柇>zOy5~淧zoŇ|~G'_y ~Ͽ~w^ҳ^w{@{ Zpy_Am#`BP{"YB0yd ݷOUA~5^+^I#%6x@CސILVLCE,aiM,b<E0fQYh1k$G=fbc&0GBetcG-X|$+vd5INvғe(E9JRҔ_SuJ%\XRhR^ =8z#D>Zrf/G=Ke\1E_喼܇.]޲3\LS1L2e62r+'.A}c/^L}v%@_PvR hD%:P&/5((0jPxӣh?9 $4 , glKJHϧ?d.Ͽ~c3y' |.+%*uq{~ե/yV-*,Wu8c$(%X8HAXd΀ *b3 :h/M@*G%zJ# 4(Sj7y)S,lZԊ[383֓.;6+'BRC:B8*%HVSB8Dz·:D;?<ܷ;LD8TF7,D?0'<80z$j4N./}U"/i<*>&.t&(6<+? ۲E*]NT#xDHkj}1002z84 Bka0bȄ@2}Hp;Eyz EJ;Vt:C+#cCX\COCDZ Hd:ׂ'q[xڽIk*ߋ{=>I3J ISSJ23[>2[C>J<&,7t<9<,Ix-(Հ&Uܪ&p¥_K%Hz-?'}蹚^܇,yZ,I++I[+R*+{=2- %Fa7W`9X0@D0 Ȅ =D(;:P.|Q/N@3C-K 4?MtsdʭH_{jEXL؊U W w\0k mJ;Oӧۓʧ4>XBHT#&dI/E6D"9ʥ${/+ST=/tW*dyE'v%ש$O<{ݽIs&fCI6V5:>Ha:&(/!*Ř+0H_5P:Zҥե$?n3ZjIOLd*%`EĦW0c9!L#M<͜^T1TϘ.0 MwbcB*K[ ֭çEg,F&k^}lν%EfV[)v漎U8v/cV䠊v>+l6+?U&.vВU,})UFZZ_.|C8|RJn}HVZlE^`زF+om OZ`aOh:"(82ЁCpXh'\)?/ 4hM=#&ɮ\4M&u/P FT,L/ZpYjb d"zeR)jv:*-qHVH Ľȁrm6h-VX)oUN͆`lBjvVkok_27K1NNmsr5tr"b *.wGўc?v"'þVrsAol͟kF.ևEFKzn](v_]u zT"w5*DIX (,gz g?X/hHO7h7(7"PnGh[0H [n9Vh W!u$$*t °i*b)w,Hh@zTxFg#޿Ze8C_kLU$s4KԦkhLv$_rGU_oPǦX*F!tn:nv*k$?I@"ywoܟWWjj'GC7o)_t}8Xf'Uh. h`Man*o^)F|qFdmݕ|me`? bh@Ї,eX^aN707Ё12F&\Q” xM?\e͠5)"HɊ^[&Uaӂ-Zzd+`¢ty[eȾԨI;Ċ3n1dƚ8 (}4)dj3.q9E2ecӾHjñ,2q59 2e([F Tx4r.K3BF$aM7EޤI3LE+^ۋXx gf4 ) 1(0ɀ eС@hH$TmG4i`'!P{@UBmfV9WX")CCmLruMm~U$LuSRqi$_?^]T. u^`t]jVg\9v9$os$qri%SrigWXtY`B:瞐Z\j(iD).vV"H(E(C 82Zg̳T >@4Qa\=~PqBq.C!p1 &`woA^9^#\瓋@B0~ WCB a$i28f gmN`NRL1$KՒY9$env<>iS5?4Q3s莁Rvɲ@!Q9%:K)X+?-spM-ՔX\S#=ъN@JR$'F=iBuFє2E3\fJĦD7-+3I{@2AKr%Gqמu/v;y4"I#BI"Ch;>~g&M@C'FH>7rO$P"ɏ(*ZcgmA">⋻,ۍ >vO?80 t N  ίhc@ 0);w`P@p#l_&8 *JFa 0=u*0tYqƦ, cA1#)p8Sr gZV$更\kLL^|L=јD&r  LA#F"aH ͺ ML{('Б,r䊴7 Pvt; YJ ,AYpTba2ŔZŨS2!'Z4TH4eإ0oڒ-uxaq1䖩$sSaS=hΉgqg4c Kd+,'9ܾѥa;@EӀI#*ZJH_rц" yPGAMBѠmА<^9 էџnf65˹B*P Ѧ@!Vq3,4ܤD(ZOHVl8z}s~+` g\8Kͭu)8=RMH@=<\7傓918~)'QI⢘*{0S>F|A>THL3AIt؛>h}l`HU%(44l; .O=-( >-gOJ¦m=!nWIρC3XF&5/븛ė bnBa0Ƅ/g2źXU?bƍ8 d7!#_QVlW!CśUùDq"?&c ]pIryXe&|,,6p`q~֣WӆԷ(o+I)IzDI^JZhޤD}ȶ-Njˢ%⌺vqE*Aomv`F gɷ/~|fX>i1Ǿ6ls~<5B3Lm|p?Z]Oη]WoyTݿ|n~PXzxhbt֪ƾfkn6:r)>66UV22(fߐFU{TE}T에^ӐQށ]U2DݵiyrYIUHFԪ}]߅4L]2AŇ?%UU7Di=[Q,ۙSކI5Q7c6869c??$: )`1!Ğ&6#)) pl=Wb3Cv\ д}D- M( QM݂d,2QJ0$БbZKMNUdWJѕWYI+Bd$Fh&`hnfh~hJ_rjlrI!fAߨ,eOD\D_&fhhB&fflfjB&k&F vIeejcc.̈P'DPflaBCbeewyDhNaDglxʧc.ft~fjNgq'&LhDerfRd_Bfc:g8(tJa t&D(ugzfzlgfB@'DX&_Vtf%KmsVhecz(cgrfvh"(ggg|F't'p`惦yf^pf5V^a $CL# B|阂)难iv霚i)) *)ʩO#"ii顪i>*fji馂VvzҪ֪*2***~j)(a@e)=5ڑl7d:r?#@NkQ5Rj+F붊뷂k7^+t븖krkAr8>c5zk?8c?d,k;Zk+FY+75㾲V,cN6z#:^kɮA8?^+ƦF+G$>lAb.lŢr>NhB `JK_nag.M(a)dL A턁lۆn l چA܀n200-h$0B0vB& $,# #\R  pNȊ:.. A܎܀@ @:/  N/o .#"-/ C&0Pn; C-­m&; /L"Ln ؊ʭ޶..0V.ʭ- nR/X-/nh)Dzo0g.,L)nn2/Ʋ6@.Nyl2.z3N튁 .4r0/4ϳ2*$oJ, omJ$/p]m* -37o 3bC80cF34K :.#AHM13$MdBp:o73nf7+풲^4vGoo/yAor 3ǀw:w"T4jࢲN2 t.P3v-[0# :7CܢAIpr0ptxFϯ d7 M0foo<~54ȳ0YNS_HfصJV\覕'V]W,hH$ȉvBŀ5_Iz_#UT5|`9RIj(6TWd:4:vvD\_[z=\vWzEX:E|B\vQL@vlvے,7Q.B4nF<8nt?;tnqF ~ilJ3+Owkwx }2 HB&=8{7N;kftrg4ז=0':pE,:nr˶G8 @ z~Gg7I2: 44_Rjdd˳ථ۲v3|v铷V3īF'<xrGGk4@10Ɩaˆ Ɩ- M$B24$H0 ƅ7Tap*J2ɓ-c ( P9&tZJ1ՃVO_R})T_h۷tiW[)TMjTl}ftXKj*[po[kMvp_l*Ƀ|6m^PRkuZ}Qśxqٯ_᎕]o}qKʽ[w0oV.qo+MqzGO`]C֧FM Mj?|yO1N #B1 cbĐ@cBb=aEb +oI2эM(bڈ 8 Tġ $ eIFai Fp 'cF2E2&aѡjh@Zz"kR ^2h-;=P!r L/!^0FRhXi % bTBqa*): &LbIɦTk +c˚:NT۬+**1JX‚*3Θ}Wͨ/}mY3s,u٦@- /:㪵Ą-x3ʾՊ}l[(L!8Vx⇡".<&*ْw-H#PCQLL*nH@J 3PF$lB4d/Ɋ *p|#3I2vSJ_ˁj6jj< P e1 q12r74&hQ[ef*9*h!{?Kzzp-] =3#MC] 1"Hs6\6ubRWT\2a8܁ҟ&Գ>ڿh[ -Y؍F~U j\X\ō,ެ, rZ ήg{yE+QId .[qh.eLbp2Ŀ n!Mi*R&Ō:_ #8b _,[HCw4a퐇!Y& !E4D%.MFH6`tp lkaA }IBR2LBj^4 s:{/.B%,j I24 Zo@4e$$9 0@KT&#`Y;H5$@ p0 qc$$  @GJ$44֩1"P`)eDm !A|wYiveT/ G v(-"?܀DKrKpYS0%K|2h »P$3 b87kCO/ 6kr퓻+*8,HA|d!1HN89 hH mrM2HFĐE)i,IfRFFf%dqʘ~lgHIjlE,c0з P#5f&Ĉ^ЃԖeE_HS.&*q{Og3^FnUpKj Pu ]ExOĠR^"&2hM7ؑ2> -dnmNl#?X'Dz kfp!gn&$NG4dn!ICR6.&L'a4A&tbD=|m K=n*Md)*ps($,EfnN?PgfGhA"dB$P Vt&%BIh&H(^-2{A|ޠj&$EFHDK ܡ)P>R"i@%Fu2d2"pl?Hi"&#GTxJBBn&djCdƑGM'zg#E,w6h H$g&TB4%%آ2o6 [Z21~jE){ ,ZV^ڢ 3'6\6ͧ\c(Hg1Gdso92p%1pɁ1140hF%mbʑk3gXDƦr,@\7D&f'|By x.4!͔! zANN&N! P@>dQA(%AFGl,)BnliOw\1-@`dr"%D Rtb1/ ЄBCZg֎"L%hDKt FB*%(&^)*X"y'jPQzB{cI૟^jXsP5/f")-U.3׮M-\ӿ"6JPuUY5Sh{sMV!H&<; NR"": > BV7DkEB@ I! pPg qHh2aAZҦ* h s$Pg FtF"!GsD]]2` P _Q/WTzGΈuzp?u$2hQrRLӒ p Jك=D#Hb~GD%PDLT%մf,̩{<7 q/Y[~W`Uo57mVɻ||r56rO{EJiN l* `6  צDC+F2/Vt|0HKpFR?vRD #f>ċhg`*narV!sTfNE(| %OI$J:I ut<@.zj@B(pHC7&@< дOzʨxaP%8D_BMS@ımHT4@HeeBNf{gxEy\4pH4SՆ@{ (:Sg}T-2]΢2{%nT7VLV1CŹeV+5MZ\ָ-hVqo%7lmAݵ싽XW#558ho{Zq2wJEW`>6bFmf `(m>DbJGD"j"C̎mfTkrHj po`yE>f&Qvf>$$@zpnڊ>yt qRO:BEL`S(txb`1i6hGj(|ǘ2D~Nϲt΃VT&nKYS֔:oUP")U^SPQo]4QE|x+G-2 Z{Vظv%35G؈'*(ȋØY[ʾ[Q];0{XU !&QH[@hK>kfdnP7_pڃu&$Btm0=hҺxʢaAD@$Fj"oflj.JbF FofuGE 8d t(r@uyIJ%R$n^X[a'Jwa0AHmpME-P/y$oST|욯4VgͶ}on7lv2&: T8OC\>`i|"_.(o}@,qERcnAq;WZS/OZM ӳ,grEh "C2G@ndg@$!)J((&Fl@2AȔJj$XnCN` rYuA?'B?dSR2O PTlUxG(Hm6ONd`?6>CZ Dm'^gc"MO%l ulSs;E6^:^Rile[VIm)څQk60)4v)vxXD%p6 pp) p ڳ]1͌֜%VLxsnq{ve$f1etaBpU 2Ŕ!"H`ٙ$@>$ IF mF2=Bqoo('0| k2m2 TKZp\~ra6ɘO$:foNC{!-⼷l/_ "Zi i&.,L榔.$Tk0imIUdbH|x>Q&w VwUd3#W2K\$jj1j)ԍ+݅la-uXl P_SU[Uc?FWȮ}(1XE*j>T NT&޾Aؼ*X $V|#Qk`AX HZFHAŏ辝UUՕw#>nduJ{bIGlL411iLz(1I 6i1F[a(CLʙ))fΉ-Mxf*b8 fQApqzJFŠF;bYvpzSK sSɔGcp c Igʥ7Ɓl{@.ҷoӥy0Z=}-c\/X}AOپǏ73'3Ƞkq4ӗ]3anXiҫOܻc5/rʡѾ[qʎ!ܻ֡=|╡k뱭w<6;7yGdx&NXfɇYd飆1hA&b*b$^OҠTpa9+ R7L78 yK4tUac/+ & ĕdIW 1L1o44hYCQ*ED7D9P(EsF)dD1Ę&&E6D)ɥ6nT&HJ" kt8$sѸj8=Hhԗ]y0Q@Ib7Bb)Fш"$ȪTRL@@uuUTpWluRhAhշԱbZXY^%qQ7ip]k=rʱG0n߫e)t/e-&y6Ytel{ǛQZr 'q*Iqk~܄Xi9R,Z4j(%vnHbtE47E Cb58(QvEL*k$i|KU1q$"y4I0gJxF&v27jT+9`/1G %;pUHh9IStP.tT1țDӎq$LN]iS]mURՋEO2F|ZA/qŗ|1L["8x[⑸f"$caXЪ}\gg,h6{8,g9!4Dg ObcL6:x c2Pz!M9Xe|V'C$NtS.yKb3%c} Y!{àH?ok#O6P3 aUkAJQ#LIH:\$XF+H;Q2a&e(C#HZ4(h;fw},nqJd$1"S=8"LOQC;etgMiذcbQ$:}CMaOaPK!!,Lǔ! .\ၖcR]~ Cxk_zi1kA,thOӱ4Dl#I T(X(YJd([Pe =1`tbYF׻]& ixPT74d" iЄ2@ P=hJNR&ԩR)T!R4\’S /)nIGMЊdZѷ(pk?t\'b"ad%;r,.꒗t.Jƿ[@W աBݑiV0;DE$!y8G.,M]~{ Ff pR(2E5Lx(GgʘB&wъȱX:&:]<VynGLV,cBDZ{04BSK̄*KU#gFj7IU3 VOV;dD3Q_* ,oS$n"X7ܜ{-$l@LB8Ak"ET8(uqЧe Y.陷bu'DLF;`;+5M@Й${+H}Cb9I%/KCa@]!*z+a->1go.Aoq?RH.R>Ff.w$T2m63!tr%BX1Ð:Ԇ6^r747#gm!sa:G4\f&$CeWcSD6wQ78 tY"wzX_5ơsH2c3t6#2uXx@]ҰN>Q@$1'yXj+|;B#,1%,P:GI ?'>'G ,bf$1AU$x",5[p;I;,19q(},gQ)Q&(je)O$ X:$q%I*[4 [ap>x'O&#AR'r)!8q~-1lj3gSDCTDAXeds6-I5*xUa6V>U9WEޱI02QT!E1cCHIT!gWBRDQEQELdPa,J^"(h  Yhh013xHNg?)! 3@5'#$d[y87㌳I2-g2?2 +IZi wDH7; $O7Z.f[@6~)T&% `i$QyraZ9=BgbVj 1 \RQ'~y%!*€dq%l$+qŽxÀ?"tBC#eZf93s„-iVf3eHʞGTUa(((VGsPeIWX*h_dFD g\rb2)3hW&JjjU1CZZ.أ9!~]cWz1"zuas>2 ЀBx'ek $bGjb_rW?W?&CmbrAq.AB(GU(8D1c.uT<E'XD>'0џKe`T(U?3s3QsHudD=uG4 !Kt?T2/[6GhSiziqs&$ t8.'K8)`^&[R1I§=n1$5aQg,ԯ2pVZ{0;!W[/q-OOoR&x%k5(e'#+k# pL¤ДIZ:Q_9pi(i'wG?Žr4{RBRw~B_6D;f%I=! fCwsgVgBCcfJE9t^YTDfZu8sz1T+035VRʰ !ɔ3L7#ܲ-& g[P_bЛ*o2A&@Sd-Pè!u9V౿i,n/q.Zb2 %[@n[3©s?4'~AP(yUq@R^sTXeaF9K4+T2ac55>'B!OԬd 'I2%0KU6)ّEU23UAqt Ri;Vde3,3rʖi @e9c8~RB 'DܕLm8`a(HMJ",>LQ_rO1<vpp׼}ymHDas>>Q&m BQMB,:RJ=RbQ;ESn8C[ğ63Eu;1]nȑcuA Ԣ,DSTcd 3d,!0U_ca}`wwU.WnSL;W%4*XX0BCz؏"<O;o&v jDg5~^%T(lH^qC%$NW‡ 쌙3 0 }2Z#7wpsWjq $ <Ǖ:k1 B\<(]a o ۽=G- 0#,y-%8&ˍ}.#@#+1B7U0rkƼnT3;cUCTr3CaQ=QZ10qf:VG/ HeC/'? , 1EXhO~w0QS~MLvR~;?tE 2_'k67\2qb`  Ȯ] \y5 &&=|QhP7;pʠ0CeJ;=A"&A.yJ}D q-$m j;t&2Q*=,U?Ph*n,FN}僘I"a;4J8$!'.NLCZ"UR"nF/4`3'?GOz8VCoH ыVZ}[`B %3X!Eh 8!Nj !*de&9`ŒO~L H !&FAnУ=c2ŊCF|dMIZ 45jbh"Yiծe6&5lA)47d7_MoʤL2br6i#1bnY$F-oiQbM98bLLhgc#&f;I<)Iiڗ)Xܹ0+b`Qc1h*80o: gu~Αx^0̥t}244%0ZFC=,l.FM ͧ 1;1 qabo ;@U`$Z[EյJp7@kLh0&o^fBa %ad4lN7lˍ7T1&GfRfܡ2ɄI0aQFm|=RH&Xc,~6I.钑ԴjE4q sY GSIT-SMtƶ)mIl«ݍs1 Np ;]|7wԛ {(7'{IOs,8>;`"x 7}.|o5|_ Bx5C4zCx9w xN1 k] dB C$?qɞBHu=s .Il!i4=Ξv!EFLN4m 1f((Id7 )יdp"*CyDIM >d7`<31K #V18QHj/5Hl(eA 4VF!m*øXh.1i HupC).-V E7:D:N#a{lH2[NlCRyі&śJq,8#F g\F7qV\Kr\3>d&%,a}2V3g8to 70 û敧u9!ܣC!?8 Ұcl4c Hn=2]933D/I1|I8^w5 3/CtW 9N{Bl! kQ`fZOm UghҖZJaHaJ meH0"ɬm:w >z ;[)%M핒D%ld0$ mRr FD@$@d#\l|@|@@ <L@ @ A,A@ $@1X",|AAA\:eX:6%:@́48W;9'42(lk#1>PH@873c;@;`93X!-˰Fz ""稨1Lȋe&E2O;҈ -" ᢓ4 4 <퀌L0+`8I#Є-Dj7i;;C682x<@ĞH r>J2혛z뤴Y /%i7.,ROrp\$C $ @yǦGLAzǀG~GG}LH H|tȁHȈyleHHH$@ǒD*B 79s?J$'aqt?唿.#MΔξND L JNHdNO ϕPOOONL섖aЁP OOON P O9, 4O PUO4ψQ Q1 0hOOb RDҔYTNP(dȁ1Llj Ȅ.5 5󐑋ع~-RyLXYِW}ux5@׀=ЄEO4P_3T1jCUͳ HlI܄\X`T/ȔL1i 4#CT8E4,r(.4j$QvaۚrT$OE< )XJ{!;TA }͞óDlm(Be8CR0 g9`QNDd1DP7]u chFoF5:2N 5&tTuN<86W%1FcFoV͝c(o5GTz)1F:Pcԭ8nֽd9d9dF4Nc3K2:m6.Y7.4fcCee5eYee8dR!*(?)d6fT!"f@g!%j^fl~iNf@Thnlfnvfrgts6lff?9N?ggIH|.~SWQ!R9f7w!%7}fj.g@,ph戗*3X4h7*]31 $QK#  PԬP-1#y@| jFvjf|YF]1ΗB^*Ȋ9 kÒw :"j^l4f^l^lŞjɎllm͆.mԶl&nmn-xmF0(Ii;:h@Ӌf jC*$i+*4s 6*-z0 GY11:S;bԞ-z*]m>*ԾbV9 M oOt &h pФE? p]^aF!zsqD1 ?Ԉ(ŠB (qwD8pZ qMer"e؄"$MP"?r"/'&Grr+ׄ*'*O%)MrM(w*7&r6g,s/s#r%P!_9Wr>s;r@'r!=M%&bPG.tit;wPXEyJHyp or9J>y^a /;p`;Ds+zGWGAAeqW zz4JªIxp#t!t9 R#.yEW&u>u>-97MWrz'|A?utWQ{QtQt_|PuLLtubWu!LuuאrAuuz1t7}`_'{{cjF V&ҼBЀrbdr 4Y54D78K0 II;0a&Im,1Fo  9B]F 5XeA5-VVQ``^xeˈ)h]s}K]z˭VۗJ~Xpw&eWia\dRTj]Ghkqlnrm>y8.3O&cJ"݄g2%?}:Bcwhee 9[y'$àޓ$t駟İON"&b>H0`($A$OSJ +C"30##1,)B lCƲo >IGJ \S 0gj.p]$91K Z,X"/z+K2_C C{F3 )ƆDiFd&cYr#2#,*`rp; cQt?ߒ/(Un|\Ѕ."27&TfQJ[PF/ыaM-Ű_zls閶|-Q;ɁB hQ2Qd `Bu@TL_V;A7F3%DG&Њ! v=0EUE:sπTi|jDInmя8vrhQLl1RJ!\-PJR bDc E/x^;+sHBG]jז4-y؎\zw|1hBp`LзeN+F #ۈ ?$x^2C;Q0;((2hp=,g)HŴփ`q="\r 2@1@$KtѠ_JәUbԉJe)W"R C1l6 bCT!vAepgD5J̦1(i *%{0#f#"Jg8=4BJ2όQO6c!+ n<[y܆"U1EudMHF2(4t0[ndiG(S(Nj&eJ2c zR=/ vPSQHߵ.{yoV  O Cnp-`3 BRwL(MXk>'d#b0⑑RH#6H"d'CǾ-4xBR  =//"z b)(1!uL+|'v=@ gk!Z3”TϨ{8RT wHC'5[ċ3pfx [!3ZgQݸ5j3=e/Avu]+:P`-y ]S" L1Zv cɥeL6qqe .+#96 Evm]^ۺf4^C U{8 (}1Uj(ODRDqD) Fp KsDX`9D H0BAͱ4ϱpV1[%/mA%B)BK$<2@8FqN= HE+!4@@YEF0$EUNMPy0>^  $f$UU)5a  "T9Uh,DgTT `ͅQUlG-^i͸"X@/,""BB2dC.у>,(C2d!$dF.B/@L,(q,D \MFq@CP` pCO? FL D   % GO^F(XF)00<Y(yHa]DJ买eE$TaT1AYhŔ2"$0K]YpP EEe#:UPbT(쐘=ߥfA8՘M<Ud&e`T Ye! dZe!V_ )Xڧ{<ͫ"/_Y׬AȈcr k ׌y暫7"Z֊cniB!(E) H[H%ЏKٙ0B!AFB&$@=#臊h0t (A9pA,n,˧DxCćQD?MF ʠ$JAG C0dB ǭIr4li~Wv l>A=l@/i)l&$p%4 ʠ2%+D&*xaITT2P5Y:\)dN0t h0`aY%i!BOѭi6b#V"$`hPTY4S'\ )e^'eEHy6͘]]Q(scfAH%硅tV؈M",kb̧͋  E[b9!ljJNRҏ,2/AFfd6dJ(=,ERhCl!؂A2Ard! A MIATnurH HGlD#nh nVZ A= Q&$C. 3@QS=D2A2X&bYzf <1.B$|ʨ3d* [ev=w f/ff$oC$3pR&8DlA/mn)rJ((#FARAzU&@Kg5b,֢U4H(Ցu0^a05X5ce] 8ZHkp][$I_/10Y@P1*^E4d(#,,/$hh##$o6g1IJ5E4hBm\,unl` "- 4D̫\:\(@,iӓ Cb F/}B)Ze4%B\B=P80p.prUA(L.[DC;2\siU*Z(RPZ/g ($T0,/ *a1.Ѕgg=f!/g|( DAm6tA~tJ>@gn6G 'FoI$*Np"o3}= -j 1 15J^+1bpe"b.VYͻd%:Zh Hz>]6+|hVӖ.Vc (ōܪOkGg1Hk]Ec3ۙP<gظ b01j6//#./{?.؂/{g6#d5Idƥ0 p~1 7F 0wL|@T0)JĀ1x@-Aa\|0' C- v<%2,.s7Ev T[gӃ"A\ ٿxX9j#s 2\$E;SCv?e?s41LOBKcZf#lbAKdL* bob$o$jN#T\Iڀ̀dkxڥ(U@#uJsG1+ cYHeUǧgէ,ᵰ>H[)v d%Xzy[! w? 1(yl2cv$[?1 O;I Iiʄ4%!b c1 [nl#i$Fœ$]&F1dRRLLFĆeXL)m_}$(m! Z&M!^Qo(bjA)SgeD2h@g_2qR %L@(nl},f^#Ƒ KeKFLU c, Ж2*IP$#A5  љ= MdFhOE9Ry0)N7$QA~4!?>0@#0 `D4VOOpO>$x/-~҈+ebFC$Pl$7eeBq$G#sepTfqm's  CRG,T"I2|2&5RK,m%c)2!eRH4' M,tQ 5M,4B]Jy MD>8ޛ 5{>TCN׊Meꓴ6G4u]E:Ha?4.ZadazZhslneV(" MN1h44p ! zCh VA L&qb)/ c}iИVF4)jz!nX**:>Of.ʔ\-.$SFz- L0"ht1+}rZhH8ϔ+~Մ[!K%hN0بp$$`;VC+EN$[0$qS8X78@`&#0L@?#H2D {|3VA;(K" zA\=,|= %đ{\?3 QBtH$0|R*U)`Q~SѢz(PxJpʔ5# NOỠ*X?i+({NTBP>xVb$hSU }UC^YV*2e"Yg` Ę1юhL%c`A w Fz)M >A Dc7DDX.w ytp$!HI0؃-$-HaX #Ebw%.0! k#H^d,x&h,#jr)c0uK\02ٔqI0)̸3)ZE@-0N53Ma4I8`UsPaJ+Cz Ea|%@%Yw$'wMhcO|L@3I=DS'|!Zpԣ=KkSL&e)~a *! G*}Mw"E>O~vӏeiRT? &PXS*%(aUpP<꤭P>'+DO;jFBZٜĩo .իd?!KzfH FlZd);h!`݂"0nh!E$m\O_LPr||ih"5RD+M P;`7(S I N&y[yȌGlIwPbH ^l+-HX||XBL/l!/x3|40.^b>Er/H$L*sL!?PV0E>cK 3 @# j>VC s  o"&#.D-DKEOTESEWE[FUtNIOl%I@Ĭ"GlG*zFȎNLdRH͌LG| MXDm/ /Ѵ./LS+*CA]1m"V$Y!ebO-X a/V4i1{H4u)̙\VDPr)jBG Q:_ ޑ$"B B Lb_z5j"(4&Mj`A |KjB"3 \rRAS=aHV03ᠡPc-"->h E?gvj32t*TACA'wr j!HLӣJ2-CwE#b.a#&"" HaQa#cVcb-b%5vbb=VEFYF0dʔHg PGhJ̔2}{>fG GL$hK*%$Ȫؔ3Q4Ȑ|TH]N gm2T]SvIQ$nG4M%cR!`!LUW1B6S5j)H$#` <";W# *Ġia)V%ʐL_Z""C`^N^1nŀ r4nheQy3H $/^Kƌ{?5NS{J gR^жDqb1Y뭷8BP_w f7o/~x#PIׁD늆2(2GLN*N9hǥ$~ ̶lM2XإI5VQT7(- Qk6[xXh-3-O-?%2,XS7Hp0Dcs6aY $(*&KU5EWEmN&$WӀ'NBS+]^6Mw+8?'3ˆce"zNGLlNJҷ{E_9>W| Z% vD3b޸_~ _跁_XQٛ9X#qDOSbe4TKlR1gGTXTljdSIL}NRtxR2NֈJĤPFZ71G,=K_r-OOUPw@rDf3l[M&XR{Qbo5kBM'hr'(m#xsY=``8:YS>4(Fub27Eah|"b"N!Qg\쵿ɛ$r4ɷ"[%4B{#OP_iGW6!>?~%G"Rz8jQ.JSp6p/B4X/6US/Щ) 3C[d했I'.3PJsس1E˖,pۛ0$6)w6Su4;{#5qkp\)b%C@A 2'Ҁ ZNaA) m-9/ ;<'iN# \('4F%!(&Q/_$Z͔B`v5_d/Ћ}Ow"H| QX#"Va[;}M#f7Z=b]=**@DE¼kEUb)z=כ]ڣBPّ]UןӫKDOVDyR7)ݫYo=}ݫA&]=!}]߽~ɽ}s2 /=M5+Stٽ%!dY4MTDIGcDik p!R| ~ɛ_XKJʕbo#[%ҼSh^:وzM0b)$V6~a1ƑMfS.r()eыoCA̹r!q̜.t=,)փv:ʦBgִlkɳf\yљ{nvҼ=L8'; :jI_ zoW,o׻n3hɁF%\xG= >Tn'y-Gc 8`g>F!.dnzs$]u^-."ߊ*HOMH_f7Җu"ߓ%z<~FG߆ͶZxܕGCu, iPM> V @?PDCaLC[Q#HI%UX[RJ@anU΅Tg9e@ )#M\0I!XR,2q'm]YޖjA7g8hMQRe߉ਖ਼=&er'jE%ErC)vǺVw4+eֹ+ek\tN aC4ﰥzjuy ?WЩrK@4j^ (ra K,Vg$䥔3b l2,dMwal&Ƣ$ھE"k݅Tϼ›. ʽz0{'ob)oK,܂{.^Tp48yxNEa(-E3mQdXTTمUUU5%F#2xZVa%2iHa7~ %e] 2cemh ]VVd[B tt L*||=#|*ڲ;_e}jŶM@I;1u fKvfbL{1oGأ3|AA!/EKG43}Gj^#Oh0ێ$)e AoQ\YzB KDZ0-{JJ]ڂFIp?Ar e(e1T&t,J &e:IHRCed0ыI)iP/2Y UwJEDo1 d[ڱ#op -־ pٌtW[^zD e/t3W$61x. hZZwƉ2 N_ zx5a^lĶ,w hEʗ_B(X!oBO{@_Yͤ efMXCGD2g2{˳Xϙ_$x&mqM*Lސ)Āoj9QA&ЖI XbRe0XWV9H*X#Cbek/A I:Sxba"ԣwPK51`b*PXj V r%/jB ω$> P 7kY(HZ~+3yR3vlht!;|_EFo|!)Pz]𷬯uSZ,@)Qqz5:k@ \뤴EjSopׅq_MiJ No51F7ahTL!|fRi V4E)7I`T] SAdedbse#UBC0oȁ h"\e\#re&H:3n4C)[jBkۂ4_$Vw:u EI0% ^rm4Lܬ4'25m=9MŚ 3q]t'(ց>"kSPQYCb ! -ş컸uVҏ'ӆˉmi\O &o &f QsJI5Ci\3l~ywU> >m҅'SN(ۀ 8aon:fCY VgarQ3 {Bs`/ӈF`S0aU$"BYW0 ňH"0 Ӕ0$-P$})(>'d*pJJeJh&3j!fBk70pK܄!6a@5 sx3hz&]y2],Oz˒,@=38H{JaL"V>\=,5_ycw܂RaxP}'\rE72czv5Dfo&S.X4Ng#<9XhSwAd v̥DzDZHbg&/ fb!v> PE:fbK)p VvYuHo_GTUoiP Yv:u8yTYJA6"<(B1f0{rBMv,CCv{ejB? .83[Wm=9hY^,T/HH3fXHo]1<)/˹yy!$w <,fOmi]0@H_{<K\JC)|636ӉmciDh`*ugVn|x&5&E|ZFiU (DgUbu7HK3;"PpTU7'j!Xyr;2F_;s&XY1531n^MP"Z47D [BBBOND t_]LӡjxGcR?T_]^^!%4!N5`pÆ zF^Z&rD(1iiUNVY%zN8>vv2B+UAم9gvz/EPG4 MRZ3fsJA)+A P(b7SCEK׊:Gj)qa+p[!V}r"'*v'x7zYb_f+9[J?KCa4aEhER=vQ˶+KH๝gCu㒡lCD3E5[<+CQ!㥛4r^=EaZP!a\Mٚeh"[&IZKʅDZ8kZV>Kng+QԤdd?QDlMyk1\'"ER>.Qo2q'GeboIvI'e:_ex)q: q.*)q'zC;|1;]Q;ri e0O(# !76E6'fFRYoSe\ũf0N#RbnTtYPvcGO6%h]sj]+.ZFS7an%##KEl(D6Ix)SWh6a6I԰o˃|i#/9h^:"47S.,N^JDNZi,Svv5+vӒFj +7L!;8SIp >P(,rVec"d ˗p| **; o@ 7H4+ hR lmdF汃%I]{?jX;4/x iF&ӰjDyn7CR$ZRzJBznf3WGJ$CRᅶ IkĜR2l_ s.q+hZvpRZXhN]&2.Sڨa@%T1F80rTa70 շbP T[oG[HlQ;f* R*p]FзgG%c(ј 7 hj"踒'aՃ| 4æ?ҡQs+ZN>C^lF^ @r{wNVNjA0e>6~@Xv)uujQRuu+ “?*M9wS]=Xi0j fPk=EC}DSWl5&ך$&'=PIb})J)e[!kpqq ŗUJ!uʿ=w\NFDfn#Myh 3z?S&N6|iPxw:53Zhd?3@FxA%|NgQr<|A\ALnCMX#h\Ms8ET\ǚ_g̈́!Y \&^0 vg\nV0h,QFr7E1`T Я5UFbpŪ3*]a)s)#Ud&ϗZY:)h+uAm}Rٓģk8#H{vTO?ZV03ML+N7ӴiǩbAq@7m1m3{,d3 1a,ǪxMSӦG3)wnہbxj&MN1n)n8';b b& orB*sbv(yVuiU"NJ;9s)7hKb W+eh Isdy=0y*1|,h^ޤ6?){yzQ"GK!cyO ~DU,Ye5Mm?&zkGCUi >e To =۷lC}UFqAh /0"ć'FhԤ)F̍27d8#N1|dT4*3RcȹEL[bL`ǒZ5h8a5'W9월& 3Nl0ߐ%jGXaǒx!C1bOdBS&$`Ҕ i" )I('-g޴EtX#ߕ<3m#/)pIλZb„ d~E죯H]!zU?,# =(:٦2 Ωr+ ?k.݂m4:H8("ˢ,L 2R졑|3@KP16DiҽSϢ{)cɥLb`䆨d7d j(Š++x#PNYԠJk묨,$db+p@zr +I2I/y5S13ИS.*qƆx ΢Cz-Ko ^ ޔ4ko1Xo(.n7E&(j) 'ͳaƀi~b&cOdWJü%gMy*늇Yy?dfאѶ-8Uu%H:u2`5pښcFL2CP_nÔE5oG3m3Wn˭Me~V+'o/,4a$}ʩdΗe$dn KM5+xC(QIBJNuw71L"3qsK[E-9DJEٰ+x{1 Id(_B 8)ko @ coJrLt]Gx!斉(db.uLHۧH8.H*P"(.W0lB.ɱ8t-{|Nr_N=L\N=AgxAC~)ME:1WW(9٥\-ӌvڤC {\%¬+&y"$2m,,}ۺqIk-m)z莐h)Gi 7(Á"1`P0hI ! L+h8m/F0Qr7I-0Vj8Rrڬsxzոù-!ISڲMAlQۭj$$ c9["#:vt&y#:Aԑٙ}i1Mɀ1tj1K`"k&k(sڸR$Q2e'?Y bI(90%ʉ+ڼnsabخD8/H"&ImM6PBPP4-2(4⛲3* )=iFI=܉ K#?c\tY\$rŲr,9˷#i!& e93)g2R"{ t >fZ$۹ʘb1ع)"ESt`7b8p9?:qJ$" .bl)Y=JAL$X$55)VbW)" ) KPȰЊ;/*H Le$,b7GPb(I!r7:ʴ^ BEa0{fB v; r:ȕ֚'(7 9di&Œ4C4>vKca?4ttIj6#LCDZ,Ӛ?ƺ6@ *s!MR6 p398aě"L΁RH+/+q)=4GJћe8맦 Y|q7z뽋[d,! E̞9Dpi+!KDCZJrJۛOD@%}ai12nAxzMzA4bP:vq":w>YLlNm)ө ):|Y\\ݘCSf: C3_!IZDj?ZJVL8PܦO!ň=cRqKcB`ѹBӥi? UGX9|LiDVeR{ KTD`)& E|10E\7F&knm=Žpʾ5xbD 8/ #8:M1pɨPSXㄆL5"Ȉ 7H"1e s~ PDܬҰO @9eE.ex E۠=tzJIZKy@#Ր5@W\K9^PkUl+h+mKR]MC,i=#.3[JTb1Eɴ*䪴V>&IcLP `B˹3xX0}.8$!_+#d xM1@h[;888"!a䔉4Ɂ4CY F܍g9ORܽ Bw M,=\9F<:KM]z˯VIqUq&>Ǣ˅azೂ ;]`0q&%hWuIg"4[J?IٲjԴJ+K@ l1 ʣ`ɥg C+KUf;Z$TVEL j#Ɂ`)?Po;"㝠i dK"xHF76Sx-(,9NСeX6:0@ڛ6.I K/+`b1baȸJ=<9NT7}*yĺ&\fgIl\[ʤ$In1!D- °%{, ~2X &3lP|˴fVɬ89}qۿ0a9B2m'+iV$ F  sY%L}5Hp78<޷ ?.z .@µJq -Jju2$2A7FLՋV},}XnIk.`.>WOOh.`+q\8u"[ ;8IZ8zq\LP!#59+nfE6=hV\՛u)bV1JJW 0Nc*XŽ8f)a'\sMYA r_ï%G%jӬ^ R(D/D;*A Hˣ!d.-XҐ Aq%wNsV;%@?$Wy 4K8ѡmR2hEo8{cۇLe4 sڳ \YjYEEYh4~\kn)Olg4bZdYY3 L\-`U[InR=DD{!$GKnV]u!6%eުփn(X0_ˉZiVe<^ *oCV3<"Ȇ^k 3° t POK }lٸgA2]|e ;+hJ>Pme2jۇfIgBk?q>F![72[ٿWFz%MTVP'%.+Z::.c8:,'n+88lNw$ɀ9 ϪٻJƮ%sdĿUf~d 22;~EI"n<^A,S4`,B z'h}2Q,}eJF 12rاlzH/Z=h)W4/Hyw}2S7'N>q~ܧr䲐p&MYӓfDNPY}LS T)Z'kd/lV4H =cW\q*MZjޏFIߤ`i~\۰z)|YhR m]/U(AīoГ!)›DIktԮ}ii!W<.XUՌtK9:AkB7Z7:ZfR%&M1TiQez5jkAFI*dXRIa@QI[Æ0`"1aaX$", a 4! %#? 2܀ G3PihV(CL&4F5" F(Ce>VSG@ y[nDf=uXyf\%U! yUtŝ;g\g9zR *pRwWLbzg9AF[MAybӡYA旦WlX9m*wa ~nPᖓZ&mXyt[LD[ƟUl`]`IvHqS'F4ca&1Уa+rx 0$r%#3!I&LcDG~,Y 7 C0i(TG8$FFhQkS`%O H[AnBdj|vGnzY EVj}dS޹ ].{5Y9xij]0 Lm.zZ 䳡kQ6muꀭnu TZGJihZmK_*jz٧ h+rZyjyZi>s89(>1DB>$MGb>T-1PDT F0+yH> 8dH[p^شp&@z"g>$0T#bP}>i҉blyM$KYo*yPQCrUËz(zq}PV(@wq'0R~oh.RUp:QjXX:?WQ9te7R+AɎ׭O{AaT9]q}WD W$6$E ;Rg,8qp])!<ŋ1d,cPjv4PD P2@C<)-l4 C "a(>& PHkb-$G8 ”ep#wdQ˸ږ>#00JBe$.U|є\vL5 YԷK]p5\ZElN?[ 1%sGbk* bXeLz⇙s)=6G*%&feo0g 9G3? 6eMtc0*){iO#t;2vlC*H-`‡j3Ix্͝1 b) ȂvI">hGP +0QzW Ï. NDQ$%h\ VVc^yE;w`ƺr7N\L2.-ml Ats`ɳ #p|}U (9L)UFñzIJsJ{/;3Eal>bE֡\N r92.,.;6Ö$4!Ѵ=&-%7Q"10B0nvP=à2>jDeĬG=B5LQr'0 ?ȡ!bih(FJi+G]g)؛[qiR쥚7<3,,q%[;μ{ *] o-R^9-{ugyT;Pq2tp+^ut4W`J򲡜V?J/]G@NmxE6Y͜6K5Z7mHJQ i싢T_[K4-A ?u͈$$<@)N(Zܭ0 =&D  MD44Bh$2,LUFԍ}A܀%i Ѓ]L^`!&^eO -!I)\!Ն(`!)l5N߶8XQY%V\Jd4NMA$-R%RE΍V]RS AiZc KW"͑RNI6ޑ^MMHpL;ׇ̄H0HL[2#C,hID$U.XOG%aGsE,U )_f/2_zlu1 ,L6N^q%ZN]ّLёU~ ݲ WDYhQV] (!540[]+X1&&]MK'VsOcA9-pшH&>HZeTqZ&ԚExiC4͑|`re pMڽP ᔘ+qTbdXI>=()mʀajƜM( c5+YYXD(BkJ^ŲRNjm%kL8eщ:WUy mMifyZ  yׅkXPEZ""!Z瀢H dM̮^tds0֎*Ї儅` S݇hɄ҈P4P9 x 9DD$Wd$BDvF(Tn"XMQPpTA6ۀBU[Q=!mf=toV1ՖaQ"[RAVB\YAhXvU6[j)AR)\R_ڸNƟ*6 )UkYlYUH)#SIb졃kNUNnVX4QVV1=NĄ@lڈln@sqHʌnNsZ(P$YMV A@}2Hi׍]ԨW Am ^@L$T5^4mk' 2YԊćUnbbY,M c*Nt[^n̡#ٕ!dU$rP.N::s] IG[#q"r%ehNnY7V`GʒJE)!ݠQʑ-$4'%%3Y)Aw][#Xo<lt Ơ#H#EXLMTM&8͌,DDdZ&')H$2Bԓ(Ո2穉A(C(Ѓ.Y_ܛ1Ua=yd_QaV RMKWQ 6tpE:Nk%SR{!5/ҏro.([Rؿ ~8R00Aր.9eLBo7<#]0E/U_VZ!Yk=Obɞx !Vre4Vu /܄\<?ieGϕYhoQh rE Ȩ B2'lH  <0͎WC';@> D2WDlC[XWՊ5IB=/\gp]W k6 I.R!sCE|a] MRz^NyYjRm5ӫ% 2e1,sONԞ)f; u")OS炜l?б"D" fzQ.ڊ)ܷz (,"sdӔ,<@)M~# _jow&E{0Jsz OkKlxoYK>fsMkY7"p7E+&7C4aǑg]qLr]I+ەQ, @H&M7\pIЇ&P4eJ0F 1 l"IʔFL&1Ĥ4)0MĢ) JY7c [j-ۧ^zMTѦ@F/Tetw( GZ2d WU羵SM:ڴmj5յq h:u^Wn>N]KmYle-zΝ[)ԻoElVҦJfkI98k,\RD6{̾q*^N\g=rg7lX5ffgSJ6rwTpK,s0n?;3mδ4#./D7*RAb"F@LGꑄV!d%q |DPR!4~H2A#.SJ .8 |P}d123IEOM@}BrKp8KLt9RnZS2:.4^m 9d.kϊ8jN3quac5W(,jYg/} 7 cJB[# VUb ©FE 5k$J<֫mkkRĒC,0ED3뗹_7*;)J#:suԢ1Oh v_ rAorU獵1 <:Jgҕ+:" ) 6Kl%$10-Kb4) yC& dM>dLMB 1=) 8HBXHW mn{0@g:s_R!o@bJ`D/`RشBc^\)+>Br똦4! )?Y(2zнRS1Wk7$z; } RIJLUvF7L/?*]5&,#_d0Rz&y2")x/Īe°ʚ/(AOI%7R8ltKR (cKR0%"HL2 oU58AgyHQ"1@J/Kp&>Q*z($)ob򚎼_lz֘Moѡ ~hQPGA gJ%3XE:e՝2{tG" +Í~H7_kYV^R}e@F#wQ}:` g䆠5ȉkƵ?Z4R=N>SoDUQ湌hB iA,PP .!uBF$6KR4ɐ%oApp16 DԖM`-cH>ad:J#&ÂLi @La} Y2j Q1X$"r8c%3$*cKF*G Lf8IvJ 54nb"7pU*i(pvq^y1PA $ğh'<:] :t>`@p WScEKo֛SE| %SǨKx4;JT Z[ U(=I:_5&SE&!0a#)ICP"I=ȈA n-'Mn`ABe@#yC&ѕjB4R(t6d_#ծZ&0'D5IceȲnM' *%jc9U$bn_)Ja^cs) ҕx_H׺L=&Mj|+*)ٞ֝Gh : 'ɭN6MLĴ f~.^2OucŇe+1q.Xۗcy vU⢉20$41$$&hH+-8MJBDTM.Ov'F[x3bF &P'?I k]o nws"#U*@' #PW;y략%|+XSZiZ+\JHk$ drfPb r0Z(%0%ޠJKt(" oh p` nmR n@G&!ƅ:DinͥOjt,v%̢"iUhk"0RI -YRE揰I~LɓB>cyQd, (2˔Ay(x% Q 5-0Аs"W$Tr0iS`]jGmCNRH|紤߇P^ >):Bx&Ո*C|(nhM$ 2A ठL>DDj. ")L$2!,"!Ȉ~HХAjd]GC #2d>ЌJh">SG.3"jŜ(j3H MEA~70ϰ*22,mlE`?g4c+oBwA"}J$̋R?jYU6K`iLnGu%Q4JTcˍ|sKg,.;퇺M Ab&D$J $MrFt"$!<J&!*$!J%*o fJrג;cbub ag.BP(bB+9so'_ TTR\R&gN@b_= t/?> n jqYYLA'W241Fof{(B^օ>dbL2ckb1/2H q] RɀXeB> tKRJ#& f" [d3ٌ#fM$z:/;&I D22Jd*"j%S $bhx2éBS$KO|0%ʧ*}W4ZT05a,9N)'ke7hVFs(p)WQxmA)뀤Ng}S>pUL^,Rr}V7v)N5 o/Y7fiZ;L$w #0Wml6jŐ.5as'`8P 5`4!j"n% *L\jK@iLKVB" c( d n i6SN\*V qb@_) +,Qb, 8 }ǃw0rFIZXQkDw_:i仸T;A%O2g)&`4M=VQ+ѧ k5uSJWp7hZ.B?ڲhw+ &~:Ȩ鬞_ia|a<+Tec"PzOΐUTW뭋?ޏs2.GwX3Kr=B"q<&yRֲ24i5ho K!Ҁ&x$2$&!a$f#ĥD KN~"I" S^pHv3iNS9 7p.b1(Uv=XcyӜl8'iELD8n<"-,Cvl,\gb{f'E|rf5gf¼VK;//1F;/q:3`x bD;I?5:抳~,Sl#H/,v B5> gqW9s`4Lpge3ǚgIVڒ`e4z(d`L $lGnh- XB!Na(*@hF$$Xv"zi `;ufK >jjg\>RZSdV֣Tz+Eپ 05<*JS>0[C_^1>d<7_p|g⌤㨜]⸣ŇٚcakGkeY`%Zɢ)sBq/#v&kIrET_A oY\gaάe+/9ׂjnars 4aZhi8-ׁSPMvpŭ6%R%}<*2jU/RQ1 qSjͅD)2븕H3u@ϊ̣vnu -I  *tZ#/ŠQs4pEIwF.-*tgulgDG߶^su_|J-1Ðqxp0TX?5m`0cFDXȏ7l[_m9c~;#\(iж r.pwǦ?nuuFXy̾ jNʇf?]dɪ޾]PqmXE^rɑRGetbmYgYfGcȡ>}\q .kH4z6b%<d蕦mԞzcBFdu@ɁodR1\-t J$LY8K#bܰ1KJ>@5Lbe$$mqgJ7,*X1Ȑ\0v\0e[veB (@3i4dߨ0_o #=1Zaákg'!)tA6}.;gaFԽ8z=fĢBНcIh%%CȘ>18޺fn'F{EWE5Te .2kV |)H$k策1W\H$Y۞@.H [o}&k:]9X%<_Ziq M$cd&Bq4*@CLJքF&H18+ \ $]FJgujX}n1S[p[ۥ&L` ;Є7m.l ǀYm\C sn] G^y׳kK3Z*(>_ ڎǓomtґ)YH-g֝GIM@6v>[khe3C"R o^!G:05 e0B J蛓!43m40]1G$ 80. A2Rb0 &@L=YV7pN8P VF\?.nL`V*8BCs&eJ||ŜA`W~;c PHYqX4`ד(d4j iG59MsCRLBS`oBRh`Ez U`2Wt0 yd!5)z$*r\h>3f}ȭ ky&g˞wk!Mƒv7ꜥcovVː2]P*8x(2 MMہ1%7$p s5 $";͍ h93%TW2$RS$lN ^0@2G9+q:۵7WݘZgVXrp-ckBhhfsJƖT/W~> B5z䩲 3H{)OzfWh9iwhm5 Sgp8 tWʊHD2~d@a۞@KgKJ SR“te)dʛJ¸DmM'0\MC7:f]^rpX>x>kw}NPvx;4o5[߁^МuDNu>]O^d@Hi&drD16k^,.5!\4(N4k&\4j.jܔ#P,@DAJiP.AY8~L~oV%Gfs%GmFvczRh)$(>!\T7ASsHK'"UXC!+69a)KG0Vpo0dfg|M=G.SC?2[6!ғ)qu-YWtgWg@~Yɡ!62"$dQC 5 5C#r\cƀsRvUK"KYyZ"@?1"c1։L#$Cg-!!'vs-XgAfLm_aFQŵ˴5iS3qW5u0R=Ax2[V8Fq~b>%mwrn 6&m1*PS9p *)65!)Y)`5{Ug4FA 0hdR CQKt.Gt^'CwP Ԉf??},4AfC&cQNg"oā^c"P%RbP3!OvZERsJ݁N]?A5!2BwAWa$dwZ ŕ2<@ BWƋ#Ȕ<(>0StdzyiU}#7yP(E49h]@i,aUw" ba-(b\iUu)`:c|1}C&hRH?I04q?Wic9N4"e\ B.9 }]V?uXaj5gց4 q-xXh3Ui[2#yf$RvJ#tÚdzd4tu%@$2b#N3U1wLu5A>)f1-5 $gA$"&Pqnra~TAG &FZ!n8pmYQzC C74q)69zS28fQX18)GHj2**:WtAP 08C.UcO2aYx+@BeN5Rsu$ZⷌcHScʣvI![$-(xu9JIyAr@?R pϴ%_RlK#0p@ݕg:.Ad:BY1#h JwBwrX>U!|?3ڟ$ru7)9caSSa}")0 ip'd*AERy '(U6b0ar|DGgvnf>5 =§s%gB4+xi'd K d#ck^Ɖy4EBӶ!y)NS{i qdf"qr W\}v3ꪚtƔ[fe;l?vBEwRd0mChsY3J~CH|3f [Co;NW6hܔ_sWfV@$ψR\B/u铎/'$ #D;_Ljl7#̓!q[}4¼+k) C6 A'0 I)0a9vw'*ɝ_z )/qa8;q:&Qd@960(J$L%>r2$D,I3p 6Jz5D^/n7bh6#rqˣc,yY]L|,TwMkJfICiD4:Mi$xg~vlڦX}4cYI2\M_bC䨙q/$T֒Xj?Ko-MWJk>=scҊi,WZ}[^˟ #in%>Lily 4_Gx|}r4ME+ 6f7 o މ:IE3Kgɀ#Eqp7E%s K +$s' eSipC7uR٠ > [ \;8"V;;@2_&-sSd}) ,C!?zkq3n757d\ZzQv:*5M]ZdfQM93 LFrLU5>:R;m ob9e5!)qT 71TCA7w3;[5'|2ݹ(:W8{nȝ969cpäo]Q;2L2̫aI+][0BA5 7.U}8x1aH1ꌠ#vq^ ڷ`# {1*F-a@^N. #p;.p?CZFe!7nḯ $>CJVRzlVڨ*{ ŚTh\"2KfF^FVh^8f042ަk1":K8#ƈ(S1\T L1~Qg/F Q.M%Nim]^v2tvņ(${rVIkHד Ea5jjҎl7m{'ыBRӥ τJ:k/y>tMa cܵ*|QRMɺjHQ\:\l-{_'EW,M4ph`Dx$߉i`.C@bQf1 =HV#^1.:V`4]d}!;bg!4D%-J+DKGMj>C E§a#'*U: e*YRrv=4TIqĆx.N!ZӒМEg% \UInlr P*cP[GvSP\cI=,H[pRbeJC 6>O%S̍.PmTTdu IZٞnu%LgE5r60]!M! Xy0 P<6-BzvA |bH{grE:'La~Kؗ!S! ˸ǰp0dVBEMF%ĉ4 ))Q,lғưl,^RBu""L i "70'kh5蔘3Ց(r3oM^O|LVp6Ōd$7ٓp'M1RuibiE["=I`*SlE@f0'8Ibhv$%.lo_n-lBʏw{Y3Kƀ]s,>-SLa b0/DC; K#g$ld[:+SlxHH;} `:VyLLUU!V2TS)cBˆX0rXX#3/-NUCQ>sOtR7~d\00-j\1,M )G=n*C)9'=a#%`R Hlڍ%"ިSs"!M98 W"4HBB싘# @`Uu8d oxW´' [Q&yn}YORU9 pB!aqM%Tj%GeHr'M71H޿au+l& M`kqҶZ:)ETQmu%7"OƤP5)iPSՐ集ƃjmԈe Ma4ɤVC}.Ob بA]# iT6`;vs?:Ol>23fͯ~Ox4Ba V@eK?$Ce1XA, 9HC&&h`^-`'m hŖC!MibHjx-͊A^uGL][@0mrH˅N60".~Y#GT)#5JdZYec)+foJ$oKe04윞U1cDȷ)etW`pt"mo,+}6쭊UlhE7,amU(I[>ݿ^eK r,*3[uVХ1K|bfg@;119h`JǗ18 տ4(C5Hl}"sF";*y J@$)OOyb;!" z`<:; `K#ڮܩ1SsRj#Q$<ހ=nۧ RAQ@8á@ {S:kr3Tٛ[ä42bA8Sˏ#ET̞hꀐUTbL,aehK,Y'i~ z5ʍ*:C8)*YF}$<#U £1$+"IZ IJZ1ՃkÅ@ bʏ9}<*N!.(*$᪽ La*;#!uN) R+;QBc*!,y;K  a1@ tC2K-PpV4BzA84X2<eaO23M +S, )L?!ڱI0J'QG fS3)Cδ 3WTN=*.H(x9h,+D:=(: )1 DarX (BT ٮ*[ a<5NBz*OS0Xa- :#"(pL$:x5mB C>4ES8<3;% 81hE+|qPy%vʬLiᏲ{QDQ`B ; }x01bE _P4(F1`t؍Q :ct):dYJH 4/"ĕ*5JT~$/zL{Z:PCQIhP*=p A 7 $c+Ofd\% d؈JH=6Z1a֤I4DA2ˢPT,gOd8pI1=̢2+瑐k28F @_ FG,:B$IH"AUR&kKKc (*e!aHM #1ܭ=2)+F8Ce0D1i.ް OO;h{)FGTGX ʤ@~:D_7e-2آ $ R>)6ȥjTY)N?)[(jM4X~3(Ja$e 0be>k˺%1mI[XZb-2+b![!Q0I$J#U:;C)e;X~oK(T {it*JQY)Gw[o* .6^VXqd,T''wC" OX>FjLۗt҇oYK;U.YJu6%5H~H7.H3-:$kNL5< _$@, xuz%%XNa9jsL /G8{It,]hEzL BRjӵpLU  ? NeTs$J>1䂝ܘ6Cr[ ʝ -=*oSe /@FM}=lo Ɖ "#FQőE}(QD4Qj4HC\Tp$R4YRSd=2pkMK/r) †2FQՔb- L71޽7ƊwUc1[n9F c1hH4)Ӥbnll3-8_8(L6# k֑31F}i~%c%G=xA x֍ЫRdʪ=vlKN;d2 =yj͚^l>ڊSێ'G!$MtUBaIA D]DOhЃ6r@YdY:YT_%4w aœЌy7au2XAX-%#y(V4EQUF.yB-XHk%%EGEGD^v)V4$(NyP dQmXM=w&vUeB3Ep5 avWUE.Y5ƅ$bL2a8uWgŅ^]IFYdL2Čw1&ɨIooL .1y{ 7Sݟ x_5 38XQ 1Օ7(P[m_6h}'o7ZZh[kUV\s`&^x`6 j%v8ca` 1 N_Š^JL&xXڧИZfo VXQQvl5R Ax䎨U^ LĞ桧@O~mK/f~u.97o'/&mOVewQG--k~նA~Ƕd$8~Jzm,D㓏60!kw( E"Zh5DszCr-GJV70 qdZ2n2k^%*K4(5rC\#W5bSb*V2apiXE8L4[&IcDk2FpFV7ͨbp` N !i^2KǸ"n=w$Sac* -JOCv`M{WgzO& }T91ઝG74Gy j}RP%IĘ#I#%OqFdFZDqmj/=UYt:| 䓻$ ~c ,@^4pg7%`1AMjEԠf1A3)0v3]LG4dbÈ1t5eJC>}xom0`w*8O'VQӌҢa62}ޢPD6CJ0T0)MhUDAe nYF[%am+ťLK@k,5H.hX>l~w(*!@UH^>$(taSP\Gڗ6td 9#i^k 7xAx)JMJ4koJm0J\jET!0p44 ф' פ!$˰Tqih4` ?Pu= BbQڎj "%f5r%ֲ(x/] Mfbl"הb΀bB EB ҚרN4gҽƖrO-Y&s& M]kLt̑wi'g7DB|Hj1K&׎JQ)F'd cZx㙿Xi@&fg֭lДw5yLiMQI?(]mf!j0}ܒ.UK x* ;) ׉O:f5˜^uOБLg}H-S$RRͶA5=nP1Zxja\ы %"67-bYO 8}Ou1Vm0r0]qH5qq bUYHRQB i G }Z!MJlѪy횱#Hm2DQdN&$᠊RcdĀ@V5P,g-Q цT2SՙVq8K$rA\}U͗eH0H2_ՌV =▬vT5SuR|B90{I%U #y-ncF|gP nZ`0pC* ט֖8@5R#Qn%kf0-OԶȄ.sP8ȸ`4d}-^F @#Q}J^tQєeEմeeUaL}MgP^^C4k l*-gpv0V_J' BV3%k9L es+Z0顈Dq$3ڄkL(: [P&SȨV- `ҧTaʨ⬎fk(&Q>JQ a#zQE $RfqfϠk`_D@3& \-!)б]- ŧv X Yp?1ÌOiEHYB-n}kT3_AM}Bw#-] F :=S:Du繭VbfXhp ?\>8QI%_ ά*1riE]!-rNMO}$(vS0D@atf a6Q%x4w0Doj]li%̜zԏb/&mgWX}V_;~~ˠ|Pܪ2iǁx ~ 6ROF()A\֎ H\R IA6pI42U+dub.#]WHmGo@IƢ}8j~ʜltiPe(wK[)vw,t"ۆiH:Nd@cEĀ+ fB~ RX#HTzlaOdϤ.>shU9b}>_z  9CVzYpSffF"Ya+mfQ*\u0k+xR& !==U"+"̟]%mCܺEA&Ld4"Cb(rGBbg eLn^a x,6Ei ,8nf0A12ϫXbp](kՖ\ O/b-D27 `EsPOVϪ!qĶ4m ΈXhE& 73 ݓhBid&qsMD!/1Z59 ]ԥ5iM hpnP1ޅ1b`K߂@R i@'N,*0Xtb IaSIfk|Q~u]! ]fm Zug &5"&WcE *_v.淘i$bLb bH?II2AC>һ!!a0d#4А!ċ4pP&,qFL.rjh`+֚$I6B쪁4 pll*B #[kevbH74M֐{i^HR%Ф"4,=kdiGX5ZbJFj2"HM)(ӚD; ;L*驯ҭi/S WY7MH:VAQZ֭x+ՠCm5V/Ē0:}B1S4 úA0+/ ŨPC 3pb!FI$o]17 潅P>%ţ<:/=1p8@<I14chk^h:bb#[lT[B"S$.qTcAh1`vȜY#] $YϨ.&u+ʉlNMIi{[Be-ǽ",HRpciQ- {.rG1%ڹ2&&4 1Pzh E/Ahf"ix)[$GerS k$\lZxř4MHv)pDHob(=wGJ.LڔV ^1{RLbSH,L %S04uhpZEY%W@UHF-'&$.u`X*NUf8XAKZYHH\qQm-dn3=]JL2 I]3,ӀlN4s;ۉ8終!<ʇ_D  dGc䌁 @-V;\2ah] X@"Te+bc^E2nꨛj`aS6+mD7I2Iϻ)eQ-+6U9H3’Bх.R;TJrغ\e|NY08'`42CMo`S C$e6SjKPMdԦ5.wS9!׵ţ 2T4k'>PJe"X&ҠLlySfB|-'oS&Iwi,>4k?y$zb`食Oe&˧< %0W|faY0H .{aJG6i]FǬ-l\U%" :T,sJx, %D<DVW,5QFЋgWZ}8)do4Pa(K[-P kwYM/84f0okaYp,t tp [$4M@܎Lflܢ{%$(=QYhQ]jUڏI&g$TUhDq-hOiAqʕx !u|gdW qJ{WaYTVs^(gyWҢ>EPPݲaE^`E9 ]bG*n{ b%9FcGp+Z'2a!0]:#ޠ >]~@!д㵬#T?&A!d`A,TEP$|` jF)V`$ngȏf(Fyd6x,.f"VT.,^Q.k K~T i)ۚģ%^, rhZ%tbIʬ2E$y,gxi&Ϧ fP8Mzm0nfQVesuNbNZgcgɯpON2TW(g[Pc4n,LrVJfIUiTO$C_&;R2˳;!nnC$alCF]R4!Lb#aLփ^Ad2"`h ƒ'dFK'MF~dd):s.P "SDRpA`Xh".jRGd5zD8Xeb^5 ޠ,HPV 4$(T8됌/vHF>bEuILh805Tb̰Pqt@x#F&*SiT|qlȿZt?Q;mPU,U&=SɎhf?*B'"pD1B)H")AM$TLfGms\g{2k;@ALBr:I (0`@$ᝐ" `@NEɂDLC#H6&L;p( `vb2K ѨFH/|D<mY+UUo;4CƠ8]X$6 RMJ.\ve &Z*ϡ@Ż9̲wH S.@;i- `/tt6ބAňAO *IBXMZwOŋ~LJ'mgSt/]O(x$mrAKq) )&HGD``΃>AN^&@2Iŀw_>TDcCE^ӒqFMwc0^F$dd`,eJ䦦AeP #HI6+Q#Ex"_'ZZnpeCiC,_V0PkJFW FUt/*n.و0v _LVB ZqrjqtBJ B*яf 8JvV2Hr-'  :/lsO{U%5̼F [&rW&S XYWao0­يHh NY\jÀ$lĸ+Y.R /ir\0^҇H Ȕec?<@@NB{JַBf0_βW̮;>TDi+wA/ŭJTMn)N5Om OH&uB:}>'gGc5"kȑ[RٕZxi>8l7/tbgwkoZGFWE' 2UV]d2: TluVGy9_ ϯin#=j`gN{ 2yYg7_d?]4C]Cc4`KS;v)<њC;c c@'~J{Y$)~U VG/>eASP_h-H0zQHÈ,ZE"FSYe,ƌpaŋi['B;K~XeŒ mf1gPDȰH [$ѨM)y>Ti4"LTm,4D!b4ogҢp6h(OF:۷ZY̧1"ܪQƋ$6g/m s!|j$yjLґ 3lѤT@ӎXŕ8wmqێe7nP5VF=2t7\yіiR3)Falq??Faݗ4I17 ' haܰa{0'|MI&hl ( 1|Ƹa  L  MWY{Ŷf"ݴO2%Cq"ݑU4dP㭦\dc-qDCcʤYلPDEeXyodo ZHi-o uQ![!c)6D Q$UEg]uBڙT]HUVYffq\EՒh*Q\]id:Q*ZEnޕ[֜9_Je*DJBўWbV$Fz}]H#` !$d20bd"F b &${ $ôW{*/bL#􁜡 ^{0` 1p @O4j@zdSSdyQ JJyGdXު&\m[snmfqvRi-]Ok8E]yқ[7U6dL*yr\eSVLh:lSa.c. Q&zFnS2s8OZpc{NxoVk$UԞg㌺+{iP>oqa*Ù0_ l e2$S៖eBu!=Rt( @PlCXX2];6 I*0۟20Zqrb9U\KK\-s0bx9nr2%tF*mMq d.L18F!628(64(xf9^ㆤ1UArd%<CIG-Qಧ]uQL zKS oKU:#9pr&/z=|'Fd?k$D Mbo 27L qpZ"dB↠c V~ng!Qd"[ݴ4R8Tf 1D e*ʈWJVdJPMk -ɕ)޵7uX /ȶJ*㗖JYSJ ^"3T@KSrvԤpoQ8] 5oLɞM2ڐ{bqJ9.[✘PO/Y XtȪ- K)[:QՒJ4-եVAγeDc=ճl:si b0 5Y$ e(cT#DCɟG+Y#G@z& |4 NB}4raTb ɋbd",;E)"dF44Yc۶0ZW} V%!Vd) +ʗ;BXgSeE='*M9!c"4 R!r e0r{QN{D<3Jx:y6M6A*"!l#8c^Ѩz9-@ PQ!hp.O`b y΀]TiY]MoHN3l*ak)N+2x9oWFW6&y_n)GL..5=6S&;䟇r`jH*T[&=BɋE% ʤro[6bxgF_z#֊vv #  btCi1g216!T"O@!u3i$1)" p!r8N6!!BD T+%^*l}@^m,Kb4yA&aFd!RS6(LEKIä5Fzm2BvD;pc}aa*@:zH1)WUV^^K'DRxW]{JR=d/{H"6Y3aYġXM~nBeB)%vno#a'GlOad@CBBV=RQj<1*33 k0u1NqT\g xuA ( 1RPq[uVh0㔌Eg"iuUP?"7nA:C凜QIBD==`cQ_r^S,2(࣐DžWEY-dBQGxFyփ<ȇH';V)%U9Bԉm~`㐍H%Gٓ7DSײ,IK\2Tcgd)(7R㏣Rf8-I;_y|b.O7PҢzYqM1Q@ /\O& "M OS3γ}rzɹ6@5, ߶.1U(XշDT>;Fz3XSr*8I`WQeD$t8E*+kl6<|u({,VhiHG~DpJ|ue:X^%WGX8^Cѫ-w&efSFmexIlOoK{;KKy8R/bkIʀmEH.E]c\:L7||I)wl^c I%bb­w0r\NN/123P[CJ973|) % DOuCZuX3$^X)aSHPr~ e T7˱P%5%V7oFYE%E=Ik,rmLD{G)a[SV^U!KiC4 ^}#RN8ƜV7@dx>DBC$kf"h\&4җ3 L=c34gZgů"I i8S#ՅG_qw:w۾y1u|{kj^^(5rc$Fbe-|kRvA+D%G]uU)Xcqt+*r5ZʏlY3C=tCT"'nCCƭ>mBS9U8̐ <2gd/nȱ= OF6}!/rAh"+EP _6Zoj M)ҠVDӗc׊!D%\K pu|5ZF|y=Y9ȊNyͪ<#E"CSXF&T?FrZEl*m%;N)Q>elnDOپe#@zՃZ} k1&F!G'#@%vR7H$ ꍽpc궝N #^r)7ȩGڎhj =h):KBLM"fonBIØI򢏦BL ~lʾJJ& 7rTP*{*o PB-Øh)1ʫL*K dx1+k3"k  526 E !EbL UP.ATXƬL1J;Yrln6t( RI:zn©{7c,s唂+9񤫐WJ {TBjm!*ye)F;J 4GRfړchEz6fUႼ#<-k_olJWG|Di[&sp!-bp0UӪR\4KDM,:x8]Qa9*Y^R6Ut<0W;cH#$},DkdZ׆Db%B0T13qOA㤎D I9aFiX>K)y$fH֎v2 Q&`qקdѮ P~D})-L4(-ya6"-YYPF&J{'2\94$OfXC@[L M+\Jb1F 9UJ hEX&1c:*pip.};0LǽWm2 4wr$LPtQs8ܬ$vy6 )Ci@da~WN ZK$8 &Q['mhc@h7.t@;9qS$6)?$$ 83Br(ѫ "F4< 0&'r+.| I ݋sL  ' /di.qD9K˒1ЊSX#Jb`( ĺ-FpF0 @øfZ%"KAo ñ5)j MPE $+,qB`zB ##N'JSe9kY" e!g!*Y,7^"9$9 i> l?f Esޒ )(' *əy>ˎ B`-ܐY,Fd3\?K<| I3oJD sٶwlbI4II1`ĸI`jFؔę ȑLG/"aG;\AѼA)τ#h: 4>8j .m } zcC1W⹠/9 {l߱'d JYtS,E tZΟȏ2Bl'?gq 8 bI9)5{ky,ù!zÞ.+j+,g~"4,O<Awar11E8[[×eXСR[!N"5x"ǠIQń"E`5Ǹ $nNa o,/vR 6℆H;vK/#-dS &m[0G7 a%Y~,m[Z Qd&=}*UkUiD7`ldNl6b7]1j:OtS ? gEIKQ~ ⅗Cczbdy8e` :V-QYƪ@QFX\FL:b Ihy5Fٌ@6z4hb(LЄxTh(Abne.9 qL2LER:ɍyɰdN ";eݐu\n ۬(89 #yV-i\__]֊B*R>.HE>>2kRag/8^xkYΦns9Dse\ճϭh~yl̮+&aL Rlt(6;4 /,UJy$ 6qm蹳j -(,4=q#}7gEtn+BO*>*NO܃1`TOyK1LI^Vc'To($@:e陘kRV1`*oY_)ڏ菜h-W@=h)۷>*m_BE8aAbÒqPȆ,Q/wCm4HU8b̛IE*̘QP4b 1n#f0bVl Ӗ01΍yۚu#۶e0+1`8Xʗ (nf1@44)D!)ѧ.AxS' Zྡ 2/jQ]f ˃A|I3,8!7cj2پ 5lqgCÿ́P5u+ Q|ddDJaDhK BUEӈ!t!W]wErdD'SQUipAKaq6E84.UJIY^ M4ͧ~H4LyxBQHeTZ.hwfcш2˜X*\wbve07hYz_+W^uv@f](cEZ*8ƙg*idf [U>1GqUaTP]QYKK4tAID-$ .d9D[N}KI51Ai ߀A[ld|"#Ytۭkt'XKVb "xOf,ڇیC]Q98sJ\b@^qUi[|#cyg!xA(h0  Y 62:,sW癬E MNKۜWr@I|d ܴ嗝~-`&N7^{;o"!;7_^OM&q[v.4aHcƷ_lMon sbOXX`u3!E!K5 d|vTmHcF< Zz[pƴAulyWE;,IlkhZaWPp%*h\*s)eXRy `*K-+<:*sa#h$#Q3=:wMe`uCJ+.v GHNpRfsBor{(sT>gB+̖vvaن{(ȇ@LS:'`ĴcE$qew `R&fEAI zCnd3sBͲ>qȖNxry08Z 'y<(XR#'|5c >m/g9XrF11}X% ſp-ߤf42:g<sgW`ӡ.ȓn-nB nd}?Iq;lbUKGփD +nRIgӏK;tv8>trCeز'u̡'3~A]Af(%vdjږ?4fO JU@52ƳI/)ɛɃhE9=9` 8{%NVfF;6a Y1X뛬 yd#D4A d"Wq1rq qzZH1o#)T51tSW[Ӈ#׭W`znI}b%kW{k SmE)I WTɮlc1IB $IekJVnps4a,D.9"qt-!ާ:+E֣$4. vI69c,?S% ckRVnh"pcϗ{r/m)ؙ:ߝڐ=i+jDY 0b7tyc6^Xoa0Kͣd&J,-G:h4f@vQmGzsٳƪ9Bi =V gTSORT)hih$q 1(6]%RaՌN(5Hіؒiph8C(d$|fI-BLp|~r5tiw)qG: #X!g1E$ }/] fjaқNír9ZŦz=㪺7e$#K ou=z)_7J<pK}0#ދ59]I,*^aLu&*--7DJۓLOz6PvkkB!)QWKذV11A,>C4>i jZJ݋pUUPYՙǵEpZAwK8DFd^Hi {] XQ F=Ωe@hh>&@rdVC@D$BeMdu, DMpB XĒI80Mm2vF_ IB VC,<Q­剈Mu _Iߌ)4Qҭ* O>4uǾm 2 '9(1RtLTu hGae ɶ-/ DWYdןAؕ Ɣe  JFU{}_\,JAdXdT ^U^ @@ TqJM'%)AVI 8AD&S kD.vYƸ!$O=A1Q!&hLEPĒĽq\Een吉xYmќH~ՠaD'-Mn@ae@DAgЉvBaD~Vҭ: M@$9X! ]IR\!?sQz~LHj:D|KK؞!P ]nEL~[ Nݪ\gE9VVSaI\Hjȴ"j/>pEu]72l# EihX(le@bډ)L;fE RP(>Q䈝^q_vVW5Y"taꖵHdA1LL,g`$fU/&W V 9ME QҜe TbմVlfjVt~XhhgH8]1sYq˖D|䌀&͌5!j2iX%1uhܸEhE1_x]MJh^QZf ~΋eXΪ] C>RޏTNa0ִa0n ^Ԡ&:աg,&#>k8_oDaai*ߌ_'l0 )K\t:)sB,r$-W|6=i6- N3톱n-\ش EQ } r+H#L¨1nY tXJ `3MMiQݨO1ٔ i#"kpfvZ~G?Ĉq+Nr⟄XeqT R"O!%YIFɁ% GCDmҕj&m 1AKIY<E(<9ޓנ1SBId$5P֟Q(S}*Ymhm\ j,3 a5Ť$y=EM%)ؕ#dB|`H8XtW+@cAeȝr. qƬx( gJ rR0l!@UʚᘾmTrC~%xӖF(5QH H3tSs]Vvb"~f.ޟvO}YMp nES\SuiBYG2aiЩb]a]aRt~LTzܬဣ J؉MˠĨT , &F:Zv JdiHJcgfjewOB\F֭T$u\&.ć%&2vh1ŸLԄ,k9.L/~'jR8EbaP:Sfq5i."xf\? Y,SѢTY S@ fRᓆrUPlPGRhp&҇F$ 0B83n h ~ᔩثc褀nhj$ᝌfW&O H g:L3$ιNP؈ /!B\&Q`KiH52؅ m`z[~_VLJS:suPK>kPl S8xwс&]*nrf_ԟz_Qޘq{՜ +|rr ~V"ZDZzըf w&h&T`0B/Z< H.ehexhΩ;Zer؜D/D[^4)՘>}lgJQlsw͂\UR\V9~ ?sVwRrK8ț_@@8}>/S#$u^IĴu,ũ uERelxzGPj@-mt"ՃL8t2!ts41xJsIB^0{VTNivv<f|N-qȠ?{TmPf£җnZpJ=JΊ0$s2_1z~KtS7os~epjܖ/dZ 0`7yMr񲧅^M )~0bJ(F`d0@޾hA+0aԷLAh))J(ۯ <^z*Ó$J@*p; RPAJQD0d|9O& .}L#fP8f" rCDL#kD*]Dn=:Q6^Q<}P }p'eB+4&aB FĈA+1!t BJ,"/&}/rӹbt+0O3:= ``daZ*]uRQ+;~-Óp̍R;r+w !b(@xeS۰Z՜KMr#Eyt!Ss {{8qu*5N{)'9`]u.q[O%&x7Sݓ.)69\5 }Sw{% ƁUIhظ4{M 3-%-M>:}f';vVH80j*JCA4D%!fa& F :]l2 2LUGGu,U%g/ U/H5 1@#M`Cdi5< Ji 2e=n<1.Xg{Ax&^ 3?~L#jrM]gq  WrMYCn׳M % {hs!#55]?!"Qi[ؔo^bbR澚~CƮ<[2< l )QS4@70b02- oT"F+[c3e.lq_4V8%L%1rsj/ 2_Q('v8%E)9rҜ@!y̷0h e{G>Y}E'*F#)g=?<Je)͉Z2Om6D%BAx&i\&3׮ !t Y^Dy,L*5d!bKz$,MZBrꘌIK D)6=C^`Lz&&A#v.GF;\I1"𕾙e[CIr0ܭpʍQ05݊ 2.F3t\"R*x1;8eThb LFw@Ծ 6[hYvjSELvt.p#;|Yq,ɢjbrNH. g#+8ˣ:Zͫ`m&HBr@V| 8ڡI{ vhCtoȖUB(I 3Ԟ5ӭbskpK K9:M$ʔ\Q^+–|`@ӹ[k+1mPk Er`em^뷰j0MY _G U1ȗ/e[沩KL]`T&PFToMs_|听l'*1e,jse}|WWnw.WPV>Kd, N$4GL3'=y>F.Xg r~ke. 2ahՁmŞlCDXwf+d͗B+JKrscdz0>&,IdM[Ȓri^~us8-hU0)P"$80 p=M2w0†.ʼn0aT(e q#{&BD۲bŠI2R,ϽUh)!YC-a2k2eM)@{PUֱpB'WZ%,Z'ZW\q,vria՗KqXC]xltIեjBժgr.$yʽOf%;0|:Z8)z٫4@P 7Aa+s/e3aDV:uGeq#`mGqJ L]*M[Q 2,Er+o8s+8s_J uְLԴɍVfo4(hh$Z a-nemS;ox i< \2X]N`~vQ%+ K˄ڮ7 嶓+'&~,(mՐCBGC}/9u.7+X,`*2 K "x-`%F`*1/s  rBFE/ g. {Jn*RB'#4L'B/xc>䅱V ͞ǀit(6I[TI>,lD-)ڪ℧Ȩc趯 Ӥư8Ne˔n PH;άd&΄B膅HBʸuTgH0dv ƻVDKR*LChZJ*aPY)HOŲGf8ҪʜCcNn#NB fb,p P0KT.0j1>Gc(s8%r(0PBC4頄dG'$kgGY垤>`@e:, n\OBblHL%$lǐx,YP ĬXdJN"'l=D)LVsLH8 [F|*CuRI,10tbIޭΘaҺ2萟wfkh*D"pV >E2e1!2l|.8 sȨ"TH :Y"FGlmu>ew>$LfG֤ CIF}_!'ɞCЃwrwDT-lTB~2$sA<"HIY$y$nE~N'i|hC~.zk~vI<.Q&o7Hf N.JbO:u z8iw`*$ ƤFSqFR*drR42@e’T5',tb V@;BaLrJRRzZxI ʜM˴ROdjSnf:+.8'V$Z.[Φ()8z.7 /`Ѳ]J!;ޚebL (#CಹҧnҐ'5fK{"N)e&-k:OŻ,$NK$,gO9Q6^c¾, 1nyT/2Hͧ|q ƨ3-Q*S2ڮM K#3l.F?nKH*FASk;4M =.NРv^.X:k{e0БqwX6u=`Ej,"vb$%tfN` 6rq [M;4Tf12: { m$%_GyjvBqZ`Nڬv"[ =_ *4'uC;JNz/Gԅ#CCJʞr5^%KbEBwZ;Q ,dקus0s ET.U4ǧ \pstL9sW}K˦BRc`3ƻkgPI!PBJuNc9_TlVy]KvBB:mN;ċrCflzGWGY.?E@+N^MVWl ľfcFז!NM'Mw#s,Bmaf/|wO]v|@$Pzm/TPp1Pr4E(4JTH/6c lЩ.l |g@*3z6 )@iĒzG_jAO% I)Lv\Ow~ ݪ6Vj Ǧ{Jr.LNNb7+6A/F̏[O}(b1-ɝQ83")]Z~!MH&BTlgWYKL;ʡ5*h\k5U`, 1j-4SܹKܕ>G0/*5j?kB>nui_joiw.;xGYOzҀxLx.Ԍ| Sx ixf0 w~B`aELIbĞvBJ y!7xkilk j-38rl<Ψk.xK6J &u$hFՎ$Op-iF@ NE>4ÎS21RTJ`Y!UnvŸCi{I)7kLe-+j4qk4\Ǭ}/-.&Db &bUENu,|]a\$Q.wu{myo}lx9p}G Auʋ$T"-̉G|V7{Y|F.pXo~Zz 6[7ko>,Br%_TS,X5#Xsݙtsb5je ]ND|f-O!jj~MN|o- C$ld -##I㝾nw"u0[|&Z]Ⱥp4q.gʓfz8$-6<b,șfol ^s7gH3X/_M|JS\epBvJ.,V@ {֙xw6X^:n/zVrfdlli Qճ68,|z'joҳ%&^O<,[Ys+ 6=xϟ֬7O?R='fUO:¸LHJvTF|,`>zՋFo}6doA/ԲeL #$I0"6l0&% %-1`Ġ"FbЩ'@30lfML"iΝ?ctUQ`_2b3P߲}r6W7!hwU,8w݊u+F 5&`OKdr0-Bj'&78]©S+H -D@:V&<_NшdP\;j!ŢZ9;!tXH}̓WsIМj~s%r@rnu3_x,gROl@:dV֢j hWLgg+ iU"rӗF*F4" HhfYArb$S&'+n ̤I p JɌ#oo QƹĤjJr{}Ĕ 1ĜwzfS?xK!g BF1H* fHN/?6$υag|4 T֗=p+=hiiLmZ$(t.~#(dVx/4C@XDtԋ^vra%E*xU TDYK7!km"JV\-ԯ4 ZٺC`]j#ox ^rӝn4Qvq`A H%.6R>Nm2(J6ANlJ[A qFK8ղJT?GjˮF`h5zfb̿`T,a+4k&wa1C丠\!hNb9#$/ݑ]RH܂^$HNVLAZ(``r"a~‚lIįud1@#t^4Ѥ [q4 RA1HĨ(QeӤ4&mXXHLtc~!)qldlvi IA~d+Zi] }:+H"w,{i{淵?f~00<:,m\軨x d@u&WZI' _u$%.@^i|,-Z.xjAA+֯F>)+nK3999|"`s}A]k9{$Ii K^Rߣ$&K|lK pQ!F2%}m m$o+E`P('o\C~p.r޻Wx;[q{G2e9H4[32:m| {P$ĽB̔S:$Lڜg>W?=zа:h_:. .zX4C3ud@# U.2uv?rZd161\~&4qrfV~>-R;bѰQi o*@x++`&3':xV47R|3yR{}SFaIaFTOk41_%7Pn >cX0Rus6%K6b+!H+WQSCg+scF:0C/(V2;deu02=HdYLQ&}Vå> S,urMpYJA{j ?F*֒X30 (Vb4,gfŒ#A ehR-NOPԊuyvB5y&g"{ww.'aL2T  4YpvcČ[wK"%X3Ѱe2"~E%+$3P*/2id12va$r"<&cjiV >á$™]Q`Ck!x@xE+S3&,'I8F<{S* 7"S?x:`)#&&6CŚ0uЅ_m挬522Aȇu9U&7iC?ӂBtXt%Mw>y4BABJCV-LCmh/I'vsV\4,Fh|(.ACu BQ!J[1Btч]Y4`HU8 8]5^SC~E2%Ė.BvN5gV~a.$IJRU[3Sp%v$C2zMՉN0AAwDo01`\;'h66aRI7ggE:ȃES`y*XH &7'Ĺ)&eRI(P-=<+DN˜r&IDV./g);D G, SM:B74$ vpE#]QCU +#$S!8 uELn>v 3r!ׂ\8D3Mo)qQ.dteOi~Tf/$Hu-=5< vJEtܤ[J1#]X?$݇AՕ3"2TpO&.&YmV&)F#ExFA&*ћ:Hm:)[(ts@j :t^8p,{Y}կ qCR3r+q?b}~!}*"/oq"?c3< 08:etg],FDF %b уiT^'5RRb 6٥4RVtz('#1 ɉ@eT†28 +]rW4۩bѝuT[*:{I:Y{"U o-BLw2S%+WArCsd.ЕiJpxf:%VPb[P.Ve""P"tUzAqLCZVVg̡%Eby+*ӄcӔAʭsF.L4hA2L5|W+@'68awf4Rk`bccÐ@ pkNo9/]Zpm`S\İ-T/ɮ2unr5Ȯ!{5%.TcMt]]j/YvkoYq3vC~Zeꁴ*ڗQ#TcI)r!V1k'\OJZ Ipc/#hb*iU$\,xuI%;tIX㴻[CX4<пDX T,+ zn aD i@iP'[+&ˏ|b)f(@NE/M*A 0 `Ԓ%q&Lmʫl5q7RR@q~CQfVP4ncU.s8f9u[vJtIWzv" w>S"$~BI˄5DY6c,m)b%ʰ?[@RB/ҍʇ%ֱd3:hvgUdϤF2C7s4;T:CMT*qws$[(]dCExZWp$T%&oH 0 V) . i'Ǧ[&[P(>X&n2 IȌ mԼ0CF 8pk;l|{Lb`t13QJwcQiO [yHií/YTB=TDʌLH-6< X>8r${]|r[v]zƓuvJ%+Hcffb[;nU4溒"qc1=)u&ja${p7rדU?Sװ>[Z0*@MrrKh; .nR+5 w(MC$_(a'PN1 8&L]ً^}_=rȷ "綟ÉF2=$ d[秵q t%ň6F9kKSuWs5e*NוLv"$dev*wuMjmBTBCN~浭U:ZCأrPlIj+|boCQMBu ?RU`cS5"]#kc-ÀD(л6&GqZ&f\Ek޽ M t"dR^1h|NʀnULH{l3"7dٱc"R!cdЬ@gwC 0QUQ Ԝ*EqB1j#+rVs!.Tz^]龭L5Vh:Շ6k4^Mv_l{4mn}+V>ūWuӶ}z-aOPӃ;/[ CUi'/M֬v-qNm 9R_''V)p.ާϫU~w\],`jmN<1b=8*k9K:o;ĐSmʚ:M83 O +8ք봦>k?ڊJPtn,ֻm/cn*G}BYfMԘ" Ra R20)ɉ:2b> ""`^2 -(ʥ5e I6%JGpP,4 [ nF1{jQ ?X4 o.*zB]ʿIj-6ϫNn;Y 92UkB̮5+Ze =tmξD kme*V 5huuƯD͛7SīJKYT=|5]TAجL+TV)}RDT/q6Glջ7Bmޢ@SUCuE^%+H3tQO9Ce.#C 2 J܉ɊxI~zO% )$R(hIĘHM MzP2; Ii%&[Đ T b@waq׻ ,^5HQQNm7ģ:KÒ;\6v.Y@QL6kAUqvt׭]ZZ}@.V/O?K!ZHuNq`Z!I„3Ðw ;Q˾e_ +V5!%}\g>%']9e,I,q@@bÖØHȐ*&䱠f*q5*ѼRL+Y5 g*y6,^b,hjxCƸ@A,) - B"I[R&b6lDM2-K86!#X(ZizrJie2X!inV {3UtcQU$[ $Ek-q֩ݵENS\k^ ./Ό.}9S?H6nBҊZ{ٕ~UӪ+r%B\RU*@+u.`f82DRT uFD'_ǢGɍ.8u!g=S{`3F\HYd(@&#Y v*4:AycE|9@hhAckbož4_2fT^#;P>K%[~s[j&z*=#aY,Ѥp+, k Xh!9X/[y@%A*0H(";و=yb-b 4 }a0(eea&5ëZ}ܠ9SCΩ8;Q* @C=-y M1x3D, cai-kr%mҳw{:\ɺ\0r,.؝ ѷ!891@EIR!j{i@+SP*+D 5i2=C9r Y<:+O bZ y;]k/jA/ĚHR"\[0 X +je8 s/.b!}ȄЈ^G;8@CM`=LqIZ:b3¦9%OC'EHŊ2D T({ b EЕ? , 3K8Бz4qepG1ڃ I1h d"' ˕2 [@ Ժ'ˍij@HBAR/{̘K 엤sGKQ)!/$Y-D '*)%r")H-𩢐h> eHHMP.AKZڇ<ߩ=D'6I>9T19}˷S2cyҙ:?uz,-L E'>ʁQx4?s .RuѺS*J |̷h9l,pyz =CwDS3D!ұ< 4D|!MHLZ^C˯!"AH4-bFLH-ax4h 1H'A}bH#DQ,ۏI(1ܒ#k AS0C3]Z* hEW¤?\3#[-姎ɹmJAE^ӟLMgMVH>9tKyIL#! s*y4,1~4mщ Fӳe4V%ԩ'C7 b4 4H~d"`;]!ɢ"N)%ћD+B1p$zȄz1P, 4 4 # eOXadžBA&1< %Gʲ1 ㋍dEtBő9f̴X}bb 9CCq7DBY =V-  QԠHڈ=DEAY-k;<3&2@B.\2;QKB bxP׎7ڲ::KGYFM I0IU )HY4y:1\c*BbhȑH7HIЄ3QHR%)#J(OAdrz NkL1_$ IS⥌,`VJJ eٱqYtJUV3 C'bA 5"L ) 6x 7D^RM>Z 48G@V|۰')]WA .Ϥ{ Ҕ3T=SFzWG֝eh55@Z@mR7"):<;)cd4ȚI04N9ΟRSa 3@ d>' COtB6}ISn+VZS T?lW}2ɒ[s(K7٫-e~Q3Ldz>@1V+]a 7#,Š x-T–]*JB8&1YIdHdՠ )Нѕn,bT1_ԸEeI0CeԎЈcFԮ(i Y 1]H0T0^I굒ꐊ%K=%ͽD>Ca^υq b׃֙i%Ĩ;إ4RBN;Jn9c hb@3[! _vɰy <& c Mu)!gZіm)q{QYXZ bV2~E.HGwv]xtW>e髧o>zVo_%;`F+2gpB >ܷP@)K0A*cBd8ph-Ӕ&M 1(Ci-8lt #1pF̖a.ݢצ8V@TKSKWLōa$IĈ)Swmzu֯0T0}2)F™싦"FFqfa„Of 3eh mܙsƐ 㮸Ru4;+Daǖ $N@BM]#Lm 9Cy8]%ŠFCo'̈́m6Fql|1@)aB.A2DI$RPl#Qm],%\J6 G"Z jGz6v&[~z Sg{,nQSF Ge$"yX]G{]$PQIn&+H=9)&j*1$TXem%U!Vc2DՕ^TK çr5I5I_$b$)#R`=MEP1@Q+0Z s7S~j&fd5 Qt%K@w^l3WzE ɚ@-Q^)sTKI>::HLpSVN$C#5e=`}$塖˷HFJpK_E,^f="e)/DLB0R_203̄&Ja`$FUPb]E %X hC"¹ hh% aj?JdI:zgYHC9i Ӿ#T3%m 6ᷢ,mJNSq4Z}P]9,BG=)͝Ex|$:[q#1`^{נf  x8Q" ѓV#Du6̛G~kۛ0wG UOrgl>2B17TXJ^X/7:&*Z⫧SҔRbܠ~K&АۉAUb0sK1A(CtQpЬZMWFTd#,>4#s^ 9A1A@JOW9.LAƏ>8u:5xܳo*ٗ-6j Ep%Pk5ጪDuZ4- _d`Ѭ[i>IPu>Ds 8V㒌hF4:ޖPgjl<3LD,FR}NQq˘V` 290B̯ C#^%n)bVMmEаEYT&pp94JR8T}<,c@'j#6Vz~^1Yf1i|f1i3g~鎦.Pwpeå fk]jJC8ʺن3&b,`ub.H?# >-|FJx]C;DbTʮԝ]Jl g-_'(b11c@3y5? Мx[> ;8?ς)Ra:ޣN/[3#Kbvc #Lŕ+[x"=JRn _UV8VR<SDL1C QNoǀ퇈KAh]l@uMՄI W Cѥu{q =ݔ8A -FH4iћHE 5؄9PHM4XPx̌Ԕ!rDͭUeuP4Ĩ yM854L<) etIV J٢hdT$l\/$ .ܨJe HR@ +6dĀi fȂՃM(CJ-"ץaĄI Կ ̈QdK!RO^4QP~&eĸOD,C)rMGPK9KELEVӄ%V*bPי C fAvѣN2MBi:ŠEV@6pWo\[J DH|%r@%"nǩt!j54yGa!5XжeQ팻 ~A&@hdQhEUhmU0 \n x%U"9VWiJձd0lz#55]=P}y2svmK]<#%ވXM`P:q ^FmWڐ̋(HzisȆU QQBV OeuF4qd":XMsL楑}4Fa $ވaFI~[%a2TKH%ĴsXDdڅ&DڼiF! 8Y>Z25b2V #$lM;샎A#V%됅\E]\_R$\b~E3" UU沈(Oƌi0( 'q !jsZ yaRʶg?I*ƀN +n̰$njNdÜoZQ](S!q E^T_vل Sh -]G2lu4ቨy 6 ؆,:~{LLKiiL}BL$hgm;AQ-bNz0Ib^`kT.T>Yy ҘqRQX }֨N E"J2*' Z| 3Ion|0s2N&>Ƀ*+X۵NgpTn !82`+IH2vi剰0ۇ8CG7ˆҸiH9ԇ*MYhDO@\V#ŵWtw~1 W4`r6bN\&&Hdh@>o{M"21SͷϖiHF1T܍2g<ޱڀٽE7Ӈ' (eķuZ,]`R) 9W3.`[R#'h+SP*5#ZH|V"sjFͶAZ slZ x35mQ &͊ *Nf\Tb5D`A@f@\(CI /.iE\FF,Kn¥9YQcdel6cFP@lm{M*_ ['ΐd'W}x ZV=q՝䤪a)?lj y%kޖ)#*6ycb*N׿hQo[饿ϊT>(d?kfWVkud;e:?{m&itH1UMawN!A+RY Vt.` `J&F/.q\z"L'p(SDx]<ۨ)^$_E;qrОij. dO*@kt8 CZF(W¸g''7Nn f0K-W6y"^٫/6 Okڄ[0U<7 m;NxXZ5x)!y~?q ea_-yǿ ߘQ4[^Ht ϚEWܐ*C=l0(Cb[Ѡ;WŒ`ʨhA@HMk/p#A?y i홋)ZAľeAۧl_zEG@5m_Ą \pa}1TDz#jDh%GKz/ǁt2\oeG"U12#gz6ŊN 2DH 6CJ+hisL/K,ІvL#`03J\SOz*HvŒuG5T[0!bneb\ݙ-B]wk]Š21ԌCc}>V,֎-/|P4іZJM1ȗ/ƖÈ٢>L-#f-Ő#.bdIb#1$# S/VAB +OCT0>.zp041@)تט+* zmq:\Mcў4HRR(IGfBHpzȳ>vM,*RJC Ld 2jFG’* .$[ *r'j(6 /y{)N܇!$*;=h7+9E ڌ(nR+St rÊNӞ,9}=maQM)T;aslRP.-d&1'4Q#<`=xDO@{c0<1n &-aF(f c> 2C>cx .VEӠ"fTJ"ԫD*NNBL=hbcn-?ItpF@9-=5Z*+ss&M@j.+ׁUx^ |i<{;P7R5:K"QmCIג3ͨUyRfRLrv|h :#ݴK33l K'hkƪZ|ERAyt+ 61n7V0=I$a$?+/=XD28D2 _~G hap)aOΖWM T1 @G܋HfDOS@l4l&µɇ6V&=e ^J稇0*S5N-`1-[߰TKm)Sd*xfM6̢'$_|+ԅF)稳1k 3-|HhW+9ŨpMCVK)z1! !UJ-"e7']V%'SAX4#, M@㡐ޓ =q}֯o< 1gާ= y! C2 Ǡj6(_4vcf"Z+˘3^K-z3Im&ӰNw+Ip'͐p-YUKZBIY\f!(yհBIG|n-n#!W fV m$$V4kUŽڦ{~BpS}>5e sg o3Fpdq .L=eݮCknR B唤Rj@DF:d^NCݻs c:Ѓ־p!=;Ђ9B<ÈgzTW9eKG8GRu7ݸjsH(ldNoQkN .OҦyw։Q?WX&mFM[:VOTApH{ӏ 7BWDe*,b_oũ8fb9 %'<#h h=`T>|eԃaGA=TA I`. ͚|d2inh.kLBnƤnD꫰8s9"BrPX%oFrnq"NfMjH9z[j'V܌7V(֊\bdy$B:$l\(BOԂ OO:my%$,h7+ЦTVd8(jr ܢ>.vdES2tꪟ>[JT%jh6N̞h%Ȍ|TJ$FTr#r/vq!jqQqe$gU'ϯ!@Rq)rQSǬA12a) 4A`I\/"$d\xl-ĺFH'Zΰ: E9^IQ0/e\W0Z0GE E<#ZDL A.^I[E24Z~G\jm:0 Lo$Vn&,n4KvIj\X<5C̆qPӔG9h3n8fɪotfʺj.(J3PuF襖 D#vhorQA'QBƨLphVa*fsT !F& QKE/21MX6S)j0o-0m*i0.)2 B2';"R1eqJq>c&"!qVX)L0&(Gvĭ)U^S3r Z+'@mlrS3tE4(mfEXz%g-( dM%lŀS6ǘv41--t-.Џv*fm:MJ"͔4e8f ǘ X:˧Zk~$@/UnPt?sq"SRnY>eB9Tph/VxrL*ǶiNuǗNFk;R'VSP3~&T߲b"K% { +L 5G$0*6P3tS`i]+%n7ƌ/,H:.*sW,I$O/q߲*X-,G|F֐*Qw&3"ǎ*m8CQ4) Jo]v(pU'Gl4~m&a #FO^VN'NsFR14рh4BA xeLȣb?SNf4Ԉ$b'OKU5>GB,`CT/ÄO. B#XV:UHO rE H t5hhubDٰ(OB0'=#oZ7IF 9ƴ((dJ),BDeEOGgkoD"j'A93G!&$!.)%Sa$ҏOGnv0 JO`U4oD2("tB'weHX6Je7-h`i(uP\'Uȍ%#~Rb"hh,F1v lF1P*lHÈnGS{eĿ3NdOTB3-Xc9to5#,Qv!VrR;5nTdd2Aܶh)̔0\qgV1Ta nr n3w]{;]wb FMN `4MV5Ӗd-wzblmg6JqzҸv~2Sx>.znX/s@/IKoT"oH%WD5nG֪>n>W~hJFq5l%+t*&&.ⶨ_z-`oms2ew3gAhU]Bav:i>@ 15V2:WmpS$ՎA(6o)vӰMxm$L` {-\(yV(Ec=e {E1z8V5:?v<05#W%g*t~],V;]lNDw,Q],t9fP7E˾M3yho &)~^z]q2) ^;u%kֶZwv[ai3ћI_$8C)qoi/xJE'@LV}WwCAsUۖJŃTF:Ż$V^ vuߋ/QgzwX&Q7iy_㽼P=f&yXcuQ$WR ѹZֆ(O}{6gx~kI}Q-ZYu썧Ok\ ZO`X:K#qvq.*W)3F63_bmT3 `$ O7+ [^4Ap>t(>FlHPYA/tLȊ [L'b&/ePdIX2АE*It_h#Be>7+P`)רK~,ȋrElFcѢ.Jp&5w`T#剘gCע02yn`O v̌pItE*EY-vZćm,xkWh' +- ~sR12=z涧vgsJ}[ܻa8uȕq-i\&_fEUFTtWgyAUuueXkBQNO$m#4d WAUhdB&gGtP82Ԓ2 J16UEB1FI Q6*CX\ƶy$`p f]ZvmvVW[^ufndDMPq؋'5tqzG]C Pp5)fjk# fZ]If|9rbu^TNDYo Yr/j ] ڕ1f9xԐз&pbDĚ1IxjhBQ[ziYlfb!)SϑH~$d4"E*`glNxfwAX[URD4/=;`Sa@ bAH%O)EFvf"Z%` ]^b&YYtl!S6Ra]>Hzy`]jbo}x:,Cd&Wt!oUc-k?wnWiE2q"q[EGW WgCdaƱI$!)1i26qhSBKt3 5%dh!SzpCtJ0`Kȍ/R*W-TJN q%tp,,U)&R?Ahբ/ (* b'؅ (i{ɪCJ&,`qes)Ph9OP4 |u3a3-cE;[-]]AN5p.HQQ^(V+NBC`(B1_(Q<~[Tvj2wqmOeeGh & MfYEn1&%#;rQ0+P`Zzq8`q!xͫ)NS(-*uerhLqmOו U3a >~#m$KVX P9rfZ51UUFۄj.T:٬rdypSԌ,VFR'Om Ps6KL=.&{ }G4X0WUh"+R!c VE1LI&E+qj,j-̞@I4 @ϘGZ8'gozS.ߔ9Vkq*"׺֩prdeTղRUXzؒT2ѼUc:cH8 WfPs5v޹!`{GQ#kwQxې>rFCy3QuBo>! + 6>r(E}8Yhz {Ś\1^J%-0 8eB:eYl"UU;pKZB edbҬ2BQ XM{Jk"4 Sup aX]T9M98 zDSO7ݫp%1="vS4 z%7%8`j5}3*8uM'NvNEY"^תЄ &viUXkQs0^M3h_dh%WʗDW9Wxr?K%f&#I2̇H@rxD*F>thtHa8z0vI,(xBܖhT.y(mW4NIU(]S8_v%~Tf9 pŗϱ+za/zdՕ/}Ibdr;%&7_VSh#bL'<×vW{mG*Y$gcwPQ(Sf#| ]`a+\K.]JK|ZhT:zbaSug`6_e\ hDɡ؄T ,[6b6zJIy;!^ 埉T*fBbG!NW)lge:G2`!ucOPkSq3}eؗ5 e3mHkUB0h7O>v"yw5ZC$C-ɤlUKr%0UbæI 'c|rsJbltmg hS6U|+U)Gbl}pJ` 1yVHv4%7وm~&6 PK[Cd42HY{3RWC'CC.";Ad O 0K<@#R:p_hr6/ztAIuqb,mbqa؂hu8(X8=CF#+FvX\B WuS1CEsYBEbĜg_a3=kxQS(m %Bsv7x7{}xVjR=i_aÎY7D^aw^%[D#aAXE*gJġ)JY@5 8z@S-Tk 8F/"lBK 7h^&;whgBo,P Ҟ Tv|HeÙCTIuNfIJxx[ricIJ2( h`տAAjp'OۏYS蜆 B<A '.y.g7B J{⾻m߇L˃-<snLz}Ks bVKz%@6?24u*yjtF hztP8/Fi7!VO.VJ'K=/ےQ4aK=8hˀ>_nwܟrëRIi=jc_9eLzThɣCC$jI#=y1` >3O'ڏn^v(>ic]6{;\zwֿIq]ŅT/qc4+v}E":f-cj3{{QJQO_ $޾e4H}lX/>1"X G%[FbɃE%Ʌ3k|ɉ?/Fe݇}K*PLeiJ3 i/|TiTNua}l6L 6I;XT C}f5vK2ei4 M}@]݇#Nܐ@'"6\}Nrdiں$%';gA٥Yӭqfљ :w8!6T>]s&o FJ et.Zuf 0VzE3}n, d*(<+k;Z 6:j+,>T'$DD # M֪geD4 G.кL/vrk* RbK梧0e!&L`4 %1z17AҢbc,顒Rz/X:Jo>[NU ę ґɏ8Mя# %rQtnODIRC

    pF]#=hKn-? )F]!FbĤz=OU픤ZIb,Di+@3HmTEܖP-cSYTRMq}JW$܌تTerؼwߝ@6-Bˈ^-꒰/?f4s 2JicE4KCLI3eܤ`fm9g7{ggshV: hwZꨱik^:mǎmlі;k[讁[mI:ٲ}l\MHbк̻\β؂Y^c/tkJ7BˆRL4VFǬC)F[(<r K%O 䓓2)Jj穿(7R^yg} z7jyg\K'>YπٟH~Kwqo#ٓ`62= .σ1/}_A}ς.t,8?^JDP^ = |#KhB$z'a C<ڐzK!>P/"*.O31XSZ%F ~ YHCԂ,)]4'zrO)/,Ka҄b@v&5n)) 6BgݲT(¯O`SĒ .CJG[@Dʣi8,9$I Rzf,%-#*+c&LPi6Te(sY+#֤+JOzZ5x )幌(̕MS*IKJݖ啝0&<ϹGzrៜ2u:Ԕ4<+8xΨR/q&(ŝ a+(LGM}3#%.!.wa\(reMNYcZLĵQ SeP:}ɇi{.B%J&:9PR"UJb(0F`HAi`Mes~+%L?\2(!٥q ,ǚ4Ic A T`m i<2TCS5V,sטMh0ÊB' . 7$6VN.0BBe.wfC4rD%4[FI"YbqK!V2]YikV13Wz*̣bN' i^E$l  Kfڄ"c^Ƥ$v h!,V &Vfʤ UD[9Dw^% 44VWDRjf0 5qeI=>'oc&X-yi1Wˊ!.;-n\&{N94\\8Fd 5K27Bev9fܖ]ctBUm@Ns3l"`J$́UYF;9#`^a$& &RC 1}dt{Z"n)hyY}5syR`%qᯝa[Ze,uvϴh^ U37_5Vm3/+*.SSw ,[Ln-G5Zvm;|3Y泽>Z?r5. b:-` P_Bk5<;#;#, ]6e@IRP輶 D@wCܫ%Y-* +r2.Q%!g<#\%x< 岤#,%tB5){BF# S+!;19SCA0e/b|ë`;BS#ÇK6SX1'abz5 >R]kI7ڒ2E?S0'D 32#>4 2!zúh 5xXcj-[0,5u;9t/!<Ęɝ_@^{3ce21,DDZ.v:TcEҪS6JWR \$+C: z? 4 T&(DK7?G1X;F*աk곩q<5<=û*L97CEI'[S0Rs0"d%RH9GsBu˱ [*p,AT-|G/ sHB@Ze63 qÁ͋;+P$2ᨓZۤ%ɮԙcJFtBb$䌷bJ O#ܤؓ[3ͪG\( dNR,CCZB_L5.!aPX}@418ŕLI4>O 0Ľ<:$J2d ((U|F Jt{?̑)!:}#(AA==,BxrU+}̪ [?w7A<,ˈD FiTD-:ϰɲ3zStQRR%?a,k4;;̨]lj9z ?qף/7HTĉ§˺2Q*/Da37!8M] QYE ,#'3-Lel76PƖø&M,p\9a$ͭ;աg44sPrzӃDxz?6R!SM2aեԇ!,ȩSe\Xi_=Z",dU9<ڰzcT T lIB\":b9Rs GB I}ba5cӕ7T,~Ws%hrÄC-ܥY p\62 -8}/ ::Z}q1xa]<Ф}_85<޹#E;JQ;XS05rOB΍Ф)m e{+C;^ Xy8 RGg멽Фh%ᩘa)'2q Cf{FII"I"; 9d@ yC>L$$ޝ)Z$R(28ĕ"eN̑i4V_ډXnIwJ.Ӭ3R2}(b\amQ8L4L 2nT:ӄ.CeOC97*٥pLR43{WHYD%:5qb5#)/ư퉛1P kt#:-7-}K嬄 %w-# Mzj% =R @*r7ʉs1Tɥ[8c[芀pڐ:Lѫҿ\}c⳸rONʋ57t Ӊ7mQ#Q8 k'I:lOEQ[3Lea)ܾH^%LvOSDxν>R$wa£\Q37-lcv`\4=v:,n167n>8Ʋc?P>|s=\=X݉*iU4?ϲ1ã p,ʊ)gu=lF+ n7ͼ:*9znP1aUwD|.ȋL 7^_tg#{_OlsdlgB) 9 4]ˬEtEAL~[zs)Е*%V9_LO $%.M.Vn \6*Q$wV]?ֈ7D-bc{c]o3Mlv :e-o=V@^Wh n|xPB=tH2})Ec$G45|R))SR.++vƵH+A4Mo\ 5k gQ؃?$Y\A P@J (BAL%eT[vwg)fąC>R&-)vTIU$}_{ Xeq)ݾ# xCP y77WRKZbFey#6`LE- RE}B1EC7W$m-@q"9|J3[Lr:o4ٺE`{gJ2n,}odݩ\׼yj&18FI\GQ/'|P-a(:`pwmNE9? wqS_g=[QKŲECZWxW%ƍ0|wTq2R;npLݷӳe,$M!0_%,K8 tgb'36%@Ѐ:muZCP) \ZXQf]lrpa*QH ׶ 18$`b y;v =V*fn[WF9RxxuX3鬗K>N%;-kuH CV֐yn1x%9fn"w >|$YY#ǵ*հκh5^Qe>8%ArjAn: k'XU! + ,UHʚ\372\v i8v"=5jQh. 0}IGAC){CvQB#MtX5ni޲Ym'٩՗++YHmV1$4T`QIӽRnu$ꖯcX# Id 7qkIJ# $˲м =ӸV-Y ɓ)smeZ,͟nU:DJ0pMjxI{UTA?z0e lhLDǼE1.>4 Pme=׳Fn ԮEK łwXw|zݶZ^=S(-,eΑ\]u+:Jyz5TlMŒQ#N9XF,S:xsd&97P1oH:LUUsy]{4Ą;d/cONb鋆w>$F$XOF_Q=A sCt.B[a*T6vH^<+vzNf1V ]_˞wVGN،4 $R6Kxjy];m;V789})i.#TƜȣveׁ>U((CMUI [x ie0< Ti2Tݚ CuUGhK3tIVĘ|)Vu M\ 4QU1o|aq]"-X-ALsFOה|Ymy\4iϨ>r"V2Y@ N4S߀UTܽP]ՇFVU* &JSUEݔ cї~៊h@J*-ڣ=WF=!uFM}$qlJ6QTfY(`hLB/ X H}~YQXeB m4pP5QԤ⇱X[,Db\EXZ)%чRڒ#R(AY*mdo}tn[e,DdF&LfdNefNf.Mgzffj&g$R6E_Nynid8KDCi)GRP}^ED6`hs}?aNq Y`YHBdd# _0"V~ѻ<%>V|U͋P`4V_YnMiIeFF|ܤJ uh CņF pqɌFtVYJx@Lly ƀXZPt! f U}:iܾ=0B!&au@GΕdxcLt3m^͌_NŌR,C8$_N@Tpϴ-`Bc%81h]dV mVg$n̥sW~uq8Pq єy!ϯ^ m!eWqNu!5fNp=ΔiOA4=YtHDXTIPؽ8j%j`,QM!'bՖNKqI=3Al9J2pVqdĕm!bmB1-r2JbX,mVY՚-aYp1\J(m '/ӵf҃_1C&0'/030Ht֏DyAuȃ1Zes5ޔY%F?^Im5цY;Eg՞/x=P6z>e -Pl*TJYI@uQ VQqn]Us1_,mcjޚVroCn5(U0ݠxbJtLNܖu1E uݯACd>U0v ((( #W\sh&+g!Za ȸTa+=ZrҰa.vhEZ6ibn)AHո> isv+6e H(f9j AJ&P-&\Ƶ_$G@+®~-E&P VdN"b@ @)/ n>2tZӰh2n*)Nh|NGX.V Vdל@Ou,%S ZxMrҢs¥WW:8es>z*KÊB7Bqd9l fw|&W(mc0.BDb(/ѭWZ&`TB2:8{i$ 卢/iI@ɴ&l*LWeVu5=O{3WLc)HzTV)G4NNblbVHQt%lh2 1'X]w?Qu$;BlG 4X:fuPTQ>q+R7qk4!IT2k4r* F9 J%0< ڐIMr&f ԄׄB+!-)ʀTd .5%) | ly>Yz2?i.weТbF[|c' 'R21jHpO2)|Vqs"˥KJǙ~IRoԮ%lRWSe!~dRfK?Ӫ^ꕢiG!;|E\9nH40O6i|\)MrņOk+%`ICK3W0$ogw-,A3''ʠHo3+ӵW4I圬$}[޶=;sG'&8{F [&w-Ջ$G8]] >-s{Ha琊y'1b4mKD7(u%h@pr5Cێ#y@ Z҄d "@VuE=2AM>օXa|4j`(5.}HfceO2e~Ƭ BJuf"nteHZV ЦfR-gr#&6n*(ZoPHno d$NJx.JXDAh.ZIBoWZbUȃފbG*L&0J07gmX8"HKf@fR \P\ @]ňE.^x 4eZX$EcL8JXxRt;)3kN4TiV̏gx]Mu\DDf䰊/n#4*( 0ɤ5ĶNlZ)*/ c+8i2PUTyhe{x.NNs.sfj$.NpF"$K"+R%L7t$6քK AGOX3;zЊ#ffP16"+w355Z,p&d9)̌Wr}HO -;y>@! Fs65;̦*Gb\$>B<_Bs d %y3*DwvO>$H~ڧ g2+~r:+%šjn84JSwcKJ*( \TČlTBGTRp &G"&4PT. s0;H.6 ү*өvp1["b,j@ebIHeF8|B, x2g/fZʲl 5=H"moV1leF0%նeBݸ20L F413%/TuF4YFPGL;,ȃU1\$?LKKELX^^U^u_ysϊ ׫ꮣTX#BnN&a=5SG`FӠ.nj拜pdZhF>F ֮NfyРSOg@ɦrN1qtp'cJ9_ mMIeXx+HDtQ(f3Nn0$'7n eU 6B%0B>fG S2r%#uN4NNo忊ո2'Pb @dA Oϥi?,ѺWN'`GWG6󓐷 ;/n)'U*$la7o@#1ک= Ndws 6dH|Is輬%b,2:jʛ|sg6f+M QE{lUҖrc 9{!ݚanQ%>z66栌؍v!~g0@z/qpphLGto-&h3K9 c2M?wAEh:XھzqhFAnp I !GQ~0eN NR!à [vtǝ+U:#N #IQƣ{xufK/LF=jD̔mX=!%JkspDf Lx!JzrJRM,;Bb6(qn[ q*1u欭VdvNq]WOLeiRfFs [}`H>9WRaƆH5D[AfLd2/PʖYluFQQF\eVW FMChUgB)Wh]Fe/MeՅQOQ-US-xI?%HEL bjZ[ƚ^$jHЉqYe;Qeg`i5*uTi؀>ywp$$A.e% o?~ v:S!t%vK_]ԕԄt!CRA_LRg`)V)&iXb"h%x#Mbʕf>Lz(CL{&I49h7JnXXX>#)HWZCTHJ7I#yeȒMJ'P1T<J6jUFςCfoL0f你En_)cZzye帣 KV}(bb9)(Jk4qIɶ-'UY2~A✙ٸ(g+WPHQbtoRb,CqjcjFd-nXd%nɿ*2(&|ebt睏.z^:ꨛ:렓zh^z豯:N^;{;?<cz7_}|/{ڏ<~ǯ1"KE&&]̢E/QeDc2h8‘kcG11tD04dD?24xI=ֱk77򑓝 e 9'r8$D9^1Ux%+Y%/w 3YFc%GYEJBÁF\.S3KVj<#爗/.9$"$n[c:(>d6jGO! E$O4=g1@*j16 .Z(FDnҚ2zQ2&bPAURT*%gKKMt)\PG'5q:Trt)iSORi1RTԞU%EVo՜bMiWOjV4&*IQ4 HPB8(1PZu(F5Pn4(G5VA{јZM%jqzӝtUPMxZ┥|DTtqgOkUeGA YZpՄd:\g,_K+d!  p.rnnp^7m{ B` Yg;[G nدP \WdVIv-l1h-IP=7M>m1VhYEQ"=AqN18ZJBO<-hC62crJEfU|dYI^lև\F52|'?3;jhdf-2.9/docs/hdfview/UsersGuide/images/icon_chart.gif0000755000175000017500000000165412050301073023671 0ustar sylvestresylvestreGIF89a! ,@,H$H0PA .Lqb\qbÃ*L@1F'%rCD)s$ESxaG= ^Ζ,&D̚!UӑMEZ֕7vO3^D vɑ&'"Kݺ;jhdf-2.9/docs/hdfview/UsersGuide/images/new_image.gif0000755000175000017500000011122012050301073023502 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,3M:#Ӿ*\ȰÇ#JHŋ3jȱǏ À(2SI F[%˗.cœ)&͛6sܩΗ@W]F4Z(ˎ&%zRP6J5T(Pb՚uVMV5YZ:[K*˴nܻJ"]va(c1Lg$dΆfV&bdlhD&cn3֘[Kێ-mo%ٛL. ۍCTK!R_qBWvrUVIuVuHWUˀ&i2mfsPUwau]IDhwiWv ֵRt{SV\~Z|.D)ᇍYe*6مÄvk$\M)nj7ڰ֒zm)rEk_KvG^tܢw^so^ 1G=G'WV1ى[^i=ghw1U R/6e0ʙL8N jdlh互Ŀ棱8x3i9l3MvdmP` qES-nԅY͝K]m]|eW䕻N?ݔjR`*l,u`]yߥ8Iʌ(BbH䥚2h>Fяy4M=K[E$*yzi,2ǓRZ^{]^e).nkxd/O:qMi/'p}0X`B/=H1d9K/`/v0bryAp pыyv1H#4Ug:f!P7;fYJo@5̧;A4/Y 0pwly2x<]WP;oWvyūmUR)/8SҘ2 Jm/~iasj2mz#Cl( ̶s@'N"p _uĀbR bDe(:PVbX" w'%Y 6xt G ã&[Bu2gqa=@APg btal2׾))cJQC=.*4c6OT)UJYRRտ'"kQ,zD&PA/Q ֵxͫ^z@z(8^[u*8`5  Y :h ~%u ƢFA{}8mM([0uJkw45B|2;iۜDZO\,3yT>Pux]0,ja {SFN 1xǫaWJi>|7DyI)#eТ cPVC@* N#P2}}(< ZX@T>;(4Ѡ:p*<&`UΘd5j*^ui4Od biig ~Gjl`A2HVK#[0vl1]8}GB[ ߈ySʻLA)n@0QS\V'r5cwBTNJ8J2y;ox67ZrVB;((^hMڔ>7_y/VVguTX` =h D胻``Eq>(.GI! C0n6bc U[~ p 2~ 2&wA Q42:&l?R[ , 0 u`̧ eB5n6(Y`MP7$eRt&Ed=D.xnao؄H7%S5xw~%s# g$nyBdS=O31PG p ΘN8锌@ S CP n@CFAW@0cT0vvp Z!uAV [/Bnk#gj~pv*wG %#vɰ4SQ)v=Y6UG%UsoTSEKP4=Zv.eOe\:75дwJ&pm a=c^720].0}V9@Ш،Z)Ө9'%  fI×}b'#PwQ@p jcpku2rR  8fc5RPlwVl҇Q/1LXrE3?D5&.#E!oibԵ5`5 Xo!iUI5%UyRV[V UDoCf6S<@@h0p۹0!`!Đ0 0#eY(DvmxDRb:9QIpI&$Fpt=rEpYEERe_5T0]pB'YV]gq5GKabS"h=_fH 8nQ^{d7yu BlS.xz/3[10Zp1P[KQ:G NjJ0C3$13ZuI:sQ:~/I33/y/27K7q1&:DaTzb&&`/jKԊhxx>&XwEB |C8><44ǁ PV(CH=S&É: /)K hJf)Jpū7 SJ)n), )(NKwz1͹o[4SJzLoF}CyVTTǡ1nKe3Cס1mp"t[v2M03Ҝg [KN93RF:J)q-gUYE;(TI,y5WVTd5T&kbDQtnr] >~C&?d>̷7ֱ/Fa0/Aw#ZLPl7a#W+V,V44CLlEVΩV_ !<Ģ0L6E7j$lL]e6na) J68dܬS~©@S> 7P,2{,2H뼪9\|PehڸγA@#d#C7#=uIb'@f#CB[){+JvKJr BIаD|d#+B0Fm\lBJ=оvJ u 82 c0rY->Z-Sd-Z1af`?h f##7Whc`z=rc0o=r^M؆M׆ՄiՆ=ن]}ׂ[-c=]Wؓs s١-،ٮMلy1XM٪mnؕ}ٕmhb؟=r$x=xi}i]{=k]ءffmiZ dlϭz}QaB qܟt}-}坠eH n=~ tw .D= 19/.nzE`Pv5R5B~3`{y FuY2N8@O.E`@ &fkG^Z:-EmZnYNQnʖ1P.[MIc~g>cA^y.`^N|9M2Vol6~5VA>fz9Q.?>_ 9`?Jĵ8NF2NBP@P`P2`].jqsNQ2}X3rLP~풞$潮B&^ k~>~sȢ3IB 5n/">^ 9#w9a`).?xY +(F_-Lq?w>>? m+|P5 c d3ZmK[_ޞ.\;-YoN}wvX_~ORl?N]￞]8QEN暟@0~Mo_o<_FnP/-Z^Q;/?F;į~ïF/w.M~^4zo}-`4%XO`4nHpHJHo}qmhb,TY2aJYBؐɅwTQƓM(CGBrȅ ,RaD!2 UևSOU"TefX!Dv2/bOX⾧rG&wCz5zP(S@jۦWz ,+CKLuhϨ1RB3,D mkOQ&DXtɐݝvcYZHdZw^`MXْ?=$ j5ɦ o̿"lk!4*I& >#@N\0 j~ &ƨ7(,(6¬< P? )y+߰Q%7j0v.*dE*p|"*<5HJJӴJ P{jĨ0a\IYcS ӱ.$2\4I-o3TSa݋@!; 2j$73 aOsdq&(P^6x%/~cEurA-DUˆj\,#$e ]XOzl.P|m< Rv? ݲ̉rY'R),iM=I ? 8;Oy%H(MgP)e@{MVfeB!Fn{nCQobߛ[ {q/כo[r+qӕCno[nkgm;{sP@לo3MOn\s}WS;3oo\^]M<כW/fOĿ1IEol2(l^0T>cDzyXpg2 \,8>AaIE<,+!WwJ4]0/t]b& {L#Ы$PT"f%aLR;)OD%5ܡAt)E(K78=+t#vcB8GH9lhj#aF4rCm?imzTEfhUxe$dX)Nz_@ةSjY|'M4%RAeS>ٔP9N\F)G^JZ !]=tOZmAh0dƕ%RId &BYLNWWU5Tnuib$30;ܤNnA|Ը@LFH&AF_zÏ A,iܙ1YmPّ60I_Ci~))  գh$ts[A4L^DkaU~`yH 22^zD7Ջ'vDīYT&+{z+G`)3 (W"%YOjF!y[_FL%QSIh[%Ze":QE* 9Q3ՋP(6V8l;Cq>&v;6 -rk\*]s R׹Ӎnv\fUnx+t/u{f(Ƥ**@m-j3-mƚ4LO6cS'Vp5awqE|P}";󐁶DD8XWnBSk5No~'o[]"]5bGD bv c 18-@X2ra%BAEA7|B#\%RH5ARa#LŶ&y: ~r@|.BU<8DG$԰a,">;rЗ-L>>~;җI%%p >!E}PFKȇ.|`g dP $h(ۂP$SV󉧰䵨@$"'$:(\F09 }P+PȇB&"T?¿>h`+;ȇ#CSFч:C974'C̏@`@Lb@ g}xS A0P0@"vS<;z`3A}h +yS };dV|3pCs:8㑨1(B}Pp^þZ`5[[ BⓁ+B4}ŃhzоeB!#-}sq$G%%)Ȗ@hDFB Á0 }hC(F^0$LDQL@Q_MY:,ǎ 7zH@BشSZ*FB 4s Oٕ !q}`ʡ̰;CvʉNKD@7rti5 ;Fhy(,yH$Kr2H@轘0@-1i61a5}ze 9˲4;%:(ŠQ,cG))B1S-:/ZO+*H R R*R/,+ -S2456E7/2S83S5S=5S>SkvOXE@茦#vϏ0 H hif2{X- Ѓvfe@w#c _d?nuDIKQgx]i$U^ofO1X u$jez[euA@kSVnf^m _b>lk{k)=h=Nl4jkfz֏&6ek掶^k$ vT=N[䴥d ;68 'ؐ$Ғ,hO M'& 2"]iUv4a O9{nZ %i[+J rV3 H{dV@N]nt&0q Z *ÊzpZG}*EA-hZ |%y:IAPk1>)B):T5 Iq&ecߒx49Y 1r7 _?}@FBSk)"/!:E}_UҹvY511=+"HtXJC/[R;At f(ʱVdSPMݽH΂7Cqa4 bum>kNQ3AQv) C!Z#Tl\W85n\ɬ+" JYQ!M0լrr64wo(-2vZ q9Յ؄İ~ _S'2rUH<;5g er8mk2hhp+e )#Z7f -y1>/+-igK'!7z{J%z5&q%OL\kq9 ?pݘT`nvr Rh$ ĔVS{3 y1_ edyS~O0Ⱥ)\F2<} ӈXus?::͸NvyX LEd}ό_ryz؋QX}{n, 09ѽ' хɕxZEGgd(,Hy'|HڃMdboK ͳb<`@Cєm2}҄ - q5oK0AS)v@S˩}~,۷+&~zыVM遄q)բr֦OC:Z5dǏ~Dk}bjmUpn 딮^wE+Tsv:i^j;=Lӵ"f ٱ4#ƁU;@=m}-{1#2͋S"8`Cшݧl o}_vhȃV34v2N)}{IB.ZU qTLMt2uTᗕlMRE!S_6XHWGbmaR YJxf~)"~h͈d3UY%hbWIMW:69brqG=(ijaZ4ˈ= 5)n֦u$Kn52)mNT Mԡ9 qD>ġ#%#0c@R-WC\2)0ɂml`Q !TlAl@țmǎX:˪=d&~F.[ KmSzdwYbXֆG&%+m;>u-,~E5Iʐ W no-m^l4"FӎFX^nm'2ȕOe#Ƣ@#C,89xR%W|z>C(}*hsD4GEsܚ +\:5]و5dl+ &K?WY䥥 klRꅙl_}A[Uls@+%7og-%IkҏGN30`T YFS-lB`2Hްp>OP *LDx1h #@@F}'{̗:,Qz"d( ʐÌ!85Q.qJ-R-D6%rirMqq ѴDDXv7B>#Ha*+aHX̂&PEk`LIB^-&]AHvorhPPn0~KipƗE\6$|WP +I͠3$P6X=e1x լ$Mۊҝ@6jSA`$q3Vī\_]Y$|~~VҿkK&зh@[RU&Q2PF`2eƙt tʼn,mt3j+*mZGȨ~nZSC$@y5VIV"ȫa aHTц+ 9.ϝnQR(q=K^umJ;/ȽJu*"k_Vk?O}hgoTeR)UlCCZWJODs#F-1Yu:4U'FB٥z$Z"7XYMVղ5XFlP͆%_śgo&E~cv*) 廠%$r&Tr: 6vS1βZD^*Q)0"Z4W EF_61ҧ+fђ1e\$Cr)d?](#g]0Id~lkƘ,4@]lE< ͂-6:%#4϶uuϚZIkexY:׸D nD'i2C?MI^! #X+4rX )}4$DBB-WVmW [b~ c>~Z1_(Hpt4Y{0-şk j۝h#.krV%/\B2%5@ꋕV'Vۗו-Y.[%8;rO$$(Jպ rY~y[Rدp\qW;ܴ}A?qKUF(PӧNwVݙ9ͦLC3`HdǮqx41 R5aMː>(^_*z#A1~ӗ_WMg'A)_~2X_(_5`A]=_-`M`aI a]`5 `$`1FͤF4JQZIM\kU \|Ս$fa$!!!aaa!b!! "&"b$~$ "&V"6!#!(#2b) !M 3 O' ao+ [ѡԾXDMGHDŴ XlHAMX5yJ4چ7TAYAUcƀR;ꙁ[<Ҝͣ4nE>cnxUmg)\mԂGlAiGY=ވPM]H%_l˂} ɘF @DNDr1s{^Rb/ںqHDmS U.dMq|혂:<& G4 9~Iip203; mJgn؎z5}rzCY0t)([/قRKDOt"-LFꕉF`kFv̀Cz.;H"'R3EO߫&CFŜ |2.1@͔0 'B@Ȳ,/BˀpS14Y5"%v#1|XnKC䭆Y-Wepd O5b#n!44.1 -l=EœE gsZ!W(_a'j9Iypt'o&0,q)j2 vYŏlc`d%rvRegP=@v(wT`XM']2>l 1ID/7z6YCePlCy.U4Ѱ0 \v..2&}n;Kj&9Ej7[bqAtbdX-bE*nghw+Sn^0ga&KX|ʷ$p(|&B Np^DmȏcUF+"j379?'S[ycW9_ygo9R4̘cG&pTle?Z0n*mHdp|wff -˝|֍H|ħgRD7zBzg:zzzߺz'/;;S{Tpd'ֱoe7 #'Z8vX_[epe=CRbF`RS~Yʥ;Sܻ[X]{V@< |a_vZһ{fлU>|'ſS`{Q#|/;S@[I|aJɧ'n,=܇='_+>g>)aQ<6כM}ʷJ-Na]grik_n3og,R&^q7yOv5mۋkT]{_*?K~Z - CXFTd=(*u(@mhEe TMz .\fƋ>Q#IA̰Uz-ᾶmY}&&@PH gabADx@*A<,5Zi&}ygЦQF}z5֮_Nuk٦oݿcpyF.|94HmڧuL4bv] MDnҋiވyʶgQ8b o} P ,LPl!P )pK%P[ kkNfjSPތ$؉aYoENJS7SDQڧbO\q T`v]ҀC!aт[h[סvrPtSz0Vٲ 7"QM쨜܇ahDz}cpgpXe3`!}`Iˆ^>ÁN U\G( јh$ h #ڳ<`z#6m%XT{C,5WCŀ̮Tc"YD(桃}"ndFNns (> 33"wJŸNIoSIBfhC5TSضU@+ Ќ8Q€C0־SnhEeX12'͋n;cFMn2OъC;.G1 .X6h baSԭvԉXFLIN.CwLm D""c=Bg:cfe"t4Oݍ\%C泤eFwr̉hf GC} &TwbJ,gA8E/ q!lo3G&&B]Os鳟-uTM(!b&>D$>eBP E [I?OQm"ڄK&Ҍ`2 &!F2JzӚ4+tҜ/MjQզtG}jXz֪S-Uա];^:ƾE_[x79=҉hVdK) LTLN!=`T$whHnvxCD( | px\FxL.pw=qwq{gxzWyOC"OWnr7$CmY.0MvUiJ#zͲPTFXL!Өo\Hd^¼NjbO{'YN=xꞐBz4)"~;+>w|xq}gwNY`9'Վ]!P(m}\qFh+iƤݱ4t<>zbZ=_>oL2Ο>c}!>s?/"?gw1`CĐHXJoyh.ɔ`epv X‹S"^8#/ۥ]B1+&'.;0~6!p˂EQTYCOM!pf$r klJeݾnd ă%pj),F( =K< B pa / C ˰ P p 0p0 1QͰ1 QqJnBCj&V=B$b2"Ԍkt x&hXz`Σ^"!GuJ'~qo+hQh2q[15EMi1C)#~oQWuБQm1dM L @#$FF>]i$(f"FqU"$gØ%\/ .>l$>Br* M0R$sD*o2%S"$#&r#_%&KR$ORdQH';WL, hd(Vx(D"( #LĔ%α"lDpDrhÄvE£R,5lWj1%_jK/QLNh"S(b?ESErG\1k`.S/!sNj1cB0E u/oKv0SpJrcz*cD".T41b7 St'8&f8*MM\dDN̮xb*²ʱRȺN"710.;M .;Ӟ?Tu;-s: 3&B;*<;s$<7K<<].i24DreE5.'jN-QY6#O]ҌvrU.>G䧌j2b+,R%c! %gT4]F}(K2!%ht+$#sԧ/)}g4&p1!cjRJ+wW1@dqrAMz(bOG#ĔL9~ eY:y&7UȞ+k4Q03_&U]D<$Y@UsZuZԲ[[\uQ/:bGRhRMvR ). lH)v&4p& R~1ߵ5Mb("#s3rb6BGuB+M'x{z."sA~۠I xgxaGRTxX hl",ʉ B!t`!lWY ja!|yHȈ~`#*9>*]m^C*@ ? # a420⡂});`}-ؤ m4@itZz@vĖi/F&U,evJK$țzICb'BAZa IZ"  &/ǒ9{o)" ˌ Ɋ69FB聃ٷnr"遆S B bUh!²CPÂ1WIl'$07>G}ȃŠᗃيz~)nOgأy~7ՅV:c΂«pP#e!xI,ۈ𢊷WU`Yq<St8"7rdyCy#xXr#xx(bps}Hz#%ɫ2|{.<x 6%"{YK{2T! G"&" 4wX#~acx!"3GnvI⬡emx ƗgL|̛|x- :+eW̙Bf/+k8I .cth:,[~s4yn1r80 #C4ÌɊh)=z$"h $o-j#.!*萭 醲s Ngû`tXSY F'Я&#t5'&!a tO t)t B!}صi~tFn y!`&/ `F&͛ݢPA.4hF:fZ0zXFA .z(Ñ m”dedP4)BdK.1`(۶k١BS$e2ejE2x%2Gwyh9OmJ겸B&`mnqk} Q @hc)jYhb%ݹB7pAZڶ5Aۿk$[/nʨv$q'[ZGBPug\y'`4Cͅ[]7ms Uf`W^#aPaO&]$z2a7$]}xYbxWVW- `m*Bb: oL[ ,4CE| ,>MsaVXnPIu<NmmxCIц56wt)/iJov40 @Ǵf;-Y+Zָww֖j99DF$Zųvl& vX̍WC䥾AaC47;-(n/&/te;%GfCHB6 %nҒBёp8LvnMy,CV"='/ѱ+k#ȉhO+E1&Rm4C eBiCBY$$E[fHe6hC,b6SlE<3GTQuTn8cqYOO_I{FP-&f"?؆EN ubt?`?vSsro3LՍ@!$:3M3A'1s@xZUaO#w@L d[(JuoK3&Vg@txFj]mQ&)FH(c!hI҉Fdu5X";tN*(ɣx9h~2:b@D5,k[(@:XCK*TbVg'71Rc6p;W!ċQkTs2! bge/&:wPoX+}Xg8 #?K$:u`#w}2Ȁ#3;JVpN'foI2u5@LX;u@ a$\ E#0eICGɵ_oVs1ƒ yg3sI6Hc5H:L'E90ro {{$gS߆i+T7M+z]+:hc4ð  eXzFHK;jcm3#8?f63ʎ"jIg  #A29zq@ṇ?۲в{/ VpZ;t$aQ YA#m1 '{(U1AjÐI 1 p{:7 ;@Qh*B?g 0 0 ښp *t*e+Rp |J 'koLWm m85ȵx$/C =ѨծP ֋є>$Ð}rwٝPzX9AĻ44BuY`X!p4  9!yMm`>b  Aj-VH[\̓ˮV!Jp/kɨ(hkVBWdӃCV\ \ |QLʈl }( {+4{gP8xPꑑQoQlmQ< 8q, h@IU z40UbF ŧF qz(ߪ ѿь Z- Cю~Bw( }]o Bm< oaK88-ơv 5/綿<blMl>Ҥ8! ,|) bgtM+Q/X ?!$AL "+M2"B!XdIӒZ=R`GV+ac%wek!*YE hLJTz$^[ e$" ˩5ab35dIBB]-2|'Ng-;BI 2Zzӌ/dOm5.\HCCpZsJRvxiMB9f zыh SO`BуP`E nlj+.#1#=%dhqzf2b2ܘaƌ,u&hPE}Ms8J45C1B ;6Zأbt0Cũ&Com )}MQcӡ>M䈕\ Uh͊?\ U݈c&*י#!(A6E]r⸏o[Fx7мZ&SaE/ Zͦ;%YCԍD£aC|(ۂj]#ڲP=u\~u2H0*ƠHmPH5K?昂ˡ {kB+I. a#wq 2muCQKeEM E6 >E_Fxۜ^>wz냶y_{e?zz+y^|w$[,∩?^EI'oi'y+:D&5.dXw"2B*QvҍrF\@,1K UR1ZG"8)V[dҥRF+h(*0Wz`)lbgJCREU{M YQweMoKbgnĢ-"RLE먝 cwfVBgRrY1 Jlg\ٌSyK36Sj8(, eQsE[(SĮY5|Ibd"'ۭM1tÅKW9Ղ O" ^Z885L$z ren \rLj(j>h]ZaSp Eh3|ێHJEJ>QQ^rɪMgp9ӳ"^:׉B$Ne=N-#U2XUt _A妰ETIaFWrDqbyR 1x)!)ŊHi]Ms1ŎRZɧ\fآl4v|#D%):* {3N(*"6LZ(]o}Dzz,!Wbw2;Bir9[,y ?/4ñؗdɑ.5F ;+2%!?R)0ȩ±]|x"3%jt c˴ "#I+3pʽ4{5q1/5 l4B1hXM&PW"")N4;%]MvHZh,S0VC3dP N@:EU *.8>`DCw/{ pz@1/kV铋lOdFȰDNL{tDđ`N܊$F{#ϣ?IM$BPD"C09l!jϲBS:Ͱݥµ &ڔ% :qB,'Q{TK Ҋd[Mf NR:Kʥ)|鰬zK`ʹ["5<Ǒ(>[X9Rq L>YEm)TNNb@]E 0[;+I#CFzHXUYIUXUZU[XU]U_M"U^]M4(Ve]V\`ubV OK xO˔:0!&邵;jZ-"PȰLJқ0̘tB 4Iժ邱OA)2T}HITThhC;DIR eH@Ƀ9*X`O)8ʇIa=(-JDFO@Ѫ2/2A_3{ YJ= {M@ k:*1+AcGKJ0ԱxyzE(X i}0X#xZlX@(=[Co.0ةQG8MZ*-VF'%M*< 8lAͣa1aˆTX"”I*#̓#3Oyegqd-=FKdpvBf#govgFއ?Kqat)!,KǓƑ(Ћ >I4xhT1*3S<߇`"M$Q# F {vgii6X{yiii{N«21Y9%Ǚk$aGu%]Ҝϲd a}x5(];g@]:Pz2fg{rgz6n.ۑax6gg6X y0ǁIDI ź'l$Ws͐'!yMO"=4 w1xMh`XZEU(Zͮ!_ gcYaHj]8;F({ƔjQ !+髻vPnȁeX]_5yl!y 縷mA]M2]ANrMr01kifOͥ!S_Aԅ+I ہPɓǸyT5;Nn^ȁ5hBd$-gE46Av{0}:2:rd.:e&*F)֋1;*Е@Z-K: .5й)ףN9;?iq_a*;ˠ+!#ih`rHfPEPE { Jfݦ |hщEzH-P8XyȁEPuȇ*PM؈Tgv=6,["1w;;Ud0yMNNS:hK%TEKe-&'&?TLL]+,E p-znjRH_8PUiƙ iD[L }؂uMh@u8vRW8x@oxw^AZ v;]L)]'e-Kq M QӛUݥ[DiJy$X ׽D}i؋ib:|O؅8PE'+m_%,Њ $ʖˀ.X%_O }exQ_S@t`adIc0– .N-..PoMKY@aN=2wr3œ6mjԈc_MA!ʕHFF*ØU:1"͙SZ QX_Vqgؐ6| UŘo8.+L߂ƅ1eɸR(/#) t㇣?4lTCzae[:^gޖ8ɰPdzMP-1SU#[VQ/nYt˳Hg2\$%KIES40eP{7UHutF}QWIsaO`O<}TCCu_2EbZlVh,Ë ,52rfFle5FF13ζ#m Ǒ"9D3 ifeYqJ-p(#LHYLBuL,)XT5P[$i4SDQWDz%NB${1daZ'S2LRL3)IQu}Uەd-hal/i?Fin=-kdwZaVN aL\KEcHSQ]`t U!i4%Z w2E{)ѥꍣmkO=lF.֞jSm'ykb xos$(;vAђsP_2o1q^GonQV7 Uᒸ0~IJ7)DY,k 49:d/qY !?ZQLBƐy>*nP9Qx7Fej D5At#kֈ*&6̚_D-oֽ-Rf7ph#ާS%huf-*SJAF+|̹jPM 8L%d&VND8kX䒔e$l#<kV9g$j !bn$x&--~qmc8,l4bA%Ƭ"u)jy]X9V2UɲEg=]ӂMЎuI|@*jK)JLpP {)ErZ : 1R,")Z2Bֶv1P+\ִ•nk^4 T> }k\=*F"+c"u$V"uO)P ue!Zrtt$eS5FEaJ@JM&$d A-ܭCեV[U[LBAtd3GCJKƍڭnuVh0nި7IJv(C )MO<>)`W6}4}GTUIj3fŬ8$@#(dJ47RYPA>՝Y]"j8 pq&`m9@Rˣ)(.?*1NF<% /r * KlJEeW"’6gZHܧb"|m5и-5Cye{Hg_,!wUй*jV>ܖB " mڹlX\O|m1޺UnVfbD,i~Yw^+Mr*%yN<BcF]˖عG.5T'fEl:{B.[͹#755CxbNv%!Y9Evu0%'ebzs^8 ˁE\^ -WUu5_AԕG`Vځz<UWN7MXV?P`(<^4ip$  9 ]``ٝ]AA1W-e$TXatP},$UFSQQ萲 K -6Z! ޵ޯ(mNR)P Yd!^ʆ~D1$R%h JheLKUAiAy &z^^EA#(_ aWy-pq T^ Rּż KO!QpxJ_HlL$VlQJ O  un JL4^"*4pE Խ%"ޛ;a{0ZHSmME@J$Y9 WS UNi:RZֻB͡T*R) ~բŗ0\}XxlՓuH3I[5jղDZ,4_ʍu%heeZJi5QivX]XMpXџZ%@?e f `"hLLdpglvxxrp'yyrgxr`'|n'}'{'yvfz|g(wz&({g}z"肮xBz(wv'~|g}z~nw'~f'}F(|h(hj(耦}jh(wgzvgx~z~v@}hv(vj*gvV)'w^gv(h)v&tAUAERMjA*M*L6 J@jIj2"*Q*"8j:*.zjꪺj^***ꬊꭶ**ꪫrn* MC0.+(Bƶ2l̈́B1n|:kS뵨ӺP1븒븢+k+Ȼ̷+n ll$2.N,nV,Zbn,rB:lvl lb,+뷂B+ z+Tl,k(&8#(lBl. )Gy "*VFmʦ,N-Gג>"1mjm~v+m ŢlFöږ.PNN-"l-smnV2.2.߶-^l(آӶU&炭؎n[,bk YF].v2b.w.ժRw5Rn8a`nnSn.:m>ja4Zb/rl.^BHJƯ R-n.B&0z8n*Cц820@&~bvr00rn./dv.J, 0:l"DڞT/qnpA`/]"欩<-Ѧ8~$hqCı[q31 r  r"+2q?!r!q%#!G&$SEr#'r(q ĩA&_eB;jhdf-2.9/docs/hdfview/UsersGuide/images/design_components.gif0000755000175000017500000001412212050301073025270 0ustar sylvestresylvestreGIF89a|\̜̤|ԬĜ,Z&s@h_aH(фJ`VhDDPp|dddttDDτ1NpV{~H(vW,ꈸO?ѝzlItB_1LTy!\d\X$$n3T*IvyZ\JlG|Btvn'AusLD4:̼\ߧ]{>ZT<L8T |[L$x|//{3dTT̔6xql lY$l^|LL4ydTdLd:tt,Dl|tP`T444dD||T,4t0l|L\̴t|lT\XT|ttYT\LtLddԔll\\Ԍ4TtdyuLtt̬<̼Dd|윌<|$$̄\4|,@%H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0I͛8sɳϟ@Jѣ e]ʴӧ?"J Xjʵׯ`ÊKTJ}"p۷pʝKݻp<[/ҫe L0Y\ǐ+Ƈد_h ذ簛;c'dw'WL{֝q.knŋzx꠱۲ft_N];ve2F:yir nYE%x坄nMaQxtf^'"F Ԝz(x^IAGߋ0646ĢU*i7&N(@ML6PF)TViVcR["#T`)&TGgN@hlp)t֙x&P{nx_)蠄ִ'h&6裐F*餔Vj饐"',٥ZU訤zhh"ਪ6*ʀ(޺jZt6fkF^&lf{g*k+j2m gU;- foٞ]׵&,v6ƫU!dm ,$l(, [k׼TsE-@-Dmϡ$L7PG-TWmP#sC`-dlnkuwtz}/7 ~wރdWvk7OGδc~TO>l=7ݛi騧{'t;m_.;cfCyTЉ~7X~5p~o񫣟}{>^n^8=H0}+JH v| ̠OB3yp1 A^#L U0 8̡w$%<)"n0C4֌H9 ƂD*gFLʉ'AV ㋰ţlhT"6ʇeq" Ա iǮ 7#H>AlKw>hC2 c8%#4ȍ O%->,͊ğ g9g<?&>t I D/e2b,eZ%/GrafYcOrjbG$ ZM"r \vd!JL:uyjfdӴDn M>5s$ =Y{&Mkj<0\^юhF5 z\]h‡*M05OtlRDtP/KtVIqժ+*HOk3Ֆ ښ)QoUAb>`UYrUXjZֶ5XmcVՈw% i}鑞2 IH? :,aC=o}l4˾Dhɖ/jW[6v`Mwf;IZW} '#׎ lpQZZ6V۝ =}l¨>2rul~'s۴&jrk3NrYK/s $[RҎ%D: #-ӀWƙ~w n׭79;{4Xn%jIq#?wq>_G?U\&7=EvԥtCϺʩXM§n4;ɤ|IIv;~|Ox~oˤȵDA[W z8AJzg:\?ޫ-쿕̓5 63[o3~7*PWkj.eiƫ#}~ϱ/J*FVM]ӟTwSR"|S*~#UT7~X{Q}qUB*|)+ ؀t 0l|n"1y(Aȁ}G)NT~8wS)z2X淃xr}wD-(F]uzgNP-RQGTU7[c*ll& zg8,hnuxmNys$bzXx&X A$d(&RZ&&Z_ `@G]u`g$XĉИ==료S(@D9[[96(dI؏=X;E[S[UU[`p&Bnb7_@hcYU evYh8x<)IS/y2 6a#9\6\S]⃏9?i*ib9YyșʹٜImXWcY(ֲhqԛ؝y09(yԙ@ƞLDiF9&YD׹Y'nm3u# v&v{wqG[fu E FfeN1bTFv#oZ j!zf#ZV^,J$.n0g9v3:$57Je21ң@SB:F'FdHW/g9iv9楎o!T& pY 礓 1LOZjVhahHTrozifssFJhmHAwqj:Dc|ZjiWnzlHnfkx mrh͆m$G"ZijTꦚpφKrzj6$m)VWu6hJm!J&wmHRjMfY 0/ERRխzjr떯NWoԮ:kMkjE V tfql6wGQp{To|q6qqWq4{4;ֳ7bqơkvs 7p ~&qڪR< ^q?k!wh6)vr 7֫氓Ƴ>&[&9kYKr[zfIֲs[gW[gK:+JkRF$+`;bc {KbK{;Vu+˺x/uK0=F˻TuK>W-vɫ;hۼ#36Et BwW{׃}83:"9D;yW(TIghP[K00S<- UU 3`hSby & <|6"8X{(EH^A QsD%t.8UeGސŐofs^]x紵..953J'#UAl-9*[J5~ޖcÌڳXUᛩ~_ _Xn.s.c nV=cƾ')BE.^>^8=[~UiS(=Dy:qKܾΩΊCY>Gy^[3^5O^nr^&=U^^i~u|*l~\?>'=D+*nn><#RIH]Ѿ7VMݢR \N_ Β߾n~gyþVޖ^]v9 ߽]xh^obqZ<_7SoPY?ùVQϞi]x_W $]l P S˯C@i=4P7X?ߏ?:B(دO@?_;jhdf-2.9/docs/hdfview/UsersGuide/images/dataset_subset_example3.gif0000755000175000017500000035040412050301073026370 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,H*\ȰÇ#JHŋ3jȱǏ CI$}jҤle)4.aʤi˘3klsP:$М@"z)եPb-)WVzmZ5kשbў ,Xe%ثwӲ}+.^|w/ap"- 69pč-/rÒ/?2h*S٧RMh=;ڲz oݸvΜڷy|6sγO^١oO7rK^c~y'}G]}L}{7޷ xj!G_ v($bh")r"wJ2>ئ>8$>DCOn5 BNېELv#>TZ -ϖKA9fWIqI3UYgG٥`9efc\hs2:蝐f֨i|F'g&*穖J zziz뫹 *+j:):,):jR YkȢmhت뭹lګ»MZ(OLkI濸L$ndpdGµE  ְSL0_,rȳ0,02l9'as!DDXD6OL"(D'R1K4bx.NZF/VD#H4n8G9xC܄e,$ 'BD E:Ґ#/v-I@aqφK ~ Z -,taC!HZ̥.w^ 0IbL2f~A Mdf)Ml 7Mj}:I&pBs#g: nPX I}ƀIa@?*d+Ui3-r8l,HRQр#`)$IR,BD-:Z.'F511ipHnP;LeADuSԥ1! ڔcOrGuH0HcJ$ƁQPʱPzU@ADSկ2+בRҙMb[K#Jj iTOsjجFB0дa+S;̓ Г.,ڲdpa'{ /PڐfC-TU9nkT"rG0fL. /1'̼ ;$¡`Ke\.T5s/xܔᦢ+sk`2!xm Yk0jaڡiMl+(a-nWV` -h{/`:YL> IL>2%'IVn fe~6P2'KHTGlf,ohrv' ,rl':+ғj-4!l0*Ap 4@(>]P_[gPLi^Z!'6:xkcd!tucdZb݅Tkna1 v) d($,ZmšG]nv!| ozau2@S8 S!Jw+ūmSGC?Le\iz^ `Q^ aqá1 ÀtJE=؊*"0a9#$5%^q13<7-˙  ׹YH~ꞛ:b7JgrPU%Ë]j4Yɶ]> ]|5]bGmE </ƟwxXN?kR 0Iz筴vVt=jڃ244|MaHаn}7]"]Y@]FZanWZFүa5/[31w+ .#) cÄe%g~G05_ j25sWU2jm@tI"m_O(RO{{$&a["gQ kPk٥b ˰|'UgQ6,{{# Ϡ9|Ʌn6Q2$1TQ3ApxU5 K(|2^b (V2 []007 :f(URj6TV[YgrS|L\78| JisV/Fi0id$1a19Ȋ1o!؊H8( xȌ芣if$O $YhRgָOѤ ~vi1 qtP5t{J!-%& %E# FPtw] }P'`vno_Jї~fi'j5@Xw0 BTF*f%ITED&Hx~xc#ʐr9f[`XЇvv&bՓ&萡}aUe~ 9a]ٓ*t4hVu4w  1 B3hqi}YPХ arm!W[00*X*xeoVqʕ5 Ya˰ EE0ϱ&K ȑ=-QכQٛ7QǹI a6AәYg-{$^V ~&;AAOSh&1{}{,1iB4K9(sѰV*jC֕0 sgg[p  rȊ$Ѐ\) 5 1Pq4أpfqOejw[ cqҤƘ^ҷ0 XڟHi9U~oy9?iq-T `sU8s"?"-A`lа@2$8 oMpTK}P o à7ש 06Vz UYq`i26z qj%c4y/3j9 ]*(=a?j$_JVX~ V(ȭX~)皏$^F9zᚏך#ڮh0!X*˰Yuq;0ﳰ*&EiQԷr8k2e&񙷵Q oP)ڔ&0 !5]{*ajcʄ i0oA! I~1{%_o S*xiVr% Lg|9pJ o`]]0iOҗpI]FB}x OjT``2 縼$b P6{ ɗR صqvڻːvqv$9i[k?鸬IT%:{buIjo_A$Ʊ!y@šPHIAy~I?W9v̝j܁뫿$/(6y~6H3 f%3O 5 e1J%0!GЇ opB+~ Y # ْWP%K\~5¹ƫU̬"81 0˕y k,;ڣUQ{ `;~_%jȃK~k sy 7`ny &Z {!~+_]mUJbi0okKpYlzʘ s p|Λ+nϬB Zc@8:U B[в2,1AQ,Q2Ѷʠ ҮѶA#q .:L)? {"}8}ӯ+}5-1}3 !'%6M{'}+a1q$AFhF\{Pi$ri։+ֹ4xy 9 |SPy #ZVy;wjj+ 0Q'VouɬP* 0yjHhmF Ȥ*P(3F|m:q ɘnPq{ږrY8گ VQ:Y ٥Z'}v}vIsp)ij] _uߏ<ߔۊlZ?ڤmL}]y9yġ jƼ?,.907/2:,4+>*8IqkOip9}klwW9^ۛL{.P/{QKmlM؂-> 2Iۋ={N  VL|$ lPu~<酼K K> Gq Vmަl0Ȣ.onf嗮{qnNumٗ+؟p.趱~ \.r%J3A/?.}҄\=B N>%Zn  﨎 $.$I ' {>C1t{@!88"9oN=D7_^junfC/,Ȫ~..n-o!6;?_oSZP<_J]OZŎve_p~9yyofH|O?l< 4*LhZl!ƅ#VxDM\$C*3ft򡲊3T2 D5< P@ gҢ<.3JҠOzҩM2ʕhد]Hl{25ibRθ+&ko^<1a}Q2-;̦e!lLGG Eަ`LތطhެN](gcg\۵S%:AP*sGn*514/xze3?JPe \7SPAl@&P B - !A̭??Dg\QD_LE q\ Q? C0=QMFTDCL'=?+ rFuzoy>{F'yw; 뉆hدzhg+rGŧ\G/p, o\A oA2~.NA u[F+/ ;x==~Ǿ~;>%oĠ߈C 0?bzhAp\xo#"EB4^r20wr4#>zSh\,a I^ђ2B R d ݨGpwHƽ->^?2v;<^ބ7EQǣ]=̼񯗕")J,/}aN=w(ܝx<1 "Dmx+pG\z:iL)Ζg/Pӏf3( "/<';k)=XsP_!%8ST'yiWlPzaK]泎9QurVjK{U]19wgQ >ۣ3?&JQ播0<S6pt̻?nL@7Q*8|=0/~w{(`n:Vpjx`68]_[ᆶ+ѹev5icoþ7 ?aL9[w7oUkc]^ˉZp4&<]ٷ4w־!+8\ Cݪ0wi7u۴":N*xm؛M߲^FbB6kOѣ.C[ۻѮ%}F;kV6>p,_3]쥛]D+tzQg"'?C3L+ )6}o~!W*s9On2SOc%:hMZ;-aKx=+oXЇ>r&[&Û"GۥӡRݻK!tr=@ ?9ߣ@v,@(?̲ҿK? |)7Ac>fR(3+3FBi+eX*Z8,y`hՃ"J.҇*ɼ}7S)j<=ӊ[>.x뭉é3?8YDrS&C˹@å- #)~j9bb/۸U:z/b<-W<߁.ÿcʥ{_K8@As&;SsDj:=bB9Gl6D^Aõ{-:u ǮK;GFSC#/-psڵ7sڋӛyS(].8?#,C ܇I`?Ǣ<)pCA;'e%=@m#^ۃÛH&I;"٨?=(E> ;F$T)<佨>fFz$l|HcdJsJD!L> K@v"@o(J`T> ˛KII@$M|Jɉ={AKI{-ӿt(t<9MKcc!Shv8Z@*ԝd؂SCmCLe?˱<)CIJ{H߻F^+íCd-\yӮT>Mt"Pq͟4Q)jPdtUJ}SW)=lFjKaTB|Uŋ2b2vͶ2W]pcUK]pJЋU)ld)7EM(&mRXN<>yUXXs3)=CR}ϒ%׮dN$6l\TH[4JoNh4WWeNkB +aȄU}팆ZDdYarG=xpRz\\K׬]٦ي_\AIًƳ?WcYť܀18lN|Zԭ׾&\&CZj#U,gVe] أu]clد[9GכY}ؠ-=νʍXiJ%\8ڣuM*̵B6X<}\eJYE_ ^]MҖ]_EԈ5JY%YZTFzX_]K%!3+]*Q݅Mx] |O5_}H\ `\Qɔȸ^m]9*+s]m_a"X}_%U޺Ɉ8E^5FeΘda%f^M b`4nX-ݧJ>LcsmXO-_8O%6m{xO? ר,s ژ&dm#^^M6T3bVZ`pqfӠ`f$I^W߭|]&YnpuDmؠgr~}w-d8gFgv}|fs.NUQFߐ^\f3SJee0jS^_:H'Lܭ佊HNM؇EzHS`U]aȁBvVx^gዊe jN 9\%0Y߈~kxv`†Lf%lcݣi>bpvQ젾dy&e͜Yflv^h現쑶lgǶ]s}_I>e'yNƆٷFv nmlNhЖN;iFmf8mMB+9Fjg6lv zQz\h*ā0E^_V- Oo%FJPeۺ^_溆_FJ;˟VQiv ?qfGqnq=Oq0C6mwvq.pVno^l)/$l(s.so+#n/=&rZFp>4sv= Jߩ@m%񠝄@j7k?@ɚPVtFq-=4p_7ٶ@O7RrZWuOrW_TqTWrOb?p?tbl&_r\NF_gc/iv%wqf?asfrbu^qxwkwy'q|}{|ow`gQvi\Guhe'Ta‰g&WmxZ4 eUKw Mfehfm.IuW/i,$wvywynyEy~wq-yl\?xlWw¦zzTWt)簷w}g7zw{{Wzvymy^'@?HXOyXoo{`1fp#O?{Esw7Pz?}O]z_|og]/d~Onwڇ}?~'WwU'~_otio};yW'Tn=\?p(P&e\*~)[2 LS2zє=lEZ,eAr$H"#NĨrŏ3V&992Ȃh*"F5f<ɒ(Ҍ7B[ZMTNꔤE:jlTW=˓M#$ϳb;ھOknk6˼Y,ܨ!M]hr/է[c&U&6I&V^)٣ ٨nVe@G*4pMbMzheiФf_ PikPn"'z&E!\ -M~ڙ'[IYC`=TT:[Eger=ƛrgDWFrLEXL}aV^^'ԉ4&IǓk5X|54deb 8|0F[YcxW{$]H|3{`Een.rtbd:# #{B#rn vyeQJLy &UsMEJe![DMRE܊1^djx=^u$j|u؁|z)S4I(FCб Kx^w`մ_J繪C*A&-cھ W W|a[]0|A*UPA]Gy#)v"\ {ZrymtM_hhZN%ȡ֤#nFq.r:;t'#gs|MOOw4k̕wJ;Š^{E vƢKWB v"s3A 2,8;8> c@ŘNޘ%,bFl%O]/eJcTF!JEj8_)n9wKإִ[RyPm}.EkEuV;Ua+Gys9hv<z~U)kMkh;-ݐ.'UMvb6E`[Z`qu]208ߨpTgwي C9h0k97i=ZeQˮ.Ph><4! H7װ]mi3~&0Lp@4SCψ2a4a)~cF Q0GN15=QrJK̖D}͘&a]_3p,e2v,],Ym)H̃YiW ZŚ;S*s: hA!5X}g>{3>V%>O3h4bЈ4 (?P"tݨ?Z)@:R& EO^@!2 Ж4IGwӍ(T 5)JjT4)PAӠ-iTPJT:MJzϏTtET5N(A*}TiPߺVzԭ%hWozҤ8ijK+|3Ѕ3\+yΎ%Ji@C/g7,htAgBZ~tjFgQՇs#}NQ[miDc}V3,_:~s:OӓPg EMYymH:m-W{Zn6)nQ7V3if_vzۻIdb?/\q3}`X<4(rw\χ>y@DXl4ULx|#疧 Y(tQ=r\T9˙Zϧxtgѓ.t܉]z\ozNt\@zQ.uN6ͥr#~W;^򓟉}Cuo; g}K_>Š}?ѯ}g/?V _ڟ5_1`B`i`d}J`_ U"SSUbQ @Ma:`-" Bb- 0_0f n`.R22#2aF4ca/" 4>-!4a8rcVcy5 c4*b62:a9 f.6bt >]JUAc A\^CKSfD:$cbDa:!0JN "`Gƣ8r!66~Gd !IҤM&"MB"aNƣ2&3Fa9Ef6cHd5R2PHqx1%I!D:>BWYUZ"dW BebxTVQb$KdSb/fJ #dcLvERg.f=n&g>Y C\e[”CfE>TTQUETpXcX,ch>Oc~$NZh$8.`cN'HbcFF%G2f%uvgLn'Rgsj'.':ʣa]O'xb&P."FN`jcQ1_gc8Ң$rܠYWVEo 'S1UB$OIRVmBԄ*]JQZ#Rif~fk/gMR'z'SIJxgv.bG}(dJ tiefyhGh6FzT"#v`K%!YFC}h$c1UAxStBQ(qE^Z ^N"Fg2>P%Ks*!})kңyFvd`Nw'ftfgzbB*b襮kS<ڕpCAflQ]}(eD:('&jNe2h>"jI'JVJzbi'r$2iuJJj Nk:'"bcF*B)>jZe >?ՙz([*GTZDfV4,'nfZkBf,kk|F戲i**nj4'+jJi^&iL:Jhblv]v#zk|JqiW)fW}蚒CiV$pY)BqT],졦(e5vlxl^+L2lP-mm&'*(f6!֨a N" cir~miP>!gR$E¢X2VoJ8$mR&nʖ&Rn.ۊ,(y,"z+쳆*mV&/=gBL&"-c leeT*ZjmLʩ@֩i?ZfkfSzg+an̺#kvl+&)RJʫ^0ʾ-ZoR+쐊nT_溊ܘ gjAbh,,"wԭfP5li#/z^0Ɏi G"`7Z.)딒RJ.w'.lR)m^/:FmITBo[BkI$ZhĦnbrm1kϱ/66uZp'o*(G2d஫2nFp*C)+pe:q_.j>f@o[VRmV rnYjީ)-&w#>q^1О0rhkz,~/k8milgB/Z' G0޾ksl6qiwj:Jnd"e0?h~(Y#/"&kg&ob3 +;f jsGp+(ߒsֱ {'i1Kkq"C]D+1EW^Tr%rκ.:H#+K޲Jg4uۂ֣<3X5^93/Kmɞp>Bm&RQ} GQmBŔnm3[33Y6InRjjgro/%k&37t62clhZ/Qo'vzf)l`~ wl[Ai1eAxt%o[坪53"0Hg3͚srk׷:pKukk~z-}3wmG7^4YlN[FKx^6KU ܬk4xv\oBE4>UC3RyG4I?avFq;|.oks&޴xkv`2J4B1@Ncpj* u3Y\&hŝ999ĥyS&p$yz':z#z/W:[?zc:_ozEz:ks:ڧzgQW\溮z:;;'/;7?;GOR;go;w;;;^7q?f3û? Smb=UGI>AvuITG)jSUSJU||c2O|U;Xy^n>bPTAu~خ~=A*"Ep^~mb1V,ֺ~~D?EU;?w/?DI~;$ӾW~6>cGL"FK|~svJ?N?@ЋVZ}7ph[(C4P"Ê)d^Œ=493,`Â!'IsAYٳϜ/RYgP/s ]YO_ˆ~);<7Vؐd%hVAؾUv\c:6"_}q+]wY %lZ }q_dVL_M3Fq'\疝!'dcOK{i=Q'&Zc£f-KVW敟l-}_=v{mQC/;w -Nߴ󞭈|"ૈ=l<\n=cL;+/Ark@ ;vL"1*K4bE}J**$IC}t 4(")Đ,R42q!HexDŽG̺R,ά'H9K/+S3.4Kz|0K4jH3H8״>1 TA%9AlGJ S27/QS SGUNU8$XQUH 1HXYG6YSU=VC#GkuUe\Z9I5ٿA{mtWHer:-UYaL$U&yhYKe 5F֪ ?Qas9v1:[/*(B.Ci\CY(?Kȳ"SKΠZ,Tk*l~i,Il9eCe,ZikgƮφmelW.]Sns> f;-|ϻ8l[ [kY6:jCĦz/w9LR j) 51F5:Y6 &HX{sނխ%h _zc{ L垥5S3[&iK ӗ7Iw6Q$eVO  fHԊFja{umId 4_S%Rbal-Ѐ'ʄ!B}05LVG7%wO! *-$(@^ЅOb_x}jaWx_-da!zD-ưy"8)O1{$P($؜`08l+3j N"#bn O0܎nh$@Lfb!я&yȄD"LV'|*(I+w@dj(L2}F)ZD2SPD$iZ3!עs2XLeDhDŽ\KHM\J$4Y8mڒe$7=YT&))MqV27 ΃ M2*LSŔ?ۙkf f=3PCs+g2_3 i?ъtgKKΕ&;hI_zҞ4-M:Ӊt[=jNz̲f5UjL֫55RԿ6o}lRfvke:־6mll/a6n:ڂ4= Ϧ1oeyVjh%C%Rr,2)~E,&!qOxtqo eRm3R;&0=[gV2/7+HeThMs/KrqΛNf93F/Yóns?R'Lu~JiQf9an+G3LR]%Sɴ,N/Y^TȇIbnՉNQFHɓv;MfT! /)nG5%f$a7W%}SW[u`,nu?LfЭ.RD۵,%#GKjZ,I^ٸ`g~O^lN٬K|-ߥZ(/52D//o ѯ!pA*>*0A# xb(fp-F`iI92)'P o" j!(d"*V+':bI)'T` + Yp iB󂤯,/)#ó"J$ &BI1mm ' fѣ0s2(PI#C( =`衣XxJxPBџjoq£0]f&QBQ")~ & . Hx@`炨Cq2#j ɸ>"R !;0iɬ:eVƏfqZ)"AN* r2Uw#)Ri*>R)Br *hw2Fʳ%WG8=T$GN#/'g/%%(B2mƩʋ*n*1O$-8LrD$w+iDyw+{2cAebG]AdFA jp9qnx-O2Otk* q5`"1&p!b@@!0A+)gI4to^ ,*+ 32'3-)/+Y$+RH( 'c/h Rj*wjk.01PqwВ"iB&8 Y<00 ;#`9#+ +7cs Rf3Ăm52&iS^ߵ:Hb2I$i)<HOXU:Ϫ^g_ cli5tI@6Xѕ za;-$*f?5~jhr*LGP9ONB>=QvH)V`tb)P!tD,q0+Qufa J34pv)* I&^f[N3SI_g5) Ni, :3,p{R6awH+T_7P3d[A9# *7Nדh Go)^Qj/paKx㶫pLGd~7/S˻d,rFfUR@񬲗H_zks'O?u CQa@2K MFyA0LjIpW WZ!ZE3 [.(cbWUW'Odvp\tU*^ S|snW7k*.HZQFUf @nl{wfus=-,øB 6c/$.+ ɽ‹17_=BcdU(M& P8@! 8e*T{+ ok֪"5Ҽ̋5Eeh/Q+2{#TK:{ˠ"t_x9tx4t^JL@;)qSOSL_"~ctayP5LGJXJiL0ϯKm^Tv0HO)0SRHfl&z3gex4ϖqհ&KQtܒbg4` h!0?NMSfqM9ePGyg~ileQ<UYvip'k+uaq5c2z32r dG zۧOz;X0 cB?&H#e2*d}QF[Q!˔dYG'i숳B|J!ÂZXӣU;캲Bh,ǚ&Ё@ۊ՗51@C7q 8 <Ō;&ɔX6ړ= (VUm箧RCuƎĦ0EqHվ G[vB7@z_֘ap# }p_(S_\9Eo%pѣ<{Ѥ]X`PMlM]WTSOM!ZVuUY~@Fyubb 1Ā2&(#8̎(ɏL@ I$.8$üH̏8匟1 e^~iX`I>]vE{! T[][E$'TleTE9UЙUOI[}'1MHB5hõT)Av|~z@ PT)hjªjHa)(JyJAMSaz9Iz,DYW&GV:aL&J`I1Q6>sݠ>׊@B9#XO8#@K&>V 厠$LHbeN,Yd_YHV֚0)8zҥNr&|WPⴌkʂUqJe.+Y9l-t#)e*3p)V*;2Hߺy~qݙnݞ{DLO%UTQx)6qDχp.ls+ԴC$nq .&#pP01? :PB6,c} 7"w`$)_l|}uns"iU`~˩3v=[N'8ν|R_\?viPm_[μO~MM"܏|wEg|-P~5$lZ[r,T|1&Y/t U ʠP R'Kzd. Ԑ(E]ǯFj սAF\.`SQ>pa/(3qڑ߽qLh<6r;هԷD#nC "g#N2s.V"16?SYwת 9Ko=s-o$g"ӈBV: +W1ɖ)9#= 4UQr6F>AQN=|DhP$;^%N`H/tFKH]Li`FC ad@!&A=!2ja]S-q"AžQe%#R,y#K?,#%i֨W,m@cEp%L8$ *XYȨVRoz.XH%iS+dP)V{*>ZD"itF8mo ֆ8,ʏYG!/ዞ8y=PRgO.uM ,X= &#"PLhx2]Ә^'ET(2xH0AS>CKI줾66B s3c14^A_Bꔧ Pxc M^,L(B$KSCiBq} :Uٌrhg좢{*_ \i3ۢaHf V.`1)Dp؇VB1ʏIY,0Ը.1+T|akG磻i=bw:նXvc8i\r"Pͅ@%jvs[ &}ˣqorgA~B{&i꣙MK>!{Z]c CK\NDyn;bY)t~"--4`T퍾i.^ч!Bۆؖ˔ѭѝqA~LqI8XUCR.S^0w°Wx]eZ6M?\n-$^M2DxBX5xmc`'\XoW-wqGMC*˦$3B pXϨ!b%]t|eZHڙ,o#&HE#V&;c>q}{g HNdT@!E ܓ9C9gp*UWW_U$ 6$Rk"IRǺӐLjVe|VeNO%䕏9wz_Vê v7Rml4_@n+A ͋8v֮]۳M7sN0 nPP/G<Ux[ XGWn b@!rN1 4?DCV"h±.3=e D_!7UqfG$A"U$Fqr-5B`&T'P-AMbX%sMH4-k5bpV5-3hXcNB!UhpϲsGCaSl/mu/Bv#wvTceg:oZ;b:*(TtSi26r2ֳI7%2`M`&Vg~tHJ\8QgW\C@(nr7jjH3E+ $N%ċ~XpBS$($UdxA %E#E4VogO mRb0qdE#tWc"&I\4x{4ssw+CՍ t)h2t,DoV{u W(Abf8*8Ӂ=ӄiR.fvQ8>KWJ3%}/ti tB43_iIg^R{xlE mEYfO`mb ;Bn"%^2 Q@&8yЕMƗvxWN|6} 4dV^&HwJ8y~@H3pAĔq̩M'wҔJ5A]b~O>\ҟ~;|%;I4 AD;  Q^-da#N1nb5i(aCz+8cRӥ""z+˲[/'7ez^Y@kM)^PUIN-BLw7)f o2knKi8a%SZ%@ ϚNL[H18Cq^M (\\+s$tktT iR3Q!yxQD %/e%C% 0mGMdPU¹nv7d2Rf$(P!ءzt֒כYQzCL[hBj'Sw=-^c*s@^{_杖JwUٳexR65PgUB>'6S(UWz6VtVR6aA*iK$R)plh;E ZLxrOrkx©ģ&`f*{mHJi*MSͮClEȗXNO 0mm\O@n3,~ &o`U*GVTXp<gPL roA1P\BFEB}ُy,._ܵMX(' \tJRŽtLƉ֎)fMQŒc92:Jجds-+s`֌Ji~}>Fu~ȊwئcIؚ ] :I|{sM)]>5ՌK|bN*=ۥTqzi^ۤ6 JUd5ȥmUz ՆY69@\L˜4ctw2B#JJM>ֲB(!Y|"B/ EB!2\aČ Z=ZX㾗hҬ̎/7ʞ@s^9T@Ѣ9aQgFjG/3Lt;uU-RT(׉B;Z ΄/\q*ǚ<"E[=&YԣT a 2a̳%ў$y9۫YỸFԗFg514٧[͛I2)NL0PƇgnܹѡ't<e|tп'O,}b?SEϧ_}'l}4" @/B*!e )0B좐J̤ː GS/`K0Z()hA.DI*4h1D< 62KBœ4S *,#,4yC K,Ҩ*FlQh(HlԒq%J(BL҉C@T&.23E>aRSC @MγM< @AnUUNIYeEVZsZdvXbCXdM ?m@YRO(L JɾjF<-s MFJ驶DMt0YtPT]VK|@ĒBUcL gSgĉMS-sj1jhPrЂ+G֨0tvaS$Ks봷2Z˻5TUUaι[n9QDYæ?N686wr-rd7#ȫ)j)lZcz)UҵrS惑y)X҄vumL/ozj\)ˊވbhmÕjt63 $iP3ЬFd 9y>eÍSbX&4= S`'}_Sl=&H J5i&-Kkr;Qh&D\022 Fڵ_BAң28# $.[Hfd7i҆!o̫N.! +XF#d H`O\d# Rh K&9)MV2h&1YS^Ғ(GJXf2,5YJڲ*;K]"Hx}A-IfIF#e1I&Hw\VB J'CBjf"=lVJI,I 4Av&{P#s+Esa"#t ђNW!+:&٭BRgxE*jƂx{Cl7$!ۋiJ[|-ƱlET/.a\SѨ&MjeHx6cLI um*-qc+*DҜ>Yk!#!_/Z/d@GCQ-a6ѓ0f,ތ1mB[F/g"hJ ]ӓ>us lHut_PZرVݕG}l\_Q)F6yhȦ\Qrp 2Jr$q!Ǵ&w,t?f z|7 gxs1~-^*\=Nqt>?t|>-\[?kkkrS@k?󣾣0{>[i>>:#9@ >cK>᣿A@+(9y"[@k;= @ A+7'C/ t AC!>$=S=<4z@ٶ4Ʋ8*tt>@ {+D=A=BqDJ4IDEQDcDAEPPDG?4ED>VfDba4D\ZE\>f,ECdA?Dm FnVEqEGCcDwkFUCze]I,DQDwNHL4F|?|PDoE}kG@O#Sel>G\b DteLI<ɑląlɗTIhɛdIIXTHdIeLHrI\EyDʗ<ʖdJ$IʔItũ,ɔtʝJJJRtIJtʚʰʱD˧JKdKʚUɷTʢɫI4X2<*;8= lL|LŔLȜLˬL=LʄL MLMMLT\Ml VLU]d8SX=j-[VE;2Rk}VBU9]TzVS]TlS;-ISp2=B=GXSUPXՄ_WHEȁ)4tJ5S=YӔ]YmY}YYYYYEI0ٝY3Ҝ ZY-ڢ%ZYY]Z5Ӥ}ڠmZ٨eY٬٭=IڢXЄ1P.4I>&J$\Da%IۼQT[[J[-ŭ[u\ōD%\%\%͍IHܿY][ ]S\m\΅\ɵܾ]-u]ߥ]ٽ]ɵ[\]YD%\%e]m]\m\ύݵͭ ^^܍] ]-^%U_\[]U^] _Ljm_}^}>3P[M91P1XXa.a`n>aafaa6p6b&aV^~a^fb)ba#1$>.c"F'/bvb7^fc5.Pb,bc&fHdaf0bfHfihfdemƈgfnfpfjfpkgpfqsjfcgs^nnwVaaag`f4H =R2V[苞E67hh鏞Es Pen67YiViibiviP(քjvi^Fhi[꧖v镾꓆j>iiP j.ބPjVMFkMxքkMkllkFVlP0vl˦Hl컶lV&mҎ6mFlV֮l~kbm.nkFӮnnl޾kގP@6k>6Vj^e؄njꮎ^i.o^on.鎎oN zwvovowhp/p7poozP4e4_9E|q-׺bG6o&stohhNi/iqnoV^i"^r&iOijPi>jins1'3irꝖ:s&^~j/t2m^skn&P.n9k01wk@n?wk/ji.sĦsVr#fr[r&=)ggqqcnq vqs;qvvobPr?v@wuOwv'V-΄H1 P/PwqjOo7veh/eq7"xi='O?ovj)n!E)G/GoVy^m6s6nkľFtFkؾszHot8ok5s7.jDOuNO?OPnRtmCWu7tW_ukuSOTuInuyojnSj&xSxv%r6>vv~..wo/r?pwݯ}W@p: 5SZvq>qvFxԏxe?wgq~viqg=vjpo6hr6}$hnXLY(eC DHp61TMT!Ab *J#M%h2Ȟ E4LM+6YbʛDEܙbϥ4M<eXu%ƠWYpC YDKF$E qMKT*A:YJ `O/PA FDiQ/\zvle]veb6pN|擆IjcɅF, i@X Mi׃VO(}Y7eژ;mz~iۺm_j k~i'~vۄHkj[g !}wYf}Yw_!B vQ3VCVdR12ԖFԒ&)d)9WMRRJB]]uyWB!U)U%PNJݱqø> 0C&1$o =У 1d$\ˠo.M=][(.owߧlv8_}⪟f1 ak,V" %|".*a?ZJRRi'NqPINLTR?5?rTV*#]Tg[U4PJdIPZJdS~QTf%VD!)wd(v`T4H%B?ao PdBfy'Bjр*h")g2eF[k.}'Ʀ-= 9œӋ9c#b,k,rN{Ei 1^yj^{(;'bvf2qƮ1o>:ڇ`$ۜbQQ3hfZQhfrAZY,7:!OKLO<#IHV40pF (QQT5)*IQt(-m}{!KDC-%LfۑZr^"$Mp;M~&(S:cFhq( UNt Tu+M(D~#wÃ0)^8D/I陣yĝ0k%+0@I\X.4 ^YV4xY/|F#ؿGaK=:صE?0l <,gC@a} Ndh@tqe*يF! a>OʶoD'UgRɊҶpҊR`rF>H&,BѡSJdr%Cdw@2w V^Oyb[GޥAaS_93ș`)nNӎ =ƿm~Yh"ø.8P1h(s|Y T 5TN9d MmH 0i(bDr%I jRѤɾ'Kb) Oh\ָ/Ѿ;LJ̄aTNQ.Lt.` lX;A ,@;A9?Z ?`:iLeT!\5 @t)dc X F2aTk `#lF J# Zָ.W xnmeDQ+2C R&ML;d?)pm'Y2R"-ZɯZ"+~Ҳ7q%9JΨ S ~&,9ZrD-rA#D$dBVdzc{j^,^޺>Oc׽^ .XĜQɐ}9҄ӿ簙@f hd&t cY-"qfaꁆ@Ə_2 k;5AO6TSHb_ Dgn3̿$Bu(! ZbW]]TH=n#fK*,2TLL@Z$diBr'ė1QhXALɉ`I Nm9UYdQ=hզ)R d( A8kԈ2dF8]V#u>\-,l1(>(ǚu EtyL2dl@&$@dƵ(Sm`Zykyִg @>$zy%2kbW4D.mЃ xV&}OHBVHB.2@Z(P@Zr"CF4̃XĖoPV/m@Dg"n±Q^.-2Vc_4޵P2ЖUA 2cybf4lܢjRA(e4Q3dF|Yhg_C%Cʒdٗ}E؁=ؘ|XµPЍVׂٔHEԤJܟ~Bݰ $ݘDčD܃ivАՑUIb,肴S]Lo ֵ#"ւ- vKYhَYh^ hh +,}!e& bZdl,dȭE"ZcQ\-)EC;pD\"wuAeC)]Fe[i4"oFgyt R/.Cr)P z &jfA2,ci'Mb2nW&& `_d0E6ļ_~=.L),[L_lk)`cAu2 % X9zy*?5vFUĭU8jE:\LRѵI)U+ؑ؎dI@R e -4نȇ >-ư>l1$lCp\IpS[p201@`@W&e , CԶAA=X_ _u2 "e m CB´)#q_Nel>c#0%'1AR$ (mzf./R"%R)Gj%*=_@(Z{Zm.2HNIȅwāplr}:Zqm;n Ɏ\ b_ހXS`?e׼`_ЍHHT2B̈́FX`tʠxJSM2tx "1P`FmlsC_=3s/#Lh%WmNB$H'@ñ|C744P`b*hbĆu1EÁGuŦ'v$blFDàbIeQgcm 'z'k4#!S_4{m2Xq&qWo!4tNehfP_ģ+YԂ̕uIN%@;&a)oQȔ,LFōGN`FMoWDnY XI>/ 7KVPoJpsNwl$ P 1(; =;1̃tS;$uOwuo;(C;; v$Ād ߀{|@C2 V&A 忔f/GSS QLEtn̞oӆ@ZoK~ƣ>jJ28X2jPQE{f[D['GP 'ƕoGj+OL GvH-`R>^ x/HEFN(6Fv6J o߸6DX v>le e DrtBlЭ@#l ,kA ,:Czo[4z Іd5a~pVKPxݱۈ8)d1ҌoxQPԆyLJ5_}o @P4_1(LʣX4;?Q/ac6YM!|r] M?5 aX]6gǁVQ,Ȧ[j( | |{Ent%etU΋/ SH;0-1bK=[ֆ1ϮL)**Qʫ,UFУ˒*4RnJi(PV7)+(*1r+Yʬεt\oeڵ*ݣj~l*cʴoؾuBJmҮR-9]\}P2A5HCQd4$1b؇8&,:A'hiQQMt? "%^GrQƒl7$0'HNjljn)J˺֖62s 1BK51 l45|ꓲ37=Ʀ2(Oͨ2n뭬[ͯ h ul$r9JkK#U0)#n؅[Ϡ4Pp2CI$C+Q0Ye1p$bxceAb($}4"<\# C|"E,P&lyV&O2IbH|8eoK=I+sH$,eP$i{i=b*9:J6,QU\B,,D)b  QPʸ6 ,kOɮVEń˪k-ԚS6ڻ[ ӸNg䌣 /. *JH-[hE(Q?곩pcP 5&aAd/(eԡį#qw(?|KkcɻWΫ-{;)LK yc").)V.E{X\9gژPp!X%ɀB6L cR(85y#SE SxڨWIOyke*ul~TtӴjo̊V>E,[>S:)+7AE-EU$g3m*ײH>/X >Qj$Fd=B]MvV‰%b#P44 "W&p  Ђr4&%1$?zAu?/qxޢBDJ~cx8U.JQgE)rչ^lPq fY+q҈(T-3)TqJR[ʈraϦҗLeOSRsa0t)ɳ2 `0.4<]JQ*T.%}4 Ch-UBxmQ u(%$yI:ŜC(wxCeB!u!PK!8 PΤ&ӢVM4H|a!+G7O 3IR~D"CM iɆ+[.SM,x'QMpZavBhh$[&PDkn)zjQsړrb(Dž" 6mlb5#j5j١eK]w念9 ,|HMQpȠ@k`jTKf°7ZL .B c:$y0h`Eu/E}탾G=%}[Do4v0|ደ/C_a!|h$1x? N@܋! C+z? :E!fM$ЗѠQo,Up!b&sψz\c'"+ B_d939e2q,3{_AraQXsf:wY!qv4w hUɈnIf+c<` W_6BZ a KeEM';X3VrgMl 8CG ہ4='21 4\moo޶5nswnv[F7no߻7o|[f7Mo\Fÿop ϸow 8'zo;~m'7kr#A7sn |:?8p<*xSJy睉}$+Rׁ/y-wv  ߺ]p{w_a>|xtq|Nx*};yXW=o` z|)_w^c?|=iy7??}?I wsxÎ@x;)h,4g\p¾L 0 !*A.D򏦄hj P/W 0/peP%0PcP^e}н!G!n0 pE0 k +pYp pzpEb^ 0 Ő1\*plPȀMd l E0PP#r PQ U ?p Pо~ KnQz-0Y%1 mɐ} !CŠBvЦnJx%ܮA0WP Wd9fp +H$LvpMqG%Ͱk=Q!{"+x‘L pCqM$!1.% kga 1?)R ivp q r#k1(9rlA2 9 ) rXzL%*qDpo(]!ё.wD q r)wpr/#oRMR 3g.r"r*R^'*?B ^E# d&.\P'].*#oQ8L+5[2/?r1-s %&5(-2223oR0;8%+267pֱ =1͐3)E,)16s&KS -r&q1?P9P=r32eS., q83!eL&s=ョ8P:/3 g4FR5SƦRn ms/O,K-G337h]n Avϫ _`DA/=q6#sAs2!4 4+ !2F[Bo}@ N.I$?4';p0t=G$05Q#qPS!/T%wy37T3"t *M4)&2`Q=roUqPW,0BR71ݲ,pJ9R:#2F%a5*s:吾)o"1I[ 3a4PmS /O:[uR_3)\vhALs(dx G^[iZ?';?5's=b4K9!UD5]u127mS&[ e(=!?#PoV_2H}RRdsS6& ]UT5NCf.3U&1 E5>R+_,uflcle'BO6!fDɕC/Z,*9gS[2T1_e!Rc{302=-tD&5a`\E4`z^&D ``lK=6[X[ I>^8NZXGu-!g)S(ѲF+:!Zղ+E{U'i.1R2YWlGY4}sr})QA*T!srQ1B͕-PU%#nKx&9*RT#;3 Q^1wmwU# 7I T M?51}@9M-60i2y3X3Ұѓօ$wY,z[Q"Y|c/} =lc,fwruwg:'57QYM77XX'+8?]=ZUiy0XQP},v;tKct]PNʹ1L ,-QCAa BAAA}xas L>AO`A rp v La!PB[[vX;}ݥ!YnQkӎeqX]џn7{4j%6 R GYXSbSez13PW9}؈.-iEޔW;5kmQGv$TLu]vΥ So_h4 - P C1і)[i7ddJMISFX&hb[27N a\N{QdIqOg[St^҄ q6oLE6jf0Y UΑRJYѽ}5-E/a| M#XQM }엨ˌ%2ɃwSfΐ{9qke|%^-rҲivm T_͠ 9Ǝ8egw-bω5V ˆv$4Im}'fwz΍a̅RZ_'\u5|Q\bdWiv"dx&fh^[ Ʊن=i^ǐPUE> ĠKi n6MSH˄AT&YEd(^R<1umA>1 =I2'fM"u 2dmLSUmEePA)B>dit*Ed`ZUCVe5tvi;& k%;lV +@ZWRdk`jj ik+CuPJlAlY+.EVmRk.5,Zڂ;UWBfnN oU,3kUj*jn/TAl.ˮ~Z&G`*S An]*Ӭ&dWo fd&J,=̄&dN;k ]C%UM;2 mk =agp'bA<[IÎQDA1DDK:sf*~MSezQ;v@SPC^ɮ|&\;—J| ;Ͽd ;FWłzZ0B%i۪p^d}  8O#Cʗ9|.UNQC_FխcR@JL/BAs.Mo d;vPQYRչc@i>`)UI.߶TLdB؉jlx3P9V>nV8şjM4ng};~0:HZ76BbAuըNR+vڔ1Mfϻz7;IсG(JųdITOq,H;3҂&c >N+HQ-mU$a*׺"͈&k^$$G5/ E(Kb+b"̴Mwq|,`]ğ[,JX<&k@%s~9>ɽ$1 ,IDn4&0-coR UHdHQ䖡I%nR9$8> aЊ>@;FĂlb$ҍ}SKDjRf싧7~U4WNp픺ةxN셫,Ʃj ,s^uy-cg4])'OGmE["#hXxZ2 e'kQZ/eb1aYk,)gJ6)5Z_%V_'bQP |>M*o5a0Tuc ӸW m=$P@TK$.nh8G E ]cod{5jɽX¹t iAxڷ_gh- bjb0nrSs>\'H,Ib-ež?P?>&7n1,bԎ$XMJ˰qW J2vBqE_|.GX*Oq^G r]_e(v:kGx<,K`\DrZ&XJZ2ɄF&ĠޔoN]KJ(<8PnJL<#s{ϋ |_z׾=f|sk3ͮuwFwv/FhƖr`&̛N^'er‹u%d+p0v'r+sᵔaنEc xW :QUqFu_[1ަd㘵 :VLk]R+eb^lni|bRJ.n;g EQݝaj l֋f 'OJGp2_eG(Aʝ"mւvlY{A0hdlЪvGs=tcq%֝XzG{C_AC=43se~lϝ+*.дD??RZA¦Vgc-GimCJ=d3aPNLEĥCAQלc=mw2Y?TJ=*y2aT;!VPWWCp8rqTaxYJM|^tf$l-fb)#J+8zgw2^ssU/vgFQEc+z`f@-g)A=Jt)&+bv@=,WYZG@hLWgOL8v@\]#w?Xp7e;E%R_F%@ 3% eS"W5WdY",m(TC~>^#R#yYSfDK aT:E-cQDbad'Lo7YX`3EMTM K@fD[6[4@;ṇ|#g?+ȔY굋L儙h)J8-R(=X&[؄L]wBNΕlcKSV|#;.UwbluEReihsio0~% j=qj8:I\`5dzS)v04x.T2EX[%G*;q@{9WWZGm8m(OnPBs-'nGo1*QWvT10XNѓ+X[pw)wIh.ŔvYV:nE,dq,coC7[C^g5J1b{5>Մ8[$eHx1N"EV2ti>%Fb"$%1gXm\X{Zڵfx1Y;~CW4}$fx%e_umcHaqW(IODӂʆeĶfLh^({Qdg9P ex/vvĵhEF,6M_B(Xeǹ3DVsK6z +Dr0&/WePݖBuB(d1KggިNGszEt$V;f@ !$},/et0 9<# @AM6eX\}7]M󌥵e:sI)f?fgRiV4B5z4~9uOhϧՎ+VWQ>bvv5u\FdD-G4B%E"bX+*|9(ߔŒg d 'u])>GTCmfexD(XrdPVpxxhElwEpUY)KGa(A,Ӎ*6|t F/ч 065&c~4AX 0 1U8 QpJ HJ ECQJZ *5h6ZDz 5A [KZ6Atc벧1 Ġ[:ۯ%KбK ADkC:J۲${2A[K+KM{{{=kT"-k1+ ˰D 14;SE;kKsDK{9۲| ۸j+; wKKDz(۲4˴9+,;zA1[;1SCk&kQKaB)R67_=1A -$0]w)q+4-KUVY*T#0bZ* cMHs+낿27w*V5-"0-FUs- 2R5`k){42- ,bZ &2:'0kA[\%S1ç -vVa:H)? <őErFR- S5'W 0N+ox`6r3{2%$:S9Iה LV{+_G\I\HVZ@RpAUx:t0[r_gt`ݪw5t(<p:WLinWpc1h&bFKTR8DX&zXLovzb*d#jecgoaQol7gMLY/ϞX>m64>PybՐyWQ"$u/3V}< 4>IMxvG[SikFtF&1U)$cM0D&ШJ\d{8t%v#5EibВm7 J =]}|k<#Ɇz'Iw3ڌ-5h3Zڕ$e76xz9pz JvEԇonQp{XPcAT[=Q/קs'І5RrQؕL(uzy6WN3s2'9O;6Y ѭ5< =ip#7{[)8pz ]X<%AY3f^GlvgorKʓJ5FˉLl:h[5T%?FY4bbTa%gݝv(]59NF-~R N؅/]'ўga V9ۜ mLsltGwԗv[VvS~@bIZ7o_>}u%/%%+0ʵR Vk5mR)=B2>YI=>Ca1꽮CƋܐNa$;X2!P1N[] u֔.>:O㤠}R=3-fb֭xpuw팶RpY%w8'4? ȏ~}};Tf{&@|b)hv\SPX\l^5*z>Lj:I6!7KE3;%i Qaꛯu,Z5y@/*Yyle"cx}++FA<%nK)`*׉97gkL:"J D .ƨmō,3\\xb>4@8)n⬵A'_D.zFAo2}#M_BNJ0ھ4o&eC/-} <྆5[ H%*KOӾ:ORA1=*E:hGDuF]4AT t*RbOZI.j$1dAK ZŘkʑ6;ȴi\Idϴ҅w}v<1r]qN2֥KttHyȗ/ťϬ)U.ރ]c.<>)ώVs^wy\.( .UΛʳןt[[-ն$NXfGH,3D[Fb@p!@(QFbDLĈa񏸆>"%J8&*qhgbHZJ,e?!"I/g*<˭rTJh&,,/sZ7٪"jiB3ٺ+S6ܼ/1{˽#R0`{ʞˊ 13GT4-s4$б“کm&52(-:GלP(Dk֮H(ʂbiǬlXl7KtٵR4z /VBBQ IbD7P6#$&IЈ!h8dI ږj)q^̐"jv@̋6^[$.뙇 hI`(+N)J:uLe4R NӔ'K NƢ&vLhu~0>mIj֙Yv9vbS,-jD--e6ܬs:Zo/جo0*$RifҖ'p*Jh-17Ek̻Jc=)֜,[ PuZ b\o6@"}'@be 3\z:.# ~%sdPBF0b j8j1°0^#z$ axŖ?F~0F2짯̦jŹR6qk˖<4tmh&QskBJd5Ņ)vj}E4Gu[^v\3,>92E0G"h5m"b."*|Gc-ʪ%chs'yp1N>u; $:$e<-Rjz 3mIˡ9*r!FJE]` y1"]ٗ5hh`B!La7.÷IFXDضDC,8E ]a>GbPC48@>g}#39f>3%3ŷ4a%hN|$VFm4K" ԙRΥPZ[*yP'm-+e ָNɰirj(u>1?GL!3E!q7an4& 8UtR uJ:ں}ФSa.keY>}z$T,z8ǩqhR֐APM*! AP.bW $^r2/MH/hXqpZF2Se+KdM I[2 EÁ\ &v">`M|(D.65)K]o;:(-bNJQT88jItReB)Bkw21E1UiҌѢJ1lQļsgLá}3+ euIin2F47эf6,6e](L(U % U]`rVjaM&Q6OC|U2@Q}2^1pJ_ǭʪ I&h/0XF=Ґy6D1l/ Q$x .e=z Oqs皍T4+>JCJ)&4wU ~2|T*+mYFCi7:ZUx#e pSE㸬وs+5iQ@Sc<xizc9u2ܭ&).ȭ0*qGu[|d+[0Zڭ1CO(qYɽ@^JC&;X QBXSCV#34^tem`4V8L Ei [,p x>_ǣ՘Ӂ2Piۉ,7 K\Nh 9[2pmT2rRwl-S8ywj{*;^%7cCz!p?"vͪƩ~)`Ӱw?VcIJw oDt.bPR$ R 7U]?}\H u]b+(s9_QP:T,7QDٻhE=Z je[Lv(I63[ی9YUF3˰<@ 4I ^ O76݈zh7-91XY5{ [\ r('72BX̀*aA;'$|Ɽ "Z;aԡCr?jØ$`1H³"Q0:M5 +ښv!A9J,~L8,5̗L4 >![*k*A3}x3kZ0eXpOHxڇaĺzX1<<^\4s5b[<*9@ș yC!R "1.nܡ8݀5;p"d<=b<)ak#= * ("Z=*<877j+Y9FtkёF_Èi@ >"dG+!ix9zy-k}M 떄Xi9Є$-3<0ш`d0XF1)ɹ@F:#%>QQ Y-u Ol )Єِّ%ْ5ٓEYNA6TBȼ(>zW[hǔHDR95B[YQ)r[ѩ<=L Z5~,8RBBgλ')SQe8 Z MTJ3ՋkFMߓD20>(K2!4-痰sy0'1Ƣ!Q*%"#Ⱦ;6íjZc" %>p&@5#Bbf Ƶ3;~UਉR!1-5,jCKYnB'ʫ0r|NN #Y5&:\UTEi+ B)b%^,}ِD5P8N{%36%ͬ"*Vrݶo4z פ.f jcU!pȣ=-١JHyE/&7;hi cnAF맾ȣulJj5n;|-%!UQg^ 7*#%5v)(0s1"ճ؁ %%>=fK!5.K!Ji_0Ki\0߸ԿLȤz>GetәmS͕ $$/Le&D䮯1-.y)DZ`So䎌b!<(X>.3q ekKp).=ɰh:v59IC5pXj?j8 o͂O pcL5. ߴixɐ*U{ngc'Y`E 'RsmmU뮴"`Pׁ6HC}+fiOL) dn;(ݵu.TMklDNHu7 ̪n:NjMY#D6J 2e18&Дͤe-SpIp>1EW>bAӇdŏE+ZZΌ}SpGz= 9GW*MjsJ`_s1N^ZP SX&BR8LCĠ2d(jI8D2d 1dQK^O QR]=h8ԇ|x$G$I.dO:Q&Y$S6 %WvWr%c)^6eaifgpfm~i'|IgUYdʩxB ~hڹhjZ$w'zj$OńB1> AxG)3 1'2rN,$OL TĒbhmEdnihЉ[ʄEzmCڮ ˀй E骋rˮknC됾v2kp+;pk;Sf,roK/ 2 .z<.'',46,.7%?=1<,~,Isl2T:ŅQ\iO>4Z@!Z0Fh2qr^-ѢƓmN&` H—E<䄥G1n2KPA89uLlm9=O59]90B(XKhcD]w>Mw %_ʣ4FdH\D '{"ȐA,_!V4 SG@G#m@؉.) QiY$+֯97ǂ`56rb(μ#\+m( -ܯ?Fw>_Β1 sg*3^kJOy5Sn*_t][(̮J V?al05c& ]J5$"9>p8V]nLGIHB=\y;iWfx1g2L3W2T76czT4v xS۲]]q?jRzo#bhqŎ m3͝0%\!D"F z]wF:=eS.ٴV)eb0W IF7FG eĒ^ϔ^iZb%(=bm ^>^<.E1%v(Jεtye*'LD;ͮDiFmH,wy {RVJ1F^#=kqd]T+X5pt%0> >O+奰vxJ]wd4zˎ_iјz8H#זaڄSY//Ǡ;Ӄ?9'dLS,ypݿf8}d"xRgjB Q*A(5$UTZ2E1x~dEā)>sf9)$[vl@Ā2 /ȭDԑEdD H&%M.L!uϙe!ylɔ,ZVMZ_^W8bP)>hA֏Ĩd_NP"(l"Q4L{x" %. у0$Npm}0@LV ƍ |ύa[N"#Yx`EXTZЄV\UWq ᅍ04`%MXY9SH׳EZحUNM8EO 2لTEeԆ^d0C(d$y >2mV2D<_Z>lA Ȁ)#BFC4̃XV_;$C2fNd> 0_ x 40<0e `~Pb<`҃X@[nY~D!dBC2dzbf,F;LC)cbz>"e0^_0rĀlBKpd%ojnEZ62 #l]Zl1~#HpPJjLw屘eGiJdPY]`LR[S`):Pu֣E(qgLAo純ِ-v:&nJ@˥AƱr@&@F2$CHĈۃHYr,C>Xl'Fn*>DB C("l`f3zb>5` IC`F;di\C*%B>(i[RiDic#l>6B C7aV/A@G%qBbi=cX`b%<@Yj>.H^D•"ٗBzCc/AI I=h'R\ ཎӱE;u@Fm1i#D^%yAUX4a)UЂ25z UŗB)m`͚ ĦAG>>B*̙Ea 2W"H&NLQ >dJ|D>pFDBC$,~)%(Z#hb6 F"dXZ{&ĩff&|5 Ub&jV"K|>d*0n6"`BԦƟ>UD=<΢> Ceb1b_SEgb"T, -'f`4ЃҎ40&>]RjNN([>!nRyaWGJGEj"wcz} RihZ+_pZlZx-σܭ$]ݷr4-C< ȝΈRBHCXQ ƀu$l)SJ(Iծ>q4U- &B((.2fc%(%k2@c%4X4p)Vz 3*7cp" E$< XQ4qUrA(@c4t__X >XA)'pA)p6 ;Fʦ&1 0`@#1r1ZA.pTqY*F`O1bj +CZBp_)'q2եM~~Qky ۱S]pN3?g ,=blAKLeI|L,WYǺN(_I~ JD9YtSI X,GE4H -$E̍G,+1(tPׅHO$CKbnZuzp-#|`o,S$HBP<jGf2N)VAF_>tVP=#dB<E$@J@,BF#o4>#RTʪ؞p%3T4 s%Q@{ cBJB">tg< ؂y-ku.! NGP [yŻ Yrwa)Oݹn([Q^#k49[BqGQ[|nY)1IV6ǀlhXP!DXO  |H>7XdDPuͭ,F;O$i=2%OC kcrh{HE@c4& jJi%*kaA"e\h ѠcD @9|0 ̛lq K.l:cE40_2g#g1] CC.h1&{.1+'>)4;u=$C':_"AoPqU #,*ouR ~>eOR\`[jEWTRnvERq|F*hzrDUY^JaM}ZFtV`#c[\P9r*j6D5E2L2Œn6F ȥUK}H8P_׎or\E^G72cxE5m`"׽ZǿQD0F3c,u`ɝom>cTPuGD@{rWaigH Vjӵ>IF3~̝ķ<[K}A$W|fգc'dq{Խ"[JBaP Tb?捒d @DSV/2e[ ڲz Fzۇc}PǤԤI2e@ ˔IL}?sd}>㹏PeLtBK5>IMJtYΜ;#(EhivXSw.Vw*͙-ƸYv=M,ং&][u*HH*ESh^Af#fUn4D J BjΞZf;`kz2iQJ>=7gyy'R*zxWfϞaʩu3Ͼr}_e^)䛤;{z֯es*'ʪю[;Jkӊ躮‹,+On/4d!) h4qN۩Y1J4ޘd]"&I8.Á9@)J h0rj26>.M40r˄+0/..'@/+ o;ؚ.꺱3s˪NALܲt+Ϝ)Fq-2 + *>"dP A<'NaJ8:A0vc/Tw׾ M^ZԂ\nc-Ej0hJ6IMvҪ[ųaPTu.5{M4DjK/|5Nu*Eǥ`Hux"jsiVuݧic -Þy4hEmˉlV c'QJv$ɤ&ΙFn%Mt$#:T1L!&-%(.|Zv7Cjr0JTLeUΔTljU܊}o#k9BR8LpynSyqi@9.3yRP "enbx'EG^}愛tN(%zMheGMdFABa´yopSx $>hBI.) )@͠^#R)P :i265!+kL5jY_V#uUZӗ5j2ֻVnU+`]J׽_Xuw5,^ Rv ,g'KU`,eJYj"zlhQXl` XPd{-eRΚ֯s]WKYђMmaWFxYMV*vmg׽j gM]qmex ~nxjmkGU2v˫[Ti{5ML)KږFٕF8B1cX2>e C@MI!{*bW*L@k1 ҐGJHi&a[βe0\sČe+YTs 1yp,g49re?IYtUr5zwfh>́VL8kφ3,eAѢti7yQt%MgN3Zѝ#mh]WwJp2ͬ*/[׌vwG?r،u g}H(@cxi!55aEA %f-L1;/٭3~ 'xX/ +)d-ozxœ|!xG+׸In<ym|7/^񋋼y&rO<9qsP9ȃUxOF_Ue'ҍZR=B@5Ed:)*K,?Ke}廇Z~?Q'ka~i?O|YKu_,W>(j|C?`gtoo2Dt&oPoKo1I)CoVOcBdq0b,NWQ%R6R )@"~$H!%Ҡ#Zb|d q6Ba$P:CCPM] 10N4IDj?#2ΐ% Y(.W!Fkg?RDe'TRUce>IUD())E1o`:̉(BBiHbn{T")>FƖ$ ;2 %.kg*C:cI#g痔~|x7`i:teX"g[it/ dQD,BҤ8QD_:3<1\,EK:Sug8Eq(멍l(2){2\f:ID67ٓi)< 3SAyN>i*6jv4&F?ڦ4rO&qP/pb'@O a $idl&p+R 'Rm;nUn.${#5o4:ǟh"Hd8xFTAOAYH s.GҲKt&o)c)JAyFirIQNe?WGf^6hk/3 3SB)pga]m\.b!f5u[g e6v_5&M]!]]\ \VjeeM[5,cOZe5\5kބhUlN`l`unvl\n\\enaY5\!w_]6[rf[6g rm0ib gT Bd&t9vb<bۂG|bNO#/i.Cu'А4)ʜ,xmՊ-nmz xm,z ذz5{-ْM؞MԷԌ-٪ٞҮM~} ټW}}yz"} }}W. XzX~{/m ׂqx| { z~lM}Ay+ھxw ׀-x҈x&xgB"Йx<@b3GO $3$)EID'@2{Af>pgLAqRC)nR*n`XDLhkK˥^+k8 Xdʥ9櫏!"xi G %@9) YKAyVAOquّl F8&kCw˒5Ys9[yowِybj/3ٗ:FU&+Hrt;/x,&  %uC!G}o)nS|2\Hrx/tNIg8Z#Ts=ôC.R8aB39I-T7UuAٰTƃv0t:Kp+ApxXy2L~y+x,'<w(p"OSERx%4g ,סr/DCduNFb"Ɵ+f\쑒 -̧Y2z"K4*룖'Zaw0*N'`vسeU$OGxs!:Ki2MSuR8'Ts]xrisOacmd)_s=1Ox$.^71\即A2;:Wa'kvT! yFmtMH7QINXJ%-2a' i^r"E(rłĞ!"^"NSGb )ZqA#ִUo9d=cgMmRg).s: ss':{]H MWysLA*kT+w+-ѽ@YumJzӞ&"koʞ(uzɦ1}|

    bvŤ3X,3N%jL oTsOgZTTPTB^6eӫ exbP80uQƨ_iV>2==ln?`JB;D~]f7V<Qe0ZVrTͽJ_r-M݋j깨B_zfeSP߾BsQzqxqŎilpc4?V8P Ml0E<4(H5_D$D!i*XS_I!HpL T"@L1@I#=eʈ%4,,=PA܇fɲ&D9OV:g„F`eHChe#ffxu디\MYmOV*D]Zzǒ0).EHt#؜Pn|`>OZUYg&?_/xeÉWJNPH v՗Zxa~iH̹5wuHv;Qx2HcMHߋ6#thpATD1 }1(䌭Y50 ATQvb\$1h$-C2$)c-]4dV Hu*h~i C|%xMttOLU'oEqhu8vD t\jrU6wHBSǘuXzý1Y]eWFl belm%"%AݡH#-jXG% kCVBt!eDe8nHz"ք<)WRRMBm; 1iYf8DgZm1IUW]mW|(y)t~UO2A$1;W0[\FTb2#Y'4H1|ufG]Ąi/ҵ&G*I( iUՕWIz[p13")^'=aU֛}Ds};dpҎ㹻]zC|&鐪{;qgLZ!leap:v+W V"ۄKɛsiy.$ct(*0C46 M-_ ӘGh&$Lq˘chXi#KcY̲48/P"yl E> hp0>vHaA׻J7k&fR@0)b70s BF1 Rqac,hc!tgyQh4B]ft&/="qR+q?!u;+`#Ɇ`3."ny1ɰ1k>%j|bJ'3d{e~wV/({>C Nt]3DNdSC8( HFn7'4,; j2lgt!]2 CqC[Lg$E! =0(h #yQ@xF!rqRڏ %(!Řo62fpEVA7 \tJM)MQ#GOumvji@OnN*a k|ed3(Ih(^*3$)j}g#|`c/eCagLÞcu*+4tѐz1txs,JG?nUiVIe<`Y (HC cAv2 fp84,7<141 4`!fCh#*zHYZ&20(EYF$BW)1IZ}ʥ+*&4, w7H f>ePB֤ѷ%CNC};(2'`^ fj}ZJɼ)kE]4W 'u聰SZus<[iSE\&UuQ#z 8ȥXP}!2Ԩ %b\qGŬvŻS%f /ł,_-<j4b"v|Qv;f." ׂ MJk:X0\-nY}䳜Jgjab+ m2̄yXD$FFnB E4vDR\;r xtqF/-GM3.ۋ6.)8}8qfnJo,#+炝$X9$6iv)Ӻ23]x؛y3H$_nk߬м5&:k_,A2 `Y/L&W֪ Ete>J$1tG$;g>* "6P VOA ]T P|B6eQG31Q#kFR_ Wa6?_ep14R1b7[druv&$6T@1k`P#X>h "wX-CVvGJZͱBH=V)sXK>M0?cb;III!LҒJj v.1> |zVב> cfegZe.FGG $LvC[GU \jOj -%ai$ٵ"b*+!]% =q'(%Ҷ1fF@uu-W,vVe^<1#C(Se/q Z,HY!Z:rr^1e K&.؇I X*3 >.7L:YLPŊ/)$4"}%y++ysɗђ E{*ht[L#%?5ч{*'@iD;PHbZ>_)-DKbh9WViiOmQ&3r y!PCB[jk][T q5|=#s1p1c1@7SX{XK4UU#f 4G[[-UFY"MzAHlWEoU;~>vgթM#=`EC=R"HUoZg>A}ofJZA$N"y-r@e%0e~S".= !ZYqHhrw>#>Gt]\$&"(]Ap]B NsS%N<6/[/sz-dcZ%}fX5uu@%V#Z~:26:*?9-귆Gb%""Xם{U7Y/4V;ZzL֙s&M'"sb" 2Kv=1o~QrPA~dy c-9qI O?U)w9F2y#ҳqbA YvopTsb֘ fPf\j! dnuBcT"Vi:<Dg/K`^KVjIH~Z[pX+ɉIr"'r(>؏D5W [(A7N&I#$b4MC#4D!@lCYYq+nC\Z#ND!M⍴o^#Zanj~t,I܏-/䗨GΑ\V.!4\Hq'c4T.JbsB!^7ARoE,)OX2|_Ak3ۥ8vB 7#7򪖼~"`Q(=JRt ³؈t[G:woܨ5+|Ydg L@:ŲRB1]UFc |UK$s:ّV&F7-uVi=D_^hȿs[#s~MHI0h/e!ᏳƤ= rÑ $M9o &B-&f}ՋFl>bF/Z=}𢾏!1.㈑ŌdrF=ia͏$-Pɗ 1rfϋd:bB} p(B6_de1gܹE"KA{%CSU *F:srm0ZaFkk[$I6([IԥK>)!Ƈ;Sn] xqԯSK~__#wO~=v[@ 8{ m'O~c`wnQi,}dB?l@84CB&. KIq/(?&*KI9/)ղ>ՑUpRUEVŠ=2qNbAfj֋r*BM]ʨIeU:iB# *aJ2NqXʓ(;SjvgZe%3ᐆ!8(6!}Ȑ sU"@raBZ&1Ťĝ,,jQFsֲL)jb[P1uՓ%IKͅu1o޴E (0bo8:FN# v%dH\Z\srvA״1熨!?N)Zn z"lVCn,T&eVٓUDI*,d['܅w4iG^,WW(2a% 1j6[@߀JV.=,56m/叢ɰL3˪VE`щȗu5f:Q-HH@@- lM&L{MYxg**wPvl4 +Q lYz3vj0rW뭨Pe^q Zzze1 Yzp i+2AGT.a6)9'ѷd@CAI8xؠv;!1B-@0*#L9;)ӜIibQL`,bh`<=M7=rC[y`0]1;b`P ȓJK84@*i>CT*//9sYG3S1DC(EhH# M ml>T ;?<)+:h4< K07E2(%B1AtEbb?$Ò* j \|?#ľSÍ9P B;ӇI&<$dЄa1`Ph.0D(ЄyC}XI8Pv0N8Јvteȇ-T-0zB1D(}EPv9Ԣ<'ѧ.LHe +)Z9e>}zi>:ɞhr1hPP ] P:ۄJ@(%fuֿ%]u-؂wէ =\ }ޣD  00s%)7Bst̚Xit|J^KKÎfbDi;Jk)2L;9KO$';B k7y:Ϩ&.R8V<`K MD;3ϜˌxlTqP9݌1 bEdƈ-HpN8yOtN$ N:NdP[.0+8H[BLES1 яq[sD"OT]Mct@Qѯk9TׁM^0 ߽cxyJWP±\5w VuˉAlhZF=5=+;".`NY@KƲ۱FͲ d37ڛI҈I(N=[D2݇n*Fzb)Oyp}YE#H^@5 =\ p vbm'M I -Bl-U]k)EЙFU\ 9>ʈPgMЖrMU4ĀQ#VUv|ނ:!$ hT0?bA."F2Vߚ K35ȶ8@ jⲗq,S*ݮ75dr$ݓ*mK@3q; N:JDy12R8$Q! MhݢIeH2U#[Wb0ƙvNTvxUO)Od[%^%ÝCmFpU‹PDK 9CPOgK ѿ1lէDGyuD;ũp2nxuϼ76l>UC3я `2FLBy f`2Z#W/rFYKl\ 0å]()W" dc6Ψ0C%riҾL"*zP0LmهvVK .( 4b(KH~)Uxʉ@&ޫ\x|g,!^ Wru6$K^!`]j -+!ҽWd3CLܿo*Aw#*;0M'˓zqJ:96|4|?2*`radFuLnf#IHy sMP|&.!G9٬ʹ (l: zhXP32(T5P^4> 5WDh>xQz ԷlEKZL%,r%Ed9JyܸO>DdСF=Rj$Q )`ՔW8,( SPFEWRyRNaHI5'h½Q EMwit F[saUaZ:mSDMTYv݌BL,6yXSN&hewvFƁud4%fnj"V/~chquې[YQ杊@1cZH$Fyydj6Uk'vۆȑLpAV9VXih]<.)A )^21QIiieR MRw-Z4 313$F=l `@}Ġ!=L&ߦ>SEVPיlW$V=OICBwL…(A}٣~FDޤjy`* QEobΉEsUMBV%Kة9ɐo!go>[UܩВ⏥9"XhsS1I-3e ꊱIQ 8`6m<3SX`jKov}kB8UGBd2 řɱ(A> jF&28$4 0b$hDilH7C>Pil#fuJieWT̢SMa?۩ 9bf$!Ml<M(DS J5! qA1 drՈB.\(0qs˘6f.]\EDiU22M 9pr.MBs 4LB[ .M,#n:N783h E'kbˌzBsudm굽f a AX5 ɯLD`>¨fuդ4A7{P,R g~N =9 1ow tPd#cod+,:ɓuH>.@Jp;'>`%QSXrb W$!29VCIW yeѼࠤ; y*ȹH;yh Ӫ~CH@3T4a.70&`'*`&Z}AR)TJ "FT6៨4T.5i(R M($ͩLr@;iPMJS.遢S%7)KEE%*@ORNLդ*ETRՕtXԞV7kYTBt%%)WX4- ؞Fe3d UZ@Wq TYBu>]ljKU6pjV_Wfv@u8iQS6Qe)KEJ\VTrJ*_ KTbP$.7up+ЄHLG61'ϊPE` Z /Cb4W&R})/N#,H',GtV9<: =s N7x2V1@X(qsb8 6ed*rLb#p5 0`3d)YH2kjnKyaqS9yfs;Lsb?;9a?5 Ӣ5#`yփ= 9]tC:.0p: #1 M$c"61 louKr.5ѭf[PBd v;nq@7nv޶4vo.wnw˭m﮷N6p|;6wƍmqx{Û w»r#7C8M~pg8Qv_ЏxӜO_wup=>x&`8ָX'}ElK] ui&*L.!Iq;E }(R`xīg[K2yW$ QRra@rt"=<&3\dS8(bS$6"j"v+F yQ\ĕpH 蠕L>9>LYѵxB@K(TacLy`cwYVfZ(TpU&>f^ hmV\AOUWc-a͔pjUQAUdxIB^@jMQm(c#IbvcLUmcETSI-s5dC`]Mlm\HF*O5Utn}OU)we e$?UU?Vm`a[uWThaVneRfUNQ]UW#UYS&Op%_ɤhSl.*p-ۢ*Hx#~G\ H&j2ڨftTt'2OL jz'4.ҫ`.X!Ќ3%=EZӝZIKC\@- &0<20g @ϽNNcibǞEj!S2Kh 8Ri/@"npa-ʦZ"=:) nO(Nu m&Qnj2*+ kg'9 (Ġ"ҧJ8 JmRE Dܐ*Ζ\.XG[f 0#EdomS̼1iVˢt3`$xw~{j z$m4{W7j;.džD3W0a9#t x{ H<*&e*G$9ňml̗$*Q $wDl +cV0K'9#:VsFy8Zxꢾ*` n ).IڼP/:.+iWzuZ0꼅pn|ySи[ʗo̘tm8 "{5G+ cEvf34"M5?EIHX-h|1"x&I~jTk &;nn~pGr}K#R5O0lA  <2̃ DGۉ5[DCX[ncĢ8FoK2LՃa}# }E^y2NY…@Fۧh#| 1hH(ZH,ڱFrԣ}L $U6ԉLd̨]C3(QcG/jmЛn8X[z%kGA\<mS-o}*q`renVlu_޼kdyKKWo殬F]jѢwW=۴4т]=mfY}kxc WpW>Q&cR MiLҨ @d4FPdcJ-FZ)}c"ZskÍ[꦳*6٘ 8#$Y"xɡ%ưz"| c]p O!M)9B"LD '(?j+ 5͜ 'nɤ< m0Rȹbϥ Bhʍ2Cc/@MucB`5@*LDB&2QתC~ QѶ*[-01ZNyQ4k =4B6QY1m-N ԹumO1++-:7nٔU)~mo b1 P^kQgmű̥0΂ZrSjN.˳,9El9‘3MT[r*o"Lp|}12E&5.Ĉf /I P@%9`*M %bK g2.l#( h,BfH# C9:{#͗–?5R덳40SaB_rCBʓpbRuȿyGK( 9 M%pn}p}:Psai =Lh"b>@ 9+_D%1E^4h0"034zP&*bH.u±b. L@Q"d ҊRv_x@;l>яR1p B $T1$$k&$E?{)cʰVa/3^M1BU~vc-2Vch2ϲfUE1:ײSek\jWv[u XCĖ,[-z5Wcjֲ"vz niVc YesfGɂj]gkVoV=lpnub mVֲ,X ڴ6%_7ػ&wjqi[ٱ7.Yqڵu-_Nֶp2.Kֺf-ķ/?yCA;h@A4 $'KB:w@aNbANad{ '8}F ԁEz#-e/@] qPfcx/Ya(bYe1<B4@hmO⓰)]t=-N"ᡳ\QMtMU$,)t VlBF,4Q4'eR9od \@'`NI^DҠ `s9S)ma5®$};yD@Rٙn̶ibDRڗrcd۰G0 ^q"n%H.q@:L+ WcmR…FGL$dBM=[R—"gϰ)TACG1څ#A+"eȤ@ҋh|p K<q@Ndt#A;"*TY'G)L2;uIYCz\Vg'`:G:_ݽP)A.BrVw; 9jgM'y>g1f(ґM1Ng- y*H g{OV.+#>SN0Dd/-7:!Bخ@,.Wިq2Szb2307?<{H)/e=Q0Y{Vִ8oK%IT*9EEs5LŖb%2%$&T*-O!rPSĚm77kL (439>Vt=κsd-X2y^B>c~@?&*&AD#6 'c0i8P%Fd '],V'. {2*b|sЪDҐ9}mnL/2:ȘPu. 𐕆tLHR gNRɓK@Ú -:R?38LwPcڶbdnP@sp-h{ 0Bi8-ei"Te\(?F*DC%AjA8)qbD|-B6XvI V2Wt#-[{l5qV[]{Ps2:q p /xG' (S; G|jsZ`+ UӉيLQ$ j#r!6 Ǎ"km㰳v<7=YnE)6'4k%U%y}dLPIG<1{7݈PXRv'[\97V첓{ƕ~/xmŇZsuYzYںXul X`U2^ Strӗlr7 e#9‡#^5*g%oZՖp+\:!iU2 ?vik^t ANw/cyov`YϊA Ub)N;FRH,7<'ɒ/DS+6?';P#c{KtS.z y%&] p:f;e+y_tQ6X~Wt˴N MRFKR7TTX;gy7R$;m"PhxB]& '$ ɪ*A7A36Y ;ny I y" 3Wu?uISWOtiiTfIX?'wOgkYRX&] 0%M]QA2*neggsMsHZO)pZg]w1tfxti`q:y_hpe3eG?vd_%P\ vXI>0># @!Waz3_c\g\'o m'Aqy|ƅ_g|bȋǍȉ=^9A~Eݳ=0̽?~AޣQ^"xʉAa d^fȬ6ҷ7b ?'}~_^C!Ӈ*f|̞)|  ޾6)=".^qvliB=^ ? "[^#Lq,?(F,묦˹G??_֑۩2T>7?>w~7%f#_5Ϩb?}?ͪ_͞a~iL%?!Eq [i߾z *3H/}"j bhJfzД)#62$4l>El߲o!FgO1 p_ѣ M 4F:꾙5+ט3mXcˊ=-}Y+.V5:=X`SVJҿ2jVZj#uVB=d&T^fjlm1xᧈV2o߽67d"͍8*蠓/Ǟ=yc} D}ۨYga mUdiTZi, kX@iU|"NX$WgXVsjzI'W|x)*]T6WJXcQgrJYV^ LZg]ږm٤Uj뙤ZZbA*֐H40FjpHI&`T(փvTOA'$㕧XSr{ÊJgpS{m;V05Q]kA5zZ~xta]tBhN|g4eV0?liKmEYO^gsj찪(A'Z\-7jqg4YAԖ{-&±faoԣL#)I1 ((L>DU}H"14iZeίML :u. `v) `^UFW(Xm5t軑my$Y-vTr2\sp&p??mgԡ Zi;3^L#X2X)&QK4G`pl# IJ4HHXa$$5P!mlYb&9_qIo|L۲4ynGjhqP]P"h};MAg@JQB'6e!ۇ~lE^Blee!&LgsO"^̻_WƤiSSHU2}fyjI2^Ub-pIt ۪d 8 YH zGib'Y8%ELMT ”j_ThMjJ$)Ӡkz$d&2 NLN>դGcYP&{`^ d)LJZ$&|^0sK H.I)LC(F[jCJJ^*"EةGɺ5'd_AI*>,n^q,Cƙ0+!HAMDVFIl[ I e@sZS5EGL\1R2&&&Z!-aQD'59I4]̮H RRILdVdk\wRt榔w(9Oz/TnuR#ņ;蘏v 0/q;kٺв6Y%˪)5 -%,5PC ل& | =F e j,! ;f.=0vn2%gK Up$ !2jI{ vh{ݕE]K3`^'U@NL0ewx2V-,,y)G4hcJgƼҊ@ )-l)ieM\}o-}1+J J[%,s8CMiTPrh~ La|F~$eP$u;K2ZNȩ8!ח%C۠N.4bJ6e^\#YDx5]uK'Q4`Cz䫉 E=&J ?L3{{':籅@G2p2p #52%n;]x`W5 )1'kM)юKi:"M4%$]VIJ[G-hT>RH: 4S-r-MT5Ҫ5 BU>g6KמԵhcŜt%!^򭥜Z*{G}k'>{qg*T4+ =bu,Ʀ9YTuk8d9<`_EX8'OGN&D[E\guX ]1k xN0x19$|R `7 3tkqS;rfإt11;^$\ (7yp aa[FQЀrJXDIC]7 uhpjUA"j KWUso (j DZ6At5Q_U, ^%Ta} !tP7+Pv b2@@%r4L ] s)b% Q8]o5p7{-'r8C_mH ,a)=7lZi0uSa0-R&w1 Ln@ d6x:reC; , 7 b0hcuA"{B!psVnpv~w \ YGceRe8hv1yKFg]&tgX_$ xǦ-_]Hs$q1u@hx U93Mt_5%hpjzة4iP!ASJ AA1@U#R".Ĥ"w86h$vu= ESnKqW ,zWjPAe F'n"Y X*O(6q҈B1/z&"i]eo^uYFg3Җ%#Sp`O-$gE4EZâbF:m1u>H wTX F'JI IQ=tK29Vp Q qyf'_Pj\pyoE51u0 @:pv*vRS0wNBBv/ hZtAe7xKWU{`hp2qͲ. a6mEoFZ{@;(mk+bqh90Gfa+[I8u uOeAÍ*5l-ᡳHu֡]27ՂTd6҄~ub_+[Shem1 gy3NJY>.2fFEaS`W34LiwAC۾bI;Um%%sbfu֡7oU椯PX!.Mh8cR PiL* Mlb2e`_(b4EAre"5x2߸WC>ĺUߢ(|]`]&Mh u>^sZ fEEjw < 3P -y n4l"lÊ4:1Jj2:' ĐL*9 C&`,Fl*2)-+N9<OTɫ(0ԨO-j2 kJGo&.L LiBr "1h4@L$PL17M9@d$MpMemL by>F%#)Fp'w.اN +%u$;U ,C]U,&'kF.apLq/k ˴)< ='d4}"3y,IोDqIp?4qbU`?)z'/?"$|g\pcƼ@tG]I}+PD?)/e&-&H2fTe,Ju~ͧ$U IQJ8kPcD24 1ĀX2Z'dB侗#e1pB!xuD`܅,pZ\5)Yݧ!2>Q.MOɖe.IlF5L P" N )DAU4kuT.3ylthy\?iv]BL\6\swp$@HHY F $]hfҷ aP`2X"e4Aj44'Tk$$q*f8uL,iŘv#V$<O,=#$rLeڲ1J∙(i9Hbш/yWPG\1{v?dIP`Y$f5`iDJ~I_UZ/,.mn$6O?{Fu!IAza$u tIJ)( :ΚO"mzRPǦ<Jr`yJzGPA)P0 LaM(֣3T ďCAHZAo`eAh@*\$YtvVz9@U2ŝ/92$xBu]j.o« UBu^@ȴ}:ЗB7C{IĤEDFN=]uBz@wL%R0)H=n_CԦ~4SJ:hOt~.`E fǬ=].zadjS7(Nr9:-iUc&AIX?5Y/gR5nAh`ҵEq]rH%Ԃ24\gL54ы64!H'56tpvzt=ME6)SR\ϕv;nWd8KL׿ m33g;}g[VZt5F"=RX>I1OAg%&6"uXVѳ7Xq+O{|ɷX/3u*1ۨ\,5`.[ >%Պ^) 1I`J!ay(l_)C8J2L.4[XKuoM", o<1ls7AJk0%$lDSxB?G+Lθ\ K+y~F˝*Qnf& @h l0X& &,v'o0IX'z%88]&=nn3.wҡڱs5[uΝ ;_ק ]5(ՀƦЀ_}B8]B$cb:XO}6pS7"ۭx5=q*˭ 3W+81B!xQ- ь K B߈" !M8 MpB}Mجهb8 /<Rjv!b(E" K\ I2;a. %3١A(qɑhq' 6es$ B3@@{Fӎ+36Biy33P6pÂ*"PBĄ*ɵ 8gK<8i21)*Țs KPNy7 I H <7(Y3ѶZB;t3V" 3  ly A[㻛YўB2&4G.K4J4nH&IH\4HHC3JHJ3I,ɕ4IH|BȌɗɓȊɜtBŏJIɒID?DZALzQ1ϩzBmA#SLH\bʺ ڵIa_?:@ܧA*I:2SJjaD  6j'VҎsE8:I1ja)8#R;x:!:McjZe.lMZ؜ ٴ.$%pMLzzH˞3DTdNlNʠN@KO".A((EHF.fxPaqT92ܵ"lPo , 5hY++9czDtBmj t6ykSHE=< 8#YCeH]*VZHj5Z&/֣5VΙ?XZRh]|?x97$R%A6E=ш0!C3!ڇ8 2;*.,yXmQ;ܒX.Ɋ22ރcW\§l _䃚D-E2`!=r=Rięa+Nyʢ[\5ܹay""N\euec-ìVe,^1yԨY K둕ܫ@'Er!B1,ݕO1Lo*Cҳ z6Y6»=eJQ:ܗdGψ4Aչ1\\. Aկ@(`ٱ"},&;탙/fm aa\eY1h,η.i%EBU;Rr$@2ބ9śE1;..̼y{<5%4pX,y2맮b&p= * qQ˜u:;AM֛ Uzm#Y$R$7{ŹED+/;zsN>A ]%-^d)i)O$Z5];5y<2 A8Q&r9!h`۲Ʌ LUG#3dfC}ݔD 4_}uj;ۊj)fkͤY1\Z(Lf??}z ũ`))އyP5W.1%w_xI}XhX|}d{C]2pYK9YSrGE]L 3aDm0nESL}-[tH*8*5dsP3h8ȇO$/{8rzXL8aht5s5vg?LU3F0(K꫷0@ bFfܗdCAF㾍0%CdmSj',O.*.Fd[ctg.3ۗ&TZFД2ht#G[.|ˡuK(8&̸4T&EAHA4ci}iא= Jt C!la2T^p IE>`eQi6IBgaVXѳHOh4UőU,ID! aDLLxqH "6)MVA"4[se9Wvi9>ki,K =C s64K#Vx/vGK F2i&8LR|Hd2$hyD[CaId왿QGԭQEbm0D[g3&Đ5ɛ_9$_TaB.s% URMK$c),XT\lT=ʰ )eNu%ަR E(P G裼FI CS-7RWq e7RLа2貒/ 2$h%{ Vd"V;1C,=8x&㘘[ĸ8MDC kI8r E%i@ˉWB8""!XIƧ?\Qx9D JK,qdC12h@iJ @QEY-Rb=@ 4,B #u[qW:@@-h #˰2bfjbC/TLUFoM_N%ӝe+g疞JIFcd[FC%Ж8sш`ѕ8~'8O=hh!tyG[y 񛢃СC;ڝ4=i峨5G#)N01VܴO{g8ǁr-}jQsqDT9CyaU4i4tLj_1K9Pщ$wp,ݷތZj6LZDOUMƵ* n Sx"哬qAmx5F J BXQ-ICٽ\yM`K\ڨsR`!]RɆpaRЗAʮ\ ^lM_ԕH zyzu A4U]-Սl]ltu|an9ϥFbx4%pIAJlC@yNB~|K |Vy=S,K Wф$ 8IP^RtcC- W!k\ Pg؆ڣވL9_$ دm#q\A,ֹE ^@M |$x AD^C!c32ҒZ}K햊J 8 @HUomc!RRDJE d/`nCԋ+~!bm܇\F2R^LuGV :R:cZLg+>#lTܥ=8J]]ZZ!RCwvDBοB18\vB(aRCQRܔLbdTܦ i'"5U>s8Do[BfZ> ݱ, c<@acdTQFQўC(ɀ,[zb'l\Pvԣ\jI4%<^2V=g:sܦ}ǥ] )bVҌyl> T{9uaH`O dLp 3'X]ibʈߘd)ē!mW8̨Lș ͯ`.fJ]}"GL A b0bZrW9)NU!Zm|Z @i!lS2ۊ݂f \TKQqc[Xl, z\$YL~d&hD^$ݟZh%FŻlH8z@Gl$\m!yMcCcubheXHDU…1&ia,mXǷ*XkkZkxi'y!}Gk+k+,-Yܫ=,FN,V>l\J2CLl~",ȖRjN1G,Q2D-)l`lfK=8&@Hٌ(HBHf֍O }0I4Ve`^%dW&+$BMsxrցO$Qladtφ_kF`k6nk:.++s(杂I殆_v"HLf8! p5]3Ec4*d nΤuhTb (|j _m" l֪2n{ {!]lIJ7~w{S|w|ObPz7|78FQ8 w|xWr YV6(ߊlԂúDz|=hw.:*,$1 Tڠ mNnύgmPN~ba4avUϔ?! |W 2h 뼮zʫ9zkzczi`h[40 zdg$=2Vy_0:9 uTO75 Df1^vX | PQ4^úbRJK"Or9$9AӉ2A:9DOKHb]͵Trnf5F90IT1H+YqCcmffAcX ڢPB;&|?N('2oFB& qDyj]yfQN\Y?c0|7Lpvw,3 WDŔMydo@܋Dg{>:h)Wć+Ȑ"LۧoYCbҤ ξ4oSL2&eQ`7T!GI8!ªsKhPaĥ&-4+1kX}VJlW 2,VlIaV0c֎$I2\#Ĭ~͆X`C Vhq"ڿ+oҫ nme=8vڹ ċN2RđjQ4bG>zuױS;0?~ߤ+#1ij@ћ) ^Cǵ6_%d$RgVn;yZ=0hZkEhA-lI2-1'Ęw#V&p)MwF,Q\1P(MZu3l,PBJX8HP1/ 4=a~30L2s@4-03Z25]M k.Sa\"uM?ϾxsSC.:3[b}ޚjNloQ{ӧ7p9- 3TGT8K%,58c(P21 eJW؇t5t˥~&Ul?fA!yNRHCP:B >)ڣ8# S^ ֻ613`̒`8'ITAmۇ0}@7!\"MB jqMo`ǹ|[ͧҔ%)MU,=8EzylAwm-GYC2,w3r;:ٮ" */^|ko| !lp$2$"ͪj 4wS7#jtldSz#P6­KZi4O v8Ȗ013,ΓQ6" 1!,8̣,>/$Fv2heu49 Q <@Ov.|;V1⋾l-m,т]weqrUdzO:tT—6+Wi奏` Pkny?1(h.͕u! Ig8[3e{>{VGyU[oy#fd3R gdB2,Edb`D( }aoe .A-9Eθ|aD!n C'n. 0KBd` ~}zl@b.;gGÅ3<|\pÎ(_ٮxƐdA ^քĺOD*a[3?AṷzQ0=oQFMTF1@Ēȃ4Bd%¿Tٿ1MKcs`X "VhZϷ]am% /:6ifɇ!@1@)XHE-q[Žf #H-W/k0s r`F,o:b}HPg6.铆2(?clь<ʺޑ>*+7L^NL>Rc;b 4DHW/]F[Bd&"Jq( F(.Y"5w 4& 1!bT%"‘@ρz0l0FcO)76M``A!('5Έ T()0,@|>" d 4fKmHia*H C>-+Dp #,cLxATh.ZnHV..w n|DxcBZJmtoJ CE.tBΧXY._p1,o%G C:bF 3y5M!*kxR$`17S8SI|Q'@qD (< iN7lHcNKKt$q3C]8mi?ue&ԉknDb. lɨ^x2C mJd .K,곓+u*/e2a'm4Hdhj%pX֡R2Lxq6#/C^p+u awć&c]"#4&AZt!< 8diJ-|# +"kBmx "TELl6vLO3-l-"fqr-vo'az%MpPip(2\. qj7u #Ifyؐ65hU)/XvȣXK+M(JWfd #gJs⦡3h-<5~cC_NN7j\3~fFDIb˗1")Ffn4ҵ֠cأ~]VM+/Gcc^eZ Sޥ](d-%` = G[ʼBcAQ>}!JV2,LTǝİdS8lp !^]TW4O*UhH-Y9e>&.nFN"&!B\.X6~f%GR}ŵ|]m0~<4+Lsb##!I$~mX8R+N1*o *8dPoD%4%B)V]c*Ɇm|r`/^aL-mL86StZxDx$r2ioe KHMf"prӁTX؁vQkDEգ0Ր*`x]>7^ܴ%bHuT.!Y"N*v+= &4=l+@dV{-S`UGjVvǰ7a ,+)C?Nimh>r &SP{/JnR-|RrHay[n057F+FZzM֜'֬ԜyG߲\tYrZ5y%ϵ< '% 9c Um(&(3 c+ ĝ)O[t 2\`(0{kF>iDknOJf IJHy Rv"KM+ X]b{c_-][ _xsȞfOxRGj{Y%&0WcNa)E(y.4 ڭ2)-H29c"(,)1){yIOgޤ; an5&Wg0tnSEk8_M,(-$F{x%WgYYH](BGuDY%ֳQ?UY]ٺ}Rmq_[n_sy}?ws*w{?q?Q4 Ƕ$H\Gk\^4{{)$_%.֔e\Dޓ۳?%Ə%aT`Bپe֋޾)F/>z v"Ɖ Fz4 ҠEEsIpK-1ZF33gI"N0 zXҢGP16T§&\Ht4dLzCvRLdٚ%FjMs7-Z|}[nYi"R*Ō;~ 9ɔ#[ c͜;{v 1ҘK>-QW FI 3U(G%rY7ǂ`thkbhRCVeʔS6,S11i jӾ[96JaT?ȣUOThaEWRmJY$kAPM9%E)܃4O/XLapL-6C R0K5E2^ŔHIB Vc K)#E 9b>yS ]%H^v bIf٥|_AtS^-ЗY%Hs)gurIg}niB{z':%Mn9aHt+e"R (n-ꦒF aT=4&8d(M"2t 1L"B @PWM%~1GnFVDOvۦYؑno vS"- 5HRWF$qZxqzSUǼM0]J2LD5/æS5Gss3=l>]4B}rjiP)%P\%yTv'bhEˁo\̴S%1iLk`3 M(5ŬP(c7gfyGE1f,g8,b,Ü:YsjF J>OwV3& n"T$h6Pӝv9`8 5(:l":YnDia;2Nw*ŦiSZrlVր Aw9\*W˰iճ WiD⇔X`1۞ِiT@TǍ2:q#5 4'!8$4 fAMA-BJPBWIa4؂&svtS;I!Z=Ilj*$AH"BM5}L":/Pe.0U4$"{`VJtҭriEE \Yuy̑uCVςFaa@ (`^Y]{:^a' 2w2ܕu޻ ,8$40< ^%$lSI쾃${ɄM%/T $RE@6P+ƻ&Gg0S R$U%?7hcp4(MUdc=jz{%*|%fr0RI;'Q3yV,N>G@i2tX^0hV0@c xα$G:KV.+A׍gF`J{?N)t(P~Hym:` ,jT~. gU2ؔ>!SNU-,=Ą$F@1 e*Dyeu٬;y +@;ZtzL&M^^ѕI`|*V`PUg) *ga^U4ֺ{/EѬY"{>neJչbr5A0Y+Ls[!bwAĞe=du24Bvq2}A`r5ۻ,vQ\:~.z7f?gΆLOca@&\'ocT _h,QNCg*#eD>(f?R`đY"b> 1XfTۓ%6"MAgT{.q&+?$jdNi`fC Wwɇ`$ LVObeERgʥ G?\i\f Avp]I\K`ӄgOurzABh&?UjaxVUA;ʐ # sP;CX> >"=)?UowZ\a.Psfag0w?cX/K՘tArhSQm3dq~ntiE8e 3yY@1A1rb09J4Ih@^h+!! PVhbpgAB!u3(ǁ_X Y+1UUWU3 ᡙS[X9zDCi)z+"'cc7/%"D"ײ=8u6CkRk F|ڇ?/ 1U E^1 2 0K Q s#Z=0 w40 @ѐ[0R{ k9pcqUpMOJ3O`\ YĂ[a&k{ewu,f21 ԥEs>G*~Xp*q1}11S_кh 𧮆RE W7r*|Gus7֜I|Pod TģHw2K QJ{s\:"3dJ)yR ; śSAk5۱*+3gDK/-`6ZI!yh3J')V9"ly B(cmnAU g QfNcbdAVDG͕@v*. DTPӾ*nCSSa&oPĢ޾eՋ6l>e%OLI0ыN 铞D}%e: Ҩ1Y wUWW3eWc֌T )4J2LZ4.4Y}hp]И i\6 nj2 MB,UɟQljue:]rՊ'ɔTK'^qC5*ѥOc}(nݻw_fl%LSڞ-K5>8G=$tRf M(pIbE4&d MF2,e%j43|P + 4Ro(:/ ->jI>4kJ Dyi}d*4t'ƚ<4@J03L9 {LPvc6Jl~:1U-btRz9(;eGR$k?M]6{PIzrS,T!$ (hL2M@)xjhjŌ+OoR*5;?kRӦ P[uQHָ-)NQR-OmO= E@R ^kU[,4prux'\3-ADLg%8cz2%t頋kyBӺg[.4:8?Lq * Vu'Ĵta'l>SB / `P.f$Ƅ W47jL[rp}~5AE꾓rx78S,WO `rklUOn1#+NV8݉漨4ѱIbwM>mZf5hvSŨļ1wUѵ^zj#W9|-X-|ļŅK Z9`MXE q#DeHRl/6Rό>zN!WB2L=Ҵ5!(?JsOHg9\%FS$ &wN" 0n>&z@a4L7IQˢ¸3<gWq/(,=*Q8Fn6|ٛ" 5AB0E.$# Q2-#&{akVDnI=#]dAb,]G3qj<ř*KQm^ײ)IV{Ls$=ɇezvE=iui8h0 €B2hy%VuL'c#ͮ ;䧚#SSQS&IGwaCipj$ĦLP@]#XڦTh6V`8;M92nQCRuf(2 ~.˽;ؑNTՒr"/:.CȞ]iܷS]`XTr'_VԞd{]cQ!f'dPvSQŲEEe>)٭~P 2&KvjQDJ0 b@HB]$14Lnx{6, D'V([Ē.<O납4|h`UILdvmbf ǀA5QUn.5lM8[- m9Ń"9SX$$R5ls=+ @; w"(b dv~7SușXbt0h@#0 ԀTVG(zV2q yP§6*XCv#w IXi2{{T݌rCL1y]dJ;`]b=)lԭ2ɺB&5Bc416I6F'"ܬrV_JҬt^ $X`uQp|3&;)җVϊ^woD_)?w @@*pƚ1+=B8#*z1ӕ`FR6* gIMh6c+y#*y%/vli r0j 1np;AY"{z'+1 8 }0oZe2 д䂝⫝̸0# $E/lEtDF!8u+*Q3ڱ@=îMt@!+:4==Tƙ6]Cq!" ) ɧ 0_ ɳ$b H<} :0q˦)3Z8;)DP;{ WT.Z71q#RXءĬ [aĥ591?MiHHc zt].W+×QI<)¬HBlY/I2BI#2"pA0B>eJ޳&3s Y jHX=$4ȤiO9x²ܝ<*x@Dڬ)ڻ+{4#җjˮ5(v@m6tQL 9̐ M< )*R9)׌ƜMؤMJ}̈FTAA!D7k m8S8lΊ[ΌctN[۫ oJ!N0YR %i@1z78QY-HؕXXh4hDe 1MHYck;=Uo]Iћ h(51Єhrق"K fqD2{ 02Y3,K+|*9"SEU6s! Zzo&aP:2t0SE,Bztk@VhZ3t5I*A%8"=TYmܠ}#0RĮ]ˠ$0}čCy(<2,- KfUmQ]}%Ӻ0䙿laVi"A,qrGÊD2Er-eKaiJʈI$M:ɲ#Jjm4($i2P2*NTytJ~y3юIJ1;,s."!<RrW3aQ&MR<t?522P+Ia$axn#x[E㻊(!Ǒ䜮]As/J/S}R>D(aHZNG<}]U(1\ )i`>D[8& B`zlKS2 .5T5ӐPE7u<%+Ô݉DR,aQQ.)W38yQ&Z_A2"GN w4ON~R\[qCaMհ7 #.M#^y ]bћ,蛢XjFbA.)e]%I\.oQUp06H ;jhdf-2.9/docs/hdfview/UsersGuide/images/icon_dataset.gif0000755000175000017500000000015212050301073024205 0ustar sylvestresylvestreGIF89awN!,@/(F JyLuա$N1(~9¸|;jhdf-2.9/docs/hdfview/UsersGuide/images/dataset_text.gif0000755000175000017500000027335712050301073024264 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,'ȴoY4"\lٲ A)4q"1P.jQGb2}I2L(SI0ƼHHi&d#e?I8"hډt4H&MU4cЈI#F+V4_R4ӲS*g(*Tp۷miڱbo V1>PxƐ@#+c.GWɌO#kp1*3Qp&qNRǀ~2j4KiMڵ_ס/k4SIeɵ]QXU;*Y&`Yyz}|}eRg:ireimceIE'*V^C 5M1JxEVk)Zޭ.J^[i zw rQj,g]T[EZZkZX2hsiJYV HrfUu^ephLuViXIl2LEeWDO(İfM 7K/0~NxGĐɕeCtIC?]a&`XG!gH.;%+Ůb$:.RFuȫzýKuTÍuUR{s:[ZIE/L޽q}?kKUn*nXͼefꍂ>%2AJuפT9׼d4LeRSz~2ּc QP>9Y[4p>#wa5kkd }]&1o͌Y  h32e>)*(3mRBC#XeiloR2=*nyc2 inb:P< Β`cF8h%7Bp<⅔B@$?PlD)(u~PB;9 R0_7f 7bH8%QQIpռQii/*O엻NV "K\u|x%Q˜<qyQ\BL,\J,г&cXfJ7/tɤA"0u1\fh=-; C"NB@Yrpڞ:B{>*,)n&jmhhFH -~E֓M4MYBΛ=M*BZKCvu|a#>2Q7d'qfY͒RpnC1ppdgq}̥!l \tDBUD 㖑 sO7Iɠl;LDwp"T`"Opfc*y33VIP僰x*ղaRT-r2N&"Ϯ5b4xYڙ4c) 4ŭbfZJZT.;!Q`0ٰsIe)ԝsrJ]PQ0Q v rg=+O(sT[WQAEhF %z,[J U@bh#jzڸ!K0% WRMs܌/.vH18 R ie[Z*c$$͋J[Ҽ0/<)Yƴ0ʂ(c.`4$tADsVc亓'r 1so@&*]PB<&̳9ޕj[3pfDuƘk|>R_\5:4Zo0V-?]U` [5K@p,:2ǘ3YKcasBl0y ?!5C(;5Jqak]Oױ-:H4ś &z A)r|կ2QY#@]а&ЂF(q]݈a؂4(+=P[ӓNbD\+تZ>!n+EXGpMuHmLd#[5IJ5͋EC褢RmX)32oT&v2,#|P|BBh>̠ WmgF!Sɷ|@aBk9F /H` F5G}H`߷E~ݖ3?+?)1ALHiV'a:(1ZIeDJEc0}xT&3DY>!* 0cOw>E3'g4u>U0O;YDE^a{Q52W<4O @ YzR@!8%k  Y^tI8Pjvb `yj`[ Ao?Шo[in"EP &Py6!B:DXà l #(Ȗ& sMaMɋcNX`a (X]>̉|%nUrM%[׃B`<䔝3oaA[BA-U,qz#@(D̨t'oRt`rlkanQ2EM'D'kK|K!@Beׁ"!O=HuR7N*KL>"*3XE4~(u, HfhRO C j^ j RS^YgRĵ-!b)sa b,P Y"uy8Pr*s9^o >?poYpxǁe؈Й-B jxI ȊP0p ? `p0 ,vT,<M8!yrp2{H)3-C!Wԃ'f=DHN2gu3&p`'V־Ra(5a맮~- 3-Lt5mcA+bBIe}OmiCѼtZB (qQ,22gn 2E(' D'emH/UֻV[-rHSN6WpVet5*UbSD<5^A? BC 2 8DA,Að\R-S])EIRWm_]P|]0% @Р аX&"  &Pt!2à  V?%wM0!:CA+;3J1E9O":Ŝf*)?<})Aa53K?` 3#k'ha*C/,2"WfZg@ )ܓ\Y'{KaKrM&2DEC͌c 31)ςRSda*"|583q~6s~}n*etUA4hf6gPYRi}Lzeٿ Uԋ` ^}W]ƶPƵ@>DS7䭅\C  C0n0YXyGY"{kY~ئ &P&*) Hy<^00 zqlnm&4ًRaUq,T05N.XI? ũg)]a %~nZU,scq象)(&0,ҎMUx6l 1SB hdAa. ,/]U-s MF4mFK7hȂ&fĝ,E-6-TCv%|tT!j)Zk7(\f)j+^@[U=zPD>u\p:A 8GCʺOo [I6ixq8"_i@ J:pX}49̔}>yOs8L" 2)@0-QF 1A%4LEe)RE% &ADfͤIi0MXIMը5%SٵdM\C18`q9_1ʥFkAmR*PE2Ѥ5\y\c+qaEG48ž=/^̉7[<|n[7SjR\rIpjk7cԿ:x}owzwo 4-6IKIX{C ( ܪ %-5 E CdCM올ĶBD%K=5T#Ҙkӳ ~MǶ5zj+4.Iͯ²0,-ƌn0ꖻH4r0Ě8M9O$&=$FPP&@S>e3Pb4ie4RI%mJtRM7tiꭎF%#$D{*OV]u{JDEL@驇jqIMZX{/H  +Ř˒1|-;C 93PL#m4Δ: e]*kL1 [b0[LpSNK7LK1>x5>*a̍7>N%{b@1Zޫ ւ- f7\w]EFj t!M3/֫+1C e#1M4!/\r2A:s?'}e*Xu[b -dc]f=vm}-T}E'XJ*z:rOdBTOִnzVwdLPՕ]$*ʋJjfS~Ț[+\ਃ&0A|5D2ՙH3 6sh`ޢM%f="^2[R31>9Bۂ1DW/ld)`v`[![#l >4G- zCгBFeUSÄtyg@4ьnT7F[WA KVl/+NK`& FDpIMk&!(RҔʀF)A/zcX+a e\-eʨ-YZjT/}JAE%1P-/"ohި=L#w"pR텳O|JM;sWSzXt 3ݥiKP,0jjN)f82-CgBCA +3=V]XH|1ou),$tI2g`ca3@Hpƾ%6cș M+A*G0q.cc3-ȇjx9R- c+['VM1jk[%i^8իzbΐ<|{-ɖa;*d$t1]8R:TYVr7vl1{V-]LK3/Z21R*nr-\p\2$)RllpbZǵ(h4YC$`*dـ0pilՓeQn zlw-dV$pAt[]ӵ~ IcfrsB1xD՝M{YS/,* T6*%uJɈDZDUV>֪n4rc hTE[R 2ڰLXEFmn#j LfM{PHbpÇI95(l+td3$Zm̷4͂t͘JES] f7fO/k X%( Kup#wM1$hq[U+zo*K&uO=y#bS:խDq+=QG;n{x|ҕ:O?%*Du&ץYoijќe]S_o#RXodQ`tg&{ympp_T+j`fD/,čE6pňqVh:?q2K$6(`+2r#;,2s#:qS iqbY>Q *P@ri,0m#*|)k@!!~I҃;`„0NqBH'I-\ Qz#<ka3 zIHܺC򊪘4fcƁ$$ 1!; =z!@ jΘ v IѢ7 J!HRj+/糤$"‹[L,@Z2k:H-*;j H8f)ui [c̑`l 0z57B 9! h@n"i=J|3(ǢA=1$GJ4`$rJ \(A?0-!Bs4B;|47$D3x)D y*ZȠa q@!eWT$p xL P87{Q2gģ/( 2,+r)d *lTJq:::DI’ȃG٬@ӊ (;44XI bAZ؊;cN<A?:̢z$ GPz۶E\ry?ܴҼPD48!yLgǍ1+Af;HEJdgl%-b+j :͡a 8HC|2iICQ,?+E˩ D+-bILkOBp0'a9C-Oa`h%RRVS@iuUzVAD Wq5%r-%tD9_WItAaUEzuWBW}tt5\Y:kUڇ zZXR*X_WtbVXurW._U#abY\URbPÐEsX:TZYA1BmW:Xx&sXY:WtW?!%̈tZV֠٭ٓBD֞5@ٞQ^M_=E^Ս_E__}݈^_`ӑa]%>`6^`׍ïE`U^!^^5ex]xm] m]^=_`ҭQu_5f^ naV ߍޕ^ ^)~(8b؜ʹ)1+I_5vb(b1}c*bߜ\el>?@A&B6CFDVEfFvGHCIJKL?FcMPQ&R6SFTVUfVvQWZ[\]^eF..\=b6cFdVeffdYΦh(dj.eklv_mjeopdpdmfR1gqrvvtOi}6hpvQgx.}.hFgEvlzngRчnfoh g>hxFhzއ`gNdpFffdR皆io>j?ii~芨ꔶujfg6Cj6tk>jmb iySfkkZmxmؤk&ֈvvfinN&YɁqlz+8v^nijP}mnjޥȦ~>~ov%׮nxnfnԶ옾fiݦvoކmmiꌮ&&n.n6편Xo6l o p̎ml&mlhنj{opvipnpǞXmm/n!i"=r'Gn%/mf~$"orimXnfm.g~?# lI}`vl~*Xrwjf,wxcOvsh+fw'funw6gFnK?xkufk'hwtho.n}&gIj__gs,GRInmZKGyfglh'ok^v|tGj7wg'醴n_x/m羗j7ipynq6jjVB8axl.hgsE-sv};؄}Xɗa ؇`8~mZ|ҧsi>߇ȟxs߂ѾEgo]zoOr)'OjnFgrzXOAz FL_:ܧb=hY "G!9FH04 1E'MO8Rς@̨#B4)SI@=HĈ֤3JSO'*<в(. ȫ]K 0iPK,̔Bz JԹݬ2Z/uƼ|s^Y1od6]MqBCؗIme1|F#?mUBwTfnGf_8O|].#c¤CH^믞<7 Glqo%r57 E51J\ɗAuUKraMQQ!EGqH KҙP3Ҩ~ԈC CpEՇ5(}#zH(#R< ؔJ8R#tE#Ae"xdHYkiRYJSeHב>~-ҷP<#AiC %'d8:"!IiZdhrj&G99O| \\mUI0qS!;pqW\@.w>4\$Å)@WY@ҳ*kauFM( #PR>Қ 垢O!II'Rv9 %PjS l6eIO)n*z顠id֙(\StR`Q% tSTZbT ԭDL2$vAE_o$O>˄wl} ^S|#%kuMd}9YobiaPgK3~\F$MROThlaB1QltHP󵎌dk" HT" cJ"tO)mAPRqid=B !Y6LToC =f$!"T# 5I\ fBd{le#|yLB.(x IP%Uq׳Z!ȁu$ c`Ip:,@.ÎT(#M) º8RdI;&21lw4Z8!'4O$:S]EKzxq6˥)>eFDiQד[e3CN%%~ZB8#+e(*1 iX05!r/2[)#JSӚh.52yI$\2Bg@)UX@y(Fr\W7J5zi8M5jtK̠$M&R)rμQ|qe"tE HM Vv`5H(4@ő @˚Re7GmeZ YC +a! xvҷDnzi V怛+4&)JjFMa<,CRS"aDOddѴsTߣlmt%,K$`:(Ѝb1n=($25' ރKd7]-ﲅQa3IH#PqnYX=J]ɂU{eh>9'>&tM`;K@LBHK 1 mQS()d&uǺ4@N'z\7 0-AwI1El0_X.^y i CuYbmx&m9gYF$ڻ93\c֯D2h!3HOv?2řTpGX((> 9/z6̊2)lx Ҷ|LnԆJqs&?d3047Lw+Q!CjFXӛQxؾ$C+wߕ]uV/e_79æ^Y}L^1fx$2!#ÉYk.DЪ6Jkn6KGSKhɧ&jMԤ8o9}"mzf爡)Y|z>in1_ϬXI> jpJ,h7U^wdD]Ȕ;;0;0PI_Թ~,YopW+q!~~FٴNVQ,)1nm=aƐގ=Ll ^89հDS9ĔDla h-"cD/ tւB.T|iwqKG& M[UPւfeB 8b!U&W U$JV Q ˼c`!]\NFFH=BU~HbrҜ!(Bb|'ŘSXVo'h(f [ehQf^O ?-D @4#:@ʹ)z~>_t ̠tb{+Qy"UFE vq")WD8VZpi'B$|D*]I&fPJFDZ!ٌp+~j!xaIsFԦz+6if"RЭޞvr>VѴq~jaT^l-bp/+ Z%D'VI] bhؙ5) )F (BDdxg뉨KIn'i' )R$yI* &ew`g$ QA^6d _Vԓ aϕeByiJA(kbEq"T4'e>+DrkE k%WEg9(1I hD$ZN  `L8%>RHP_i퐭6 +6F`0Ϣ]MLdl jd[aTbq!ćfO ax>TMkn{]hS>ߒ킱*)jd A>D#d:3nJhWJ![=%MfeCO+m r-:,]eeסRn1hDLl5V*5)ҭjFa z,ű(ڟE!i.&zm ™Afk.'q2!#2#Uީfj>6E ;"W"g&&Ož!b_\k,U6nBL/->/rB )'%ed_2~y֠Vk]Qr-/ԣZ>]eN#2\β- l1y++`,.<MԖFdhe)0c0ŝj O{j D]j\*F>$lb]2BioA:C&MӇ'M>xH/N׮ʹF(#ks[XԎo6('Sk9tazB~/כY2 p<ӶG{&pDY! +_p^Y/rJK]" 0r኿.]j3OGY)۶.ԑUA7Tu4"8][*W#C3nTCy&14Ӹj R/e'alsk"(* 4DMW\"I9wA`g4m{3ײ24Xzr44'+/2'%z7$$E Suwu7E9&c D'/M^Q?Ip}mf9>7{2+h|w&v\ڄcbRRwz.Sk_=~27''ij>0 y`,@ЋVO2}!$>e:mA 16\Â1*LP@EXCC&!BVd2jU8i"ɥJ;ROT-bnJͤ4зoҾ}2!Fj0t҃%&sV%B *MuPbh ʍZ*\1'mH}%<{`rnl;vE5zuNqƒ?:MwjtQ+n@J Hsi&2ΰ O-OKi:oHF2Q @pȼLBjD6 JˣH8 {5R"O Q*#k.h 2ICZ*N!iƪHlRAmć-F4Y-%jd@X!/ElTՏtL"?l W &v/RHx–SJԍ/ ˤϰ<ʡ1cBm62ܺ.5k0%ЋE^7M`#l/'G~*F}wqkt,t:YH}1F`?fW.QtOE!9] '*^Oߢ!4VMП"ȷ;TOAzVkﺳ6g F PWȭ. mw=r&,!^ wWYVKU1`Lp+͓smr~4 ߮=XLq{W3AW:\vldOiɻ,ЄqtYgž{S_!EKFZ/գOںd|K=GyY7&33eBPYjoDoc&T3MTq]AYB5 3 08lYs:g.0FLU6]r0,錼!_ǛB.-1a]\eb@Y`hq6LdP1 b\H.lZϋ,/?~4 v T^ǾEʞ7{E_^LYz YjifbF q)EV(o}6"~e'f[b] q`  ?ePЄU34 ɪXjV:NA-*HU)?ɧYŹ=soU Eh O)TdHsй0X1|BKX7[QJ({y)̲l hٟs Kf_eɘTo l)#$kܒ N_oܵEr CT *Vr3jZ͖A=K{`5dK$%{^xw ~2b*0ŠJNP8r o]uBU/aU.e-`0ɄA\:D!p `ƒKb 2b='\~h)skLcbd\"\2Ok&hY}S (%;Q;21mHU3W\%8ZE9ڏ][;a {p"8j '֌u _%[UP{ ( YFGaH9ԲkwXZO[,1yq^̗xʐumX\kίY= VrC{(Oļ)[:s4m.6mFpds ޯ[sduq.RMKNg}E1l*E#׸ HX \A&npZO2y _N&Q CNv3Y߽6ao~LjexyRoO'y*n|5.8P'%Tԇmu K]es]B6\ߧ> qHf83טql;Y;s,'Im&؇/{4n^.W@*,OPJ n>&#n/qo W;>D.G-UN~h8AV@&T@a#Hx`‹<\O%;PMV r=z R"d"O0Q~dPgLKtP&'e݈1X'K""Aq?H*lq'm=91@;$G1)*P!D. r2ΔX=!ŏ.k$$pV`@% xF2+ gCR㘎q+m/&S1'rR(q#?s4q,LBr'yg)r)l~7-OQ(qz:'{oPr,mS; 04S/2)QјSr2=*&c>:\e:m ?K| D}<,t7|8 V33TLU|N@k5ho<4@ s/EE!PVAo)A8S*0Z4{L"+H[ &!n4Ǡ 0#(q*K7g"s5AFޭJ3V1,ŨB) G1e3#*.KaP'tGgT$31L=sQyq\!dKN=!N&PSE2ߓ> -?Y2? Ѡ!O!JSF>iA7 B!""UP2U#.qBY?:3jtWAoLuuFKd&,-> [sL&4-(u/TIٕdUFUr"A=!5eU4GuWc_ڜtLOIsR5eV7])6elMPg4O'Aq5LsQ5\R vJ9a]-V_! ȴb%Wu\uLyVOVc]f9U; N]6dS-hjM"Mukv;k $aɶ\+\ju69nSek3<,r poN\ 4 :. w`e2Os Qb AS>83(5@X!K UUlt}O_EǨ@-d_Vw3n .v7ѱW!Ե"G5]Rb N,lmq&1R\ە:q5^Iu5S6Yd[W'25t`y2Au0PI3xMmAyS[}aVx,_RO;(w`TM_RٴuOVvͪ-}CxR3"i3u3VR5l>Cybupw۱F"hbhА3T 2ɫi6}n!鈫Y<Ѕ4d b65wQWj6cj k 8kFJEjol1Qk7haӕd y2s\W|hqgTjah̉]*w_Tl1k-YjyՓ7)y1x6Wv}ThG2TQF8nA`}G 6gyܳ|TŪq /9(zf.9Gh>C{Aeuq X A#?ⷞ&';0.ccwMP\ili :#is iO$EL{7:#9[x{w9-$vh|cf/xהys7mSv/SqkǕ6D=VjMnb75S cYxA~Avj]e1R;OA] aSߺ!v}OSQ{bRcgwjcvq l23r>5TAp0i!<ڷulSfQb33[$V\&H(;H+ 6T[_Q~UqgMZ_]Xk؉VVle5d^uWccEL%5_֫9vcG%Z}rd^^tB5x.Fb;h8vg=PQLqV:4akfS31AΣxgyzuAoZ_adҶf5\]Oo5Ue:ۚb>k:O9PE^Vw~5]cV^v}Sk5-VeOsc;b%MܕZ ;w;Զg`w_34ᤖ=ķ?HYv}%F5ZVW;D KM*C.-eז{dG=E4b{M~e/A^]{~~LZB2zЖHoы…:T8pz"ď *ۧ^Jh̘RÑ%*ӧ0!AT9g4UgAzʈTrA6=ԨSPPRLz*S9TG/2=-KYgx4-֡shD<=nxPj2sƯF FvFh6=RTdyT!}2Qʤ,L6F}܈74xĺov!{'hi?Y]_=RG|h3Mr緟d4kU[e $v,eZM R1%daEFSaI DP` ZtYS(4S)MAM4عeLŠFSUOP]t7}VP_eRIK&QeW8Q_C=fVQ-auZDmeMiyY\e2p`[ڴT&)f1HSV_av7NG1]yeggaamU׊(Ҹ&ho>LIkܠrwsGvT*n>7pަ\m}Q֖>^nV枋nFnjfW yS~DZv(C!)I2IalyŕBfF*HHQj*U4Ԡzթݡ8_kSoiI6>U.m'U%b*IUwa1gKQUO>*VDQbq_e#"%T.ETE%KUPa2GI(cOu$ >#kjG𱆟ۇI~tAv^[Wu7ՑL)t]85_|ૃ%v=FS W!)esTE[uQJW͵"U`eM;q3oCN2D4RE` YK0ZIXU>E{>EhqIo@IDAJh DlJg#q [WU iY5LH7POC5Lꑉ*zU'J\3_،r)jQ[eԽ ưP3z!OPZb@#}),"QVV*j+Sw0iJlR",JM,Mhmh.3 Ee)z&ŔI|L!g?}I#ƎP:~$'JLLr3[^MLɘ緜L¥H&)EYPX8lUcWYQp"Ib!Q.Mmi|svu{s]YB6Xfp!1^we%21I[GZ#<0vѲDs_xUsx-myYjMo\.ַlj<@=sMl"Rnlv9m/.'\nNjr1Q$y;ֳąq ibhJ @ :Є4 hC'zчnH+z҉sMB:ӎ4/ GKӘjRӣV5; SԇnkjVұ~tIkQֲδmM{̾yhO! UsZֵi_W5Y-ibh'e4 򮷽{ӻη{O" o3o< x&og x=>o_Oq׻xE/? ߸o[;ǹu~s4'As}L'zs-wYNG>g~t+3_!>髭#2n׾B|O$~}[|Ϸ@ }w8{ѷ|G{ܧgȀ(~w|ͧh {ǁ'h~,Q,ҕzuy_a-`ʂ[SFcFYoѠ'1zz0Uz)RqZA[xWX+JZ1pZmoq(sHuhwy{ȇ} i0b(W!oR6bbCN%BBdU)gĠ ɰ aqce.f9(`I` ,,xGb fHhLjɨȌϨ.5H'.fՍX[w ,ȋ+X Io`.ñbxh%,k  )Iy0 8H@(aӁ(,9fꡎ٥`я `e8 yk&fXfaF?yf hƍHIp`O Q)SIUiҨFfѢ\I[ ,yRgKŃ,ѢzF V`赖bZVɘ阏 2UdE\"oI\8&x`%a6&`536aZ @ р_+f.xZu[fӥY_˱ZfFpljɩɜr ^ЁYx.aDZ06y[ -pٗB<_ v.hgyꢝpМ ZbVa6p^ɞډڝ" iyzZDf+ʢ-wי겈!.Qd`e悝::>.3-vKʤMLJ[pQy) E[E.١ƣZ z ;  C bxN܉:4]{ <צPchZ021 >(d;ñP 3+M-"NL;Mnj :p=|=U`˽ܡm䡠й Ӓ;D䓝.'߼筻.=8!>p>$Ѯ΅AAP9~ ̇0`zjV $[ֹl('x<_Ţg*cC.,،LژO!밐-=:`~/B;@ ]Οy>ή0 ѝOŘͫ,c3N 1e P j x/~ :-7LƩzˠ-RSOXer@ctgS%`2M4ջfeі%*j#&h -YM.YZ%BT<5С˞մ1ͤ*փ}jƘ-,}|$kVS& 4ԾEmw,&y cQk޵]G;ھŜǑRF}nuW75EymL 8va̟ C;F K?E7_[g{ϧ_}deAI+je$hIӞ%P P 68 Er@P8yZ&}@QFpDHEH_H+ 1%| rQƏGɁҘǨ0o;̴<5tM8sN:ηBIJ$0B?1#TP2I$ʁ$ϗ襍(b8F4|Iœ< IHBqKH55-r YM?Y r3|2V/ޖ}kYjZlS@4I%AqU^(5U]ORVe\]qiRJKvR\5RE5႕(+4ިW[3xc;cŤxRI L#%ŭ ra]^4Wd-TIQ ge@$@ew5^%4ɚa[řU}3dk[e&m&f]6^SEm]K;%}A:JǀqU{nM]Zԩ^4Ƕr3|syq}vR%SgzbV]}:e@ZT%G\{S5a}qN)4.y裗~z+%˒W%T; I tuU|w૽TI(zP$4Ѽ/m^?OrS$o8@MlgÂ%h3kXԞVj=-V3WZ{Fֲcgk>hpe Yۮmsu˼vM.t-;\VM-w]~W /y+5o{^Wwkⷾz_ؿ!dY{`51\J6&A+Ći ZW VnM 4b+MpcmLcֵMm{Z۸% y:fyXHr(èm1bb~9^slf2Yif36ss|g4os=9z,B1F-y=2H[δQH+v82dPdy}jIWvǥL[ǖĻ}_SLbbX~^E˲llCۜ6[bpg8-nt[1kMCr}o[7 yx .p\g 7_8%gm]ZwYҔe͛i(;ְ}FJRrg:%g8Ab\:e_Y ^2,V[uufiܪ#.M6v#:.w]v绡{{F< 'qSIeV'Me~Z2Ч^/ u|FeҲul]K}}RhF D ̹^K@}44=Rϓ?@@ӿ}@ ,#"eȄΣ@T !=zLA= cx(A e! 숁8 AAP$ Ҩ'3= \A,fh0PXD1YP`ˀy`CcCȈA?-,DCL#h9 dxAXD{P "X8 S`aR 0EHL> sz:a:D\S.1(4D8yXFy; 9d؅e ЋƳFgFi|&:4`x]|Gx,`$DҐ1MG Ql2 1P`C-a}xH<3>L2AG5C&܅hC, } |PB8ɋ::CLJD@ c4A$|Ќ6 ¬ Q j<$Ld9JBKO$A!ĥK.9/<5bS?S@ TATB-TC=TDMTE]TFmTG}TCm QMt?4eӇh@QQT]UTUUVWuVUZZU[U]\U\ [V^VbUa-dEc5VemeuVf}VjVkVlVmVnlkVopo4UWeT@Up01ڨXtEe@"EX=؇UM%5uXmX؋؏Xَّؓ؊Uٍؖ Y]Y%ٔYYeYْٗYٟٜY١YZ ڣZZZ?}Oؚ2Zsۄ۲eR[ )u$Pu9Q:ۺSѻ[[[-\=ܽMܿ5\eE}\uɽ\\\\Х\]5%U]Ե&d(Bj|k$1'jO;=M&Y `Luޜ^^%^%_Eu_]_U^___` ``.`~-=LuJF0,^ M **"e)*]sE NW5zѺ̺L+=Gab( b!N#^b F'vb%:&b*+b#-n,/.b.b32b5Fc6&c7c81N9>c:^c9c>~>c?d@:B&b-!Ah9sBX;L% fZ؅LdNޅdOd[0)yyՃKPS:݇$\.J\NB_fG]6aec]&fepfSTbfjfffd~^fdfi>fmpi&gp^sfuqm^xv{goNgk~.g|g6gh~ng{kV~FghygvhL ?[} ^J>z^xP੾"("a* 1ޭ{{Lp5ZTi* bvL @ =6Y姮ݺejujijkS$35PµV:>k]NkjXVj6f?v۴xꪖll~[̮eSή6ξmm&mՆlʆN>mm:^ӷ*>6eTe[M@"b ZKnO.di^e'"Eifܣ75:eM]؅ef&p $~fpOp&poppp ? o p p ߇x= iN qf5ӆe658q5H q'Ⱦqq`sqrq#qWr&q/rO]v]H#;>PoL~݇Zx QA"b+^vTWa;Ø~ ѶtnkLt|=MRtuuMu^>uQw N'uWguOOY_ZRQGuY'uvOccuHS_vhWviiwvkokovlvmZd`sYWUv1.eKs^P4(b'#*9Ź`aSz pF-߇n I=xxӋ/x) o}`yxs?y0yGGrOxzyGq'}x1sOHCTµZ}iI:?N 7vʄ1W,OP*X@<5UH/{s^w Xp 0\>  N o||i# ǎ:|}`08 Ih}(|UwLEB0T]NUq~~JUipi Da5wEeHHLӲ}"Lp!ÆB(qb4 r_4v)pWO6˩ <xѧ1nIogR}%1jԈ}HKcdTԸt<+5/Rm6Riڱn5άlEqz'!z$wd׵yufU0-:%/f 9Ts\NCuEC惦 ާd۵ ҖM6}s5£}:˾=Z:n-9ȐiD*,U,LTPt_T͏iL$%2 pK$@(#ʄ`&\02 ʨlj)r2ɬ"7☣8NbPciQ=.0dXI(Mh.d-ϸԕI$)E >IQŗȶ#HƘ>Y1;QLd=2FAC$10YfpJ>:ZŗsdF񩘝:a0Ic*:8x=)HA S>E+$Xu&afzYF]Ul䩲6{AQGI BYl*-fצ^9Ŕ֗|nV|E㞦A;BܑAXEL2s{J I'"~ J'ڱ̉&rѲ2bb2f GDܳ?K`ǯ&i,CIRpRx&\pa MyqEC)D>02O2 4R7^r ^[NM/G4H>C=)^Rk4\ȝN\1x4(`UiX4l{% X*w[Ga-w#Fi4FDiF_GQTI s}4Cz/>To#?Œo>s|7_8U5,*Wqe*@XX 2y~_N41#R( h`F[( $ IhҘaKRLA~P(d2."D!Z2'Bg^Q+I!繁UBNa(P$!àI=hB42Ѥr&tEыYd #C? =]Ҩ?Eq8Rz(KYJT~J 0h^ғ-hh3I$iHKn S*ʝ ru⧬*P$5-8ʴDNI,[mؼ&LY΂Ӝ$:Nz2Bg>q:1r%)#U %ÉN4 E>~t}PAGbd3, Hk d_0!Z %Ct (Qa 7 AA$rkH-XȻI.w$b Ljwj1V>хOfqNH3x'˕9bX#"::-h˰94INrܫ\&[&s+~i9x<,Z$j3,I I0)HceX1x[2m =4h(* j U.ȷ%pB&wAmr[jnpKno;^:7xr ꆷmlI"%$qr5=jD&[J;Q"Bp7P![0p2K ª10Q7>8h1%V,z0#CbF5ǽ"rزqKs+SE 8lzDP[NnWYP27Zā$L6/JӨe$!'5R4QFe 429x':Ť7ehmF(o1HnAc}6oIiڲpNUz't?+TVPS5Gr9.eN9l]eLJfZضu^_[Nzmn[V{ 6fC0a  mb3v v!SM } D`c&V}Oy'7a_yFt5D[KW3U3U)nRԐ;1 )UH; ĂDs3|FA&YQȒBRVL(Cāe`A`5lBt.ʥڟڟBQ5 3@ -B bU Ra\.aYāBU4R\ 4")4H`অ 5[c0Qk1NDάNMPiI[VD ڡb%"N!eILP!b%Ja#"aaGҠ U1y)" *Z(P ,1@D@ɓ<1B2ɟ-1(C`6FL9Qa-؂BҩZm"aYd%m8J`8#oc $< $F &:&]:fM<:$ɣec#!$-vI-IJ2H.WK%$J2 L¤JK$NdN2 Oj^ONeQ ֤PR"IMdo!1IVZM>HARÈDAy O~D5-P 15F4J@]j`GKE΁$`F%cBL'X>AE^efeH#f>^&ifbZBR?#}h"dg*di2j#@vWe&Balc:gƣR!aB 2!!J`r2$2 &BI'q[sb'MPtgg6%fxRvg g CfpfAD-}f/*B856cAc]#h&0f},TE*!0J 1FehfoJd=(fVndHfHiV}Ҩhhheh hIRHb%Fד^S^iBeIJeNF)vAi*%Vi)Ꞌih螊-M~( Bf %3_eY2*ZQFPX$ x}fD$"iᨉhfoj&ghn)Hi¦chf*ƨjBj:"+2닞h*jk^@kV*^~\.&łC4h "5v_]FX5+5^6 G"DHpu[Jl v@T,e,+^.Q:.jl&-z%kƾ,:H2H#kɪZͦlRj%l!V,&m.mRm-DMm+Ƭ=m,,YU %*YrIp-x,@$(ڬl&mТfl,˖-il͂lתl>Â咮,nئ,캮.b.n֮2FnH*an&ĀmJq-Ր9cYrv%~|oz/rXHYn///oʯo/roo0*+o/0[pSpW//bȵ%ܾe}dBM G}(t-bTpppie20++1}G@ d(,LSKcqȺ>ĦPS%1PEg10qڱ1+DqBBq K1!2#G#C$?$;%7%"H +2$s_(rv3t3Oz7HxO.wq (W,Ckv6lǶEXFiwg!@ b  GDED _DAҏ[]GYKS2NoSUz`x`y_/x )IASƀFӒ3htN[*Ŵ9y398yPK6ey[87xLsGEGS:KyKEy[Hڎ˞85ufL˹I8149Xz3f/"qe/"(/{$(;Ek8B`̃X2" LI <;ofP;m'4A6Mp9C^ w9uWHwNKӋ0[KW\EZCl`|RQG놐qBt5ZJ (/TL(iJ<+uMUuM?wtgz䛋 Eol(A O(̫B(3N 3ȜLZFd24QJ)MZLtk.v!A54bĔFSܓ>I0Ij-[d8Ey LG&`3"(DȢ` 9&s;7?A QhO54=I(;UUc*N'[<~+X{FFk.VZ}j(Z]pk.&LvUf"yw ?kFzoz;#A  igՋUݟ(cbh?T[n0R/32"}Q4bwV1,馝^Щ3 i+ O4e$y0KDLHoC߷ۦn X}@B1^$ VDoFn+ڏUxq ˕s tʮПnkwոz]6H:8쐩TebB$ -:C80(#c"4!)es⛉;@(ɤN=F8īrE9mmbGQ>jU#鮉'H-pveBZ;C=~37ɛLơ{x!d)R2㠎x[UJIsRnK*e1 Є&TOSZ )r5Ҍ`K衅4fpj@О"ň*Y$(A]h qA^X'lfYBG4ڢWՌ$oCШ ߪQgeWyaDHMլ`l=DFuR>Đ,11ny[`0OdU GecAQ:PyY[Jw^b[]1cxe\6$8$#xջܭR|^fؽo|_*4? \ޱEoaX 1oag1[anOnERڢc (V\cIo@5IWE'<ƨ 1 WnW-ulVM}b]>ruC*Wyԍrc E*X6yɌ/D9 C9&3q|J0hOGGH85_th|u|Xs#];^u4.ڌ^zAle+jm^d7;@N]^;xOx7@LvϜW)v)6MjjB BZ+YQhQ4i_4IWFKcT6_S 錧)^}ܴ7:8N%+}ݠ9xkHc䙾~л^կ}\Ox꧟mnҭLoد̏nnD 0 W.WN:xn+8>oA,Ƥ6BA 2m*l Ő"F`(d,F& d0-N-n46n$0@~NN:!p+ q0sP.=P20p1X INP \nvp&͊D1אB>p u.Te#ꆮKP4bbQij3.å2ͥ++?S? 2 @? T?A@AtA@@#4A% (A/#B+B TC >CEtACTB4CtDAtB+D' [4@@AgTD_TFq4DYGUt?atD+RtC?ӠCoF[HԑXKGߠCS4HTz0"@A$ #0SN$DzC %d,!)_1T"P P$UP"xQtQqN+R/Sjgt3=c̤ړ11vvUU5Uw>!^5SñE")N[=cEC<F$ɸxYZUZZZ[U[[[\U\Ǖ\ .m2mT*b14*v^ax`fs LSO 3luerQZe%&ardx]\3Vc7c;c?dCVdAvSq<lDU*31`)L*BU_0$HmRlSǜ0edjkVkkh) |0Mה` 0a*bmmbU*`~,F)O` P"vgDn };s4do>ds<(&&qFms;scsCWtV:S%@"&Ztu=VhdI,ҳv+T*:)~n"hbRN9ggrFʸ-##d(:rYY ?wbLu䈂"/{c;{\ٚUS7l'*D1@z*2Y~nT&bydWM@yYé~buUx22S  WV Y"A0v9a_'>n³\YZ[[{|% ,T,6A=}zk*ں$DE`%jaBxawQ{Gʒ"Л+;WJ8Z_oI2T;OK % "ܶƹt!X`%eUH‹ȏZK?e!+&Q{*U[UUUs (6{Wi'q+Yas74KGΟ4Fsui\ ]s/=!%eM}53OMݶ>=[}_iem=+}q}b19|B]Q*N\x_0b Aڝ]۷ *:u8:1*k(~ 1?1A! ^߅^2~%3^|^2虾1}!^'3!뿞0l7+ؗ!`=Cp|` ?=sYS]1>2}+>^!m/7í؇pXڡc3ࠝYlp|$> _ꉾ鑞~굞{>]?2!_sڻWݤᛏpOb~xxW!q#˟ ?~=Rnsp6x D'#ھ*\ȰÇ oQcxA$,ɓ(S\ɲ˗,Ӥ٧F Mj`7s߁}B-L̛I=RiӧPoIE'aM8fRFavldde;4U[茶ɈMWSm}4}|49O2ȓœ7#sEVpt|5^ͺk͓T6k=W Lh41&Trȓ޾e0$oi3woj]{7.[ o4X;v9Ց˙1\>HAl 4` NV\N)AF22aGhlj'" `(-XA,*x`&*833F$^8\`2cH$yd 4:~G-*^vUvԁS BL(Wn*-`lAg`h'aӜU3qBc$11(|= Wzs֥Yם0iʓd30@$@F&1ܱ0p߬+F3[y믱&8@A>4+DFj"qM>){P!bTư kг`X,' Ul4N oCp qiB>Z(lkTd>XC֑9Sxh5b}Uz4g_ *~Dz+u4OXHcD &@VS]!CDDUQ-ڋ)?mh-68D6#hJv!ӈv'WnIb^qgPvԛ`$C`ç|֩ȞǾSO-sO=Y!Pj``s/i}<{sY\h4x~؏.ۻZe2\T.}e-I>G(>ZJnR)v*/$: fY !! ;f4ֻ֓,di/^(eGB"e67 z1!}JF}la!W-"i8GX¨$%:2v̬,c)L{޳LS2ڧ)-"OG;Te 'toQd8m!xCN#12JT-íp\y)FQ1Ҏ 0$%{1mF$pVJ }82rۤ4Z*ezSPe_FIC&"'!Zx>-ehµl%fK#L衻Asǣ8*0f9asO>lOYg4<-v)KWNŭԤK2rDž@Y" ;% }A){BW, %@0F´ j#}DvґoJ酡 %H!XR2V 0:A-[Fj#PLbdbQFNbl#9,D4?vh!8C ($.TPU$r0(┒10.Z *>4p&aY`GOڝk0IlDrƊÑщ}ڇ46`Ymt%S;rYFL%|*.7pq !i2?-;Hs  2]Fy|0İ=Lь𛹅-Nַ&fL 2z: 5Dƥ:n.S"m%4J+غwZI'q=Lx[Ӌ-+˧̲S=/=Wz/Yya?H ɮU^`"R'r|oED~r};,w2e~ Gb6/ǜ8PBxYg{^y6_0|2^5flG9+KLj:`sqdV)f6[Xuqe33ZFW"acOuYvĀv74X'qBdU>bcw{ {g8wLc }hM25yj|!ugjFNVdvBbd|6lz/CU %BCLLqFw}؆1Áa#6OgR?|&dY+z{kk7dsiȑ5Ts{4NHhcE8sg4F(]aG"-MvYjK=X3v*12Una*TEXiU(:Fh3iNS1 "L>Yʼn'7vb?8i2UbՉ*Y3;iT)˨!iE')^ ?Gͷ|%Yhe!?9DP(ԓj0L;B'뗉\xu8Z(:Wj91:2@Hq'ӡMh`~a3djH4_(Bwq.fv:80oҀA 1tduVJNTCH p2g l2nrHѦkӁng::ԥj hpW(:{{'mJbOh4sSqzy lzz* |JZ l}nZizګ:ZzȚʺڬ*}i8.J V2#CLlBD4Iņ2ffوK&yZ4i9"qy{^u{`KoFIT!CIjXsGb *ccKk~O8 T*[u{j,k0x9كs{VxlTwm6 VxD uW:'|u#xA5Ee)20N+;( CcZ礼;jFWaEcaWY2زr[]a)lٙ Cvr\wFJrP#s)D"a[5p+ esSsU; 3ĀDZGE%9H:k;!bw)f e ϶ %óFD!B8C+AgaP @5Y YB~dKt'橶Y#(? %飦Z%36ӵ34WvCAfv'fj "m=75 mu5T hZ;Pxa)RT%[B6o \D\Ϣ8xkM:h80q bvwʖLo1\| e/*Dw}gg 5C|A(\ jj ɛWd?6Y4oRY]AW .[ R?ta$r{=0ǂE !I%GbGB[mݶA|c{s=!9}[6+$rxf,3ڣd"5")݁¹kij7a%4q8sh|¹x#3<)zѺ=3 JĤm7ɮD['86_JdR9!5Uu7pgH;hSJo3A/Y,aa Z!ҶJ/kʨHlS'%`^䳗c1IeAAN$9rrs GW{ ?JegK !nrhHsh4R=IΞrsIAT=&5.ʙ, 1ޮC)Ty8tZ=j7dLje]@t!5R.[RcCb5TQ=5%0^#@/#QxR}|SQ$? Uw KQ`b$ wf5@)MZyK&\"٠3`jci1T\ԕS|Km2B^"r ]}%6Dr\xnZ+|1W|Ie\!L\R=\w[oL@5+Fr{5n|4ߔ<HܚSW0)RoBdA@pMQm U$-^0?:Q<ȯIC ^ڷ&> QC}KQ"(bʆQ|h"Fb;˨IȊ582JI>,$5męS}bĐM}ԧiRW(}I^ZUiV]~VlIФfl؁b ,n41ofޜJuZ}ڶ>hiՋM5iЪD̮i2 X6d͘vͤ1|Y陣C[lڵm6Ӿ4 >Prm}XVe?6}a P[_. xO"m|忏/˞2z[Z,@Y2?@,B#l#tP3 5dA; COD1EWdE]g;PڂފK}&PʫF!-}!7 (끦G²ܧ#K}rL21.RdM+I1,3*tN@t2ӒL>4O?sQ-'rP@!NMEFSOKtԂ G7X老Yc69c!nN>Whv8ffɖEx07Yz_}O?~_Yg~ݷJŖpࢌH!6)FV0(  Ap8 F ohT-6ְ*=OL< Yj绋Ʌb`g1Yt)BacRῸ'?E5a/:QgNtb(:EeMlbEMkC\kz"KuF ec)ձf;ǚGϏyc9HAc"@"RJzZT'ooV~ Γk0 ,@- 9>ݍeۚeK b)He!et}2&ygwS4RάiE=db gRKˀ".v5Ta0ȲLCʈ1XG4j4 ă& ECQFAԡEN6](F9Q|!0, Go6U-# A  n& 2555PoL84"uh6cϦKxۨfԐ_ Y9%1]˔5wV ߫٘Nrm]!Y<Mi}bH5X)k-LJʜg2~mhKK(kתm-mAv^@8j-' )OE@*a>}̃ MytN hI ✩OuBcPbZDS56] YCufLWy9S 9 b&d3Sk oa|!rK#1ʍъ=NS|t4r\#'֋BN2d%OK1dFt#p1G9I'AE6%PTލ|8`=ÈaCjJ+Z@/Y" 5 @#ꔷJhzY b*amF[;%DM\#Sd[i5[-j,@i,I0k0lDn@, kZ'QB 1HB3N¸0)8zĉ]C`.s;;<>:*ÞÜ`- Ҏ42YDv fE:6O19'.<:"1Hb6s'4ZI1I<& tN9ZU ৕ {;5^@5.11(lZt&4k;&3#A(IPTH%$B>ᳩ,TL8*~#.4 #h330.G*7.}쮧V*IÂq L \6;^;+çӧu0,5ۧ+h"Eę Ia?;1ٺ?06[*"py\%,B{"$!3̦40Y#sAO0['X=5@փb¹(K+b + -.R-b4*}X@+8>칟ңF8tN 4x# #˫O^J& TϷ{5$0p;YB!#\!hDꡫ%Ήb[;2j,q!ެ+51R~b,JE!ɜɿ +g"#nR:S!25R$2Z /$b  LM¥)+8Su+Q}!т8H ;+;,MTX5Wsk"DFMӞeV z0 G&a ^=P<b3[xٗ²iqU/űe,1Qf6-NvilE[R#źJX!+^N|`=I'n:\$Ej|V;+[nBtEkkNT W]'vnEYAXt`060ѥXovoєȃh}4&M?~aiy>=Β  KOS.y՘h֣.5,?j[ZUAe<]aY:T3,zPށeĥ+6]f4uF'|J+Yh`H ]շ~*i J~.5A Q\,bģ㜖4JVmVN"ĪԧT \SsFiChmWExT<$mUϸ:͊nO4.g 0 ,`'?EFufӨ2`* H^GѸ Z/Wvead \4tCMҜ^i[hۚGIdS@ 0`kVNטe4‘aWץ`DZFΒ!BD/f.l\VܪrD'6Y8jK1IgziވK f:zk= Ӹݥ]e^4⥪c~OŖa q_nJnIJ5jnh9$ʔ*Wl}B) L̛IoVrr}`$hJ2m)Ԩ&)BKS^I,EFŅaH"ڎU>W z6.hz6!ߎw 4|.$-d&,vbGj9]mʥۑFÒ;F2eͲ+e k}Wkͭicݷ p_${JQ#]a3eӊ Nox6kwd5Xs5\A1hFTdRIO8LT(Uf.Oa"(J"1(I-DĠjas5Xw^5TcueA֗G-dYePt tWMk54eDb$qkexQ6q_mrݙP9zA)ޡHyh_'QpwOn4t}ele>&7*F1ٚgU!:Wtq^gXl W3hR hB(7D==JPZ>LňI"q3O k.JȀJ«,6lTOV, (bWzn |'T~dcD}٤ZJqW6Fet1U"[ LJXFXƖb4)j}ޞ]v,_qzhoudfg\qY=W@ 2g)Y:äq׊ ^9+pøjtN0c+Ʀ 2oLlbx48I!6e-b&HȈ* p>< ~:*DPnnRpƟAL^g~:K+> [bl2i^Zv]m9%Yw^\е#'я޷+]짛6<ô&Pw绝p22I 0D3Oi? sTUL}YT:Ӈsm`=Ca<(uN -1p_)S4h .1,¼1y.A$֥-`r!ebZɱ)yPMj?OT1u f^TşoyxH`X@!=ge,7P3!ԾpOPp,粄)1dCQryaI&l#c3)HC 6d*aأ`.A-̢RLhh b@r-2É #LQsq'eylG9wBJ }:0$iۺc@PfydKVifH'kh 'm 5T&G:糓*6Y}"pcxTVXF!Po2[vLOLD5>3CCpMALm A mt2_ђ/JTΟ;HL *CqZ &X(9-[@N" -';Ov:'*Z Q_0u| 0T]'<ɰ pkBA|̣-qƦ֩0ޛ5!djBETƤ4]c%Lc 쇵[ A;h6_1|qGoTpX;μmg2T=-K}u@SMx% > 1Z"w"0| >^ ֪GWhB򬧣y˓&L%,}U_`TIFʃomթ/tT-NS/Qhj'?$HaZi@ʱ{2_>+$ ~|}9):IR`Ş$sܜbyv"?YxƲKYI*W$:e2ڒzIP5u`uv ixl)C V$Uǭ@X$fՍrOj*PE]D|[#IJ'2F:8V {b(,`AϘ-mTę[%duKpI= Eo2n})%VIos\Eg;Ϲ#d3n"7tO5w!Lqu{%;?(LZ6e8YߢSJq}([Vv KK;foAb}AX@iVF/ S\y&L"(cre7EeR#/HBY!bm@J2b!$M5K8Kt%<BH`D}lT^lD0^z,oP@ RҴpQB[L$޿¨ѫH/LxNtl eU:hJr X I X% \d xT5Yϝ&V0 <iG|]~<>8m9֋I$94L) [^^u PtCuWIħJ&P_qDL XT> Z * ZB!LOHDlHLܻL%1Ù^]1KmC DۨddZ>t_T_Kd Q cXYx[JU<`u)P66ˆ) "MaXTɍިz!zA~x1Qg*\܈ʼn 9؄ν qۮ0LMJHR0EHǡ!/oщpa^L(1܀NPTTRX)]FΐՕALB'YM }Nm!p +Q"0 ^Tvm(RKesJ9ڊ)mG"ʉPB2]$EBU B{(q<ؖ9O9y$V"5`H^vMpe_8~DHMc;(<%z9AiַNbPjCOͅU_Dv z䑿R~X ww-W0TiK-dm__@D^x4дdn^(F٤mF}Ғmֻ}(1RȤؚ ڹa@ZJ\]Paz~i?P- n_M\T $i(*ϯGӉNG`J 3r`"IEmDG$\*-C&OJ@0ݙmrU``a`)i| &%d-%ʠc]'14@y-E) =@r{Ŀ̎P E| %F:iuyQ) PWKŒxuW N^ݺbj BTmGd~, ,)fd&)GYN\zcoi(R- GR`TRSƤ-"Εͅy2@;@M6uS-6]T$R9j\)ΙO&c #f~pXݡP-֘s ET\-םB.grOEĝjOGFa\YF.d0zm9)j'-UZR'^\e^ITerYΨk.VnY*O)cS渒YEx 5ohETF$ hK)xjJxRp0^TEҪ ͝AVeJt ѠK]}(Z%nac,6zĹ)vu3/I(PTқ}(sWb`c*1ЃqqY%:+hԱn@뚰$PiU$$x )+DV O "H"iQ$b#'I`"Z!sH'Z1b!*L6IW)iaڋ󖐐2s jl8lb┍ņ,VsrQo>+-j \Y!ACϮ$ W9iDH+yϞLn(YR\(4EkwޕαBdȺƚi[c[NH11OzZ˱bLh0?0~f+Wbߍ :R%Ja_Dt߱e SO05]@?RbI˃dOLi޾ڑ&RQ UeDA-b85_{=Dz)s@ɠbze"%]M(nk 43X蓼pqOGWQ$R$ uXd6i&1jl2A>xmOA8PLQL]GTFAQmY}ĢPvqLՠdd,Ob `٢lMŤ2Q)CfKr+xƌ^Xi`R)kk!-+M5Iz-sJY쁠M &G{ɕHY2C ND$=D87P{C-_O_N(SpJh<8\%!hJ>(B @ ;R;`1AjyG>!&KZSMCf$xIκޔ% YoL/1ڀbۤ`B N2 )TYr $2N >ttY:SўVÔO9# Ac\7K%;΋yȘ0@8I @2\$g*iJL5׊H)avœa"80f-E66+sܔX\tBM0xjTr&֭kȝp13S9s e5ZTӘ,/DU0*CS 9cG91(4A@2" }>삌4D 4PQ |B(B @)>?@#2q9oyb OK  a>A9dI۷lz2!FMA5iEWe4z|N7ϕ+ZPh;4(՟H|4*ӣ,3辟mu)g?}bƍ \ڮ9M=|trâUtejVzѿ;b݊L5jnhY~}%؇ bb:I$Pо- EJ #yƈf8!P-.̇h1"#!EBiH'Er|f !&ZAFo1CvQ lQ l:4 4Q ˜j1s)^%`M.7)I4C6zM'K;S=H[(>M3˷E;+l+%4Ս31PT,X N0zI8ʃN0Mk:MMuQ8[(NӲ9'E7Vj5LmVȬ:7&,pso4HebH*?"]bQ&eD_{=#@?"$aG$=)QHF%CGgA :eQŏTQybXC.x"..DWgJb ,Ә7ͮO"E3$OHE<=mTUSz2*0g_MeMLH kVҔt lM..SZ/(*tz=I-]NACps¦ڭͺܞ}ʱ9KuJicPCkN6? 4L-/ʗu/ vN??Mn$ C\6x=gDG' aA#S|FxW?|tFm*B S7cz$y t̪kˋTúXGlSv43oyMZXlEÞl]INZѨd'uo}ahPPXΧ$-Q5^ը\54ܭxW`5Ty2Wh%u/ZCQk`tJ'dk&.Z|ɏ@Ik$1'KB0A #<!+[> AC p4@vȏHP+2#b0Z0uD-4#(n"6qQkt4XQ ]Fn;wh4mypRq̓o:%..k ۮܞ=cQ6 u 0! hCwNoC ANttdC+D:i3zE&LE&7y*9!z*j}MFZ2Fq}"+חhnv]4Ƴ,N켜dCG5T]`e0nb!owY!.qG-?Өmweiiq4*$զđ $ }\" dŒpQ>ae 8>,yLk!22," q;b7hC"["p̘. 0_pj̨ih ~7Ԧ1չ԰vXj(S3KU hnxQp B{avx{JzP7Y fZ;}E5NR wJ}P]eZV i\ϳ\;nx7*Zړ`fRsQ$T5瑫vO?|qH&聕,>$ efτ5#sRH38>JeG*,S+MډxFs>E%TP&N'  q R8 iZk 7&#V,n2q8<8M8ejiPR lQ阪b & D))R<+^7$&`.MZ^ ,XCoNR܌ dFQtsD%qN.+'RArFsԖ&n8ͅPhlV*wT=ߩt^C3OS3#jeK))IT} C)cYucd'|tht'p4#E ,XD>DemGirwQJDNj5 5v5-+6;~rQSk*^#TjR%MgOrHH+IfWLuOnNs/9[q6#o8p[#xbdp?vM &AhaP u<$\;KpkfRp5hE$bl-lӤR] 烤%S厒QV3VAc,L Kd0[㕝 p%{\X5X^ֽ/QXɵ? 1 m^P$I$ FI À7$*q.,J%OuhܲF-Opo y9Ȋ\EtO$TҖ-ACRovg 1P*i:PVJHo7L%j Ob,:)2h1o6 0/T+N[Vc5q*\jwl:rx6GT7V ] #OX$LM$f2CLWY[`Prg17+pH,rhZRHhIW rHzun 2/t0.M'^-r:EVmW),(W<λ5lzx0Hke6R!y(A!6IIy$ @M{.Y8rجrר^FL#^KO'xSC4ӥȾ#PW"-5m.h?Puw؎{=;wt*&KnE_:NB'6szK^KhM6אFJxi}ER1#Sixf}; KU=탬A @Ao~>!k(D$ĊȚH宝D|:HJ0 H10[D[3Z G0f7Q%e`-t^oꉪ= C6ȃ0w<+bKm4u2OLO+X%2Mjs@'nC94JJL7UMźpVTC]2IFF DEo FAB|ʮ ]~) q #:c;Klpjݔ9f0UYrO^cƒ|'<؃NEVΌȸXUDM2X!.pfQ4Uzb&pKWf`I^.=v1*]917**4)S&SטE? zT><`ymYljf p *db jlj ׊FJ$!a ff "tLDT$f"bs"arT l#`>du ٟS 8 ռ 1](L|&ﴙYERq 'ۮ{XVG4`f,K؋kC*s z_@Vc |qM}o"sXݹż,*(wYxʌ`% K%e f~G\4κ!"dva!`f:CgC:($c h .L|vCbFjaG,#jaf$#aEDam `A8~:q dlx"9Lxjj&g2aoUqnս+aܥ.(TZzm=/p ԃ]Zǧhw,Z]2\JUM MXLC!K4ޯU8(ɷhA5% gN7ae_{>{maoI|J,||~.Lx}GFTffBIf EX NA"Dc#bf:Bb߲4i ݕ"1Z -ȣ2*N rÈ] ,VTƕkEsZRqMΨdH5#łj0T0ԫ[?Xpeh,F7٣` ](Ծy\0uA # )4\$Ӆc vcH( qğk҈k% xG>(~~長A.eR^tf^UFI%ExuWI~T9]Ej7ԔZAaK`2PF)Y<6_ȕSlP]VV6al^ekU`1]hlmќ6jV5tY.٤eI8aj֕FvzeJjiUz^LhFZMR)Zӱdz9*J-ez~k]v0IL a(4CB$3Fp"qE5!|.o&@O_cb11shЉ9b(n\_8SWC5TG9{뛪dܫV韱j`nk@ Xa{m{Qx'beۜ86S 'LSV'FuZS*ֲH[gF=;5]{$8gB9vd-c՚k٤}I ݤƧ>Cw87 yӁt[H<1l4Q\$B@3zh~+H">X~vQ?|ǟbbȁd&ee DO47$O:O@—uJNCbզ*UI4cJdBz,ѓFK" ^QlO˘lD8MD7MN)zUfEeY_\*o;nnwK9\F1+S;[唵)/_t3)+1j+J]NTE5ȍSuTo>ȅ4*AEJ(b ` Be|=HA`XA !;P$E1YȈ?G;t"y&B _$ HH&ahjxbDLɓTdKPhxEvMP7JV@H' ZR]NRc!oU|Eԩja eP ev4tH 85kex:ҌNVa$!wx1))q,ZZrI~ H*NX |N,q-;ix4bu:Gý\u%<&Cx١^:!&ޖbNź :(VWZb-=j6nbTKxNVKCvM4dMPpq"s6ivS$ B:U1-u5EEA(эL:4ǩVe_JM]u55NfI( v Aɕu)s,pXx2= g6G>djEHpQK DF}WMTmJDS*2GiD2//m687c24rzeX0ѴPSV,,٫6}_֤QYXaDIS\)f,+|-nm6%rk<` hx] 2^ eP?zԤ~tc)Ȓ9QJô$C rOV!7̂ٚUw4wM5jrR_X5d#VTpޝ gwDUȥnUP*ݨ) 1aS#?u8}5btH9UrtiMW4E.MĀ<#D/)| .='FKm?%+Jմa{^ k6ZR:Uء*MlMMESǝaIwEʕuIeΎx; ޏ^8xɝ hrYܮ)5圫2g+|y{4VQ:RFVN]$[(XQ̣ 7\&_D9YtU%D`gJ$>@ 7qǁyaFQ4@qy Jtb9|b(+E(*TTaCHdB_D\Bts*IERVG&FXx:lPd87|mwxCoҖ)F%r FkP^5,eT\ss`&x;FTQ^!hGFdVd]jClOhVV. aihHXI Qz$-Rrdn,7Q3wE*9 ),|cg(UQnw;4'jX7moR'^wQ1SeRe,h{h(58E`Up4V"]_(]DW%s=~'|GI$qJq` K*q)gz 1IcDGg7dU8ot,=DEZW'G5ͨ\dN5vgWfnRVHTf;w%yC9+U+&ps}w4d[܇ʆ8&]Aa5R-559Y8Un>'vbTݷ|m{yjفBQ W ɗ}-CщqO4.{WFZ8$&]QfXQv5q|Rot %sMG:Ցv|wsxUdO%FxBm'\c8wn(w7fMT}eU)M5^clك#fB8 7=%J~ɞWaf 1 ~mAH:7cu;ropxse淇6{aRshxRcDM#+h' dsJg}땓Vn2R,vBq'tL'VhP(QޖFj;ەxcI29)5CW[DehrɁhiA`_ڗɣz2$@Ϙ5yx*șw+J|&r$㢂Fi3Il瘨CjGI) h(+Y'6t[h4'd_%;iR]7FViYjXux#Lx{n&\xsE*5we'Qq|#6WB(Iqz) ϊ=¬VQrE87nQ8H*:tIâ^)-ę2UHs:P–,aE㥜ɲ'[pCȂ*A'Ihe:*wgP;&:z)Be\4,gX~ OE,5doDɫsDi'hPbx f;:{gtC5E(/K)D9Zss<&(X'xk+eRfHnLwTw.y_'Q(dDz5StcA_gZ)PefMSl;{Fzn/w:IIVcD6ֵ(YwZ'qjy=;;>K;Jq,ahol';gCb(jnq[fcd-S3{db)[AY6 cwgR;6"9GQf'lH%H9:*(.(pF hŚSJxZ%.뒛Y+*Xt/DE2kiʀJh9H0,,kQ@36|<Ra QhRpmOUi7z5Z`vb"jTɚmg"f2P'(R:!sU (k_K}nqliᆆs|l:T2JQQ|<y,T_ƏƖ],;yqqj ס/§1q4059 p(9兀&K#&Wx:cRPRRBizw7ZXyT.(/&tf)󖧇Zi_*̄";5-^[ISRԔ7v5lKk%7g~V~tWl4Qibp.DL@%]ґ@ұ"8""p!1N 3 b$74-"Dg.2BTJR A7fK7ZPOhf5j}s&տdwS!ʧk*zA=v}l-zbiSbYxeLRꜭ㖏o*H|Qxv,&ys8@.hqL"fQұ $ҋ0+0#P$, 5110#`P:1:Ea+!%(X8H\sxjKPCY{P@0;Aڝ2f(= eGdQ5ݪh6BmwcT:د U|h(|t6蹔}\~/#22;cD^=[}W=.Gʘ\⭷' 97o8&+[&gAorlTiy.Hf-\؞Nn]e8,UkiV:/z˅ͽYTV;1TlЄ2խ7F^i"w`aW"ڄHNс@]$6A#2_M\0"@ApЭ3$73f~.-?6>ۮkrcu\EHھz"V/} A\/aW`} :P#Ǎ"KVt81K*ԇDIgH_2}JJXŤ-9pC ?nݩKJMjl٠AJ,[؆VE e(/FUBItʣ~!XtBbgN4iќ ,rݰ%:i_514kرeϖmzeh#ͤ4:ҢEǏ'_#k}s,s-Mv3Z 2NW(}X\}ގy?H 5+I(#멍؊)% *BLhvi !:$ _BEUR1쉴D", өE^t D6j̬ʊ%* 3lh%k (1!J|/J'\Q,E(*@.l7}:D<3"? .V`tC5 s.UT7Ŵy`^V\s%. 7PS-ALr):H b.-<$,1@=:4MiG@jT1I>%hc Lg툝SxDh- #c4A `u7y 9],lHOҚDt&+R^QLnW̼ L2Bb ᅮ*$2yLBpʐ oHH4y]1orcHh* 6*%hA[ Vfa+gU#,'a hlF$҅X2/wE% Ttw9szRiP!M՗%m[d[2Εn]"Z5.\؇|H" kQLDjF J0aƲOgaѠv=| }B4^ {uS#"P)5xQ)gTfIXl+:%ۅ2䋈59%n {&l3-am2#ż:ol^t e v;'E3ɂJyo$|%tEۡd-5!"5F*D&sU^"I/,NpMSZzj&c(Cm Vp׸4>i/$\¨>0TB«^l(B;0vEdd5U.;^ F{tԪnDr\%q+rsN?ή? !f.Gc挱zC,2:q Ҟ1,va 66zO g[/y@]B !#.QJ%Q,POOVZ^E@ѥ!"!z_j:@yO2kBHnwQ7%ӗmyQ\itĺɁJ6;m};@,]&VNoؑAQOMvG8vť h@Y[CXC]+bp|5Rw%uA[)$Q+-f'&D!+X5D.!wknZ`VFʥ׺{WCT0ZaJcVW1Ngl Ek41 8ȳg9{wkBWPe؞n*/(f-g&hexKґܤw 숍WW@3&ZqiӃu.r~;Hits- :]2ʼO[$|ԸN L=̍K wƯ~ _{Moߏi$rp Qɳ_bsb r"_;&.0$ -I*6Bk8FK*T@QK9-3 z y)ʙ0 ;8:*ªqiQQdbRyAm) z#+:R1`( KQ?8ۨ҇#!c8+b,'k*@* a";s>t$6m6acM@iyb3C!&+ex 3A ;01ҁ+t齰*u- ҡ{7y'dh}ۇ7pe#8LP(b-j$X{A [ٛ-,11!y6ksk@\ Ó/= k$\hG.):1"㈙21-΀4ԇN> )!ћK(י.)@\DB}P Ÿ@4e/@J J ̝p4cVn|84 *wkQU+ڋ+A18{I)[ Aa'> ҝ3Ț˟1QTS#˞3 ,q # xyUhhUy8O܇|X8L.0EOH-O<7$}dٟx i[{LAjk,ZI>,}:<= h1$SJH&VbLB2 # ] _Þ_JL.)];ftbNh 0J= AehPHe Im|O܂TF0 Ta8y  T9\C*4H4==M;: z]Eo2z -B :=yRs8!n.RmALJDaR+Eӫ11BT6L.n˰bqV+AG$*%uI3 ƷsNN, Mh88hx%K}`|JydeU`PQYdyXPVYVU|k oeFBk!o!m&d´:n!Q"Y%Lz$a¡ IѬU-Q+0s) =QR)tɂL4,31.qmF O+3b=\aI\TOʂe CܳK)T K hMXslՇ-P]ՙTI݅(h^LYީ^^PZ xL"_0zE:n5E?!6@>*(%$2WUBQ3@SgB5„Ns챐͚+g>.#)4=$i} 1Kh@BlKeeebM## hԞUڨ݇SyٝUcay^UɁP>FCN,ГX4,9EzW㥙K7 qBRX*S2\ay*].O$3%lףu' H\H'$[UӬZR/psX` *CAJpK!3<]e%4f]=-(;N]!I C]4P]ZϚuJ]# 8X%9h}ph8Vh[߶/䒗gd [28&TS)b*40Z2ed@y>uU&1ߗ]ҜtbMgiƗ0h0s*#u.:ؙk6Q.d `B@m! Bނx&m*4ίQ p7@&(ƾTcúH`d0ڡmNX&m@",Z?袢z+ $i=M."s"]MaX2ib;X?9a mI'Ꙣ9:+^6@;8Ie vieJD1,t1vN1zM;8zq fh`C (Ր.AVvT=Zv@UڨS0hՎ6gzytD:I6δ0]6aWekE;n> 빶:eT*/C]lccQU,%\nʥs #aĖ3џ:SB3X"p]bR\1ËI#C3.q1* .I׵se":>]C6IQ҂:n2 _sۚReᰰOvgdVx9-ݱB7 )-k3q%-OftF/#Lu me0W6N'boﻊI|$9Ĩ] -rREac1U٫kYԤrF)lliz̅sN0<5jkv6i-t2!99fA`m3k[rK?WO߾eA ;C ZܧlF&K&&5OLr%˖,pM 18H3 Jb.MLSF"Mt)ӣ<Fq*դ k…R7N:A :'eS;1jNJc7v#¾mKo׋"P-Ec }c7Ê] JV+حhb(tƊ_=+;Xě[\:Q5[kh <eqzqߺ+8a NH<ᄑ' yceo<5f2]ݭ#&LjUS`SĐIo brOq2;D I:I@&hxuE\G[U#_Egv۹E\ahZp9B2JDP_ ؜>cM2yZl/n[ewCrAq\y7F^mUWsYGYZs)UX{doVdJѠK'^M#EmW%IY=0tbPDJ;T&KbeeW- dF\暊*{]G'Cr'EյiמVmޖjb "xEc-zP[=ۜj sTӂn^ZXw(~^^ilG׵Gr}YfRX)-лH?aR*+2DH,2 Ż'bCGp`peNnPThZ@=&Ǻkszi'%^⻒GR8XѰDCrrI> Qj #GBϻAO "6!udwX.b4x5ׁ8! :DTJ:4H'^SVJO22L4жd7Ap0Į3QUlD4S\b\4꺊چG%{XJ []Nf֖NЌ+ãč}KIZOhnC9Orv6Mƌ%bNZD0%O5`P)44h'Ӏ#;y)'P9\;Vߔ`E+X\/TagGtco!լbSC5F362K)u!@FFkPPT mh7HNuCN]"ӆBgRĩ-GtL|_7&o&`@=sč?<>w^:#Lu3n:m>ށsS(e-pfM1=نY, 6]uQCĻI.X(hE9bzκrz):l.(.`%m%e8Ӄ(W(O f[KˉQ,}P/}CE;HE:s3l aqiٹJl$WsaҠEP iYH)6={! P^̋} S a5aag͂=)$FcOw\x % č2 ڠ ݬErɀd[{MNЕ&]_qCW&m)`dgI)֤ M` L L5!QئaEDd,@_uqG R(ax $X, NO vY|$䌇5"x H ؑ[I_VaK,8#9F8] eBNӾ"^8"̃:>p]cQ;Ȁ]>b:fQl&B@$F]`N1 MI圥10^菈YG2_q1Oi'-]`4fFK$HG E-FabSjUlvɲ% DTlEIM^Mak Fp!:}_@C\Aީ212!Ge9 &G0;BD0@>&Jtfgh(8&.D&XuH,͟uN^H]By`lYA ZsEt2gx K"Lr54$emX {v$Nԧ툄EuI!N͑nIU5_XgaҬ}Y\bŅ9FB_aÈhC!>B<<-)!c<<n OL,Aj~1H-re=_-2cp]P(Ŕ%AEm*bش\BݘиPdߗ"WA<P TQX$5ާ!O"iGzI$½"MG9a2(<ɗJ|#%_.Ff"n>CD;j בL·N6`q뭎AD 8'ZMd4HUqou],n`Mt͐ĕ4> Lɥ5l֍ 8)q +TZ +ґ ޑ&-uC @ 8b]ņj_:*#j(|(qAffeʀR&;-<jhD__- gia$] YzdV&Ax%QpF-r`\1$/V߼Y*RX_0GR]ٞ3V}$%0fqG Q̠OKQx츽(%_,lFD C<"c@lDB /G Ρ̰ҖDA~OXF % [Ibp(!,lؒ*LjTE_iqej eRQ1j2TFL6,gT4Xٵ3!QȆώ4Α|#)Rm jGD[]@cP*0^H>,*iD`[+l٦\ýH_M7U;n~LD X gEgw\xI5Bi6} !6=TpGbg^VaV}p /ٿhөfdg,`љ3fe3sd0Fm S2I Q]e>2%tTq$`t  m 5en#^s>qS1G!ҝV/Ftr]+`m8e+*KufmAYV$MRVZYbL`pbI|eRiZ2R%rF'9 ݐ%Z})Hp03N{6BY<7p$FRiD%@H5v(rd a]}c!SEڞH MN$Nn0IsF]NylC6g#xX LLscU|a ў;OmhhT*d5Z}-^`֍%F>p5=Aɇɢ RU$cHe2Q.g<9SV(8Y;T'*V' Wp,)9`+ݯB=\'SE W*'9= lR׫%}.)O)$Rhوb`y3m("p"5>;Ƅ2ĥ.#[ѿU `W!x]C]Z@ T2jgpT#e1D\ 6J8cF=oC R8bzK % ϑJm&>mIJ}ՃVO2<8p_4zۗp>Q$Ai,)R}r/>5jbRgN;y3>b8#S4t3SSVzkV8b^:д9 J"3,X"ZTIH vpB'YQ"C}vb 1<`%/fbv'Z$H.^$5J+n*Y$x9u]ĕ7 t,֧]Y݂M`{bGu,w ꎭK|9b]fxqb<;0 ""H X#I/H;*+M Cj!42p+2<U\ Y̠{B5hr#.41z p[h}bMnbQFnAX*Ũ}hͨ)bBYʂ,7u-<#@msϷ29R!RaӍ?TdK9,Mp 9ZU8#$*5< -N4tsSHU7=Դ&8;f'UR WQ*7ĥR=pu=tAy9JK R+ŲKbiVbHԊ&DL2 jP& ˵{9 n{/TKrˍQl9|O2sM Jϰo8ud<疝K΢p4"Լ5z< 4|yp+1ͭ=f]䘟4k,;OB/լ&+:6eFY&G!{y+ =F2(G?*!ͫ$NLޜQ0*Kk׽%,d)|Mx =ē jFd=ܧIAM/8I$ЃȡZ1^Hv}xUޒĺ%v*K (WɆ /)L1VL1#&p{CN\漍'4Xu'y\~?MhP_ ᨨIq&dYξ9N?"FB:(P!ӒD\2Bxr){ѡ4B'8wT?29L䖖Î||$()$CT EјQjUfWiU' Ec}RS%4#cHCpfcC9aG b ̃)CN 0x@2p äa` 44F\B, kB4=.`^E[4mt:#B($KgwN~Ybdwp8|k$fg_ $]p= VN U$Ni#|P%CMwO$箺Yy>Q xWAk qA?GA]Ol45:zXB c3mrXǃKzEWM^hU1qa\dVJ휬#Pe8 07hOɄ$1N!X 1=n>fG3Bg;ϣ Yv1d)2@M(c(d&p @%eca'B g;6͉Ҕ99xP3B9AΖӣUcBSe]`T/iX==T9z9;:L==&Fi s7~nMTun+9n5@BLc*(]h)dD'&id.q((zۢ'I*š&)M)D'2Ad `@Π' B^&(L N*p%(!B.'Fn~-4s+8&mJ/*bd h"rG M&C%>?.^NRNlJԭbD*]NnpEgT 7GH">8:0$e0|J->K9Ù̍E\K1֣4mr Zd"LX OYo+4)4AX~d@N P'v!Kr`h ' njBbB\%O) /PNr +mPś|LdPmoҤ6X.ǠnŜ`ھMr B8:#t8Et$e8'"Bgь`fLr,"ނ Q42mi(]zcBnE$Bc@Q€q)B+Q'Pj (dYP ɑE\$ qb{cF !gR\؂HE^2JPb?pLcH ,>'Vn!ޮ":3Oy<&'YR b JD3Ps 朗Xl^&F !VnUH@'v*!c7,ӇXBf@$ ܠ=uBRʦPR즸1V6.Zp1'(,J],rG{^܊'Y('v2fI]PDҊi QC MFo9}?:4O9 S`qIMsnň(pfoJ, ,h{R1!x#Yے$iXGZD3\eR!f%j&S(|<p +]Bњ1#ldҘF͎nH8Rd&6c.vMX1׭b&*TIRn[VtL.&n Wmخ4I8Uub9%9 Ȗt![rH:O'`EViOT81qp;NLtOHSj`"P2}C"l*BxA pO])Ftr^/wY+ȗ 3:LSk٪/HPTȜ 6T;IQYz82fcO ۶yO(V"8ڰ)+py'W`4h'$E9 רasaehPfprvv(#@wn- v#wWZ56s_T4%%z_JO8#4ykI-NRp 9ʴȇ?B$֒\b0۔7g =ᄮW] |آ905ԷVn,^D%s_p[GY6dZZxF Yx 4v9ǠgdT;VIh`DњS.T%]Q$Yso`[Qm;5+7)<T-24/ $jfr23nE9<9%)Gܫ#21R0Ư@0y/ b8KTA8fj-iC?&g8e1+(]ćdhɓ C7 Iԍ2h->ӆ^\¼)RkɟMsbC"`E H1<Vd.XKɔTpV"tgueO]AUePԍ"Cmw&( ]o2@R 6?6NտAwyD’*2a]OhЀ{g[˕\exT>,83j~$f1NVi&eyW{fJuڂeslzwѯ:1zuqѫV{4*F?ߖl匊c U(a^m5ܼs3e :)R;*) %oM%w -qfw\4#5H"}ɸ~؁Io,W8a&Ƅ3G7ܓ BȀD1߂ 6B>-1m&OCՔ`8VNu$kTUl7 vXc[3(ie7YlS YLTŗdqQ]RYt*T0EVJ&&X[F"fw9r#e1Ng%FQ*"jigTW"yؐrflĝH)WGxِ>*\䡍g M ɐI `(U=䇀 a"$4>6$}x$atiVcRJ.O8vW t Řڨ]&WRlݹيՎ+S3N&0 uUa LJ1FQFEfoMn8,&_!y](gK-MNmƤ2cz'Y a+ L 0k 1i=r\FBn!&3NlC  N>\W^|IVBfGBe $;KcE"$Sr^ۍjnK;p6\SHUV7 O[|:7)@ho@#̂^s9 MJNW2wưQQdoUK"Lu«c`tI)TTR;_^ ;uyEpIij83xKȳPȤ25$2An44rD< R Rƨ Ў4HɫiUӿjk}HV4I@ >Ab ҰG'B壇,`eO^wЇ6+xqc8">B$(]G: "Ox V]<md[a֍MAzve^畛Sb  ^i 4H>yX@<>C}"Y J; Q~DK}q:/Q)zTԊ $./{gމk1 _l]0V!|'Nf4}o7lA_n]XU{A SoC)7yzJaއc {vOgm:2hg847L Cd00@6Ad`ciB*q8o";JvD>j-m"Э  ܼah6IdBB:/)"!N]4Qzp:Oj2J:/.JFjcg0/Y#gdR\]A"#K'=rD )JZx*'Cq0 ZY,n~ n> (g8Dew`]ow*$™ vy"/ }g[f/D&OQ洗F ՟s FF4Y'IBnX03 py2T )aP2tÖnYYz.Ia<)uưUz:v(d,D4160 PmtZx&ˑ3oP6`-o1HG:I&@g(($@Gj.HQfaq5V?DH5!t_1'% Fd~~r$@z6R<2RxD110"stQ@>yG`46H>{|A.9*aWbfv6ip09@VPD7N*MQGg!Q2)7/臉]}zN'G4Y20Cb;!bji%>znEI5\OtLF%gS@5#4p60SJR~8e2s&c4#o4Ff"H~cL\(461V؉5e)^tQ\.+hSpGaxsx(lhPbelA 8P 5Qԉ g"AA$:.#r"GK2ui!ȊB?+]AfĘ.(`x`F/Ravv(f$5T߳r˓%E1'i:CR4d=\[X.Cȅjz+s(^=LSRyX5ܗydQJhD`3r;y[ bpִ|ٗq<X!]-5Ls2faHFN2HV@>>cr<^(2Iׁ1r> ^|QX&xu.3Qs_KguT$u1'nztAG5['T0#rU%I/g>BG;;U2#w 6#8flo,M֗x yEh8VRs$aG_H}1Up$53it_$*Jɓ!X;5WhXli&8!g1(s1ts˃i4;W!r4^ RE1#sUԑh!R]/Aw0v"t勆&D|uybxlIhfnsȡb LBU{9#Bcs7]%'G%z"d4b$4_54aI@FC:$SR<2iu:Bi5J4KU]zF%vp!17^VUZxeO"!2VvI Vrdv HßxT8zi` Ӣ=E;9Ytbg8gQ$%EWaH#k\HxK,3.jㅖ4y$$aUUa[3IsC5qB]GI@RK34g.*aWw x)X+{yFW ȋT19otLs@^JiaZBUG)t?HHmyGx@x(o &>'Fo[e(݃zG1Zf4Kw-xt:љz]1.gq(u䄝e˳*cZXvd!G[*.1@Ej jJ`(':f%K/Q%8`"1$W5^*66zL#2z;.~fRfI2#jir;Bt\G #H%뾠+.^2_P9uuU @q5#c'b,`&l9j¦Us)e2I)F G&+fVf}O.iFbKxJEjCÑ2ZHqf_|A ^]4}fTu"C~f*t{(vhg P,|qɅuiP5jwTzF|oƼafL >ٻLah}3}}'/ݧ#fQv1KI>2"`{jahy8ԣ)khoS^xe\%f\t459V(SUA존־;!u\1!1lt7#S})#)H  `dPaH$[[BD)츛NbF@E'GJ S( բZbp]Dȕ8%fiVGh&7W:S+ zcQ!d:ƧI5znI>v<I4zervË(S9JTZO#֍Q/AO#Vf3!sG9F'Mh.+ы@3`*P mp 7 N`54IY+RT8[[L69Q1 YD rmmc[)lГ!܃ЭeR[ezq]XQC)`TROVsbƃ.K3AWJ[Q"G^O D,'Yt_X,&/V!hG`z`1*W3c-VţNggJX񛏈)f_\Eݱ\t5J!;0oyQb,ϒGĘ.td-P9QX AL݌"6վ5x_Jb/5=M9EWziιNXikETH&D%;NMe Lku9CX\WYB׆ /U$uٜTS&`R|Io8y;IYlFPfvAn I"eG$6c9;'8--kIb>ngܓ`Nɵ[+ :-`@Il=XA?p TNcV&;^YlT=yZCFu/btj2xticJYrY͎1tP#"3J:rPfX^c \׫FԬ҃n|/`rAB =4͟W&9Ώ}E)E=Vwdb2/3y]|ܥޤ*9W|ً'8e0ӻ7:)mJugH=v{4)[WNQ{.7>aGaI%= 9聕1{c˻ºsbY8bh#Su *KBAX{5̟hȒ#)_y+@Z\>sEtikԓ!{,DŽTH;H)ARA+ӯ|),@$&},xQ,O?[K+5f#SjH;%V\Y1h)[kh[E|DٿU ?ܙ#t'cvBp2btAIl;jhdf-2.9/docs/hdfview/UsersGuide/images/file_manager.gif0000755000175000017500000012412712050301073024172 0ustar sylvestresylvestreGIF89ak3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,k4Iҁ1&D!Ç #:qŊ)j1#ǏCv Ȓ(O42e˕.cœL4o )fRfGѣH*]ʴӧPJJիXjʵׯWÀ*6SB1@ ]m[mʍKmۻpk/߿~,0uU,7Te. r˓1[ޜ93ϞC-4ӦSzrլW MWkZ jS޿}.ݡ+srK]سkν;b(s7L7jo,kq?<[+.~I-U rٲ9,֑vM-~HSsepj,g9r뷷h>P-`1Ba827>*#.nIXt!ĽG#27>X*@sK6X݀8;~1ϺVϦIf~j4@%r&$zp?MIe(ɒvki[ m%6:D7nӆGx D1`B ܡ -|) F.Dcf.p:xAځ]|fu9jɔ4LZj `,id60U ($S.nt (IU,rpP1~vd$UrNˏtfZ4V*"Q >-1Љg>CN7[M i2@eXZz b?;+ht±♇a=*эqP3RC}}}fmxc,lizZ\fUHAҏgh  dn7LIPmŨS 3+/,QCx" WԢ_a_ed1vx%^Bt śJp ԰Mj~ *!0<<[gVqcR z՚WYr9^8VF"fQb58ȭG}teu}"dB"@{S57[FeޖHPf@rI/xD,/R9T2]C0%tw3FH2zrpggg =؃w#P>o@Uhkau%  lA G Gp}~  0rtjabF|h!wfY##kf"0ރl!BZ,3yZjL/G\17DIu@ %/U/x7!5ZAE70D8cBB]!8(&1|t^ցrp` Jh HFVbhCh8?z` L(kV%u XD o#   @` waɠj!kg=q<}H0S0cW5fwWBf86lvfqqQ)w?%8#d.4e~/x/ax3.Iw҉C&G8"QP$(W9"C&PB(&(qgz` ` ` P Wٕ `)\ _xX ݸ @*$O4P C0n`*@T8`swjHk+JC~NcԐzqtEmw$f勔0AHJ95d$?uJd e%'#ej! TēxBmM€{HhStn+5ey4[ hP#fNjuvgSPhgK]0@ _)__jE @WD"uxCPn@Hsvj@   :"рi"XoF!T5B'f9X1ucj֑hR6c8#G_Z0BJ+e(ܦ{JX@'6}#\(R5d%>T9q^2 (yFH|b:*b Vy`{ Mh`4 ps vat ڗTpa|9+ >|8%KmrZw%YflŶvum9>"R@ 0=#[Iؒ DeuIx7Ji[Ҧ\D1|, ygw#k: etvts+0 B A0*B:Я"hNQ<6s}qss0sXBE~x(9S9djqT!'l69VmBvZGjott6G e6/&xGf,c&Rwtd\I[#&w/?㋡1CcoGABBK)Td:Crf[Z{1;[`1P뷎|*q 1QQ~p@acEz<.{:Df8dfaY*Cvۮ{B%uIvPk,q^"0Q~#[mwW;RVµe7iYZ\5@U/z&յx|16.b.fJ:-u^q!tB3kTk\35Duא%v,6c*r@f%ycio#N GȻx'yR SөSw@.)/?]G R%%roWB1UBpc0z ҄N v(4 l4cXH: Fo"utqê>6ZlfFW1#<>g[|c-։?yDvжf!3I[I>,\nP8|JK\Qhac& m&5!v̘;"ƑSr| BLcp}H I!4U6Evs?dHu692}T3=H&>RUΕ`Z!vA727x}W@ve-@\@QcZSY-1EkJNP9PeTS ffEGsT <椱)f omҦkO5l!< G4,mt4:z6JGڳ8=nQdI%ɕL7~4.w1YI/yIaQt:lbb)Q΍5;(C틪dlq`e*%(OQO|/;ɢ[S68m?| Ζ#8b[GlktG5Qye{öuA/s@%AXI2I; ߚdmezvx#=wE{#=M$wWr<|^M!ؙn$oʒK[Zd7mN y->d-R^>A03lBmZ~ÀbH ,/{XY): S[m8Nː"vLQ>rؓJk"]`GWWsFaNN2NLNRN3st#ۅX33ˎ+=w11b.~Ӿs5sh xXsN\4ls$;xN4R=dEK3 l=jJcٸǵAFV;wÂ+on8m;}߆7fC*#˺\B 8(T0Rk}Leá"<cF(F:#" ̳#alt-"MI-Ȋs1dd{L,;) M3Ń1e1l[R8cdʽj$L6$N7=쎭&1I"" ]T6 PDM,El =OR=O6ƃpV[+)ւ-h+- ,&oY2%SKfQ3<-:lutDwX:4}g0:\8,Suro;߅i;u͏ЭkߍF.hrkEj߇K@I`T6֚vFf$ߑT9W?p㱉 NmsL+GKLG,ڵH`ޭfT6LvrTrvmfW)3&_%sp4Is2;lH 4؂y+?KVCnS20Jk[)*?LTץf:ֶE ڕb[2["d4>K]$k6,H<˨t?6j\wܗIBld7TBqT|JE\|IKn~ w:F$ PLf9ǀ%u]vG$>iMY*0L/udPxT &;6Xּ'Mn$rhl[H1,C+Ft&UsZRҐnk( /q+\X=fc!ؿݬzk垒Ő\+Ozē=5 b:6(9A{GD v~ 5r*)Էױݒ>'s] E)6l+BrV[vC!_ Y 2M@2bI2Rk`{]W@\אzWdX \]hOYcq}9`QK2RZuvȬ- ^~묹>)5!Ҏ4xeA@;cR>wnM*(z1xSt 5Tat&ndy#Ut<*'v9 69_j;鑃,ɾ `I$WE5'+Mu6ܣy _Oa)2?a3dQkjFQ-"[b捆vQIkԚs-up::H| $vTu4-*M+uXL\?KTcmȳtv`=Z<׈fVt"YFq'o.,?`Mt=/nEgFdW!Ft@=X3piw0 |[o/~{ !C8pK8~|'/yS~/k;f'3[-ZuDl2tbIHY^lim߽g+Kg;'H31eb^fGgn]~;v P~v=q{ x]<>wW~iw<xɷ=voxߝʘDB@ i9*;|a3oo }T|/=41V V_ ZKɿ 7fCgiK4^W6DNI=`{uK ^$)C ^,U[za@K'ur142j"3I?i@ {˗ች@銄HC7y p=HI K>4ԕeL?=K!7ݠeԼ[`EٚD:!Ѫћ4IN+I YvGB2Ϛ"K(6b޲=%h'9'^Y f݋I u$xyFIƨH\$\= [-;LLЕ-[쟶Vʾ1Ȩ3 dv]Yv5vez`PXdh*Շ,`USܼ8-6Q8 IZh`aPQ}}x'zM͑i)C+dˌ![i086(qm@]M,Plf~X$ ;TQ.K~F4Ng$ m"5%* "gR: =c!LZme+ }Xh`|Շ5۲X`PPg}>.?nfMc.n .Xh.0>`Of Jy D-:# ffsp_R 'fz.`bL_H8^.U e f QcDP: PjAEyф~ l dҴ{5΁}18jJ2(H_ 嶽 ZM1HjF&oS!" 1ҌZ]Gi)>Qcxl?ԯCH_\p:)9#OEJL(nB˯!ՐHcIJ Q, Hql(qZ~n]!Y1%e?8*_)cQe,ۣd mbx܋U 4 =dK ]5z |肵`ٿ`@nz!PcQ_.aC}XH.~Dz`n dO)L4Cױ o`V M`Ewއ5tJSjq\+іQ2= X K 2Eğ0 +aChqPh9e`}˔틖Caˢ- eB$b(TVڲ )[4"J KPBIl 7rYG W6IñU>E'ǎ06oK1~+#Z4zдĐqEq]q I'SɛZ"Α*odpYxhؼ` V-l2ӋoV>x !w4葡V* m_d%k% ]:C;:weӆ8ε׊2xyAMtۂ2 JL@tT)$ MC-q2?O)䜇IJRIPyiS) g-T)M2TiT1F0Mi@( ;4\]NRBAGK 4u[l}Veviy}.0&'(aΕ5فi5m%iїi]CmѴvE6cZGSVM|Gsiw`zEeJ)|N\2$=wɪ22Q2,MtsѤ$K?tyCuT˄L.BQ@ P9Giռ {ia4٤NF,$@$2>QdHhU{ZRYgٖCIM& {*W=rjyE꩒a)|w1Q :Uж0&]Vz^"ItW-YW-l;A]Z\Wv_ln֞sM.V߅77WP^J8TX2GVe^(USDꩫ [)f+QIFT.WhtRKqPa)VHnJi5FzMS'lo>*xvxF4t[*c\5Eqb3o4[#^9e=QKw--p JEPToвr5oAO>6TpNyɛ ]hP!mD"@ ~ *_7P-& K2 &j\AФ&q"4`|X;ۤ9ǀNifiW<,WƚrxuhZ"tT887Gh⣮vC V"ajjȱfkZD9>cYݚ!Ȝ(eLŽoHDn·B HLf"oɻdLk siȔ|}&x@YC)jK7}!.WG^6-X ;$B4JCD’5m{=Sv"*GnO氃h5z,:+l`(5rCT 4Lϐ$5E0{ xŨF"#" qR,rTyE )%@q#Q?q\nv\"g5mhe<΂xJՂza@jM<-n|ZVGrAfߦCi˄A5C&8PTTIXLRbV״c?R:*4e7t$#,pU\BޠhN |T=Z''*k]x&MLAQVflS}qjxQXGX}P dbaS4T^+`KlŶ!>ůڵ>6zÛ,`Sm*LAfo_Pz~JQHJo˙.oI;b^I]fxDTJ^b,cʙ2&+[\C"&/&EfFp%_rg4gsۼe-gH_WRx#%6Unm&MAJMs+Ho(ބQ jZFiu|G s:XӶQ3 4 _.ԫS 5(?Mk3[d1Plf~i#+޷Sō𳔑 )}[MC=ZTwFC%d[]#|4޺EeIS4R=ilS= tŽ ;9W.wyu<:З碧M/z]{^s=cVϺt+%VfItϓrg@=cA Rfҁ0e?h)CwK-+I8x]nö6mHeI|婟O83MQ|:P{oTxϩ4h:x~p1~ѡ}o;m Yv?A5h>ą_ Y _wq\å*pǿKò^}!֜L5JЅUE\!ҠEPi 1fT':wZ'j(X@EЕfnO!Y挦MtM\g6ȽPb lƣC^"֮J~$,eMSb*M@>*/93'tR)(^_5YLo+2^ڬor꘸(jz\بiɌ;#.=m1uf qJe\ &~~?obr*%}^ ̈́顐]Rmy_`aE =ez)5z Z*٣mQriV ^ta&(:na BerV"%iԜtrF&yL"nƒf-3xoi^wzdbx"ҷa|g!&bMjeaJBDZI&f$U9 ࡑŎ"ZNt9ʼnMž)B¨ eߍ*6njjQgP#Xjcm^]QʆєN6gPM&ȊŊ0+*&W2k} p::hr4VZ?^rFӌ*Vs. 0ٙi Y011/1p-Scp'qqWCqw];q[1sxQg qk)%(4xh"'"/2#7#?2$G$O2%W%_2&g&o2'w'2(WrBdd$DACI8/S(2,Dz,2-ײ-2.2-SEX\Y$.32'2/337333!Z *Xo1@7w7?8S7s9s8:3;/)sʼnUJφW>73@?LEs@4B'B;r1%>@rEBm ^F?BsF 4CptG4I3QZ,Ij6FH2 "MO4Pr~dheKul3M?r`ƾUoJ>UCn[0],Gk2D5W#w#5%5[WZ5]"rJ׳]^inFN$ao.DVVsUN'r7#r>P6$wver>t]]jT{%J@zԔ6cSkYgu\Pc,̃]$>l jsur#H6INov_]<@Yȃ\VĀ8E7tӠ@ո B""۸ixv` 7b"L8Vg5M Xu)9M4x('S}7w~3c9i6?>yWH8N=QKe/ZlP(rO#.ąx&Vu…;6{8osoA8"Ӹd﷪ӄ;o"︫9+pb5xU뺥_;@8 J*FAp6kJ"/CTC8wsA/BleO5Wo& rnzU z@c)>BŸ5W8gS6s79i{}56c;ǧs1ͥL ,3BYvmO/_||KC;[.4[C;eËSyʓzT{/.r׈|Y|xCihAsK0EG{wC3fGh'tʛ;"C\7U/pû{ üAg|>T,ݫ9}D!@g[~zC!_l"o8Ƈu8'`bWll; Xj'r˾%~.;6 5䙨љfG85AC@<$ +2/~B"FbbɧoXF73?#?@80Ǐ&TaC!F8bE1fԸcGSoz!)hp a(_/G?:hQG&UJ4$L}=hc ̹%J)LsiYgѦUmۤ!J/Ke¼G=toGmaÇ'VpO~^ j֫' sTŒA=t!S}4ۋFבt~6wo߿;k]Y~-->zu׋= 3lzUupR%KAk|?~}wkz[ˏ}¯&S%P4Ⱦr@A | *Rɸ @+Xڏz[r= jq!_K )2 %ȣꮩjnP!q J$lR).n"C[Fe *i0WTE&3GqNNN$aSNh$%T@8p!°ANz+rhGuЃ \' qӋůqrD*ΏJƛrx431&S>/g$b"=hRk bRxqbQqX"n`YUV%E^&@PSM_(C[HP#1jbPS;U,#!&ʢT (MKm$wjI$B(uͺ,It`T'tiɤPeim27 U"))RiԬD4EV5YLӨ\&9КWڇ,&Kk4hSuLJLr1~V5,u$Yĥձ,iz4x7Wbh<6=Kҿ}i]%/cMY^3Sd=4ZFȑmm bKGUتpC0)g"&yDtL\V,&C?eQ9kRƗJMD8SH*ex:h;[Ntд**DQS f?dp[pDayL y\ Àjqq/":ֻ˲SI 2:VuR8Ґ0k aGĶ5dWi\M"MGeΞMt/1{ Z9&&qu44*d(:pb !ah;߿FYt0v84[3f0i:Nq!03$‚ghclǹ@%E&Q!$0P%L0Nơen5%MQ+/Dvԙ'$ 2kьָ]iT.nޫaQrwVY~$"%qNȄampP> d!6ܙ̔A;IjX@Y8v6q@^`*焹y )59!%w*a4r\,5+4(Ļ>bypʚq/~fC-5h"3FuB}/;K=CJ}$eo1u*%{plv>*4@ۯrˢRjtF!¸CR!`&Z-sk0*梾&CÞsxvPGB̧5stfuŨJ42_鎙!P،Xt<]\;ӎ/4 " C}ڇtLnW4$cmūF"t*xc$x!l/!ۮjp pn/ FRV Bhp0lP@f*&n@O%P K"#H"f,K¿ !DZDDp򚈒.))䠴IŞ ppj&JScHn>Y.Clr`X*q, ,9plxJʊUB1X2ʑ~<. VqiJBrG%`dCVCy R{jO<ѪPĠ;>ّB.0ff/pbֱPCZEd´lb C=Xq! Rx+o. F+!=rb4j;,YP*ʨ x>2&(cY%iFM&"cj;hCY oX˾jbjr, g F+cFp!*L,}t%ѫ*r/c%2I4Ѷa,!ĭɮq^:Dx -s#c*4+2tYD{oe~RdjJg&L ŏ5c!)d/'Μdab0gzfg[6!"2< AD IlK4!qgPے WRHt ba>2qg`ê:+Dڌ%6w'j~T "U fn>O0t(CW%Ju+#ܦ<)gN!'_8l kGqH @tHdYc*2v"2O ;L/E=р{(`C19jdS) _%{O QPg ЌL 3oLTG,&%#IE&q&2>% # RCDUGɑd0R-TdjSQp5 XJJUq0 RȴPw A91Wu1PcX+,+7 V"5Y1d"-yCIpKv5[u-U՚Urb5"5]UY ^S70R^ 0h :cFp@un vbbW E;OKYb,TҤ(vdB3̤H:ccdmX`LE$dATIf)_JJ߮iM%ocEig#RX2Uc@;L]kێ vksVzS|_Qwl:c//b&4"'s@gs GN^qq1ǂU( .x(ppK={pn?N6(E) @3"W##Ym0z2klL,G.>Gh*T{f?H Is1/DgQ4L MjO$D,sV!!.]Biz"rG(u|o A t&p2oFKeϋ-YYb0f9tR[eivTg޶fFu)iZ-H'ܐi.L!ysዀBc_#BN͓eauo^ldh&W{jWv_&r v=铮rS0Xfd d y{$(IBkc.:v9*9I5èTd γn Gh>!k;I(b&VAys$N;}yz!DL߾@)3U$ZD2ֈԑ!cU5*\;jH{^GKEt5pS\ `9_bp(-: 95,xX+bV!g[:9LeKL3ifJd*21c5\s &?+dy9|R5\IRtSFIlq7SJ 60'vEkmt,/41대vdd#yQ)RKK{GqmrK \qK["Abxng$K]X__b*9 7Bad@GOyj𻳖:QQCjӃQFJmjM|dj!7Je9f<4J -Elu@qGz ;!>SSsɃ'<>I ,V5CxZ;ch OO||B0Gxxx̓Jgߦ&A~,nnJbsk?DŽL0_%pg6ANJStjY{хL!G5a10Wו1&L_U XSXSPzZ70{w׋LO鉀Dh_"G!%L:L7W$85$k}*n ̯ɾ wnizdZg3a`b!!Dwl6P-?Ҙ^7f8:%x$d +)0Z(cq};l1ct n*9s"6"*>O򈁟r#z.hջ4n;nfFV=4ҥL:} 5ԩTZ5֭O'#8p=ñ/ԲeEcv-} F,U_ÇE8]pN'19r.'ؔoF4_w߼-լ[~ ;Qx]hD[MՂ;l؄t12pQhA绮=4R|l=ڼ-*\].귘ܷH<`&X[\J(l[^AzI~zW#xb($:C;qa֡g2t:c>^ Sr$)P[ d!\tHMwO!!h9<mOYD@dzgF][4рpi2s5nSVC "a'0}bye}1^7ZF5&uފkJԐD%riV4xB aRP"etH@gxĐ"qhcTc 6Ukދok^mD"8J=bP8eXyU JRPoOLqM Y$pè U2 ( V[ߌs:;E`AF`p pxPEN?];OMuV϶WDEl@Zt4Wvn/] m5ZjV(8(lۂNxEu,CA%s_yzۯ5pyUFVkz (sREOM1 * ZcYN| Aߦjz1},}ڳ>J 0ALLH{ۯ~K֞M{lz/PIp,*p lJp/ jp `26@ j>>Dd֛^JDJSG h|mtZ l!CxS$qJl"XąHшP"8,ZQ\ܢ/1dˈ31l\71tE6 "4ФAZXQhDbdqH.,)[XeD$epɯ0RDH2JF~2Q<2@V2X]RY̥)yIJ]V"{)L`br,&3a2͌2}iؔ&2l~Sf9IMn3f5Np|:OrS, 6XC{ps ͆KuD![c1I)lZ4&9|9b@*>.KR*%KҔԥ2^jS4:ELoӘ48iQ*RC5RTIujTZUYTգzubjX V.R6Th|`8m &x~^EjymEa'!&LqlƂ(,e/;&ֲd; ϊݬi5ZϒvUmkCmm]kv-mu[Bsc iBo.jdD6X^kZֱR_ H*]b]׻E{om/} ڷ|0[`+8 F`)sMSIE4&Xy93 Ey mO\~X!"He_mKYvؾ.gXcK?6c|:gKfiwfvdw sF۽e[v=nlǻ⾷}&IPsnH1Hepk,>F /kaV;o~ۺ1y-(r7*'M.Ŧ+yQnk|播9;<0Ё2?ɛ3N9գujG͉|cc`|cYDƂsyۘnrwqq g]=vYq3׶Vx=;^< wW<}|;Ƀ~׼K?Ӈ^_q[x;w=Wy>m`E3(hni5|Wl$=I5[cwy^}^w~s7<o~g~h~ c#A>'vzkG(Eg,$o_Ѧq neCfrx@*?,A+8@.1H0h-X8x/=<ȃ?8;>8@(GFEȄH(NHPOR؄UTQD?fc0hPC iv0|7-&XaFFun>2{h4tqar;(dvq)WbP%SX="|l6|艟x1>spCrShI#0 W(0bUh%cXU= azHh#v]a6cC |G֓}Yk5kb4v0((H/$)!(G #B)7T8]W6f]ZC^9U\ !娐2a1_<1c"b [p5#Zrq-֡CƵ %)!E;ᅐ 18Cv8@ {|sH؆"DTDA&jfy(%X;IC  BB {%76=`Jb&"P(2/23)@09 !^)X|X=s!p50\DiGfQ\b IpV0 53UY :pXm9)Y<{\%5(u5W!h!Ya_j"Y >%"fhcy ӐXU9yco#HD9"B0p j @@1 )_Bbc6mYCj8 {v3HrvgaUi E 2Пq"9@$PW%(nQgRBJu6yl0,h󡳙 ) !%0}`@Z:YCHXtjz5މWEpيgsIl9Y e.+f @j:؂((ɋba jպ3gh06u;H]rJpp@C]prR>#$lE;j93Y ;L1bS2p#׋SXE3Rh fg&gaw831Dpg D|1b a]'%޳R˃V\ %^9^0C[1#7pіNzt׈~s1XaDG]6KpP2bi,=Ejg nѦw08Y5$b Z(p?;˼nmKM";B]$ }]Ym- mz%?%/&!M Ϭ H"d `WX%;kGK%Y D&cԊHaѶ|\j<])5Bֹ:֜U^X` \=@Zrl#ՊHjd״5M]vk׊=lFX ,fY(E|X#)6;!q HC7P~8]cႵmP:Z\x?脿==9/5ܹܾܼ=-Bb520LB[y]{b“buXF}3I}{i W2( )22I~={j2=,nN ~#- /n>^~ ^:EN$nB^62iQ+ӉD툆cc4,W~)poSIչG` 0 3+=\QK:UGkT|7*)(-6T3k*E9cḲ+Q!05έHU%}N=,桃)u6-`G}HT$5FP @}RN(7Kx  ɓHت>Tf{0(<ĕ8(~WQ/y"WIPrK]5ٌtx%VÊ%smmYОwbk5n%!!D/)/a #?~C򾞪goŊoW_Y.2V!ڦD^ޮς4Ȼ#'˧m9δ L7fY(ԕGaS dD| V6z^rB6u8HHP=憌{-ي6Y|~/d닲 w5[fdQx1۰M\OZ g-c\]Eo@S} ,x0}%G/ZG3\lȒ$NJ[tHI )FsΓ.q#ə)W"-zǚBPі[f׏}j2I -PB틱/&p=J辕'&D)xҥ ^d9ĞT> TF=0 D ~=ZPh[dqM [;u9F{YY#G8vaCj67sgioO8}h ؤkqCB5Vi Sn8b= 4cD,。+ /+4p)1dM!e@Yfh((ܫAFH®)ӎ7i[̽47HA4lʔirɜR?&n4M=R?)ӄ5򤘆ʧ.l*#EJ3=J ν1DOJS3 8Z ї*󴞮64T ? Q.g+(zAdeN1m'JRP?h Wrs(5CKFGahڡ8Jf _c0BEb(fѤ5=lw1$rh_%NdX8%8Y$xa8ӕش먹E'^5R cTt+\Q(<86ؒGsy|M`Kj{aXk lUR+ӦIY(t-<\#e* *aV~[!X5FDs.\zlam?j+Ny#bµ*<,$%&ĕ S_x|t.LinDŽرV67OGVif #"VvB\GEc"GH$KF>c#[`* 8aD3P.I^bDǑEF$WgeV0@ڇx >K+`u#yJQgd3Qj۪."EnASA\Ū.P\`у\QȥzXaԌ|TŚaG)b%)7,&H絣 ^;U`D9/$h0BC%zhA^s0*1DŎ3 EJU3d24؅0h*7K")+R\%F!0lbP&5YEv}\= Mc]\/гPEjN$% Ac$3 g2J#:Drfk̠LXCd7 LSrϵq@ZPMz 'V xe4:WARdh#.,ڋ3ı( )%%,dj/ٱNr)!5LO ؂ء}:IBL`g bxjsEA\5\@W-E!2Bb{4j4 hԉKb1婯V*5ENӕP eu,iG/mA(F]AKv&QiU~܂b=d[bo&TA=x"Y孓?M 3^J y>8 I  l!Iӝ$",,$ʓ{HQˎS;.kj:fΎÒgs,D0iC.i`H\ _Aiʳ$> c NIQdrcH&|tc#R,RߏI 8@QCc (S}ek,҄3!W ,r `8^a'|.'0XgG`P(g zxe4ȫ6h(EP3cn,cT.-2X Xۍ`F1DE+Ny&Rc45ވÖnipgMEFv#z/tfi*Sy嶖27Qn6I>Yt#V9ߧvPOUjcdqف))\U2H:#yXAM)Ks3-2i1'7v("2&A<Խ < ~bK EdEetVSAc@\Q6=)]307^DV= Lk l٨ .)(b+)`z4)# *#P" .88c1hx6tSOkó+DٷK,%-|曊Q: B9GTH R z2bX/X #ҍ(z61xE}-"0DhH"4wq:ψ//|0j C*Qz {l=D*#! ˺zXrczYjИ}ZQY@KaӪ =<汍R4z?uS\ҩ.,r@-!E6Ky4BŎ4)V+?#Alh 7@\V5̮ }؛cAU.Hx X9˅xbڬp"9R|% m:@]4Q~A/e5mbPR BWL[#p̲T 5ƙE 0P %ơSTzZ# ɦ$ U5YUzWCž-!ZyZOc@ I dl@eSؕ3p]ET_+I Ќp3˽ úɉ OF!1 -p?%\ȝDo= m]OY ZPŕ-ITh7IcڄL!YA%i;cUcUh;5) _! %]w=r ! e bȡFPdecPT&dbn\YZFٟdZd\~RF‹1ecS^`YOfj&a&j>SfRee(flVm.gXNOce`eufd>gfeZ>/TXw^me%IeZfeSYhgWvfgWgbR f^S>Zgn;<6YΡj)N{XP.C!8)`㨊6 e48I847XjFNjj~N4jꬆjnNv.kvvjVFkkNj맦v~kĆl~^lk˦jfl^kkljǦVZ y迱*m酜ɐU8F_m@VO Y $ R? ̩]MnKoL ъoސ<Q 9 4U2n8ϷK$>Foo F,WO+n!FOin @pLpW]9 .VQ  خ N33 c ˴RGʱ?FGƁ D^' c LC"@*6z[/bÇIoq ԠQT!= hԪ~m[gEޅsjGJiSߙDFiSe e֘ceJYeƸՇX͇r5$SȖcDФAn)VLl]] 頋Iwm-LRt>1hVf`I*E)&CgچTkA QmXY){QGSIXq?ubaUTUYMiךFY(ѥ 7=gyRMHYE^UEVafUibOMOO""eru[L%tV>T&p/R&Ň`JQ{tK9\KSv-r)FԣmJj:}TQ!Z܃b{ׇ f^vśB$F|:҂K]!S}\a{eI݂ןu(k_*(A PMU>ԳY(Y(8-a;K;kZr^ip`B u4PI+6uZ@wl.? V#M(~L3)[\Uxmݫ5[v̵mabVi_Nr5& gPof' IDHuzOm` mAYNשҔz0mKfS*O]rUZ :]C rJ.v'j$WEE,~(C- 4?ANkK\שeʼnJİ F2!#nnj[ByoSC l@B.*o!aݐ6-4T8%}7vRqpvD|rĶցSإ8UYKx*1W!r2FB~$ZDBIUGI y;(C}dfyA$kIi;HD%rMZD6kPfɰ*g/[Ed8!IL5w ļp׬=׫}rB3U^ k/*2ƙfKnb"B`1׉1"mZABJ*D\iFK\aYU6PQx; 5;!X#20Dl]͓1+V,+)fhX !*32sy,c][Up-?ci ()mۣSZ(!s@ ZPk*d5SH}_Gp,d};_)O8e&IpE5s%kBELvX(pݛ'6)EPT80wG*sbQ)t[9~QQ^ WmrQ'_+굿<5@e33$%f lJ[V촩[ҏ:ˇu7f<._yA?uNt|2gNg2?h1fɩjJv,hqIPuWuZA8MT䗤P%u:*g'Ok^I kֳqM*RIAd[I/ҏqNJByiL2"ӧDANd5 'ER 1H\̞kGU0I&llC3![^ajC\ʮֻD'm=[%+ qY)[s9 IOxUHXƥAC2Cx|DjDSPQf hCA\g,CDD D25JlSGsD5 4A4ϝ xV, JPhq 9ɐ+M6e_Lz-7@YY]\QQG)sk(IhIݐLb%wKS$L"TLMM^MJt9SuJԞhK @:hEp Z@N9 D_r|FB:>d^X^_Mb]_L%'Y|&vd_CebQMTF% L. ڑՔA﬊=2 a%ɇ 8h>%V|K8Ƚ[jZA/\]MSMKx$HdAn&by'zf{^{jcϱ@|'b'|G:f}^5CKBfLYS™6:=JL,& TMٕT%Jm!]yZkM&1^u܌.bdP Fq*~RiZ镢@`izN)bX@_g25Muh[یg_R)\@UZ MY'u$@"`lNV _V9<1rQ`1.PuT͑H){{`ꧬR‰ybi`g LFHDX5xH1Dݑ6އ u$UEUےKRN%MmeHwz+2F+ l dHJQpD\X^q(uʜV VҮa&%JD0@ @!Ph8JzaE;@ @܅\R4> (cnp\ X/f4Gu^$wҮ俆&ʉc4rb2T@̓ ,,r̄-ϙfRkʮ41Ǘa]Elnrz!SO/A}2!P8.- C:q=)z0@132r(@C-A=4mH97{v ެc̺/ilWw= C{+3/2p-u/+S1?yS }@Ld(C4P]h %ӵN1L͏nebq%/ͫ;hڅz$ln[dV&3 TU OinLOnc lo4Cwg5GDq .9I@0, p2i} R +voLCw43;F(ϓ+ yb1ZYW>8ӻ0YY5|!M!)Fo}\ȵШˬەWc/GiECcg;|4[?9 ET{|; 6_?w{$l3gzwDɵD=hыVOAh3Ho} (E}(Bhq>#(Ɗ"<$Á<h*?f|Hř"i5Lʙ$Qt"͐/츓ґMJDH1M DZcى!n}kv`˚p2}KQHMR,e/[ͱcȍ3jdǔ5Wď7g>}i*#ulƟG76];siӈsws}1B\Wgm4lF*!b_H+C4O+aFlՎ Iv@Y3ϦuWL7$ȢHҊ h@)=r*@*?Pޢo􂐢:­R"nhz+-Z# @kMl= q7< 4%#̐ҷ̄K|hn929¡E +N'Z7#мY"k>ⴑ%R 1*G*.K*җl/$)5MT4% JԤ.m*ğpJ,^*&^ Ss1:;Uf ,ZP`}3,>CVY0kUF*d *\JSL-O$>kQgoU=Lb5s8sEMnezÚW걝Ì̪z1z^Lzvy?W_o? v-pm5%3y7ɭh"KnLWp) z,rbM*zY'Ռ$2/ ϪHD Y`N7'+B 8)Dcw@ݰ- 3g`ˏAęy{g=뉍9WVD-zS55MjIG359AR; `!\' 0^|wmvu\TtܜR< J  8mFB+$u+*4MNM0Qe%*J$PLcD1e"L9MiV6YUL1MkS48YLsr`F|P]񊛆b0gWz0bI“40LVm9J2(c&w=nr@J#BH8LEQ sRNKUB%wR8Rv;Sj'L S;YA8VU1$Ue*SzTLVJu*SjUDg% 2Q|JrTYĞ\NYQis FwI)t"DjR(]ğ?q$(q.'vm HHj+Z,0])+0)@ӂb*\̲߮`~-a)O^9vlIɹ/4>v-LΉƼј͟L #8WJRw@f<  3˲:jPr׶U]PJBXx5R( Ks"Uwv>,fʿzҏF)sݯn ̠tikR) _5Xr G+&Si tW_,!~mD_W]dwIN*?KTlC8u(n5"iOB/DbL#9d~K J!DƽgƏ>NvT 8*JK"kCR ")Xg>qnxeNiOzq~o:.!h< ԬĂAƐeO䦸KWTN6yi*0w60&l\ tPVn"8t~1Doez p#PH!ּ.wJf'&JNh 'jF~-Nϡx6p RP&J,h |QvGrfHJ*2g/ip:0W @FPa!BmuR/Z~&LL諡bsp#LP tXgEP>V Sb%P krOO4Z$Us#nVI*1~xrtnPMA Ā5 5WZS p hS5S6q`5ǀ7Y3j5`5`6h7_387ŀ8S6s98gS735s8a8s5s8Ys6e:s83:Y395S8ƀ63>c55cS5k6s<57;S:s@s:38k3: 354?SBSs='5 T5)T S83D =6/;s6AmS8TB7{@D:S4C%Ei5C>`7[S;DkI T3Am!MMqBN?4N??dN n6BNkNNtPM N4PMP#QPﴆO_'N-5N N4STS'ROUPSUCUQI5T5TN=NmuV]VVuV{W5UW/T{XsXuXyY+YuV5ZTYdcMU\a]GM@e]a4B96ڥ]Ca]Uy^\C_~]L6aߵ^bb޵a\a1Vcb76ȕc%dE\)6aa'vbueOfVMvfp]v[?6\w[y62g}\ h{ig6ihivi6jvjj5h?kf2A b`Maevcyb ]U]ga`o 6{m5_f|@]6!}6|Vz6}֖{[v|"WmrϵpWv`E6g695grUtts=7me6hhvuVs_lui?6[5ww7wuwgvCxmlxVg^yWgpkvi?ra@[76w7hgfgzBpWywrU|@b7p+7n3}17q#Vo57|vEzqUqtKw~ sXhIw|#؁Iv[109>[s{WCmń;[ww߆7|ՃlkX{KsygXuׇyc׈O؅7+b`2!Mt֊Y9#=7oL5ܶaCvn}o_tnq76o `/W׏QЗcWc5xWvmwf!Yh[EWWwwuEW|uzHw؂\2 &A{Jx}J@ʩyYy"o٫y"4ٚ[(ٛ9ǙٜϹyY9YYYٝٞYNٟc@5;jhdf-2.9/docs/hdfview/UsersGuide/images/dataset_subset_nested.gif0000755000175000017500000044573012050301073026143 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!, Hh)2e4)E"(e/Z$c&;b QSLJ˖'3*2Pire4djҹ0a…:C) fɒo:FjʟhdEU W1ZjSeU8BMMmP Kw »G'Ֆf]eԵ-1ǐKxlVɶTK5V4%[%Z84. pk:R'N>Ӏ;oUK:-9Qx{aM+nZTg\~.GnHU7#d8p|?{eWHe*8Y&7h՘yUvC&b\xC1p #C!(F H.!1#[ĈC/h"vE^JVQq8)SF cDUR3A$J04EO:M)vqw)d]4%&o'UxNPIn1&ho| 2aqyxFSW`>=Ri0`+ h*ib_J}zeYbQjMmS(4>S蕔H15RUjgڦvve*gkЦW6Y|55WNMJI*eϗp8 Z7l3i2sNeJPOȦM#ߛj9^ʔs*2.n  XF ;2c:TeZ,XEe"W6R%+a)9`%pU ζ$gpJxA8)U(LAPaYD vdXY$pxvAa&7+ ,S;sO Ϣx2,gnFT#"WĵI!L)QiRP[4)4&ɴ2QzxS&@1JkbC㯈9MR&b`=q`FA5d VkCAT\W=J4PX\E qUbI7"Ph@B)1'8?C.A75}gLk3yGog|VV4NH  [\VNF #H3B*e:SZ$"+%#Й &LrWAIIL)9`*3WS?Kn+ Xu|%0 7/!L3roL.5^D?uO{(D,Oqg(GLR L&v.ւ6]Tp4-kq ܫ"_5h}tTL\GiQK B+>cghi(QV>s<ř4GğP=gVa=k 2E5MjVp!-/A.dK (q1X;GFB $3Ʈ3p^ZKFu8%V|T?#l"(R%'6WRFR wjP]h۞xK*P08‰t=w]mnӦLW^{9ʃ2LdWRb8xaMm~UGlڣGʹ1 5Y05I_ =(6I-{&pX?9s:_4S>,<h՚ZU4C]rr%{GhX)qT ŐPdekS?@p Ё@o :h9j)! 0(:O(da^21)@suTqKog2"tb#<?U_wʧM('qM[EBd\4\Cw@CN6fjat/0-k{5Us|ԃhPllQENR*_BP1 0OA&-R#-c[-#YaYK;I5$bGՊ)a+}2U>EQEB55!S07wTF2SP0#!a,2!Oa^U;p!R;kv<Q4 P ;P;@IA@ '5F@9 Xfh/Y&c1:*1 tcgunq  B@ >@@5 T?s&A '1 X1q.Ljm<' KcJ%*t'u8K8~OsK8p{(Sacc+D+ؔc!BKvq#.+Jx}wBr__51S@to?'B^s(AQ_ePxqO/dmӒ Q0`m5i ϲx,Sx@qDDFjTT.^T !&NUDZDcw;vN15U)U7 rA@@9(as)a?"0 bIHp9j ?  9` @$  21 S(Ȯ T,PZ5IJ$Jc&IC)lwS2_S>bA>%QqzIp5[Q.fCPb\{Gbp20?DӖ>%d4~Ƅ +>=6]E!*3Ea~Wqߓq855X>7Jrq5db/ꭥ',iqX080 \"'8>> мϫ`Ё Ё? i$ zTJ,9+Q}+S36j {)GSuI@t(9Olqv' 2*$RMU03Uw?{SLEfKYBg{?"kjߤbBD(41sRSn6,bx%1hm-9OCP8v~i5'5‚;^+U9G@!z,bpSi3#'5B5%\!t4%̹tEW`QxZxU c7cE{ !i (%0D 1uf&e +( 9P2sðp * *? ,Pt24.T2^Bٲ]C~4-#J&E#KJPAt=}[,;UFg pT*D@ < kEYe:\%і!Cio!=e~+&aQ me/vCXlQ_qnԶRh{*er?P'֜ (Ul6&z%9LFH>4EQdU/#M G6b8#=7!Ė R]@<=0Q· 9B1U%[ C v <n@E)Py=w@ d + + AQ09dNItv4C+TSR\]2>TZi!95#3P! 6 e4xGhS4%e|LrW1sOMDH@oAl7|p]+U.FvlZB @R 0t&T_ewIKlWp4.SmM :%UשL4;RIqϔA5dE>.D;T4(op+ 44hYÊk+P:ŠL') j؊%m0o@nA!&!)仂if*[f yZ@)4=;",/Yqtj:Oc2zWM;[#N?^ձze|&EL¹+X+6M*cHb q+3,B ty$ޕ5P$ J͝4;,a*JA,{VX*ӬјhQnO;}-fz8C<ͷdf+?Jq40',lƺ(jMȘ+v%ęDA7b1!(KPLتTx ')!初%fn@ Mmk.jff:LX砓p : `]iV͂9}]gK:^*V%S(HØM9ġ^ّP4넲4u%Ρ5DQhYS@5&d[-@x'=Lk,,7qIG.2N(a5.*u|**1r/EM2g&)m:09礑]r oHF#=y!\1A-[mY(e)NɍiҤ}c-\1?B8!C=>p7R7}юFmtig< W6ch:tl{GivKqc|wh\Ã*l@4%75W/4|?$gvְg^l7NLӤ*mR&0P p*鍒4&hBF+PZ/|1F@٤AM 0tɽl; *Ntr/3kHvnlܞ,!2Ÿ5t2L(1p!<ԳO>o3P C ͉AjA'mTCm9J7"5{05Ժ'rjAT$I4J JCL>v7RK-@cž|̰=60$΢t G4Vuc܄MtL{Z X#ڒ #{N NX0b8̱FtG -Ge2@RHJR2lB~iϲ/3A_2+Cy/֫R攽$1hy:MXdc}3U=Rk^$L.EzC }{'J2mDaoRx| &oOOJ&eV@JK$U@ST?ɤveDL8O=zkz"LRR5df*Oy'y b\A|MRI|,RX̢+_ 7qm@%%&p , JPixoAo g8D 5kf"JEe@uᅚ&MҴ1<`p ә Kڡ A%(i'M DŀHFZiqj&dP$KWĢ r@pqy /ZSMT;ϲ :#q h3)#~ 7ؔM1MMK?&QNթ .ap(2-o*97Q*3AI\-bCR?: SeKgS+_b$$|{&9ܝzюAvs$Twr: `0Obb…~ט*{)4'"Bu%(t#GI.e3/``xgY$ă@E˂x0& kRI_j3DB@"Y}sbu/hD Ud"(o8+VPDC?"||KI[k\APo't PS-YfF(4IxytGJ/A<-R NpKFPk1ΙN iTX)ϘH+d4!hgU{Ņ84Iur$[B<&^z7_En4aj[vl5D1}Q $(L&CMb@54~8*) 2[a (9 ),ڙe颟IK&!5ҭ):+ B .&8ݻoiu39Ca-yBڀ4~B4븶r,k5>p,¥"-@.ɎwI"¢ {wא¸1i:΀=@ױ lt" ǰrz7F\(")$++!6+ 'É:єKҬ3X,;Ʋ> 41;@?;,"#!l H`CHK> ss4C[ -b:XÎ ]+Y̡-+-i#>b.ɫpJ()")y(y ZI-8 F8Ë7L,[& ,Cɐb=L˙҄"( ab $.r:*lcR-Q=*EQQ>8P9US@](%P]S#UE=RE !" S"0S'J P.<# S =TDSA=M.%M.kq ɜUY^eR,Uiaމ5RMQR(mP.5Uh5Um4P4n<=r%o=pV?q-MqVo=WA@A}uWwvׁW}XzMWnWـ哈epu=1}YFaڡI@QXrW}XIAeZ<Eڐ%n)YeZ= @ڥY=aZx%[رe[ F!e2ڪً ;[ܷڕݓEW AM)OBۙYuٕ\Wͽ\\PW܊n]ԅY?ܛYvnmzݞVۖU<\=ݛe"5EUeuDe5EUeu=^`M;FVfvޮ R _ ևݦu^J)ahn^:^> ^`6/F !a#bwI⣀(6^va'.!N%*n8'}xV,F.}}c.F )և m/c766&Pajh(a!c"}>=56cXd=vaF>6@Ld4/Z'F Z c\X#dSpcp chUZ}@:6 chP`Ƹzう/eeepR&c0XPȁ! ]cXeevcG& dN.emeӘ(ctk&հdKF/c\6(h&hq}f&n&~l腆Љh1c}薦hl(r~gdlFhVf҈b^>inθ^g 6y .%b#eI}`ڎa7^`>^6 9z.|g"`ז^7vn]Ӱn^9KNl36c9F&nUo^mlP1j8VmӘ-X>N71dFׇB΁E`M؇|@A}~yGYnxq_m>qFocq+@/hV(bIo#rF᩾/6l?j'*jF ^r.6o4'vgdF9N .jrae~iNo?%f un1hA/ ^%NCJdCtDQuFE>njF~հkՆqg^߇Ha΁=& l}h`A^q^pfpއZ]my`P}eawθ-Xvv۶whue7 a(vlu~vbSЇ-gyPh[FjF<.chN& ':=gk>/yG懏xĆjgcy㖿yqeNFv ^wuwjrO[`ud3;f()~afL&~xyVw3ou%uG? )r>sOf_?[|/{7|OW{>|dGf7{jю<ɄQtVg7և*(|XqMG^'}؅8qo֏wE|Gނg[ Їۇrwwo2OpA}7^-p}`$j6p/,gaF+> N} ,8`}%X`†%6dhP 1N,cAh >РD %vF٧)\N+Nq}B3K2+ dÇŅW*X>+Pۅv-㻌\`;qlBzչ\bW^ f[E1]WU\ۀ4 H%ŒZՓVu%(>URWvEX4e4'}^,D_^eۉ !MNP>I^Z}E^,*CacpEVU蘃)cUdRfU*UMr2iTew^-[(-PB%)hO.$;@NDJWG:di!UHYEY^Dy2bVD(q+Cl*Hce'Ew1/"#O+7l{V~ԾJ:{1Z+H/:ǫ/Xw=76q+Z}[Z̩B[5/iH")C4͗SѰnxBp0=S^{7W⍳@4nE'Z0Z )sE_QG_"]*_h"rdT&=EB tfC}fv"kg5 ?Y%N¤RH0$ۉ[bل&r x!}hb5sq2Tޔ"?i}LJΦ&ىM _C@χc0 *+I(@C@ dU6ż @[IBE%8sbQ 1RJ8aGhUH>X#Cڔ"Z,@R@ChJ1x$C ' Tf?9l\I+u8L %wi#N\dvO$bC DZCU+e|LٜHʶ/j% \VB,[[{Pf'5x%@zJ-}lmgC"ɏ`V7ʊV̌ׄWK+;БJנ7μA19B)!歂L_Q~4Ka@lICL†0LBC|9ZtI/kjFyXn)Xp + £H-$F "` uѨFQ Oϐ&eu|&fGZ3o2s-eQF Ai^ *!1eS^taC oPrdhCդ]V!Hhב~5D&k֐ 9@ `״FI% j4},H~ͷ-^*Eu$'YJ3#*WCIN7t],٢ޑ2TZUm_Y^5K|Ieڽ"nVuSj{(LRzvLz(9Yy jܺ(ذ.`Z}Qg BO#u|Pa2WFy,Rz]u>T_ 2mD]t )9veNqLΤphҠE~Y4S Uc3Fjׄkְl&%Z$ uDl,TZF;y SؐVKc!@*=ub3x1rA~vkE[ҭ_H<u,] i"fJ;eTZc`R*sȯkJ2O*ZCN[՗o Ye zwa.E UcJ%QK?֨k 7е۷ 5{~Ke4tpT> +lׯG+QA!ڳ k7'8gp5H<&~(inXHDl լdUJlpk0a'en§vLxbTJ6^I-lSFė-xVXb-VGϽ/g蒉TZ~WV~~Bc Ws0,S0i{wʆ=%Y5!w MkN[ԎQ᫰E,CLeĽ)ۤş; @5VHڼ|=A≮HXЬǕ_Pt V_QS0Sv4-٧2I\6 Z Ww=!OuTRMTŅDȦ ݖzQѧ^EQLaVp5YӰ@ ޔPe rMc3HN`cy$!P`M%1mt̏TyG)&F)y!lf$E|Hlb3bFpdLYYB``ٔy4X:9fp˕}MAD\X_:xwݝVb]z #بA߀@Z 8~l#?iLQ e5Elϔ]iiնI*%t[n%ҵ]Zl5Zač=?vcͤl?ˆ8T$v N=ʣHHS&!qKV6jùpal0% :BF4X! :JVCia兠"V2emd;MHAmEb`2ALa-Eŕ&}y,>L!ʷW߀hfUR_Vou `Fm-oE/Ѕj+&#biĹa gPg ڸʔ& D%U[DT޾k,N o*T'=H&C&`$DإfEq %L$ڂ)C)&JilqXB:[BR[ lE&ml^)[WmHZc*Vnk谵煥)֪vRj-I).-C.㞡ʕFcrJ*H. /qily*,d0)o䫊P2%',:o#Ϩ08( E#S݄@2}oI$Ŏ C{3nBOlZf9oo҅۱ᕌ/o=:=Aьl|+KYK0ro n+G&;Zra-i)l R5-IBuK[AG0㦲.-J'5BpX mo#;.β^.L&7sRwk,;:uAbQu.0b6֟g` DH/J9 N)X.X|q+u`##6n(t/r>or77jPO;lᆵpO>&ksRLX4YGtf>ľ]An!\AZS 3sn*5ak1rαYcs uRG4O*1 vec"K5[_J3%nwnv5qugsf#2 -cv?3,nSø`)[qHd{}q13RngwjE=6OBWKVsKߢ[Dj.ld7m{uDEGb_aGP~771pwa{5k/9_:3wi9$#vhp/oo-s~/7i5_.Ce#vNw6o밥wֹe646@79rukw3p|sǴVD{S~qe?1b_F\e4ǩ6XC/x2E۫ں9'$u~4m͉G<ԙ~H0c]4Y1rԶ lEXu.w4/Xg3C#xq6.XX!{n^6GxyXc=Zܛ:9Jul`S涷Ͽpzʂuג}w̋>T>p_13/c7ȿW?+7|[mbQ{ W;@DA[o CApپJPc}0&|XaH4(0Ӿ} "T"Fi7ՃR>h9Q@PfˏH`h@]:PFYYБ-[*uᾇth ﺥh_3FQjǧ VxLDh*Ԑ_WAGsGe*I3i̓7e)[MȘֱG1F٘YK+f)#}{޲Yuh}RltKid3cw9F X=񧪌::JmC/U+ 8zBN3 1A 3 4 憊)0ƥhn\!ډLzRn(ƞOF"+% д| (46YLRNJ)Zm뱲*%.Zkz ƛթNGkeha2,H։ʱN8r p⋙B+$Iki5SRdU\{ZVk-Rӛ9W/E֓gn?р0>==LQ\#4z ̪:gDcpj^#3SNFa6냼W{ƻ;SFYsߖm4$IC%D޸"~G4~)Y݇GIֵi#@vx}*8s+vx]ZfSn|uH3lbCMޮXE!Wfиuy!g@%:[ D>l[Hn rS`؈/m[ƅX~⻍WxN"`hIB%ש'I<{\\T0#İ+ D {@IXc4!sKBh4> ƾ4|I3ozf{ 6ġ:MEʙ9ZfD9z i-^k6L4ԅphosfΩN*KKZ8 |Ia*$}c&=f;`"]uLDdJp+L  %",+ȄJ%HLn[K^;2ڨh4G60; 0K끯Zx SU!o}[=k;zsaV{p,Xi^GoW:q KW:7wqNr*y"\ cxCC!n\f]b *ƀēb(3àЀao֑lx0t﹵K\83coAikgw[]t3惋<#xQߖ}7`תJכFt7 Kf/w4 ,Ӻ,O_k?{=и#hf''a~VF~#Jz_[DŽj^,`-h 1 &V$w˟-Fdzb̸ -hFe8 N^एJ.DѬmi.V@&oCo+6,B,ZPnTL/xO\VP.*VJޤxD(4jCc#MbC Mn0Lb V`",>h2*Jކ8vзC(O8 )lr -;M@p/KD蔊srQ|nK Űw0憑J[QPnN+OdFMKՊ ψ1~q PVj0a8b ـ +"0 e63p" &)\" nS0#@Ea.#i6uBa1fVqc1L#&V VJ(6Tp&d'kj!j 9MV%p/)L& b+蒮j &5ڲR l1jR`O êb'[-W2'R'l/'k ?Pz)"+{P+/$ NCcB"-xΥ(Rp1Wk3"a_0x,!/ 0A Hn"1*z46#H5.6&Œ5?h51j:sKb#20_$O5Ts)Q:s5>&s=3?a1\2;2?0>s><3;21̲库:_,?#1qo5e5B_t)/Gw*;AsMCXL!X.h7JG#X^Ss?_8L1xmuM jVOC!A؍1x:>uD/+wP;UxSK1Y;v'7DYݳӘ9JymxHV8Uu%SJeWMYoә4CuFCV<zmBSBg5>ګ?Uٟ ӕdNabEbbwcbL)F^AQ2"~4ԗ(*B) 3Ht6"쌜s*U4U3x'9TOZM)}A鶘2Wpa_٬)xtTtu&Y3ׇ+^)v{CB1x?I纘9Au%3DF;xdz$uN!lgUUC>ˍœ>۶ñ;b*eTBFT]-z&""$,hyBYgu%7ڎ3wyպKѻGmp<[X[|C[kx?-"irYݥ(UsۜIW [`[>7w{ۚ5(=*۳xD.:)eM ~?5N6>3ҙw-|-Xk_Uε|!'~>!т^^6wY5ݳ)?1xa;]٣TܬŘR:p%ŧIʵ$c|+ c{w S=tC۟uS5~4%3{% >?|Xԥws$Q6/YZ}Qk:+;=HkS'3;n/tDW:d c02em 2\FO4'$,ZDTPYD Bˤ)21 'ۧeL4[s_ɗդ3>7}Y/'N@q&-i%He%qCu>@mNT(lۺ}v-ܹto 6 Đ=A(P"ć=q``=n,yu0+y ̩M8@wEjL1EtE]&X;ȅy-^5ء/~ 0+WadO Fm%FiUMsݍImah~LmV !bUb v1Ya~wUDXEǢB4v@vb Eׅ2tvqZ&iŖ_UhbezDYꤘdVي]HdkUvN!U7i ]ؚPw.;&Zk{lYfnlR5TyZQ_ߕ[GDJEq]Tq\uE6Fq/{(M ɐ}=}0r! dUm.k$۶e6iٛa8p3;o&=]¹a]T=%nqP֫muzsgsׯZicH,Z! \s@W nuMU_4KXf?{6^ul؎8֞>|Ff|s٭ 1D#iiƇv|"yßyYi ơ*AcD,YQ[pFeSZ$,M&Xbp [܈EdlKLr1d,{,K:Zl.I9 Bb=Fky Ǘl$u}D)$XFe&:$&KB&"X:ڄ; #_ҕ섍=%? IRI'eƤؤ&I2XʜY ]6I!99KMe)WrfW`Hib f(?KhstN,9M<'8Q9ɳqf:hN$r19("+G\L%BMPsl9, ɘ$r(0lre$@9ѐ%JB zJ)f<ՉPI DŹbCľ F,ckXjִujU+[ֶu`=]*׵50]׹bze\Wկc%bKW&VdXbfYZEg#[Wj=U^,YK[XBlSkY~ְ-]{K.VZ24HWѝn&Z׺nv rwؕn&{^RwxŋW.x[NBэt;;^Vկ{[_nmp{^&8p_ 8u\ؾm/Y,b #^~A&/[ >sw&/ E'ldG>1 S9dNCzmV4HU,L8w)@oZgK>,IYQy9 ]3I1SѐAdҘAi mZӾE=MsC2>MQ:YPOMzմ4qj`sѳ^n jKȯW meں>;mV:ھ1jfwmKّVQ nyfmfRtt j|gٰ1kd7;2I&E4)hL6iJ7.S {$Uy"_f<<>p0 M&1Y3ah,C-ǸUc:&eNGc 2M&`"kӟK}Tկk}\׿eiЈGimib+DYt>tES0GX)Cx#tX\8 qh,@bg㬌DAFLB/Oԫ~,o_/uPșntY w˻G8x3wh~(4ŐRYI%YyqT~G7IwLdh;oprrG߇UGQdJLLKQP5Httǂ-/1(3dGKLMLOGԁdNՄx?qTnDh9w߷h&'rRLӄhzDNTUxhGpT}p]GikȆmogLX܄]G5OO5eo$rdJz ;oCFmQGqmMqӴGpu$]+(HS rTMGxL臗RXI8Mp(DQ}d8WHh8ˀnQuNIHOGLuHTxsጝ4s3ԎHH18V)IX DጒWoюӄMs VgX iM؂gH8]792({Ȍ(HoF9ictsDquGJPyQ|KX׵ ;Ieigzr}zdrG먄r9`iPHQ3 X,ഇ0(gPJȍI s]6iMgTHuU䴌l-q0Z11pH|P/w| F+P1`` qw^h ng1pi3\p p1lQt㹞qtu)i)G2n Zׁ-Gw5 }NGP>8M/ 330t/! 907 hN5K;ZFu(;zM 7젣:pP\Uפp ]2s^zwVצ\Wl9X*]2ps iڎIڑ=Gq'py𦋐X{ǟbx#9Qp ϗbPM i 7 P2`h,Yz Z,` %qcj@ az9*:1 z^z/ gPhJ8zcy  ڥ yʩV1ٱ;k HHj5{Dۯ* ) iw^QN[n*@κIƩ1I2 '| >`n4svx- M 9`h УѐУ [x[ jwM: ]|;yt:^jjZ {X9 ~ # ښ:z AG^p غz9ܙKz k;kz 2 kZ*ۥ仮 z˻+;|=yə7ޗ{Hw6kj w¬a Jhq&tI1p*=aFE>| 'El;gYG<d0ӷѰt e{ǛM @{ ;z;^HA{H~* 񫉥t` ٧ ŐHv ya*s| fȈzP[Rz|:jin ^꧟,Ew ,|8q^:w*t_ 10+40!̷eq0o`2G\  9 w2 c @ܤѸ0P@|K02wvU {ܝgɛ|ȅZ^uꦓ c/1pg:- {@v+@p|]ikr䚜׻ -m+l ~fp 8Zl԰L՟({jsH -t=1 ?<Ρ  e 'k:pihb6wih{ |b saQأWHp ]cѣ1gLj=LbZC ƽ/]@ ȶ]MIkʻ-ʋH C/MAۺ:Ac1K 2 2-D =[ ܎]݆52lϼ|]\ \1]zFJukhL7Αx 93Cjr2'зٌp`-ܣoʀ pr<Ŕk./jhMى \=민ө ѰͻʪY>9zשe ^>L1)li[3=[vYO~g"kѯ;兞Oڤ[lߝfghqv8߫1s͛d} ˠ/. I֍=sFD{ ap p52ֆ ӣᮛh@|0's @ 0 G]z=I MMh9줱 /ѱ+m~ U/aPpmfKF ?r: j,Z'ʞ-s.;7stE_9 ε C T >tlwU CGi83-r1wv ah ٝq6 2q3gv,7-t?s3Əum(zz|?Ow-Fs KFDVoD_07z(qio ˖AL h \F/aƒ2TmDz LF>!E$YI)UdK1eΤYM9uϟ@TXq2dZhpѧ4TbŢ]"V^x4N=ZzH-[(ܻyZJ׮ղV饙 aĉ/fcȑ%O jBVZ1]5[7_q媐oPż1 ߬5}׾~7)/gsѥORhSI$LԬ n-coǤۺ.ՠݟ n@ 4@T'eB6:o7zB*t%k"/>mB:LqcqFkƙBBIȻSBuǿ` H'E*?$qK.K0k?~̼'4EɄM7P Ss=\F@̓P< BDYQFL b´RL3KP<NA>3;SmOVuOSMTQsɴ@-JVXW$SZuՌ07uYh1 5Y:BaBUY!=QS?(h\UmuUMv^pMvIav_~ߒ7V_ܱC=XCɕY.]N=%?Ucq[vXT4X;Y^edYMIϛf@qYOz\6hV:iO%Ч$&ըwgP.&PZjk~f@~SM|nkP{n{oֻoo/|pG|Wqyywvc}zǝz쯯C7dở|؟}{/ٟ]gI |`g@!d`@F +( Rp=!KA*`t;O3}Cz|j>98oDl_(1Kbŗ& OLhЋ۞E31{kb݈F1QcF<ώy#F# ٙ*6vc! Dfх^J$IMRe:O2t%7JRR,e+=QRD%.aK\K"!X̥.X(P$Ig619ĝn*2 ģFӐ )QS I{>ӉהyBgANhCЇB:jFThE J~/O(AQSb ~jUJ0*IN[ ϗ&0+j!uȟR385*QS3-*Tiԥt>RԭF*X~Rjܣ,J)C^iPTo|Lc9qeψ15 ]>Rhcc 0o|cMY|.J_ڲLl3$mI[^m+\"WL.s[ʕ$m]Zh~)kJR1#GbIsU{:iM$,=,7WowuaU٧#%`GxD{a'0XOĂ! cX#&689%撆C|jPChlX91qc X42}ld$Jrw|d'GKr+3V򖽬e0gY]33ffݬf8Y?^r `@i>@ߎK"t!H7ޙm( c:Yc'ء|vJigvjh=w{ _x6f>.;/BIP̃ DERyϣTHJ/a;dhG= h=} ЊlC>{ZDJ+^"W>?}D_!z|hмFA'd!/>PG>o˾@ܾ?L@ޣ@\ @$@@$A@cA@@X ?勾@}#2S/kx9XB{|36S-X;BF82d5 vSp}-Ӈ3B0ZP{¬JATDFLxDGďpEKDĭLDPLF,E@FΠFEhg=CPh10|6e1x.hBȄ-2j+0}0gS5>yHyj0'f\8fԼSd jkΝ} ]VgKlb 1^dS(i&Pmi'=V9T> 9<ay:|66cPΝ6=n;)j4M/|1x>ЫE :i}H/CYTvr1u]V3S0ε}nW0SAi7V~4'DcU;Ds>A4{}U>Xfa`BO\=d_ozHގWcά4q1K'gNȖ=ZEܿ",e:=?́gS, \ʪQۿ06uSS(=i_xLz܂|-@,oY\`PeD7jmdz{z,.eܫ|?M;qE[lT[Z?v#Co]>SbV3/yO{  KX\|wi$™ވe8$H8\mn^_{8 s6OujvX`W; X#S}MhB[g^e,FK%0.(:h0YS.[VO㩎Vn*ڼ- lwsćʢ á+s,h`A(άA@G5Fe'CuMY9.3Ծa7:'e}]M7=vRh*`Hq X/b 2 ×2֊#G˄dzіVm#b+:6L0\zVhOţM"_TKԟX0{4QCS}ϣO~=ۗO 7ʿϯ?7>gQ&iQQm"`H\$KгEq Pp,D.)Zcs'y>!Y$o$:E QГ0gIG^P2Cˆd2)œF <,Ҏ e IEdi=ZRBO\R(Ň킆I!Y5BROT3c)ebL@2l2bC}"*UiI)dm2їI!3 T4#MEv Ȉv2 N.1ġOW{0q5;: S)ӑ()NҒ Ře-w(2 Ds9(CՓSm<7J8R Zt,xb)6S‘Yα&8<ƇpGO! ψu55.3̚^{W,) PjʝݡCf8Jϟ$/YGvzxkc;taEYgR>R`(j<}DI<0 c5XP20eCu "teoMd-FV1S`“!ZNt*>%Jް\'2 I-`o ҒŔiA2xE_7+&d4xHHSaGlh3 H""Ec8C8e'|SD`Qf 2z'NL֊Rb$f ʒ֬fʩ0'M QGRw~+NRu4iRt,iUjQ T T"2<4) :RCըIװbhRuPL{zS}`H#vXISZ O YgړTu'WB)RuZƲ'* ձ1fϿ{.C7&׬e'y;WՍ0鬌 TnA[۪E-vAjSz'VW?^=39uL_пN4fH+CVs]a3u󔡝]pjrkiC3ڄ6!ꂻR`z޶򰫛Pv&74kWU 5{.b zvA].+ۉL*=Pm?~o';(2H:\V]Urfu9X*\Gӕntj/:OgOɣr}+O:U~tc]_s)< cSq]ԫNF;Q ".FͮnnuUڞߎzf=k>o.{ȿӱ.ػ~7=;f}՛wo=HϹڍox㏝n7s?X1y<}GHBsG5>`B> 9`zdkXiYi] im`z~`nXfmV f .Pv` Ġn b`    ! ~ 2` > :n `!` ~ai9 :aaxa@1^畇$0Yz`yԂĩ;0 ""~ȁM̡M0HP"\"Ub'"b((9}zhL杚}BzUAzF&F#jAD >eakEa !6b"5C4`\2c8Fy#=`yd$Ll {a{a<>ֆlDC>@;X8Uc%{#EG4bzdE QHJ\KT  FF$GrPEJLKjMNK${d#dMd{LOMdQecRޤ8ePG4ҟeN7nfefL^&N~$Q]im $dLz{zH=r9z0AE>M c."e#)n!ȊH$pEdc]s!bg=f'~'JEG"|BfLab'jb%H6G!(p^Kcb(cz5fpefEt6< 5m'Ѩy5Ub5^bpdfhh#֧(v(".f:)*O.cTvh4W~ޏh!J(t(:p炎i}jc*l%©[УX΢4<(DA!e#Gt\fyFoJ^ɨ:RQҤ(#(z>j蕇Vy>j~ie91&*:$r"*(^+# kțȸZ2kv^$)#f֫$+z8§긎Z)LNйkyP#©e^2U܋2##1z4Bu;4yȃ$j-^$#X㌜y>C\c Ԭ\go>^Aq(z.5,Ħj^#ޫz `R㖈Ff|%I̖"koΫO)p赊>pZRcf(3-kuAZRp#"ȚLG0#ظ',D-pk5+՚6 ^00+*1"k Phbd{.ц)+DZEŕ(lUL9gɢ_Ke^ȰJBpa&+dH]|ѯB2՚֢$ήmFnz&r'1p&60Ef&?(dj8 #F4P.;n20m)d h/ç.۲,ri.v#2!26&**sj\!ffpmQ2-Err-1o+ޚmr.,モ02求p q,] 1H̬zt/{Dy1N`7;#$0.  g'/&<.=+W"v%(%Cb(~m&_mȬJ1bs-CkJq7ZFb01 (R~*u C,m ⰽ.+2:3uQsRnKh63Y[5®us2?J ז<>'ZiW4C' $A,s-D>B0Mȵ>2M PA$b`Y򵌌Rc gpu8gnϲ{ rOeG1b,(h57;+#)vC5sppc.(cDn/M#4b!- O3|ʮR3V g7{xP0-gt+ C8Jwpd>`_>&ЃBc,C̯jQTv,QMQD Qe o*JG42EI*%M?,xc";l뛪1w7{uvgqi +.(zU㱲06.q.m"*rzƵjkֵRthsPBiQ7kf)gf43ub hnHf|:S+PA>t2}(~XP{b}܊Ѝ) ݰlY;.e0@W:EZ@]94jF%[DW euL :g:p|7-Ɉo* 2v|Ǘ)P|8/90{#zm_~,OƄkpJ3HLփ|#oz3=[5x;|++pO(@C߸{Lգ?-}Ju8Fp-6݀=@3Ncru_DF=k[> ˸[spP:~77jG[þ~h[ozZrTo eՃ+F ;mڷly\BT&|wMԗ'G7 %h~]KeKu*U3|yuݩVr噶'ݣ\+iKJ{o}UF׳Y ?7oF9k廙g:vݼZsn}7np♃oV rԉeS5`c{O۷᮳Wm.Uݹl5AIS߰hVjmV;ۧ[I!s)1['qGt|۲֏٪q'.^C}QO~7p7 nc\GAގ_L](Hpt:*o W Kxwnt.[BT&Q4Ą!P84tn\y/Vp[8:& hA.m}KGQ4֣d$C"r8PTȗφt$"BFe jX 6t')(0 B1FRbd)qe dV*>D"j P $P&~Lg ϡ> N%6Iͯt -DE,Dgg?no%%g9ٳD'>)J &>iB'P"L"m!!H%E K1r21}dBMT"E`92y̖zIO$I*#]E->:F; ox2KMDGAQ~4)%3$cTGV%ɪT=Tβ=ZˀFF+Gx.5#z0TӲY}TPlׂ"%,=~ZVscuk%vς&V(ǺŁ @]XČ,9mJWvVn' ..CQMVqjQpn6n-Zl)س2 l>6W dTIX' _:1\k~з%1(Z6xL5b]B/jC=c%"[kc&QVQ1;#38K)U*f0h[q1qu11I }Q%:2^AWQ]#1 -eţ'QRWqB<类B10JR/&ΘJ@$㦏b?@.J2$1!fCq 1jf' "(n[jx1AW&,.2.../r..0R00S1 .R0S/r1/R12!/s01/350=4+1r3O42)05O554W36A5Us6[S03e6335Q32345/38Თ*n"`JF !s䬒ZW'6;nBZ1-?.PsU >->?D?!>???3 @?c TU @AtB9B=/?@C3ECt?5DSDTD >?SB5TF3pE9,4G4FD7TG@EtH5B#CmtBQFWGq4Ct>!C)KWthf Ug!B**<5)+=ME't=q"4&Bt%2auPuP PUQ QQ 5Q#RuR'R 5'!&,0=5ysCiNTYUN5'MuUY%#P#B^VUWV[9W9UU;ugUgUV?WX]=5ZUZYXT@2bXT+TT!tŕII5DY\5BYm5T\uX;>Tu_5]_KP\[WVB`3T"LL"ȔA:k!# q*/(BPAC0ƃ4H>5Z#7 4PuiXV7xݸm78wqvxw혐yw8+xxg{5xQ+E8"Vb10!GYVf.ґRЃi'1R2\Lx03u7٘Xov_8֏X}YeWc׶m+Y%9шYJbi%c‰IDf >cU*f114bY5ڄ<̘A2ayٙw1ِ7{';z٢?A9Kb(E9ARB1+R#p%(Co#Z YEC,V"sIom7ڥzŚ/V;yQ؍ݚٛyvOZq ❁KBzt\f`C_X1" E6"J>C1XڤZCX{OgxcUz3zGXߖڙyvw{~@FySyHCW$I8RS#>_b*Z»E<8i㘡׵׶ߺ˙ \z|ץ{QSڭ[bo2@$׺zZ,5B$d;3sJ{&E!1+{{!-'#ܑ|V}ێ盵-e;|y;Ԧ9Y`#TyA"GY¨6pƣŗË;3\9ed:˕;9sӺS횘1Y:]Y|yֈKLbk*n6){z;l|;v}=ڽ۟i*L:9[zO)=Z=xзӹҡTVÝSw>k$!vvw?֝IzJZ!e#9uN~ x[3^<ܮ{;}!ZcCa^/okƹ9|g8!bbax=IB\"r-#K/tHz<%\d؁)y\՝ܛy5ʍ +\w}#y==^WCb{Og%B4Ib͍onST⼻ӣ?êI_0#ў?>zA\`43KoÎ=(dɑ"Cd%J+_$ 3$̘&ODSe͑.o4IDT(ͧ8zS1✪hQX:uVФ&۷pʝ hLJ32o0]>eCy\z61ϠCm2LFM$ Kӳk?{p`uOWpoN=yjӲY*HĮu⑂G5IBUyXW}V3yji 6hZE#| iEvK-~b&"'] -B&>\RHc 86OflaLBi_ SC@ݖAE!\BFprE_u_ݞG'ݩ'ZPGP:y*-*_镗j 6i*]hŖ^OD ieX\|[4q$HlfR>YY>)s>[ Vkj]kWr]ztEi2[DAG\CA[G$A"7ۺM(YN礄8X'0GR{yƁ\TYLҁjj(#_L8oM(ˀL(L3IzL)o41I),Γ>z&#-t\7ɥkU>AFm>vj[6A:4&LYՕ9a/v+ްF쩥p7uo 8|}%kk5hEP|Q,`T&){X"uqʋ1B%'nykfl& {eohMǹƧO,8w^y럦wPOj e9( }J0 }"@LA 1dv1#&43m!QN4H37B *MBІulhBJ5d4ˬ4;iʡH"maB黂R , lꡜԴ\Hn/yInIU2$! ">vOL-Sʥ3yPUfKnSͪQ"UGPɔV.u@*[բi*T:׹pu^ַr-Vz,CؼNe,bZ٨r!H7͎n h;Y%Xӊ8|M*( O~ޒ=o)z9q ݔQiミBkSd7{N.نiBw$^-a"UHfZ8Zu۫f"ݕ/|f_!?=pq^zv/ǵuҍv^ߗ nN{mnC`x[_ W_()yҢ }^cь~wpQvd%"u lEXy`H(r2dL®U0eҕü&ɴ#5H"g+m g>;|cr3g] {{3);O$4|漝"3%fQLiP tO+3epu@׆g`(gK:, F+ݺ[^e<+Ntގ}h aCWfڽT$ mL&9ƶڧI#M Gj3hPʷ2qEil7w#  7&o߈^Q~?ޤ8}3VsDxl:.+|6ipW br}ۛ9xmxC!'Y{]yAt,Ps^7<6I:q\Pm cnrw_>;B2Dպъ#)Gr;IcIț"C׫涊L:sLV)c>kZ'{<#q,y\|_w9{c%l"&I>/ʴ'{~EއGoF3}.me{z}SPMdexqZF&xy"%c ">a#/ cgbg}DQo+HZss1 p6Kn7wz6:w2*X QwnQ7%Mnh.Gv҈/~5>abz!7.75G>&sRxyb\Ø_ЕRYrͅ%S2_1Zr[:z%x\/,SGӸ>W\HR>YnbzU2PcZ'M9QqZ1gsq6c\>\c 6b/(\!Yk.H.SDy]]i]d?njf)a `(f^76`_jb2`zFY&Y)&r} l&7ӵbhh)%fm׵_R7yEIau%W2xPlQS,z:ZPI*UʤX*2:\ g:HʣQ'hOH&m!w ;W~qJH}"!A;N`X& y|H&CUgK1wWvlE[pBbazzj$jJګ*:*ZJͺz̚ЪԚ꭮*݊zZzڮ:ZJ2k$'E2!o`` a%f`DSJ,YZ/uc! 6Y73ר_P7,۲.51$r1POTJnQ BZ$!/9@!jxQosgō]#%7Rc{~nfl˶#epj+Ror[vnfhk}KLyk~˷znm w;+븆;[ki++zK['+˹#PIj!B`˰{аGMtA%|!?E?‘mr6߅E\ԥ a\ pkԥ%[W `7q[K+pʰ{%A. ѽܛlK+ L]ݫ61Q ܽ^ |ۿܿ', ꫾ L | L싾2l7C !Lа)Q-l/\E\<Q K.6[iPB2Hsl;DK [N4$#[i-}v*d%]G97ޣa]SRO%{\:ő!yXߒs#;U-7 gl6el&v>jˮ_Dő}{o!;`+VkW .ͼl&9SWy֘qbəeϪy *MUV7pZѳK[$E Z 3QtK<2Z6L.ҌAai9vk&=ݨQ-\`.Ҫ|<>b^,fK}#j|ҷ|`s;,\r ML%`*=Ha}|bl*ҡb}l[h-%]^,fgL[kT uuHw\ 1}LCL# a$'<a$ <$[ځ#'#-0PRUVYŴ{1t &D\ƽ` Msl\LlBhLmmVv7+9Ϋ{ bSzvz׳KGRaRo9gRlΰV)M?g\ߟf&\98)E&]ViLW~K-8t.}>}rݬ-Mȑ +g>o!-=%I]Ur!5 `3+ DrO&AD$a45qHXcM\p  ͻjSJm޺3UykYff]T]{.KЫwYy[ q!Mͷ=ong΍Bym֞ 5釾laScBvc5dٿ` 0~Oҫ=95SCB5A!UT`q+7 S\-͍mU! >N h\^nS\2`<ʽIײ![<FbE>!t#\v̙Ix_1UXk͑ 66q kZI+NC0>,[pr힝cBNbO"Sb;l`ɴ'dc >5譐ݭyg>}-W>ۧl߾6 "ƒ)4(˨p@+ILrcBjFWaB=*ٱO-qyT_G4!)QI8B8.K1՜Xu:DPDiP>tgdO55ʲυ֬6ı,ޜ?&ĺVmEn =6D5jbhR3QlڵmƝ;'dJɶ&ݷֲ/ 0L}sbę=I[Be-ߌc#֓ZCi羏|.'/_F{/.@ԍ7i4&IABM,))6 p駛 d++*#r*8'Xˆ*BlК3ơjk'*- ;J }"44*ɢbd2.+/ѥO(܉ÿ޺qК,3lJS;/OK2'zxK5P $RKwmAk3NscB.:&b'W]#Wam#HWqX}A >_c6V)CEӇ.Zx{ }TAѳ$ /HÄDE$ k#$ .@BpN&|=r),-piKG)A ˪cӳ;5pbp0 a,ntJ['%tӐbB 4ʐI&R.HZstOW1늷D/hh,^U۔jPmTR[bS:j鐧&vK6G2ˊ@)B %)6ҵ@bIz׼VvM9_Eȉhq(\IU!jIM:8%\*y̡ a@v:`tِ&K@m" Blg\֤Lڒ%N6*a 8k0XzXßU\Qi"WU0\%TI`u4b x2e!ijP #8f6kePQfգIX`4A9O4Zda.C53b,<0`isdRZd4tZB/L3{Sp ]6!D䁘B6x%b5 X\&*^noQJE`_]xc~7y,萍I ]~soql-߾G$"./T&EƏk Mk^{1l v g B!j|C0ɴ:Q5"=4s"8EH TJLk6@7gjFl`j']xO6kec\ xiՔ5Od"GA œ5n2Emo⩄\B,>%O¦FmKm ZDm-+coj/'FvN>!FSsʿ*v-WP*z 6Hhn_'l$44#4G'lZw` \?Q[R ۲()" [ 4$Z; =%җ-蘖y ܯ},B3#3 7X T#X6Ǫ3+:%Dy B C[1C:dz;/2#'f{%2 @ 8ĝPQC9i1ru*/#[!:&' k;8B49<£hѱ9 N8[qѴ VK9}r&d{K -[,&)#Rz.ep(Ko3_ =J?G j@޹,0Fӭ2,pYAn©Z+9 DM Œ.z=ix8gA4ss;Y`;QЂE ]dIL!Ae0$9Ҝc"kGa̹bC?zӇg10DH_)P&d&I%jR)GCAz癇ӁCK A3$ zKbEl;i/ExQ!0LXجY)[]ŊZIUڪYZ*eh}X[YhX cZ}Z!vĝCXS,4+&4ȴE ״ E꼏ȇ1HS]PVH]N@zIJɛ8򖝔A*DcЫbX[XwFPu_}xRwՊSX$-y:Sчa]ڊ@ hh#}_[e.̽ zYfˏ߁EFEd0PȇhA6=h. d6֔, d6Phh n+w Ē} `x𨗯sDeu3 /v8-Tح e؂ ͇M}xD#K&v` d5M {[HPcM1.߳(Ց,ߍ0h!,\ 1.fv}j=s$w{RȄhMc )<8%ʂ4ZpCi̥V/풫H+%?YL?}P{W:uXέGRsi'pa@R F`G0}5bz<,u-A؟y δpOe"A,EA``(,IP͑t,YFk4|ZQT]~٦Q hE4GF|:RIw|B p*E+K][UuZjJ)rזqzٝch-ܖ023wd4f 'Qt*v: xs۽ HX,s w12Y+J:qknTv2\lCKsX[$qbu-vN&[A%z*<$\N!wSi"YvCcMX,xly^pa9Pv癷vz&&iPgۅfHyerw`[zܩ%Z_~b㡯< 20$Ҳ-h;m^.dH/j Ƃ ]:P,-*_ObpPdӈG4S39=/R ʌs=l7:$$#`,T%YhO/o@O/,%]N H0<݉f%#Ä1`*C(&1aLe C$1 bdԜf& aD՜&1>aMgB3Є9yi:3%]xs.g\ϷsR',(!(Aq fs44IQgsUF61̌&휦EypԤ@)K1JMWS >qOtRT!QiO`oХ 1Ks|ihz 4ͫZӜLjԙUa#YjY]*Vt:$Lt3~΃ r}k {wk^ {f2'_R%~k[*XD2-$> L,4z]A'E[Mj Ҋ# jPF$r۴u-KQ*d4ary r5> J@W)nr_Z4v!mW,'\t^2]%xi5,2*[Z+0mg]L)\$vGg&[{Bu/NS">EHCShAX䰇ez>"@ɠ=2ewd*fL)fS" s&X |kR .ik!ya&0|QIȕnvLsMD@QwL }&/[gǘI^K1fDčoYHk>B^%T?Éш ɕ[`'Ea@_aj X\?-^YP1L^[ "Y\dX>طU[4ܡ@F^|IQ$};}7K7 /c$d fFOE",F'EB>hT.adٞDR̺qHGZϺAJI[H\OZc|)EA_eHB_NB^&af`fa*fbb:fca%a%aN&bJB(feffafjfh:&cN&h fjfvbFhgl&g~hiڦcf&hJne 'efldΦl&o.g&&tafn2qfu'vgv&wwhl&i6fQOa:ahA'\W];\Ո @^ BdE}LG_$Nj6&LӆS8|[8ԅ(Dt^H짛qk-[h,eT^!S[~^% TXUXjɔLm"Je}9zօf}ei"睨 >h>ΈO>+[eitajԆe}^ y}݅Q4>@TmnIfjGU^Z٦^ص$S"MJЈ {ᣋ*-CBTDafomi~2i]"+5 9V`qƠ R+-_=V # RƊ}Ķio8>dJ nhHjź샟/]a~$,ja>Zl/q!I,BYJ(+nFAmxl˭îʚ˺&M_Θɚ +RM., &<4F`)P$SY +LB b @\Ia:n-q.ߛɂ --Vm>E]!>b>D[D\P6vE"K*~4.p)CP9,ê.B,FY \>m!$ ,Q… JcyH*]@B0 qҿq~-I- 5yڲy>jW`bnݾ_~>ۂbhH\Ƶ]{\[͘/m/Aeic䢣[i\/.bRZEQbjN#)p^Ĝ-,R.dk~C;p}\AV+|) jpqQ_*ll h[>0*-B*ʬ*2v20_:3ߞ6.ҶOE7oB(2 pR>ƺli/!a9Z^I$@R>wkNF?_`$Mߴ!d Ms@G4Fz P\r&3uC`D4{S=\o*oW*K#*~#h}NilsJ,m]8HwDNY9 "Şk42RjjGcJT䶅\(]w-`]EbIT$[$b'va_$bo$aIJbOj8W@!D%V[\n[0FJtb' ^1PqE#Je]6m[YlomybfqF'x&rrKgrs{gnv~q&sCr"seo'vS'lwyx7z;tGr;q>uww7|˦cRmz7z8~gyJ7wuƒZW2qT\On]rZ0Fj X ^Vu"YcvEg'mͨh}2|"}*0)Mk8\ T5 1ԕְVZ1sZ,e8SfZO!&gϠLxcP`#AD!Hq{txM[J3 )p^Gq YrT'.gW$2x^AsšDm}j'"xSgdbFV9`9s z5*?*^)4}aI ÐP&Aa=q{Xk>[Xg+G;[F;KPf/CA94qޭ~?'q)B*CJM/j Z&pPt*pni)_î\ -,,[bAnTj_ɿr!"s̀~64;wyt=hÅ/=6VnhƅGCQ>(u((C(C;'n8S2·' T)/#3Fٹ,6sbSh[ByFy*?"ɂ忻.Rw@D}3u%ʍ~nn~3<>ZS=ؿu&i]4|Pe¨AJV˺DEZ]\ȋl%gKGl6A:qZ 3@8phJ8P- ]hcdp8@4Y9&R  9̒7q)|"hQ ObXЄ :XE16QQI yFܵs)ptgoy2';N3' lp a" 1<ۇB / 4Ԉ!4d1dEHcK # h H>#H@̱m 4G5( c56WSޒePS;]fdmO<̓A%Rî!$G{| N<C('j]ʾ|)J>](V=L5(]m WvِLJ=͒v2eToK-ԈQ{9M` i Ec0s0i"\LB( $kہLzBԈM-6nD18l[6<=4kdBT%-h B.TL_O#X dJ>vCC EU$A8K&i`)f}cdoԬj h,iڳ}2c*$J%Hs[ }깨hqC %T%';1sac5k[46M8眓Qt.zZĈ}bi SH1(ZtzUS+(hZ]SvzWuNv/ݼtr"yD{{ljzy#7b\o3Фa4Y2Lc\Ȑ}6득*2&w9Kw|h jPPel1a \NIJLS3LSB2^iX[ > /CDh##/ILy%, I+\|GvS!ȥ$yK12/0 a . yE`r,Ԣ$'iQ2&Hznd2 E MyTW<g-9=J2n7$;+5c8d҄PƙpBYrQЌrN΅bT$n$'YyS 뼖@`ĶpGejؖ 14}.ʸAtTCJIiX]|ȅIUhO0T IJvӖ9Y4aʐA=KR=uˊ4hҢvQFmiT[uDQ!WR*Q֍hWIAiJB _-+#*10Wz״jM\:Wڕy+̚ص&q[VɊUk,c)Ub]gȂbC.ִ-WE[}m9YR%k{;[ׯa!kruq*le*RV{$vL߃]5r2`x0`Fk@lb< 6&I\IƉRz3h*#v 9 "'o3A!EsD(?JNwf@=M&wb@.|$?6b92IlR 01r8 oN /1? lA4?Zј7(qqHLn5k"QCӥ-R*CfREU+ Hྂ3[m7?Vq QL/B݄o!zZd-6Q-a `‘>y7iȦ[.s2Whf1fd" 2p h.Tu-gprP.%l`/ GT4tÂ֭CCs޴n~Xfk.em~g;&$nW#<:Ĕ&%FKG*nkɥL uIb ( ]H"’?LQgNG4(k   %"q@KwJ0Hqqmq2nL5ɑLrr,)xc P%%>@"#}x%%?' W0%DdbSh hfZ(uY$A'k,B+$&2',1a epNՌ$! @ %1,@!Jop2@QM!p&銌drY14qZ%O;e"5 9&QfkZi .5H;j"V(59@̑!1'3F :1h S`s2BArrXC!e/3 SG 2<3%^B!e@?]?s/s@hh"uOm!Lf2IcCpNx$[Rd>&+% N cvj QiNT(ՇCg.(gT6{>bGUHgBv(T/+#/ʢɅ",籏'Ho6!X t!CJJ/ F>! ݴLt>CMT=A4T= -r@|P La&fCtNt3 c6TvV12춲C`8(~ST,z~z&R r(AjTeU !=F ~J ,odnl 0:Õ Nu`/s!!O.@!@M+6a>u"]%R]L l0L2'T Ljb:HuRCU9)T3IEđ5Fd͕Vv` ګ3$/t-eBBsBn1$\0 @]4RihN.@NU3+t>ٲT0У5j(BAI2 brCgC8sdDCc&/c U zeKun :w%pi`ٵL60?_Mv_uw]_C5bW: gMb q ʡJҊ0 @J{%m/z*|>Ne|}7C+sqtg:1ZNr@P6@ Mvn`_[W@Q\6u?la!fƃEA-i'_A2BOO4CsU]55p5 Dq2}c֥wr}U׺9-f'ȕjZ"m^p䌍*!:Q22ؔuA6E0E=vbN "r@ geSI]I]ˆ,rg'Q^{?R` d;1Ba!XD.A8,6u嫒HNs>[(sbztejX'ȫg1Yި"T+‚$T!C #V4$qƂhm@+Rܗ4143̙4kNe7Ҥ͍=4ҥLnLip2}R*2>b4%#L2`ˎU6lZhFbKk[lמFy\Br[8}jA† SMߡ csh Evld /f.//Te֖up )X30M+t^>PTpmIU&(+L& e1/Li|ۿ} FjLbZE]]Օ24] k0a ŠX>H u"FmA~JImȢ) aDiАE&ya[d4SG c#"l-U/QQ_O -H$t$2yȎ,މPAPKiBiD{lniM4DCVna[^m]h_wxWfOYfP!1 )Ll1lSVtj!% CƠm\f[l1pJvav@K-l!mk,2B4o>~mA+mpkb;"i*Rx8oR)^{X:R)`l-!ߌy-Ð׬\i1*Jg+jj4W#ujΐSv`'%j>(KXjB84iO&niMO"`B`,v5_|c +*^`Ab`YuՄc%#ṩv>TK-1ȴ(W!O QkA{"+sOkWg'}oO廟Odm?~h6=顔$ Zv<0Do`%~ن9H9lt %EYeр_4u|9 kXp;vUN& L"=IDC( 4,Rtbx*VY*zQ'ST"E+Zfl+1M,#<ⱊrTcϨF=iXH22c1RqciH?"r'5?c)K9=z#8H=&caxW„gILEL&S0f0dfnR gއ!$zqBM/㴟-W&ikVT & DJQ('?71 W p.q0(HP8 R2 z38C+LZev` AA GLGƵ1vcgAH|ܯ!e+K:4iVRpM$kA?ySx#ץ Qd.7ˣ5&`C'A>j1nb^ GatZs0h 8Ƹ"0:EaIJPMl .KpAq]FN1JjGyUV%@m՞{YIhZr\M@#:ݙ5' L"mQ-uOBP&b—[P`OӘloS@$@y 胠oc  9qyKV k`Z<8! A-zE.F RPD Erۖ2Ԗ]WC! S1Ha,hPkb7YLaφ:GpۤdBSҦ$cwGoMM}; 7snp Wgiq(:.gzw %+"L5p 1`0"U0/rÈz5L8"!-b.|,bcbi(4o $aI(y1cbS.(fUr\5 !@WKVտnmم 2cfkP,̻&3_ut.ϛ7[8{jN{:PgDG y>IrJʴY}#o(%oA `Ka .8,CKlzcOHH "+~&QP["K~ $5)35 s2m"5\8]ɠl0Gֵ]SE4+$MQc(``B"M(ak1b6B8AtqUfv4ft'qq'Rk2bR`s0h1h=\"qDXF8CUh$Շ8^f;;0L!A0SE7~FPAh\rPa؂P(6%aQAg{fGwBhaPQlł@BhƄ2B9F" *+7dp ]yE]R6uuw{9pXp'gPM0RXWf#p`;ԸQawQ͈'9X9z)"$hph7 7C~&~ X%(FP *1Cxq]Uc]ٕ!J0m妁x5xd†I%GoT8F9'F0fSaQ9uSyIKx%dZyR.Y'G9odXIw>VYTWjEyMip(9B7-K?I3^<i1sT_Z8Q=89V9yed2zcTl ahbLC}/Ӓ/Pf2R6yv~z -pR.9Xv1 2x60Z-a7g-ŨM'~eVv}YZ(Yc!CփAc5v+9l9}]+ W1̓VӭT^9ɨī@A!)Q*8[ne>C4]Adњkꟼrxcfc^d9i:Qiʱg??cރ>ܣ>QD>C+>>C9c3^ߪsfӳV3vq:K.yرK \) 8SD:$C!CT>:dDZx.;BC^CTKW>J{DGdFĶZtHXH4Jr;JtH|DDGhFnGi+K~ tEbEHc b`HbDDKFkFqFctJ;nHGIMDJH}Թ˷wĶrkyd}D:C˴?!3JVhV:AKN9;^k7^:bH[b)LB4VQ+ eWUxd˾Z%9Rr$ü2*^ʫ 3)am\*jnxmm>]f3@jכKZ3?R:NxG@ a G:UڧR6 yhZ&z҄WL}ҧVTU)Z Պ8.EsRlo{0ctQ{5O4,PM*iR=&B:f,X3y4: *Aynؖ er\)Er9sfBM$ ʪy6q4ǀ:#ˠ|3\s!#Wo<˯̳ͭ0 o:"ls+(ثȀ,6Vm+\xĞVЇyw_P/7|G}Q wrwz}by7b[[ & zM =6P{BR|=|m {'1y)dǖ0΁,q`LglBLRRS[ *ӓ?]! P,(o 5.M$u( RʖNi`(\vj5UfkHRvS[kiu$w=6rƅ:~bB=%Mئg͓qLɃ(rkWܻ6j J LL-0`& -X!*-Ta* z,(B?lMCi$j6h`SG'In\7PTM)-cBhet$ S"޹=[-{iZ[@q;ѻᑠ}1#lbPM%S4UX`"03{)D*?¬ʊa1 4?9m.0p!V~W[qvuSra Bx) *[{Q `^3fY M,;t! #Q -"f״FkoFpA,RuracT29[y`Q" y;4 e%8`#ȑ e~zmr̐).qLNg'4AZw]# >Sq|^Biq _ˠ4 !?nn &l+fucї>5S>zc\'Ȃ|ּRe%] ]ޣrB !-vJq̠V.[U '9)X%6Z6V)2##?[nhp/Ʃ(0YwpE<>Ao>ofGBl=kub0&y#,v0a3! cr)!4)DP>pXÅ $f>5nG!=JYIѤd%I1e\9}5e&M Mjp y14bLzÓ"E*U762]PdD7K̒5vlY.#du#^%\8}Ճ^4i0'0d2gNxYB,^sf 34Cע],$Ću{Թ۷Ƌc=|wp㾑 5]L glUTcبoQ ~ګ,#!CBoҒ@[F#em4, ܚ̢4,d #m;P ',MTqC^ĩ7qơhq&YrJ2$И 0H J /J(m&)$!)}g L# P; M6D" tN:sO5MܐB A=P# =*QC%IFUTPI#=C=rM]SCnSQUS42MUGmQP3uNgBimT[{Z'.WT;etXWOu#5YcuZYEA JuVj%XTr *@ːN t#^r%z ]j*nGC1b 7~T#ȋ7FÎ@d7r*zf)}DcM>9govYya6b3 cLyi#6iwP͎lz1XA l >h!`3nbD[U<ѶXMҘy:HKG9xz7)gCˌ6#g2DPq>/Q~y'+H:0o^{?Щ?pKǞ}ɟjp4m) LwLs>nq"trBAAd q 'K8yǎ&gaJt‡wD{22bhMG p%E$9 ËQwEdQM<)ȍH#%,'@.9n#`#6)1Mejc.6ŋ]k-axHThڹNAae2u1Fѕ,X^5D|.YJ[@̄-3^LH+)̲Ҭ1L0qD\q +׵笫cEƑ$GV&I ] R04Ĥ2"}f% '8Ur}gc}^;Pã 4Et )]Bt. EPLZSbDܤbyfS4?[zf >t6"r1PGBSb ,nQakxVR 4 27Jnzdַ8C0Ǯ'^(16rч9B6.s&F[UFla9Kbbsf%KYJgbKLYGA!]"%kqҶeAWB&. voE+Z¹"/{-K^vz.K:qyaWLHPb$ P԰F*| RYJ1. Gi`2J$SQdr]jWjQDS{ළ)<- g9.x !yJP;;.S\,>tG~ 3O-̷T$xK1ߊ1PFђ?$#&qĎƠUMQr#|WXtAc.+sLHv%MZ'n^j# l:ۜ)zPrl3}X.j0 ԣqJ# Vq[3׼B8 *qoMq xRfbl0x(2Yṇx@75?@.'yikގ=5 ",`#`|B .,h> .;KDo\2[͸'9orgC;ޮp6°g4t)!G @F8<|8Бy`#`bas -d>16#?y01мu$lf _Oh2u\fwMmGnkO[ )," 0zapMPDC @Ұlx3`O}@Y``Xp(GQs=㠖Q bP7 l41@yyiA18n@;=[ Fb 6h88hxL:(,u; dh2PX)2J Z2yd &]c8@Ijz@?4 4Y48 8l6QC7C4)URR!`]!DqXDWѕElHH|DIDrrFDKHCfDPlqiP,B\CT|EDDLCE<55U:#'8?}/"aZ;22ڬ#(7*5:r汢~<=TȥZH?MM. $#(It/9"©$'a iU`{8NU3 3 T O{+L.:a OfXo&0U&]W4bKL6e?'$N2vJaֲoʰ͜1 r=c9*-,=;ӭaݻ+-eMple+EPZKa3[#-X?>#5CG[#bdƭdeBB@yz*%cˍL}h`+z娔1\!)蚛ӱ$*88_v! f.ijil^? 8%fgdubr6 =mP{!;edƙc.k҈i`1KM<+Kdۓ9$xe:sB$቗ Ps{!:rhϨs }Lv͙c>{K&h KdH 쐯6t;1C@64T;.*|Xv«se1Y6̓>4llÆc1JHNDFa FTE[FANHSadBAmE.U4DOA`v^>nDYnEζ`qlPD>mޮնm׶I6QLD̦D^-nenKk |7(~i6v}(i}eVTe` \ Nj$ʤ+o>Vqh{0(۩̓׃bl!- ;!7Lp+| yy.w[ qOfrOa=7ܗEvP }P pZ3RiIA7Du:tо\R2tqPI5Fog /vpu0u+AC'D+ ڇ}񯛨/`%8!M,=Eԍ uvL#h5ʃWøjGZ}ɞ`!v9I.J8/)TGMwj2w.;mWpg&,rϰ?EVW_0i\7$(aM Sjja^}Y)W%N(W[bWWJOW~ $a,N@y%~wW⡯&' ]mytE*gҘ݂q'P 9xL {rP8@EX#`S` cpɹ r |4k||+Sخš!ذX(éL( ɛZ:0\)c̨ȏ*'PBѬ 1O`x}9~/J#:z~Pp~هr.6%o(q=r }z4 6|ohN@Eqӱ/_Su۷,}:[/dƍ=IR#GՋF2Z=h'ѓ)Η1CW2c}4=WT#RK.ԨǪi\*1k&5i5ÆiJFL2MSX2miebmڼ~I覙1Ej0oV:7UҢO>:UG4UG"Tc>.ehy3 Vp^ ANTyb^ (LM凛7AdX]ڝo.>4Dnfδ?&-h>SUdqmG7p\x䅧rBG`wE jU,1TRH3U8Ā01DvbUjjhJ $H$M.r"LNyLmĈ@,b{/c>XtP()hV%TIR٢%$H=&eRQ8yy5I' %RGiL=ѳW_ Zt٥n=Fb,6Y010o [*dMm@cf("L6u4IV[ӵfKO-gGυOp49O q&XaHlIOϔFFL<4?0ʣ„8 y">ϥ̎d;2e2)#<6ל3L 7H m91 ׾3 ]6k<)0hƜT.URn֘ޒ Fd1j>MF"O"Sg;ASH(y=T!2Z2~^1=@k(Cn$wP2 @mpf;0F}LA;%ՑG )'*PEeUVihx5 4I&hkk]ZZpa~Y5;Yj.Spdp! q, % u$b PjR wB.c ")H@X0H N9ɝ`rez*k1-DLaR 3x#Xg)ЎFG/.C"Db 2QEհ%8؝C/mwIJx/};; hph !Q[ G7qRI%-VnL(>JԐ;t\f2 8QF4I.K&6/ jc1ZD2í5QeSS0q'L@4KmQgHEЁğ -Bک}ΓMV zSixЧJX-!xZ'Rb}{L3ᖯҀ`P`A4)*M*S%Nd ,4E0Lؔ"^X0G2LHdh_2ʈre%1D0Wĥ8.r U9Ȑ:QΊ~P4a#[QIkZ25'=!j՚hV\B4xMuVkµv+=Z(!$[?7L7[<U\^21`ɼ*cצ6PdJP CKzn600Y|qA,\0E= e삹t v8@Utp_}LSDy3x;Ӑ-[Lce$ک1XhHBL|HΕMYd$胟 Zc e&+RG2 oQۺx; z³ TϬn^d=& 4D@V>7)nF 244w@4FqC͌?QGĤNhwΤ@3/}VPQuOZhNta_+C 9j@IUt 6l|kdi\az`*+che,݇7[ũ"F#KzgHvF SRyXX&SYIrAS4)mm'w9Γ11z cMϺӷCb{s z0䶄Nv˗)OPF~u7Ccӧ;L%vǯy_U!K^y<W~oG`\,b- c"c`ܢ`\.b1#."c.*c222.4Jc2*5Zc6F6bc/b[IFd؊:A;#;#9c9#=c: ̣;c:Σ>>4r.VcB2d7:6vc[46.1bd3n1:- c"Dv#Gf$4*Hd4/"E1HB$D6E"GncFLd4Z$5C.A\tܻ$Qd%L(FzG J H%=]ev٘Z[e\%[e]ʥ"Z^%Z:9B@a*&$$cfbcF&@d.4b>c6&eNfd&e&b6fߨfj&flMl&k&lkfo֦o&&kppfo'oo'qMa!D12EE1YYjZ 1lF,Z^e,r^,[NJNJl@ ,Ů۪٬@̲l,ʞpl,ƂlɊ[6-J.BƦ2^Rlj,тmjNؒn-ɪ̦:٦jmގl-ْڶ-׺~.b`,-:O6M~TU^E0Y'5]Lnnxe(&%`..H.몮nn o /n$/.o.>.fro.AS !f=E荠0{5S4(ޯ// .#0'p[+w=t-[=tip_?Kp 2kB(&lBchB 0PBذ 㰑I0 p0 0(lB qq'q pD1G&Gqs{ oq?q WqC)+  1(1 2q#+22!3#2/C ӱ#"$p%?{2 ϱt0 t(k*2+2HW-2w2(r--ʃr%s.r00-+r*3m20D4Ks;X5W36_s6_s7K7S3=TAdB\tLAA'.tABRD;ۯ2QbG0=G?0Hw]I_*2J?-+3-(Ĵ gqLkpNL_tY(p1Q\R0L00NpQ5 2LrOK2'r g\L'2W5ɴV4St02Lo2wp.L+ߵQ4*k0^s0u+S0J2b,5cK0?Q4*I?pQw0I_0߲O? Kte_6HvetKKw6ev׹vdJ4I5awD ^ ; wq71r7qs/4#74<(w2<"~o0KK\/ŀЀwEWtH[v߳DWNp p_'3rr 1^vb2,K2$V;v "gZ/!Ct􎇵TyPqW0o$б) *2,_sy( 5wr]X8uSru2PcyU5s0R6NyN_^dK-,#:d;fh0Hd8_[6^;]a?c3w438O35:7z5s8>J-J넂B~U 0e>8>3#t{?SC 8-~LW2itE{}33;]2W!2k+5(0Js-'s2Kit{2kuӲR2'&rƒ +2{3!0%5rz_O#xǸU_z?K/K3'R)#9+vo8Vsg_Kof5gh6kmGfgHtJ׶ne/1Yzks;la2G$:E4=9/&h9H*w2?KtDŽ903 i4S 8S\{{we8D7}>3ʾHpeCoN}h+scIJͱ׶Hg?SzW/]7R4ǣ0Q2(*O'g^9Y&OrTg\Ru_D(P.`(en2XLaM $A5"bĈ<^hdɎ:<ّ`LP$hsŐ Aj hΜܙgP˔)(SRmڴ(ՁW*u_ zz"ahjc_\n۳duc߲h@4)1M+oY\ɓ)Wf_74H3 M=hg opq7єݔThAMtԂ!n\tl•f[ȾQWZ=`M%/iyX9o{GoLP@i?$ أ=JjCh"Ap!6oMB%=4hC P .$…5_l="tA=3c*p HPH K GkDc~ro$ #[MnQȟ;͒0 I'F Z: Th\ˡRI+oj衫A*!^'2 l5sJ(F pS@FADL -X|^&R^cTp`DUv,=b۷01&A1A 2, 41f @M&Wo.0Ȕe7;xw]yz學rYuθxn8xsn|nw L0oK_ <Ȕ?bZWN=Q@f  Jp"Qh!l# dɬfЅrԒ LE:P& Q &F[Dғ3 J!! ޞ1PMpR5a&"œ)KĨ:Mpہ-L'yT).[,Ht",Ix Y%ɹkW Ā*W NkW;`fX$Ґec:@`Vbee(TU12h[`aWɖcjq';rvvyRHWd1j }N0=E[aqVd`0`@E@ *r ;M ÖB X@*e?¨YLЊ6FKJc*Ŕp0|)XRe:\*z'*_T, .Yw+/}Wt:- [>;a#mIvӕ]>qN*סere~p˼I (|4BOHl_36P|Mz[T2Gֿʖ[_vŮ$ *LG >Me>ڣwo@};! 0%d X a l A   ! ˖A@ ܩ"'ʆdNFnX!,e$d&djBhLjFb(*fp$dFHI..2BAj&fFÎm^$8DiNLPmvǚ榸, "NMDPP,PP'ְ*l Ġ18jlaa 5ޣu$3l%")7Z20  3ހV<le)0|| .Ti {h11  D`aX`zj1ۡ!l05m1O^+A Zn@ThQ^ taߖh )*lk22aO uOx!ma˜Bݚ,`ǣF>Cth`̢%J%~hXjHnd(UGd$&,%0p6$bL4+"mȦ odjjmì"k ʊanκq*q*pS rg1JS/ `¢I1\*I/#3pX6) FcY`f2>$2 7ۄ#%Iz@ہ/"$``2u!?o`1xH֎{r R;QЇ9 0pݚo 9qu=i'_K8xT@@#/w^ϖ ݑ)NrX 8L* a6!p0C1$15\MA*I(meHrFHnrPfl2(-BpdfMn*ΩTir*_L LeP̧Ԃ(BK^liֈ.,ͪN "֪lbDT$tuoIgo5Hgwo6u:" 7C4G30זENڃV@W߀@f:]Kzs@D E L5* h;g fٺ3@= @0Qp\iM#q@ K$1l( |%!` 4!~1Mw4 iznt#qf/=$&&w(4($^vHYfI4$Jrlf6>H]kP*E&2$N߆Ir&fln'F&JnKn6bzXQL΋O݈ ? .A$q p pոoa 8 .rEcZRu8ZH!?Vqٺ@W{3`/ Drk$zwTq^-\#Soa9Ar0u0ֳ6Lr WT0IA^Oϯ7r]|>K:/`"ڤpvYRҀK@.b)Re3Dhҥ< HRP"F΄(H\f0sؤ|ĪDD,..+8A"jE$kF4}V,H+ĤL+$fn¤mgZNDq En &$!aہځ/a-aa܁A?ITuz6&W4?3OF'K]bz+Ԙ"-4CbvC#B5^KC\{ +CH0ѳ!(><)H{ѡ`N(;VB=;ljg J(FFgDdLjLzJ2J6blLH\MHXhrJ҈wd؊pbi6g~!p&A(m&ÎijJƌ00@ x G'` `  | b`c` µ`|µ8\ {M2&iSn@w6+aY 96EZps\8d׼z;r8c{C<6)ȇ 7b>G`bxD xic>DEc1&QȈߨ=bA+H S{Ha 5(IKPgYlkpIptFS&*PctkJ ºF,M]٤JRJ,(z#hHHA*;*|ˬĿptZ%Ń]DZ=kgCca1n!w<5uisvDs֪]Ѕ)G*r[ I|f}k6k^~]c*yZCL6|<_Kua4a(Fb؃`M,^O'&ƋT2`8lF'ɆJXbAFPxZRJC"J⤄hjiG!J"Uӛҩ* KHdP%Ƈ-LĩENl/ n:(BD暯Y1t- ǻu2"i;8U156WHYBtlƆjǰ̴,տ ͒j ٖL .nĄA Z,AʖJXP2 :P@3.\hAAndIYIM#B[Ö0]Ts_ 1h&eILOeJѣ!GiIX&I\%M_UkKhYҋZ=Ζ]/Z\qj˖.߿wfܸ C-CJ S(q˯!jJSiMQOȑŠnHk/^PBb#C*d@.|ʁBY0ysM.yC#WN]xr\tźws%7V?}Z{)~mt-2 )`(FI'prWa(fx} EbDXl=k<&d[mED"TLE#B&(iLty&ӕeI]S&|SBk ERh5>8܀01!I )S1ÙX=ҕw嗠+qdofViŤCuPg$hbƤ镜XX])~cEZfEm<1ɥvi&ЍҭFے#Fw\t\{Fz]{ntrܵw`zĉ'{WwF\.n tx܆8"sm_Q l"-8c5vUݖǰˣC䕛 bЃ'IUcAʈa̕}bbAF*e%XƲSf 1M8S)mWGram-`є”h"[ 4釕 Hb |5bʇq!OxVa(Zⷿ)s$fDY݈=2MjL!5~Ӝq:Q#G;IǍ+E4-ԍ!PncBJnx7cRGv{q uA$7MBY*,D|IGx@ w]e^@ybܘo0R*%!7ZGxKٰ, 5 f,_j!b6U0uYmL[ІvUiڲKk{洬 kGFwumN;I)noӛ4s[tm68}m3nMpg/q' O8ƥhsԤŐ &s҉&qYYD ͡@hS |>ĐܢyͲk]E(uʽEoǾuc}[u7][{\BPՉCt'?#w~sg+jFmmx*>u5?no|1S^k7MC> ?_zv=Ow={_`n|bH4fٟ(@?R7aP'$P;!(lal#~فbvfL4|Y(B-e]CscAG@~ebt}Atww~7~e"fi[ehq}.T&n])C(88-x'b  <AA(9Yerw24DXw')P='4؅S (A`hUȃ72[rHe=؄>=J(KhmDpw8 X X:?艁mȉHQPvMxwczZP&%e@ts_2 y}j84hV@D7lruh}Bwbץt~%AW"h}ȁh&XDC^DH٤YZؔYw˅wPeRj(Tׁv`}gbYy]_bxgFMP} 吸(.IwB!%zxcxc?I\Fȏȑ.yWW]cy&G ؐT(8[hb&fc ɕ¥Y.-JȕR(CA)dٖ-i!HBїiU8Y8)g1} 4]¸g LsB'?5Y,AԨIX1Ɂ؍?֎d[|)ăOitިY[YX_y@auByI.hy`ٍ ٕ![J ɕy~y9Zw[S9ُxHzw3)6IPi%iihؗ ꩍTވؒ۵bّvȑYIAW8sHYyZw0b9y X8'Z;!&>Y'}C x}IxЉdg6IY(؅\i_|5Z騾LV؞]iԨwy!IeʔIY͵Yyoҩ|s -;H)Vȥ8똓9x*N7_飳<:xY5gi:Uh5P9lk[ _a:!鉀j(N-A4 &Bft&OAi0N% +b3눫"ڨU3k.vHH*TzH6(hw* {c8ȭ:8Uijٗ~M9>9)y1\~IRۜiH*H鷘0CɕJ).(B A;Y'&eeڴF]>fFC>4(͕}2pAwj3LgY)(Zj&iuyug:+Ri~iH i`˗j[ 9Vȗ2: K؏o뺄dVؘHߨ yg@ɷ;ɯz{CɾJʶlL,:ʿfH\ Y39Ju;ˡ2L[; YFܔIܨIڊ fXc|눥Ab\"g;1 ughO!Zh@B}+:yZI%exɷG4+wY8<{N̍ig"{*\jo[|K ˕i|㚣݉ۙ>Z 1 \ɼ̹O{™03)V±uꂙ|:Bj3IdxLsɷ콺`Mk}gH44{twZTL.JeGVwwƬJc)|Szj ˕fQ\ٚJʀXX*I6XcĔIJ/Ȥ9 Pi s)%* Qm\ȃ xkȆ~|y\35ւKxZ8{a'+E}[ǣ}MQ'-a5c`12]92C=Pk11 2 +œ~c 6Z[TJk=i(EV` |AQj0 ,ݛ˘Fk} @3640,p  ʂ`˴>{Dj(yȹe,ʏ]G-g|X;+zšm \tUm{MӨۡa9I ͼ2u9o`0/9Ȓ-2eD~QȕA[TOԃ>,1dbIEj(R)jڰٵ D߰-;G3TW˭~pBmyb/7!ư얉$Ȗ19 ˌK z,IՂG4&9e4P|31&.%3멑zȦ(d!I%+ J+I!BȝLk,쬫R̢F r'" ", j$ ʦE -L,"E}+uMD,Α#A 4&da K,CX@ bn e54bhيHTK@Ybb[}dhC4211)H@~r_;MhFBi8 Q[yeX& kJC\&4cY͒ )R0kаO &L{$! 8M8E$bq\E}"5lt' ScdSe%IEӂ*'J4hL::xJ,8k ;US@,U!Gg23ZנaeF aNrMMky c ֙RgN\C-q@մBo=!!<0%",IM.%&݉H8$"6˪Mjv1a]B ;gگl2*egUjjt(Ts(S@BiB/˘# SU@NbUS Ki8R\A+)>$HT`H2(q3:";Z-c|d"FtVgGas7s97RgL4Q/URGiuJ*H(C Z E:{Caxȑ}\F9z#xԕ783Hk-~@H!{-H "ڌ2ܴ2<܋F-gBZ]B{L‚*N=0FW^ KX L 4@VMM b@%׸Zqg=dfd@6W>AtHACAp%H Ӹ5% RWbΐF\~1a]koesO/who%gG:8>)&9HS~Ȍ"سUH| _Sw̾D:huYqb@o6J$NwzRn78Ed"ŁGbFV2D/xX% U=c j;8َ &7QJM0" Y!Uى+409j h;iEK#r,w ;E:`b"2G&t {9 ˻̦WS7 )%پ)\ C t`QqNK=W 38< ʿԞ$[\# APtL̿BF>xbQ/uk(㋈hA4 Bx @M!bM0W??.t̖s|8F;(IQq|7! ]$ SmJ,UËTKOlLL9Je*A"ۓUג mgۓ39Ll/LuQKC;K@.I4A(qԒO?A/>}E4>ʮԾ03ESᥖ*Αooi9eo>VہooooV.p=oH0P4}f'7GWg ɦJ܊豟.!SMҸk&K'sL#l&'&'>w ǘ'r._r/+oN789:);=:g?t@B'CD7@shGsKOsPtKuRtNtN$StWsKIG7B;ͩuV&azXLXi9ܤ4pJ١Iry wpoe ͙tv/9abQYzp CQ /#~!xhC7xoOx'x_xxxׇrRÕOްEje_y p>Whzygzz qzz {({e({h {?G{7h O{Laz7| ӕ#d w6 a,?k.'yoyԧsw_yAmr0rXm4dJU Mb5ܪ5IMɼꗿp~lF? .T:%OdJ0uO~S1z $oپ *gp_=hI8"Ƌ)"4"#N1"DQ rcƏ2Mv|iQ&}r32}W/QG'B<*[2C1CFC I2 ӤĊײm6;4`H3)ٳ21285ݧcP@-S1e55~xeekXr͠=\jϔ>kӘ++yvPuǮʘ1gМy+*\ʺ4D]hѣ@;=yqiϘ,h̅ /K![4Qt]CA|Y7vax:iTMA(^ B'b&A%b %JUaI#F:ߐ=Bwr'9Mz %0 D/ [e1N ]}Kr\u5 浗$p(A)Qq}f*khjqI[1ԥR:־ 5mT}*i?UcO+%W{x1B{ R(;\GMdDyy\/Vӌ~!'d:.v\ƾL pXa9E.1 )W|wxa ̒5L&ʴIZyXihEcGL&b @8| 5A(a0 C@p0kǁTdf3UgƙNզ:Mf5(.9e(jĥnwC ~ $QFᗔ47Y;=Gu#PM'kaQ e(_;E"DvlH!aWu;9~<~" xJo=m/Ջȍ!ib)\֘=J+^0RrDPeșh+j_"1(O@k $4!>8&&dp! 4P @X&r-vP"~ahǔf"H!aB.*3AaX51[QE}v1L9Hި#2G8H(2Ix·iIH"'$5Dϱ%sk"E=64c!9s&YhJӄqAjPU:7$T:GϺcY*I1પ1ƄG-Ab0L0#$܌$Oe,ZIOB%Pxy!1KU*d>#*c@5cMq/miٷk"gQHBxmMəAB*t܁Gw?]pS7"2MS8œy(%sbtQNDBwF9*f\@oJ ?T1Kd0-L}S׶$[^$i&빙d?o=)wf#KKtW|ԏ\FNx_q꽴g]-˥ts+oS[NX!/fFQS2Yq)WXh0۶b]VX> 4$ (] q2xcxcD19u <jym Eld MUpQYfSk=EXqD(i FYD<@m) 1AuS] @+yQDXWhKl\ܥ1VA5џ˩˝-SU|a}Q]HٗL>1`I9\R`.F`8M4$FjhlJ(c2-a j 荊5 aMI@ ſ bO`XG=aCby.Y9\W1T`y(0 ̇."6R&ĝşMW K1Lƀ1[n,Sgmbd^3F^VX͑M=}d>j]XAGlVtNJeNz,O*>BDC;ȀEEf#fSڋʩA1ECH4~>"ziyy.<zr)'D#6 ydG;߈d4AU[6= gTJ5p$AƄBN lG|d,'1%=V}Y\$?BEgPԂ9T@=!D0>D;@PlA(aeQyCGH W N~x$C|)< T'b&!~s!ybW< :Pt?&N jQ!} S=`VL~Lj "KtUvE:"4UvPYuZh,i>P0 F _RXU"IC>쓑M ӿjS cjqd,}hkLiFqvHD~ J=YlMaZE5%L >><o֖aj&@CR>@#ŠdE0!j݀_H"syzR'=zN׭fdN$QE!~MMGfE*;h$>b:]0NM Vơorf=dJ+*VddU +|0X(/dBŸZxr߆$4XBG"o0Y!љyb1jF$0 i\0^_etAF(=nxʓ[$Y؀Ƣ[3>F!-7fpƽe ˼bTkkVhܙ焇h92_^]kCX @(xQ`\DD+ aeM-XCAA1$BhfYë~$f ~0d^~8eKeGys6 0*4¥CM"r6xZ^#Iq2a&4)r`rȪCd}Y O>fQV:DlE]G>C#<2,jyNPw*ZW&,$1'LFTQ ^uEB[ѥ %^qEƬEüzॄf"!LgD&Zp8pJ 3bJ=hP Tm$qݗBFEt4yQul2藶dgGz*yo`Cؤ?%A( EF=zb M CX'Gl2\+=/DB1ǗLDE.b4s~"YFC-܁p|s*T,J9Kd?dWf`CzF`weUYs::s1Pj#@2DuLZ_ =Hq s yn h܉ˎ *]^Ȅم0ȒF{l-卦9j~i~Ԝ6p8-#McEH\bD琇CRXW\utS5}^d)zD-Fr"D*ßr.^.1فn,LJKj4r쐂!DJ.$SCo @aQA?~$X&Á&[8cc˔%9/;PeE%~y%GE1 K>y:-`%4B/.U*;<@ԂC>0? 5"kK~ԯGxUGzQL f/rX8̮Fd>E f ɐi2ςYpS0fm7} 6RoV7B%IèڏP6$ ψٜ<_@72zV}3BLD go*CɪUsX 1č pBQ-( oXXE;D1Hv46Ud#PEu!A!=DWr8H[T/_Pvx7Qr3XX&An=T&CM҃5_CD#Aܳ0صٿx׃.ju̮ĄGLHk bjgv2] fBK>4ez=[jlch {{fD[ h n1WOV#M8߲e\GURF,  T>j?/vr{bDWCpD8D`1NLDI4b #" 1HZWVFK͇'@@%>}bgS)G/ھe,b\obE "}!;ܸ>%uQe*AkJ !CӾy,mԷqz^xdWWcbZ'X}X:rj [wTg}p,OdΝNe@>>bTIŘt9r}{yŊ1Ġ4)ӰLĔITfckׯaOڗMb7ЮXLbxsڌQJ2PΡ?Neʬ/׾:1ŴWb3^e١9w{ sǛo?/>n=ePB+բZb".b)rI ČlE_ ɤ46Z2S)1Gѧ>H!hl.i0°b8ˆKtn*|#(>* %.D rТRr-#HPE(-4E"S CgO˒=rp:c̱Δ*E k1HF&s"6L=B)S<]H,&$iOG0@ İ}@CI4QoakpIl # rS-I}PQ?V_w?w֋*fOe,Uz,?s3ԑSTSreAQ D3Az9D4ݢN'";fl̕H .ƞH&>B!tkT{O:4F$NanaܓMHś ?bBh#z&޴شzݴRۤk|#)#1Eݘu-(7VƘ\2I^#qߘDhKc*m}K#8XعaC! Eb0 lh/dI _~@;)T*9ӎt  + ָ2)fjacbV3Q[sGS+) EԙT*HM3ԣz\gB=j&q#)rn"bEn6}EWhEPp5>չT--.,W7 FMQ ,c^`fL1꣘#a b#ijj:֤E#XbTQhHS|șwIZ90I n@4#]62e2"?F ԰ L !;(c:Ptp2gD* F ; s{< O}`gA1 tS+#ƼiƐmbyPftƞm,\uR7ɮu]DPL"ZTS(4ih͊h+ygnZr*]%0L&GmufcnE)4p@q'UIQQ=VE6fȪ (?QHF"(U%*"d%UҪP U#JY-fZgB3hb[f/c)C Au$bUGS; P& uț C[ex-{iύEw@t)1q=#+X $b4nDWW-I2ң1լ(hLbddA^[Fd+b,g {RړӠiw~۪&: qHFȒ6UL΂UMT(DȾV#\Ƴ!ͥ1jD 'IB`55cڴnt/x_6 #MF̈́G q&l^vAï8 4edb ,;AR)~ƍtraOt˓|":{ am.\"X5!)<HTpdhSƄh]~j)m)]{aӌESJ'6:t%KWD\tXh+#bUm*d6S󬱱W]c'qZm]R =rce;+2l3T \dΈe9F$NVTSr EIq62)b\GjΤD2:)<5 FoHI{Vl)7<E8[PB ]'1°ȭR57a{JZ?͑{'hg=VGfNub)*Q5 ޏvê Ņ'7EZJ a&.IKB{RlVTDL;I ~,Zrf\V!o+[oWQȔdTU3@ `Ep@-8Ww^M0S(lh^USE4"jxfZ,]6^ci@HBC#*g .9vk (9)x`m?#c)`#cZa? (>l2cfc, DNƑYR %ʊzhƽLg^E.)+%whPhD&†N:kÃF I1DqlZemƌW̥-Mp&cnڦ8&V^@^diP2R0( LJGx(DX6fE1Xrl)٨W:DDp"F%L,2%DsbnB;/*ʼ"eL'$-,)o , 4+8+](qz衴ЅV:3jb6V2\M% Q> h47&;+@D((i=Ѓ_J egNl#)HhPOJeĀ&Q" !/O $Æcmd:T~FrQMr(vv,Q&t O.𭐒,ү: 71n1+V@>/s-? iG8h=-o,MHA8,+>pZv6lKS1J6&5]8xD5e@~G}: A `q%N@ȶ,hfLM<>^M92[Y> %>^M+t K)J9#@!c$[ޣa#F#3F{^'ވV"ʞD.8TᓏP` rlh&@ΌDLH,æ"Jf.*ljDwpm\ ax:wH+=kfR  VFg00Q.&bAsCxØV@Ez0(~p>tPXӾ 3f^_ <$.OqG=أA@b4r߈EFX%ֽ8+"G8!ל z@dedds# 2!eKeIeiea67DdߠefewkRʓ~N iE9X3oOV믎e$jͨ"l,NGP1A9Rioгv2YZ/Vb[G"*3tZ֌:뤼%1eRC nV9嗂"c" IDB s D[+4I<5zEzWSnIT>n苊5 ?.(rXDŽ9oXdFyL'TUf嘯Dp%#j.5w萱cP1SptenOx!_ h>.PSUuQ7?:saktDABjo:u-RSҗ8OFP5a;t91os%,""|7Bt'(92nF.Tl:+,'wXgqei۶y6g6ewY};7^ru['6~{ghE{[V{ۻ;{Mk[[g;{X@s2oZW c2w9+vN4rIoq#rS 8:fsK)43&Ԥ#:CxP4#uY6t+7C/ Y*n;vRZ'GMΒVۊ" RCcʷ35I@3@"z"jN&r|͉hZ.<{t+]"x]-z|y|;L'"5SdQj™A?\ՓX5| #d^F0سsBDߚtDmӎjbuNU`]2\~u<;߾$ +vQiTlfwQÌ5. L^x/㕁ŮDyM$uW}%WaCPHouHWQHU;6*} kY 8 yq>um6(+r6d SFr6jUp ֟]6\(gfCz9GpLB_=hF`=}-+O2N|hpC F[Xo Dh!ǁ!3A>C 42iDLzO<4iI'&ͤ49)M6ň )Zi-[&F 8@)ۤ,br,R n&k 6ajʹ% P-72䶍LYf0ms̡+y2͏?946끪`BM6]*$hdȑ_kD`B T9񣾍,GZ]0D&,p٤ep/?G,cHIؗN0CtX=ЦT` &H[L& NHap%#~!y$ X%Vč4C#RdwܕhAT#f!U~ $L0n eP b(T=hYVe"-CLFw>iF #k2@"Lnm2p¡"n֩2lJ$@,՚lVufjA:exj\lY*ua4fՔ ww!z\ pQGD? {r GAF#u2Ћ$Q! VyG}NQ#5D\{/. GR{MFHE櫱vB{$PD% P5*bAUA5ɖ|IZ-}xEJ84I\Тb$ i\t!}*[ܑ p, 6o飔zZlvjeeb*Ys30+#WWTI+}5MI-49gJAjdxY5Uwݘ-|-cƝ({m!9ڴ~v.OH`td+z-RsaHkO=ń䅲NP2=KSm%Q_NbC3@Q} "*3c@q؁j`S@d$/}5\67FRqCa>F(r dZe qIn0[Q鈅9sCמŤ,ʪ|>'@JC"EW(8A)B !_Dw8)OXDG0qbTSHGj*=9I↘- aE4RŊpZd$X&ĩIQJ"T*bYYh6 1g㙆3eqpK&Lx LS/[I&Nf3kS[٪£Jnfh̆N])OHw,=g˜&!N䘥hC,"i`^'g7<_J)C=j(v8:Hn6^CgʳW+:{Mܼj硠WwT䭚ַe2R N'%Fx礵ݯ F QOX>Gʍd(I2A2*zDe*3*Vd q 14,2 PDB-8x*H5De&LU3m0 ƐFnꆪ0 ideSsJA(="L8!i^NzrQ`@,J*ܒFĝ 1Hr!R$93[-"H;'ҙ2a4]5d"ڼz3C1 *=uR U%a+zbGjk1- h[c5LQeUHlmn,>:|6VL}#;g'dCUE租2*b9B"0."$_39(W]{oΝ~/ -?.sdm׬Cʳy)v8Pؙ| y? )D<(RqZhle KY }49=.BŹ /<'pٴuS֔iT :6\P}nH(/S`En)v 0 ʃܨ=aܭ=7Bj2/!abp oK`ߥ(FYy4Lu- E8&wdY,](nr_+F 75"3SDP%gY6:Єcr(C z3HlE5⍚Wդ U5'OO1OlAwM>6'5"QY{>u 'qΓan_U ,68;0+V`5F`xP  ]&}?& [pgF\[5a=bw;5XgWyzHef$+}$!RLa-'aq#;NU]G0ޥPq"Y Ss9L29U!rRb_KcBK奀aAs6|P'Bdڤt'*gMt Vj|6+BB8B:?cCYLQ /tP#EmP{5aa2p 5 b YsO;RP wnkGap=v n4\00 Zu,!Pȅ<L1c[>x 9. 1 o[c  VTPAY=gb-"c"sPhI^%2AiS%0%Z9p\2bۤkgVl)acFkLXNJS9M'7%uWiu,u’+0QY`hG\,EW[e3!np9 GAz9V^!9cpn?kFY@͢gSw$bsXA#Q<S~cp Y tl!`zYRF񀴧&P[cl'99{g+dΒ+1QDr=1 E6!,UUq(KDq8mkt%4'%7扽 NwT7rkF`@<8S$qD9ı.FRgq'qv@ˠ0w73X{EDA s78 2Z%+G@>UtfYѠ77Q%Ve㚜ׄiEJf q`lz]0I |-yby]Tq)c8+O'Y#Lh&T7)/C?t}`*>Yࡖi*(TM#ԕaҕ_kT6\WQXk cu5W$H8s59f@ynAx_U9-1J1b= (7A<J0;6_ޢ Wg-jGTVɊ4䵧M4kh67I,}sAbt( S8҂ @zVH2vO9˰ FPpv`@> :0(cw#7Dz5/X!kfIaʅc )p9:@!igp 謸Q:{u5RhF+>iTF7W}=i_I3l%ǠRgu*~btW&~DZI~jtAz8t䳱5]8bygƫ="949  j ɭo'X#UwߖCʮ䊙rцX0v(:?"2(1`(FQy)@Gh <&^uZhG'-&9EEx$q6/Kh*TTXEt[M!.J؈s@31 "*'2MTjb6Z687kؤB7 NN tI9&Gy?a&h2pv"u"<5;QF1{7@C73d3%3:zִ{+h\ģePQkU,=fDiay2pJB+31Y1&&"QP0amQx ('Wz - fuA'|nQfۓjxArxa`3AܵrRT Sl qHY09q>r߇OYl8=une'Jw_UO_j8D\I>2~ƕDp:fHu2RU&B;ߕ,CcFE |6^j%iEP}})3@e ZPWzr! n5(VCW(S + ur'y r'Jsr`]^lB|`kː'{' D5?0p'(p[ !j MԭE1Sf#Fs A!Q,S* U_V|ObFŌ?ܗd=P/LٲPbA3iR&Ĕ)X> ?n'&ͤ4ж:)F˒%,&ԲL~5qWYʄ7'./K0q@"Xc2ENVE@-UP(俟x2áhՌZ+2ٵ|XC~JT}ߤ}'|8I.g)o'ܳbH6hl[Cn&8 RTqE hl<kF9%oDŽ(%| <{鮐I)B Ш@&Bja4ي,|tHz4@c:a 1hJoMN$eEeP0alKkH'4 56&Mdz4JT`L3ev% 0e7n48 [6KU- Vk -X-WKnv ,sv *9rLB>40@=(J%{Hr]z[PjĻ..PblbXcbl=2xdh$y]$#rW&QeZ9~ ?_$?CHF^DOhO =&"ؒp"+RF3,*&IԲi,v2L!%1SRr`|) rn#n2ћ #;Tܙzu-k):"_'*ZaCr7pmEhIhQǠrAp$^L"D?Ҕg&jȓ@ gWvh c׹V3M/a#PF4~.cRJU < +XMѬ<  ҦȈoH Yq 1h1Q.R$Β + e:R-ȶe`pE ήd<AQ:p0)qO9)W'ݜꨆ\9!eI8 `KeH?O{zV4n $H-H"A:3Q<#&)x" (&q-0"5.F-2dbXrdAW2Uj ;kHDI)}ϒ|vIV=ZO*&,oez>Jx)x8Z>̂)3t^ɃPˊkϜJN&^ AMuE!BB](DDGB&,dneG4mJBWK$yxQ&HST砨>9,aZjӐ7O^Z;_W/~{_>Qj/w fp`GX F@eU#p=LdB<{0 lxDz FT%<~(`qf끆z0h0!6g+ɨGpPDВR5Lw)r ňEMjC^v:;hrvZxlre{)Ɖ~O7 mYKؾ85x$J}Sھor+Um5Rd?+KLV`~+mIw+Hzl2ɥD;&2@Bk"6 -ƱËHҠ5;}{[7ow}pw>yHi:Gܨy0YEԃ&%Oy֡ZBHhAi qi>zG:C ͍7` X.7}(ԟ,Q:ԙpӁ4QֽkW{F$q{nwJ;!ؽ Ѧd }"TU dgޕpqQ+b!_+DWa496w[v>,IeGn*A3kP ^Ơ=Խt=Y3g7eӶ{%rh9# ʒKЇwy$͓7wo,y }zUi`8`YDKz 0@zL@ a,  \@p@xX0A*0)\tADLAyl>A"A$$A'dPu)_ڎ$[ 9B(${a@˫l;}4Ʉ6A!P!e4@ғ)3Bّىw1b0pې3zZ<+/(ZDK<(1Ej/ܸDx H3 F,(0wEr?j. Ҟ[*+Ѿ5!+8I1>)I"_zs 3 [#A?ٞk 9ǠǖoTp1K139GP| }\{{5ѣṰGzGGDŽQ,@*Jy7Ӫ:rR!bA3-x'S S3t>i2*:ߘ3QD pQF t$Ô,1hP+!1. %ƿ{&p8 ͥʱ#fqQqy3ƫVꠁjڂzځ(I{<:[E)Ȅy#q-廓PV6x% Y11Xӳh7AS*4Z5Ȅqe޸ L@Oɭ\ 딡Qݧ͐h X %qfYؕ]P>4x VG՚q6/LLm3$(TG ~ҥ d39*$ň^`BDZïPUw!RmP `oZeS[_K.EVf%&u kkLcF@lӎ!SB1 π}aj͈e  8\x \mLa]h> #9V fUŀb@05.NeD(k Z`+Ll?v_ǻLIC*[*\0Pƫ;5n(I\[5yQZHdIe-p] 1`-$`5-iY s*xyU8i?fWK+5 %4@ ծpjͨj6`e%d,\jV,fF:IE3դO.4%#R2жl4P-hW8_`7-hi৹U΅E Д@7iPȘ~r(kɄ1,a;lY>e] V0ڰ: 5%J z%1Z.ٕe>..[ iq6n9_;H-/Tҹv,2N}:_9`=oj+ .+xKNEߓAZ >a(`745 #{-<>aUu4TINbȔ8nY5VH˒g>͎l88PT6h0oe30%{)"ٝ%%99Kdr#/R K%zYZMF;Z$nsaۙSf^pz=4 kWH@d*+@8p ֛E n0mljȉ>ulH-{qfىhi /^)4C}(w7c~ z9eb.F#9m enNij-֞dZh%38e9ed)Rximm5Ld}HNZ4:C,Q'a >?λJH<13:+E]/2zR79ʄ"0fr1ʔŞj2M}\Y(bēc:8cobNqŴ?_2cF}}S.?Y;񡌓oN@h'_G ] 9`R= M JUA9 H =F"aF}"q#Lk)HHL,$X9D2Z%JHc!UZG"TP=%PDe%eZMUIeZKšR+5m >z$XҐ3I[)DjT)hlB\4+$xYidVP|F[An$V2D$FDŦwLvu]}Wkxy9j(佷\qer)뱵JTMX_ULurJ EuK{C<\VAđ {JM#qaʜ2$VH'#=IxmN&t\饕>Z +GJV.7+O?4SDL@^mFԏ}NvET"*IqO2cx eirAE鳶qk-LmEg$jDKᄛjx33+xc~sW97Oq&MTHUmu8uj 鼠FG 'MINcqc 8K2 {J7 '4PM6U>X&B hIG>`dZ4.!gZ La~)pF.j%VE5,1䳝yke6db5RYER21 S@Mj ,RbݷFW']@sZ"(yaD&PEHOE(\8t4Xd`EyQk@003c L[P^`:er%ţb3$(PvqVJ*W;Z<hDX5,C HT{H:F#LSK }e % D% 4&WCz@C o02~#6gǟj$j-#(Ah1fHB&Ev)ӮЃ4qytJ"C{B D_3!GRK UG!YZ-Z\HfBMT@Yu2FAZe$J/Gk Lz@VQ0pK4 7-u1WkX0h麬ES%@zX1pBQO YMx@ㇴLe +Hp@τ8fX:+iT}u A\=i$=䥈k_2*y8Rаd}>n -4R0AclWTM5vՠ^T`d]Z"Yo 2|V!L!TkNS6u/._^]2ˠH$0ۉxr ٪ɇ [&Қ&lzJ"aKˆphpX3@jvMǞ}><9H^b@ܪa<Fy%SF< 1Tv#PY;+pvgT-4rDY LJu(A(#NK[@ I@T%!l@$1&͔zPʑӝU2K3aiNETOaP”{H63TF'яaP1 y[$a@DDx"t6!aFŤI\MtQcF̝DU8͆iFg[=tؓ; j퍠KA E`T ,QH5^DPXX_܄`Y\T6VLe JF AT*@ߐF""Y0Na0+YTŀ ],S\U,` C`D A0hcyԓ@pTidDE!ʝ#50MP3.g)ϟ[텫I\8'D k ]*NB茁F(˄$d nТ`Y8T #FMXOd- aLMd!UDMڄRcB %FԁdH9&$Oǘ;=SjadtJeCmAA?!`q?HDOĖPDLKl%IHdEhE 8 yMtn`hfiƘ[Nae]PX^@df^!n] n1LXFaŸi8 9ʡb):cP" 5IҕbvcgڕD(b\e*@d[XSffȆl@Vs$N^\ZHs ✫YTZN<ԃ05"&=a6 V )Vii<%xxI=S"vbᝥ1 $nD]2^檁bT8Vlg:lQPAJ(愢z]lЖj:HdI1 ,^'Pڳ>Xp\W"$00{}W0(ٹ2e]ց$O Ok]l!&LaH[bj0\4eRn^nS R뾮m'@sk4^CBAČdb=Z&lCyuFSؑNl}'xvJgɥJ5mjڒc„glb&=-6zQ )f$%df%( Qer ɖ Ǧo1]/g~hl>V*DlӽS )5as,gA1 O H7"\1`.5͚$E)#{n ~Bv$ǰ4GtGldso yJ87GyklPIzlILJ ;F<3<<߳SJZo=dz?s4+$nV#ڦ\\R&\TmEg^C^& %%>29)ge`oe[ضA?&RP\I]EDo]AmUJg4d /\-oE޶ <͓Th1/_PwwדBB@xqyczz÷z7{[ʼnB)u7z߷|7}w}w}wwLxwCKxS/̙겄 >>V(nW݉Pi-trFT'`/hUs*[mjM(RbU0l+3kkX)e֘a E-Ht"C&P}Df=XR :esU[փMy=Xy"`$iĝӹDX4n=eZBzaEڣsPPK^Wzw:Mx E bĪM/ zMԺ9z/nvnd*^ecL׶\XXe mلׅFYr}/l6loNō8Shڞ ]{*]:# < υiaW$SX &7 Mشh]ݲ#Y#=>q'6B4tG}vkō`)XY`fsdj3'v!`^?ߵ>S~C5Y˵ͭ~v2(q ǫ>o컾DZT~x cuGoFs>9W3gwGq(clGllxp$?xx(sG??qGyPJ `M$nS >eыV0Z=h2VO2} %^} 5m/>1і*/4&eʤ2eHgN:IOL4i$M}- %}R-{sgV[vlXa{ !Bʖ)X/͈ t!¹%5xl^x?waÆu ;TvӰ5,e7w|$gћ3of;D&%vxwXݻy(Y*hz7UE>2|EqÃGc}/Uvİ Y7#C߯XT-3 $S&zI j4LSI h웭 5)bHLb감+<˽3+ﴳŅjE+ .6(Dr}dQ/BDRIT&޳.D 2)+13*fHM޼3+P07k'2 <$Zn-ēЇFH˫.1쩔$Yɥab&v(b* }rI)110`&( )"Q˯9JEԵF:t+.-WF' <WTL2}&:weKq" ~3MɄȹL&LIJBJ*}%h"+<HFb*H}Tem7 #A4h5 {jBv!&_%~꜈ i}\6OI֓s2 3&HMz,dܹ1.1KđhCUf,(LDcLOL&615$?Z ;)@c[#kk:֯==n ]nk]j7:ѪJd' D&z  MzP̤+!b_4625&P;롌U;JFk!`dU@~8 2'{Jp;R^ LFBÅ$ 726x펢a!1ѯqdʞtUF|ֺRэ(΢2SֳLDȀR,>KF4ΐX(iSgC#^TrɊhvU|h"*1yy%#>JHNKEvb-LT:? Lzkk]2 qvT&Xv*v+l9,4 YqV> Hc5ʿ]m9WDY#Q`DWL1 1hxɔHW 4GBAh H~J=iY3 /k @]sK 9.tk\L_vŤN1zedBD2zb5IԹYW䦷>tdMѫ| ^U {  i #?RғvU *V L`"qPsI&pj1F/ إ!2[KQ6rRTKB˪e?&/M1=m*d͖9-aHVɣ]uq+G|Ș6jTu L gFdKfht79n骠 eh•fr0u~.H0}$el^(ϴHz"*B$-鷳9vUt/^3jz<").{Zz(4]Y[ e=6jkhkؘFiWqUЗ.-.bӸ>L1]LF4`4@Fb4lb"D.a!.{'ęկ-3'7.$d 3- elb*FeLkE aE; efe] ?gDzMRp=G}w= ȅ=`w#)NUbdxn%ĤȬ#&tAlצQlܾBFbP!vBKrHDBBE%.@T47( "he"DW& Д(ϮTT-؆M;Ơ=A b@N "AAHO>  `B'|BL*3l" bgFN -t6!L@!!3G΂$GMv&7,*,DLY,]a&A4!\Tx.bF {fl[,-"%>>"RDf0C:vʈ@-/&o ddfPqb)#EHS"J/Z""a`xAs \%! &}ü(kYN#]C~$O&n$eJ _&M#. ѯrQ)mi ңf6 Ѳ=!p6qtJ Db"I+2pʥHJJ*P@ԂD0 @$ZoNZ*#{dO"d)>D:Hc1F4>$@2h ! +I%;2W#v=P'"-RI4122}^H/>k@6$\?rb\e(A6&$h"OiJg"(S PXh9 H=a BAM/H"`X&QT%$${"9n3.%D.j-qɑRdKT$/2Чvk5ҲB? To <+A_Nݦ!H *h2Q E<5 `k0РTrpdU-f(a Z pBd+4'4EataK:J 7ZIh@'!Gh7ax3J[S^("g&rw~v+4Z B=I)U9qȒ"%̲&HkLlF\-;zIf-VUq p@ @ RzdGdSVe'{ᷔH 3&_l5q(mY1̏O(7kbb`!`2Np@$u&!N4t:/NĔK̪%ZV ?$GeBYKD;=)*kbY¹ftMpB_*K 9(p䄅0iodcfRI<%5d\b2b6Afy`H&“z^u]cu*&jUgej<*U3ExIQ&4I )dWaf"Z`:cGG\ꈝoo"¿tN1096-nJB?fsWp!+W`+"c9KkP J ,.,co?nuyc3FW(d6 Vf7w+ s`(bNcut|qr&h)ҊH et` pRf(3rr:2Q"vB O,b oj^;SMOxQB$ WQ#tXSNRb<rfN{CĠD&viwg{bynz(8#cio)p1uhd> Ato$L|&# Ƭm: Y>" ~p4/^Xb|>bE۴sGyđ`% sS(v Gci" ;v]֊R;m0m4結"`2U[m$S L@TB)y}M(J6USuU[uQl_b Mv[Z}J0R7k` dn ۷l_eS!} %pz ](h$~HP_4-SGb,SJdzϟ@ JP O ʨӧP%R+jʕ禐.%Fd(E!\r_۶50eʤiʄn_=rϬáL&MpC b|&ͤΝ?Ҡi'4c. e8ֽ*e 7A*;oȏbDcqBTqD'+=lIWR$vR(e-KZAÿͷ|VJW (ʀ$UVR$1&u\1-MUStUR(&RQMRQԖ޴vw` ѨA\5_TEtQ> 0l?p֙iAgYfg Ue21cm88Wb(蠄[HiW4w_}U%aM$Z(DYbZ&&ˬL4EG#G/MH?}nuFX28PoWh BY=dr4wݧwuz+s:62x-9Pd8Q[yo5&MQZjIfeHM_\£ӞfI[Os( Z@L7 yr !sh0[7CDx024˖ʴ߇G%} ӑN $d-la+"+ FX@vnoyHxZ}A|gJ#֥va A7LeTb:kEWҼj4KW Ns_uJ7g&DNJ"#c4A֦ 0 eЃ</rcC!Jfv7゙j~J&TU?lIk"-NHÓh(ШJ,R! qWq11EIhY}/ɪGd 8QBFn5bs 7nG HD(8tA0,-P^wO >qD ;zҵ@Ē(+U 9&CD|2VT2&}, D3uivTHsډ9;G'XAUUuǽ˽q>Z!.H͖!%ѣO=0 }F/:t}J?zy4,Dt Iɧ8ozXIIl`MBVx|*|8I-a(2&a}f"MRV [ܘPR I[J.Ṋ"d#ӅmJJr\-K\Mw+f1޺cwih{csTwxHí~ zf 9t-_ЊWt|W*aqd#\IDQ#niAF!gm00XkĢ`n`@7D5a:!lp U5mV}By>X* bJ'%ru!QR%q%rP(-}6PKe)z^v4EGcVv :3WqԀCSaSWw_$FYR|^?q(}d\#gqw0n$qEX2N>D!hQ:̥sEH$R2_'y,29CHo\z0gew ,Dl_x$ @ӂiP F €9x WaS*=(ơ4UCx$Q=}w#z8r_q3oi}Z)Os=V!&zVSId{XG-'jYOtOƐ[Nau=eb"C9eN#O, aH27D!hpa#u`%j}3RNH}(z;1*kp130$H3h5Sڸp/ hAa4*Bx\6'&h̷Zr)]7s>X8Ps_Fr2`kW\) ?27jE4ue~TgxJ:ـNC\i\zÎ-}!~$VEhL436=2 Q==Cϙ!)WN*{#A6vr鈎R fj1t158vaH `NH6hVD -FB' 9zb%qWtG3XA!'$)b:B$ gLxN܃J2!ӕ8v/D˥Dy1D ~kD2 \4jˀV7ЩئQ ² g Ӷ*094Y&dq6jID7}VB|"ɱYC=Xfj_Fy?q`1FXs2iDqV(PWt>TB솏(vj*6JS"k(bw2q:-V\48g^Pq|yx)U(0!#vыm@ {`e3|%vŒ$ 3 0 `5`)sOBXr&PdڅZ饗@f2 v!+ŀڷ;K\%zOh)mr$s{_WQ^2$c 2q#WYU鉻)װ 87 WYhD!_YGOCkDE)&Sh@2k S'-"" ~Cn'#6:+A ¢ B oPm 03MNx::U1ڣfavG$8L ɢڷ3w;{8~(e}?Y(DyC_gaK! #`J o+ZhÅT":OUa"Jo5z#aIF8˦HRș5:C2\e6榢6 (,AWTdZLD|%u"W+`q쩽hƿ{OY64Q*4DWQZ;vHaUh6!Y(}4lk%ʇ!ze)LWfOH$G'}*vӞ.mhjԘ%۝A*?nBSQSb9pJB=IiHGjc@B2ׄHyDƙD䥲yg߉s!F|h`H,\z($ XBa^, AdMcLW1r2笈 }  (4p'g6}NvgÑ39YS%er(Zd;V2f$7{ 52^&ˑCJPT*u5аYEpZF1[0h%8016\҉"<إ)Uz;ƀߧ?Qk3Jhwha цm:Q~\`_' qƋ[c\Y:}kK8*~SGG}FzÖ2]vj01w8;{H69)2` 1 vlZ!,yUTT]R~8>Oפ@Te$1J[ЉCVP椡 D{+4Dj|k>!1a y^P ?~D6!봵-?=$q@l~VUE;iȷ4 ƕ 6q @ o07LIR}Me)۷X4}i"^ĘQF=~RH-.jhl b}1܇}݄2͆9W '}?|3)DCJ7gz-#6mDkv ˮ&i^&Öb|źVQD礞QB 3gUONJtеF+DA;8p/]Vekf(MہqN\'lט+}ZrC'*Qb\ó-=3tJP_nD˩y2 MneP,Tiͅ&i5͔"P+0+6nlƲ"&Đ)bʋA 1И$?!F̡4@*:iL(dx1 edIЈaM` ̓Jz,*)J)J)- n{1xl¬2L\BM'> >v;,2T"ɘMPKMWJtI**0J{ХD+jLX"INQ #ШX Ԯ8+VC 6 D.1dO+3m?s0z(2mq>gf};}loNPYO*)i-2L]o۵6Ӭ!ԣE:7v5Vbm5J] pe %)61STQp{4G41"Phd̂΢ӄL&Qv–HSP8©)Sf1 /MBP!<& P.>KSzd Mj4FW[^Ȍ5K/$)⌿dd/|ANMz9+ '%Rj:x+S6cI< E/]irS@rY$ -Cx$4jztdI$=3E*"a3!:QAd'X .zI%р26PL09%)јD(g$"ʰa4@PE/ 2,@) 28Ozֳd i :5RaҦ+ڢ{YԚaӼ$P"$-8)!DSLb2k'[:`~zh+bfI#䶗4z?Ɛh^]KT>8Mq4qTXo[2q_Ib3>(ݺxq< ntMSS/hUh`0S|?R3F4q-OEC8)O&@A a L4SFZ]dӊNGY|R<\nG/2N"6!*߸ݻ"MC(Lys9刨3?R5(z\("P3)j6&;6166sċAAȫ1kt.== '.}5rٵ)̯i`6? >@\3r!,|hԼiFCsl|2D)S89 ;rC1,J3,Y,+z, S h&bRWrhB0PВcJ(<[?Hz =gɵy_f,%xq%P B9`EiQ("£_룧L[XYR ICŜ#_,W cGᗋB#I @ AțFFkAW%Qd DS9u< #d2s'B/L22r1M2IP'MMhH_eȎM B>/'<~;$?,c:gl DLp2+8EI)6_@EV 輞H ~@cAB镨 ;Ӄ=(e>Vaa\{ѕH|,a-AKPGm}nzӣ$+!1:ʗ[/`x|VQh+3g&Mز.#bkiHasHB ij>%WͱE"Ddw %PH:K#q fehɥL )tD b©Sy^*d&efVgvhN7dƄjnfiGh;װ62RZDLIeKZBQ-eIuT@ś:di11331SN7 3>.v>h=:-=\6}..|<}jfM@X?\ JW> ׎NI1nS`a4mTOY̜',6,ֶ!e8v%-[DnٶάQoƑ$oΜQoFpo_M  ppo/ p7ߠ U}6-eQ##Z9!!`FLHeuMMH$ oVb.˒,-.rA ʴcZP]q$5}j*.C5(s$r) /}ADWEgFwDgGtHQtHtQVKNMtDtRuQuJwREgLOuUouG/WwuSYYtX_uSOuNF/_GdWv]wgtVu`@n#94i.'Ivc"q҄M`ri?`('MhxV̊ok'7G?xHWxPikg4p芧xqy0yhO1Syoy'yyyx4yyGz/zz_Wzyy7dl}}\}18.I,fgd1H3&&Af-|`Ƙ}Zexd虔.v|i_7GWg?ҧ}1/۟}ܯ}}w7_}Vb#@2i40jFےC V[34+I2 T |cWI}ыV/2 -lÈ'Fo Q"ȋ"i$ʓ*A2T˘0gTv"Il,O sB?1Y:*$Z%֏Zr5P"Nݷ0 1ĢG4M@i@4i&eʤ/1P˔ ^68aÄ#.\2eĤQI]MҠ &pdHX_Wn5زgӮm &hpz׶Ѣ F>z=ӳow#YPn!m[TԢM;"?F^[Lh} ȱGT~ F\E:m|`ʭgfǖM"mbQ"z~z2P(a{!LH Q\[ 5er͍MmqnRK1>b,CW(uŀC^i_͵L(4F ZX4!FZIcä1IhD#zn:*ru}neƥMwRkv*^l+^@iiJг\pJ\v,1rnՒ ܒm묺N.fk⋮v;6[ώk[*{FȀbLCc@Fe^jmecF>ѳ )3f*D&,n >8ǖZF)NˬxWzYޝ*,Y1VWHțEa4 S;{w!o읞%TDbLŞt{`'%;Un<{@{Fػi63o Fqa|1 '\yV#.AfbxCd2 L hé+UI ()F7 8ha҉͑QrV$f3KT8& @4P)!+C _HLmhlRDql⦌yfBG5ŷ( o"D#*Qՠ*ŁST*RgZܰ.{z)tkt9҉`ӣ6GBؑGWҐ2v!5[QA@fSx%BQ )F J5we<$uzΥkZ%@X$|zOo@ |(D);RRSsLsPڰ)HW6'p/} c1BTӠ2A&(b zMLM q&;TCCNP$-mĿE1xn^gE!)zEġ-0d@-zOYM IuMdMePWa$`w@O"$-)MLQ;7+&-v7@2"Ⱏd!,@L}0ɫ `B1sTAXB~v)vZVYp?* EVUYr8RHf#Sk~閡Q4-@ 0y&C)δPiRXb,M2A M՛Bdю$)VG2F2Dޱ[at.QaAp /Ia9!I7,rQBtqTZ "jhTDZCܳu(+mT#S4 )) XW4삅Ԃ A=.$a >$4XAv2| [A&B&AU!C0!/)8P_-T:B>L墪q/#$>lA>DBrA4>0E.b".ʑyxUىQvyQtwp%aӶc1:5}-qbyN蘕LxX䊑QP{ ťÀe@ ƥݕ2lFP 4JVa! aP eapECAP:<ħD9]maҭ>T$eD-b=Ě=/Z4X4&@(jYA(2b..:T YJE%].[%[ />V:jqA4@#`1B2xeEЃ5#nc&)gVҞ_f>"c"킬qb1~!nAXc"dB Դ)5[RQq@uP@*UiѝHP1XQ ]etB laAZĽSr%'\w0v[hlj2K ]J(J_hBh)۠4z$(F&L$>d@YPVop>Wt61dU@sD/%#Rހ)eC|s֪q'tA)\A,ŸM b/Bu)"z zBYLi\2aM"u4ݺ 4p&b2~ z"4p͡Wʦ *ȥDBBÍ.G$u^:X@怊))'D |u2{;J1͕GU9]'QRsjxqkU̴YXxKi~XC E sU$0ZT `|giEgBDӳqR4]_ \^DP(RPF| $ ,aU>ntW_=`EkN0B2)[P$I5Jx >'[ahnhn^we0p6xy YD-cm^ rA"rmC`ijW/nWNxUW&dd~c#YrPfpFKV'`Ѫ8uNpp_iiSRD ˰v qN,)gYz1QǂHvMhX$MFs%]DC@]$\љP:-XIn\(hE40͊9j0y [MFK\5Q R qܟKw`%Lpu}k Ϡn66u1.u:5==DF[B__Wv5W[*Ho2vE%.1Ӧr6u"X _Xg,x5V=*ph61S؂q:(4{g=>&] 4nqvVG1gTJn$֪}.6M$W#}nvd߯Qwr |e#w:OSJMynQt1E"7OX{csjJCQغ-Y@zL2NJcaQU̐Nؕm5c,8Ƣ+"u*À~ _MhGS"YpN@FQd@@olElVY k2ԥᦓA d)QUjt) `U2Ih0Ե誗7A:_֛qLQg21;Ieq|\|`acT5 w2MqT\ | b@Lba4,d%P@&@@υ0B8RPqzFۀ\(lhfO! } pUQpQx]P4'R,x.r`B2P=GL7iu'@(۷L_hӷlB Ċb= ^ܧq@-6da XIq94龟?Jē8TҮ'%Z剐kє)d6'׵8F#)MÖmt͇ %ݗqYe'Fxbhi]$HtƠmC4&eʔ2圬nҝJ/ҙ@c&M4ELhFysϡG>zuױ'oYBU4Rfƾ2=ΔZ3ҙ$[ZaN @"' 2//'ָI,* BV%/b8@R(+* @(Jr"?$e<O"'cj/-(E~ %:\jMVԉd+L h"BA 3?d ňb@e<$ 44Z$6mtKJ ðKmdP4YR 岫[qItT)W}k j!K_;U1M}P&b\3MlQPTtl\qoل^s>My]7߁u_Fqwve\x݅?t}x]`Εxb>[3OwL7Fbqs>lq##vYOp%F܆mۋYWFd?dܝE:dr-viSplplK\P4 4& -b21D%$r p4IFL970.IIQO]Yoa]iԀ< 4*+IŒڦeczΝ4͊fMc7Pz31]7$^I?zo|ӭ}k8>nʏ}ԇo xA/$_׽z|l&A 0|2la68 V%!G%"8HLٜ;t(YYa>BC.QՃT˄$R VUR+5mcU-ay6OTAJyTFw:چ@刁?†\zM?u=d&)b|62M#!mJR2i)]ҘR*CZR4M)g)KZƔ$e(XR.Ey^fl%2yLbr%);:e. iKm,-YNӠ42eJSrԥ;LaZ(1YOrk IP.hQADG@p\bfx~)4fS@(*4]iMqzS攧;iOSC5jHқDQ q@?5ZZ<%N2A)Q]\R" >.KMU"quk#&yu CWڈwk2DDD--Z쀼%-le:E3,W.Gr[J yM-a9)!UmgUҥEejz5- J`Suxլkق0  M@L%^W&"ш  %rb#(0;:e $5ˠa4b`hW ^Ȃz@1pc. ?qA@k&Fp1`G(^MD|%ЅbYIzvR-OZUrFU䄰&rX(dq .ȕ `mMO{p 8z2_ !2SwYN`l5ףK\.c)% 爐4zE6)z`]2_4BgZ,:磔 ϒނڳ$mwz_ay:t4 􀿣eJ%[L,E.1 8Q*Tpm+6 p6OrO4n6cT0dO7u44f׿[p}3WQN{8#qia<\fBt[j&歈j0*6s m瓿>a;8|,S觠-Zzf~/IŠεa@$沷Ӽ.jBWځޯ$Cң/Ȋ * =⤽Bd94P+bA%%8pq/ G"NLmQyh*G*LpN.d9Hb/ @b+d`ko`<29`k6/ :7rT*CIN|JM["rqjQz%~";ܰ?yȈGE\dNB,M\AVWHLM(TFrcp@H"qґ̢.*FGJTDN"w2F  q"AD̑L=VEt,+|qB!>Jmbϐ OJ(*n(b$B>'xb2xD#Y$cJjrE BÄA$"A}` &q&7Qk++++3o6JNMٔ!QZX8Ԍ$l/h.&/.!͢M|)8Py=$0ep =N%2Dâ#,4J"{qC1CLDy RC=J 2#[r/LpzKW0SDbAS̢7 bSA.u qs6]=p2? HdFB?0AEq"+C)D!qd34 r@ ^-$Q4+ ,7;jhdf-2.9/docs/hdfview/UsersGuide/images/icon_folderclose.gif0000755000175000017500000000016412050301073025064 0ustar sylvestresylvestreGIF89a̙f3333!,@9X0 y"I"C(`DO\T]4s]g. +fRnˠ;jhdf-2.9/docs/hdfview/UsersGuide/images/property_general_group.gif0000755000175000017500000022135012050301073026352 0ustar sylvestresylvestreGIF89ax3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,xc[-A*LX^h+8ċ3bܨ#Ǐ7^9"E%h!B0_ʌIse0sԉ3Ξ8*ТC"])SʔJ JhC TiQ3,hG]kiWpZźLk(W߲*οg ˆ+6|qǎE%JLo&eF& ϞC-4IQKʜ&Sט'ABLX/^x[msbv}nö(k}`be*k}Ⲉ! O~y˧?΁}y-ɣ$_e*=&XP^IoEPfWu UUeS) (Qib]\a(ŀ)BL(yEu!Wc)LX:T VRXhaV&!V]).䌚H)c(UXWyZ %^pRfBɗp$gb^ (\f!Ihr~J$%F&gf)Cndd)/q>8hWܦ*01@@ aݬ5d@j*v۫J,{,[xL%&O;۾_gE" 4[ԅdrI]tIV[Ja^FbV.iWNU)QEaW>"޵̻HkHdM9X`Vf;r_%eY'xi ,V*s-̆XN&cp&iLftA:n2[ c$4mjHۉڒ*׸@Ok石kz=,燷^+x(a&RrYb,esZ%G8TzV*>P3O]Xr(,A\W˥!^64FITBb\+ a|2_C2bC-\qd/ye`" BC}c4 ;P8% ZaOvC~Dr7J7fNYƵqEfz,gA@GB /]âm%^-ʓbridOr$s꺊4ʋ4_b},cGMd:5Q&&5c:PdaIDp-Z8]4o!4_=<-_ m -ZTG`5LƛiekT<';uQaD2PG-*.}Iٻz ASj*I)wԘKR Y",wlx; WQtT^EN_%ND )¤\)Rwۅd$0AH|bɬHB#Z-Y3XџԌưD4T B(◿,0%Q(1ILa:feBhhp8Dc0 | m&*`z`A(q藠+g''Rq}&!nsJ!/2o*EX%,Y'$Ɇm#qډ *")vKttJ^ b-)eUYpw+pF*2 X 1'Y&J~kjA%.ʓ}r6wNZUp .`&0ϼt^@AL|@X Q7h?m=aP ~O#lh+,ӦfOQJd({E,zVAgȁ=}#iYF+#$i%PGA֐ Ց_1qUB%f].ʓ=MS'_vݾbyou]'e/TnL&g]Ӥ%c"3e+hD#ڑ;C3]j&@4 dT s >wY8M`(M>ƴJ`Zr7J6JQW4@ ii:+:4\> :dh/ h~ FW8kDv ~YwwxРŕ ;>CQG3 w=d i=saD_f.AU`BQn./Y%TR]%4zRa;5p{a&CGHTV4`Gw$7})#WrF3rRP^b&&;Qq7臆8&H.]Ŧ96cW''J''}JdGWРð0X ؀ `X p 1Y C0nԂ6pxEy 38vĵge ¢PŕBxˠ ewj@O(iDӢiH]UwGa;lA!:_S!KR&p%r%&12"*1u _ԃ|_@eTHRn7u{; y<2*$#Hs#^φ9#U uE`Q$f!J&0Nn9B|xgR7o*Syb(d?hdX,X,iA $ ș @dAgàʠD8@m@n@Рׂc'x@svlj9&Ew18CP[&w 8ryH,@3h邦30S3VSGQxVh I%#/TV!QI1?I`4RFuW/5!#IBnfabf1rG#r2'dU1>R 4d'M4)'^0 l66 )Z \6 2 a AL  Pڡg؁[(fi9\bk}h8xkvi`w 6+Dw38P Qh*6J FD$,R$my l0g~DT{;̧!.5}7&E2a+} ` FV%YB GC< &z88-;Z]rScVVF1;$&Fjn2RTTC_ %#=׿/R0>; QCE7v'W?GɹR#)PIڋa4|e4zE?ZqIE4OƂ+ykBPi+@D.AҞ3q]|_ex]p2aˉb{$6"#;I#U3To!;,G|X0֖^@iEU\!&`nDS"9KQ19OVG9C]G@#% p K2(@OWVW! Ĥ<|e8qS -mfҵP}0~2c.:b0AbĆ;<Ն_F|coDъ(fE|S1ly8SxA67Ѓ'!4R J*:GUTNQ^ԳZ>+jzjY]}[U4ѳ'F$3q}b?'r!¹+M5'~ŰǼ~5(E-I=],Q,ƻc1!Tzmv 31Q8Dr]zk>39Lm9d3ه}d\QH:;JR"SᲉ\ Ŵ$mr1Tf`%Gsz>"iI z.XUG݅- hͪHQr.^s!(MW@ ̩֜ޙcMmXhJTצw3v2q AD鐱ם~-.clj@lɶQU}J^1cؠ|$='B{>"5.J(S%'=`^0d{]/7yjˠIC=}S_T}d9{1"{ \܇.Uкܟ:Je|(?1z¯4?fx?q\ ]('k3>S-Ᏹ!C3r3{Q꽌D~#~}F6/T'R.o >:~$j{0/O;cgK٫IeS<0&!Ա >q\u3^aUz/݌h (reX)|f@4o|3)M4ҤML3QDsˆ [c>dc;r`cJ)lZrn5n;bZkkbLcѤL+kox2e'_&e0@O@$<ԏވ2A AC46AC1B̰DD1DpDC\DSEoLDЈqaqWlG1!$G1xpWq1DCq)$K1LcJ05RJ({|2L'2N3.s7N1SJ!ܱ3Q5t(r@@LsC-?TRtC/Ge2sEOHUU%U.UuL7qJKp= =hviZ @l6m[\tEC)~ *_ z_}]ߪ|7_^{ (u*uJ륌We/bbmBߠ 1r~MNbhyfvY&P})+j5}Qx V{VzflV:{N[[cP& J re&o*sosO)m|<+|{sCvѹp"g}ǃܼQwWۑ7;^wk^3nv=߮v!>{;wz¯'~sYv=|L=/x{몗9Qw_|{'M&>?t$ W͕.us C .+#R6}9dL>w>b~vg;E|IL=1f;܅ xQF,"'Aq #]j:4oZ#3׿9 kRM%x^L"?/tz"y&7 d|!"he+P SG!&OnaTK#RNA%# ғ ^0AJ¤"$ɺ-yl4%XLSNuYNw#)enԃ-7BTw㢈_qdM9ɭpv'>sә $ !ÕAPe|^ܦ/3GQsŴI(ҔrLN4-maX̑3鉾0xeG|o0_48?IlcKɦr3;JIN*)!0 pШ])%SY^ҮT%7:U#(gb5rV|eFfn_٩._#4>eYoBx$#{\0XzE@)cA:ȁ6+_+jBtvmM* bx͌K6+R~|s W;)_ݙyRmZ ⎞_-@ V:>7Kk9H y9ץ9s+kQEeHBD5L;ʒSJىbqll}v$ucn3irQy[Ιl7sn|j-;w){ӗ,]Gc,Q9qlY%cHAxDz GmܽjQYiSӻ"- 9Hzc=3} n"mKLHC jӠw a~w {N C$/y<K|:;B3A*B"( هJr@;Hܻ;I <;#MDKt@"P "! z)xEҊ4@ꝣ7 +zϙ&B/#R+6x?*6 ؃$z3Y(U?)J)gT7׳y7?a40/03t9P=G -e굚ڿKJ,dkU:$1rx}g:/TȎI,ɑɓ<ɔI(4`hã#ºj3Ù10C!" RYKʖ>Z2<j<$.D#6*<""D#2n|"?+$܃24nt*/|™.kC;Sk\(EK#b9Gbr-- ÷B@DzEo}H͘ SxIe8h ψtɷ8$dPPؼhPҥҲj˧lhr4ŭZ4:3pz" GS",9'1-+&gj3L[4C7<䩿T(md,V+|+b=B2HAc4qt"oE 5Ѐk $/r62DɈ4@.ȓ4ee1Xɏ$Βє$ Hʫ|PXyS+p S؇E.{0қZڳL)2dd%R5 0kJ 3W) 8"cb[k,|3 [8ٳoB=!?#9l!W/$5Ck(@#X*_{~%!AOcH{S2 m4S6HͧhXwI(} H Y $4IyaRl'MҐ;#h`10I.5SZ!H[aSEc宇d\=ڊ5g3Zk5Z[rdϭK+}ܧZ/R!d;,T4 ?;2̣¿OB]B)Kq6>{EH3l>ȪkxJۛ=,F*J35m7x#(QH1I})I8aL-aȁ3X8 Lm(E1eO0Lp}48}hSS/ |eܽ&+@ÉJZb@bګP;I!]$A*l,EݜΉGS{?_cJH*=K3l(2:/@k=35`UՀB֦k.#Bf&ʪӒ5rCqi|ۇj};t}ȗdzhX#XHe[ aȁlցx;a׎(m hײ́h8/ X] ]hb/ )^yb)>S8`] ݅eԌbX.sT2 >R|zLP?LB# B:*i0^齿 6v%qL_)4ad)(s'̿X֝Bʜ ;BQ =@vc6,2I:G\׬[TWeblf7WRgV*]l2R0ˉ}8p]63b7RM C}j:4⣰_]k3@M'v |= rB*4Ң> a8x]gexeY;k=Mte;w5}(e0^X)Hx h,vbݽ*^IAS*g3":C0,`V>}NfA<фr0K6/1<2X*۩gJy"2f.d1?z;,K 6oB+/KωX {2mc 3h56qIx[pZhWDӎl6΅Ϳ^q~7MI&Nl\M0brFeP (oƚ ]6bPy`qօXhS|}035`'bƻof (3b3÷@6>;ҙh¬ROKZr^6w#5t)CU-o'>a,YZ^@>Uܳ]DD~-eæý)ܙ#Vl-?oMgL;(a8rGPPlM@t($. 8a)bΖbeh#/bza}}`*~mj F1K_pʄO"Q?& }F47)wsL # tﱈGw;ed>ſ\rƥ.\VpMxkp˱]FxE]mb_Y8Pl){;FF}PX0EOgh}׍۬`X7R}XS@g]ލ0ljTF"c([ښo4)2j'phE&72dH2ݲUҷd5%95[4Ώi"JfPK#DZIbd0@w]3#['r;"h5QͰܻ5t W̝kVg&e @\b$8sm$Obu}VP߲}!o$}MX"4 ^L޾9\I qlGLH!ś Indip™.pz* *̩tPYI ֕JAJeэP3:h0,Ԫ8rbQcsڌkt*Ϥ"Mřa}IJW0EbJuCpƥ߼IvkɉU5 ɳXT͔ 諮 ,s.ؕPMvuiP&Ӂʖ%b45, ڲј/bHUtjrlvב)v}vZut, HUjVZpIĥeJ Ѱ}G `jY%+\U!YLf+ kfT^(Iۦظ4dQץ:b[s&UFv$ܚu0("Lf݄YBW#U1Ll"kIBV1 )L}\m+dkZUqi@ACK1|II!j4KK 5S7muKV'u1`B0lc[iFk$]-R߳=X¦Z&zle+W[O1:"jAfQڰٛJ跺n\86t8'qO4mxXtL_) ` %żzȥNVjU^Bx /ԠhD|TA*vrjjjP(C:jp4w)X{]T~g܏,e6xLp2#a)В#5مDlqa(#KQZٰh.ƹ0TW݀C8?(ot1冃H .Cv T@6mF.zLg,>*a23+]6X}( Hq'D;ؙ$zwV:މӨƴP6MT;6a |جFUʔ\e,洨MPYJXlt%+g4cRjT%,@a>jĚ-42@i(GYKgT LefSl+FL%*9i)u˨(Yh3-+6sZ?q)L5S̥|RL ,EIT?liUʣɜvG >)P*ԡF=*Rԥ2N}*T*թRV*Vխ*5~d2җ$D wC;'ASl]];ᤧRU)YӘ2m,dSX԰Ybֲ},d3YYYlh1I6fٚt]di[ޏlnsִqAw3gXN&7iPRq$aRMJ<4?v IGT•ֶ Ƶ`sU0DI}G̝uLoP\\SdLlI(,I% dKQŐ  ~(I] RM OnIY0aԛ֭ߙ]ۉFF=`CT"` z˥!ȆI EH bYLFu\4L"\a4 F#"iɭh85KɨGe`eܷޛHZ@O_<2_X'R!=BL<>9Z[`㙏= #P*RDI,=)NIB"JF!BRDJ4XJPG#(Oϲ}a\3Q,]G8I؄\ G6Il`E9Hۥ8ƙưƦ=E8r!_d F]M[OZpɽaP$]" %J!s d7atLA%a|#PFNha+RDv\ RTJ5 hܠAӥ^J^@LChNΙt mT%d¥ EcH1z. PQ 0@LXfNХ0OS*_$5U7: R:><4꥞e]:EEAȣ DM*LR l\֍E%ޡ!ԉOݓX^= f .O_Pyg #,'UrfhiN]\Z!n`ԭњc\&n >|إ="!ZEҚVbi)=$ fHOB&"ʾ4h&lP4Pj&gi\h!"fˀKD(QKhHD%mjl (Q_XeY̓(A &:}( ]1eD_LJLq"M8&(u18&,&`킂ҮVG1ĕ/*C:nu#nfo\Ů2po(xo.(Hoz&oZ*&o/./nV1no.o.>&#-o~/62p*^&n0_+pvt0N w 7/ [o Sprʮ* G2/(0^/.0p Rup0n1zR~0*K#u,$lפCY(S]nhJ LF΅Ć ƌ(O# h~BƎL1.F朆ğ~DP 62WމJ $2 $LcL)#Kj(=r"x(\2r jN3jM^]AԝP6!fČ26^22n8 l̻Πa\(%0t(kQ'VHD&lGDƞ$ ȠU҅`5 Ow`h,B$K _btaVT(B\e(B5i#&e-[N*_"c >JR_ijf)rPPj "-P@2rȱ_*_<\\SLiju@v $Z hJtB&h%qrǤح/cs;vڵL7"lgb(@3v !˱:u̗"!Qψ/oZ95mW"*hfĝ137]+b dRbW *JN%#LR&8H]ե+TG4#pzB P]C7_T.kMh (@y_zUݷKz*#a$XBbQ^,k&I R5&uy fn_'b*:c&+pDzM 7+IZe4K98sw !eS ec$D#!OMR˟'ǩO8*y,k8f?4` esl;X|CJ&Fb93 5F95mqRqJOЕ.Xsgnc2_y g!K։I䏬"]9cv{̼zha&>EC$ArM>A4hۖax] уL+F7;@ϵGh%ߘF`L'@Soz BGo_46| AQcmQ}Aֻ8SrQe7I.ԩq O63F)В?rҩˉL:A43tӪZUdPl-.$xdOۦgeıW+z,i#Yzƾr.fLAfH1XLy07L}!NucDVV~=)ҥ{ڎ^aAZgA Sʐ8˭s]Bͩ3FeP&&q$FIcMƛg L1 S ;~ J|N:݂NH MA+2OjKU3빊DJKЛ20G4,dI;K:Ȼގnm#`#NkQ*ƴZV.yQTÔ4麋r0@%}0HLjoYqr#Iy[OL*: e&Q3*X1y+pL˕% fxD*@S!ŽlmG~0UQRJmjT&M:±R5,K_[ |8OX ϷUtPD1bpmˣ ouP윒$W] e2^|czƤgf8}%yEE~ܗhja4W?6^wF|pNa(O8D@ N \esB"⑋,vѨ$dpv*v&*~\y9+PnҥxQ,BFP&2BHDgN'M|k-22댄vs7%bc`1O?4HD(PEd_Zv&$`>V I0z414ҥ{z< aD(Hv}$@(@$>M)?G)etoTaS#}m\F.,7OxǸ(UT M 'Sׁ̢#) r\%p=HW2EIPT$l݊N߅xbV3^Iz"qR)b_8M1 2!x" %%=;bYd- 4N1f2Uob(@ ,hd$!c)PD <5I8*bAj1VPπB1V1X52la=oIٜ !Vܤ1S28Egoc"-]ȉ$jΏ"k<ӝ䮩Y)9sG:0ءʉV 9 HyU^Sٕ9=5H5Y5*4*$Q [70:&_ĄFt`D&82|tl/iZE%}1>V Z豅\,&'!bߟ^1(IxZ7im2 Wv;jńO*b-٢F3Kv{wR$Җ?dLuή\y ܎؋2"]ѱ/'@B)R!FElҸ,dXWfmgtj%D!H]Cb&o~*=>ؑh%SR۵)}pߧgVZH6JX&Ik\AvV#nxl0ɭtAHP!#FkԱN[(z)B=rc;19#Vu'?9<01FǑ]uFf!ё1JY0ސd{uˁ})DíTX^2&Au3$@@0!h22!3 =qQϫZ ڽ ٍDCY=C]WӅcB'Wq cwRL s>wG$E,4VH9Ǒfp[{f+ģ %&Bj0o#(Ty= i|D#ܞoӪS+)TRwǦ1mYB?98}[^XA*)aҚ85 !7 촸s.mHEZHMc3ǐn\*tBlBܞ [Jfn"<#dEޅܬBƤ*}Wʏ42v(ct:(xE+HN\U͇E.f2Q#vEi!kHEwܨ^(BƺfOoUT%=XQ_@-XG0$g/OcC:OKfC ,: Ub f2j$m<&FR hT<݄QF6$bҏJ,F*u( MkøI~Rjq,0Mf$..bShHlvLNHd&n=bi qsʅ@bo>BfEԭ!QoIRjqX F4_ .#0I(N9tF,$84b)WP;iTD4.OnR3ìZ-\')_L\ 1*d,,* -HJB&to>-6]@Z rMO.u(-LQ5Cb2TAB.2xUZ3`aLB $^(G0a&[3Sq8ZLYc]nV%&& OzJw" f7sup&,ImW( >^l&܆̆0PHtM8TCu%O0P/nbEt\ 4bbNBCi> D$ȒP-$)o3bK"LV3"} iQRtd,-x(@2">(WJ F}R>RVp330RTHĜ$8D+Ff$qњhd)%7`Јz2QCdUh% 󛆨-\&-^j0Y쉌KEEk #!QY]%ذ6`@2!Vmr@60 9jG]r-T-V؊'x˭-& @:r9n 619I ?itFkW,NJ v3-&9uPG<'P=lvXTDX&Ik؃ / rpql07*Bʵƃ $@¼Ҁ0`;Ñ3Z3Gj`ibe\ rbdPT7Y/ \h9IG*NPGX̍Y_h /5D a6DR`FW7*N>:h]$1ԍdr'IO1`g2V4Ss(x3&.mM03NEV`uK:;qI5'桩JQORU Tyd 4\s T5ËlWEЄCd_Gs\FA,<0qz*%ʔ4 6j1ؒId=R瞦D,H[r g#rIŶh͊LmIpxD;QCK+ffNhNd*f Bf)GIV -\K,27:ٶs*乂o4(6{k;F<&;$Rs,v %~Mkrȶ!Z ()Qz9"q!kmR\1BANSg W@9L79Gs0t1(3(bkI{a60` *烥Q2ˮ/qeaK4TFCc,?e0ʺ] b鳷q p^viD-'lG5:KTîX"a.פjHDLF.!y[Dd$kWDI:Zfx7ά v,>+Dm#2/uwi G"TIƅt![ r[V6Nkt-Lq sZFo\wO6Gu:\0K{/yyKAfɣ{{̮8:A~3rۈ{|/RG*֪$G_67M=>Qn+cJ%=6cR/2jog#Y.w93CwpI+IVl'p*' $I3Ht,5YW|t2.sߟ"ӛ/sgj%FO6!T^!xbWKndIFoѲ_Z=1Kz 6M(S09/N9?d{"Z} T/}-G/D*РĈXO@Fm4.Dّ C \xR%S&@#/Z\q侐 >| mb̉.UhKVCJ2cͅ4P>Ymł^ .-shil )1qe8",N6%0>]cz4ŜK^']bޕЧN*͌Lo/^`lDUm^M4VsK=3,8̅;N+]u;]j^n6μΛRQ?}h0{lu'E5Om&I#=^1_qvSMhdhm\QaGNTvu{6b_i2i diI$YjDCV7HYՏTu|xaN8ȜWBASGgUwST#ncCpZr}Vǽ0¨5&Uy9-*h/)}scGEt"85SNi,VoS`5313Me-H4wFMoRt|SSdOr2u|*|&uM7H~3o|GRCLsʰU90R3`lfjbpGV2_6wy X!ek!lx`!j@a8Ѳ fg瀀G0`lk  y8fW'"! 4+vSAD&DW>&g7VR.dAD6W:Hv['!dl#W+*1[1 706Si&({AQ[~#qRPa 1jR-vYcR%@hn73d/L 'bѠplq i֋ Uzlz>3=ut=6 1t-!b?Ql!V`i ] v a7@*Kr#}1'~ۢo8uq1sx, xginM&N}rC7nr/ >sEt;6QvD_E1F/_UrPR%WcمJS>!28Q2# Q<2IH]AXQxaGGyqSA IB x"'i]DJYOiHDjrjZFR*1jlTZG?!`;QeZ(b^bcD,AȦR$r/OZrg\ fCC3ZAI[T#&uL1") A2ocd!i  z(UN;x<{FOWѱk3]䠹8SVnS61ne%v'?[` H?U'DEtȸyd,$z oPN"ƀ(C '/bD,Hg6(/I9h8@* 5Bt6(yO߱^`r+c+B3rb2c 6+]F6&,73а>'f;|˙{~j4cˆ`oҴkRt+ j72pYց[ںY'E$mvг >Y12>s-4wт9='zpYyY[7zr<)EJDZuDtK|G''2K(3gdž'< ,:q'Y<'YR_O&W"^Bd|V@D)L C<q_B2_c]f\Bd1Fֵ( 4=H\e ZtosaR,^:[Pq0g령  rF'\CL{ ȝȊ:1p~%d*z JE.cnDY2b$xQ.HdwK!Va`j@<WX! XfE1pX$5!Z$]4E U<$h_qdrtI1OMR~d@*2"ƇGVL\'6Z?.[6=mxF؅ZHG,$W.os:A !NB E2~zta@Z+f pkXZGJY)^^b&aYhW[ b< hvi\^* A,8Ɯ.ʣF35~O?#O;x͓pչ YjatՅTKū F'-U Hvpqp8P >|yVW‹WP-]d2[o e#.57˩}SZ=}coezBQzrD!ȓфXP1 ȒK|޲}dL)iz})VOZ]ubɘ"l2IPNw6eʗnZh[grU0>jRY,ұbUɓiΖeazcZdU? vw4-9JehQdlG <F%OaђS=)}c5 jܘJ>G[dkTɧMkXFlNS> ,&, Q495+}c#lϊBMqOXnya:Q4tZc=$d}h R ##vhH*z BfV[A⯚hC@vvTс~"s0} 4PPFՈ IQe&E3V) <;'3UrԹYbe=`;ZG jMGkbF-(bCКyRn h9:%}r36Lf) zDŚ(Rv9Be=~&-@7@cԨ.NiE p d"&ci*¥E ~Lu!z}8cӚ(Q2ܰ#5jYN&Q 2iLyڼo2BJQUr_H r 3YzN֬^8P1,fJNUjv)?E~$. w߰<=0>5 ŋƩt2h~1D Ds!(hjɗ-Z iH*+WdB6\Sm13%`tY×{VK/ mD8cV KxF8Ɂ8ra9YI,'> U+"R &bJA 8*y__X:øA[[-4úC¨zr 82ɿjkNk:M0‘{=>)YéV* "i/{;I ;xS 5;: 0>s>Я y[5 :+()-b B,kpy&ZC0m' /3̺ k&K 8@w>@l?)kCk23$63)i63Az"2Ag2 +acX2 27dpZɲQ9SA.r=yj%5 Uٻ8qa@u, bL[)k3t˰z  IÀ"G{".,-?;50!8Kd 7<,( E  qI3a ('[G]ո :FbkAۓ-!+j'lsC 4fj)LI#C(#,nAЇ@RdyM;ɊpFkL&9D 8]kعX)8s 2Ni Dѳ6?Y+F1"N 2J!ʦjJ4TpHk:0(n@(!>J+|ib?EaX\NQsz43-IL0hTP WbIE9M,#EcJi; у#Rs7@%cihWʕn ͘ʑ\ ZӔ2K :7ʙIIVj '%>HsA^J'G[JӠϛuԇ)[OV1D=נ;C!0HX18}7+O2^CTKmp&0!&w4:nXr󷉚-PKڽ˨M[X(dc^OZjC뙺+Zf;@wUAh_0z_sd5#ByWiy?t(j/$=:=eskQ'URO#ϙw$,SG8kݧbu-&ľևՎ÷,j.blLBO8nz9w>+GuQz-ѣVDVXhe@LاL2P^ -Ⲅ(p>zUQ!ɇ ?<侅[TQHhD1ah=Yj0HwdP+=OMbyh'o"HR>܈QC5j"Ӻ2^ 6gϢCB2(T)c2XȐ0#ΐh-T^(դ؊%}PLϠY>0خM% ۭ`7ZJ4uBfMt4-S&3b/Pˢ91MA#5nvVugL=KEX5XDMNzOe5][lGam]FaF8-XI͕!vxE YEU&#PdsbmTLG^8GQ1Tb%=.U*~G8Y0TKUS{%VKQJTфi#\tU铅׈ue9Q:BR>䉟1{i &12˄R#CPA)J(İIhiҞʞ J1JAò'(k;몷ZVm{ͲG޲޸ZzKB^j(Fj6jjlĮ. N+nW{22N뱱"ʪ/ ?ܪk* :W2;4V-ފt+ [|rnI+k@ ;q-;nεmQsxi( 2$fcGN64J!DySwYfP8Y;㒙ifS+֒JNJuUE3kYynwƒ"^~ĚtQt$9.}qV<ԥz{wn o%L`2w *':Jd{ͦOTǩHC9$5Gz"E4$ȓ~yˡ@ J) pEwae fAR& H7jjr #)qYB„JSr$K{} ( :~ b&Y%KNKsɎd@xQe^4X%*cƱy'K@FQbI%:2Ɠ>'=2V4$QKUKDN!iю,i." LLYc(I\B!.i*M l>D0gM9@'#n/,NɊ.(Cs~pl3R`P[d<L"^MN&J6٧2Qԓˆt;5KMM#!GSX薉5J4߇VЄ(1 TYXڶIfท jN׫X,2-.dTD%Z \s:Nem8LxH[ Hg:@ƅAl{?g8 \T${>u=4 }4 `ElQy{E=XGP%C fUzɏ8IV ${~ɉiV}$2A5vDM q!u_Z^x%UmMy#I4)[q*IT>Ď$'SFͭs l;g)UHgJz&[4nԔ|fsfBr1&q H\շ:fCTóa."7^#D -fVJ˧7=)صiV0R23G36PmW FTt i_ڈ*f5d\'GnxOW{K0#UZH>5LΝ鐠QHp\˹:CXÕ>ӰV2Y5CyNlsw]D;sAc^5*HiѰYCJCg21n[\w5ʉEiFk>5݃JtDRR&O崙%яڮj4j>|6aLjGe*HTvBT9Yiq§'yQH: ^ Bi.{Z*Sv͒e|u͸]퀥Q$ɥkr. F!Im]q'˅BDžuV͆U6 ϝ%{ yz9[(]D٘lOWhIךeڎR NVq`PRJk|țO1OW9됝a(( ԣp `NZZIi\q],釁Qs-a\YRMtՏEkPHGUr٨@,I]nW9X`I>IJ^݈U[pVk ]? OM#!WUi%)*iS uG JSFVy90!Ӈ\W02V(#*m_,rQUtEG%mQiI=vݛSywU7Eʨikށ?ɞXeڇ[i)tYMfuTKe`3O uԔ5 [Dk$WXO!鑏m$'v͒OINGAYSi90~X 7[hkɠoe5jؚq=SH5N`P"^Y> c`L$KuZ|XB}>Q OV `be2m`WZ _pMbYEwĵ99$-ᔘؼ55H5ʣo+j]L YnHRA!F"\P|Q>b|[]D8Z`FQ]JR֩g%/TX٦mnYA%;Mg-c)\t?TP%FgHRe]](a%NHeiU#iQQVUZXTSV[w9&))`\ \w okD4MgF[9X)A$lX^Ud95ȉxס~)(_^E8k\BZyBuzZZ!NRW\uN@Џ.pϑ ViLUwmEZeEg-e]E8ic!R.Nޖ,s'>AŜ-hxɘIZC^IlKO\pai-Z''R[GuӜ&Ld^A80; @q]$ā^M&4%My#DZXګR9hHVp*=w$ |+hھ֠b/*p$u-p[ĥg(E Z22U))!aFznz9©k.)S|YA$+JkJNe?ĉE,A"nE,<@( B=>$0HB @(<l> {#`;PH D))Xq ):Q&!^Y ZVO]T,S2E96 ^.d):_]dGWTF-O'jF2_u#HҪֹrnxR./_ۥNt.$ k]M P&nЇG0k0lA">CDC2X)ذ lh3 cB/dV5"@ 18+.h<5C0l<@ްOD /dnr(G$Wkߐԑ^խJʔ!hHY4"#ߓ(km蓨, ^zɱNDCnG#)OJ0R;j.TM[5*R55ՓxH\8Qd2Ą@C ; 1C>pA(>0/ >5C#D344B2<\kBCt>,{8{Ce5( 20{=x̯ MtKĬv dKMM ͳ< p | TK h¯Ĕ Dwq H ,7 MPKtwycM܈Lt 7q Ř i+28KuJlC˴ 8(Luwn{ 7 J uXwLHwń@$0>@&3fLD(E3Q$]c>80]C$lR)4a)x1#ȸ2H>u(Aԃ"J(8C3\y6dJpv \ri9Ovщka]뛻F@VS%w" Z SJ~^- ͑<G*hl*G݈JϦ;N@T%E9z:EdNBuWWX(A$]1 P/Zh[gC7CfC>XAϵgWcoD&7=^o=sd/b_&45^G>6blGo0ŷv)ҫ-\9eբY !󸼆Be)hdMMZ\WQ+tr|IxEk)o@v*la3J6|қ1(Q|R@x!'2l0^֓>u 'Tb0)4|v:.=lM~O(h{"Ӯɧլ:ryľhՃe!ĆՓ谠96l#A "Be۷L!L1n`jY}8\6dᦊ #S2Qy!}E-bI/PMMRk}hӾ|gBӵ`Ԯ>V ҇%h> {,([L C̾:Y&AdapZF Rcp`%4z1th[l5L ĤrD],ɣ'[3>{hzM;1_37:=8%n(6s!C8J-Ӭ>KsP )5+Dh(,PBmP@7JӴbMQˌ$3pBH,IKc0DLY?[֢<-³;ICXdlI21)4RSC4)-95#ǼlL;ˊU'F鬞@ IY7֢n㯻lx I{NX6a=l5e4͞v]e}d㜔xU=_LRK 0Xz%\(5igO;HBMl[5ZӵpesLWTa$ݤV m֕;4adGg 1HЗLE\If;m0Tv6\EiD4ۋyw[KV*ہ:=[躮&[nu9yzEWayBv&fGvg\q:73v\7 (1yv@zS隸t)=!ۘDc@Ɩ[٪GώŶiZT)Z_Pkg,E;H9gڜz%@bUiFC sJ Uk,ÎvKPk-'m=Z 7`F+UQTIU͚~L}h~|ȢFji| >7(18.tIډ@p4NZ^z3s)Ch^`ZLAyX'k3[AFhR GH2 NkYVʜV*mZoFB, Oqb7fvg`&{ UhjW,A&}(D$".gQ/ЈFm>,}vhNf UԆN.48O@ku$|l&Mv9뤒Dn:Hb$k|cPJZ4&lj"bdL>h Q͠MfӨ \LTҒp$J+$czi{AN OO܎zhh4(Kvq.jj: f|kE{L1Ѵ0q$g,MIʛ Fh2.Ř1oɕHD n&KN=ɼ`ft _:`%!.ab B)dv1a"eEab"'nPL#p%v)f2^}8 b NRēp=NJ dh#/oSfl(6"fil`Svz8 t+N*,*TD$""P&z`;0Rm$sbƀzj!bB0,N-cj˄cY/f#np*gx=r@"đn*+1qQr:m$/}- eHzIN6E\2hZjR(~ Iol#*1X( Fffe(h/F"QޒPP<+*G[Zdpf8pib/UA2Y 0.M$?4/d@r" N"O40)"B"ׂ))Z#E"pB$!`Fq%B0Jc)pj.$%4)NaH`LB,"!" S>z1R9)f)b L`(qj1Xcp+>`xC, *@{fj00fH|f7M>eSTX8 snF c~Zkó&Ei& /!F F6E,)tt@4 U'v!\!@R[@vA !8u)$b~[˕ /r~ uTE Na"\eHu( !aU:'E@@~h~Ȉ+48f S5gSdKJkLe+ZҴ.̒cl2`~oQ|OhrȥSP {k|Cip.딆*Uâ~I'3t",\t DS7`)t"aaj]@J> $b)a Ƃa& W07DE!qu,B'"‚3T3m!^S;xJcۚ=̱&i? + ŭoEl Hvi1ECQ: 9vn+^ Bi7"Ñx We~'jDX 2/&r(Z)V`V[b.`pb 6.@=h& +"%"`IS w4d43 W.`b&p"el-!54Maw! 8Õ QS9BeȚPTR (bđn0B,9Ct`N45dQlJ6db&]lę,v+\u@A+IqqwAAuRv!G51 sQRt:.P"U+"]"%H -ʦDC2.?JF:m¬n)8PwWhzW%2;.T&^Dz&cP[2 .ը@ lO,K X%C)m01|$k#slH6a" !p) -8u. ").MFc"#t)pG-9t/: 3yt!08WY)eYk.ƳsenZwN<Q9p|:FD[\@۹b3k-*lZdS @&T 7(ztk|o47pJV1n4:l<Ѫ &0ZFO_ˆGP`;\b8KIH 4:+gORG #?$ #)xМ&s ?('d'#׬`˛2,[4B\|v;M͗<5\t?jhZ/]cQNdSkH&w7 \ ͷ "D4d.lZBr+sPTA FN S}d WzN nnK(d4ƛhjذ#s{P4%:^z&hY\M2|Pk%fG^%|d'*%{p|hEL];B%,Q= _7kzP+n>p]Zrp:Kb Ƹ.K-CFyw^9ǾNoVni>/dRJ6VY[mw> cX+0 |CBjW; D -ZjEWL_4H8ň'bF?XcF#SbܸȖ'QIrI.i⼩sfDYf S'LDwвH>M)[F߾hvd!>PB)cP>5/M˘3k̹ϠCMӨS^ װc˞M۞3Y^v4<0Lƍ+F1_Bgy߂y. -wjz[+~{yo/zc-؉we _{z Χ| :d`m_}]f(`]}vE Rg~X}Q85^i#8aA8x]Lz#>b6淠xew]&eHbLDm"2XFOĐ 1ObHoE&1 Yf2EX=.SϜ쥦{2hNǛ W2F蜨*42G+`r ^)*oB*Оjz쭌褬:oj,Jm6jd*"tzP͒jeU-NۯLj l6,z)f:/S1o{봕zǑ*ʣr k2 1{2JKC i$[\su(Qݧ%`ĠI %@aОV)uGYshAv9_+:x^v-coBަ^wA ޹Qf>݉w/z]ewW$ހIX퍥㞞[섫t7[&uChF`]I-fKI ;褅D+՘QQ`dgI[q_))ɓ~/qFh+jNE㦧 .Nzܕqؾ՟rVaI~s`xx3tbN94q=!G_Uq) uļyyۛ솻Mq.9y.won8QfMd^XCMG}4;k|W֘.={7i};u@o x!RFx:p v8 ֍݁n GIB~#;߾m{;55G-ఏy\4gȋ ~q[1q3w 0=!d!1[> d 4Pԃ ]|[tS}59-Y#uK mϓ$uSRt;pFZA7M˅."=z,h,C<< ;7tseI6Yyd U7BK"^%B[r[\żu$eg |HM>QjQkXDQM-7=e':2xcת*4ol˾DH6 V(l߃F+h?A.gkLO%׏#Ҹcq>ư>JG8bc 6|\!]2 Lem$?5fUv]E!LMd(En3vg[]V/8L@J>8_ LwF-ōUFTi]@6 jbu7{s8lh vƖ\cnhhtԓ[hwkmXqfD-|!_v}ɱPI&8W$"|PNdQF3X捰􀧳0)Cu:hy\j13 h1Pb .uo$l_@ ga6t cԥk&E%lbV`IVc#;VqY';6\;B9B8zG]eb`Uj⎐G[0k XD>_ '`ZIefZxkQ77>_#sf};37PĀ6,FBݕ%=Lw݄w)ZLv|4Tc^K#%{y`` /^ ҄a8~d㕔fuwyOyœ,Y{hX4Nؖ^hk;UĤHz5<*E|TiwGJcEbeIgW }b0SQv[p2RF`J=IW(WU~uY%ULL;DsUCWsPYDbEiWF(~S!{5N_8aQIh b1蟆q9eY;UvjWn8Y_tT6v9UM&VfyDXwFաTZwLwvcY(9cdSeN8\P8$*TDG59kUIjEy1Rh”GUL#g*s`{t([wAxDuxO,N&V>[e([\ uv_ItOTɈMQ՘7hʙTyh)Tw.Tq[6\#p.{kY?)J eYm{? I`7BYkFkeaus)h7ed5bif'qyq_Y^#\4)wXPz1}e7!rQdsQM$~; }i]uboz!( }&μ\GO<^7@.:O70![0sR?>Vξ i= Yg{1$g^PG/krsvtw^xz{s{;>^~阞!\͓6-Ei}(sLt>U?<ҽsnxE!)nn/ "#ĒſKKU >~&GaSZqP?Eq^YMiA>M²M[}>@Ļ*KZ8'|'xĐ)XHhLyq"#.gƛq1r|ag+D0>N2!~ q`Q35 ^`Lè|=&a ɐ<[@M& l!͍]nB QD-^ĘQF'mˢ\޾n/P˖ImeR.pޖ8 "L.}D7#:OK|2k|On0Ip:W\u5tTYM[RLJXbƍoLf_}-S,ʓ mYPptM2$rgS Ş-#}쓷4oSWqrÓ6Xtխ OmιR[9"ݿ8MPh@69r=I&L2V)}'ccΨr0mAL1Fm K 4fE{1HgD2I%KI3'dZh`}l\ry(3M5$sM7߄S7 lJ#z8k饘H Ꮜh,8E6#RK1/JegS,Lpf*4P2(Y4VYgeHQZo&sAAY[M$ɏkhvhkZlV[q%[g=jWvӅ]tuww^}^s߈p&x]oF8afa8b'b/9 ܴe)PGaH &e(e\gYM[k9gv%NhԓOb6BY.!qYx}b R@0Ž,MCަ4x\ %622D6.UAVJzEpyWSģ|Av X$%IHP:r`A KfRt)~5ih ֦ T}SBQ,E7T l!a;лfZ/z^Hb1<MD1tU۩h>#\&8hZ.$9s"GG `v|'<("O9Eg0US@5QE R Hz4O /=sD$"FъrMEL̾4$i40C$pљZA.ֱy΄IT`6Wѣ4hLS5KdBh@2n nKܳjZcӢַoK@)3S B.=1k+jRұ4d"]ܚWİn7[.;^WEy^}z;`o1׿p<}ĺ,+מ W"ΕpDaSgO1w[Z2: u~q#WlfkLź@"ѭ%/, =pITˍ&&*DcXs3(lEy9E~i]nSvޯMx@(榊9-2I:A9!xD>mG?߲" 9.6"-qg*g\;dK^;aÇ#f܆HSZU-sZԎ)Lч \_5C"Ț>ɹWO[@E x 1v D6gDdgcĺ*D/{=j:P(Zlsybl$K>H3@OHR%'UxCz7wWS7zSafKI0sOg/tc2Tcp;/c+ꡯf)n>{K't~Q}HE42gM4Tա4Vq= QŚJ1Gq.a/21 `К>@{ Ы-9}?P-STIٓ<ڰ;y@M e# $ i/J/ʯ'(tB)l*)B+'$+1$243T<ډ99[-SM0 سAà 3 Ą@PቡZ><(tDrùj93SO}_Hd&HE ܪ -ID9+ 3:+ř)3ʜ4]EHQ-Xeg ;3\< @F14D+`m' h 2 K bHA BŬ ٻcRS "ǚ5B ]#z^ح n:1TܚF:Ex>n{ pF3yc {'J3 XL(i`5G8s[ HqFFJ9|Ly9k CP(RǶ3!YS#k\!TU}Xᥧk! &zC : dJɼTIhព n+rsBkHČ7~ q7j4T( :*hXO LKd4Z)#:؄=m+N悔PFd3n ̢ͫE̴>L?$zPɔI.c* , \)6_!94Ay4a!q ppl\1̐s׼qLjٜ <ʄ @= 2q[%؟dWkX h0h PАH8z҂_QK.3 -KH qԠ_MN OĦi!Y7u8YL 65ȝ](l+y"xsɬJ&l˷)NU8PX4@ӄ*J&V 2#m볻 a8N_B${S8S$d48:UOѠ.ȗ@К@U2 v۸G~ Nݱ+n_%9&S[ܸK.1ftGt;'4pۅ9\)4a߆%M};|jaݽթglN aXED<7 8W%O>}hh”d*} ܑ)C_D޿Q#LO"b<NAXM*(Pĕ) dJVITK 9ϸvMR 质z dK^eZɔ@FCOcԌj4mX^ԡ^PX}(^c)E$MiFŒ9B+lnf%}JBCksFtC5AWG^-X\>O= @gKy(H ۇ AL}Kv8Eς_QG%230&Yׂ}ȱ.X0zǥa`7kmԈňKc4nENYEʸ&3p'6d" dy$"I];[- ahd3We# #ǁHX1aL1>SKM$M\K Y%Y|Xj,kL<0UdHJ{̘ԋ(b;aڍo Z5"zIUꕊ]Y v؎ C̐M"["uVG3`naA'LU| Z\\pL[z^#CO=؎YmM>^ ;n+ CȭʍK$ ?T(ކ0<3dh#pqWU^e fݹdOĘSF>tG}(z4ȁ{uwotObq:& 󀠏Z(.4ިs?ז;<=v{3w$cOK10QӚ Ź1Jwƈh7(>&$h9QF몏͠0I60(fz/?$CnJ]dw B" m>R#/2AiN|rNqV(/m.hI.6,J"S9 {j{ۀ}w}^}ΐܿ}Π}ُܷ}}}9k~_~H'~ohM߲zЖ)KSo}12ɸc_P@Chj ԴoYW/h \LYs&L/ tL5r)zJYϪQ>e״̕_i,Oiɞm-\l5Kܼv/ϏC[ˠj%*5ϿqJ x2_̕)_3Ϣ=]:魓F#7*c vG&&i4 $(5ӞZ{;bej[}.=(k愻CZ8;O=˯>p?!y~uuVՍXRuJ8 ZX!tR!a#zH"%hb+x"-ƨ>G5DDE)J=>CQŴOz%yYVBW*\}5e dX4K&fS7@fY'wi'y:蟅 j(T 6*!^-Ѐ!^u$):ꩭ*+:뭵 V)DUѤp-VK$,UjކE#QP^YZRE&S-v{ JNcA7oJi/{;0 \a%I:FE,rY!{\2ʥ|0A-q(IR #Fƺ# sJ,jvcgDgy&vfX*15R-elhmovo7(i` lG__&+n8g%[;Hy_nyޓ Μ0̏&B­D>X^&TJ1Y=] &Vrq}4sS֧VpYzxeZٖaD̙ wL? d_&(Dp`H >FPiXjXBEz7HOrԙ4\«X0R5ID (C,"D#2/` ïo f* 'Y%'C`̆&L33?4OcG8mKB |dF#N"&~@)*HPF5ltFKިQx""xJa%ʲ,sYijQxK[=_+9`1h-81d3󉉚ش7͢T3+'4GNm,4ɉMxI'y 1>B4X+@ *VaRJs_s^2(ȕZ!fw6OÌ'2@ !< of,4JNw+]KSzf!Zy#ksH#-&dI}jPRC)CFXVRJz=)X:մuUkU꼸u[Uʢ&&{ 4|Uh6Ȫ렴qHT$M1e{PL2"P^*'@ũϡζn0 jm8[%Rmoe[8Pp+Lض6|aX*j`.fvH $E U:_x{׼zI׽]oyw_>ž药 `;5Ie;jJ }Xi(HG.&5)DxE-lSY/P&z9[*T"_(!Jz#4&n|5BVDld!+J2%#H˫reud`./^5䩠ļ3 bs@֡rh }9*΄?K҃/IGz A  4V&á`xP$k(gF}=iX9{iP.0LhS[P& ZʤHQRNomn`r}nH2X曹5v?[H$I٢u"qNj}nJ=V+wqbSD\Ov,>qGDo!q$yO÷#gSixIvzT -uHNפ0=tuw43< $W 5N|#vmʔzzdG4;Nv'lW;~v}q;G;Ű4XQ`t]bHGaj疳\OeXTCSON~a3I>AI/z{~s0h dp u}WrTu[o 5!S9ěk2 eT Smj^ϴ/?Go#k_S󫟣d* фڠAW<3u%G>9 w@}NL6b`N5^`5GfZ f ~ zQvp QqB ,MMF\Z0>lA=EǸM1Z1BnϼR=,`G i e Q L[J"ޡΊ u4rJɜ1\Х ɚ׭WJL+UR%%b$>"%%&&"'V$b'r'&F"*b_5OOV?4EA ֱ& K`D%!}_w0!Gq~_1Yd1٬gE^9O:###xȣc=f ieЄXi)IiO^LLӘVHb&AeucOXsQdF"DbVh/L)AdI^$JF$KJG$CĴ,ՠņ\ma Cț /[R~]cT5YYb "VU } WvI1T5r1%\WN%el%J[DMы [TRLt!u׷^#EZP$Nfen&*jr&Kgv&iZ hYijieWb 2_plO(DdBFD\c=I oE0M\l='"$ ]I1tV9i'XL@lD@!z2Es{f{K{{:v'|}΁Z Ih?*^xXKQEGi,X.&J(1SP)Jih)*ͩ a|ec yH:Y"4QEחO]Ԓ=djaWnj%**iꪾj!@~j$)OQnFhM2U1UBD2^ "RRaQ™ ڡRg%t*Ӻz鎻++R9VUM.=%=Vm$NOi%4^ZjU~ez,Rl~lǞl—~,ˎ})"V0,JN xi= $h 8$DכQlh2]a~2[7`aZ+8,ZVDl!" -Kz!|9}FےcۮIadr?MuӄG86Mm! YƥHbAJJ[8@!ZVfn.rV.j扵-Sڒb` nM0Fጄ_-nEF e * J5*Q 1`Ѕj]_Ơ.XH7In./Ӭ/fRci ^=(l?Vx`(QkL]KLDh邅_)Zcg{0L]0"0 K_4@0=IlBI?P 2l7EHS_v@U"k8]h*Нlj!l!GYd$2P119q n%R,ڊ x-1)jWU-U%b$$( /%bU%?H%g2L2&K&W&"'W(%)&Sgr63p .FPp*dnZ }WVݥU'ZwE9nh$_ZnttNտ1 }߿4UA3ռs:9݄}A.TE2 D+)o,2uTDt'$mYXZFSD{x4[H_4GWHc4J4E#!KJ4G"% &O"?` TYAC11B}H^qʛYޥ ) K<̅A+IA5_VIZoZWm1n,a6( oVt]b>8vdc-ec_vOvTxh6G yhG6fsh' ?j^@Hk8YC4+(aQP1,o@i cŖx8Y I4mt9.&Y~%v\Z( *^xg(yץA75YiıVcw+pF~ŵ j9V#O䁏 +8?,8]vSExg_~G-iSPu q2LB~05AiQB!N2LD!o\V Ԋ4Xb>O w^3AoľAsRV)Tצ R;ۙ)^i<+")SM ]+*T*u1e+.$x9z:z%zz#:VqѰ́S RL 0*B xFmxЌuK1Y5V:뷍>W")Uaׇ Yڙrx0$}2d¶t.tj-X.eWZuT%r[żHサD[Ⱦu_ťL;cmsZ Z+6ASDAb= 5V&GNV"Mtا> IXMqRK-+nu!lҕ!^zHU偤[x_i@W%WĂxsOw"Z~}A=,@zGڗ*i}ҽm=}%RRDk/4CpU2g嬊?%^QQP!eQ(Z>䵂ְ7=]]R\}![%Gx-^ ҹGVi ZIfe4=ӊ%dG+YeDym=V Bi`,T]`^=@F/zA'޾4-S0ڲL11ZJ$} BSL!};iP_z5oD93aFTT DM.Ts(F"ƃ70:z'ѡCyB+Ta4S15Ξ;j쫴'A0iR3{xM`"waSƌSѠ:k~.h(JEþhm뒅m6]ȖkjgkԈ/ԢOUyset8Ug:n\Dz\]桿]{ECM5xC-&%eI!iec}V$p3Ȃb|*ɳr1%sM.K sC /j ?\*>(K˷,) l!2J9p i5K5KFѰC*-;#l(xq M$󑭆\˾Q:b͘CM*c 2SJTTF4+T|Zol6J1?B)$z}6)z4AP;*q;eLvL6G5Cۓ1N ͻS jпPsF¯; MۅV񵨸ړ8tkhE`ަ:H31eݱ6rREBQ@OH0t=ejD,"528(qGr("Q2dm GiH0NB iH1cJF':ىT_ i!*ʓBsy+<$r@i [dQװhVDM[AҎ*9 6ڧ7,D ԕ rPBPc8\VBdJU#UědF26QCKeq+`Xb~la`~.L>sIpS*Ҫ^Wb2t+ч$ԟy O#J(R\' q4!"H3I(&=׬rQ3C*KS8pNMZG,!D&ҰP<2 , @Ŋ\)ePm'`+'_mU[<≲&>lsOs@MÔfDFx>:tK6uTT*܏^Г͔q4h6@CLg ui-{ Q cu|Ez0yRѷhj(/P/9[kU)8ŀhxP,gYaH" ڌ9N/qgw^ l?Lnu4!dRM5;@qg>?jW`zNzw\%:bH@\ohs]iE$ %LR8C܊%N8| >61vy&R!8ԱNN]FZƻAC܋DwV")UO%}*h5WW.DSC}h6cCKѥyiLQYg7Z}ֳ?W"w:*' Ǻ{5ì B1h1{~&a5Uj~"V7~qJ-?4u1'cUe8)_ SLhu8[ R;7XmL]Xr݅X_R^aD#5O +nCQ=FX;lwv5ݥo\K&0d8NY-5;_оJ jmMRG7 BCZ.4/s4y1$IroХMdF0tZVM:!OjSE;;8Cm4&1`(QYZ)M"cl JTSJžvk4NH:Gk=hҢ$R:vgdB1q+nDBdH `F`q/(N>KBzˌ +dIJZG 538IaF8̨یu҄`lX(CchR8Xd.D'@ETl-BRn(Pu.y ,lm4(p;)=&f"IB?'B!s;@oAb;sA;#>Cm@P993=?9qDU*A)&<] &9tB:#@ F:VT3*rGOB:(SA=+rF%4EYDOB@!+H)Co?FFs:CLSMMT=͓錔;C9@%tGa4" E4S9: 4P5^4DsmzQr$~B@aaTATG"a$FU A4aaU1VQVquU{SWuaTV_u$zoTUTXunj5U}VuoSGmX%"W5XVVKUU]UUoYU\]VT&Y5^ZoΕUUmu][{ZU^U_U"]^y\ `S[YUVYYuYa16aud]_lU?\`%XU^%Z`dSdoducuTϵ]svcouggO5aYvTU"\ZUycUU{uca}nbj6fYgyf&F `Fqa%GV0@BVP k?e?C&bBI6%&9,+16~HF#sɣw!d%r+x&6Cq' '0^hCqEvH1b'=vK #J6W2t(wt@tpGwR#~w,s'C~,w'oϣqwbP*ݚ"VɊenPRV$|T ŦHXf(T'湬YvDߠ9!Q+;[` DѸ! {{;q1;`۽[黺5[ |{ 滿 [|\߻)|!1-1C1 n8pc(UxxmQƹGxk2T&3.u'U}<,y(3>.QOg0D1<2Ͳ˷'o-}(ɓϼRx<*'˅αtc5|0<̓͡|%1% $˕ղsί1*O:Yn&ƀ[#*:TFbڥsp$.=m@ O]x=aV`LsE+vXl)%jZ&<糒G|MP)COK j#o ~ mH&JS#0D:a\n0H~ dҮ撺,\^w$grtwo,Ȓ4b( cKxnH&')Ƙ-;kÄ=fgtÑ?DRs<Q(uGhn?zӷlhܧl_E0!=&oāC&!A7K0.[S_!%Fi#τݬ8Ρ6YTIS̈́ Z!ʓJ+}-2bbJYehbzt`ҢX)ˑ+b-S"н^a-#I<6&h͠JC~{a,/˄Y0Qt椻rbzRKLR5o McZ2]l|'"+бӣXuzμO_;vgJLwbrȱ2RK+/K&BOWevAM2Gb lS 5WQSk۝UD1h"2kE#i dQrE|&}qi'uEڔA[Uv6%tUgZ` T-hdE1] ńQz9ɞ|F~ Jh'&:袎'~mNY2JgU$fiYՔFVh ewPwT%ArmGhO=$'T=mdw$e]of_1$CYhJ=b?Vp6l՝*ZJo`)xglҾIWge)u]e+vު K$&dH0 g%[2e+H" gjS '(\lxM!)cݽnfL_tw<QA_BWa̲T 2p ,@22*Jh0 fS)Ň8BvPvk7RVnFX  SWh,e$D*2ueZ$ZT%a%pyXEsရD%Jԥ-m-EAuV09$a>LWSU%I|3 6zˆ9cCVtPJFgPK_iIZ^V15]pd,A{ Ѱ P0z1 ʠh{p!6kTˠ3"J|AT=j]u%8B4_{gr.hN;awJ&jhHlgK|TluknŕgZssIJ+r\"2nb];A'U<$=WG5UL(np89PV[bHR(IsASQ&aan84 #*n '" VZ7Q{ ?` \)a1*%QUD?=1Ih7c^XwP@#wxvQswlyrZ(kQ1ZN\6R~k2 2vfi&K̕0Te7197| GOQ]ܷ/2@as\F&E oWVgw8ͅJsY2 &HtA!bpCF @}E{0'[ hQѐ ]kSh( YjF$ ^EնH./Fj8gnI+%qDXzxq@ Hk P>w6<'Ō+Hopy˙Tr"T(Q5EH7۴dVB_!#S"+H*޻,mA^4wSL e,a1"h!#"dr‰+zjxޗO]"U-Q}l3Gz!gPǓ241S#T=ڹ!۹+CSp4칎7\ EQŊYB[[CzP.t^lbLJ5 l'X9ENu$'yGbn+!'"Zsݙ\qٚkAeh{_61k94r\”p B >%18kI3Ʌg%~GS7"u3EH6&I˔I8KD-̸<ԅj,Dm,Q<< 2d4Sj/3k2yB/`dy4UӑZIpDx9tcMxYHKg*cF~J0b@kWhy3K#@v>KX'~:wz27}d&6aքX?\vՃpI;h-}xCvU<1/,NW-F|XF}̿v&˷ >W,x +r*xC!X?cot׀W?!iF\63;Dхq$ *j+ :j&Yiv pʙJA#]"I&zuާx[=F%Q\.*~8*h~-5,ܜt8U|ܶElu Gpdžg1 jnj!6!A:TO zC:x^Í< qɃ57Rŗ  +z %z4ZϨŤIY*h*˚*g̉'S~yk˱[V6)4q\yk7/4~,X.\J1AL%LrE ,sjдBҨHE;*gBQDqӏ)}}ue贼OTMג8{৉6~ԻpXmMˢuk68U\МP^ AC$<_/Au Ks Z4mQl27!<(Z~{pZ6ZC53[ Dj3ܰsm&Pq8h]Jp)Ztbb{D5z 2PF S1go [D>tD9C\ 2614FVĕ!oq'BxtߡF yPڕwHEԫ#869e+%)&Xez\ܐ¢ED;TGh;R&);rIYyOj!Eve(2'C(]%dPh% Sᤘ>#թ4%l'bdni~?tTJS6(4j,FNWkZ8ͫ5;"3R9A}cT2o R)QG10eTIj5SF?rJD:YXc9џYVB4F^ꁻ٠Ml}Rs,LUF2Yf9 1 *PjشDD'a]x#-V5&bh9Z&O}\W,(1"+g))UaVs&mifL!&RԲJA #Dqcx2*;Ll3 B_&dP6 Y f'?%܍W4YYYAXF+ֹ6uٶc`L`\PJܼQВ;On:llδs7cgA]=gtmPN>(b nA 8x?TI_Z*b^]wVK7o#HZ4T0X0ϋcP }sPg}pz=gOz|>bHOezӋb={1>ww~0|>}ܗ~} }zk?ރҋ?;S;=k>=ܣ?=þЋ@+@?= ÿ{s@DA3>\D== l[> < >Ds@Al铿> CJ+ȼ CX5<<83C4DC5l87|1<=@C8CA4C4EDD@4DG\EtC34G<¸s،hЌOTO\OLOSJJ$P˲ܼ8(DMt˱,tKSK\TA˫ˣK[K|˻K˾J˥TLe@dK˴̿[-XABq&i CJBt~~l΂KjJ%8F^mSt{ͥ fffK`k(*࿴weVS~hB[J?SSTkoޔ믛# Ld(CthUumhŁ)*E[tcϽ꽼WfkBCMkrtchpllmD=;l2Bآ1!0nIXټ~}@.žUF3C4!,]H*\ȰÇ#JHŋ3jȱǏ CIɋ8! Ʋ˗0cʜI͛8sɳg)@ J(PH*iӧSJJ*RX ժׯIEY40NA #'8b6)# B<dRbhd0h$`)dskƨC}25( |pL|g$ !袅 F*餔VzbJ(pBO$**jꩨj~꫰*무*믺+za⊉l(VkB+. 覫[I%,̋ڛ.)M4/)L0M˂KG,W1 `lq4A0r ) 2$a,8 R"ls̀[Ml7Mq֯ӀL>@~|;~נM?܂:T`(DZQFn(nԣ%G!^lcpz'^+C@';`&Mk:Sw;6"B}+cX8.&ˆc(h8Qqb xa09i!`1jV*cVt '-遻5`{-wp$y2/$e Sz=6hm>ҢͩU6ox-9yp:$AFh<6~׸enCЄr:E+Q:ظ?3q?y3>xC=w {s3NMv76jLpvC>Bgtv6Ng{tggut@O4A\OP`vfiVvJxvECuPQo'w D `  q"@kFx+E _t_Ilx`5'Z4@094m7@ =`hg 9n{ @ ɐ`mb`66m7p^ Wlbn|T 0,x ֐ @07 H 9 ɀ9@R @l7h G~"~p@ #lƈ#` eH HlU:';q#WzeJ #<ÐK/w\e4wu 3=cLs f f$t?*G[3ؒ5[2tOu[Eu]uD[uOO v΅\uvn]ٵ 9CV(^j }0F_W DGh S4zqxyP6ZpWϠ07 wWy87@  G#I(Y6LJPp 7mR5070 y8`  #0(=}0|m Fpz&6oR0 z7{m0x,`m0 ~00X:cD:֏IWdGFJ"<K=0<,<^4Lف=;Y>w&'Dg+g-96X@ Th@ZGu[[5DH6PKxvVjQNxj7D@(0ᕶke1_fy Vj-Tjn5y80pnCp)F@~p'{#-} ǘ3) Зqm{,`5 =mp@0 c8D ) }@` mmޖ M0~|p@C 錴 1l{ {V?&qY;G9JfWsJ%<''yXX%Y[Ŵ3s:cf"%(ft@gMt t/Iu[N[o4A/BxiiGi i(j>]V^TkT@WkpE7E Wpl65z= Z@z }TC mmX3:TY0 pc[p`5U9{{7fF  K[ϐ6 {h y)l8 ,a!%_SZSpJ`KGRc;&I'~ՊItE;JJ ٟJdKX1GtɁ d֯J$[AM,-8@3Y[&@58thh䓍A>PAXPCid']&iQشMCgHG%jN8xWN6Uʥi܄M]O]M^R`0_v g'Đpg6n$k6T7STW84nfDTg8UyoX%V.|{T:h)NId>fN2n5{^Xl<%ӋY)#InZHt|[e[M۲-[$A]= 7\0NxMQO8%^s gG {'b0v4Jsy:s:sZOWqǭ?Jȟʿ?ϮzfrP0 $??rOktn>}NxG@=>DxP<,QD- iSF=j1H%MDRI@sdX4qilęSN=}O?EE4PM>UTU^ŚUV]VXe͞EVZmݾW-uśW^}1 X_/Ydt}|fΝ=/YhҥMFZu ^֡Zlڵ#[/nݽ}\a$F<0o̕? }3kV_.]vsg;Xq <4vwߞ9|5ǟ>f0@caHA{0Bˏ ?L '԰ͻ<3K$D j\E p}G!aEPI$7lR I*RJ-E%s c2Hq/lM7߄3N9t51=aO qNCE4QEeD°pDQ0 B8ݙ?z}Q~zGQIoz_ӷ}+=w_Daػ"~߫QpS?n`0HA/`-A P?xGaSaaw{!aC:Xv/l WeR[_v;G(v XE-R1X<(9 ""?^ uv"D.f`#6u|#(/d S8?H1/ ÝàU e~ pa(vcj"fZ65i@:U-K!9D21QO JP21OYmb6MprS,8sST;iyֳ,>ˡN{ҳ&=O{s$A:OzӡTBbDT=hE%:24ϔf? ZQii41M4,UJOm iNuS{3۴3)wjBZutIdPSӧRO}ͣ>uWuT КFSB .,$@PND .(A ӫ*%\r=`< *]AtֳmY8ѲiQZ\6,,lYBO f1{斳l^z[Enr\x`\)u1tIf2"LS@D&Jy  c_JBA Ycd%58/XR\`"5X ̦i.#ჱNʋ(0Ki %0 `rSn isE 2i!`  f"d$a E HP҄ddYbet`Y|9>\jdiE֬`90r]UAdB[A}+U?ѶOE Ahf~zL` &̝Qc8Ctv@Nlpj[w"Jl1׫v9Cja[Wh1ᇬF%I6vMyY~=nـ Y* 3)&w=oz}ˇk_x{E<5=p7'Nux5lic77 cn|e\/|)~<`y$GB2EB h9?|<瀋s~<DWzΛn)~FαsڅR:y҃>tO]`gMg˃ϝrt۽z.vם59ܫuOyxϼ{?8ى7ק_{SR㋿|;?|ǽ|/}}W>; 9cK?28[ 0b| 572  &A( t%PYqLj6P9Lp4ǠQ 5Uk"5%4q35K)s&o,%r,qH4tx rpɎ+C a&CB* )]AjCDDTEdFlD͂ ,Yy ,@CCp/C '7pi¦Z'T&TXYEnRY*]EbE_dU**UbLTW&pE&mitEk|VlpFnFghtFW4oGln,idFuGm4GrFikDcGc7R4t AL[#ÅQ 2U#܁ܩYQ\Ȏd!)ɎTɕdɖtɗɘtIțɚHIɔɜ Jʋʣ4J$JTJ ɦʧɥIɤJĝUO~(9q;8̸@THN억4-+0QA ۓG㓫-˻y4$L?Tu$hrD N$d'<52̴BNd3=D6: k ,E15Ocȍ.>4 Ky@8P973oB̴_#nsK DD Ep-hMb Pķ?9Di_HEi Tŀ}] Ut]XDЅ[{L 2YUطTM\WJU5̠=Nȸ4J 65p/`̹EX-؃^\MX˭[BqXNb@ HJ.d1۪ 2^{Z(I"AX>eUM pż]PhpCL2ȹQD2Np4Y8/L[W-KX\؁iPY#%38$W a`I4P̉XD~0 P= _`KhK{|\3h~[KH/}QBT UX 5}̇t_L}Yh(\AG).a=KNU,SKȄ^G2ưcq(t)bF~[8b]_EL}LM@@-PȢ ucaOX\*]0L ,\>IL[G8kcQ#Y-y E5*0i$9 SpfcǹĕLȇ{H;f[II#K%(Ǫ ]SDݔW͹كYMhP\V%ұ+jAw[v`|P ͱ+Bރ5$ %4w~۔b>hwP+ _X+v4(.A\fC 6c$ܲA,ĺ̋~)v00iɱ[jbޠߏ+R11 5F/%϶bp%Qf[bkخ֙D aXV6ՍLFι.QW(ᯙn1L(bı`J\)>J.xl~]φ*FAL]Aܹ0pn_YX_UЅiMAyN7X ĔnPMYbmF!EJ@dno(i)t&dN*YŶ]*WH+}a%a_IhtJi`*N'\LA3NkhlhOMcfu/qaedJ]e ѷ LX(U0R8eRAp`(/䮕9QJf`#[_*H(ε-W&UNU'3>2uKK˹9wQr8h_-7Uⓟ9-e_"c]9mx,tB\mܪ@FJKFjPQ' ] DL(X]˶{KNH~:a+x]dQvѵih/ Tႃ>GaU[6bSv%"qZC\ ~ѫ0)vЅZ1q* VpYU^eXr(8ByÕ N6b8(0?9|s]UQb>)D0alFU"0l!Ĉ'Rqqj_DvF fRi#0F id4K%F '*,9 SCBF ]#F$ eT &f֭tծ"<¡KH@TZGt ~5G`3n1Ȓ'SvJħ2aІ4*A!oqM/QQr2 "b `2$i-} VƮ*Be2> , J )JGdx%J&V0Dbw늯=* /i."(.D(9uE 〠6ȏ2x" a袋*T}=7Ðg%&ČH 8p$/-W)80N DL!ULS__ $ct\s<5H00 T% j]&v^0, N#z)iC|f蒙 Q jfF 4PJ TPB9d S+[c$ , aSF;"BS)  5p 2cC;TGz Р:M /JŸ#\aC%:n0T.TZ`bCVRL1CP1" &kMFXFI%C <2E@PΐI6/eL2N9 IEE; Z U R\NV^ݎRP[K i4Rm `BĈ.;K>934*F!04ά  ?F0}@ PCi=pڐ:pLq$å9nCp>@co<򅺯J~#S 蓿9 }OK1DH@ ZRǮx%v`~ƛV JoH@ v+8Qy)Ra'Ґ1|4|.3@$2{ u NtbgȎHԋGR:}gfņ eL%7ь(*D ~hG@!s$)51)@rl !A;(2Ah&/h0TEjUS74`v d >!iuDƌ:e2|&4&Lѐ<[^Rܦd TadCʁ LDA%&&=)JSҕ.})Lc*әҴ6iLgbsG]"CQH͇* %#BBBթ!щzqX}W ֯FW] '~9DAv+^׽~+`+=,b[r yhYg0i+rգr*hyђeH°QZ4 |lc+Ҷ-ns򶷾-p+׷@0KΡ*%QʪnMuZR--x;C aEh1}/|+ҷ/~/1&I&U?q}0# N!=73 s0C,&>1Sw!h 2ye;^Qqc` ȔI.l%3ɟZ.)csV1Y-s˽($K1f>3Ӭ5yͱk*/h6e/?PH!E,0tBG:Ѣ0eB懣) jQ Ў#;-GCхIjV#Ֆ5_]Nߺ֎ֵah_z״5ka׭^6gc[Ϧ;-lDk~}OZvu#=nMo6Askخ5 JJKjfkYw!AؙEwA')s8CN]sge գQ9/ZZr{vye?e.eqLaAg3}AR.P FPl[ZFk3Ӯ3e~VNe썙~;/?<(r~H.]e0l:Wꋆq ,A{?==Գ=Ez'=ZSB1鞘?>+ $DŽƒTй2H/>T~]}G~з^U/ /8#__j^_M՟^!Fi U `aɀnCɩ U@]\؏GSG aI5!^&a5! VJa!~]z!J8BaI!aFaJ!2阏`d`B =4#>"$F$N"%V%^"&f&n"'v'~"('/LX FQ8e"UwR-2ԉs&i¥&tb Xx!%#4C [9U_!E8Xݹ2-F8dc/bEjV1:>:Z=<- Oܣd*# iAaݱc9KXaDJdEbD[CD=}&=#>&YEF^dD]N \s[*h.  dx79F9$] ́I$S9>S !]Y,YT,"E,e-iC. A:FM9ETeUd, \ܥSY+^V[jdG.edK¤ClD!#J>fRZ%dJ&U]fed.D%C(`_҅fhxgh&_R*2D9gY&g'/dpbM6>mS$tYmvP2'wړf"@jd^vy_rND Ц@(<)Qd覧|ExDƈyfRX]=.CDDgP5F (qh~ %AňDC2ωFh#,%tYC8}$ K,JºL|(uG"S"݉B0b l,XUÙqN DЩCb>eǘԕ١]>RC XI `CHBDm*\L$[uҒfH[ 9 *uPAՔ.HC֐SB @%84 P?!giɏSX>520?l8BQ BM$k@&\Bz@Xzhflg(** Y~yȡE? `pN.8$!jdIC(ED ,]݋3bfhqǎUe~L1-g@%7M 4""#$5 ՔXh t 1xG*A̎C;C>OohZgȒGz܎YI&<ˆ:&icDH4<D;@&xF0   Nn/LC&hfB ܩ$C /XB0{"@%BˬǨBƸ0 (5!Pl,~#hZ"gnFyDP*&|?hJi(V*渭'\WxU¾ ( ǻ6]1'1R@C J"@8 *@LG&d]8DdB;܃%0" l=Hbd@z(䥯."HBzF0f,)"+p/pswE0+HD0@䂰C;t -p S͒8Z*܃`$mc$ L dºȉԀeBh XB xXIwC&L=(Jβ"O%P#3=2)1D'fU+CBj - K` <` z KB]/ (SAQȀPiB.6J`L /(Y@G*D Ȣ;S,=i hg :B6.`A\H"@~Ny>Iĭ#TmB@'6F|K Hbo<2 D&1,p #P(| @g05V?W腮2&ܲ 0"-#w=@&m !;ΜoT# d$-4P]yAB8lFgFw:=53gI/'.tWVjaD,z*ҋL,L*Z80r@to1|2E3#4`]M UB 4GW,(EVcXt5 DĨ\x%uiE CqJ&s_JMEH",`$bG ckmäK$LCUDK aP:M Q ׭¸ںd(PE,>{6rHBw E;(K\% ‹F>u$ C C HlB 86CҾ HxlDh쳦A8,J XȎ/}</۽t,EA[&AȊz|7&s (B;m9陮sDBH&vυM~5ᎀ[NH 1.pɔ]4K L Dc 󘃅0Po=︵10`NCQ5w B # B@\(ԗK cWwND: D69P 8 Ҋ z2u| K8oDO$|4 "Ӂ&u@0{+N;ڱZM#K\ %GpNI ŨS5@h\نBÈ.@ 2Dq ]"(#B !xH*]$$"@ # raˆ,'0L98}%, G2t,GL2ճ/5.#E`Z _" %]e AB7=y"a'n]wջo_OrA VA#,$%UŒQe%MX$d iPQ`DU^s^d;U#j E=5`|"$јJ 5el v0V"L#Di<Htf6L_`  B?AAA$jPTÆ)ʡ_FSpLR%$R)L0IJfT`dbhȌZҰJi(`IDHc9Lj!!tsf ;KQ#*Qņ4DGUlgdA<-cO@(_%ʐGTQ†WEP%8QEBqDȪP^ VªaS a|VU*1|ʰ!J|b)Z] *)FSVq% \BǗ0lG':ɉ)@R[7!<(+IXϻ`ANQ /a!a>`vXT)XdAADld 7wZOL{d=02ځSE0!CIAy$,NEKDDveEE RIKbs ?CDOK@M@Eq]$Ll ˺/ +78T8Gi'\uu}U+vRX"_goץ tx)@6l*@=Ogi x,n `k"JADƁ.`%A]ܐJ_M$R7 \")F9(CP@PvE CT JPI`*ѕ鎊UXƎ #05CG~Q_JOIik4 F[IT{{)0D8FUW@vpc T<}d 'UA@ i#UaE~+!*9O2 Ԁo (~Hk&VɔhӤ0{\<”b!xd͊t'^x'% *A1a(I4T8'`J"ud`R= BQl|"R:J}4RD R.\]RRĔ" )MMюFuHR.# @ҤMuj^B)րZ9>1 t5R5EϩU4!4Ps]iBE`Јri1Vʕ%\eCʖlc:PI=Jucb PFGZm\kZˢW;D$,Km[nupK\ۮwH=.y LwA@P_t/Er}˗MQI}yћ^w/b.X=څ–M]j^.K`7Rj>͋Qžn^׶^QbG"E j_$թ q|;H4=qs4~G" A>.4?yʽ^za'rY~򘭛f3yj>a79Rl 'NO  b [ӳfnb/icL0FiG<2r pKkխAD8ޗn.!-^¸&ȏ756]nliOɃ֥\d|V.u+)RFr'oΨ1}.OC ޥ-oQNwti< w`GKnoڊϞ5$Ar%7Qr-wasD.Ax|i$=ρt0/u% o G?ZREG]1dzˎu;" {==gw7x/E?u4X.srAMa]IAzя7Qzկwa{/nOMH:e{@,O~/Gԗ#W@샟7џ~7]0p H l(,n9bbr4MQ0U0DJɶx@-/,&o0ypMLBpHLvF.0 ѲR/ 0 0p m p " ɰ _Jv' eyvʣG Ր O eC0j0 鐧QQx 1Ҡ !1%qqyq  A>CQFqIQ-3ѦP[q- BȔ͞xOy|1qр1m`q1F^H}qGQ1р~J.(l 8 2!r!!!E"!)"-"r"#p&#A2$Er$I$Mr!9R" G:r"S# R#_b#iR%m&O 'r,t&a(%(%2)R&{2*r**%ud.jM 9 8@`r,ɲ,,2-r-ٲ--2.r...2/r///30s0 3 !-/13NR&32N2!Sn3+2.3;2G321?3E3I5#4639^5N3[4kS3q6}6Ws낓7s7S3S8:{S5-36:)9s6:u9C:o;ss=@e36A@ T@t@4A?A-TB/4B5@1`x)vmt1DQt(t+TTEY ʡEi\T ZtFqFut(jT t+tEqE_HGsHEESDy4IgJtHY4zJwGUJIKkL4LtIFEctJtKt(ILFeJIO5PuP P P5QuQQQ!5R Mnۊ0 5uSZ ASSIǼpI<pUgGU [Sev&, .uVq5WubpH-l4XvXwXWYY5SBDDoWYZ/UYվ̵\uyU]][^95DepM^_kL˞5\P`u[3] UZt_guu_!b-VSZ2V:6rcv[;Vde,\OT5N-tbifmfqvlK`fb5e9ΝLhJhUhKhYc6dvdesj{iiVkGsjb,hA,ppik+`n;na a\V\W&Lv@B,8v/\vww ,pP*auh@On,fR2e1olFc8a1#J@yA@=N:@AjBR)-1O_(J9:}L}QMTA-G4KRA__w.d $9ҤC9lB*F!xf>.e1D4$A@ AF@nrAj dm,*595AQ1,cps$;c1Ae<,a>@z*705x!D$7&~?;!({=%-1[=/{%;?5۳+[C{7I;;n,`[a{,d{k;?O۴-۶g[_۷OyG۵{22u[;){׻1[:>|X$+&)<ìCv`h@ dCZ@)D%3#2W$$0CO0a9,EF<F@We#a` 'H3a&IajF@A9H'j/C,; g농&Vp˹C|pk(̅|_*͓j2͉IJȫxצ?JACǣ2Ga1#`$ͣUM# vcWhv۽ބ'K(,a3FD1D$2.dO@6c`B`9}Q`> "i82!XC ^釾/,RI,v#QRr!," "cLc&0Y(FpJpЌB6bG7 >""%_84(BE`,ơ$ 6"^)P%LD)~5YDa&n. H #/pI>twAW^뻞owu!x؁b'~@Σ.*<_ߵB*D?_ϼq?!ݟc˼w_2fx"p:A Z%] U8ݚE bċ?<̛;02`!-׸ßݻ˛?>}uSθ):j70`H@w`^`>aNHa^ana~"flg#O.(C28<2#:޸c>8"=dJJ!ȓ4.IeV^eZne^~ fbIffriΙjel a8 B< m 6B,h2(i8Ji^Z餆NߤFZ(** 0jj kJkފkkbRwy|}bgTrFp< ³NK-Vfm^KnA?pp ؞ mK~[n;;-*\p2oR/O0 bWY]舰W_ Z=vYS^~YFϩj a>pm[NN|4ZLEmsY5PLϬ̈́[gT Q}6q62]7QgI; 5xx{ _5\iPjTdvudCFycy8kLB!ƎQxBd=]q׎3Yi|o]wY3afAW%%2|$k #J /8/bebeAE?Qb tw?؀(._x*Q  Cl]t/DfCE^WPP(OН(7GLkғHE&GX/8bc >]X Әvw7; *|($"J0(1HL cI@A `X G( V'`>4 80<$ %؃1rȄ,.0a (S#h`- HUO7M)ߌ2::f]L_@BX '0c$ Sb 4hڱa(PH$1IH2AwX!@ $a8f#CH6FEh`F)'A@. _4 h4P/k*!  ̀$Ю ~ ݽTY)Bo{!y#Tp p$;Y]@ A|" p X~`(SQ%@DЀ. 0Dht HbOv!_ f&MDfwzn]h@bK~|72i F6~G{[\ oN[frK˼.K1CPc A&< > юV 2XA桊sx 2m,vЙ}1\u8:|-$BHGtPXj! Dt%8FȀLO0DyAvdAtg;>)(8H @m|>`8kЬ/`'+AoUa}U\?e D(f$D&C|A7"  Ρss_>uOK h TP5 ;dH P5_6p` q 0 :?" ` :€ P@ 06_X 8P W'  foVn`]ws.ih<giAp@14" PD`d(e  $@q"p5e@{$0 `0@)]eH@e 4"P/4XiP fQi @2 h@_e舄hB1ц8$P 0 "6"3}(see7>Ag PsPQK8 k _`K`[`R.K`TPXuP2@TD5IPpFQ{ 0\Pܐ K Г{QyyGUU''8vEi{7'h$h-@%@  0dY@>vrT@˘@9q$ 00?$'K . p 7Ӑ 5 %@'_$5ua'𛪠WYUYyye`_ ! ؊ "0Hp 0z9  x4 ؃6 a,n> m@݀_ X; '٠$0M̀TC@` 4 `Ɓ0f\P H0LOy%]lek: v6q;5΃zi wpPH@i 066 w6]ii Iz( ')0ۤp?#2pz._052[t 0";p2 erq H #25P :0X4_93' 6 TY Pr! j7;@4:1:=N?WF4 5` w0   `2 ` B@$ + w0` O| (` P0Cw@{w tKam)P0ysTKYg]afa@M winғ9Jp@Iyy މ 0ڊLi{ DNQs)P)hUԪ`-tXc& $p)0)U$`6)P#هT0P9j %ଞ:%@ r$LЯѹ7}e'c((`` P,xpQ7u; 6"400@K 8G P I𡌰MP \pݰz` QPm 0 p 0P ֥]ZI]Wf1!@^c@pU1ʬ" _ ` ) _ 6C + Z* p0[vHЊҫL@$0ُ[ ]5# ډ#@6IQv!_4P0 Zz`-A I#wʕQz`>"Tp 33m0 (k`G|lȀ@P2 _ U%0 I` 8P\ (P pd@PP g  )0Ÿ 0 tљTr lY ~0zR| zY_Av0u 5 60#`S|yh{IP40eQ pILZg 0c=(#@Qr: m{D}ʯHʠ 0 # Ⱥ֧k Œƺ* |# `0 Iөa @X;Աh6ٿ Z-(|b3: )`ܰ ߉G@p<KŢ-\ ِ T05 !P֠` #|X̀ C0 dgO ehe|Tw8xic`UݨPǺݸ* j {@yxIi`{@ Af6`%P-鰔F> 1V@x J188ȷY^%x Qn `( ܞrՉʊp]. c9):F  hj`[4``PGP` ]` .tq@@`%` l|\PAPd_PS| : up + P P + 50Twp8 T. 0Xc|yS5) '^F>8H@rFg0 #§ a@?ԡ [r&c+'CtN)a?/EAW:lAܓs:6wb- F^ܖt:6S?}8X?sRxnܐq!(p P]C Pr"Ej!#;'Ȯ:' \qaci`@DX`I d@x [ 6`l@``0P"` @k \A`&p Gpu@p@h H BX.`8y (;5 GAȀG"\%K/cT)͙-[ҧO!Ӑ 1'q (1鸦 `*4b\U$GYʔʜh?VeQ+ت`?:u fд7'۸tZaĉW ,qZx{fVWDX t讟ĩ3hky=uO/#a!G,m*1rs`# VӀҐ0̘4($V;JElKv|)U *TA=pxPcv`ezXg)Bsa@# F@ȅ;a >'h@diyRl=$TbALH2rqZkl.x'!Q#Trd.~lJ8Gr(\K0{EF72a +쑥;pX"Yf2a%.RgI$A]!ń$TTiIkDE V?f@ ~j@GQYeF,nJy \&`AfC@C!"~+ˎR!0˽&pUw+d$m_%ǬLC5ǙbDAXRajJ@z 'Rp;tED;|Qvjf 61nYAQhXc&u JhHB (jI’ & dGXd8q"B$ =J:׎r-/ƫ%} Wk\3v.*I7_م͏ Iƽrq%g]-JLe7 M8kc="0`tJcdGRTY@vXip)ډaR{ k9):لHPegb8Ǐ["403*0#+֐P, byp$EH"[]Р`n'lP+rWlxC*tSz%K3!XD@Svӛ߼ae 3"4H)1(<( 81 ,D:t$TN䐂p58G(P!(x ;^! x@ mx\0 $$8aE @۳R! hHJn1i6K`S$f1yL!6xP6cjXLưp@TZ `p S" x1;;$TbL؅5 *`Y`p*T֘ (L B.\ "`Ѐr&a;Ѝ; լ!r@ ps/UZNuCejS?#|&Gtǻ8x؄?b G)4 A(nT8H1X ,8+Ju)`76!@ăS@&ځ$b(@A.attCH J .pU#m%xe,Y"DZ%@NꑑpoL}S}V˗K&35x'-` jHh:ZAa,#n:`pA2rA & {9!;R`fCM`awܡ<: % '8$rDŀ o7RM[trQQ5+*r!06nE hDI ~pa ȫ*j>tB ,Q 2A#p(, _)F p@@} cܢ2hC5 * ^GP C CJ,Eh#rB8$ IH\#Z׻..w[S!PH ń-l8-D bF09$! s N7La0pf<  1KA?p~Cl;F)% (!Vh$ fS@蠭`p @$p~`4Ujf) R-= lA'%ъYk*} R,ESР$FA(#0ICk8k *"1H0 AiXvJS }pm V`% Ĕ1Ĵ"DG `˵J,&TKEJU$DK\OTt_J<)+6:KAn0(LvH: QR@;`H +$Ap30Іu#0=؂7)Ăsi8HxDHwXĜ Hy.P-J59a\J^ d,R-͑NJ`O2-Eʎ2-SA4y0XS2/Rغ4Od; cw|+( |8|0\vsdj0F8ȁpthx?x7`{x"(*2HVQh.pS!IKP)IHLՒIfy@5&! 5̱(؁,Rd 1S TW$|pӵ8}nE>֑A 6Td8G*d"D`VLxV<؇[<|f G2ȁkk/`^؇78l" 0}A[Ht#D0k~2E~\ RgDhEpmlbqġ2WS|DSϷMKWܲ׺NS; j[>岕ЀC[/1؋=2;Br`sv8vP{ ,( * M8@zixRXn$@D%T߄XXJ1%>;[^O\!±'!NEt۴_W߰ۿ < =ղAkXفhVh[p"gx@H xutY8؀,8b( /z @88ȅ\H`]!XwLp橈!^h'…٠yFl#^.  c ߞ(ڀG}݋Zt[JU 6?nF-dgWH h4>3*(_Z ],tx>GvЅvht[UHDX[ iK ~Xpw u /Ӫ|Evec5ՅypSQtwQ 88u8`Wt䞀#bppck"؅7Єeȁ'\@I89bc8dI~ yaD 0HpB!ذB+.ĈƄI| K )R(3"S0L&Qb  @P+S&!8{(c2GK~ WA +6lAZD &I`%ͫw/߾~L؉)]]𖘖/cKrG@y4zzk#T` Dlg3^ {lz˯à PVG-JŒ"J$D.gxYCYedfIn%)SM!GS oxA. )2R"d,C# 2% 2B R b{G"" xG/q 81O,""2Ӗa3qPr9ncp 3sD4\|<bw8$dG7ȐA8ΦE81e(#Hʡ-ՠKi(BXLy"`0(dv_VѕiN@Qŗ`Pnra(qRK,x`TbL-YE| !MƼ 5$kH/%uHԠ 7A+`"#:B@ hUD] $!0=" PXL@;XB 8E#bЈF DzыM`-< (dbPɸ%ad%@עysFV p $ FƱ5#6KDH`Lc1!`pF 2d2%2@ '&"O8,Ɨ]"my!4>TG7U?A3!?"4&^4Mz׊ :q]r0Ă ȅ5d a9d!U# 3;p X W2A_0uB>-z(Q$ANdd%_EBjGMF9a pDXpjugz XƑ€Tq\ 1,ip˶&.dH}c>mgL#F@N1jsk׺5ÜYc0m a .簇/!X C%y{CL`3@ l p)D2hd$BD9Gs~?N>PtȆl` A"E"rl$!M#%DA77k^)lGUO3"g(Er,2?lh,:~*29@uYag ;(ЀӐ QLcVJb~.r"]8E 0ǕCf5b0` %Bda4m$8!Vpw 5p?$2IpԼ3#n&wlή\,E26#g&灯Jη|EU a8.rkDA 8D>v~*;\` (l(c`cjC AgD"&ĹfkX@) B7t$p$A;΁@) A; &lemȴhi9H6.+>$-YH@ l ? A`VG (:Jwݍxu8hb0`aB<@IZ%]!@n<@*@HH$hnX:/q -Af-"p];uSɌV~ Ȉ<7B9, ,Y> # <Z[!@HM#&QBY"!Mdi^CUBz="oIduEƖcERF%>~XQZƕAPA @P 1: (O) ԞC;O: GĴ $X%X 8X `ϳi8O BL<; P d7<,@A,_#1 Y:eI*A;Db*b2fc:cBfdJf u GA epfgzgfhhfi jfk&g@ ZaVkfn&X=fuEbcB4˳EEp7,)0LB-% + 4t 9eP <)t ;ܚSf -=B%x7e+$$,8! A&򉙴_"Z5Oh芲hh(CHÉh6 i)1`B2ih^zوB 1Z!L\ X a : 9t-C$A+P$h$s+X, 8F7a H=C l&9,͏|HƜ4hH9SL ʔ ))B4 C ,@ CB*ID^GjmdQo"k*&REk"I{%C,H"'GP $;ܛr$4@ +%;PAwC %@ @<8C8Cjd9L5l-A.eIj/P9Oɸ@%+A ;@)D"Q 9+눦qm m"КY2m:moARmXj"II`s|Hn/B;[6-:P%9P X@\C= <:A#p]hVYLTUA"$+ I5kuoA"o*2o:BoE&*/"*`fofoj^/n/*/2(\rޯPhApo?p.p# P o/\1Yq/, 0 C L 1?=$*8:`@X(BS>\=hB/= SBۋχe6},X @=,<,9 !Lh 4 AÇ~]Jr!!#r"+"3r# fMQT2&k/d%s%r'[r%2%&k'w OPA*))r,-2--ò)/8O4/2(,.s.',//or@2VtjQ t8 @=Ы)A*P"M? *$5,I |/`C'A~l/l48uiS&OƬֲ1$>P0t)#B!t B,;j)B9]5TP§lPuQQ#uR+R351T LC# UgJgjeş4AY/ tkI@A?D|A7%|$L4@ +L2,P%+6;=3D߀3 ԁY`$8O( A=tC=+b pCB܁o-ɍNkN+Eb⟯`tSwu[ucuu*`@W[F xa7o"7`pzԡ &.7ZADB7,0A\qBS((h@;w"ܩd2C7$ C98!ٷX>T]IݡoA7` bB{9_r5PPti[[.+@?2)3,*. *C ;b.6<t!,L㌟Tj>@fC:_8=kkA(. A+A5/C+N*@ѹE7xyV=P@@y^u{_wD; 0ZGDWŁ{Q+X@J~(,?fB,B +";5 tZ~<$ G ,Bf%̡*8C(7$\Lȴ)%B;;+ B*,*A>89I;|!+/!,\ CAfm4Ǭ6[σL@?Bp0pC6*0 @;UCǷJ}}w٧ה-2W@BA'A=|@DJjU*ɎR8 PعkC YvbHaV;X4zNJUysv0`@dօrWK=C@¼=B4NDpP628Uk/J1Ņ4ضu[p|Y{o^zEo[2d  HqdnA԰q/nFtthѣI6}*qSvvl$h|0y/n=<yrm8asdX 0X\٨t/IN=fh,TٝհJvLQnaUh@ yba ^G&0f! r:D KI=T'H(AiPp & L*f~¨*1gJn("H !IزKD 1hL 뫯qtI!̼Hp$Lƹ8)D2B 5jFUl+7-EgP K|OSLS;E# ƙBk)]Pd nztb fRALAǂ;$醊1P IX7=$ NP'cN#Im2`)F?(j4AJhP@ÜTj8T-&ݢDdNdDۂ2h AT3lTd`]|4M~Uv!)dx|+bVJe@']E@fAb ЀA"v(TI ,c`;A08',I4Иgw`#0c ze=@yi@*d䨥44h .HIXscT3{bժ\e%UJ0ƖTa1&w H7] !I&_ERsl %XEIԊLbˌVD Q ]5gj3h(2L>:18k hv N#jeBU4+I%IV/@ K;Esc :J1.Рx1ADB1`.:@.! @Ё]A`&1`zA9D8 ^ &HQOBG? wDb+\~G`F"%BCAF >Udj]0ȱ P!v\р)Ղ5Ȁ EtL $P_xDaOpHA B*r&*6* 4%T!?1zKk Δ%1*vaW (@ƥR_  P҆JNtnUe8@n#ujG8h%ڱWB8Guܡ  4~$!.! C1ްc Ǩ6%@`!!+E&JXLb m !FȀXpSXA' ڀU$ D"eM(`8.vCX LL!``=T.-(\_3TZKFpl@Lt_vГ/7$ÏӦ8j=,2 @%DT[eMNp:`F;#эVl4v[H. @LJi/؉Y(I p 7bS 7\!L) (4c`++hCP _42 ʦ 8}b'P6I)&2 2|1A2J%ѭ N`w.wH0ʂ#P#@)32@Daa~cۆ1kH#FWeE5CpB0j`;ؿ66?bX,X߹MKSH -; nP$.L,TpB0id"F=Dvr t0= w(uBAt  9apS[6)7ޒɄ$j0 2QQ`Jmnh"00Kr;87V(Bj8^ Ôm>8R3_(Cgl Ca?_58KPo+m.M_ m>ܻL +[x ˥$'$v|Qp V@\4$fʩb- z!n ˵4(+ fFL !P^a С֔//2v@^l ښLn # T&\@$ҍ -ms^X\@@-P-o߰PmQF* 3t!4$F&{$!M,cJHgk4)2L'Cڂ :`p\@zJϚ !fXR@b~JN6 0 F] (BVp(bbЀaLa :xADhc40 LL(a,D~2z ,`! dʀ `!JhP` A-O1}jԈ3> ڡf'=p8a6 .ti^tF$* ȋ l& 8$OzHiu !ށ s% `A:(:`Ec E,rzo `o $(1FC q AA`d P`ҁ A 0a0-ƁVi2.tafơ A! vځ H@:Ih`R`R/i@eaL Spl3mR6ކfq@#, 3R6.qځKfnB$er `mTF"LaP Р@@ @]aAb-~Hp)`nr2)p@q(ƝBb@i(v@&a a\@p` aE%^a` dCbK΄D11sQ===2R i l-@?!7.Sn(FU6$*Ce0BQ1b:BDLUF`uD`AC\pAB> (-G? Р(zB*鷆(`СTK`Lwq!J@A(>ИbXA @ܡF~O tda j,)傜DVի /V9UF܂B$%rL5/6c[dJ a uAX}, Frk]NYƔ]TB~Ls(q*& |"? 4; `F Za= V A!ZAZt @%Q&0h>9fq56f9cG,X4z-jsr:4&,'7hp:c CR8fX IB!Ii}B)pqGb,`@%|' |b>6A:R @~ae*Ȁ Fa@ځ ځ e.6,rM*i/-1tRMe*FtIKAT7x4T1V  OxJ@-rU6 !D@> 15""M~|}tIA p\ˋ >&*\`h@$@ fʃ$ PA* ́R!LJ8:3%k6VrYI*8@ACsݦEC-%?t_69!yVeeEvesWXр % @J>@X vْW#:Da853`S&CV!g,.-ɠAZa ! ')FbB(LӜQ($W@5[" O4 Z, X `aBt`R^AB$ ! cqb!πؐ ]N لBV! V&+۲/3[779( Fm* Z!o#C~u'Csv ?˰0D0DAu4 bsBJp<>~A|K55 5aK`<F(fN?` R`j  ` aa V!V3hJc tOS\W[_< Jn8VADa(Waux{ǃZ|ew\ȕȇȓse` -B`<Ǒ\ˣʹ<ʗɻȥ\k`NF<}|ˡ-9y'cfۂ<Di-tP 2Tu BJ=>[Us^) "<~kKPa F,``@!JdE,FA^ X j@8f"}Q ]] =F .}7& > !^^>)}-;%Å)Ó!gaWB Ob"G N+ B ( u&sQLt4b'GѸVa&a|J#P`AAAL!La 2܃PU z _ t#_' ?/*3_ ? !?߁51FtWWG`pb&Z`]tԉCGCn_@3*y8y jd$  O@l@! ALAaAcW>& @H*\Hp!:DŋFaƏ CHȓ(\ɲ˗0craC=*= K#)M߄nw,IeGNm#/:qC /:' >RXə1`%ȵ/y<_UeH+P;RY VHKk S0C+CmH  \LgXVЇ-RA駼!WT"Q s*?66xmjl`ZDp77Gkp F 7Xʑm9 x"*$!GUA sLc9SD"'()JWBLhZZR=t :HB?,0Y>r*0%KR:״eNE5Q -% [bЊ)$Q\)dp4SȠ(>n0LA%8:$SAkTg2b#e+ҦՃ+oYB٦p@}*n'TUN7 쉈=Xﺖ쁭\L,`pC,KAzdqBʥ:L A-kf(pEWt!2eZI( K\@fJh2 *I.C:d'H,.OE!05 L1 tH" 0aFp+b"frFIrN2N$ˋh  ° V | o|0 @Rݐ+@\0+K{ p  DK;a P.8Y8JeJ U]X[{bZB\u* |KF)l Ֆ6v8 O{xb HOa Q 0PV` 8kuWyIW`2Jц $XT U1asIl#c2@!\ kŃ  %t%xuMz- P pQP ݀@=z50ZP{w(p5@{[P Ĥ@^b*Ml-13.Ε춿ҭ\1UT^;ȠvP v0|6 5 3 w0 g٦@Tq.`ok 07+n P ՐR azU[-]8Q _Th Y". 2aFdN?-]&SN=} 8 ETRM>ƍ2A3BV]~VX[mZmz%!j2śwXN_!+T #&S/6 EK=v,n# y25BkY0ugжw9aukxm$;BIhM1*J3sM1e0a5-!|AȓO|U۵JUW]@f@@&kAti2V B 1_leD}QQ<0D_1FgQ 3^@/$brH#d*C$ _J+¬~ҥ9dp 2~džJ}J`e%) ,.!iĂJ('NcFAC/ f xI xLcSEeq2Xath%!`>VhE]EsTI!Uh*UT "Ul!4r2[s|KD(#\q%r0Ar]v˅7^y[ 6prpCp_t v߀Wa-`68an}!bݐaU0dOF9eWfeK%^G_/0q_. =x᠁n_ܠR[.0~Q &|̀>bZҥD`%$\@*P8EdVf 3tpd\gNi\ $z)>cFi[InZ_kVءsfPQ+Xe.hvر#+T w+nkuI@{'?qg}߇?~秿yW\]U%_9?u 0\ÄbAuQ1 t @%`b{Cu%˸JXBr* /ZRJQ@q 1 #т%J}SV=,fO WK_T{_ _I|E8GOuT2 QsDCtUbtd=JXG2Rq Hho=!TJV2(ate,e9KZҖeKڸc"JP2ӢsZZ'c&FQZҚf6Mnv3g89Nr0cܚ(L"@029lcZ'./}b@7JCGBC $ԡXhC Q&2/":QJ(H9:ҍ 3@H~t`))UE+ӥ)Lc P/NRb9M)Q{JE7uj[=tBa0`Rcr0EgL U@k(xjᄞ&(Ϯwk^pl`;ؘ!%[Da[dgOEŠәتl~J%۽lpִ̖E*N KM;V np{ZtÌ/q-!6le ]HhI+u].l1nL9)hul{!%ȭnq }W׿ a_SLZ˚(/%X5wժ U^e5\Gdس/M5_kH6-ekLvج[)d ]/K*w0Astb'8%ꭶ2s,/yFsi+tx|ecg3W_Lx۬;R*o=iJtrZبyV4鲆p]@W-LVF&Vv3YTZֲѪ?Gih:g=6֢5ifX¤}t`GSf3h,G6w V-=Uu떷 D+ ɻZ.EBeppYWMI\&72um x %ݾaP;e 8?->s۲Ήm p`R:5t\G$ʽ-j 5 z@`6Ϋ7_/5k! a>=u\ *+ a̩=rnG|yRgo # g_s+^pY|AJ2E,GUbNdkgv)yުLa1yW_Ju!"] ׅ 7 ܘ?yߍ{|~v }ߨʌDpG%e;,.4S4tB,s+/0,_t .1a*\ 7Q%׫2}ұW2"{\shA$gAA A*r6"d6#5$/[.=˞4Ng%!46,d'g5ut k mlnԉ{iӴJE2\3#åRGc3oEĹkt`'ѽBUJTz<+%B-|ѣt_yPyxHHH|HȌ\9Ѳ1;23I\Il1El\%|?- (IL*\)I2J ǜ+ Tnl0_ǨJ>?qRF7 MJ ܟ::8RT˯LT˷KK Q0˽˽$KK KL̾tDŽȔLTɴˌL ˶˹";$M,@50(8ot٤ڴMܴ5$4D|dtNIM8j36 D4 DTdt|{%5EUeD4bT4ǩ P#Sư4?XQ+@_ ȨE_ȨQɨ}!-Q$RQuQ%R)M%R+QeQG8QG+R0UQ/u-10/ S/2uR EQŐRR%>R8TBS+@]BMFUTGITI5MS.7%S NS3E-TS U8S4'"S;}TFMT&JTaSUS4UU/-U5MU7}U!=UuSS-VTQe^}_2M=SdE 8Q  buLq>yqvWwE$W!pyxWtхxturh %qi2H؄i؇ -qrQ{؍؎Xّؐ%ْ"  X~)XM٘=؆mYu٘Xt)Y؀W1Z%"يeX}YuٕeZXZ}]ZuًZڗmYZX' R&R\e[۷eۺ [۹[M-ܪ][m5 Džȕm\+\.[mѵE\B]&sI.|7iFGA#',;Hd8!̬5]m͚\ۖAɁ*uY]->B7J3",_IW%/4@% 2^/r;_ *`59C+VJX$>+]J`٥''% 6 8Jحu ^0 B2͖a7 .53TaHv'8&`"n #a+F B/6b+b34Fa">`-cCŽ3`._wbU\0``^Ccyc,Iu%Nd _V [c.3a f_Zdd킥J``YZ[\v襫]`f`L ?/Ou+ޠ 5JK9EaKe_`Jj&^dD{wxyz{&pbp{&hFbH޴mb>5rV^gz*UI6I*v( +h0g6gK%F&si.7d[64*.荎SN+HБveLVlv,jA=_UFf9F򒸷a8hfd2bholgLq4j6fd\fkQkkfl7,:c<].A6 6'v&~XrBHUj%R @ꁃ𽄦~4(0bFmڮk^jI@D A@LPPnԦ/8FRk8D,n.F _l|,?pz:df v{``bpoǯ iȄZ#: #~v8^fk ,  8@ k=Gr7D(L{ *`@{Xr7rC# ߺ]/-Xw&w=D@iH/Krxtq0VR*n^ysf(cZbmVy %B/Ȅ`pn`omAo*rNτ'yzv8(i`x*o'{ lvȗtۖrk ?/LHhӞ^y00JUs}돣 VW?l*SVwS{ht/bo_~@Am >{Hؗnث `z",hp "\C !R\81E+J ٖ!6> ( wfE'iZkBMȘLvWax UFZ8v5\N 1XOW =#A 9$E2HZ/"X$QJ~&%K fe vG/tu`&5eZI.#?y'}ˏ'C~ :(pY7rsz)L20Àz*`ꫮ:+z+1J+_Cjk& k:,Ѿ⨖ )F;.{ .+;/YeK% [V[%0tH/[F(kz0f#K-5+ .VI35sm"q3Dn1 %/6+Ahj"@) w|މ-N]f.wv:*xq*=17m0LmX߀כ7pM*~89ZO^9g"tŘ{9衋> "Ї*^*쮯:A^봯겫^K =~|^|'?9n| ʃdw;$@͎tm糠AG>pK [ Pa@fP ˇB 1TR:`sD(FP|ELqT)v/1iTc/QuH-1}(,юY$GCrZ"9EP<`$ + IMc9Y.R2cb)7 TBR[KY>r*=^id%OiHaD.(IS&|+_)M0ҍf'K86 %HO9u|'<'G=` sHYz`>JE* OGL%SA(F)4E<Ђԣ0<9 sγmі~tK Pr5'IzӍ5thLυuQS!M5Au[EWaanf+Xճ]`εv[׽upj]׾uk`Uim,dV;a/ٮn5+gj v6^Q׶^Vlk=ٳ%mjc ۶ Y1׬-. HϞUfrZf}YX.^5.Z ǂu qZV*_jyAK5jX+֮i%+X\ךw5/lZ7_3ngkar75nX/,\ 7\Ax.~1cbWи61sL1,d 6򏇬d%'y<>@ e'S?2u\cC^\"x^~2UXu"4G3 C` ];i ؃ L%(8h.l_ ֦ĜQmJMko[ٷ7m`=Ba}Gc0!8qEnZoimS֏.IZ? x;~\W79'qZx)xF>\/m|&;jhdf-2.9/docs/hdfview/UsersGuide/images/module_select_imageview.gif0000755000175000017500000007517512050301073026452 0ustar sylvestresylvestreGIF89aI3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,I'*4ÂFdŠ/Z`ǏC)$ɓ&SrqGYFI3L5or͞?d T@BU*E ʧG :JPV^uWZ3F ^Œ56زgʍK.ٱ^uU~lUոE/c!CZhZl6Ϟ9pϧ3 ̮QƑ۶s/mb8ǎ XI|ys 6/b̭cO#oXd:֘KhcH2>R~b:H3EXO E^h'bǦ pyܺؼ$T%Mjp8[刍,s֦E)FS"_HEO@' pW)'2#jTXeE*d\rLiFOyj!6BlIDk ،S 0d`;1TzB!zT 䥫-ϘHC1ZmM,VIy6C*3{OJuF!!yAQYի$9-KZZ^Y2n$[CAk2AURvA #%v)s HrI׀'Z%(]JHrc$m*kE[ݩ-)HTYC_^=e)aQQFOZIN41,C,8>؁M$ eTf ఏEA!P!Qhc7V!A!.LtPJfVQ 2znӢiIɿwt'B7^ʨ('kplt n8ePT)!9F;{ٖbe!`,4pU/ jNJVLq/&w- (mc@!.ꪓc ko)@VqWĻ56/_؄2*r%:CѨ&o`D1d.D> #,8k%+24 9ùs31 bTVɠs P(uNt+h;󹲐~27YJ1Lg;oҚVt;g;k͌2$֙Ҏ&9j@x2:Mi%빲浮 7zK4+R+CԱ3U]F'ټNU]'MC\^ BXi!EhֱMn&<ŭN1[{HeAagcB@T\}k!r艜ֱ+d*UUMkZ ofCWޢȝw<_Y 2UoԽBˮcC[Ѐ`aCbC+6cH'Q"YrĒ dF%1IyV_("53yLO5+ Lq:YUŭRT-fQ(,P(&;DK_2y}ps蓼z?P}s9?HQG}e6>ǷcIKl Tl#j<7n5wZ"po1=UN 1@^f39I-k|p 1 yn1aM ,"n 0P/I!~)&W]D847AD2s\uED2WI={491CB7x<4wsT|HQs)S=<[_a5 rpl^W-1jЁGB.r#QGNB]TGi"p t>d;8b^bHW29*[C/18wJ)BK~;->]%0&KBC#'b"%TIu"DL:'6<~>E!EY^K8v]DwLVKZ耼x-6rYE&;%.Yc3"Qb%~D"VG$*\TJPD-`u=ڂCeRc/z{7SIHQ<=7jXe]!l8~8->Ua%}=cQ4c!}1pbx*a>c#7B0bLU5T.ŋrEHLbbЄVCւU(Nc?G'hURC~;#U7TBgX@\+[y,gtbb+e{W%..n/4Q!Mʗ4 5MsF50)hJt7=RQHqv67eC˸p"Rе~_?jgHc:4&ƓJ:LSQVS0v*BKQ~e|ٓt4H7p$yg`UlO3KT&6"C%vؓ|bVw+\ cZX t#vB.xvȖ*EGj~U7v, VgW,'s;̘DqL䅍b/N#aOmW8Ǟ“*t+ULTt"xIT%2C;á)d\6FfaQCORbKU$^.mʃNor5pէG闣3#]B+ p6 @ @ ʀF Ŧ g𥁖 [ʥPbʦ\ fxɠ sZ\JbڥWgdzjZ`J^ڦ]hZ[|m skrz*Plgkfzb*Z6:hgi rj]zzxʪ`t{Z}:ܚ  r P Bs%1`y9 "%I" Ⲯ9Ɛ,1].grkbB"5J%D\$&b"6:2dBO+w֢;r+@כ;Fc+ ='hh*٢/R!sDwXCk;"ʢb$r4!T0EgiA0||~<SHs4BLD+LI'8,3^Ԑ4x$AQ*Y "!劁%[9{>SsEBGb ssb9.w"'$8h-3#LՐ T74⇠gÕ; (1)DW:~YBo5)CsudDJ#<}OTa M#S]z%^D-lCH90:M[=q/C /~Ny55H 'T|7y[DӇE;ںsfLUmD0Îg)⋂S?#e+4B_y0 !`ȢiipN8T}Y=y`R(UxُR#0܅_CQ D*< ˏyfD.A)lCL)5ރ.}T&u:WaM ,m7EtӔ7'URe:Wptl-]yDGpsSZD'O\&L-UQA-0-\Da.1Cy)"GW "8 U1;)hSBW~ڄQqxOZ P$cQl÷sWr{/\]7D0 ]2 rh " ԓ  L7Y5D:we j.A H=7i.S 3 @hu4$G&i<2?L٭+ 6t&NsᣊܓP B ? fB>!IK  z" n1*h%9 WQ Aւɫ/38EYːU`RGNnF?euqbuJ'{-{d96#4B̈́d'Sa\ipUB=V!@!T"gt#t\Dm'WM[GF5FGQ|(*WBڈy M ;/YcR qM^_9nY1^5Yw0]_sc,c()gBBT߳ 8]޻4  PeJ `ԶNoA i.Bg?S _`;"LKc/0:GYl&ɂ3z N,6Q P1Y=4z.ete tg\AlbXEeڷp%lH,s׾F8ΠC=*'#I%pbDi@/~q`&5GLV#hz(z #e4Yf(0wz$^r?M* ?4&VNJfIh'I0X(28-ȣN>2 4ɚb鰎di3 M;HBLh%#"*3٤j424&ZlP6m^o)-#j/hu eo҉SI"}V(Jˇ ״c1W+#S NϞdȰNLTPL4'JrF)"ToLHy'7L̓ZHmíBH1iTk55IUG~wkL􉭁җFc#q+VԲl}b5ƖՖaȄ֥ o[E =' khH,R>tihn(B U~Zպ"6S#4o#ݿ`4$??;&ˌ5UEyݛ!OZ"M&S%OϏQ??ےTo\>tg37k<%3UM_Ssvu#'7ӽv>b)6"i+x0m^2|uU7i.Xz"sh@?%|ϱL:mr964H$Fr*q)S$FUe.2rXs}u~ꔖVg\Bݚ*))-\jeMf#;|AkE3`ҶnU0qPW<M1_|ZVgk:̘9HY.n*SeTǣ}$tlDi+rEk_~;a],ނh0v VV6-lsqwkd Sd`]H.I sӸIj,Bu3JZLuҲ+yHƻ)[!K&I]; rˤ2[sY!Ɉ5XۊHVi/*1yhM1sK=sGe>C'J#>RkD&D%LdԝenqHr]ݼ:Rڪ\Fi~'AdJǶ;pg19S>ա-M7w&3RsjXq}S1m;[* igm "G $qmY'G {4F9w|`Ht;"GA/Qw!reU 8$c1imjz;4˻5Zc:+>phi#D8Frmj^WMu'w^'l Ds*{{Âi! fv٬>&CDysݪ Jq rq-uaWKWWwp&(İiU`Etɬ-Z&0hٴ[uL'%L/p}M2A8Ck+?T5+kZ5ӟsa0Ih{#uUĶ~U(iem(#[Q;/1?ve\U}Amc"(Q~jQkeī^-iHW:ҏ5=/L׋^47=I?ҙ4MMR{ՒQkMzղf580^:&2RX$5| C MHݒĚ(-YƛRmj {6pof2Mu{Vv=x׸۾7m{ߠѝmvv^pp{;)MtLj%khYyRJ i *Fyr2fm >{W[p &AM!n~)ô3#[5iK\ vY88 _*;K9w`Gy+9[\L'V1TΧJ)Ғa! (jSCY4m "X#:Az3[!wI ,)01 {ќBxa," qR%B<(dғh 4 A dÚ.2cd@fZ'⩔;cڡc.d!3ds}!d $b(a_9'Pv`OZ8v8 ">8)"I90zyz+yb6$ єUZAec6Pi1;qMP7a/qQB<,=8!S 1% Lpњ.01]Q ^0_"ի"K%a),1#,Â{, tZSq,zPjDûݑDZq",ԙH<c9;:ABJ Ǣi(᠇H`Ƭؠh@y`PHg 㠇rdh`tG~x7H~{k (m[.m,Q q7H$P  ܔMDHt cH|,eT>i/x I<:Nbi;Ύ3H⬉>P0͐Ύ# $Pnj`}ISXhsEyhpP8`} ^8e3BHʕFH|d儓>97~ODOޜʆ& N!ȳJ)H4&K -$F38kCҁ@ƒ Rчg .D a]0`QzShXLt&|IpO I "bR|IضMX@(L}{S d؂@ e(G@ԘF1 T%}2FRNhzRZ`ыKh#"6}%ehY~L/PMЎ $QR*ďkJ뮨:M3Tij,QH ЁXz舆]G5XvI\] #8pv ؇`(Ʊ;bE]~dZ|QՎ|SHUN4X\ޕ%i S߅]\b@VѺ1RJ;ZGܕKhf="35tI.i $d } (! X4` X>& \┸~/@\0݇D] IօQ: Gis V& nY6 Չ1lԚc(7]Y t3]- 7G46Y%SerIeDÜ(Lm4YeADlUړy?IJR1Aћ?21"@؇@J8( y䙿eF2dPXB Rx6$CAġQkqE,aDZ2f f q{×QqLq9-0*@Zo:CBk !{G 3 c"j.A-AD۫\!m-ˆ"aH+<󎰅dE<\&š1k ta BDp r j9kƼ:\2~onq`D7Cj jzTA 䔁aԧ|%:+;:dJ񬊻b.e1UxE:jGCrHIRugԢ((djzDzfޚ«Q})ZT=HiR% B(/KL\f &+-Z8tŮN64*GͰurrO)_-s5&sbp7-W*Y'Os*WcMXr*)w7k6}lksH,,'_s@2W>'6rPY~+Zݏ2q $GcqF}pDOS5I!yX7дYP zyI^]u{5aV bw!h'vxuiwauH;vUMu_ju^vZwNx5_s]AGWa Mw}{zd`sM d 'xyt|{w|xbwgs6'g{O{?y{xywywy7zGtxw/>v OrX?ir$V2.s8'8I¢ / 2Ic9|O*I |˯|c|'QGʿo,ϿG&(*ۑJ B6҉ =%ԡ`Eї2R_j@P"h)k(Q@}0J<8PG5RXOc4}KzX$̅T6pB4<9cEw~ II_V[Ԣ %52:ʜh,c>d!PP[Y0~zR yP[ȒȆ_`gl 9T X“7"]۾c 1 N16!(+H;d r0a8DȢqK%j|OMDPejKM3q@*< ]BvSu;%c p`.r FF#æMSHYg 3JFD* I8sFKr%[ ) q=pX Frp vam1X :>:q@;bhQ.%m Bpc'nGjX`r b-0><ߛ kqb-m׃A79d,g0 2~TS o5y['.g(̺pOucE|70UN+# x3d B4dFwBeV(=[>SW=G>s<;[>Fw*~?} 0/oI{cO201 rXUT/R3iU eزFш۱#ɃX8"iX`b\<\YY)`&$ȡD>DB._-(X؄ɀF_h\DHU ]IT͓tOuSؔRbȇ?AfTDHCNC %>!EHE2>|a(@=\Y"3NdP}ԃ0AyBdVQ X\RlB>YU2\؉w 1ՙ,G=Nԥ} aV yVLODe,OqP=FԼuDLYK|^=d^qj&샿B=2XL(qA>T.A7B\AYD;4Z˱@A=x#ErEŸ lR?}Oh\4S+zHc P!EN?%>$,20F4PDF4LaIZ=) ; αBaAaAqA `@ *T"p=@% X՚.Cric4l S:匑cLeX)e=SX[$GYuA$HmHRPWѥR[DPesCX.CA$L>W]}<Ƥff nyRŖNESYYe!HDO\DT'ab g!_l-{"ifH'ckK>D$ܔfDAP!b͹K@}X>Q,B s%R<Uf p`<&*OF !mZfT[+N6h%ڸ C#%i^CfV`2HFvWt`!+qYQfQ({mh{yby]8]v6qWhПvP6$OQ#~4Pi^IE%n$RQbr!p(Erx c} a^tQSaH@!ۓyFsqV 6%SQ >}PD1A~kj¤R 5cpϟ2O /i8>m$V3 +Q}xmSѓu dlRo^~}M $JIj!_*&E0۔,*N.L\\KSI+YBFV5fٰffRgV$gB{͠a]Lx=&25 %94Ufu=$'KVQ&0ɸr,/J]Y(K!YIC"(2l٨2,ڀB18NnM64.( 4IR 1 .6Rn 솂8:2ۘ..ܤnĮNN.]yYFM(p!lSmFpL  / ɘ ȸ & 7p L;<Sp/01!C0;E޾F ̊ӺU!1VRVi&!<NgU21tbKO~LSOEB=qXyD?j]CiDa^&cg*k|2VYXGLaaԌHNL'h92"QYr]nl>n|4Yj q"r&e2%_^Tmllktpar* Rd'ŊEXNfu xBER ySp})ީBi-)jPe,!H< y\]mI豘T8" u8DQP=_ ~Xdl=mcrjJ*_xX|%XM]g!9-l33MKOGE,Ԉ  !Ͻܖ:ae%{+&J;]GGpXŠVpOkLE{anȬY.:퉆mF-} qؑBFpǂ$UFhNI]Q~vHBDL hvgivji6hkl6mw0vn;p6ok+UBD3JTh@UVpbMtwNHwMxwzmNxkNڦmh܌7pڎN{/Nߌ+7w@֍VD0<5sbf%/gJIwf aNsVHiU6{xe\Y.%,H]։Yq2rх¢c%f_ll>%$`(?M>Q-dzoiǎ7KX dg J5Ihs OG\qmeM'hmOu`VM 2ǔynxX_`E7JDlQAD9BH-wŌg~$:ZᓅB=l}O`OxT~5U:GbG>y|R^}YI-d՝)X8.[_͕&h<T>iwtE1_O^hV+,r}L4n@5պpSSYmՔAxU,V(ǟi]'bwzn"zeh[@oyhIʣȁaFrhE0{a]PWhQH<*sQG ,ҫiV0MN+8ё+I3/Nqa489AzJRd2yp =8d, ) e'v> S+Z8g '#e+&:vrL,P)q\+-q|/xT(b!2(+2HXeY}H"-8pDCPSXԃeLb|z#1bW Sa&"5TGKepVB O0eZmão'Kk "}xY3=S;4MA20Lj|?:nQF$Y2wxD.LZ%s:A"yDxx L=4Э1jc[N40FdC[[SHA  $>Ck2Qx 9q`P?': hLIHK0aWiErc+b"x7Qo=QGEl4aNx!a@k1 4ٲH.Npu+B~˽H I0@>i CmASS=Dh@UcB!ԭnFjZ{e#P TC< H1& ,u>k:;4E\E -xQLFXF9s`0ͬVb2(N&ЭDB M=8zPj&D0}81)P䄐"ry05YBJ(." SĕSTXe0dx0hFbڼ.9!WߣIUAxtcCO4&;Xc Gr30Y=#D ;wxӪ'[ִ v*%XW8O aBN+f˯g;4faq ?\PQeK)2.8(^RF=߽+"]$Be dKO)r[ȂAtw.syc*K`7HԗD"8œ;M k\:] Z@Jv \RKERHX%]="N9R}Ua *aW$eƭS`L#T1pCbȺڛv= F"9sRE΄,qޣŞҸ: G)| n8o2õ8˅ < S1?fΨ8~qJ9f?xm#-$%I}~PpiKydҜ^1( Ԣ&vd24p%m.|sȕAK'XF:'U],S*>\Mm++Mu ;5cQ3Kfuبɝ1,92FY]Z{D%uL 4˸YFjmB%O~gˋ歸It`{{\-6/J א q8= ԓKq>^%w3ʜ13!Q\}M<쒊pF]`_.%a| I?r\.e-t=R N^ ]v w?ø@rjw}߹/x9HuBwO4&tWN0y.iyҨ-zٺ˻ܧħ17s;qJc%.S"tC~d0JAP)@2DOGIZ"1&$>b+ɘ‚ mAt@A0a;!At2?OpoOBW7Pe335!A4EG VU0 ?7A AD0 Q I yP pP0Gp0S7oL '~,8o܀Nb*Iξ͸M"^$ (q*3! & 45=/1 8EEUG- TW=7c11ug1g1 2oao1sq1iq;Q)1sUJp0Jp!aQ25a1> QqA4 rQͱ!!!2"%r")"-"12#5r#9#=#AR!4k$/N<ޢF% 4rRv'u''K'p' (y2 R'(2 )*R*'R+)+{'R('r',+*ے'+1,r,q)R+r''`aeTl۴[)JnХ!.K 0 3/q-2.+3374241(3.26M6US33U35Q37]3*+s2(R/R'3i9m93r77,(3 `0Lh ysI P 'r+S43;6..r:r>Œ>3R8W>>-.7TAs, ,S@8t/*8p"v.V ת,gKDs.@AT6Y7s*9As8R-+8(r-3@uIR48t84G62ICI(9tK20xt7dJ"GX GT).uHC3MTKRM{2CqsP:#U,'IǴHHTLR?JT@95J5LQ}sT10bֆ.0Xl-Tf*,2otJSJ2(0 G2 @B2 ? 4)3HGwY-)U XS3Y93p`\T)CrSuB16 P3CqV7 ,Omx*)@T0Z)3! `cB2K9;r37J0`Hre=?<@fmHT]]sXǔ"|r54Ke3eR?_H;ZARGuM7M)pdD 3Ȣ\.]npYc]V34wxrPhdOYZ3 Z)'3A XY75'drGv\ EcY 2@^dQ 2Wh#w#A@uFV'W(]vdv}w\Uc (õsMm(B}bFVKjlx$+{K{X31ׄP 7'7VGV@6Rmgׂ62ps (xq42'fusoր> y}9S'd}ג59nqיG`e|IRLJJ'4,9"PGݚy',:h$f.]Lbpr%ؘUzWZւ؄UeW8qqX6'A:r8\-Ws!v/X's'cXqT ׏iz@oYsweb4gݲ'Q>z`Fb0pUC1aűm9'J'G~w.Ys62A wo5qCZ^;&C696 |ճ96<y2Ġhx!~xmeMq(5#5PT@SSA!0L)O 0d.kiJj"(V^or~C c 9gu}vC'uq9׃nrX"rcd䳊Y`9'73r_Wבv1XvOL^A4sT;S36/VHbbh䒮Ɍƫfg=4wL>K/TyAoL25sir{XiYˁ/fSW\xUu+K? &$B^kڢ-ń,bm\JTG:|+Ǽx!T8=4i@J5b 5mMIijgMBU_Kr7Ug@K\/恒l0w2"OnH=('&L%uzDCpQ49QQi99|XO3)}TUR6!4 ZTɴAѝjS0BJƝiJ BLjj: %o%?KK#R}KKy61=8׼TKĵXW7Z(5ciV1B10bh>F6pk7X0e@p`tRȆMcԅKHe\^>0D&DQ2%[BHPRH+FQ"\^_ ̅VY_޽@\k+b'^ k=;)`eJRzu? gVb>2#¤(n|)iK>L`oɠK ,0NːOLh"d,7:졟 V$Bn NI0g廉Apf+jb_=h+o}1Cz@ph FzBA#3.q9ھhA؁-Yh4Y'Tg4z3(qgzV]8PL .up꾮.5ŘZ}Hjǧ;b%xEw>l[{n_w} Sl۫ٝY-;LpZ2BoÎN- []Lq˪ڢY j. =s( 3S>Ey=qДmr4Hת฼K̊3YR}]bܯ+}&uՖXW uV]vyʹ~ 6S^UC54a~SY}eWh `eY-D(p1c%[I'KE 2,Id("?pJ=DTXC%D%ԋfY9vCW"fq.D)"y>\ tWU[]ء-5(b樋6Ƣc[-bh߉fʦOm*aca6QE+AeaCzZ*ee[-*>V|'Y"fݚ^-QMC(?њj&*n$2 A7 eԚh!3F22]0w3*`v_C$_gS bNxZςFAN4p-F\VHZ*rMhüW3i2OgigP[WNvg>Kl@g6fֈ)cXf̨[g7Ds3Y 2aU8F+H)Sc\o=H&%饔hէ)Zfxb<9-k.phɅEҝ'^ >Hp,1 Fr`>ɳS>.׌}xSAՙ$#I TFƘX28)o> #J4ha}B O8`Qrg $+bpd$9"p6'K@ʖ豈9GzD"nxR~}`1% B^ >xHa/jyHV=2ۆ0pPD@v sT ԫL@v}Do,<Öh^B19PPli >%)*Cq6bV>S0M.TI7⫘#QJTXIو#Kԇ2,5ŋqS)jZZS"ghrP"Øq%?LCᢣ9OeKxS'̽#RObb+nq'@`@<2=\MT2̄2%YF,x ˳ǴK2仩Lx +aR7%4r.!jQ'$SN쬬ˆdLH LR78"9a=Oڄ[#M D%C-bhd*P=odXB`੓/HHF2F(G 2`:)Q0v

    .qPw-.R# kg/GS#zQI]q;6<#r1(AI02P9Q_kyP&aiG'Mbw7uGu ÀuÀ?$V'ev'0 0u[u'1#IG.yr34~S)u6xrC*{H( D'4%qPb )7 i`@L0XJh1psǏ _9w yswei+bQ"z!ry aZ#zA !"A`Ԡ GǠvn Ti&{|G7 K(}}tw& fvo#^}ɷPb C|G57Ca@ vuwà 4I:ȃk9>y1@6#1^mz@ 1AkA.us ()izHo.;1unb.ky ﵴ|$y+J{yҮƀy720 CyKG)~1GhѠ t|e'0 H^7uٸr80 S9K}[*ȵڱ4ȧJ b.MC络+=v7.dve#gg17I* @iJ=2*7{Ӈ2 2  İ@P1`4aEYgA GgmH2qzRrt7Z~ӡ 1=2 `Wwh|:\MGw#([ ~hp#79uIG*`*8;#*0h:UiQu); Šf"P zrRǟr;I (w8֛}@VH WǃKu1x[\H`9 D xu_j 9v0>|W*JII*f2q)"EnJ㹱q(᧖)\ua`aQs  5fw˻SaÛ 84jh poh>el# G WfâC[?LGo ::LYgn#= 'lʙœE4ٷ`G 9w9<@ڭ=X)70Ji0`hk A |b Z=\ )g0<pi`w,e+98.8`>@G rsq@ `5su3ˌ@Tu_,:db;w{IO"+QO= KȣA'6kP}@AKr?fI!,LbM맢בKqt f}" 7рKɶIGwȃ̈(əa10Mwo#u>tR,:m&$Xhѭ>wWG"PN?JNy=;!C^~ >0*x( @* awʠ4 <2vOJ_xip it|\1H)}eAQ(Kܡn13X&H=*/SP{>pӳ%8ukO-ˤozۧlh ML48# [xDo #H1&ƍIh&eR-OPưIb%F5&Q&+RLb1T02ؘ֬Ʈ# \ZUư/} ^w SP¢7{haޜƞAa4}=7Aϖě@f>r]y s5qcu6be;χe )iKfCg&7T$# i49d-4G3uQ4ĸn! $% 2$ = #ފ`Zφ;L*S/+cCm RZ[q3",| ҠϷ$,Ⱥ&KHԋ L+r9碙Hk 2z'*$bp b @ PF}H 4D7~H#P4OVA-p#48ʤ4TX!I+T!>h= $`p4,9lʄzsl[rUV*ڀ͹oc3))Q j6GdmlM〬k&J}b`:-XcbK)醎# '10?8PhhI$HK#-.އa2" I T#c-bG 2XԖEsK0R.0=[لFଭ 2mkذL]m'%[Uj5u#Pܷj0JMA;4<3Ϗ"f՗[ 4e$KY?@'Ai#`H 4'a(@L0ALYJLp mA $a_Y F!t(XRKrl{iG_N# F01%>}Hи bӴh/Kp#ԫp&ж.!eF8jS&E(6D[tM0818bˆ-0 $z Pnafo(T0$Ʉ&Rq<~aP;I` fƤ2)̄%F{NpZD6s\xז|ZYV.hlrǙ%ϺA ږZԭulgWdMFJY/ՏI Uf2Rd-qݤGWfӭ:e+2T 8(B S"o(bbLQA(bT+຅Xfּ1(h&\rV@zkvuUm`h4PĔSX{ݻwp/1Kw>ů24T/} fQ*bjP6P,2C4 =؁F1p'bUC=N \+]6? h#:B}(8̳ܺwFYx,y~)Hڝ+^یG3Df6ox@g8us6)PmB7+rDouP =}YL$I-;|"2A::%ohp%XxL[B3n&PtTl n)1V|^륭e3ъubHRc,4o;Il=w.s3M{ϤX⣥xIk(x oHWJIiAT4"H#x ԫV+ΫfEWʃARxW ӻEgXVż-ʍ7;=lgM0ꕽ(#{ [k_PDJ$1&!Tu6 n0E#w|-Sd Icop&7IjڔR YF|rO=;.VqUA^Ƞc$.PA( a3 K+.r=bdi jI3;\A0;kۛgI.Dp<A3:.'jI` /J/IDNq`/LDMDPDJ:"S 7Ej}x*HE8817ఐ48؏H`#e0DQ"4` *<'bs"0䃒g+R2K \ ӓ0>ه\ CئPIPl P0DuËb ?b:LtфpS e4K18h)LBXh Ơ"T9b0pٕX p Q9DQ(oʋ䓛p ~$1+ 0@ڷCLBB(fA+ \=*Ye0ş ( Z  l ]&\ሞڈ8`2ے-4RLXɜ M*; ;؇S0#ȁB%40bK@;q`%+ف:B:,x6)190rs**dі{ 7"4 B,>un6RP }9'vR7FK oTJɊ؉ͼ7$˜4֢Mj[)xM.>胜 [ ]Q <^A&Э?#&r#}p6a:ʢ@·Խ;#,"PHٰ.zQ~ bx]U ,X]xB0?M@S؉;;S{ 8 J9-#P&ȝеt J$塤0OI?9I8sQ(Q{k!,7:8`V)KeJR臢_3=i8IL?2?z 7gwJ#L/0,`;3 #T1rUh#PFHdA B08I+fBDq 1I=J3w(CDd4(J,&ePO8IY`bL}YSng[ih)ugTm{Zxf'bj 8lSf(UhDz` ֞aI0>&p*yQj5e㱹-ko}nztnT1ykIXa'y"go,g.kl-&KmBk1ڵϽ&rk hSfh ӪkF,pªXN]vfc9%|HA*H̎F|l#E8@Q3 LKK(-b`Hҽô[sC3x$@mAI4D)g&?TIR)ӐHY 2D/G7^ɅuYrQ5JREc!գFoW}j.g秩EK+{UQ!V {J~j_;\V:ojU>&Uk)XC V noٺhnVݯkUFko|jUp'l`͑N\/D9B: '/̷2Sg]rbs8p˘A$+FD6rь S3pi6"C*;!#x"kK\d+i\6 ?2Pn*24IJ( A` d$Ҙ%4Xp.? `Zֲ(aPjZu:ʼ_qչЫXJqWCMFg\I55 Z8sjcFfcydf/{IS2IpY|2є\\Rcފߢ&1(]NO&0B0x_Wᯠ+^!=%C kZ 8 Dc 25l4`dAu# (. *X0݄cUH$$7 )!rW92eK`-k;Hg#IjJ7椒㜀[:v?51|ruZ򈛽[Pz4G{Q!\1d"2TqwT7 PPX@@P = db ǀ hHr*aj 3#@p$. Eʠ;xD 2 SdFcPr$Iu\8"8cvzinuO$){R>f(r:f(ȆI$te1fݵ:sE;pr;#*TH&JKTYLhk>&m[@c}$.Bjyw$Xo"d|=NWu@gn{y[@MGd\SA+hbV\'zH;n35 >7`Mq&$H P91qqPq 5$pxp ' * C9 /? b;ET?t0ts 5F F` T T c>o3@31 `0c2b>U pc3tL P$cA E 8pNF7# rQcuQI~#zڳ0_wHwlffwsVX|7ƌead' d'#)Qo@w=.;;1e.UO5o.2[̄)S]@SNk%ۗyAXwOdv e;d'Y#,A#*薣4@#9f.mZDc9Ae;INw9PAV\4\ w.[5VZH;g-Nr~WJT@^J?PՍ]8ne7Bk;F ;KvQ ت k ˺׺V"a3 C0n43`G Q#AQFT H&PI`P˒)1ŀ$%QVXv)$VC,*LřgfH56X- Xhѿ_[$?w7X#(J6hij<ʤ&4z8Jf<4\GÔiKn>o'1Qj@ZϷ/,:Zk^r~w| 5}kNghO' X?~ |l(1,>mKJu9.[vv:9~Jb0 UeUVBD 8%bp!pȶ\ ` S` ugslLLRI;/uw\ ,:fhxr>n,!HA9*!obK1zfo#c?u;[TرHt%]kVcр,',|I7Vֵ@j˖3XTvI0O숶8Ke19h R^a52]nʠn\%e-eh@[p!7SBtNtrmSC׻ , S0 [2G3 ʟ@X @s $y @ 06ƒb c),cC 0H"dQKAiK7=><\|s] Σm99b$Ėx~B\/A|S<~1v֣&°A9h;Z N|'bOTӶJ{vmԓyKl|Yj4nD/M]tYYwMlxX?/=p(hlRq;=v#Đ @>$ɰ0 LNPPR. 0"/6E55خ 7&FGFcn$QUSWFd%A!p0e|V%joig~m6{w+O>øgO{^Յ0ڌm)5wwLݜHyWgK뭊Q;Ln╇~V)n;yzTAI[7(kHkƾX[Ҵ 0h@@4|nv}k}jIXjwgxVz'1p01~?1q ʱZ*1@0PZ/Z[01!o&_0K_뿽Zմ+1 ȯ5s+B飕4 3ng[j#.JjNlf;ˈb<Лmѥ0X< ˂\R528aQϱZbhc&HAPJ>0F4<|qeady7[|qE7s@ PBmhJp&uL馋,*:e%/SI4p@l ؽ0HNzk43pB"t`.M72ew(fO:ɩ;BHU /cP/"+n:1lV=1d]kEv3e7<)v܋))bW6pݶʀ [K>^N zI<+2 6Im&s..vyϹ,ũ/ l2YhVvY^ԠdEZ !( G!z(Cj!Zhh+Zt6 F?DZ =ih(|&Yɉp׮t/ljgckXܔcY%b ]o\8(MTȿ}E+#_yQAƙ| f-ܐk i\֢:X1@_(cH,1 t˯4n:h8am]B +eC;\Nr׾Ť =^mLu#'sD8Rz:Jo8ü4})4$%~*Uw{v'b%2qg.R ԐdCL6a 3D&LZH4FH$$E'JKRB$ haA6mb<'s:9tR(Xv(I9T?:OIͩX0>nL\+Isk3JV[ɖ!|J:^jQ Qv+#Ƒ0sȴ؝WZ7&p )ґ>y>o 9tYD\{|d) Ȧdj>A] 5 ~s`ODfM̅%$k(/b^Bfن(DQa"4To@̍nu nNKe 3[Nu[G- WU(ŏyTkZH뚌 nI 'I+äLPW0OVWZBY62qYh5+\qt\fP=mfj]j m Gc*Nw)z%_v\'77b`v5.QuWXsӰ nAPO0r.DZM(ZCԃAr& -GcxhDEv&.eJx)!e,I2Ւd#j,O#gSV0CQ^ҷ3ѩۻG LNs$ҿhEzk^j2(2#ov50cQ 4_!9Cj$WLΣ; &Ů\A)R鸵qxcbKSKOBV^D{3cO5R8뺌?+$9z>(rBT2fDYSvIP :胶ċ wfX?xfo57"KzDc4y/<,O3^Zr6a$%HQdŦMmBR{\Ju{ _G|7KѴo\}|M>lwv53kM&{"eihP&/$q;,@q!A@3 ?Ԅd tOp!?@>K#AT"@+A[>c=S>+"|Bݻ>%\s*+@$1ے;k=i?ūƓ֣;|:95Q48A$DCb}؂d{ TdfUVfbee(= UYPYudnRPYFcSd?UdffeV[WV]Vff>`[vfDf[ged(吭efWm6UDkftfnm3gof{}eTU4yeW.hSpfge恮gp6h`>gkVd`VXndf%ev[gvV5ⓖP\YMi5UYcgDy˙1(L-hJQ^dZR.^}(e%```݅1\Nc]JP]h=deVLk.ΫdƖ|^USF ľ﵅jԅ7e`mmnQ= Y ޮ`ݶnؾUmta~qVor &P%/ʓW r1(^6.oa9qLorm%f[ʊ bhEYQ%nDuYW}[]%$} }Ny&Lihe 5[_^Tԧ(J~RއEQ_OUSo^ݫ>rU?hdڨ~klVhFnvgXFc^aM,nvdfO=V ečyiyDve+'xg-hkfg`hlFOWnwfO^h.gg>rb]g4f| Vy腦fguMfV[.TvZiuOhyox~gvFpVz|Vy~MdwOhv[v[xtvi2gq&>?o祟\L?-V0f^Ii.`c3㾞^5"㮶c+Ү8tWqǿ͟de}/bR>5|R>^;"gёNѫ:mqC%b~7؅Vd{-`0zr(MLtn7bi Qq%=lݾA_Je*w8lۏb~m@nsm}&Ph*,8aÄHD]x ƃ ^(HW/}:YK/7|s'Ή5 ܧl_Ko|ySR,at)5ȅ <C4h&MJ,HdT%Z2.n!#ŦRԷH]:֎-#L}"N%2;D4faGYa]1 F&潥k7ra}[$ݾڰe+GFj羟Ǒ2{1+ɾ/ %s3Ͼ7/.^^yrňB䣉O<'rM_z~y`U!Du61GU$rST}gK`q rbq1!M2zW_~7fx#xk W|w5]]]gQGK%uE3d 1PʤFYoL UQAŵYB/]Y't=)F!Б ǧ"%S؝A|z֙g$ueXW5hCEbi|ItB>pW~ܩ= 5g)CQV I[Se{5IPf^#IZC%++Dn kJAB+)JEn@vJVI^ p ˛p EdQG*AxtTy%;rUJ4B35$p{[D3)r}^9 iupp@ 1д}g4g=N7m@]ku rw zҕ^]P;9}{HLSY  d}1e\eupQJ'_gߢ_B2R٨{ zŞV 8 襸҆;Nb wks"ڦbӾq7^Exze; > jwWYGX!s9AA` yQg'B2>M FSvv봅)OItRu sF8[ RQ̞c)r$ $'"6W)|- v^u;ȋ,+w"d5$X H6dx.sE!Q˜2&Kݤ~Rt5hAϗ#ƂYJL!aK~TWI C!);IjidtgrC윬P|ʋf,m}U >w:"Jd/rXūA BZ(«NOQhHJy6QwbǩToqqb`HN!`FD*lVG ȤlLi`PR4i5IzC7'}O4T2BP}ʨ[S)t3%^~z3OL Cl=-X1ٙ I"(,k;7'fEXFU4Ad9:)JM?,Hnby%U. 8|]g8+=!* *&W*nl3R|oZʜd-֯kMJGj: ;PT*e⟢X &L7pNn7@YMDF8H:?v~f)"kD\m?㭤)B (2yByE}Ezz`dIͅJ-O *&Yqva qGC)]| g#܇4d,"WUͼWcL3z Jyk\.M(Tar+M5'H\uvrS$s 5[7C=:ef#E}AmfΝ<حJWDH핪zd=fY[79Ye>U N+ҿs7\dϨ*Z_8ϛcgL>(׉[:)j6ajv*v2v5Uv5@aP$G3X'$fx0A,1ٹoZc$v|jPo~ h _j:=%>)Xp<<Ҥu<(5mst}[y[)?Oh಍OQ7-O]yQw#ێ>3E;1+76]$yFpmf’]Bե p^+N|Iu?ws\u$%J勳= Զ{ξI3)'ұGן?M l=hV,0Z&YgRSzI),.rjrj[gϝI| mءڙIH}[N\||e ٞ!Ԣ0 ߻Ea ^yIdSi^Ta=Y՛PM7Y8 !L 6Ny"N1TD[_5b^ޥ1 ,ӕmڬՍ-m- ݙSw@uVaܷʼn ZDUIaYyu AG0iYTH eU̠0U}qӱZ)r+2bI)V6Z9>ӞPRVywuWe 8Gn1XY=ήGFŐXrc Nm 0E[ׅmF]3a=ecF?}QbsAfEٚ@GY a)YY- E6J ĕվ1X5G:_@y! ! \1PbsE4&LB&H%UVTZ%Y\VRe4PT~WReT%YZV%XbeXVŁ"jc]}͢gT*Gn$I$#Z`&@Z:ʚQbI\\R|@f.~ZafCVLŊ"BY]֗LabQ%9е8a8qcS"bcRUZ42!qeJ%"0L$NϢhXy'$( dhX|P lI&*h&>hVLB #ȜЃBJPP(d adѧjyRm]}qNNN!q2pOR^!xvbdP2ك`Id9Y1H Q;etNlbcOQ珦$苤e"+o$&'?^"~R)gL >ѷjSrdڏj霮&:f!)jhn+=rZ){:VڑFf@ZhM| )^bj27*ޖuj j%#}&d0!$%c4,%2jr՘,1ɠ)lNaLig.Hg@AH}- *i*&$hը e~J[ܾe&ܲb~m0ҥU*S1Yk.g7eĽ`f#PfmɉJBi"g5  */jxK -,UlylǮ%њh'jg 6f:j=+8}a닌ls=>jJf'~qfQP}Ph(ĮgQ^h:z.XW0eoŪNDVZX2(Fn.L[|IvkjGYB zL2>Hh?I.eCsj)Ci"E;_fnRnXQZj- 6+0-Zj^Pbeږo10Ǡ}-+z "4ا-;qCoc `0IVeqII`qvVkYc*.uEX,g&k-^񢍰FGy(plj* 4@lWš?oI prkhZCᬰQڣP0aR&\,e,b-o403اq}a޲6[nKsk 'q5[g W+Hw2nWĖ61gR;Y!3w=2"'rJ.$2Aq@wB46H.Uhbѐjҁv[) s.,Rrl3NcoY~kbZZ24hRBZ<#1wq>,^۴f-VνPƊn6|V c\覮sRﻮq' dkjqqin% <(Lg%G˚/>Vn3j+<@uprs8ev$21S"xfKExr~5u.֩/ќ-k4,4fU@02/)"Cw*\AY74B#@ oa/n+S2]A9bHk!o;3l6>e҂5o7$\3pIa#q}g/𢕕jsNRs_KUߵ{a1p`skurԨd-6=qY.sO\hjrt?t~:t6#kϳ5ne/}(k©@HC|,7om204hm#e*lPpZ# zFתzpیR[m-1I(96l^?:cc&xmbk\Iuo:BY]6zr.l878z~NG:wj?s@W;S8Et9O;Ǥ3F뚅Պ/ë аl8 72w{qۈ4m{vg27RrvGqey 7$C$\x0<(脸r$<5WtoҸK,xo9+hCڱ/{󁣢Iq{8_3 h\CyWsɶ3Kǻgt~L1"3AC=B{qoI8G;AS<߲_?3üD1#jS4 w2=7DpT*PG|y֜Rq);+0ă=>͠H<<<+\!SxSڻ3=2x=+.k#~7;>O=W=G31һ7>;>@S&@AKX/[^Æ-XBՓ("H#z\82ā-I0%K) Sė_fRH0UB MIi2eZ#}EܧPVqL%P &BE+ij³2txQ + s%=HWR!ٳռz2si%Ϫ4鲤à-[hƋ@re=om>q]o/ ƋJ}N{7G\q8Fr'n7מ(UR1G0*JDtcNe`+t%ĸfszO1Ie-9kmLιDC鰘zSWC ^5*SEza&L@ ΐ@2:RZVID.u߷-!=h34su d$dq^*o "/ k`toz^qD UYw*J UJ^^:aF|x-F:!yęY86)k P: IDu%)Z*jȊ1T-EʸL;ұ^(h"!'Pz!u]MT@tGXnM>|Q_'ԴO)(=9f 0Q.~'F/[-^/b8iփnG==M0HG.b]z|`膯^F?Et˞8N끥s?n~$!9w /o:lo/Zzo< Mx^~o@0$֯_&9B⎮^0!uF 060 fn\qFKUp ]`d"\M$| ^Dt:0rdGl g!>"I0aD7L&n{tDڂf|eԤfJ$vD9~K."I%Lpk/|Qo'  }E:Noopo*r|&}QS6k+*oqP\iˏC&[O /~NS~#nI.[+\Nj& 6ߚ2qz,K`)d' !6arD-rNK02TKfFL4.uFhDb  #,F8ON s3D)({(]ꊑ%m1 knu>0{1s@Q02&[=kOS -B*mq`%-(1kQm29qhSn*9q28^/3/)/)18I;eu1ޏr&33Ĭ4*C @ܮa|;}$7bG@xX+G,qR,ѠfT#ʬ@ D4Nk(oQ5 &5RJ?Œ-E'3H8rnB-3jEQsT5BG0't135."@-(1BTt,TgMTM/_joV*A]p01{2s!嘏Jq4KFD'OY)S-m4lp&_g:xQH1Y?kAT<[^1GE3IUY2WOuE-TI[MW `I"d$G@`@!rM5 "ܓIAblWLǬ݊$-PJEq)<i>2i\UkR>V?*m(9p`vK I2lT%Aձ|&4bzp9R(SHvWfUxOHy4(rmObñqGyYBwU])NSaQSq+.P2&+wBO`mZ35Wy)SnvLOr q48MFce`2z]o0s%9b|""AܢDCN"G7H2"s`6 J(XEcxj/5LTl5Enu(ya/_)reB%96WT*mtn+7s }3% ,Y]1bk//Sl؈?/nճsejZ_O./.' 05Z-'A>GH_rV{#>/a55n Hw/" ! BA8+M޶"L :TJR> mSuJz2$Hw4 6@c"F}Zr-HcMb$n2!s5uqRk߮opMρ50IK0F*[aUrx^sUYaE!R`uAFPwa*31$C<4\uBI=3r[ 9l#Q 8Wy3D0[A`?e!vDNZY @FVEA؎"."% g,Fz&`T&f GC h~m::z횮:T)u8Vkc5'AyՆ_X6W{^BwJV o#:Oxb{qՌ5T[qur\<.9vZf-:p a D:eouA{ɇQ3!ZGcZ*9jijW8QŖQعBw{7c+_͒ fv&6Ap`+:t/䇪a,`ViH#2z0F)y"6"b#HnF|e|Qcm}PZzcTTb?16t{BtB+ wmȏY76[Z{PyEX$̇Z:x(mդucFk TBWop`Oe6gա#Ne:۱Ez-=kw&-Z֦ޘV闡\s%Ӥ̷{F\[nIJ$߰vJlف)cv|gL֔7m➫O#>|띚ˢg١=[͜fŎwٴgg̘Y%9ܘZ5%1iĀL SσN>^>d̓Jء.#>!FOd=hb%b(#%BxsOk:jcDV!,u=>QHeSNb(2"Qpy"~ydYPHτ[nd!#tfac9S-Yex j!e'hG~ a]j$ue#uꊪ ᪟)Wkʸa\jnJZ'AZg$Zョ)x'+J&j)MިiQIlP>+mZ o2z'jj"Z+Je iHF(@Ao w "L&w1%k.1L-Q8g̳3L@A4B?=<4P ];cmW,uHWr3a}p==-k=M3}wt7r w(3 2F!y_K>Is9K壃y誫~柧1{OB캏Ϟi<Ļz>9oW.<O//:KOky롗S:ۯ}Sܼ?OsCBw:S`L?|K_~)}`E׿NC?E}“?(O[2(F1Phb8HEHYԮԢ N S*HP\LPrh["C8)#!#C8ƘQb24~1 cHƘю`c7I3&21Yd1HB:hTd#XFR^ hȅ"ad 8R1\cGMjo,5J\Q%''; $1G$5_Jә#H>S$#8ZDZƢ><<-QDZvV)KH"KkXu#^CJP`%Hмy&sBe&O4GH4 ȡG2tф h=&jN',}BG}H3jK_ Әt4MoӜtn"rAd)rIԫ~&|H0ayry:XSNë` Y[u1hX`[*ǐke?XBh~ Gc\8XAI Ń} Phc`7/!gS'4q'!HSTRX~0p'G!R(* `ce>e1`9`N`&arc!U!}J4q62}i"h70@eI" :$OUOu&Xh~A!MVvU*e3" q!Sj!w8!XS8rhpzS8TR%3#+H)gjR})j90~e+D d(-R|S:^炫2~}Vw[2~ѐU;D0}q( 7Q  (F 7#wc@PR (a("p,1 (h(!y}q0 g1؏\p͇8~ؑ)阑~&Y! gb=yw wiX ɐ1 )qx1P[!x&mK}1p}0p*a&N ` 28b< x Q Qn  HA ?P[ PǚH"}rqYt 5d X M[`@e~@yy"Y90NG~`y8а虅㙇[PtyyY*ɇ(YY9[ N u ڔI` GwHœع "ɜ#1i .Ow 3_#j V~X x(B"t )Z~8Q[ oP_Uאͧ чMhNLՇp|dxOږ:螡PP~| `TQR3b0!`PZ!YȈi}8!Y"( Z%fI ]zѐ,Ҫ*4BLJZhzxg@臣 ڬZ y;jӆTL$}7|u&SW0 ?Yo/GUT%* 1,$R|v]1TEYy$ ϰHdr8QiXdH|d}0PC ڲvZW!{ 91מ면1I3z N8M{Ȳ !w(7E RˈU{o",EF$ىxʸ >jQ"pUe ! &Q 8Q`5 K; z u1Q9 h|;Xh % 㸭"EXJۃX $Lb*P~t  Cj%RXGهZ؜)9 )P!)ZXg۪"ۏ(ՉKiʩ꠆!˿+~+2 ڏ{9ڸ/i=kNUAi@ z|h~]qPAFTڛxF1QЀSr պa j: 8Pаk @W u Մp Fo:xOE9$ yP6WuHi;\ȑٜb \ u "J\ʠ ɏ&əL9ize-:̠xj8͌0,%[Q3Vc\|oʀ${ @Sڴqq| g 8:x}Шu -k]i"E X@!h/-x!̓8Rk͇ۛӈȟ)a0iKՓ7za P\>͕OSݿ9pԍqE0r=X%֣&#aQ]au|իEKF[ʦ`}hruKF}u<o0; V$hQUwRmVlŗ=QVlmO=A_uErCխe涖۽SQ]ǐRq|b%Q5ټޖ]bĽVW=]հ_#9{Qޮ_QY%ِ!S U`ܼM^ua.c.T-3~Y Sce U.Y^\TnD;3  s.AH1Y$53E9GR2K VUn_NHvgWqsIuEދB{>q>jmE}E1<~s~껎..ߒ NHH.ē~j^>Te|C 1I?'p%o F>s`uTX:+4EO6Eػ'MzkL+EQOG_-8@VߨEdF "HIw RbDFo:FdHEN{zIv/#q|vs#rDKp4<?FDI_iJTIfv/Ho|rmFG`aItJGFt?Q|/GkJ?L$/TOKtb4ƿޯHdu{4TL?~o1sO "&  !(:8ˆ`GmR(ƌ)QH˖| E6qҌ9&OiM$jSbP>TYnUW_ņ% سeѮU6[pƥ;2i ,Li!+o὆6\0cJ6Ҥ,͠CҧQfMzkѰc=߀~s߰O]\i]ƍzw๡Yzrǵ+.۶ݺ^^T_:|>}}_O?@T?LA#\  pC 3.;RcMI;h;A#LSjmv/&mGrߌ̱$u+MG4ε)J!K.W˒J0RD,A3L-tM8ߤ2H9|4:qM'$#*B$TP5RQD=ԹDQK)K˴OLTOQ5 uRP=-5URQ TNx<>{|>SRW"a\e31S;+k/UnWkNQaHr-\rý]a5]wu}uwk^ Ixm̖]MImxrC#t#X55Fd=>W^?FdJcag[^cqYey{&gew.z5-&GԺ}L^FOkMuɑq-j|OW=x4L95'zY}7r83s锖44VVGTtHMn[eO[7OtUS/]c] ۅ/M@OinT7Ny;e>{7|W}w}wqzQP$` x@&P d`@EEQ N@ fP\Fؠf#$a MxBP+da6f{OoZxC.~X>z/C$bxD$&Q苠 @4K헿}@n= LE0Qc,bc(TpGa@@F8j~cQ{cIpowʄg.F!_ Ƚzp"dd%-yILfҀ &Iqn$e)LJXRc6=hq=P_<@$T*Hg>2Uՠ4|5`kYzֱլjEZVUok\zW浮{+_WU~%l` ;X&=lcX>cȡ=iB9G O!HԴID;O50/öm6yԾ6#%mq^ls!\:7Еnu{f׺v]r-1ʜe /?;Lo3@f5}v,bLC/F|=}{ߢrAa[hUw["9rj!qXAMX+fq]bX3qm|cX;q}c 9jWL{Xd4nv/A[:5Ek˽B7}[|0C!L0T`4~\udXA?Ѓt }hC'ыVthGGғt)}iKgӛt9iOԣuI=CϨ3]FEAC(OS${L}0Tq`D/̽oۦNű9j9sBlVp&w}nt[fwnx[w}o|[Xs/O)-]VZfl3 x4:Gn6(j9US }рF4 TF= hH_ҋ'Bwҩ.u7Q׺ҹuC_طn_=]:۳eW{vs;n=kN~<x?^9iQYmOEMJZ&}y;f Ğ&4i)KfUwM+s8&6m3[~@9}9*!5q[`Y?q}'ӏ~럿O_>??+??$@d [@ | @ @ @A)*l+LB<;62$;lRAEJ>,,>ul,(wGx,'A&-"?|Gv{GGr}GǰIȆ AH|ȅȃȉ4HGȈȋIIȓTȌȍLȒHH|LɗlIɑIIɂIɛI-ȰP0>sFZ%SJmF+j,1+!?YIv|!>BB q̗c,!ӰlKqH$?t K{d˽dC_ -G%GSƬC í̙B}VLLq|dLм Ⱥ<ZArAcF!O>:Ce>"0HMcxR8?z4pDR;O=e!7"9#l+Kd1M+8K44fP}Pz1 Pe0QR}UeʄVmYU(U&= {0@1QaŽ-(klF)ae!f:VgUfV#UjVAn2nb#Y=J'cS s NʄPMdC j>#$S8܇-{cLLȄĦl>3lVXs`8x&h(wrYI:A:*GRG`{亿mYd٦>v=i(jV?;Z2hYCZUJd-şa&cZSYBZk[݇Ź1B5ӾڽSdl}0=Wx}"z}#Ri+*lTb{Kp@0`EDfՇ0X#`s% )|082*P(2cւފ"ܲV%3—M}4&8@|)0-0_Ѐ8(^F@X^sE+3H(=͗_rb ȪwėʗaGeS8ac Zd0S_`hV`4OS`Z"^.8-`bZ:y0 v* _ 8ќV#~"d0b_=[bU&L0&K&;xY8s}hg+( %\(4?<]iحRPb9JZ0KPhLchؤLxL-EЁ- @ =zXe Ձ$&adz8rf^0z؄5뾣]d$>[1^d^-u!>gN-)EX--Ҿ>]:&eefaFz`fa|nfc`pez8Z>eG/g-p>_}0Xg+脂]څzvf"[hM؇h #!>a(-s6yv⨂(2TF2b.(S`Mp e/h^!.hg۪-pa^NdMkƗqvǹ9z8]7SŹޟ;<-z( +T2/(E *R%Qzeu&}UR0e/ex P@xmyg~vցfujZh*enbօ8@eR060 03Z&Thr1bpsycat!NUeeXnvZu3 a`3vO:e|^v=*e?[W0|vwe`=pPtFZ(uup[tbvzw'!VvW4mOk?kR:3dž5_9 ׮GXz;O!Y >W4Q]مZ߅dO@p*3 mob``66hS:0ڂ*-)M09΄1dSPe›jIЁ[Fkafb_]erSh)z_n}_Frej ovv:^:_gC'O- nUer0P=.-,S 1eyW!_ɅCFM M-z4ҦOL2-F4oJkB z]vz)Y)Ə#O|9Io434N/!^2X?ƚцyGSC?lWeT$,2maK@Ņ~EʰxvUSM M~_(L[D5 LE_E14O)^$1#s=&.d2( Yс FXMTW*d Xq TM.-ph&F6ű x֕z%Azn4 M* Gq h(B귈d`b302)0z:)QwJlQ[-c &v!BS!N4S\catG-]l(=WnL&ĶU iOhK2ÙۯiZf;f!F9gy>!e2*#SX)#\a 1H(\fbȗ#,V ޔN񥗘2( ÝH0hĀcMH(dc{J=i\ &A'9lr kS.2` ֔]u%ÂbyP+wa)q.s&Qg'IsjG4B]E˫8S=a%Lm/tfMgOh\F١"m2\@\XVv#M;d%c)&~5F0WЉ)q ǟ k\Wvbf1xC#P@`!_чW0"gꡏ}4jh5.e3%lNx=`]}XBƪ5)kIڎ(-8ZQA8-)NVD9i"Q VP8-vHatχ<ı&CrL Ch5-,rcԣS4G3.#fǴqz[R!HEJvmHj{Y$##-DQZBWn0>$ [ng3>';k` M^ Pc/<ӂ! ;rA:&7#/n0x !уPE{ . )J˞z=Xʀ"Bʓ}g|%O)0QgҰ1Cգ2:уTYqaM0 "mhCGiҟW\(K)#aiZOF#UYhR4pD7vbTȹ,Ӏ0I܆4+ZK_R(yxڇ>hp03_"Gc˄;j*]27` h`CyϩRҳ@>IN*ڔޔ jF;ЊQj0_NV Qh\b$+^V׶Ņ-tW[8=iE[с.7$nwkQ1$Sl^fյ܍܋Y+^iQ,<πn|iХL5PY P(#Ns R0 #a\үaM}d^GADk̒gƹI\ Td=2;ld5e%z9[WԱh--R/Cֺ5a]ίn czAM,SWS[ظ5-jkv=nU;6 lEF5Ojr7[>7o~q7. { Pc6rsi7G|4zC|,*w [NЄS(gdni\}XqsS|=wgqs?49]׻@Ozws]֋-p`W:Ů-}ioGvWrrf"D-f4kuf[i@~_w6wqBKЀ > qF<}s䥏.e0Ikh6q򖽌q K +wmf~.mK׾=o ?j>ϥ?o~?}o;_e_^z0eI͍}i@4ƅ;\hȃW`Wm  jD8_dg `|5PN\1mAFa! a-amUA U|aAB6! lba!ZmTa 06!`eG`'(n_`:P:J:SH4Zc8u >(haHGiO~>>2Z`7=8A@@ 75'9!)5(ijl$2`8Tiic;A HB LB |gi1nZ%&*16&S/ƜfF)jTP좕h7di',A A@ ,6v>g Ϧ0$e@iJgđ+$2> )i"F#"l 7+*Bzmsޞ )9-*4i3E6j(?+r꿆*#/c/Z~*چc2hvrcNG1F }v2R\p8 Lvu\E=6cc;sKf3o"kƯR0C'A$A,Ѐx,񆆇Fr⤙iAr&@iX drjG@2$Fw2/?&L %$' : ;@0U- +1*=#U7ۮi%2q34>Yv>01(!f8K6 AMvL ̲&qr^uf9Ө=̩.t<6h`Ac.CCD" ,lJ4@gG߀cht2dl\TM[6tch UP3`ЂxGzFV-jr4ch/jg.4NM -=>c5u9o%Zw-ݞ2ym0-iG61Us% [>A&cw3΂Nvg(bq r/⢡Bqƈg6jc9P֍#7|kk09kk4R@P`12tP‹0*t0CA1E`toR//'c-cH)} 1T'=@`"h>Lc(xvV\娣xjgNxP"\{5R cU(Ru(='sPrpX'R ̄w8rK5sfcZs+7Vk1RW1ac`FbcY2is[fǫP\"HBA0V2TAhH=ʄ4(ӜuVjrq.FtDSTln04C'A,TE,^eq') \m.fcg%&8w=@z@AQKC: @wc,-)32'Wǯ Jc)1'^s8gvz-* SN87Vv0G#2篴#dX獾'8v `cE|,~q5FyZ(p gAK@DH;E W1꺊˳;@?^eC AW* \%AAE"8B,4səGYɬΏfI=iDXpE0Mփ^4Ջ >eE&"hI0Cz&lD(d9I6r_zn"lxpΐ [O⾤#4QCw:yѤI`=(QJդSqזV(q{YoJ/ɱoi pxʔbݠOi1jbhRthѣI6}:'h@SZYoJwnݻyxp J/$i8Zt_2.1epQ(}жZPDV=<.tY(-ҤCMw [??Mn&9YĖKč9pc #!@F`&421˨I2!&JCE1ЈmA*J\{meQGe@(i("2kadILe@rQgIHC}\2򫫞P,{ӱDBP<(K87,K,Ͽ*R l:Qt2>-P R&LS0|ҵQC @LZM#nq!9\C+f7d]fo ,vX;SծJbDk(byr*|0M\QjԞtBi?0ʰjצí&Z /q 7xcb GŖHJc@SF (K)hjZFÀ&6 鑘]3fHM&SʺM!"a"e8:%.(JШҦu^!TJ89I-F+̫Tź?B1,@8SeT*CZP:(;||;EtVjN9b6e&ްM79}cUG]Y8}.SCh);}a$hKo 8ٶчMᢥBՂ^4&$+도׏TL1b"xÈ7PYY4Z@DDBs>L*FyMs1>A#1Ii] D3xxb E @wއ. <1D°}I:F);џ"2'UoOn@\ЎקW];H KufM&zS$0NKi$1,+&Qxh{2hd\YNeL $2XPmڣefN!'$YǠ׌אOz>j ڡ> ON~kǪjXSظ5JԐر\eοJg:E$.pT2pO5-@^;I#zA,8Mz\BH\liU&~h>+{xe+ DAfe/cHC!FDVR2\s8YЬVtM 4=H-[mlw5VuG[tO4ҍ/lXeo7YlO6qES?uŗ޼ؤ޻'\ӷNR_ĠS s ele` ȇ (n07vt,y*sAHQjq3 /d;ҹ @dJuIShxЀdJ$dz@K,d@L4O'xӦDډ>" .h"d8t{>b&O⬫@Vp o` H.HҮ\3no@P @tD3Nȍ BEwRxf nNNp7C$)V,n'iGnj@'4~HXGJ8NgdIeGz$aM&.q& J$a ҩLJdNFKI YDtfnNd &aml1ЬqKxQx$ ~hP"Kmf~D" )qyNhfm B| #~Qk,N0BNP&ٱ^9Цsr%XFcV4 ŭ(MX-.  A '4F)%IWp($B!D )G 'oG`} J(nіX̙L9QJROJP448>V\cnF,3/e&..كw2'Ꮰ<sJ _KF ^qN2_LO3ߋ&~}g4}P459L4as71h3o5r7_S1Q24>2 H3JJ+f )41>3*.fKSisNI3Q(R =P""AjS)B, V( <;E)B)mt2恄3(BwLF+B pB#tZ64)/tFqXGG>XU./"nPzmHptGDRCIH@5FUXcԙJbMep]Qaش11(Nm2OGp`4ƔG2c^5>5L<HdyR q`Y5ousb/3"?t?UJ8g! 9Fg4t%ngc਄c S= b!a$|b3=֠T(1gRUz!z(g >㔅$JH(lanlkɶlK6`Nlm,Xvnvm6XMoUooo߶m W WmnvlVpvptbՑ]vH_#rq3325Nu2f tKwMRUa#Vr?GTH-5L!&ts>yk5#N6ٮ!P!a͎trY5݂{*Ő(i3B/l nHT)@Cp#.NVH,@^'}}ل-(.#bBRp%}[4"8SI%q}тP4+7DE|7ߗp)x"..ܷX[X,зQЗ!m/b|Au/08B"׉{8#X2F((b'+|X+4x8*XXS//8q!7W }Ɇ"` 2aS=E60sH'Z d,Q+[Q)6"Y37;'Y@9KyGٓC9>19HR9)]Wٔ[qi9'so79V,eyy1ٖgycyq9YQ[kz%39I o X,vW VmLqVqpqVnnp  :Znmڡ6zp+3Zm٣y*q?1zA;ZB:Z햣Y)X*M8'H% ~"THOW)#P]{]<'aPר9A[R"0ꡭ"a%_ZA (ں) {a{;+/nā%X-D+G%4}DZ)"۱% ; $/.b] ‰_8;BWۍAQX+85W0+;͛'& `-|f(X&|uޢB.ڙAs%i+%G W0򇽟rb) ‹:/,x$!{^}[Qz;Z2h,*{"I2[--*Z>d+c*!J8 ":oDʼ+<)hf^ƨzM\4#N_8EC(`|UMQ\4g̉(4{A*~ 7A]=}6]Q)X?)Q"m.) - pB'CC^25|0¢h unGMQ\/Fy"ADB-A/C⭧" @ ա"ԡC*ߢ҉n" }&W=ۻAʷS#v"ߺ'=):*zkb$Md|x :U<&ϽQзICB#-Tx8݂Z>S~hhi!(5]ӡ>+C(!?AS!0a1gnyKA*L p @IsOcڰx1*4dJ$Bb%"#ȝ)1 []Rl@[ zbnVRB (#[""Ύϵ+.~B/ݕ+BhQ&0-T=<1} .+tVE/O$~zB3> Fo}, aAhAo$%eŏ ,@>اR%˓N.ӷo沓/4ȚfQCH*]ʴӧ   8 ;)¥6 %ٳhӪ]˶-ү)X/ ŤjW4EgOeI3fC//}%\`{&8z1^fgz VptS"Tv3RܧS.NϚ5lOҰ+Otx5aAk>n0ghCzXHXM7}7j֛O!՜kvqK·o!eM4!^| d^[R!T 4_M->yԑ5N=+PЬ H&+4iID[X6u% \%V8hC]1_Z el首l1q%BjQWbY"GKM$MiGZpgRs V@L%fR:Ry44az:]4ES]|AY&}=Ssi*Y} M7ufVoYH{.46=f; $]c/*uCWMN wsMQfC1> mSaT,_M&B- 2'l܉ZcyuԛY޵O TVb$s$v1ZdL7WF%OW$P؟g^gXy'Zg FAE5sZ؄&LyŔ&=ୗER;t*2qתO}8:͠@ WP~(:`u34iק_9*g-$qrD}+حdvL~htT[з.PNkIً)\!} E[P[0R\lq~cЎG2F򘿑F?]Aik*8 ĔbbE-vAnpD2BMwqn(% `Ǥ84dχ!J0{s 4w jşnybE!۹(M׈"E&"lJ^BH R+xD4璌C"ڑ$#ڐ6:ן&i9I%8 J\Pw+&Q C]TPpHDGxЄB'M (D%(p\򲗿ec0G'1YJb~!I2{L%} eO'<˕b) ь=eK=vgٌ+zhxBn&کA4= '0duXOJ i@ozsNu]#\nWة M^GAXd FgaLq_+z)USp?1Cs](e @ 60+RN$Ǘ2e2/GSF$X$wy|>yd4*^f MLgRjQd,1< .Bq[x9;r;SII!N[<+1ɣO*I4Q@Dd B6 j}ƻdqH2G'8Fх]m.?!Qwf0tYDL*:*Cw4N*Hy;F覫R?-M8l_P JUJQn*1QȑC #($ epJ @bKGvvZ88B0{)]R6CJڇ9 3'e2D /93˿P" 2 i69 rp8}n5!{gU#q04=s['#U[q09`9vj]=J!C2 !oAE4(5A5_`DRf3HSqm#7S!FU XGA8ı<3< c/xk:gt"7ٳ TTgaz8Uh fpC?_77Rj {p2{ Ȁx7|' 1qd`|6M'KUm2LUTb3M@ 0&qhZM1Z%Bg+<@sIig,71򠌵2&WBsdWpA% <*B`i'Em7OmÒi13]Q$G؅V,U4Fv)5>Tb%U7+t!ib.!!]29ӱ( -K*mKvW!bIA{)/C5(!ZCAaAQ9aQ]YP7jrPt^*b+e73Tv!!)ROb/aJYci|:QD575.!V_ES.¥v[9 zr na>`'[ o ziPx%3k0zg*W"qЗQ% |VDãhøH!pgO*,'cRjnq% !~5cu7t졛xpR4m`)/\g)YF9IW]b7S+ց! F/~rFՁzS(Jfق-j;4M$F3y"(C5']Hw[Ŧ5-zCm#v+.|n7KG.Rj GɪCCOʭyĠ *@Đ 暮T碶Zt!dɦ*3CqP} Te&Y@Nj !a&ftf91s@~q57isO:cJlř 1Od#3ߖ U@zjh[w47r ҪR8SR+ wAaQ7!Ezӓe3)@xʣ;:BxW6[67Ad_#18 sn$BCEPl3buPGh#f$$3)]5.g;YP ʰ K:;CՎMx$A7)}և*cBGq>*vG*r紤JqM*[p2aw֤8[* n& kr"[[?w'h/!+‚C:PDF(U9+qx4iK1e."xG9FQtrEiF rG P7\?R;)J&SzD!C+ːP-(:+6fbVtu*\ɺn $${& N>0`BXaS\Y-,HPRZl;@;Xtɣu' cqGH~Ťf=2  Hg`1`ڛ3FM4N(R56Z7Hq_Ė)A0 SB<SfH|m`ku-;TJuWFq|``xPrmwQ(9)Ӭ_!#V+ajv2ձyQ^ap<Y+q6SPD 7Sa+1i -!9+òFx|Q8E7y8$01{!cQnt8ȶD=6QRvVs %P o ܿ-Em&QÜ%Lm*s } 7 A]qhaw~ZȘhq%A \r5;g)߱d²2Lѧa:2tIO^D%!,yG!s1aF+ 7B}CxLe}$ԡ)F";Eh<]Hhk*Q}1nh h>]= C$ $mX/"lKjq?%VN AjQAA=O65MFsHwMVD.ϚH r,kAG&^|EFST3ՆCBw6 E F ڵ_Q(QX]KTD\ 9^^њ&DB\n F\IS_0#yԥl6ن*_+T& М0** / 0fCLHA281$1#C$B8]}m w _&m3O6&w1:hgq|Ck\qSH{[j~6-\t㋍:w@6AIY; }In]љѾ(6)ɿ+xJf;`XQUň"Jӓ]qDQ2iǓƨ!s"$-FW/=*'\8^hN\h`}G7R_С$AS T2 %,XOIO|Hh YND)K&%dˮcthHh-r4,S5Fv%tY4e70ƽ5~xXŏD,5sn `$}Ojn|[35741[n޽}6$ e8p1~CفIi&&խ_Ǟ]v݃}i2N&(5$ɔ&wҤ՚y^$!Q k!j}0RAxԁ 3(Hک!J#eੈBk1R  !e h"!{Ŕ(آGBDH&J$>$ITj?gF>i4tɨ\sLR2$") }rQ?k4B h eHl1K%4SL1%#"-HcP UW- 02LTJ/M.p=2a7pKյYg6Z"(݇6[HcԉF{,CIV&ЄR+(IwRx)ԊAJrɠ5R *i4 wfAMH*ȂHæ43/C )*9!{e ϰ*}<"ߤߜq濜 )6JRַ]Gl)%|*?.IKIRQSBP;)AM8pH^+@Q\mٓH:Cn9%I@tOGAgM)Ы6J+LpֵҏLԺQ, pʒ,GF{s/6+7;ڨ4˿qޒ١,Q'jM;4=̄'<%jVaϬ2!7sə 5h_@ৃRЇl"`Cd@M2,IR sB P=S"A[^E;4ҌpcKϤg M궃d8N^8G:JrJ}mjOr 0)x dҡd5IS.5"L3@& )<vyJYk!z$Nl*VrȦ$'q3iMg% ^v5UmPJt !$j4f$e^g.^˓@< ./ɖ2TRG0B 10EhBZuN1]C!GS$ ^2.6qcy+B 3@747LE:SQ8IԊ=S*xi'ܚYI@Ԙ"a/Da׳jiP~Mx,PC*앮T0"R6}|WZ;Y7xZs[~_ʰ0a&_Z c@=ay5`_l7:N5Es%` 4Xn} 8x =! i-S}Ⲅ {4ܘ;[?H/ڤC1a+`..:B)5j7:}Ђ}غ} 5ݘ8؇^_ }X6ryH#A# l Jo  4ӌ\H e¬: 'AB(I=L( ˤ9tѳi(BAҩ竿~"1&=zX7R p;;;>XʧʪtJJ!P>d#ď1Eۿ`Z(@܇O0`@Bˮ3 }؂.yL0 fTߘ.Lg,X?ҍ&Q) !|RYIº"Kyd 0 y=!ɼZ 0d{I-,׊>f 6,(1 ] o zb).ʠx°PR]<4&tJ 4ɮ1N>2O²pڢA1 J郥&xJ m;`;P i""Ȣ\CG )2GX#ۍX̎WԍYZ܇# E` 0]|hFȇ1P-.8R a8+RS`1,US/FF]@Lgĕ2;0B;qA*@Q;8|202B <AjJj0I<0A%q"IGm)%ZGzK~GoQOaհi$q pЯm i?kRH\^1C¯Q1 [YIA-{}~|K5K(6cQ ?8X)J{ё#5YSrL܇]}`:̑(h}^y`<`Lv8mYd5L)k$6  fӊ橋"p*AW < Ob$:8)QY`2 N9OQ$ L6Y ]´P$( =€d L[C$k{j@J$IMG7ۇ}Wz5E`^$J6:Ud n% Wa MV b M8ѾK Ґb\4R`̇ԇ ̍}L ҮSЇF^KM3rdƅU},= !  ^3$30J $KGp+وn ˲ra-mxI%&N\h-*+sD%ӐN i*+r7ާ0Cr%a(Th,<~TG!pFvHdHdIVޟz6iNVBɽ3ց<;݇^h:b84 5!:NS-[ ,ڒ nĜf}`2_4f͍ec`$`dDfS fc5|Aڌ8+ZN z9*,e; p.MP;m%޻&T99S[a)*% t  : 9[M)Aa+i- nl7)1zJb&Aʠ ۪GSvp8hdjXA[K3q?Vkگ#cr:0(IR3YaVȍb__}(PL`<YNFYǖif1(ZnfڪɤjD H# +u 1{'+ ~u,*I&h "cagcԲő6n}h@ ZؕBO\@ɻGT }$L/J.ʹ?q1B# 'FoI,uDx݇:4BD%81@\!bNhSax˷DVXKX:Y"4Ğf.˔%]0Ձ_)*{ |GVq+LIc#j̣$1 Zل2Qw}WplWkOmv`9@oXR V"Ű81Q /2ʄTd`#EEQ[0waE0%_&oBR_āEERxUrgf_S˼xiS[ӢVPt[wN^IU1 88 S/!M3%a%۽ς15SQc zZnIB JC =*; IR 0wlnS>9=4$_CxGv* ȾfwQ"#777+2 zPG} ߳ozmq4  Pew`:BX-ߍy`R/< ةogF}7 Y"BjQ`+O (OShҢVھhՓfe4޾^SVJ۷L_1 b4mƏ CRh4rq>u'GiKi"Y2%`}-ur@z-R྅NWnrYɟqc &ƍӗn4 3¸ %p̲ #FSlP)#o<!-shН=l}u!6[_}^x8v &6(s_51@y9ҧS:iL7dl!SIiD'V]: C2 ӯPWOQiĠIZPK'yC]EuF( Rkw ǖ(iI(҈ TB=WA%UJNR 3RpHiauRWЃu9Z1P\ t&`-YZZaB Qk(uuR&::UXF8T,mӅ1e1QVƉVVo)8@H`4I/dO9ӣpEi^9>jXFIFf21*:k%npJ]r=1p8s~Rh F. Si\IgGE2 yZDZ)@䕇ϥI,Z$PBJ%%:KoXuF`ԥTV MXL9SNuU@U W)B4DW5ڏEEQdQ  Eq:\Vi@(b=Tr@D('J=Fd ,?# CR#';2!MрHbbMAZzC"8M]V!Q{#f ǚ^r$a3) Q$rً5m.2f0C7d"(ߠ 2ьh,#2Aƺ6}#I𸫽Xѕn.5L)-sie;&b-d\ф"3M^kUIE 5Ai4"K4vԑ,. K cԅ3ͯa&]^T9'= LUf/&i2_HRlD:2ld0-[ Zx=" `A'e$)!RĉdKJsfleO\e0y'ԣ D~xJۨ.4PpNG awE?Ib8[N-\FhbSqj|LeZ7%~#!]C#"hW.MFCQJ΁(< pP@2GNEhP(Dű$.7#?= !I÷5LX JŽ*Jcu|}IⳌCGDB( !6 "^‰{q>w4/#Rzr4!փ pAܺb5I 0:wTjQaϼ*PYI!ߙjY^Ѕ`Ua˥ SD_ ݩH]S_\1 K2]*ڍ`܍ ڍ 1)@=(QO5/eP=V@ xt~(5ýߤDúXOLȆI4XHȑ$ߞDt3}mVSd:XD]Y4ȰHEY͜N!].wIMEHȞVpM[ IQg-ŃJI^= )DA(@G4!Eܑ.v#>GA&DS43:#4ADc5@#O54ya]b셗9EpF'QdxG=>[ )KSeD}1혏8IM]̞p0L)DB9G`@XpOɍSʙCCX^䍂:Ȥd[hF%JRуO ^,YN GM.zZt,ēIO͉ Nt#C\<`qBJxJ{>P3f#^A8_Nc4>bJ:FYlT -h] 1DEGhA{fh>fGHRLDn =$"~yA JD e9kȇ(ա '-x _pNHM^nI mM:xfHlIbGȘIT.(6D T' Ip֤D8G!7Tx= qOe Śx{> h1 z%H $:-ģ RD@(އݣG<"Ē& ɌQ!$DŽR \xY W ISOPmS^0S\SpٓQ PHPLTI(`DPGMDvR ɏ[D RXO^ƤdH rjϝB"eSY](\\te0`Nf0h0C&@+0DkNf a9QykH:h(1R<^ f&!Uuhzi&{f|0O>$I)V0٪en-$JKД+%nٴVsWe.͉9ug0-Cdo)ff,Ji2q4j\tRȬ=(@Wf)!vRUDmɜF锉g٤5gt a䠋RgO% >Sw@e02ަ#m$AͥJҩFd- ;N&`zT|.t&jI({><Ā>Ԯ.ʀ0><.k)(9T1yAqWZL+40] ^߄Iqpo HCi1y@ I͜6HFPqQ`3MIEnc* UPtӎߜ(0*gTY⧈TeűčԝmMuXb.|`JO1^/.pYR.U!Sk> !VaK$'SX!Cf(BB+~B>pC!z̃T QE>ATGH5MAM`FGJ!t֢π:OZМJIuQgfɕX 9E2 b^#2*L.L!aS M *EN9oQBLڞR@MgMUH,܇Ee+vRb XYO^`cȆhE(ކ(J4,C(@?WF4Aem4KafRƎM3/]vS`lJ!;I{{kJ;SBCS>1r4CD .΃V@2$N>t 2I܋| =l,EvU1s<%慂vݏE4u*7ϙȈ TXɱ=pe _ē2-VIؖN-L@ŜL -L:0e_%, BpH$#:QZ1cڲkSJ ;$B$DBCDK)z`J@)(Cu4fM^<T>㾎ԩy]kp>U]#mU=~0t?EJs15SCoױ&샄#ESCk8UGb#lʈ0` \ Us@IZS|HEM=~HkێIF\Ĵ}FN҈P=_IM uęMT̡ \>pe[ ](:2^ԵX*Jd>DT](HhunSNZ3>O:Ws*wk\G izn dstus(?oBf0a&}4Is"$8M>04Q{ >M4/t#Fü셫l[ 2'-Ȋ,&E] m[oY0'bSd]Z՛U H MVYI ̸dGagJۤrd8צJ嬖R8e|rS %ڞ0YA ](Yzp>G'{QC)|dv9t B/(\3ށX=(X?c(T=(\k}0E|J8[n4ƀfAlWk4I@YKYquǓGoq!X1n?.42I\P±B#Lu?KJyñFEu]b.]ZltKѲmVL \ Uztc@'AXwHE^D1N~Wx{Mbt 5@KDOJ J4Yoaʐ@[2} Fۧz |X@H}=:$"A$Ł=n,ł-[3>c@3Ƈb=&G4Bsv>d\h+ʫ~EH2'*C}jФe]wk'Xb7p܈CLj/^{h Ȗ1y]d#y2͛0ϥm/|M֧<. I2ҘxqjpYi2Յ IQZ4i䥕Qaթ FH5;٢^:uz,9M7zOzPMCNX! =T  #ۖM3.Ni3n]4N+7| e]}6.kw{=/b31Ձ@& nCb,*bDIZ($%fvG X@uyz ©蜲N̪DOԧɎuF'>[Nh4$<QI Ef)%Q"xpG 2"GPZxU>^NPT.>/MQ "){?Os(==*WxPoi wDh|k`$0A@ǐӤ-Lkb-'%^b(85? J6vAg|p 0:Fx,nRI%Auzb0$AfԣyZI5=hy"S(pHGZD N:"lE(17`C)g*AU-]PeYB1; ā11  c0Q1g 9/imIݬͥ'+@q5uAٞr)n"(Gv Id x1H`.d Q2ȦF $L@JR4`R-!9U 9x'vJSD1IBىf|jDTG#%U ?uơɑlPXD 5 r"$XǦ,rA*45lRԗ-䕯1k t;*Aj׵#\`t8%`'<0bXP kę6/}h Zޥ/JGOƥ:a )cKd( \]w䐁<M5p Z("FYM&rݘ!Dz%+$B] Ȏ}I]Ѕ{ꠉfG9JebHCIFj,B/ÌlUY($qҘVaq2#D Bte W$/YӎH*JJ-Eb 拁sBHq`V&,[aYӴ`"B!{e󟏹_-YgbtPuNEHR8"*Izi 1ivihHxRHM獡}R5fXcq[C"4)δ&Ǜ ʟ[[$k6C y\HY1˓R Hfztȧ='U`Ig&2L ,=b¢ 'y^b 0$ы^`Bx%΋-vUD";xD#;-*$3Zcy`VR=yh6yL#;c"hY#bNT6A1(xBυDhg)zETCa]@#!jX" hhULpWH`e\w ど0U!ZaD]q< tЬdJs,QHoCXPʵ&(I$?IheDsh8'7<`x/p٥ +ܥ,cDhh-"dQp0hZٛ*Ft@x t$v懞,dmAu$g8.Jq$"$@B#=Ϋ),H T d H$d#"LdV %=苠BVj$cl<܂kH;-Ct&D 0k`ȸ$ڐeP^Np bH.B,WDhLZ B %B>'` V||V T|*$r|TdD_/pnli@Bh !fN0p.t8]i'!pN.;,P;Bæ< 6P6p8,a@-H%$&>0f96."HD"AH0A(E¦pH$kOFrHbB$bJHmcJ>dw " '%VO.B-^J荟`JhJ-r8-!l'|''c||n0 (,#ܪHeZ'o`y#.9)r+%- -`:1DVd!-ZPĤx*6,H ģ0q(DjN @! `7Ɖ. f*nhJbs/dhŤ.h1s%0'$r4.DƩH&x$Bc҃8ꂺ CHQ"& XV&:x ^Pw$h% dJ-tA;;3<S/&Jo=T,e>(p=m+ec0!Z8 t+P&>m9tF8%iŬcJ%^BDA*mwCKDdH@Gr,hȆq#dl3߉N dH$ٺˤ&n+B.NfA@pHD GZHKKEf.C>xҔGmx9Rn( % THJ,'l;S=s<PsQJigM8fO.*:Qx)*',mX2A]Ckԩ M֒DJ2X6 Q*8ԤB&LRHkCHd҃ԘF+.gܐ"tйNBtOwTtJ+F̈́JBDPqW"U뢘:1Jdp#.&0[lP,*o:WI9fz$1K Jdzp35<$Dg$bH";*4I$KIBHJԈ=$!4>c+IndtZBiӫXTf?5rHL^߄ʪ S D,g"+r:Fꁥڢ>§:R, ǭ\͹,ppp"\nT >V[U}M&h`55k 3 *gTkMfL"cfDu.l<)yBr =*@rBlw+H~hDI+ojciʣHL!EP@~d7# ۔߰8c1qEB KQֺl %C(6 hԘ0ngoe1 }'NsEwWw%/X%H1 ّ᷒1P!w)C HɾXhpkKcaԣKh=4LIsBڭކCB H##xh)ww.]m9fl IiJmka>H.C.0D 1Fac94f&i$OLnM=1wa<)R!"K#ŠW) B% R> $Z ԸϘ k-PplgbO@,wڏ6zoXl/ ! jZ,9Bj3r*k<8f&3͖;ʈH qӊ$$Ġ&'5ğ:M4OTqʆ`衖l |MpfW0gv/dd0/gVEOPwrf4-$jAdrps%zp\u % 87ptvkL99"eJ\Q'i`_;] ~l>Hb*k(DkSZ. E 8."#"ZZRK{,:""l;>oq-eJ#Nw󞋰IԜL݀J8|#j5#mGK2kw R aiPVDgGtTK\{S5CoLHk:l J2sq uql`D$62WXVJ IX~$ođP`R퓈OR' @` OHY89#4\RR \Q10,"2nyʇ~!fC3.%g la]lP̆FvrhMMYJm]i5ɞ"L[G @%(2z%ǁcb}hs %g oKtƬ DY?{$H~d Ar̮ƻ8dpԇpQ2WϤcjJEjh.hwVA^zuSt*Hs51|K"9[$T@p 9! B*w n+j8OftΆLCsu Ih%ħY!+E"H` ,DLc( "Z% }U_aj\lZ^# PԲyn>+iUUG2 !/'Mc 7!"|b#@]g6恢e?5t?杒h=BS4ыVPZ}Җ+04{+OݾWC-d}>[pB;NID+2>@ {cǙҚzhѤ>it=}/ Rfh|(J] vu2֭/7KZ ÓM:j ´ a$69Q?>eӞيViSէUAg֬KUÔQXO !j[{R6jEYe˦8Fvk׾R/LTe{OwY>)ݲ^JF 1[ .`*xG0hrqI E`(2`|4G[Ƞ0@3O }!8C4l>O>2Å1lqd$Ic>TaZnlALFƠoWxXϦ\d5FO#rr!Ɲ$~Ftuquf^wIivF:TOOsLImvlgD%\l'd>x%ԚUZU-F{PETM5IIUJQBzyėzU!&Y&gm6 :F+唼YVDnKzQ-dlz$[Ķe{+tG_ǿe@:ESu""hA JKJD"c!}ܲO8* n4tP>&Ԍ;8撸mI шJ0!iIC!CBHX+)\2h![bv-G8c#}0c8+ C@T 0 [W{&$ ̲-.2uRH((x}M1d3yTOH0H8qGB (FS,(>fŘG-*Icb)iGJґD(TdFy&f6Z `-c^/gf$ۂO$W"%.D.q;̃ W;$-HWZS,u!gG!+C =Y]%zKPd*h',gF' doRd5YK+VM7U+ux!վN\*0ϫ Kh#LM\._C?Ƌ\Yi%xhe!! ## ث}雁bzVqM1Cl  .˘$"%#F%)^Rܲص!uqH٪JFL# }ϔ|uɳETy4YtC@($!7Yc-Z ur*WO@+-~RL^/ opNз%OXIC(A.=hGںiIF# bR.7!dԦ6ANw ď"J>|Q0(#qO צ*6},XwJa?ˆ{.rw- 'G%|qp?gJC\aztc"K"VCg62tcD]DV+H2A+Ry =3zz+ z`+zhza$T1DRTRqnzK)R}\3f!8!i \"8o*4,ro?f! V@`2 a!X("2=,;'c%XSiN}5#tb6NQpR2^W-&TQ[k:?rEq8OR125=s`,zrM!=Yyrx'.U'.W/ys i ɑ@@y]1~dOclH{V n:n=C |\ \b"ZDA)0i}GGiP&sN' I![d^qLX11Qsv?{j3W3R[#SWCWDtuv(( ?N(%XXK- p\1#OOds[)e;W*NwPNW>st}gl;[=5'\UCԓvQJMEucO9[\i!Nf*<(Q˥T8}b\Y_! j`P^@[lm [[pr뢒3w"jd^pS {$|b`q3C9 7j rC}^2i&~bM4rˀ-TiKa Zi[\)Bx,-Tfg$WŠ;(ҚjoWt($dH[&ڠOFm(+N˙)(&F!f](HtejYVsśk-tvx+B JQkVKrHxQ:뻰kкp@ű{x\eۆ`[,ԇi²v!:E Ҟ\R܋By0&8juB1qH:|)Jx)C^2 * S'?OK3g9QY[lc"I)tZYYb&XQwLi>ejrȥɠwsJyR3#iOI@G#90?>>@ ΢JjByHʫ*ZKщ.{4!|Yy !%~7.%ɐf\' =Y4?L7,|W2i.<6x(XÊ$]òye\[RFIhs.Ti,w65諝 AIj3Pew|PAt~WWVإɻj*%B"QP1O\4>?@`؃0_6]= Kݽ.""? 8%6ѯ-3#"&wT9]Y3/-\HG3T>T[ fw2h슸15["YZcbwТK:L!r'{|YD6!/uB>Uͱ$\%K) b()+-jADCz>ExCwS4٩ а3aM ;/uF2)5)ʠu ;ȊZ.fyd7jH*RM8.x>C^!hvr*F:%]nM̶JeJ=K)Y4FCrI(fj^{ &)OvWG7Szau/.*~pb@3.ʫLz1332)d2w =DZ0 {8S7sVk-adz'AYrlj8 A&+a[HGMxr9f'=8bT׬-g{GMTW{>(fsE?uxXS]Jꦶ碸v^ ^sܫ&WĘ*NZ&20I%대~[]W_f2|:tUy*ͲJ!8bp|u*)ѿqӉ!.j.Nm8/Pv. ZXbha$@Fӷl=F/C -JܷLD MTGA徒jФfM9u48 #7&Β?{: fEa e"0Z%[Yi|ZKi&T}fϞn2wQZ4i ,.\@_}|Mz> {q~S M"Y6,͡Ey'Z$3ydxPA4PDzJ0т'7tJC+՘(1P=&;tA0lh,2}r $ ^(1"%z,1f $R9&n1 rQ'D`o*)[VY/bemӖU 9譕\ YOcM ./ewzZjI%]赒8.{**…(5uke@YFkfoq#[#(bkiMD)ĸ2̉ YD7u&<-} syoӚ.|X4 y1$Hkܲ}`B@pKR^J&RXb42X48H}B#$a MH$ D$LI#(3Cd_1l2y!M4L〝^>v&ZbE.䬭NJi4jVo\gd&?TFTh<<*F8QXP1HdR9Y+ɠsYEߦ0n}"sN,kN8p#hsCE`N"I+Bfe,+csƥkUK8#)dA.jq)˕T0y̩U @Iy|]"z0ݹ0b\^ | I,Zzc4v2#x} 3`75-cDBH\5cԀ(di(7ּ471[ZpʓEtm`)WS=Ny:#R TGn9c> mepTq$|y{$Y/eUsGݔyУzgyCL Դn`%|EIu*3)S:(CDy5!uCzwV\F%kxx?Nk55ҠG$)3' ]3o]Q $%"Stru߾Ͳ81ƻ;h@ ;g|ۑKI!`ӣa2n2A O%0)qLo8N"|M Y>OpoŽn.Hz3\H4kTU>ʸ7$mE"Ը$a$N3Ę̬u~henYwVB'`3Y$ >k&g1 32蚐~IFڋI AᘖJ) V\;:cIjLPhOXCI (*X4KM m:Yz Oz`OP8י3\>$,6ڨ4P-kz6KJC06ò"9-|O:2<K`LDB(A;` ar`N2:ȸL)uw2C$J @P A:8ReT2rE@]F ?{F Ƚ6LI p *EĵqJC#hO5x) &s;&%8 ~y P}(QŐDg2'ݠX `! ڥ P߀ x +0$y,uZfeٰ#X9Ůļa͐DLwz;;檨vdT^}4.re+#؅ٝ57]5"γ]*Ȫ`REɒʼn +'R^ JxL 4 2)liՌ8;J9[}`3+HTM9.chgy<[X1ȸuDr ea-=3;7 R]' &ӗHZW;# ZtJ(aalHmnbAy5z}08(&]'vb}b&]}*"5 ;%E\Y'cx #*0$ZYEI^:8 ī#KNj c` Ps.Q`%P$H9ҺBKRZ shC}H%!XQ sי9EY9X -(Av="y)midOY9j;IcW I}ȑ7sFgs7PgMǺڍ,cG *I8J%qIړIcƶ, ( U# M2ф4-ͷHfQ%xYaȉ]iMDۍe $m&r ӳǨP$6tK_ '"`ԡ@!\DP~+dVIP֥ ]SiIk47rj^kuա09{"D09Y݉9. >LhЇI8b{IfOΉٴTZY`09j)qaSҧ+e)@[2@ (:\1 %~ QL|}:f FĸnG^.4iM* l.&fz kq> Jo)Ip"Al28p1 0`rKB 4132PwGoJoQYnXL;\v)1N" ͋lvp9Ef-tpMc3ᜨ)촨´vC׊rrsRW_zP~4/Gf )!1<Ð(R|ӣ@UqcX4Kp.lq"Ŋ/b̨q#ǎoYBzP 92!ɒ6ۇz%&M}7T(h 4,@!h sje\5>Cm-nk TLNW@TMI{>jr(NV=+'O $6juL8É8 ݇wz1,mO=cD$yz6orgyN8?)7v퐳CS]^cz3w֞ѡ SLՠܣ͟T;}_`OP5P$EH`DYi3 /yF*0 7A&E`ahFK2$H5EBܸPj&Wv YE4dxS5^ZIUjORCԚ=ODiѬ5^{AcףY<]ZVFIvӨ:{!]*#]٨G탨HfYuWk4 TCV񔛲$MvOy Ԃ MvmT}F-I} mn"I[nll^9y!}B`geS~2?)o~,$ qJ 7 0SP5ؐul!C Ԡ>7&R * (6Y>* a @TCxTSE`yHBN?SS]ӴNpRb6=d vӗQ=Zi{-`Jqule]VV ]麖wEQ$I j"'$Wr4+N ciq)e^~c}Ҍ&jF3DòN6f=NsS;(硒-4%aaGT23Aph 0(BH"Z}l!GJ F *C1DabBH72Ғҳf 浖$ 2 VœEGC߁L:eXTJv&?OTubLu,LۼE&#\m)j~֐,J\q)V-Wg\AV)JߗWߙ7*L0R# q Okf2;Bt8Aݹyårs,e+#de>~IAͭ$p[ILB-q^,$I%ܜ*ss9'!R(= &&ĄّE|D0"Rs;%"Vч.:F H0;/#NwtCńVjVZ˚2ru;{tǖ|{L8EYUZi.*~eR:TVKe6$B)yBVQE$lN*F8Sl|&:rNgى%m(cdYӬ}o!d>B 0bm$HO $Ai2b\? ɾuڜ I9/]nP7>}#  AV>FXeb E h . \H߁~ G!@Q&c2IEZoVvO*0d M;<:[rB o$AK;L*\;f(ӋS(:}=TaW$^r⭶P-?Vi caf8%[Hn1_(Sπ&'$fsЪ΍72ZLQ]n7$Kp+!|W}sݸSB_گx(z5\\#`1C񒏼-aHP1Z豑}d#XۇA|*F.Uz9"ѣ-HC1h|[1,ݗ<>(UC>@/*:_}lGIb."_BXE>Bø5ٟLR|%NeMBRaFQUbTWT}Jy֔0y9=aL8FQ (m WPFND܅ %b4RpnMYeIPuZ1ǫڐ(਀-RptHgPz+mCʙLZ$U} N Yx!i,ݝJ VH (0LŤ\:ed2hQ)2x Lt[P P@tİMD!):_hE";}5#f4Cd&+H!)D+C00>D1X _NMLY(H FaXmkM ^ImQv Z lNkU*P(q j ]TS=_) ^:)0߁fYD]͞œjb"_͒_200 0C驞C) OLByPcBޖd0dd lO&EN{F |Y މVT5,]IIh9&eEvXC^lhllND|ZNTncR Md;Yu|FZd ppKrF-6OH̜wӛ|:CBl6x V,Y@Y8Vn%I[VC.)2BqE0CE]Beh׻I,B$Wp" Xk0BTjbN-Gp8QRzl`V,%.zF8RE#] rFS Olj bI\ I@Ul .^U\늯.yLH"ّ$uG'$Rf]↴Q,9ĘI_d*(XOO~*rVA)2V_}"a \"o5kB0hե5(N:X&\ 6EXY[O¶1YyaXޘ瀎\rE`r]WqNQN gJùveNW6MI ]Ɇ*lL] Dkgq*D!/aa5nvm z@#rBONd;>k69ܴ~TOͼLLwJ5L un/tPX`'Dτ>D^jC4B `S HʔlNDyp٠`H0n-q%ܥ'^D3r!D:rbubQpC[QF tQ(фC6R/:"m坫eYn nHv4bt48$HR.AF@Iʥ<r"S2(#d"uOKl]?l2B%fSJe!b9ɽi jrp&l'$bEADU*h ƧNOYŧWz'p$.W$m@lH\EOX0bvbP1f z2MÌD|̤ NS:/X^L\}(Q9|R'tJomEG))DC($}'=KZGyL.Mqý5\e Qۛz̔_50Jھ`t ].T9NɱR;&QdRpn8EkǩFycWکF'QDS qEmjۚy$PWK2彥]εtNQPx}FQ]gV^.~W>(O@CCүjc />9x.z?Фf_B 6tb4 ވP1LذXD!E4yeJ+Y,9)ᲄFӗB5AM>idJ'T}ڳiN*РJJVh u<2EkO_xJSPӦ`FWqJ+W)[ibmXO}цBg2Mf8V>j^|TTN˙=(Mncׯkee[v_Y_#|2=ko8tkm6]_g\=s;K <4hk*Q&KeIpa4fL b$aqPL6IG"qDˌ)i,CѸv\"!bፎ%&y|(KCq4 d˥1ʞr4(E1Cg+Js2ufԘ* rȖ 9N*d RzQ.uՏ*˂ *Rﻳ@n̜: k_E=D"s,o6Z-n;Pd˞VsZXKb[RQ#;W3M;G/u&sXW ɬJkM3&R@b&'"ҢSA꟏!KX6޾a&FD`Yn8(rhȌ Bi2%VL0KQ DAq "79-o oTL*s =՘* ,_ ?bAS$%(̂8DMDGP`N=\xc!KLedJ.>@'V,:`EF-%zc6/B H˽=9ֱO! Q6?P2{KA@^(1TO%7$zAHencJ٘>RTrF,#,lr!3(eq2^,If/^1 x/s~ޔХcRۈNLK'\-TLA w:NWe\IҠypSpA-u3ej}*”(] TpO@Rk#!ij5g}A#f"N[Ok#SNXa(CkN̙=H&g?$)![bXN#[q|$tQ6˵ @ƊG` 1ȸؘ1b8t0 V:d^d#ǔJ0h O2,_Ǧ4ob:H۟Ȱi.q'E&O`[䘼`a0m$.m(5"Z_-F1c;d凝 "D ELj ÔTT,i6ڌңt^9z>I\nDtv^Z*c;;9 1Ej\H>4{KՠdWTD~?趷]-$ r2+k\_v E1Nq#0ay!9f$! qJ 0 xp"E( Qc"ʘDu0&,ُ"y`PeB2=( v幃S["E;Jt;ncjKSJ ]%6ic7oe2f33k8|;:+"Og󝜎ej\q8-0'tκ sH;ԵT&u0E,X?"MhaيN4dՉFC0-AܨOCLo`Œ]a,W2>9uq''[!tIT̈ HpXZIe I`榱kSAbf>&KRLc6qSN59j8"}r.pT,%=+MƉpUCP)wEe,ceEC} :EnYˠfb^JNd(g0hTd% mW$NB.̂"Np.-_bE+ŖhD#s:g#cx+bC?q[Khw&m_uw"UzxOY?5;Ec\cyNȄ)7"bfT6_!48 vwAB;c/I  9Q11B;V(a9E2TA5Ba C EAla$!TCΗg5hv1h2RESk,K}k,t2n"";K#ʄ̄.0&i8帺g=y)ÌIt" Yj VOdTzʉH ?3bgS^%Y¶KZɓ~s0{7kuNyJ (!uJwtcx}9tfc`y2bd1v9U{4;V GEBfR+r4DYddC*# F6j # f庑6dc(j؞\|e zqˍ .BjQ&jn4nPPТPpMs)WZ0t RV\bDT.{dHsX7❴cW6kT.jVŢ`XyH$A/37e01rEFRנC5P{)"Ӡ?璙FcG2$*q01>/D9)x ~;]ԅAG8!&9; 9jTbEBG|3{@ \Q3S.](7pN*Mm"דCn$ n2Zo sJMXl$#PvD63Mk.2+.уM)(X*eyTusŻs kUJKS;? Hm%cnȹ8xIy$a&~()mSn(E_38alӱxen cR4*ܷlÇ#& LBihQǏ CI2< :UR$„֋KizbJ0=i gJ jSh>I>iJ% k4zM}IUܴ *l/^*< s_=3ڰmmԭbUZm-Xxt-cq2jnW cBC۟M݆xvUWXǞ=VH+ᆩcm`dk܇5=eMT &XͲb2,B[İ 6Fg9hqf]qlQ\Ǒx:iFK,tS ܀C 8 '1aDRGPFDhH$L ,$KciL0fTA < }gzOPUCk)TVP%nPTv4zH\^ Ŕמ-WwTqifQct/Sc6CܴP1#/EF`71$iBxPN7f@OF%ZI6Vk_ńT>Qgk'TWqyrb[#&vfb]N]ƞeLY=SY6TV5Ĕ¹IU6qVwɱE*ywF1wapfez;hI'}T>fnSQCf]QA_"#bl/"3,ҽoR}!Z۩Næ%(.ZKLF6v !ޤmRArWֲ&N-n* )GDTjHd ŧo ]􂱶-d7P'E)tJeef͚sDNviSҴz@4u:"e!և9LOպE7Z0,C^ކ lmX2q2"-d)P(̳H(_7>|İ#`-XzM,(gՏCSIL, !$ Ќ&n̮dKiA#`E&.8F#\k,~JV'Ԙ+D-Iۚ(5*d;\EZ$9YW|aS R J35qxB+%} ViHv-y2IZ=Gp1G;)42fq4 =א^YBpp]W*-HHV"hH[ V7;MPIS"7I@d$d䈁_ƒAH4.h ɒ'$z<bSEM}P>/F,aWyE3s:8ֺLa)]bi*Nr ;^Bԍ{Ӟ~+Nt&vV`gZ<p Yy'Viqh"4(&He _x>Ѐ8 hbPa0cc%vV8eLz˴!Cra:h 1Q&1(0KL1~&?%=!G m`XwIaC$Q ԘfP^%jHށF OJPS]{..̐AaJixe w2l1eENtn{谻8=Zq 2Ez1ِ&ĸDI ^@41m;a׶ kW{pVc0xkjԐ{Ɗ $;E(@AGQNp$D-Ie4Pil#o6qio!֧ZrXn>).q~~cz:v&0 |߶HV^_li-Q$2$[O]O+^S$yZ!Ҍ!jmT1#=sOxqihTuVk~K63x^39bF5iòFSuFx5#^UkDS;tG=ѧ޻gWxR55^="1ٳ7}:7| > F2PIKG-I od*F[;{Did/ADصstA:c'Hq|y%58/([ڹ`F+:CPEՕ\2xu('s.-dKGI0s.0UGvrnKiG;FHB6ŏjGb-ō%LqȇDT!9`Ta+ 8Qx} l w` | v<^b?z?0 w3SA@4ʰpkew7/rq7[K< ~ۼR1M<*!%Nk]t2)M7t&N$NFtvS(ogȒ&@AfkUr!BX6jt(3?.EAleRZ!kOJRy)8EWNNʨ&6Fdrlql殸:!?QC U9I "n*1ci<vl£ !ݚ>})q0m0 ܽPb4Q 4B U2T1tl]%1C"iQBeD\4~X`n͂SZrHkGFXfHY+57Yt1Qw'}0v(&p*Q{b.C8&EW[ܽG9j ogؤR}эn#侒qF&b&n~ȍt11*0pQ,Qo_=}EGB/Zĉ &P51@RH%MDdЌFRb8dZ9GM)-tPbEq/hSj.١/iB;dj}W\#sf pߛ!9zT>i0fo92"N(q`4i,ŐRb{+Zmbf 2b wP_uX\ *5h—i_<V^hͣ0iNXD)nV/@o24+P8ZBB(,3h0muۇ{M=~K>ScJFhQfe$؋H:ʯ!}2O*‹J4:D"k<4bD&IC̒Kv1bvbe> @PbvrI#mQLM74e$id® 3 QKJZq%V,)0žK1Y؊(8ګ* WMGR49( ࠌU4K/ҤQnI9ZZLv&O8B/jhB exI.B4 dO=iE5Kpe`[Fb۬ T7KQ8l(T`B&2 : NkLebCLaL(9zۨ2 Ep4{ћdd).ЈASBz*ErZI2 ‰> f+@`W 7 CC%Y-˼m7kUS<Р an Bލ^+ ڋGzHNK :(je O; ֦ bXgp;) nș01BLa2k Y~P($p19 bӟܧ?9 UZFJƅ-t5 uȨ$!ԢXD ?& emmo(!2qchLe75qH>'PE7dL^t2X%3IXe5)#D{ W8IXv!ׇLPo|yuc] >GPҪŻd* _Ad֣%F*Od5(̌upc :,7pLj Ge`]LbŲyyk@>DX_g 0r^d80za]AEH!a>+]L7$x9(ˆ6KL242lM ׽JԣM2p.FPb"NĪ`iEB$E=_QHh_ >hf1Wri.|߇@c1zV""^,HxVnB &UIF^d.y1DrV ^CM* G^.JQLDly n^9|o0> EhZ$@$&IV;@Hé _ttlcӧFuCҴO' G'jɀ+˒ao<"e#z_UKUΐk6jk1]FсsN`)~:TJ Y\J,IHԂ!T.&C A⺝jRM&~57dkౢDEB!jf:϶A d>s|>9D`F1Oh}z.)7mr\/Եu6D!b}G5KiG}]Zț欨M39*{s>/#<&!,ʥx5WdU储#Fofr1<(X Uj*^;!YQz1b0!$HS`'Y*T=: F_*;Y8 fQH#y9sGen~<̹AAȐWGMIUb Q4x p*/qd7Xr!RX"r1x a ՠ /d;Đ x` Z>2ָpr1"$d)Y JK=A8q$&ޓ=I$ìR+Yâ/>{`#u9 }Є"LMDLLDLNܯB(" S pbA=@3 5NL/R) _F/^LLX* ڥ1 G$߰<ècT@&Dd 尫$m"Tcyl4+JR8J;I`-Fcr|3""$$@@1$!,|&&˻> Y; (ɶeۇ8@ڇLDġ,Db!D4?C?CӇD?`(icy( 4),""`d_W#J⫵; IP`>E&}pA8c>:*C r 1r1{" *k,Þ[u8<8f٠b+ka>S B2 2 'a6xrt [6i(o)Pb 9DM78OM|OMx.RUkr$"@Pe"c _ mhQ ͢J@8u%lIuYF\?¬H*SGC>\:њa6c b?x\ @QJQ:=H+h0zM9+ aG8Ўмa.dJ༘  c KJٲK2K04)!h7PIxON̈́L}Qկp(V]#+2Z&ى )M abU@0( 925kĐdHƨp:ExFXFD,B\;壌*Q26Q,{߉~Cxqz,$Sh$έ&\}eb,'SW 7 sc1 1¦B6xXJϼ0 JH#ёz 2YHˈlq{ +&ywkP",J5[PɄeX"Pc&b5 {r41)B$BS:(3Kb;?Q8 RSbc†H>d?B#'Kɚ*>4db 4{" P]D,ꉺ`X04SOɎz9ʯhT+CGLa[\\88 @6uY![m&L_ZN. ܃Cua]8\6d$.g a$_9|Q-A|0 cT} @Je77.5cc"(HAe͘SWs+A⇋SUe ȁ߳2h8 #0eTXV6`RU s?3԰ ɥ&XlҮlHL H Y)†4ǣvYp ֠*xe9ڟ)1(92]dk&`XQS)ێ&Mb=,Q l~#$ظY4#- =Depz nzP6nVvX er, lM7iZ (E,b/P # x. ?q އ`#0y AEH.0yȁd7eop ?p麆Tί7H:A0]bƲj g6Syne>ymaJ1^c#e;#+|>$2V<#%L[c+ֵُ$~Βg6%ѶV6vV&"" ;l6+,ͷ ו‘3(H138Z"nz^Jފ.Q']G>.KV1YvӺ_'5x HěV]p ȇ-@iIc_B  aPde?ʉpE\k'c69k2>b"aun *7g8p+ HW2+e@r[0h=巎!z\V͘n$\,Lxp_VIVaX;Hz(zTzb󮷻v*/%bT{(IZ6"S x7{niFhjfG-pPX|y0ByȟHf|@P_^6%>9=í`31@\_y}ٺCy/bw{܍ī \BhV2Y1PyY޸ M" .Û=HX|y2`f%F*ƥx[f4{W>ٓ&m)èP]}'UPh)[e}p@dG3sSg}JO2)F״>Mtb4#ʕe5FM P1Qm-ܸrEC1b|LL7 eG,X & 9e>.eoKqPr*<ͻF瓑uޘhI96P`Ggphe۸ 1keTVi*,֭];"Jc|ǣƎ|C9dHX`S@TQTq' ySsbIy%VhtQ4!䜇)ճADAb%_ULHIQeTVW9uR%5LSG}ُ>WI!i&XXJ=uSJm8J\~XQFЂ]T!&bCyGMI2*LL(cs22cH)%^FUGn ֌YuT7&)u1hrVsvN21LGJ 2(2j>FL6 [vm 3i0rq5[Y 3;@m3ںvm[vٿ ZQUFQ}F2̩PQZqax9w2ɣA!BPYTd FEc@yQJ%sYGq9CU=JLnW_ =D!}|TSe%Xcb}F&xG{s>VMERODGǽzA_T1aVz|P 3 %P4 豘FKDRK(`.萞n:UuW`3_GXV 'WWZbP+~0n!k[|V?,2Bm r"ƙfqu:G"Hϓ>vo?~R̀zK4*U`N2GT$BfwU)A\R! )>1±@d1m$/2X{!`[R<.鋄ȲElrP3dIc 񜮨*ʙG+;=T A VA2ɦ(ZAu= wARD{b;aY.D0(bǚC(%A& ,lP c($ !:Pt,$# ˘I~A?9、?sax^HDIaMh-nb%k<)V>$@000nQ8/a\˭! 0%pn7}]_E[1]_FةKLU( a R<6Tqs趵r#cbPSn>$x(4!!0e8mUX7LD bʸwH IQ#A +|jűk>ٔ7Fkām.-CE`VNn"Y="my:TZ]Æ.&}А4D} |,g:IDlgyGhtVeovM-{턷g/VhI{ R'X|t?<G; \u0gk˩4GQlb1}|) dHH Qc|L1b>)BNQXĠ1ɔj)B~ʙ(:Q,%Dyt~ߟV2'E JxXaTQ=t'<FE^S^ը]G Qytu܀/%]DAʮI240YM = z% Q$L FV[ȑ5LeU|H ^߼±9`YX $$i Eyܒ"ލ-\A@W`% Y͎1IM|h! JXkݟL漐`8AHDGP=Eyҗ؉ Țta-](>lUMY)AlQ9EgmE}#4iZ]5>٠&-`^-&;?*E=[8= ܆dzizY aTXܘFJP ؗ|"wXU U<eP keeU$ ̈́X4YUIE~I`UYb۴ETdIAǖ1!I;AW`R Y 2|Rr^%`r Y!`-aFbv+a%4?}ڟ`Vg~&h҅aq ߱YX۟LZyLx"!zGµEЬd`QBmzQ[HrOMHXΎ.Y#T=BUAżtEu (ETɕRD{l#^dl 0l<VFDX$rGZ n%5c`_R8nH DMUy[R܅&_$21a((5y d$d0j/+Vcz76ڢ >w4LM/g1٧J@+SlŹ E;ft`CnHE%IT$!dC0͸NI*aS,DQ-WXjڈEaA\ʦM.=.aQ(И;W]fXZQ EXZfHKa!0$jNBf°qDgA8WVS#iy16k+)e]`V&ik#gME'ZO~+MyHF޾ TX潈՘rȖt> B`؜ITDd:"D)tvI~(,x hyMXaRT`L HEP uL[ el^/L$$N$QΒUE[|ތ`1YV+[00 &LAT/ENXm"F[I n>E% 1 A@]lXn~Y^WܘATFf+эQRqOH$)D!*rU5j ƙH[%wlH1*{B\Pp6VQ-)GМ؈ဉ^0H~HǤA(R(݅0mzr(oTnqjx(JU"шk#1@5Sa00Z<bDy؛SZ2KH$GDf.iP^Z扠G־2'` mfX%y[HHmՒee"s)YLSNXI)QaX$wLĜCS!yFamFv03α ͝jUQ@!uEDq .|l%8k*o"UՑqxTU^YK!*PhzIeB4~ =n2oNK 0q yz[Ҙܔ{ҬZeSǨn5d=H`5|:h,D43짋\IՇ`pZ.2=PÕPF"X̙W1vdlj"U8&-]BQDHpEHԐxuUQS,RmF]*N_ &-m6H-i}Ξ\\j ݳHu4^²1֦ 9( ;wgljBy[ahvfu.GǖNDL ~ǒJxPβǘj4_ ѬXPŕbřᇇՅVwu9m|վLTO<]jVjѐ(+~3/wcƸ&QhK՗7ڠZVR۩)σ݆rtlh_ cUB4 I$,HݕkTHGt&Ti A瓉*13dQhN($bPs|!KC=S`eh6Rf:@ЋO`h-#8}PCA'-4i>f4pbFꢩ/%ͤǏ'lYo@e AS>ʖEC jٛ}b$AUU^EM}?䲘?Ej'BTodF!QC&я\F-@ȮV/EHo E򓘰la0* UĢ#]';cAG2!-<.e =.KDx qei 5M&h"oPC&XELe x&"-_2ؾ"FcDf;nV#cI(1n$,"r$d"yPn"}c ˇrNc$39SґLeP@2[_d xd| `ض!zk>ɞ=K;2c5# &ηd'D@qS5KE!4V8$$s BƝx):VPGɈ!5!pAF'#I:3#@,QQtD洨DnHA5 9wԥ`)y_Y_&d0}d AAe@CM0.VBb&uh pLUh$oTŕH%_|w0{ЄΘ% rx`1 EB Q?=`Kn".Z8g(*Q0PfYPhƺK³sdž,lI/OaDAD)=]bla Ucw8Zp9ĪыU_\ DVDh a[-O5T6PZRm/9DN9~#[XFV>vGc Y)AiN,d92D2 2Iڊ٤D7l2sqpt=Ir#LdyOxô,~ˣ*:~E(A颙[JUѻ DrڊAR)I0c)M U9ldJ2Ƿh(͙Yo'i)bae"6#.{Zwy*IaNUSK$Y.m#\;ހ17c[Aq<aeN^(&4{# &Q܍(OPI[ ɓY-A<1)f.&sRkiCˆ|i#̈́e\/HP_2NqR/% ;D 7ReMm:Guc(MTC_VmeW"[:hzۤC tmA뎶t[M|~ /Ø޻9E>͠4 PdBLeR7 <"$[P dGo 纯_7" 6c)ʅ.>6¿Ř֖xǿh"I["@ExgX&#ސvMH\K9i J._4&B&B- JH8d뗔Cn@F=n&j!b(Rĝ룴džذL}X+ /:9`#m$ .lk~ ~5p.NG A4 bګQte"@2#wCP#L LKuAsp`H'b\! !O"Œ}0pCFr089gK^`(=JkP'VHcJn xdi%HdD"g$~I!&P&^8ƞE-އGpB9` "Dx ',&ł$b0( EB0o@b8AZ.…ԣ]BE:&%_h@A AFv/)18tn@p(R)9d)O n' D &jl*%S&BX2 sPb.5VA205:& LXz (zm%D[%l&!-lH<h;%$ h@Nx0bf Ax _T͠FsBx2f#c-&#h83 -(i5R.L/,ϵ-?dd@x::[B:;b9䥚fAi%!N-R)--Mm.NE.,0+rd~o4!)92BN03521mER!K0Ut5:Y8I .#V&BDx 2C^lAr lBH&87J]e,>M&d-4B$j~ *#} "3e8r5EnE!֣$ ;y2f澒K*" Q /,/"*j'9Ǥ$$x=d|1>Fm>ʄg1 HuTM5TGTOUb+c+*# ګ6I"o2Aڲ2anVYuSp0 '`oN2`E;?}ڧҨD6YDC^\WxӁ H G#-v~sBIQV";oRN;F$3ƷjO)h.jB}:rdbVoBhv\fICZ/eb(6?†TSUhDUh_:B4&Q.gD.:Q,-ACeC=5m4, KDU6櫾?#V3AfhulPqKP''K EʔWtK՜!r'yīGv: bD0Yn"6cJfmLǐF.nGҩ 58~! ;@e8fK-c'gSb>("N!)xO|!|RC 4cb.$(ٗNh6RuӲ%*2Y2ֶVWH!X'A#L,Dc캇ǃ|fJ,I 1Fe`ME+F2HW66XV>se"c e'w;N/JbcJ2 J(~E~f.EGZC9C-y hB44g-6|!|y }8x;V``e,4lMql1ʀ9ym; FR Pdxy#%KA=FBK\:O;+dc]xu`3ּ*2&82oKE|Kq,;ϝDi-d\X>Q#%w~C&""nfeDQkT$ L8, h m YB+",3~Lb1tN<ԏ:9d1j)n'v(=j0M>8yEhcbЈae+x BK .v#\ ,_z3 HJ[3͔/h5)}Ӿ8Wݫ tnNn\Pv.~M؄Q;x ` a&hP '4&ף=@Gr'K|Ǵ9}OƘ'c4Ht.pz)|1';Ne5+n nIT祥e^[M<30;"<;%-Giyz`bY5Gc_cJŚ 櫅woIX2A?O7%E;ӣ51hT|mB\f%\DY8;#gxLQnR?8z.|bfb;7f AOQquN F* ~^ dzŵ(33gj.e͵,pGE.8)JTܺE@)T DGV@tE|}c݊ڭ=EpRJj["V C )3!b1DzZGYI:F\?d9/-fgc%r٠Zk9^u戒%Ȕ|Ywgb ILL:|1ĉ+Z0@eE51@ISϞhI(m_L-sL429FW/JiD]2> lTڲzm6Tʟ˖ʔQiΜQ5+}]R>-FgצOAb][-ޛ6sʑc=}^Ur1@< 2)p1a]v^eG +hu٪Ye4.A$e$nhp{2*7^'MNE.<:e˔R1ۧ`FI^_qD>hS4iIHMh$@ b C&(HRHP(M9C2Hc6RaiI=&jdMLT1Na3W5}UsxWRnZ]q$i\D\tETKfe7m^oobA-ᵖL+$ם@Ejq`la7UQUYh6wQYWposɆj5jhl69\Je;%gŜO2N5gvH2VZQj(ۛ@s-{s_e`e fեEjvH%qc I 8$ʄF&#Έ[Dch"=SoO\cHwݤGtV̅MpI.4vS]L&c^ &\V\0֜ٚ@Wue})'fR̬nv꟧EoR>TiPjR~Yب Mڛn~b6 䙬kloI\K+:t%Wf'̓ NG!Wi:E<ꧏE$4sm$P$\246\Y",eMYEefe. "U+9Y BU<мJjbR c!^)Ra\V7)M?QE#KQgPe0юL{0K* cS(l:ThQZM:G&Z"=eíʐ+\׷*rM*t-@f|΄mm8.ep:ap\ haL恸[S>!(\By8NIBO,VEn8+S7N7 N<|q3oq3t3Bmx<'_yw`w~Awo',2P]-KFTYH}/?(y.'{vR\$xe.}4+D+`8Y2,3kVeF(!3U>f4GSG-G Đ 8 xd H ^$r;Q#'X_&6WddƂQY3W:m+X(8u@$,j!RFCԃWQPL]`Dl'loxg;*7w&B%WCz@)A48ȑ ]S2,!+z  _mvl8*a-sw/QGcGZ$Q,,<#2H$%Soa^e,8U*9>&S!Hl @&Z p,%j6w9.`6ex.Sgc.ט(!2 Γ\E:!'802 6`n^! !?C[VZ[$uihP4>blg!CECAڡ$26aTXF*'r1T0+Y6)QleC= x"iBaw(,Jd%^$X8#l+mj2nRA3B|Z]H819U|,btabc-{ҡ +X,9+&q.p $J0J ug"'Jea 5}2eVԀY6ws6p < ,3lj=A\t@X4); S&R+;i31R6 &#݊1ѓ*OsAO^1iP'cQr1^F " uI;6CaTd#+5F xQq+ª@379 9:aT{hU*LeTFh49ӂyTb!\p\a{Z …m53E .xˣn=7A 8 Ck|˻7c61@sj@B!*9(6D|mQMB*XFLwUh9QY4.=)5aO 3,)1i&"i9j'CΡ2إ& Gё,bA9H)( 8f'F1Dlb[Dk. Cx=da[A=l3_1 s2t<7R  83ۻYL!p(!kq1ͫSnzuW\ACR6sx>I=ꄒGzw^9dE$șrO[dTT" FSeia4A) M[QF^}S̺5qb7}tT9!1U'23x\+C9Qi=3nR-_?{.]cKX%`*Lk羄*VATG}h4O&R,bABƇcSHʰ&ͶO1%LG-`t;!+ +?&[[Q1&*`ux{6C+7ACŕ/e#1?pP ;pY[Z뺎Scw#t*6JW4M+'}.a_А52wʜZ*LPu8#)d$Yۯ'ik-T5 $2'T%K ]fB]"jDDa Ze2rch[Vi,mi!SB!uZ0&RSŦ ^*k86ΌFULkʵUU (G}SIU١c- 7Ӱh~lڅH}JԪFJ֪eqrJyaSJ'd.]FUa-3c&th.\+>~>{ԅ>mh‘Җ)LD^ #۞F5"m24arLdMoثܫI*+"K#0J$԰B %d2pdeb$ 2)e/PfFyqGjF[rH"'Ih ņP#M0!L)@ݸ!<,(\ ʉ8 ,J)4-?J.sJ(3+(,"pȞ304,вn 8{HƊ5rIhd6:kn'JhMK25{ xnnxfRJTr a(ă={叉^&K, U#I#S\I(-,R<`n!IHa76Xҏ)EHA)EM~hyƓolǓCz鳏^O2,[4 hPRęa$-D$/R G#L@$e!HF@Ѩ&CُX( R4%)I aXI,;KB&ՉK!V]`4j#u8 9VDCMsY TW='w B6j! ja&FY)3CLT\Ps>"VkD2D#>-伃۔pv >cGmFmLbԆpWЂ =4gJu[ʕ<+Vϙ2 UyJ<7ˆ<=Oz҃@R%V(F>4[.V1))C iH29IC 9H`x`!;ю2EGQ{2PkR6h3$Oj$ps;[D:QoLH0F5XDgؖ3pI!KTD BšLhDŠONJ(20 Ac K\"0E5LU]f(z(揩=Q;i K%mTd i#BmI#sb*&XUbT[؉ 'Jy`;Uv+]V?bQerJr"؁v!F%0->@ hDBƢ! H24!{ Y3h9m#2sHxOMNNT\Ԭ-T؜P%LoM[1*5_YVkPi2 /,dR>  E0q1CiAL9#ԧM}Үn\ ;Xv'僋acˈ:JuK@ 7lg+PT =|b ?F-[ zm3Ztfg$MN$5ohVU#M'NRl=2V.vPx ՞șS6I\ں8![} ﯵ=2-MP`kUY)<[uJ7& a"6bM{Kp@`0p1iRPHb-ЄPH MxE@50ā[ Hӈ[a)Q6ٙ倉HIc+"Żk  "I<|ʲHћXٓYq'!P#HȼK&J6ШB'!ۣ /}65 unAmْ@и'䳝 U 5 [+eE00`E-EX\F\ \\E_D(I,qV,zB y{@܇2B3Q ɹ09hXKyJ3@[8aPXE3e|ԁ y F-GAH}@7Ġ y*tٛB 겵.,ꊶ!(;)>R+R>8L :,㫜h%΅?Mx4.d1`X0N8J̄1 Gd܄HtTD4E1`qFƋ .5HRQp/2ѩl P.BI/a"a˓/qƮѼ tH]E5~50ܛҼ!j ;" ZAְGۃ ﰒwR8Q{ aI0x>yR;背RX،5LXXZ{!i`jA94eczb@3`e+9޴dNDe8eNHp*3;X 'Q P'4x K }Ӱsو}qV'k5zu!%YiBR0,V\~ k֥ոJثQ~U0V(g!DI[[P$,َΈ ͈ARU4$Vl;;`^m^}*$G- (ʒK3&;}ה` 0SԀ4NDTz~\[|d`{ǁe孭S}bK!#>QJ$ϻMlK6--L(pePRJqV C+CZ2ECCAUSW- M#0c}@cϧj 34@u=cB l !HRXJච`Mj}+쵗ŏuϟ4EC5剩(h:`81MȄzJي03p봎HK FiԅNQ-T%x 'ͨ%r)'Jck Q¯*(PiV\9Z("et"J(tI('ԘBWTФa˜' ;]O+=h -V78ɢ {ѧQ!) k1&j.j[ø0QkPSي|MhQ|cLYֺa:}HVI]U 9;he*|.DZ!ֿ͎ͮ=A"(I5Bܴs2ƺ͈ r'0DS=hN7ki(Ɗ69LCB"u=YhPP݊ %PQpC 4y5 6mMT֬l~:!|;I :A4:0xT4&'$m}pa'yBK66N7K?)Ƶ(Z#}r4<=.WDB[54m֐;Puͥcb#bIU/YގzQ݁0~݈x]GpH{`$J \Q– X6MDOtE_tFWhL񅛾<$RRoh(岽FbɄaY) LP8RX)#mb 1 qJelݐzBˋ$6aQ"*/ Ay܋d U.̵ (ڼ֨5IA/ݸ0 σz[X0}-Q ,rmuJf<bC3R2W@)DŽ6Hهa^ g_'G("B`%\\d6eT>U@}۟[Cu:ڒ bqm f#s].ZZw$ɵt5.\l'@CI,/նhXrh9n"Q#pUiOIDJ$/qSn("̡ GO2zoicDf+F~~'gF =QTV=g6Ǘ֤ߛ+p gͺo  :~wSMBz طo>-OA'Mb4)$-bz<;cUdaɎ_^\ 6^pȝ2qfɋ6+FyReR P`Ћ*ԛ7W<鐠@N} ibhRp=ÏP@b#S&eadB| D  n)oV pRI Ӡ#G_Ad] {j(iLrU^Đau2 AC1GSyYQH=BDL_)H"RF4O*]'Td)K'uPD%MRESu?tU{*AIv=6VY[ YDDqi4{Tz(`f|EtMVOcUPX>jЌh`<Mcdk鴏ŰX4& Ā+*l $kC%gF;xYBUV袀$+$Ő7pC&(#F^(7ᅠ\&50 w& ? c,"}q^ziԈ(E%y!2 YZ(գTzMeSQW9WG#5K0SWBvP\Y S=mTe_YIcb)J-4]\ֶ^dYa(vg|)YjqUO_j}24Ѱ0, m*N-p,vSYyPTPuB=QM詗q[os$oJcۃX=dݤ"-rH nsfSSWLNU?ǿe]dUb'Q ԕi7-l~Đ[$j v2YFftjS|hT\gP#){07&à0* %m\B4xt1iJܐ.*@a1 $23̢=NܦI!1k0 x֩먂"NDŃTt{A/dB$>v1P(2$6kYR ihQz2'iDdFsܬ-;yIHhvt!ZcY"T:QGeJ%g*m[@uN) i6( w>Qtc'qKLE(Fj"NUjU|U ] \hf^*eiвDs|Ţ6Jf茌 >7t9`TNTxCvSħu҈vY㕏!b^&ndbкU b5Zm}QoEj&eѶP) Sz4I2#Uf5BX#MFQ @m(8i&R< r(@1Kxbˡ9.,6ṣ ꐶA*.!:љ`*/dTECғ sPFME4k@xm"Q: jp+|Q8(-7=AbxUw]z ;4\NBS}uAdUn22(c40+u](.m4Բ=SZ+KܟCC'k/eCʐ=%i?E-2IʦɴVxs_ƤT B2("qJ7K ^BKlo!w O(hѳ]4 $a(41ֻ^IW o2A^;a4]Ex2@ESm1ً)Cj,Uxe8T%@lmlcWSX]WmF6hŒ-K=["S%ZRd\u1L\%Oyw'8oma,kYcRG0nO9KsYN $bDڬ*YEnAQ$2.$|>܊t)D$7Jk`ސp&1Jz0Ӏ S5 MvSQ ߡ5\]y "k}lQ:/lD<Đ4 &nwGx$ᲾAHٳge=ף,XȉQ#8pH_u+]m5˔GFғ[r;>Rw"@S%DeւDUe6ACmNe9Ov,nK뷶H$nZ! gLȪi!jw3:GT-z~^ uVASèN Lx }@ ˰)A:0h] jHNlX$őlUYPƭ uTỹ {\c6:(B6#6cY,¿h,p1)LA,PI!eT!-@ YXĕE`!PH|ۏ/e])I \dx9S H+Ɍ\I 1aF?FAE;i]Dn0D@k5 Z!C@bj4F_k|;_H&1»''eXb'~PuѢ Z`ī1Mxy$U 2UZTep x |l<ă=00 ``u7ʇ75r)X"c{x#hGirR|V6ۋALftЉY֙,_TȄK!NR@ VMXAy۰+ !fS;uSn-ӟ9XayH䦸EeFJUE\Sk1B=h8NDT>ERF4MvC(ށ)BB)|(zB((uL~[9LTVt 2R0eB= a ;G&H=%A,<`@ DB hb>lA 8~iẼ@C˜ƀ i({i~i)i4 g2jȒ>0B(\±#:jTߩA dXt8 " 2Q8MfSLGᚹYjɓVx Ebhs19)F$ ĬCVtaN_kIV Th(Z,(h(AY)D`=K2GQIA<$JO"&=ռ${C@ @$ă<z̩67!ܩfXc K;L>9vڒ㛒ٮ`-rFC>if:jC;_UY q=D\ЉqƱLX uoZ 8y梒 iET*4nwbDY^杖qDnPEteԼ'FK@=}̦D<}h\_sшD=DDakQeDj0א\Jl@pyulII{8xV/Ñ6X1]h(2$9Dd.Kd @C<C!I! ! p/tm6)v76 F{-W*<.Σ}JMCM1G/:E6I!o'xx#s#nJ+bUU^Е.:rNAͽT_5qTD1F^8-yP(SFeC_=UtYFBaDd Ƅ3k4Ÿh/jgh9hy9I S&גCUH:)Ǒa3D&0 H 43&8nZcXj4_t.49.4^b*t{C:WFGC\mzʀLYܴC6XTjb.mȪan$V(ɑS(ahYXo%S[]eMP\Ux\1ZZ@VuQpEKoKE^^p(Z]Js)CybHk]Qթ`sa=l !gDe^ aM-2 ||ɖEdX^WG`0iAU.iԃȀ@Mj7u0I" 0>Jݻiz/B @:xcoog1i**݃+ xUOJVIGk?ĴnTU vܒ J24iMռ2neֶbh]1lC孇CE2Ѥ]|ě:̽֟Yi Ҳ] >-jNCU1B4T( baÈыOپzHƌ,8ō62KhMiRhPC5:gL1p0IٍIo t}făA'LȒz|\.uBq9Et۷H?b;Ϝ1@,K퓦4YYzLQ_VWs^=z֨ϬSgڥ_+-;VL#̛7jVYK^}2S>h9u?/o}L7&HѤ&kϞhϷW|JUΆo)}3 0 > |̧왏2r#{:RPB@4,ТI e/&3M eYed7z  c-3\;r42n6C2J}Hcva2J4S(Pfȡ:';2:e}*&ͦB*-2bPC' 3K>bC>Rhgu.~ٕ^5Q r _Q3KbaU ),p 4BhdqP&LbfMbCfoٯ*C &(a5גugWV[SKjAb!I CөaIE~;= Vc6vhld,X"EҋKhrda*a˄rK^2C< ش$)T;3&N7a2´)7 mİ8Yγ`jZUI|L…98&O\ 4ŋ +),T4Tƴ%Ѝ:kJ cl5 eڔBX4bp6rHF)ר\$dPcɶe?A(}C`LG)(b`59ǑTD| Y*42ENShEYպSlUۺMifQ/^:fGi4Ml$ 6C3}m;`XwHtfh5f 2$Ʃ'ָyIIeaZ+ :8()%]Hٌ^ 9yϦD<)${3-pE]Y!FVbcĜW4v,"Ǘj'b~IybG mK@Vh"y2eB H2jVUEO'&H(8at$qF@Y M)ch)]rٶӲ9NTUPsv8 N:yVq;.@C՛l-ɱ̎Z5Ǽ%LURp 39̸0[AU8zйrjvJ8a*"lL;jPEݶ1=P AQBԟ.(L|Z|dhFcw9&(m& v/2l ;6%.DBє(*`[mo4bfN0!TeGn$mO:nc™߄C1%ɭʨm ,Vqmmy4\? vy=dk1Y4sK%)|5 m>cw"r K.M&0P5 0HhIKKYwx(Ѵ&pƈ2- ##x6ԚRCWf܂6" DIH$R8rYuq4RV%L39J&s{؎DQC$t[}xg)tJyaz'!Ҧ)yȵKT|S'%VMDDddy$ހ!ŝ$3+ET8c͟5 eA `/nS-6O|:K r 26hK(ÅzfV f; ̱TkِEB.#hY$;;΅yc]>j#2 kИad}tNxiA1 h'$#rnԁzcA(*iBb$cF/ (nR((r(%*%@:d.p$0ZGi5T YlڪmkmE r-` €r&n_k;h̺J \\b _/p + r8Ƕ:HzCCpM# yu"pfC@@g2Ґ3 $h-%&O.I,$FJ G,Bn$AM` A=ӓ=<3 4!4fnNJDo٪nfFb''(t.3.XAD 0XŇoǟ܅sαscs$ҹi)t 4OoDogI٤>QFi%6H2dj'&ĐX$>p,M7O@&a'xa9˃w=Lw&g@N1qC8K#Y G:%GGQQ!R%RI &P,5i<#'-], K)4N,dBB Br-@RCU+"S}@ TQ>~%xfCdLc1e +ZHXPTPWR Ɉ4pI2snhĭY 2 IJ1A8tRT ~,-]oAyT<< 22`>+U /UT<&Th>|R&jH@$#b~a; \/2HdՆ/ V:O,x$T3FD$IWeemB y[C4J zZzɢz\8p* ƈ@P]lk!M.MV]W}_x#mQvt'vQ"tmy YZB(rQᚷ." xtA[{%x%AvdвhT%a2{EU41 3(\c11:J* { *n 2?J-p{1;D =T dT\$>a;]&&搳@xzM[sŎLUH"xpT pV3#̍YffA ! &À*\1'\ I;3q&"'ұ4pL)lletdDTWvkzkX-ֲ!o p.B[.<@..Bky!偯 m[ ݉?,0Aؐ`vL\,]6RF5ɸ [Ⱥ1KIq7/ZA2 xC#Z5nh/Gw;BX#琚Mp#3'@F]檩rGTdgQv 4.i~`MMJ Cp,۬xFɑPqE~:&˃"kW= v! Ŗ.vwA $a.bƠ-!be'%u ``hjR 2al6Iǎ sVE # HI720 3Pt@|j'KZB'iG5̻\ٴFܯ@ãh=8_K?#z['@%\D7DDLЇ , P][,3]CYk "Rkàk]C amخʳ\qbwmɖc"8W4BIT]uN+X7!Zt1ռoV15sq%bq][ VO>} ܧl_=hIeEQ_4i jf@$}g%L)Qɚd)ƈ ~PZ 9Ҡċ1-3X/Ci۷SjԆ my0>5rtmY]eJ} L8$ĄӦ-QcUÌBt| ed1O}FM M{MӨ99 י&)&ͤԸE f_Ea8jXsP\g<."5gc. ΡudhOq5]x`\)n{C^=R Qdhix{GHDDBiMEW ecVVAtIVc%YUEhE@ %cRmqX4fmGkG=G ,E` ZDSh}$:(WsaD^yA(ЏĔ!"e8c^i.C'=W1YAXLF+L#R.VU294DPW&I9)2[ՙ>7L/ ]mMr5QDFHmeR^nD~BV AL]kGL]ЈW?;!{㞆it}!(s 96FϔggC&fӃ_oVDQl>ڑy/?ieC" ^&CZHC R< 9"*ZF 5EJr)EJmCy\ʓA(PG fB#MPұ6# aZ(9+0FaHQN'ɚP 5$!n(1DL1D>d+*ڊ %mRSèRzjTM;w?p"LCf‚!1/P4ÈϢ6#(| j` Y՚疂*?<`bN`d"aNķT ˨\8vj#4pCP;0UPD9L㌆C )\GCSz\=i"[:P-rhXJ׺%41˅N&e-es9"R5%0)K:$01ʋ) H }\ 1嵳Ej Le# "Ir( p!xDv֥H~i4$\tFg*$%EF'r#zZ f&Ҫ@z.ԓHh*f\FշI^;f 舛R(LS pQjT* /(!6k(+zvuj0= [0 2ef(NqiVecP. PfK(LC,R\O)KJm(R8ƣD0YE!yao)dsҍLJ$G%TЙDOXZ8M< q!N.r׶I5Mjܐ)ho9դҺE`Ԥ5BM"z@0<4@p͑!]K87c&M cazj[{ad=B=oY 2ی mD]4y(]h&z\{phDn1CG7Y( ۘP:4TFg!U4p0)I ou! $WIM7 W⨜pe(Pi{3RIrtƧj/15 ; bT{qV Rp0u W]j:)P)p)s0fGmܒ<][dcDbd"Ox*U\a!Rb *MHC 90#np3O(h~du0All$ZCa"sRP-BrK-ȴ0-?D6q8Fx MOpv%6(RdƷ)h~ՒD ڄr)44\/RXI#DӼEX8 F+kpH6|XkfS@5 7a-sqĐ= VF=,؂+66;tWw=i CAApqHl|B)fEM)1)!1~'5ARC$_319֕ClRL|"X43fD$064FJA8ѠS&-ye!!ZzdQBLdH>r~5}53 ($gBN0QIs'@h#@FRs" qGh~@!^ ր f` +kw#TZ xwI&a b#&?O肇wx2a8rRq eUdG} 7_q\XD?^%s!OgvP(7:#!)bd-4i3cqGt@kcn1}eLsYwXd4ELE7d&lf@1!Lٔ62%=54I*2x T58A%^0i:QFyHYc$kIakkT:];V-l10-s=/?+jIxٖ{m-1?|Ky'?L@b77 PBW&cY}SjAIQPh8F6l^G'$76r˰sEuC757U6"U,E$%~IC2B}H7z\r91[{r]xB&oR'PtL.'c4F:3so[^#U#ecTH!UI;?0;;Hꨎ ;GNXV# VRiOaA}XTl(= b4H=Zm:{&&c,s%E9]2Yxb]C^4CIq_8s"!4*[]Xt8y5d#D4F%r3EZ ~qHYYi[5/7z X3r& R[ q |Ǘ^%0,+Cq]J'iP)j$$/ir3L_ z;C;ݢ{z``=uhX? =ց z,&l X 2MѪz9h7@ NMCF?#c/g=:5A(a1  ` YmHqIjQX~wY/~G(d~˪9HB<%8?S6-& bUPZ#TCqp8O#!"/U4H-bL4јuJEGtu7'( 7Z :hb(s%+[ l @p22_ _ @+t _' Í!nCERXt"s7yWV=AJcJ1aà p  %3d cRld%:"PJ@Be #aZhY/qYFZ#f)a7iQudrA~җ5Qd~Hˌ&Q\d;Esq#P12:d7S[];*QoE`Uup@]uF;f3rA6U{)YH+<4c#8Hꪹ 1 3 Z/q0Fԧԧ7i2(JBt÷]!1!/%3ZcߕDt82^1Be֊4췓]Zd)|."5eRcLD%(F#ÃYlQ)զÈ|N'g$2Ԝ!qJzC2E/O9LUh2oQ}uomY7uVV7`5sX"B53ۆ1}=:]V ~Ҍg  +  0aߨQq]1€j7$6&l3&!QA8~:ı&#!5™Nr9]5PO}YUQmH,|flLh™)7 7C7;'hfZ4ʼnp;'خZ1y޸T>UfNGe;Ais}5ac ثCDf`ړ K2i903`n 600P319 ΁ ~/3  >=4dz8g"dDUA0x'΂#4,wDs7X3Ӭs`7%5ts:4!,\sTl'';עa9KNh~}}C#d=@z t#k*JcݖTv0&#*Ov [mc[z֒G nPVhP렸A ap9 10+  %Pq  Aa>&9p] ^`뛐>Ѱ `QHxj6CK"8Xt|96b!~'y PA)g|;A grHd63H_Aby{:@b @\%N4AhEw}UHn@Ū8 HX!A]"yUhOt;`(U_]{q }p oPHN"oÃ+\UO@ DPa݈#F&bĤI3IF"j(bf!fF18&^cmg>FɈOX %ڼAS龟KEOiUSj4iV͞Ee[c4jbh>h)Ճ3^X/d s_Km\דOZР[fo=״!-:@e[{_8S8+.:6}dSF6Cmzd, .{0ѨSNFoԑGw9#GFgCp445J]uk7("ڈ6aFߤ/;z0B)?5ZS[!:`¼"e.TOUHXSXAڰ+Dy ӠvI kĒ)C3-S6gr-JK+e| 7e:T;%Wc#smZt+Ai60nڰ x5nmm ɠȥd%洇0 ^2Z)f 䍌^IlEhS}L _v#xaS[_+K`^/ʄ(61$3}ؐqaH`%v͉pXb5#ψGMx$!:j!.j]4@"8Ȅ&,WMA d0,@}€BsA},)0>䑃 sP 8H(FRр';FV-=<\7PdxIϼ([1ٯ~F@Df5 u$0@řzĵPY~I̺p9HS׿Cp] _)LcbҚOu2>NS(H "Rg ,tI(_bEl@`D$2% xɘ(JѦM.Bj I7A靅';Y/] @ɩXF0rm,bX `7=(I-uL!2B)[ Wa)E5ulJ00d+Ty#}z!4@1}LF}.~b5(![QLc}`+ pucC-.`cBwbs]s+ *? 1:ZK'kɦ9z bLFŒ,;̿0"yIh|*aLR2.4 K#`w]0(?C19b̄}!yO1JgT,ݲ4-Puǃhb,D9g '@ \dVfidQSAhY+r-L835qI p`&I^OޓuK6Qe\u;AfDiȆ%lí-ɖpfI}gv-k:&g5 2AZ] ==/A͜5j|(tc7 oͶg~c u1wx6iўvm;0"V[tx&^̽]D<>d.q!|&&Yg1spUѫ9 d"ٹdhljӗfr՘x6VW ȅ2HHn44! %J-%˙ NZz1]3iյoqc6F.RωB]E+1&n А܍T:%AC \BjNaVƬܳ lQ-n\Qϫz:Fbo;l[w=y0pv# I_ _ sj ʢ]9fzb@1&ct0# B&0C%r+rZ*vC;/2 h1𛋐!-43T#Ʋx8QL8cٍ.,}.9hgq1 bЖ{&+eqh? ɀ'q>ߨ!88#%HD"c DsE2"'yh0!J3к:.&)i(. E%K/ 3 2 mܪnܝ 4qA L%0Gh<iGSxACMфLȪK Ȇtȳ9 }0%ੁi Ybӏ0-@Ȩ127Ԡ`BuQKZ*SpB(zјÑ[&ZGsQA::(k0-!b !4*aOx<ʀʐi`p؛{0̈h7< rsxrk rc6078|ȁa ɄC7ׄȢaI}8hž|?"bʟЏ: ?.~Yh)&2FZB;:抒,Tʀ'S썫%pAX/ZA=|ZWâ1z0ٸ2bu Y[h\`Ds@Ŭ]̽%ThB<"3%؜18ڷ416a҆y'L>',h#JI,:a5 _ Oe & O *.U̘BJ;%䩿3 g횯!O ?(!/Ex H ^ ӨTUE; ͓ `!zxzh6 pkVmuV 'xLv ,y $z3 |2]iV랍灌i)ƎyO Ozg ڦ暟!+ATzQ:Z 8eD[fz jH͕ @ 8uW+*2fq"bb ohh[ \ḱ-Qph0oG[\eX0uR6B-1JPM#e8ƒHP؉C>2ȥ6%Ԁ` O%5,JQh^mNx0jڍU`eR 2f wM)t''J?4>]uYJꕘ>=-I4c7D@q5J^85KuI*¸"!][`Cݩ,]ǦaЄa fvaNNa) N}!HO,37/Leb[ae#)S/QIx\uҘ!x D{XZE茭,`%TliI-*ΚC D:hcyҸ2ᗫ6[|z 0ϰr_ڝh*`N1[(Eۅ9=Teε!),Xa8VfFf3쐾(dhK[KeR4ׁL-Q&fgZ -c~) ir593Ihz um@IhPL^7%LhhmI4Lu7-.v; [Bdi .H´=_ؠXەwA%9;uWkw`%m`^Ȅ^HI腶~kNIXkx=x*fK#ӈ,t=11%FJ lL[7U9U4m=j ӋA-\#q ^ɄxqZc53k! ` e䁠R鉨; 2Qy" pkIgpLh^pI^ap煈SDuZ* 6J)p63z*#ȄxHH{LHSN}XZJ)4RnG~S1gi>ݛD>(Sf8'4)pZ,0M ĐIm_ !fT LiẪ\ DI2oy33^ AUHj lAZtQ s(2*5\ YuzpZubZWzX=϶AB#҇Qӵn -"7t܈1ux{cq_J;0ȲYB!Va_SyÄQ^@[:/GuQڠ书kLY]v.]J'gbPwPDA~O[ e]Qhz~j*sr0)M;/~Zn)al:;_aZ8[wezZuzu[ڳ1U) d Y ]Pl8:Ⱥ҃x=c4O78{ 9H|X|r/`Ü9bb0^y푙>!:l4i; ^RotPv~PAQI @]'1*jo[ ݡ d.ͨWҘz#X0ZAh-F!Bz|>.-!A},Yܧ楚4fҬi&Μ:wʜy`8bd,LI=w2-݃ Ht^P+V<.gɲmғ=)&f̕O.pÔ+&m`4{KhXNFhGkPqȗOwb㽝gJTteOslfݸw ]ZH)iO˽7GN聓 WLd}.[KF bه/ 1DadD_@ s&Q,)'=#=FX_RG4ZvQHOO At$H&rRi)dFz]$iHASDwݥ[UT did41a%n C,`R>\`C 쓏 g q3Oi(I[ĀZiE(>*a ʨ}E 2R&MA(e1$|ɍ4$EB3CafXP9obM)E+H~f!TpE`!$Mn7k\s1wsd+٩:$MKE֞: Mu\vb;sT⌝֙peomd@ },wG8di|&& DI AԐ="ˣ>="BɴFQV3a5]smuCOFQ?/r_FoBfу=S> DMfu JSD9  pI<9DNf]l>X.CM9>ưɡjmn.GQPodK2uسѤam;저0(a|r؛aAC>ZtY$corJ2#@8 slZy0'eXv08e6g"f7 :c2huC+j$ # X/0 0Y[ C6P4dbu.0B,nQo`%Qd,B 2 2$ jea)A 1oX(Pp30 p CmSߠ[27enqv]no]BIQv R75ov]Ruw]6no{]-xq;PM$F x fpT!`IH1y@Fzvp90Ybr' M)ec ҥ/.&@XAIdheC2-j˙tn4>X[*j1 1EDW d~3,9ӹv~k#*={f$&[(RP\D[R1*žj91i>c8'p}߽/pkyxw}ȋw6'nc?#~<sK4pt&XRC-Ι3%l N`Kf{/}`v!ңKݤ>0 /~??ӯG/?` MX pՙp ,:SlE&B Π ޠ  !!&!.6!>F!NV j ZjB#a@ Zę& ˂AI E1}"!\^y &E"U!*5#Vb"!1bȕᡞ$^vr"0 $El .ZIޤDJ80#11#2}~I-]2Fc, 4J#6f6n#7v-\m7cJK;#<ƣDfFn$G _WGfRlDG@$KK, @H<¤<`D$PPe.)(W NF4 KSN%UVeD=MRY; ,Oz%YYJ#U&Je2VR2[֥]eŕ PC^FHie`&b&mQ(1:MHTJ&fffBRPlI fL ta&ka.#܀_&>f4L \moR^jߨoN߫q6s%Md"#(C W=g9 Ioj'xDv0 _֦xEDJА+ƀ0M$(Hd+f*4j^k Dޥ~&DihF윊HxgN,Ⱥ2&jĂDjȶW)0걮)\AԬlP16(K~,&mPVrɫA+n",*-ֶn bj{FDmC-G¬vI"̫mI pi^`-qI-"\m"m>@ٙ,sڪ |:.nn<.+ "i2H,n7lP8k2҄EIޮ7+nj /`FnI_ߖ馵D-Vdhy~nmsŠ.>o B`OA..2mSoSRop0p0?C0KGOW0okw͡%M000 p 0 װ 0 ߰0ϰp01'1#/q7 Vvf vi J1pȝq26(ƀױS͏>*8[S*5!kn{PH0:q$#$_2&!K,x#kr!2$S2L "'1Q!CP'Атak{..O\/ r3-gD.3rD\ID_L317 g`0G8m28 qE6s373% 35-s2;=S#730s<@32c24/7'4<3C3=sDAr;Cs?sF5۳GO>4??,A@2Cbϑ:UPߑP;!5RRHSQLR S;UCDTU3Q/>1^ ˇOWQW9\F]]˵QD IM`5_^TbTaac_5bǵ216Vg5gאckvdugS6i/d76\fik^vk+v^6k6dimvnc6j϶o6pe~t,@kӽrn"ip2~v(yu;%{.wwv7lJwq721J.Sr4s O.7sK $U8Æ/K8;.+8 3g898O_xS8縁xx8O8G8x783)K8sW7|Ȫv 40 *Td+R9GhlD94MyX繜7 hzlD#zi@:yať߹zW:J:lHzzy)Kz oy::::{#;;[zC{;s;ߺ[{{W{;ӻ{G{ELgtM5rf sJJGAtDk|7wpHJKa3xkFL3w|sБ1D LEB|0Pǧkf3Bóx7o3+ƟkGO=>wgx"ԧ4=#c}k}ٟS}ʽ3ۓ=s==سn?ޯܧ}x >}۽#߷o}oW=W۫X4ހ2`W=z=HDLHybβ~}2~S~~5[+?s~~ sXCV޾Ϲr~ӅW򈜓*;ӿ>@K޾4KazB{fā#cň=.lXP!A!%s(A%;ZWѡE^4X%D!obJ61jTdQ$G<2 WykU Z*ڛJ[5rԛ('*LY6fn، u஌kWi9ھbH} }QΌM>َfI+2킴?G{_+6yuM/ ]2q #-CTq6j|eLG ׄLK :r._#CBDBF2 aTB+gĒr2<1p"5MI8YS)cK@RB1L'ɼODbna p$ ڏMQ@l0^#V;au +Faq$(Gk Tonը7h-,T6B}vLJ|qKl7_i5|`>o[JbK8b B-Xɇ-ň 6dOP|؋͓bOݸ=YI>KyV=jf˙E~y֛5Ԙy8gs.X :ܖx姗$9d/GWrFVS$4O.\"YH"r!;IL6R4#KIJK22\e*JS Ԥ+GY^l g]20yH_)fr,4cLh^3%7o:&9)Nk34/r3> &YWqxĹ!q?gd!ȕCrӰڽAQ~2:"7Yqh@r.!c&s3;seV3g7nN3f9aNs|g@CY|6tDЊv4 A9Ҿ!hցqĨQb`]m^ST:GҪ_jմVrZ=[?iX-UײͭglV[u/kh֭Fk)׆6js7o]aܩ>nY;>w}uϛ߸wna5}q.mv7kכ~w+p|< p}׻էqKq~b d%π"5G]We]N[Rl2ufQӿ"ً`j۰$oL"uȅ.]]2rU/z>GQi9וZ!g+ryck,ׇqZoF.tWrSJ~t~gޡkI+K_=P|}}s) >́,yKI?مw싾HݑIB-A R%Up`xT OA ЦB$L$ڎm7r/`T&Av]D$$DZ>A|4D\PnP:t&L#6DgY^cHf >C>$5^JeN?ETvfuD/VH]$PB4\M dFZDRmD0JFeDb@BMCd>0t qּoD%ۺmD4&8bM MBed ˥L$gp }$gpE0 0 i-8W4]p9HcletM|N PV|LZ20@,6P:n[=d5/Nq&By?=/M>4pE0OJ=lB/_e!?TdO>VW]*;rFKHE_C#GܯD1= S$;pnZ$=j0*h`dN3P CR`jvDdX>_MC:DeeP6d&?~D#]q"7&'@:MZ 2gXjR,YqM%n BPd ΃ #LD""2A 6UFԠqd*$?b`XbDxaV b ld3& NAZ<8A6e^cn6!Z %d!3XddhdKK> SLRuM#>YmN_Z9H iZF@%i &&o=̰ 2<8XHEX9% n=EBS"c"BM2DWr?DS9q>ɲ DG0%!E o)C?>D ,ʮF'$0ۯp;g0bF&C{.h(s ov\E:k"a !^5!4b@OՏhsr`OOwA K|8h4%D,q>=wW\F&2A=tISm8d8@o@YVS%@V-uXtUR#oTqPq"f#U+-c>:5_?@ddc6EWso"uDD$BVZwCj uR;R7zVkg["9:5aA5U#v_Ud_+uUCC61I 0Xe@:3a P͔jv8 b@6tfs8>3j@Pmt6AJ=A2Afa3aNiC 5schN$+*: ]-ͣRCyq76.#.[T؆/HcqDN@L-]EWmSE[ F1<9O*rXU;0>[ol@9-äE,sC]SE[mSg$qmGwuSeBEŮ#cNZvc=oqmatw;OEq-{vr-y|W^%]_W{u=#6e3T*S€U3TOs`xzCQgNT !thgk5!BAx>RL8YLO aaf@NQ{/X6Tm[:U8w!gDB^WUZ3\_crdn,VE~n<4J;hBv8PēR--S5?3% 'Ҍ4Td>%f8XNZe%q?AUHFQ3yYssӒa я>j"nc`fDZ4p$5 ~7IOՖ"6m4 fkVjElOwL69~EH6Qe`c5@0[-R_gM^eNYFsRܳ90cDeUoD$S>B&VUQ+Uy11EKB6GSrhrR<{9"#Gzd /0Qq:<6`ZMAnS6sy-4G5Vp>ʘaf4iCLl+b6x7A9e 5sO@^6[u]a}@NI M9={:hw7 OO{ۃRF;V7e]ܛG4&%"S+6o^p])RF]u/(qpi8M]ASc`oD-<`onTcڊ]FBou]'e33!L:X@mwCj<$i BBCY67E!`E$ >;DU4;RBEh:s/RLN/M)u)N&/H%FDv2_u@vZ:&0YOx !x-\iP:hT^\EcmϥnXG\ v*MJ3c9+;b͐^ZIEAV[C!^֙ԗUrxOr9J|urN*trԔ+!{QC NA᠁Oa\3Kc~`uᣁ`BN#4$ۣL9 t>P A~`h4EMc*TzZEh+TQURO>QM6}Ļ{?[4Q[5x$,F:WMZk/>5`VfZq 'J*VD=p"kC@)EK4پ>5vޡn>GFdQGǃi4PH~zir*ouGIQ4*7 qV657 a `!qsy"B<8Ж5{6#X6e7ZyA6SMϟMw!5b߲}ՋFϠEk(p}SPjD8aŽV"z()^ ĊpŽ/$9gǂ)1N4LC)}äiz\rgщ>7& Jӡɍ4{Qnإ-{j=R,ԯJ`ʤtSB Ã|Ų4rֵn}:)У Mʇ4A\ R--ߎ7WXn1KĪs1^OZV٤A^nSi\}svhW^eu/ݳFSQ2;˖Mw 8Ĉ)F5OT:A4LUM(3Xt PrQT0jc7)QxK}gɖc=8㉕uY=8PZV$tufIǖ%JQEFTjD\EIQRztUaPXS_d#J$^ʥG`l2 T`m)Q#i}e 9iXR9y byWpYN9h\YdI=t)S(G4Dk*ahk=(H6'T瓙6)hc Sj6gTyC8̷E~E3Hc&s9g$A,b@ 22E ijp &M42M;9\hHqP[=QEntXya2+ZWף%$$ERDXma)6^nqhTp~Ad#O6&v0.]_BvdQ2\6ZH#5t\5Ҁ9r hvd؉L)4^_C ػ&fQuܕO]`KTSp^O 5/ ]P<ћڈmM!f\Й{˜&r1.퀙DѥnRYou,UC]uU? VUUNg;ƐXvyMiK6TMn1[`_Xe,0 5NR0RG/Q"HZ"Q2UwE%Z(YEÈf).L֘ dϺ .G:N(%^CC -U$*$VPd& o5qRs:$jzEjCGg+4fqh63Db@av 6iCV-}30$P #c p>a0"Ӏ"e0^0q׍^q؈D"cfKsUw9YOgŰ5#ml&_ǤK-J,k6 pUM)wC;lFzbo cfX Mij9j߳2膰xNiߊ" kXJ4n[BVA+eAdg@tCe|N]@#S$1kn,eąJP J雂 (F3Ԣހ AYQӴǔ <ăU&+Bǻl(Z5JY֪\4z2[U62~ ZI j٧s u@Y9HLUW/&Jf7w0)Mah&!3L]ϰ[\]Ug`Ua\nhjxwjF+H2 АqN雲fckQigPYBC?*+42$z$ `P(i`)S<9} YidX`'/%CREtKL127qGO 8NAK>`| Чa2!\+odWE8R/eiCꠈKx VĖw:(acnVprA:s/h~hv'̩P&W{0+J$i62se)srߑl2d#9$j=sT“;BTqHk8C[/` q \1Ehu58R8oUJ&q0, `+! +$:f  ˳0av, \X/*qUM51Є7)o… b(s#4t}G52l::.VBۄvv0xV>]tAeWKg|f\x2cA4}gc':r=#.9mVgO!2Tro";C.Q'tC=WK|%W8bnZ`7V60)ܴ%HQT8HHz1 7V0 2 [u1vg7eu0vo71PPHzHxѐ"u2+Py +x`7a@x y1 y yB2P 9Iv /W`^eq3 CA(x>A7ë́:5_p6}3iYs+eM?8CTBh5s%cRÅ|Ҩ9ϸ|,svub{E*#A5^b6"2VNbsoR&Cb?rq\{R4HWDH'{3/-IYqi.J#c9.|~G(TqHV#'H0\R vV CɅIWȜN j`؉. :@z1bw[& i0R>QIv0\8xhm?4DIa/PVIoRp`B[Ash=Gw(F#1bF>|WrR"ȲB>CN(*+b [=YP-"28"D,?WM~4vA~YQ:ry*9d5(冨Wڣ7n3Z'Gm)6cB:5$3VHCQ N1uo_!op00_7 H4:v1zv3wpmGx`鸡6JѫvB*]@ \PyvHI6R?uK/9}x 0ɰrz API@Qc[Ƴ^\7;}gVC_P8wR=CsD:"Ԃ[ $Kht9c2F4Ib:W?a'O4:"Un4FFj'fc(3-#/a/:59dyD&Qb9V4ZP.`1Gc.8mk; h`mҮ@x y ,y avMXv ; mwX&>9V` Ыx9,0حcH> WfW 'e7,X@y㙸dhWӥ[I &ֹc[' v'MdK)kVPVpnQ+a7 ;Ct26@dsqA!D{YؓDDE@ D 6hO]20QRD:9!YFF&ե.z)44> $-aX}js<Ӊ1cs]p~Yd]o%:eHl<]6˰ANQIa_6HXH;E ; `vHH0GIx(YI)ˠP۩ A8h⚫Upz"Ð?WWIU w,g(=| )dűMZ)I;b:);[Zũ]g%/ɚf!1œ`b+ sK`|{I5a\Xr5ˇ@=cSg@!+!8`Uvo6PT4̌4cC,=ь%+599.dCY4l-Ysl&q.yhG3 ~u Y8f7B%̫3HnDž iIvi8Yy&138vr P!vdcwW@-(ӄ7?)D+mL ą\ի!Zwgjhиv aD)myTZ2YH eL*KXMWJdSJF{CF $=K@&L4G*:VB7Fh,$Reb7ف4|)F@c忂t5<[ ڡDE~-3|1ZIy9ƅ-x@xOu£{ i/خ xi5JZ?`۩wQ$.k.y w .I}3` *D׮p/`0Py :=}ީ0sZosǤ2urdvBסlb"W)SW"vD R3CZ.M7 Vj$e1vFC!Z)YN3u?40±,&N]V0S幇D:2{ۿ6?mkɓ8\,U,W)#ۗ@@dp3s# r_J%gԆdJmRoէ?E"넩`A3J V ]cM!hS9oV ;[ at0~97#0Nmih^mQ9ab D"| t+YqX+Pfa JH4p?CZ\D@Bxx#EJ`XVuDz:˴B^bMi7q+y*ҍbpHH64UW?`4Ly@]A6YFD*19u*Zp(R"B $k3l mw./:SUz>ԬErmSRKQֱyW<'GnB=sz=#'A)$&dFG.^yNWe?nH_816RBkeNLB6U #2w1Χ_83PS4iG/Z}-ӷ^4z1F>},XDG> R>cVhq_M%>ŞrcȊojl8qӌN%|ӥF#o"ZD0"uMŞDtjhv *Eٞ8G`=փDtI*X1_qFAȻbY0'^Ջ!lyyhz}( |,m4(n3>~kJKˍLKo1 ?,kӢ+3-t2*ZR-/ ml2%.m>kI%ڦKl#'1'#(hjOJp o#m1>fEM}14ck/)'Mknj˞\mJ2(gF~V<䐊qo| hA&4/B䶩۾|FDcKh}bЄłp!҈ Fõ/Iw=R"KO2X7"Ζ &|ڔ4IQmT$MSFvw^͜Obrm3nnJ<|jRi1ⷨϲIѴUr6XZM%K] j6 R#j1e#\ efJw]WPPS.OSÛ}l 0`s.C=5jl npss&} 'fy۷Kg 6dVUEcxC  UU-pWE7Qw 3Hm,״=uD ;jC9=RpM]$twZIu2(Z;qf,}d3eeJ2nByL`{(!nl`G,E*wHd3i$iEI?Qh#FZK[Zm1B 3eUlFN_x1du*FjFDO `kÖGRlaH#!Lab@@GLB +Fe@_lYZ 23rjϱ>L(1EhgJT)Slۉ,q&kz^:UAF[sBYj#|R՘IC6=JJ $ +=]7֪R2TKpJ|.NUeF{^K-D{2PLo5YL\x44jV@ʧfxV\{9TLxjB镊WddoCK"(̤ JZEnNջ^4pK&JeA DJ}델F8$e7(泈B:Y\Jǂ(";1 ';-+HN1HrK5EDJpu7 А1%bM# ڬh G|g#ܮi`ϫҺIB$` fK:IPpr h$1b0v& d ̃ hpcD]hB]نE(gO1+;6+|4@yoq;r`EVr"TtMdXUx'1x V.!q6/t/%7 ʭҡ }p "FiFu:EXeT,f.pЙq ׸<v1:|P߂ D<4Fr<Hyt|v)amy%$ (7]=݀i@È9|aN]n|[7{ۛ淹 o|$o;/ ~~).qc< x *x'q&3s/߸=%_8υG7Gȕt<89]tDzȱ::> 'IXU N1>M{{w^'| x'^g|xG^|-yg^!(N&n h,c?z>2f{xg=ih^_s/{Þ>]{ܷ>|7?/c{ط?i }/?~s??>닿K@?囿?; < 裾D?@|@CAt=L@,@ |Aþ@+ A> @>%=#BA#BT?Td=-$e@Ȫ*=+>3>4Bl2&,>;B>{BCޣCl>>B3C߻\B4<>L =-?=|D!G3$A6$CO%4FA[To,T{ԃ<>SCbJ P|G~ǮR,H HȀTH H}G,HHGHdA d@ǀ4IHTɕTLIHȔ\HI5hȚ,HdȕɇlIIɗtɘLȮɗ|H\ȡǂDIɡɢdɞIɃJHI$˅|JJʖɴI\ɅʖKJTˠK\~ɫ<˲ʘ,JˊH<˻Zt\=5be #B2z%`IJj  :x:fr< p,Y:P#iO1A a2,!.6qmP6)61ΰIN+O}ʗ؉8Ry d$͒1.b+) )U  hңR(]5" 2)N4uǩluyͲ*z$74LQc6+ٛr#i @# 58[1$@TH1(31#r"Ę V1Aӝ Qi&'BuZ { #&tATڢUIyT[[I&sE|-:Rm><:/Ɍ"p5.ا&Fkz$/h) te 1\Ս1M;$lտ8'`CՉHQH-6YD1Ih0QHMI@!?GDl >Cq,;U ZfB5h5x ʚZ/)/t0ߚF3m$/R95mrѓs]aYWMN욕:֛-hj%=s$XAr"i]QH\{!sIB3谊J " '񲱘xRU5miHU(orT[bS۬{V* 8Wk$/ҎuINL><,U=4O _ޏNU/ Dؠ5jhUb+b \EVQ" ZU"M XpXRU^$ENͨ5[Ԝvqh3<v]-Qͨm] 5W}:xꢥ]^iEDs2d}$ނJERsE :pS4G'>864#T9R{|6~YIK=]`w-cGLO ğP͌,~)rmܲ5MѕE:N]%[ۋ5ѡ$!Q&V9eun)]/R+e#8΢c5Y/7: Ӊ)/r6+2>2K7ڕ4[aտ̭b-%١Mr5%O~TY}bMJHIh%E#pL:exHU="Ou0gԏEPg`3T6Vg ᎀuv$6Z޹%aSZlM4o+Q"S=5q9>$`/> S[7ѣ Z`;%0:*?-sQvuA֢`bRZ4N.`'& V-aUd.n#ݕ43b0━!׶eܭM*D1{āIY*>,1锒H.8-QҥUpN,eHNdA'snDA9%గ\†2W)vQ.:e ދ^R0'ZZܟc/b&beK ,'`  YY3af́d~5^f-4qh^krVi˖o-U^+my2WGRx1(UلFܤ.8 -,-vȁH8ȇ*PH2RvCO1NL,:sa0e2ǁhECSx7O_,ean]]CN!_ugh74>eWjJKf ι'b]o+~d=gdp.aenciM"BRkQW[Q mmd[aD,Po) 1X MNrBܞy-Mf+ϥ]4'&}H U]FgnY4O{1!12d2P 3.}؅IQ(==7 ]殬g;Dh؂w9,e@K=셱o ] ^^5)0f:r\06V!:}zcdpTSZVigdU+qkȮoʵ[ޖ&`ЅBQ_]e7Tw7&81V@#[J #֨&>rЛ+v|*b˺v~mzȒhu=aȁLeLtXKd2B-,YS 'Jl!DQ\f_z-COehZҋl߾tif}-sƬws_К>W℩I>KBZ)ў^uڲjΩ3 g̪BS\hїM^5:t&Z.S6lϝs $ՠC]5,II3̬C %%6BZ-4*ѥ颾Jn*l_-Yר: zP9.ws,{9̶)gN'̛$X<7yyky>7(3IL"I0I#]6Y=p KtaP2 (qX"F4#2.- [=յ(޸ B Å)c@CC( 1@yG %3(7.22V )e 4 $2@RImWsS9Rmuffe_;8vageb'p:[-1\JN\㣣2vp3UYh \Uڕax*k!R]kzkDjYQ:}RiEv\Z[iXm< XX hͦ(眰mTeiX_lq%YZՒSSnKe{#C$0R=i4T@gPSԨ;LO̡T[ejĤB)cP(HbBXnXbMZMfAAS-eB$4d;ն>ۜgpv_é_Wfb YTb16˘7Z}ǟqoh^vc^z覅*p"WD]砣N-Nqg`5([X;|:J›{yqy+ zu-rq=.ޣٙvmAcm&:MJ&1hP&0)#Jے5-@)),? n$}<=Sni Fd4$kI;J8Nd (9Ȑ]>*M{/V񭌔ScV8RN< #*?k&T^Sf`v f.o{SgqN4,2iHԒj[,bpy)lvy :NEҫeQ Ӓ{ 6q2[I)OQ>XSik6ZiyK2 jЃ&e`$q!cғ$L<]o%QMd IB@2ҍmO<[sX]$MNnAܣI&huC-'Z%I*}Y tK-  Ϩߨ{~T%Z`3Ǖfb{$5OE|a0#嬭&`4EVX6+#"+bDk,4K6|Ly'ΎUqzQKȵTyxƵ=)pN#k+]?cR(jöܙ*ŒjLF nmit jhzHG] DT\w {(&S呟eaT3W xYyru`(Kf- l;2b%qU%RzM9Xz X* ,~I+mL^~'bu )wW[5xr*N3^w ©d#Sm]ɬK1eGq^6 MOC'gv ѳձ em!V^w tE tsk-AC iYzj0~ٲP2;oLlFNhzvMe"<[N#kUR#՗_1~92wb$XVNʞ5UfSӠ>6.~[Eojf)i3-MLS҂Xhc&H~e*+;vKUKcOkTµ=},gSq@;dm⊯.\1b^0*iSA%Fcn$S|dKF"R~[ {m$1 *RkEutW5]= Pd1LRYF|a[4I^^xQ^y(P Xa\q5]G桝|@'1_ڋŅ`4|JQ4vPԔ {EO |dWy$|EJ 7QMС7!:aa ҡ m ( T@#."#F"&%J$$&l&:b&n">$Ԧe؁ݕd|L%^b ' ѱQ Tq eվ!!ק}줐SiգJDqJ}` ~]9cJ|Z/I]]:Ǒd:;d0[-m{W8^05$UG)9r8L "ZXhJ;jHTV-p2 aJ$MnFdKUKDKJM$MjoOO؍J %hMV@߁c*D2ia$ȸʺ_ұW-Qvޘ6e @>` 曆MpSWX3QYZccAO.ZXZN~Tu9BV㾈^4a5 _Ufv˸$]"jy YrħV ̧=NlYJT=t٭U]- w'JE\2 ]Wd`[lFDL?a%jgP~NQiKb"4ZAݙT~eGm*GaJ||&\F L`Ay ) i(VpI3:xۡ}B 8E8fYRzaJ^b`vhOT^qU(\ QQiMV}P\ǼĜiiij j"j*2j:BjJRjZj<1L<ɧހ ܀* jEj ت*ު**+""&6+k:ӓP+X+>fk^zkR+^+N+봢6+knk+kʫv k,":k",2.l+â+>vl>*,ǒlzv& k–l,̊*k_&d2,Fh' 2 -ЊgxmE lE2\@CE\2t-ς-՚mNm؊fׂ׺Ղ-(\&2-..*C.&6n&mzm-:n➭-Fdm-nm՚n--ƭ2.쮮܆ڊm芮v n-*./B6J&/jo^.o/znnm.n.nݒ-j*/նn. n7.79|S&K&P0g%HO{;?C7p az 0ðtСb10/  ;cqGqWqkq[qdCq 007pHV0p1 O p!ߡ򛎁c;pp$S2&!In%s&r(_2(' ! {1,S1 11.K2r srwq/CO'3 "!0!S ]3p17o7p pc0_8!ƝptϺVg&$XpwkA&@AO0C+4֛v%c#3`4>k3&h$p3Cv$t Gq=;tA$`F1$[(2Lkjr4rt#G2P2H6tKw %5)< l.$r36+S2NR}$4٬$ڜXL:Un܈y\ R$ZSeKYXgq,D 7[*lőF\ٲ7h6ON\ 9{o6Y\daN17̄5"$,MMNGp:XfڐXFF\b!jdˡ qDER6Dӊ*?Q,.os٧)rQ;Z(FE)bIYԞ&Wq\Zy 4ȲK<4を{ A127Hr~nXҏ Qc{J?t7,oiG(ܱ@7Hr~nhҏ Qc{J?t7,oiG(ܱ@7Hr~nXҏ  HMI"Ivџ ?NMRrSqm&<4-H w]E«LygCHq3<∖bE܄.g|22mx T i.0 v )i)3s8x{-bvr %0~6-oP W/;njCCEvQd9*<)jmc)&W49;Q`ieTىt>CrIo6N`Xb8 9zUioʇ%^GR:R⒤ii%8xHiVl$!&\YUX2z22eR`ެ(`^oTLyliq*I%jd2+FEWH,qd-2XkiG"LKjtbH\]`ڎH-X,)n $)H֤ΖSfwqWMTqBI<#/ v^M2ٗU:P;:|&q5\VR%$Dq zk%I-N.T:f,匽Ht/dIXճ~[׊JTK\dwb>LNv]վq82s]LFѦBic1o\ShԂ/ci 銡QCa<څFG!BMR'$nS4$c &jR݋HDT=8QN+3{K: *Yv8@ݚqy6T'*0%RTնfL1OvH_KlNMw(*Ԛ5.Y[̶+h2?t=5cU*)m-2cRdX%DN&Xګv@-geJ;fk̳Î]-:2/R4@m]ܹݕ-u* R6#n K }EfIRSd(ӖmE9L18R%Sg!>ltG` ;Dj? ITU%6$jFNrM^Lu4̔_g}2XrYIʓ<'n[R<3 A8>e QHqZR31zӇJ4˟3{vtuZ|J9ʁ9H%qRJB)' I-p)2hxܻܵLEmIC5{贪T*^m] aډM,$' y+n I<*2WS 6E%nK~Ip!K1]In֣Frh:Su[j>ѶoKRmX-iH`sơ֮؈: QMsk5Iq֕-Iyo'+~dY u~ߥծ.GSyr ɦEu-:y ZTjJyĸeYm"QlH#zSNj]ס(UfDNCV}.'V%6n!*QeYSjejL6:4=q>a:fYLl5{%aݭzvq0Rm #f%)?a~ jNxj? ϘTue˚L2ZH$M% "-t{>ʨ?{@UOV$YKZ͸dD'&i<-'<1YabWo ##4˨һ@0juZlB{sL&VI/"s*ĉxvB"3u :Wh+j/uO_gJ!Pһ@u+]&NTؓg%c.i $Jdxm.^T+&SPGM0@)R2qLmO8SeAbyA)KV"#0z4bb;Tlu?sJ%ɏ,bIѪkU~Oi/7[.&mIRq-@*V]SBuOj$ FdIN"Ժ5Dq\ uD3II.K<ֆq=氜N $jeO01fD= Ґ Sg8]GC#!1 { +Cr*EP5_H'zLx@ZKSUHn4^E]K8CAiexKx;D:B5橎})uRmV&nrHZN"SPX9XB%Hwt.nm~FHeԭi2ċb(gXӨ͸vI1:Hz4t$J*%$3,dh)]b'$Lq4nKWrZ,[sk3уi6h[NGMĺIQ'~W mxNl=_FUzZHDBִX#6i)l,@`wM|K6c1jƨUKR4RSm2J2JDX 0A/__2 5DYj5ZV+!Cs"wIH[ \rbÓR6,cG$ yq[KIUBk k.rZ"Y6ҵ=[Kf 5k-oZ1u)0bɁqZ_tu&ˏ<am)0\qic%%CԺnӑcHq 22#/(a65%L$k%%'Lb:;TO5Fa;F\ @^[M!.GkI,qWƇqR'gaC*Y4#Փ{pըv~{Ѿr ^uLO܏j9sm6t5i;2f[ڬX0TG"?CM\T{8utFr==R,u7GtgY.#y~Q7Otg#.K-H]G]wKv@7 UI9$6qc 3I+l@-3ۀ /FGk_y`7`j^Pq(Zv@BBP]du¸ձuSɵj5*:$9ݖȓGVyy0nͪZ.~u^L~u9ufsECn7 ^x6bf{X]Ycnb ¥rSԅdnR:<[2TzTXrduG`D6[HوxhIWm[jc5{uYF=K&L{6&n mTmV{M5jL DՉ\g\wZY)!$I^v,mm˛ej"^~ӧ8RolSI&ē2#0I}O=iw*dqVYIg ,AmzBjwN㹙ioʓJå6t2?N'3Y}hH:sz](J޶PR%tS[)"G/(b*\JR*-XOH5?OArTzk6ek$ 2D*$BpyC)> W}ۀ\Wۀ4ϪT/yC)>B?ήz{ ۀǛET2w'ۓBLS.G5~; :$+r٨3kO!l"&CBXi}'mhV\iQOT@=R:3+HO1̮#>x2T@=R:3+HO1̮#>x2HO1̮cj]I³ǐι  jB~L.YD %(["ңϣ4tѤBT2{ލ' 3Fɹ*]{ ɹ;.i=`Z\DymfؒP4Qmx- -QsI2jJt\IǓ6ТI쇔^T E[ëoa]{!pWV]{ ɹ+.i=`ᕿz40rn tѤAoXElƐZB}Dj< hI{&\02R'wdLc֞ϏMV㔨"("CKh[p%ˋ@hԽÏNMjuQialmBSҒĜZa)tjE!@SS`F0eq#d~0T+ v{Ѿr ^T#&`+Jei^"aԵiR׵ K^֟5-{Z~"ԵiR׵ K^֟5-{Z~"MK^֟B?W( :/D[['b^ ][H)qJ ndCicHtHsIF2RK8cˆ'foWgvUIu),Jz18ۚ7yOkFuw1J ӅE0 `  >HC (#٧F8MSg};qҽH哸m (`9UCItk6Xϧ2ܜzeMIn6 p%pԒv6w9t$ݹͫ%m]=I/nsjI@sWORK;ۜںz_ԒtC5 "tT{Al0@S HĀ1 HĀ1 ^T#&`=)F[`fbb@*+?r*Exoϋ]#oAO =SJj+Nʋ!I%"I=oDެ;{1HȞZwvJpmI~L'y;O},%F7St[i(A#.T>bf?R\GZ&d&I(ȩϮ $a'oD$p>1m.A5%7C>Fvr(Ģb1K&R2q#58ffxI+z~<_j~t}!!.va*MgȔFPBZuҬO<6}D ɎuuS'T9[R݅!q66odN"%`Xh?uOPCUC@89U/;r'TP!1N(4`Ff5N~~G5G8i}peT>/{,$ntO*2苨?KfRQ~ ZFxgŰf^-MIjvaԷj&}pU`*x~,JBuYCZRJ8'.tִ/Kظ؉Rv:"yMDiQj)+T׀5xffRNNҔg۳iTè יGF)9":ԗ d%:96n#5znKwNSPOC^7TsT)Ɲ6Y(XL>AT%].SdNnr'Yfd.dYBS3-W@P6LʥS+ڟN~Y뢾[j)?!#qߵb)u Cz\4l,c.LZb˚}Qel/?( }:24x0#",(h&eB_/ AĤWvqW v7[-ıP,|:,@*2i,\EFtD(5Wܖ&E`\GZ~b9:9AMdj SC;6ZKYTDxb&n1|ԘP:3T;-I+q$q㰶b}0hȤRP(ʭ?kAIʌSR0y A4hNBW) fIyIFc"N!xn$3@.Pe~o4[[\2{P."Լ!8aI=BaEVi \ t 3sVD$DG 1I,qJR,VVk,0 qގ6vL6%S$=Yb˹XfݞP׃nMi&2JR[[T_5Yz9Ql? ,C62ot}!Pl6Uc}1a'VZ {7;m΍Ta&DA0k&mo{>2\&) Ǵ3v!TR'&dœ/﬙mX@CJGUhORTb\rtj.ʄO怕F%,%Va "vSZfXj$^[~1ڴgiB_Yr$8r:<͉f"ݾ̇bܛ^2 mOfe"]<%Qmɵ -^MњE L.<ͯDD_r$/8'`sZgմo°K>G6QyZIgy7кK>ͫ B&En,\K=[/6ܯʅ᷌b^N60 0=p7/F[[ZYrS-iMRI%(ݦo;MoKVVɐۍ'tn{#q]N 3H%m"mz+|\eVXP-mD^(RRGaݒX AT?{Toi=.MTi"D硬󆴢QWW nڍ{9GHH8VEpc yT ,h3ڹ+JNdPShDhRݘjT^?c©t*O8%wp] @ ]*BP9҆4v6(Pj Kea/= p"J=qN,.I>4qʥ5[&DbZv< a7J7ќ@W7Z,tQdֳ%'[IkLt%c\6Ţ7RJaVig|ՖMx ^9vqӿ%UPp M$gWhJ?O{@ J3 CXL \faJM0mjm<-3uѺi)nFO]sr4n}'v>)0IcKaǗ&m:qP 5wqĢn4iiL۲)牉s9 6Z5#28Qa߅ݿL~iO6o&HNNy4ϚGS ruML0Wtţn-eCqɭuIѓh)fQ,"7^[oKsM@;io73iH|m-fu7ι 4ߤ63s:wng\~x\\]S#Ŕ6,}J6I")mtuO?jJ `e, 1k $-a64f2ID|G/XbGv\Qt)Q!B )JVI",LI7vWVi"ypjBPj,HmXݠ%B|~P0j (_ig iE vA~nz+~nc`6bR &E`0M &0l8Ņ~hH[$r|p0 i5"Z7BIkߴW aURhun|jmA.դ, LZE=\ Jl==* )07زF;|j \k7MfDJ3eڑUG#ID?b^$6&b&T ȝђ4Sef.!hޔ)E66&VlǪZxH)ĀnֺQ s%WV9c%F40o ?à|",pp _@N~|0PjSS!Pn$2^2KhmJQDDXvNeHwkߪF:㸃i'lx%։:TFH%fJ3"wƫCr*VQt0FO"jDnrCG*OT.zKH"kҠ)=OR4ybҤ-j֌ؑfj34j\NmxGIQUlun0y♞mB=E hM2ګn$: TI*ԃ>yě(Qij@5=yö<{M2S)xHQ֟5,Z~"ԳiRϵ K>֟5,Z~"ԳiRϵ K>֟U-A$x:3J `f«btEEA:lTZZ%Sb`'-i35l+Hh1uKڣR ̘d\q.4 BH0Hѽ0::7]#F8a:toLEXִrɣ#TFBވA(O)Q-75I0%ժ/z|-4MkY3)ӥ}UgWOca6{p#Z$,1ˌU uDD6bSlFe$hJXdIIl"",6و@@\^ʋI q/.~|P ' l 0+T8;y5;FU[XƳ ېx4 HyԩbG }ReLQ4}n,)FpJ(lbȌI)mITNi+;5Zڋq f$98 \Y8UlrϤ«c t} [p%HV.@,@*9rIgUː:K> \YDZ,x(o*&}%xT` ZnP EYE[u)uH2[>"TQpbڨգ+NpsnrmE͔m Vu|bpb#"Q2I~Ģ> ;-MmKiɐҩm$Hbmd&>RdwmI +Jѕ>K5 Sc: f$8a3iloZ\72Ȝ װߠQ nT)F?QJ٭"ڸ^wNSrQ%9n4R7!%#̶(ųie,Sc8%QIQbFG20i['mI0wKi;%5e8jbk_I*T%{>m@9~CCgHfj;N|Y šad [c~_9o%rK@弖7Uy,oޫX߽W?-䱿zƝRwZl˪^Vul2lVs3&HEoW\r׀PsehĻ*nAT8DMkMN",ۼ~J^"E' ~I.dRz2;苙"E' ~I.dRz2S~IR>R[jE魰U:YImK&o2|3GU+IDEDYAKSMl4|\pUxyJʍ=}mU8N%8I9 f_}PZ{G49*s+SmiD%9+DeRX-:*v a[qũKZ*SՊ[˅;Cqi$beh (W*iUW (+Tu) F)4\GinU~UU}}F2Zr[,י"pG1 NxoX1_TX u[ 91fsu)4e=Qg{/ WwJ9r7*G<#^[ EaϚY@;hß4ڀwч>h=gﭣ|zj[F>9A8}}mspP0<ݶt۶Ɩ)fIJԒMdҕ GoW\r@@ݑ"Τ97*pօKhDd2 9>;6{0z8ev`q'WD;㙔Nـw3(]gfQ:'fG̢utN9D蝘{Ms2;0{jݹki Zd* fc:"Y"?( =%X}V:􆨈ctg쉌It`!w#qZglĀl;+WL7'V@ogtO8^3qZglxM$) ҟgN0@*)% ( b@9&KrP@EWv2?x<Ұ#Hl̸x1.274RJ KD$[ %f|D r[msHBVFRB#Z/&^R>+Qʇy/C,1 5-jHj"V$Fe3I!ߣ6f_tɊeOj ;}+s=QoMSoej+5NpLp5NpLp5NpLp5NpLp5NpLpVỏ(\8Íʤ4u[Ϻ׏V3}y"rHurؙje *ۆMrԢۖ+^SRC( 963R3me-\g"l@ѕVL'Z⪋w^WΝy$gxJi%K_]z>ş $hY9N'Q6$=qIOje5^~zu\ $GpU]NW7f]ڬ| |gKX_!|&@C;>ZH )ˌʅ[э`BUo {ԝM:bɘ%m5l<,{HJb-&[HOW)jE%Z}rIm,M!#h#2 v `R-ʅTaUժ:MEn=1fA7BLR ZCڌ+ѧA08paaז۸K$;&vVUAS58u' x ęE+VեD)ZVۄMGqp̶+2 Hr$$:ԛv GR Ս?[VDcQJBH%X"5aǁ}lu}lu}lu /l kca+RBlu7ӺǗ~Ulj=FmU\/B .|]&ސkRmmm'Ȉ,LZAVĘ{tϾW+OJrm֪Ch'dᔛCYA~nkc+~nkc+i{Uk?2>>k[y7WbU>B,8-llF_bм׶?+*t!<:Wb kcev U.+^] ߺX@7ߺX@aU*w]6j*ݺ-L8Sf|: Rm8^P<@.spv~=']wG1h}_=b7{Eš|o@9Cހys(-zQZW;h>wG1h}_=b7{Eš|o@ʵեRlT!3baRK}(VU$e&d`:6cx $Ə"曯e.t8 M6{gͧi76|~ 6{gͧi76|~ 6{gͧiE\ "ެ-1ZJ ADGWu>Ā\"]G(q  RhJI)%`jLKX?!|&@Pc"|0*uZm*eIIՑ%ԣ""ļ*"2k2>I@%SH0jQ̀J\cX{p$ӎ]%zk;a]iEaX(z}ᤛI$}1?/ /ItY Uzh/33O.:e^{"? ޯnZ%>Js]N2xbIYcX)EĀK N3^-QERu<44FG KcO&IXeIJ""IDD@1k(WB'=>Aqq8l?{5*P3mXYe$dQd09{1ɈvTg]BܖڔXӛ' .w٭j=Z&qg]2)McmÌ]oi~XZS=%LKZ1 Ͻeݮx= G,&~My1! qVw `FFᚸbt >s*U:i;P6On )"". 4]NVnTݬJYjJCNlǏ"x;oO]J@OY:)XujjPKUijQzgJQY6FN#0E-ZzuPP7?r+j R>?3o h @6mIGaF}sh @6mh x@-%+1c" =: M%ǀ+M:3\sS,JݳͫiZ},ѽMӝcSBsjY5_NuO  iαdס~m95?z/ͧ:ƧS^Xkп6@=MzӝcS*V^CTz/ͧ:ƧS^Xkп6@=MzӝcSBsjY5_NuO  iαdס~m95?z/ͧ:Ƨl<sjYZvMaAI!>MS#{|o>2,6XqIy@|c- S'Wi@S OV=uY{ GtW?M8"o4~y} ȯ~pMEH:h+@G_7?CMV-)ڽ7NA-VlKgAxDxxKsǩސ MEH:h+@G_7?<G龐tW?M8"o}hPeMVTFiod4ȓV|x۴K]\8. Rʖ, GZFHZ/Ux %|Fzu*54 ?ZI)&iT#uH o##y} )QQ~iΣߚG( 71>W'sShnbTV(T$bg~)ΣߊG(F@7> ro:~)ΣF;uE@n(7q-5ȋ0H_ߊG(G@7>ߊG(@7>L2GE܅dΝ^}l pۀ+o##y} HuHR9B7GPQo##y} 2yN2\m^h22? -@.CϟӿoV>| b/P*54 Y_ZJL4q)v:|[rxaPJusV3/*Hֳ"j"d:"ݦSt$e,7r5,eĒk̯c"fBMqm6bYpHt%DR̰2"bW,JF mmD{KDi, #Ba[ lDh eJȗ MGĜpx75D%Q_6ZIC-{ 5qEb2##"f.:E- teo1jevQ2/o7ɑ|~Q2/oJ7&E- (tZAqSbD1&MI$r8R*)*ړ#m#(1HeeRZZَph<eflvUV4nsK|!>W-X &X)RrФ7X oTѸn;H"-oeTe ,hda E/ m:TWbh8`,X=bm gN~s)y[ R Db IV $^%-^M[F*%"Sy(ܙ̷o%" rd_2ߢi SmhLĄ$)")n 5*e%ʛ̑TW&R25!HAr\BI)"D [wڥҔzv-bnڜOʕ~i%fdݻ ˏ.tm:KC}ͥLJl#`#hۧ uENJ%7$/Xx|SK|RK l.pi8~t󫐦eKi.4%' / F}:EZ%DYA("-LjЕ-uzPJ9j""/fMgfj˟wl chsX}xEKu(ȼe$rrH61O6Uq9c,ZMJBOƥӛ&b0Rd,x`$i?ڥҔo[NR˺{w֥җ.ɠҤHYZ[JR.6qlp-MZ$ե2g"2)ZHJ"f{8g=1typ2W61Ǥ{`1D kT7AlYCU[m wZ2?玀 m W| &tOCbQV;M7\&kl;̼x ͽEcx 3VߦQؕfkJn/;*Jq32mf醽jR3554Q6u(MΝBeLYZɑ25EzSw3l#1mYenJCJuFR e6ՑY0jY%*׺%7X2u@ǝ$ Ko[h<5Jٷ` 'N^,F;^HejiS`fJ=V2h_9.NRZ#$fmյ$|Yyc@o}ç-WI$lˌB\M/6H2D=F\`>&Ҧ[`j]ۙ2fuVVʍ FS>@tZ=XiڙaA)LREAZ4IBb_Jʐ6˺?auZۺ:>j8Tү鼭4u Rdi@!#I-v+})wRؚž-Lटm FBXZ̸FuQcʕ)D'|6i16I RiU8LʊSZU#4XX$}pkWj6~LL׭+;KLa_-+kUO§jOů!#Φӣ=6"Idd=/X┈7Ie0gn9#5뙒,LAJ=hH$6P֔(i5rJǰLO;ĊRRNS3D@PɣJai33RJԤ6 #Eh{K>qfu]iMBR&%2 eYW ՁХ1Z5%/L*jnKչ%3OYsGÑSzcv335&G4Z[${'Vg6#80B[X8ښ>Jm-K&V4IFd)R3Ƅ= vi̬[YLIScV!H2ȥxbem<!-3Z$ NlԺQ`%ztcd6˒69X.7A"B%)8(`=ҝ"E3yiRe[ԗ%j'/ DdS!HӴYr§Lͻ!G.NEkF ^)O/5߬ICZ-=,,CbK^m"c鲋Ű#0m! ,JRFDDDX)ƼdTWΑ-Ɩٳ!rSjv0ziThEj%B˃Fu4&t͆Ķ9Q2y$K*, *#<  98)DUÐ'k47uyrYqJ#LVs ގOK2p(γj[r 0KIV*jNV[]aI6ɔk *;s[ gHVtOq5G\r-ZpN4EFYK2YO%m1S]q4іDizG^S2P"Qhq4$%VcRiiŧza{SyyHi5D^Y0xq&P@Yܥm-Wl,_f 8m_BUU+aN>NSMM}idӌC9I,@I/G7ŷE][GIn6,x۝(yO ة* #@*GuATJEF -%Q{tŋR?$aU^꫑*T8Lժ4bjQDηMkיguk3Y3<@o5k.:j\Gnis*P+VVj"O\h[T bE@t>mQfRr=sh,3&~M <AۇOa!.sZ&xXŮRN;d3JomUlϩ6EfßYR4ZgJ=JYf"eŴnT)remA-8okNKk5kհ)<ͫrRvO'+4(Vo%. elG;NM 4M-:fyKx)Ym2/\<hCń'?jM9FyF$ j-Qɐ jq#_NKl UW3D^ !ZBR=);9y@xj_>/. K J׏+ϫϯ;9y@xj_>o,<ϛϯWE37^?ϛxn!*ur{ͦeA)I*וg{ xGT7#\o?ɑ8٪[ERs'8h]5/^?ws}^}xxÛ@ |}xϛϯ;9y@xz_>/.L׏7{E)2eR78Mq9pg&~00;l{L @6mh32#<1=enǿh0ʕ6͛7$ @6mhl`L?韩O=ol[b~ 猀 n#x  uN~mM3n&=% Cm>[q$[L}MgSC#Y6hsduO r d١Au?z492:ΧSf9GYl :@P4;өdcjkf:R%fjQ[L0zap\ҥKT" TK2JdRDE$-C#Y6hsduO r d١Au?z492:ΧSf9GYl :@=MgSC#YЭ4-z"Q d@&q."Cܰ"T |Qy>5DۙՎj<` ieMieMieMieMieMieMieMieMieMieMv6T޽oM^]*| t۳9^)-R x* x<GbZ[7RʂZJsU;gMieMieMieMieMieMieMieMieMieMieMFEԊT&ZBmrx8km.'9$c0ko W| !t<`񀋶I,Z|  m_0((` g[< &P@C[yH|:d^lB`y%ΩEunc)#?N|ր57?t7~ M ߭jnwnhSsCw@:Z|ր{R`.yqfwbMK2? \xNA#j+Hem$JK@:Z|ր57?t7~ M ߭jnwnhSsCw@:ZJtd*z8ɹ$  pN >Wb/Oi,[JaKI*jӂRKɁ+6-Ĝ4[uV.:Uw%r0%/ѥ>30% UK dž Jt?_H b~+IJj2>..0GDcE4.niձY2ISaewVǔ|I Sf,pG(gbAGVp涝J`ݘZAdji$@5~{ >jT,=нV]f/MԜIQh>:6`ӗË oF5z+w-Ҫl^$>QIaIsb`>\IZgӽ2%fyu۳L䭙 el.I>0N'o@"nJE-Wi8FQ+I3͂~O "?=ܓj)I۪ܐM}DiǙrՕ24^xo$x@hRXݑZd`oEoW-Hwe;(4K1RUrjˏl4+FbXQ&D@;^d-;xktŝzR/TvBRIqkI/XaFx :j%[@^X@9\m Kw$>8[TGg}h&,kL`k"Z<e.-:7B|Ϗhh˰wW))컩 м<-iıi .ҿ!OÊȎˋq9\4q#mH>#0gB|Ώv9Ƌ! VO QeC~ nݠ:B{4(̛=Dde=p;qYmմB3(x$,TT09@r- ~ү?#<ּ "+ܴwlrlL6W9i}6?Û+͕Z_Mp-/8sesc`9^Zw{] ޴wJeyF2ՕG)iH0K͏逻6W9i}6?Û+͕Z_Mp-/8sesc`)Û+ԾN-JŸ!))yd2#Q Qቖ#uM(]V64O!Qfq_6^nZ^? 逯lrlL8sesc`9^nfGI\7|ףL';Jb9eL2-/8sesc`)Ë87rRŻ#`61^Z#F9hԪ-*TT"22}JRLa]Mj'Ac7ncQ: ysX@;蛘NǢoDƢt=z&5Όw J'DlSVJ%ɚyֵ$~q0<7ncQz  71DމD,z Mj'Ac7ncQ: ysX@SމE,z 4Z5nZq[4xYC)Ss(EDX8)4z]f5 lȇ%K"`=Fm7ncQz ysX@;蛘^ǢMj/Ac^z&5w71D0wA%VZtuN1D#DeQkVU$eTdP{0sE,߂@u`H?_^f@*VQx$>`wJ"W: b@*MA!ȲL3%`DFυ+Gm|8]l <TWG?[Wz`9΀j^)Ěg EC't[;~G Vgph@/j跟uqHiYb`&"ǡ׿ن ^J՝J[q Ij˴0[mr [<+GN[8̀W+Gޮ=P5MskyeۇTm+Gm|8]lr <d 2n>cr5c69q9LG=):mS3"?ъL? mVg 1h@+gG&_)koGVnj[J$k2ؒ3<6-yZ? h@-yZ? mV.y^? ;KBppTT VLԲMYgZHkq*ʱOJWbOA+.SFbFEq̦wVZDLMڭd#[Ҭ v(d(yn2DTm8hK9дDZ[-qmHudZVWfK? *, F +p8'niۅW0ǹ׽0 [?ӭ{^ ۻ>=^*i,6HSnk]yHQRS"ArsVKZ 2\D~ 1oZt*-,8S$:BJRxn54)Sy]udkDRm)[DdᘸTAR!0;6! FDTd$)I<1+{܇^SV?z`}~uLVνpJ/!׽0 [?:-*6(xexffgoQԥp3R|fT-̮ݓMo @;\)}& 2rmFO:M%; o7].^U=UmЭq'YOKMH=^1.ڨz9ɕ4KP-kViAẴ1 gLbM7@?P͓M\&V+JF{1y:^b25BE,}6ϒ' KYi(nm\MYp]T)6M-/!Q Y)4LӁl@!._`хȴca C/+S? TxtڑcOFQeLnRm5ˏ~1秈3Ln(֕RfTU*S1uf$[I C,vK%M22#RpIyMX+>쨷;w]a Y Rj|"4s\%dl;NjSv3 z*3I$дkgiNx_ѭ-mqӧW);Vmu҆fI%$`ڥKKu"۳&KKFڂj 6+Pis2m-$X,@D=#?qfʺy>kQiAKQƛ`B;xq$^Vo(vJgsK\}ImV\2چkTCZ Xৈa9z\A@M=22!*|0ɼtk7V0l7{ߖZzTm2ˑV7ׯ!tz@:'ծyƬ&|Svh[%%եo%DXjԂۗ [J~Q 'K"W-3S~R(Z܈)3Ky11$! J ԥm6D(BuK-1J]%jy<^dkśhzԨT˪%ǣT땕D9&km [W:k-K,CZ]5Z~y0ٛ*=Az٨"OTL%7bd2-];V͜ ԗ®a):{:%:a hzsȿBQ{ürS\∷ĨӓVe!C%RĴoڝ1)ɑMJP<Zs j.QNjYvןW2Oʭy6z^Y͡5IIb+tf\.f]Q&LDZsICm-YmI22 ܽj] ;m}~3BKnOFDxm-ɘ;LeYeeeG?oG$ GWٵ#˴A:@Ҟϙ.vy[bJqJSΰDY2,_EhҶZFTJ*A[jʫMr[KKjK+ÔTvv̌x@,gFB볢U`Tʤ[qWS*6 oyUx@JKQ77|J 2sB' ̪QaF`%_+XםBhG\fC\J|XctYJ6ҶЅ̃y2Lu̐)*ZEv&xQn :8;ha|&r-!,z}{`:- S? pobx2nIMNC!MahAG⭉(tkRyhð'ϴRۉ[J9n)r%e JF+l$ 'GfݖJlDMZԉTpiqmG8JqFfj14%V:h`9t)u~_? %pm cX(Fv!i3R'/FC>z`)IXxxӽ0Lz`&O:Ν逯|&:ʝ逧|'OΝ逧|}&yYӽ0wvw; r\H駽놛7.Z>(IgSom QŦt3RHb+ ^;*wQp*/QVrjO#N$! ̢Omْ~/jZ6:oɹjSm"8*ݍj[JRx3< jtgyڞS0-#7?T:w4u;:wu;X~z`? S0LΝ^IRҞ-j;SZ[ NJB&\@1DK7˓V+S1fYK.%i0;Sʟ}KZn%VjdV4j%DvS:qĜBRfsR*T$΍!Àwԣu$W9Wͥ[ȴcaI\gRZD]Z$fOmo=k9hR3(Ȱ,O5@aoS9oS t=-wB[xeo)x;9oS9oS pMwtIѽ0XޘntztoL7:i=:74ΚONpM'F8}csӣz`>Iѽ0%h(@i? Fb[8؄%fj?xo)Iѽ0XޘntztoL7:i=:74ciQItoLE~?$]Vu̬ՠT"U'J~YjؓQc-W!&$;pp@xW"ɯ8R,*Zb `%fRI2BK- !Zr,D7/R@;Zr,D7/R@;Zr,D7/R@;Zr,D7/R@;Zr,DWMvj&p3"zw;.Ȥi&"JQGrN_R\ T,FJ0k'4D655wG1h}_=b7{Eš|o@9Cހys(-zQZW;h>wG1h}_=b72ѩoUi6&NI0ۭ8д&^Rȸjw=oU:EDi&4Ɛ Į1+#,H`0C(-FW9Cހys(-zQZW;h>wG1h}_=b7{Eš|o@9Cހ  h|G@ l-~X-#摀M>Fh"ǡ׿ن:-S? PvܕL}%\%(+,KeV32ErN_R\ _N?H i@K7~O@#m7@K^y|8 w.;XȴcaCT4pT,lJ7-\<$?`V2oJ"W:9i+B-MKC #&ek?vչ+D@7^j'b5npQ; sW؀oM[2Nzjv V 5ޚ8eyչ+D@7^j'be:luƗ]ukUL$<@'ff&4';Dd8)tj#֡j. չ+@]5npQ; sW؀oM[2Nzjv V 5ޚ8eyչ+D@7^j'b5npQ;U2w<~'O0blMi GdI${?@ - J$=WUayBpBpBpBpBpBpBpBpBpB􀹻ZގrY4Q8 N20rM!,z}{`:)mQTbN& hk@8!mrk@8!mrk@8!mrk@8!mrk@8!mrk@8!mrk@8!mrk@8!mrk@8!mrk@8!mrk@eSQt艌oa4~VLrd"!2gDҒoZqXlFÂ&o&o&o&o&o&o&o&o&oж4xe$E. uPH?_^f@*wJ"W: MiO<0]ۑc{r?x7LonGȴ!Z '0\)Q@+c{r?x7LonG1@.C<--(?7#wLonG1@7#"V"uxB|pp~n܏ 1@)c{r?xWt~b[@\/=YPVm Gj4'tSn:u2 dWSNZ#N4Y0W2OSS]Ef`[+[U2)댘4X췊E%8b^R2-[*|8Qc*KKz)R<C׮Z*[&EIR"Qfij#9.2-D/L;}:*I)2R0XVbի:Ki {4KjDvug(j'%xznr425耧pxFk^[ 5耻V#Bz 11ś]f+&6Im "qω$^3>X N̤"⒗KYAE*P9Vs -?^dES͠#{l&P̝e2i)kեdG7"DJ̱"'UhQJ  4-\xTbT".wI1amqBeyb ̧>=t"1vƮL=[8@ȼJ"8ѐ2se:eFZ;5xr^J[Ԥ-T4!K:ڸ[R4Nܯƨ-5}_b!1(p,8 Dsb i>_b$ /AgtyGETm,Nw%"M$,x8#f8tCu(wh}nxEb} wOJ\/^V-g}ўz5&UBw56إIpz$j$0 0 IR{p ,nf퀞0 0 0 m ):W$EeFR^I j&"Ds] miK c"lw0x5/)H}*ի*qD(b Vb Jj KZ䶕,#$[saAHNbDMqE)3d!GRZa2Nl'.=)Ҩp5 dBiqiAAtjpȶ$6*|m$!z2-'lՆs,hgfS,Mr+)瓯9Pq%)Y-e a8%%EL#IV֔JejU:M\DEZ$bAqgdz|aWVn=B DurwlddZ 2,eKKS*c"(mS/)#Jf;8^UhرeM^4)m-SXgV?-_;PTiTY)ct,KtmQ}FDZx{mBZ&'mbޭm-f2V)3H&{uKmd\ui!>ꐕeϙ&dYpdj.w~CRQ]IR &܆l6mJZS1<} KgI/\nKuF&H^P^)2Srqj Ϗ7 XDH¡1dF[NlBP5Q㏈ƘtU=]u).qʎޢ4'*YYf7Cm*53oV#6U$6O6HtY|{ A3yuV&" 9h㳬S̩0j&FO"1&\Fb[(D~ĂS"%mNm%,%-8Dټ%SV)Z\52`NGX=.4ɼZj$#hJwy44Wf[/Œa3i0mqܕ+3=QcdF,4N5)ZʓCMdӥaLkRRXؖE i_ST'=Flv*$MSJ\CY^;]0 ۻSpHAv&Q.^MfK8E,jų<و"0JʝkUNѢƙ!hf"J6$ #H,EfKUNC/[mzܒi"i%%BL*ͯPOHz'{j-;&vQUfFx`lT}*A#1BN:ٴKʣqNr)$x{3OJ$IɍBbDњ)CsT*&ؓTGMwqi#J[uίG0i)34̲\R%TW)6 RJd(irP\Zh!擬TT!XrbrY*2\ߪj b4dL0f>|#}{DFd@#UZg*=hTK$cmX)eqWq#K F9VQU3[- h#1uz[Iq $g6Ftb*J؋*\i hj|ŘT'N"k^ \ZLˆQ*3` ="20"RAd%bYIV_USY]JTHNSSs%kg`diI/閝rUEAM+)LH#"ma@0Ǧ*2,re*1&MuovKVYPRm*KdޯʓXZ.7n[QQ&3Tns~>Zm 0F `m9O2"+jLV"Å"gSC8}9̏Vsb4YO}qjSE~!h'>m3O^\,{ tYK9~UU[pk4eT\r#&-2K5\&k~ETqJuj87RZV9^fё(HcVa5@[NԔHsgr(aZZBl6CkCjIC̷>rO6m*jM \v`[ So,{Uu"@jkSvTܬRGЖʂסudrٛy*$ pgj !d\^fkPhA 24rĉ2%.']Ypd"d45z#fˎlL)0` 4U4"6ƘZ&µsI,E FRs!Y!N.\y 5l7aPtHnn骩%SfgRiىT,!elqV!#FܣU-+(J"GjZ (5dJ{9@Rv9.Jr*duAl QL'JYڐFy1LfGkI)F+h:(*FE2*DF%)ϓ"Ķ $f@50a-Q/آ nZפ7&COi-^Ձ(6 2ae/ 2S*| ^@ @P)yS*OL X H)`@@( HaݎۈSTI25$\)r"\)`@S^@ E{pȟ S)e/ dDe "` ^@ dž @EW.*I\G\6i7 YHǂLktggIGgF|t} tggIGgF|t} tggIG. 2D%@d}hʈqͫ)x?|k7.ʥ4'&GsR9)IgXxR޸neu*jpWMnKFldB'(?| Y+֗SC- XF%-j%$f~ tF"_*@^K!ӫSKh[Zh#Qb9 qW#PilM)>#I۪I{X="Q_*@HQxuGm':>6i \Bo>05#V7Y'ʅI5Ӊ).ìӏ'a4[m~ՊkI5Tj*Rkٙ&C/1!ŗ; #{wΑ):F9VAAa 4jQWiۑfeT~RbJ~#ajmkfSu4hqBӳbfGɕ}T-+EV|Z7&WPHtuqS+EV(4KzjR̸)-ӧ2YJK/')(XcmeE-MĚ= Pkdeҙu&]˳<008j˖܈Fa An &e}i9*C-o%\&eaa@ukrq-:Y2O<% < eT=?A\־?sxw\)j *#/P5Tӹ `͇~9C!nZZP%l"JuX-oe m"=rm[u)*ky86 Q,ݯuRkqכ&?drWV;0"-Er홌nȑQݣ͎4"W,~ -k8txrQ2#KnCiq(yۄ^TR" 5!˙ޖ2O qq; h o-+EV|Z7&WPnLu[,V{)}X urLUlMzn)8M%\ɉ1{mbXu6+~-U VCCDP2Ng[QFɸH7VxsK3R%jq9O)$c0]Yl։N6$Y$CUEwI,%UХ'`6`թp=d)$k^ho g͉{ chܕ5dTnx4&A+Idq`7I"I')"/x) kqRIXZq,1ITҥJL)i= C5K]OB6fyˏ .j_犷f.kuT}2Uk\)&:L-QԴv!$sHyf:m%',F5lYR`7|(tmAP,Fa i#3` n+袮=lMA3%֍˹ߌ̒IN%Fw: f^ደxe3DKbNfne֛(JVᤰ#u~T3?( Pջrpli1jmeSiLJزIӉyqk7EuiT%k Ap+m$I6҇s͆8қrrP|Dj45'.s.:jhdf-2.9/docs/hdfview/UsersGuide/images/property_userblock.gif0000755000175000017500000013046112050301073025514 0ustar sylvestresylvestreGIF89a6qsbM4L:e3 >|oor!!!{{{RrRRR]jvƽff}0r3331RZZZJaαB(jQv:::JJJfff:Z y]0:c`])I|~nj}Je !>JZt6s;id絵RRc1JDYݥdsss{ՙSd>}&9RZ{)lhf!j1sBBB,A{SlΥj1Jtt@bA[语܂~!:z{z)));Qa|{͚4 Z)c\u7k)HMiSsޓΝ3{=!kee)r1RI[?R )Cuujjж'sb[{uAkrl7X2@^ΒJl~ݽBb8LĆ#ib|9{-]rl1z|"CXfff̈́3f뮲JsJIdϦ;sr\j៫xqctER?S~Sj!,6 H*\ȰÇ#JHŋ3jȱǏ Aiw}\ɲ˗0cʜI͛8sɳϟ@ JѣH"HJիXjʵׯ`ÊʢٳhӪ]˶۷hv [~˷߿ L:ĉ;WGcDŽKL˘3kFҁ)?)vӧ^͚ZְYv {rͻ߼ '“+_ڢGAسkOz-[my|ӫ?~z>O߀B́L"BB`^Z8K $8⇳,,0Ȍ3B8cH>@)DiɑH&ydL6PF3\v饗cP"dY˙hgJpiʜBuҢ|42 -j衆袋3J:Di:VjdzM:v&*ꨤ&ꪬ˫*묱c뭸ښˮ0+~bò6l D+N{ɵfydǷ +覛.;[ƼC;o8#,0alO /G q>WL(d10t $k, XbG544\3-o3 <ð@DmtpL74P€T;H" d\ݵ"d +zl$-tǝi$߀bᇛx >W8֡'\u$+QDqƪꬷ#;"~{l;/k񚬣7:(/O d}Eq/>??W 7D@N`D 'r::A Z@ TƲ+Qc pF'Lg(YV5 i0Ӧ@CF jWvCl@ +6A"k#ۖضTn$GEYko8sHP\<2^XF莵΍.YV ױZԪ#vGMw 𢑼-ϐsQ]z.G/|(BN} CW0P ~_>@JqbĂg9@0t.(? 0Mp-LiAiȌ7[G#Zli< jxZ75iLjD*^QG<چH6&nO[*E*oXLF9eعZK>ю UCH;> %RB0M$ISUQl&о{!~ k, 9-iyK\rd` xƊg'1W,0`hL (^頳YhхqDLGdȴDdшQ @"]kDdǘl$B Dh@6PTS<ޮ8Yqzp Oxr%F-FcЍnHIJ]bˤ~.XHr}LWӚޔ|q8`I1Vr!  0 VzhLh2cGcik D!W' 8!khU.4"xFcX_ h?("(=5AOXɍh5Z+PK$f;7n[סcD4i]1veJwwGHyw+o#{}os{_׾%e*ǿZo$* Z*  ! m %rFz@zC;]>m @"V TAatl}DkB!^荎5 "E L+X } C3`> BΙtmA }^ 1&WX˜[檡s^]0j]5Mn:xKSP.D-RC{dq~iғj>:ISrk& 0@0 ae12(c ԮD)\@zף UXtH1VrdP-5oю!OB ѢPA|ߊHp[C-U$WWlqk4r|LDy{z1V69+zywgUtF7F2QcQpQt]\"uV;$ei;s-;_7vtHf=lg=nGISjI4_ETt6x87hk`SxD`@aP`'6`H`vala0mԆX=z*bv|_P  } o]` Ȁ}0 Z p&ʇ g& "}p o0 ǰ d ޷qxr@ 7'|H H Ct67wswsWsA\ ^hvtg$,tQFGxGSWuXw {۵]_'H.Ev%^4=S^dSnwIIwy/w0:xJi3P4s 94@'C2R5`09PJO x" 4о4  Mj|`(T`ۿۿBM<96 4(K5_v<6 DBVsJtg{#t\9{(:t:ⴹ--Ɗ<*=vi^ZKIpWwӊwaڋyÃ?ض:` @` ~Pf/t\^`]d\] hjlƭƭ p\v|osǫ0ǫǀȂ<|{ȈȊpȐɒ<ɔȥspɚɜɗʡ \ʦ|p}ʬʼʰ˼ \p˸˺˼˹̩<` ːɌǬЬް l؜ lf||s<< w0w|KK]=O  ]MP m# 'V,.0-M4]6}8:<a,@B@-F}F]HH#BSO U=ՉA|O}T[Of%jlnpr=t]v}xz|~׀؂=؄]؆}؈}Ai؎ْؐ=ٔ]ٖ}٘ٚ#A_٠ڢ=ڤ]ڦ}ڨ}TҤڮڰ۲=۴]pVۼ۾j=V췊!ȝʽ{}-yt]]m}ڽ}]V%NqqŐߊ0} ߬>-j` p>r@ ">!~b @,.n )5p8:<>@~ߐ^F~Mܬ]n@P PV^TP }X>a.`\ `gfNY^nd>q^{`pH )>銎H~۸2NN`7>x[>w `pwnnN@뭞d հ6xKw+^^~z+Nߐb>>^~ @ Pﰽ؞ .>bYOyK _Y`O?pn ~5p-^.|P ` PA:/m|@ T_hbpվ  o1~>.n#pe `6Ob@#0&o6 @0#@]_yK6eto$~)԰H r0 ' {r03r@4.HPt  Vo,A֬p\/&BP0d@.O#PdY 0OCp@x[75o&_7^nn񭆾 &6@j$`D'NL`aD#ihb0!Q RbęSN=}TPEETRP:b8q1YIPCA[khr S o#$tc  vnof``d#՞!d6X p!0&C19j|a2H\N#@е )܀rJ 62@߂p+2%38 ӧ,H7hy!ƛ*T|ǟ_gOC*ƶڸ,C! & 4aτ ʬL+Q0{F`C1{AD1V (Gf,뀂}]aD]f, D`Aܠܭ[A=c CjơO5n;J*ȘtjAA  4H23%O@)oHJAs-І,T3!R0;Xc_,ץ ϻH!2bTȠGǎQ >gE=$f`ӻ~?wH0YfHP3I &$r'm2Ð臆 0A`Y0IP =1 ɐ1!$ŰF5 tI )3@ 20EL pf1IM9Ӟ#sD /r "6"P46HB E)\E,H(V$SU?bZaw͊i[. "؄= &)je'%:c{\2ڎMj swW~x??Omt\Iu//(0悺9L\n5y; +E;O<^ms'> H]AOHb]bȾT@'eIнvW_'gbQϞ!\ PטYц?" ǃA -<9T-UGR` MSjTL }< jXCȂ<ʦ+x" 8Ei@8?`,(& TQ!K4`pps€ڻ?h <`  01Ԋc*AH  (J x#%a{Cx'sb/xґ>(HF (`?xh  )rz?H>հHF8 hA#1:";8=`w s МR!T] ИX:{ `!p p^ $h8Pj " ` h X">A=4K${ 1ɰ}̿JÊ1KPCĒ x EL#A]*% bp jHF (#!VHڻ_D @`TA&0xC Kd#; `'X` 8JhoKWHx=#DH?ɑ 0 H>  iC1ةJJCP ŨN ݌bA!mlQ @{qG@0,@C*,ʠz\ p2i!h (8&\>]I$H (29zD sM@0%?$ aLIkrEF&&CQ'" "ULcLF,otʑ3`$@C ` C胖8<扞1.$$J)> A!5MsbP G, ASpbh"J̰ !AO  A0Y9XѠRMppр4_JA$ʮK\i!!F`w hjҟq! O눽`8FsI" QABLaaC"QΩ+ pÕCȿ y9`39TIE Ӏ `!Gu\ݘ([8@`6 MX^`zO]6I_ 9`8OH#YlU'ᣩ%] bs߂_`(]ԻypCPr `(ԓ7LcCIt !&K:CaA{#}XD;\&~#-./01b=(f6%N057:_5=c9X@S>AޏOCLaBVEDfHIL 5޴OPQ&R޴CTVUfVvWXYZ[\]f僰FMa&b6cFdVeffvghijklmnovfE"D3еtVufvvwxyz{|}~&6fu2XG򤞋&6FVfv闆阖陞 όbȀӹCD&6FVf&O*FB_F똶iw;l CJҼv뷆븖빦k د ^m&6FĖf ,jlQK2phNjh$ F> dΖF ISꩁ> %צ (,זQ זaB"4ņf١ ?n%C햾kǖMkljVQ1n&G;)HFBܔC Z1PΎ1j`L,Tjh!nM|&7q~8m oG%n7nFlPhE1;\#I>y>IꙁbX?IZGv>.i=?C5M2-a.M`ॼ q2oR>GdWOAq&@ƀ G~j04thFC%OPOmh p?>xQwtzDꩆR/8mNoLŀ.WxҰ9Fij `t l5DL"m$TŵێD?$ GwtZQȀwiGs5A&sWB/A!0tDGNq72!h,4Aթ&Hu朚jtj:Kv p&:vn)vٞ}o 8M6r9H{4wگ}@)vĀ\Oto$\$A23'@ T:%<@u6x葜K"9AzlBw?$Ah<=t|ncp A% c P:#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:wi$2D-JTF, D?&qrS$\}-k,ڴjײm֬XknJ65`FŋnH3ĉe81'Sl22EТ$]Jub? 4BxU3زgӮmvJEE[KhR 6 2?2LR:FR?ѥ[݂Lvh}53O?HG{txYy8q&.PA&22I3PSOUVD#hb|-2@1#}âr@5 tP H0/p#$3CB 4jȍ 1A 'd_Lq9Z5 HY(IzHlI$c(AdUc#DigB.2Rp{1ereԔk"`e5#A}` vY` 94}$Q꣌ǫ^P|DCV«`@Va }pH'J'; ^Jz qCw 2# ),=`, ,djZSbZU΁45a Y %1R5 D0 #̀'HH &1b@ TdѶS 9d}"s!}@TPP`\!* r ѲU}$dd #P Ru8]VAq @9 A42!T<Pd}*Zm$߸h#{aH#2 !3Av7b!od8`"$Ȉ `SXɈCt! C4cEyD:hP ~ bDgs \+œ 9hО+y >~ .#*QTÜ$P?!IvaEV)ApB@/Ir@%d'>щMmω>}dAELB2oMQ5{)LN 01BDU ^*XqCCHMa)*׹ҵ#9.0X\ ICTv=,bHU-!YЭa}j: 2T — T š^A l7 2 ƸA*@$ A$*7U#b8z` 7!HqX, sCH5iu+xArddO1lq8L}PFhZQZ <_2@(p9TX^|7$Fĭx㫗d}H7|Q\Ab>؃EK WF0 Y!#$Ӊ~GG{?r`$u߸7fA[qP14BvM] ~C2$ӘTmTdb7tf{ӓpr ZT|3i*[bڌrx6F%!lm@"'<$+3& &k{5Q[S((T Ly$pO_LQ)@WzHnFG<}xOyـ L0Z_WQ*RR>v%ly2؆p#i Htu$rO&g ;,YN |!TR3*2P:+5M? `oYQ ʆJ(F C0lݫ0c D0BA cMgBP, KD ͉ # #J @!K pA( iU H|Ό 8ٟf!  (/1_5 H@ rҺR VYPJR}!aK@xYZݔTD dN!N6#^) $DZV fL4(""D' #>")lT <9,d^},⦵i [qK&Ң0#]MH4M,X}`^MU"ETQz4H @LHl(#8QH# hH46^I@H=#UI~D8ʐ4VUUGH#C> 1WQI L.@LeWe@1@Өd$@}G$]5zA d# @|0Ie@ ˑR@|Kd, UC!A L |G.5$Y +DPYQ_"Ĉ\ =L!IAHh_f`RtG؏WX Ѕ@ڨ9% `HLYT|fMY X!UE`pބ$ A4K]_^Gab+۝qϨExY&I ' AdHZ.e `5h,$c|Wu D L^) RQ ,FZtSaaŐ 4ZhN#q.HG|SA&$HI`h'rzxHPD,e0h TC,\|hm<}Rc۸JE0%J8G_1(HHIP@@Ph ee9O>YˮlHp ٌ 0ͼ4wX +(P_Q|QF) W|P @ؼ`h%@t*MD1 @uV2bSʭ㰘4XvX@~AKu,)%:" FVA Pκ4uXWظt@5dk~u% uWd '+o1u57VC @@,X:uD ;VؾnI p|M°UDF8ftE (A^ ,L+RD:U0T#@]K؀Jᬄ?c]3EFN4HN^K}Ԃ\-ՄTȅdȆt+kkk-D*jRm n2ƢH OTm}D'bMeAdPq֊=. fA'Hnj1J0g1X=|. %,n="HRqfA_HT %FHn/2Ri]Bof"Fh/LkbdA9/{dt\ ,.}* %1VH# V0щ] X0h/ x WF@Nh A' &$e "0at, 0"[X!aW|OM4l<$X X) YnkVȷ] ([ DE14ާڰ-UgR! (Ԓ^J2R}D%J!]u)LGH@DT L㙷hr|C=8e%z2g2A K@V@UQ@$I("Ԍ,Nz\_`RwL {P?%JrɒG@J G0Gv!dO= }"$6,j@"hvfOSѨ brY5ˉvǗxHdeA}CJZIҺ4P@z / UH@yPA|0'PV&t$sb+~ +\ II[\%l 0ƹ)QАܱ"L$e!}CLC6uC) CUEYI1($[̖L1᫼_DOHƙoa j@ K@҂O^0Tc@-QQW(ITC`@[?uTTAU jb֐pwG˒ 6HT≅5IIdxD$R/NJAg&e$GP1] CDS_< E3ENFSDʴl DyJISD8{FF Pk"AHOHgv Pue롄f@R7ЍwL0H$I(d)\)J0~6=o0qx&sI0ʕP_WCXC␅@(}B4Q5,-VYde6 C L~##=h@ DpVA1ܸ exeDŤ,7^e. $5 %qH<{(+78%X 7 _zP{9Nx \v |gBSWHI@h5sg 0WD$LlΦ!'j^޸G*c0sh@HS1BIV=52t_+HP$ ū(yCuߑ zW&2K@*ɰG@O“^# vp NJ (}C}U=HPsG:L]ˣF&ކ*J{U\" B T@#Vq??@8p%Ad $PJ ёpVdԸcGA9dI'QTeK/aƔ9fM63HgOȰ2p!C%RThMOF:jUWfi=$ vТFix'ĦO8'9Р'1mА 93fh%# ص;CPa r͠qYki&)}6p,#FX eF4 j>;L_3FB*1Sz!6`8qEr- &#Fd. I l@ !c 2h>(#FVK`9)(@M 9XCJF4P] Fңo$R 5 $ C (E(E] Fѳ C Q#bO p# DIl(98Jbv 냂b%R lhՅ=NxkjI@ U(hpbc9h 5vUA5no!C<.ʷHV6aNF:1  &V0xV#? f;1f`ӹco dvo ٴ 2 c f+1f 0nJ1F`ƍ,˼! d\) ."Â6:F=U( H!67wF_diTv5!b$l;;-,Uֺ?fM댂‘b+Z ,`p X(PAc&b-:h$F5j lp'M2, 0yHSsF7%6K$ 'Xpm$rVb'dGf8)J/FhtʠFp>teb6R=\6XAG#V#I8" [ `&"CD&HnK[B33\Y)xv63x;d( Mi)&t9 !4R@ȩ@N U!eEA5,=31"qlL=!m BejSj,)9;P82+czrH>s6+ BF(Д}fxT2fƇ2R#F?r@[ f#L$ M5\J@٦T##:jPQPh+ ȉXϚL$BD()iZj61!O !^3PZ'Mi 1$NE}@H2 ړ ]$ oP`c6, O` 'xV0<H" Р* |3< \\C |k<]6&s"o-uc# Y 4=i N+F,jP j -;R*K^CWZi WίFf b' @y+mpg23T8bݔ N:*}pG7Si'ͰT9Nc( MzyQ (ĐAªkbD}G¬5c9z峿1b ƟFXM}`S&:L dfy{#@o}{*=AXd.fK 1t}w!n o6~ИC JxB-wa>CpըF` ss1gѯ~Fσ\_I5,m{Hs^4%Jo7?=Wl=Jsa=^jzϓ:+d,<odօ4J !SE` Pm\, YB2@mnk)JFpbe'0G4% Gx gT95U.w%#G"`D4\†KeJp`܏ : `mYcRY FfK $%6/h rDP`*#ZOdbC$EPznBl@IF:@VA9: ĠF|2% s }D99B dqgXDe45h@E^+ NgHHkX@cRz:`, /ƪuFCv*& &5 da R ըgf (fi,Yfj`4 H/D1ED&a%N*+]%13 @L8Z!zG3 䀵ZF@d#R0Hl`0 ~nr~sC "7r"2h7$@ 2$t% d(o$@b$)#7|#$G$%dVRjuK4`JBQ ,D;`SAC 3`ز<,#HVj H:4⏒$3-/5SN|S4/>vJLM<ts6^3pC@Wb1k3Ft4($8A7@sfXHSl Rl5! 1e3P2B&0#j#'(dS>898a)9o9S9WpLs RD>  d: MǫHf1#DHN/NBP$2`H RE/6H&0P.#0$N 'Q(ST3B[ *,r$l fII1!@0?`SF߇ƧQt,W$.ZODt5`9"Q>#) <5 *n#`*X;Rj d  h5Q*<(WsK:sfwhl)`V;Hgg:hEHEdiR( @VC릵2,-f)!enY)2J"%&xZɂYB4x~{$- 2&X|5/i-h:  rfg>X¨Ä}-hXN)fꇈd>X+wJxFrax8'eZshJ@؎Ŕ;B"B疂`Jn8!Vhro"G=D1VّV1[SJW$A9땒MXTUyYv~L!DGϕq9uy%k#Eq%4\}`ϴ J#pI p(7b p QۜFNk9NM$R@f6EBrI p $L -4.YM%caNu*Ir8RN d9 #Y!73Ѿ2VCU!FUKZ#4H9tG`|dh}U+1USY`=6#g|jkMb#D4B=~e wB%)@2^3(2i.+ +CShQ`1Izk8/`a,E m2&'3`U0BA%*^kl`T 2ղgW[((>$A/ # 77 #f`&DQT[Gn !d|JhH,N$Q!e[z5PYG@v^U ɏT:QAjW©d4bHH=g<]i^ aB6F(fd1YFj@U7$ $*jTef.tn?:f@/YKfdm4aƕ`oS8/D`8R!1! :* `Jri"[%HyтQY9_:HoFC32#7N`2!XDUWQv%e 0ff=t$T9QrOXG"4KS`*c `/^ ` ӹI>fcQ4kCCP΢i2 s@--5`0CEd\jވ֐7sJrHK))`Gx|1y)lU#F~r ר3qarGmX5?S5\Ƚ$Ħ_WĜ$)TIz94SKK 9C9VrAK@ɡf9$`yq( 5)O7PGd_h-gi)Y* V $? % Pt@!8JB/! #0H3`4 qH0#rPr M8HD $6XՌ0 # 4tQ N5b`t‰8JK6X5uB#Ԑd!1A/5bLd@!4 grΉ+J^Fbd3X!rńLʄ4 ք#HEB'b""ђ$ yĄXbD33P N*|XLtف=A0ʔVNEFL^CI(7ç#HgQ՗__Á .ݾ oKoޛV  ./A Kp}߀4Tq fqB"Lr&E#r©' /_0VnR 68o M1tJ/tN93 ،3KC=sO vbMvGMK1fMwvߍ7h/vW{`c'QB$'s8$@NH D0vL'aS1B0By0STy `褻_c-5[$QaEe@z9Ozsܭ˄Gj^pc$!A⪵L QC K DD}SEf:loH|a:P43N wM\$g2!<+F0 LMWZ 2|T?a@:d,jD d!  6}@d2`Dp&@ H`01OCE C} p >XOH@B0Ga$ Fpq~ D)?VcX֮`|uTͩרPm샌#0@>{(1 %D|I n$? 1r YT⽗17⥩%C|Fp(i#cA  `ĥt7R 8rZ9a$JC"cu '4{h`)SLv3U1HآC$?1)? F1BE& +ځxY`L*W BvbKAlk#UlpIts3B@ 3znBgLF!,&?U҄KNHE) d,(7:EBZR7}@i'>ԥB2D/IN 5x'Ee3 tN&pI !Hw d}I=y1LѢeA Q2R=/^! FI NEatA”YMnt%MpIoLִ3&hjQa=ip$%I@}m `#hlQd/e7&wU:[`Y5Y_|t #%#Io팭44H9 4u9#Ah% TdXJ"'h08eY)hoPNOAus` Si ꃝ]7\r%0_=M?3"' Ϫogre!GD3BCH>ԁW;*jIwKn^lzh,CP(! ~a2c*C4O~{%`eY=@>thE0P# ]fbRR̤PbX0H58D`i  T}^ٖ5us&@yj G 9KN 9Adͳ ƞ$9hV3bE,M9`@Ÿn%_Rמ7<_"ݗ" 3,oaQ">_Mj[0iQE7N`C&BT"%ԷNSC S70 '}+kP (AG4b53{Dv}E0F Yǁf0_g-P]6a̱CteHx$5 0d.;3ZL!J]H_6w/X``gH"@W(ab *gff^Ym,l {8"/0DE]F6ұV/1 +H~qR \s؇P Vh&[!Gb$&=%Ր,g6Ű [f\~ˆbЇ<^fVu8(hpsRxSs3R3U84/"dqᤏ8[.z/4I:)/qZA Bb-# 1)3I/%ynQxtI=? cPx7q1)mr\,Eu#UygX0x6Z,ci(vVr0[x|1dȌcE/aAiPqu;!b$,V U9g=Y3CGkY f(psQZho̳ژ/1IMuD7xRNA>2ySy40z2e7 e=ڑex"pd6{qbL>f #5%#7'2>2R)SKB<''0{@#wYZ$br6"UUd0uo_`dv&e+a*:2boP :Y`wAo"ow}YL(5OEJ 0RA`\E_܄0i<"‹^{7p[pf&FgE"0*'ȑ+"" EmJó]'Ri9\ #/0 g`24W'pdtddp?u&`Kd؂@Av#4Y /%w3r %fl҄Xlb/d +**@2y!W2$owH`L"isdnȂ RXo5f#[-f!ǯrexVgi$^a"3P*Gb! su(b &,YD^Ev1&Be'3_am #6-FR `JGbr&6)#6C`VjYx$Uz",f/wEC4>c{70$h^jE G֭JƷixA54T] me'u?@ {kl2Of IR gtC:C?"31#`S0tO&R;0)РSE #K &O j]hk֯izjo0XoN\J)w)bwYѶ<8tTֶ$3^/}qr2ZNDHCL&!4%::sw>5 sRԮ@\EBn_^]tcut<6[?4]GRvǃj{o0>ԵFтzAΊ$!]DK-9@F3@yR"'!{S}7#i-x BPK l0{0eA51)yS"8u9/188"PHf+qa8049@hB|3˱$;[8<'&BP.gc9#T8f?}wko@E9*Hbïv&cɓ8d`@8>̂cC΃?b@b``TACz 5@=**L!O|in dyN) +2m=֏+i/P0d,-20L0xCM>szM}0D*10sd)LF5 ybQ dh$J ?Xl 7)wmdeXe5wOH2Y:CNJ'/YUuٵo{4T!$B  9aBC"Av+ʫKt?XY+AqKB clB^BH벃2᤿B\bFÄ0)GB2 1),DȞ-&BB4L4Tӣ S*!F. ̒CLHI@l; ,pRpL 8״RL3tSN;->A`&&TDM +F*,h-f FF0JUvYfuL"6 GbxYͨVE9 :*JŽ VwPyw_~$r 47ׯx%$_va#4`G l*U]qޅP„ACp `j 0Gـ`x' >2^Nԓg6gw䃪枟e7VG N(g$ig6&艒~sYI6IKEfx0KBj窽 -ֵ**J!9%+-耑WAF`d!4/`A"/Ff0 `` =x( U%C&x1Ѐ?v$Uct  !8^V;Fqq?A #C؇@TOTjpod`1qB8n홈4PdnkhXX"HȂQ`nQأ|,!QJe/L”:KdFj"^X D=h !=!4à !4J0 D6}3AB'lSO 耴 PICL0B0 =` B5ZB`@ c514d8$? B C :@3 Sn˜@Ĉid[}هH3[ $R`4bUF]+RSBH3 #@L]`'X00VdhEM6HN0xMQ9T (r"gEJB<: A`ʁ"wLh}<94&4uj0 V˩b 41`(`AЀy+@#4@Q/i9H(  95}t ,a)İTVD}=$A$ ]ÊX1+!3rDPTңtYe*R֩B0!2]d1pي4!'(NyR0.,OWTF(0TP3uN7Ъé EUD$pִ P[i=C `8D`jҬ&eZO)/0"wщT#tiLXc@!$-E@j(U"ꊏ< D>GD˂f#AFTzd.^VDY`ŔX̴#3Be #ė_lUo"w9 kpc] x8 8}Ha@nȜ -M))'@od,Ԁ( PPdD aΖ'#h6񶶺9%1Ym:]{ȀF(kq3L4' 1Hݭ %  dMPTi}!Y8d QTuɩ``$Z ȈnUc aYiS(g0=v {F!CCquyB"~S>̑R[,AdH"p">%(6+VEc":t@ iF ؗUOac! A2P E؟x1N@̌N|]>^6 E/j%+Ҷ!H1@ !Ou.$"ͧ^a} 'TS'd:`MH6h Zqcc\Xa}> +>`;ۑ<;!R>$;);{K^xj`AA$A-AD# dA")2-h)ƒњQ#+4ÃpaĬ(B?)B9-Bd>$?,4C(d• $H$@).ӭ˘u!<ҽ3BfٙX eaEp;ES5 QA7*)KA}!cL g)eDAZFi&_ E3(iFnFoj- FSFtLGu\G7[Aq2EåڻmlQ9!B@BK(m ۑ99Y#F`Ōr=>0jzb8R1p8\bAdɨb6|+:1')LwÃ6HK ;{:18RH: 1; @8;eW4UStƳ ɂ0$msZ``Il^6#+h5^ ĩަۊE53] vOwC-%L^9"$ {@#e!@o(id)b,n {pYA!", `|Ļ2 ,d7+`{VU3{@&Aِ/[hL`sC8@7*,ٖ?xdm{ +1،1ݒU ȂCp>8ͰaJ#$ K<3 eFZ!pL Y gƀꥤ+XB#,4`ɀ>墁DiYJk+!HNk(⢡p#FJk>FJk|`֖mK ,mfPmAj0϶lSCXL 9` P ㄰ۊے̾։BkPl9J뵉n.fj+N>ΜGH))gvou\&@O$0+GB+np@ x'`F qzg qgp`l|3V_qo V#vqqlo}A~AఞY$]r 3ߓC{c[#]؁  `zh$1d%߻%r P0R@֏FoĔy4![E$!ȍ8bK0_b\8c 0M%nV48K7{ d9ݗQ R J 2V`Wۨ ;*: B1`CM6`ѺJ؄q. z1̐vfVА l_h!x 9Gl?vI%dw2Vt˭01 RwA_AHdXЦ 9WE֊8W8(*j;Mݚ`rȪܯ`]OϬOw3I]BMԨ ԠIOjAWe{ɧ9IBM{qƑ zK宖Ribo4"lTCMɋj 9h%u5N6m% Pr(!pzoPk|?RWʌ/umS+8Pg6R=WY}lu0& 1j}AED}sGr LY6XsPgC\1uևQ]1TZĄtXАk I@'(uWÍ5B0}_X%w}0 bՀD ]xƗ_6_Pb:Ur|@UPM@m JpQ} 2iPA'  Pq`h RAAA' d"+'|5"k"4HP"de"Xbm$(BZPE{qBdd\#u &5BNҋW6t 2Sc ApW [u(U0Zޕf AhI gjm #3PL1h#0TCrS00C}+ 0#d'\4 ]&=YL6<0!- #,A5ji PxdD6gr,Z CzC9G4 c0BD't@VCP!7dM !ydMа J rQ!vCQݼAj ] U`7* VDH d (_e {L01 <#(FPG,d!  A LH!@rQ Q,*<+"$f!)l"%:{T/D(hD 푾@с1(@Dr$.XPCx/A hKCr Qq]sA7!i K 蜁debZn2_iCd¬' CzA+X hpF2 * 9w4fTWٌJRHۗC Db2d+X2$p3MPF|D 5^"R0 :|!.7zNbmPPpH+$NV#z/vզ!X'A r!Ԡ-#h$Se'ȴV0>!8& Ku ((PTb ƨk9F+heRLYR7 " 2X,`X.@3o] V::BH1ЄIqc d6銬P2$$+.ACrH t\$@)FY- [IPMdex#|y˗ -yx"j<\{.`#ȂF_0 nj#z)#!j|"0Y 0/r.?[e"F,biRGC!n@fM]p(sBXATI9x08LP@F6z ^SJcH5?(VD=V 9$G6{ޤ|=vjt?  R;,ʣ.zәL4̢Wdtm_0ؗaΈ[YHB0€xq@̄G\\X$c{ЌCڽ$@h\DD X0¢IaI51&Ead76MAU6*vI.]?͕P'zf,zDh؃X$RܘHB5OTC4DVK{j¢@Rl 4|%zN Jlv@ZR211Bŋ!WզHo2<\&e,\mm)ѦOzUtfqgomfB B͐Zi%a?^c L  UiM9EOӛVhE5]G\i~LK  v{b^'hF0$ZکݺX DX@I5j̘l&!FlH@ Hy7,ut S&9Ig9#\1{0Bu AB`'o4d xhl!D kX+|[`H'!(ڤ-bͅIjW @GӢD . Y F}H}jIL̀p4GkhɫF~wGQʩ̄d^+ zn8QXݹv`؀G?=~%Gd{L-!PpUz1DJ1d1IA ʁ29 %\rkK"PMih.P}L ^Ĩhm|DbKJ cU.KNBFz%F]DڦH}UKLuPMy`F%D2sPp8 zGY[=q-=nn Mlc [5fX  pM ʔĄ 鈁c!Ʌ s PX ph פm+ CF0а kpŇKHۆfy /P|oq Kb*, 2@ *U1 HC${ V9% q}c ׼ yqMD G  \0e"cLFT0  !d`z P LRKP AO!=P3hA5ߖ7$3M96W\}3UY5wo{ i?랂T'6/5c (;S35;S)4raC80۵fݔ<C ;`g\tO4set 5GA 5ZBK 2/_^/bL:UcuVK^=CaGqjuZFq>-*X>/>V^E\d@]Wu_AC".Ua#vZruTkn\ $P&fouP1P&:++|L`g;Re^di pv1+XlV\e6fXiRC'vv}(Uo`\]G`klDc$h̄P̌H?@ PXL| [jhŒ|?Ę ِ@ڜ0Lq=և UGTr`H[|P@>G^`wTHRn"|Zl3TңL#XgDE8P@  @dEX w Ou(mĝ6!҅EČD1ɭ@U_|dXM{mT7 8Fem8hL9U T7'Je`B#Q8R]t!dJh !, kx5$kH4Hh+\I܈SGx\Qur jPnHPRrĥD@*.C 4Ųd,xsL]1Bʁ REdoaMejE!_AU\bl PT7Ь]G0 |@Ou 7@kdL\J'dd||F5?^ـ\%fDm_ɫkISWSs{\ALE A{wip˯VZPI@L2{ixVLɍNż u@NƛpX_O1[iȆ}ijE.a@crJJM`I&Lpk> V0 ۏpA^ǵ+΍.&/=SF}9V!ֿVrĆ~TP{Hh{<@Tۇ)yYE$rD}Ei$*`FDDrGnDt!pD>R8!Q}tg2ωA%X(xp N<l ~ ۷@6>Aa 3jTl3k֬1M@Fkgw#Y Gt42FÞ탡}F)F_*HCڀjc- $$`5¢]C #FB13"aD BUC0Y$SZTÉ7~yr˙7g>'H Ɉ.>r`1 =cA>I@iQb44*00@ݠ@: ,g8!* ++0HG`;"? #2$ Ѯ0@Ħ$C!N@0$V4 A F Ѡ@ ɮ$H2`& j :I l$Ajl15ݔN=9 A5˔BݱL3Y&S? 5Gc0D"H'F/8a,A?y,M8jղ .,$d&Lr@ *İƢ?kÂȀ',X8b(~"F7/΀6֋d/a.y'e#9c])}fmyd+6`4&5&Y?3Ik91Nb?W}M+T4 `Ơy6H{>|5 rn~ȓ#cCM?U_QjE0K0}xGD/' wy'襟7>,~e @`r>KixL hABBZ b`0h_p:A|# j`ƘKwԯiB>! A54v6&&IUFjQ ]P*\pְs` p O aT1UCPE*'_#9D=bI|b}}0TT#1OcB] JmI0B>PFTG !'A{hbj2;C`V;$Bzܔ<vUpݲ̀IBP sv ijh+h芨mSVf- h\J P M0h 0 F#S' 8n"] G"4t1լtm" Df6qZI¿>#槉ÝW);&@cKs4Pn)Tx V܁?3c"I05/ w?~FhǢ5B9!q8I_gz׿uG=V|Ƙ12Kؓ<2 OZ\|4s ,fO޺p9sK)ғAXZ?MUIVHx% 1dY5*(LdO0kKVDF\~FRdb]H`,4Fh#~gN8!;RƜCnzvpoN0zCF$fl>d#,on۾("MtDAf4h;4`;pu v *) 8 pcp B $(P86XQ#n o#.\$*o c> ã 2&  31b5.   .6m4g:("3&(M" hC14¤=$ܲ1:lcf@"hC6P/ y:7аt2`B8J\.0 txNІ,tZ ': a~Ƞ#KF2@R$ JȠ~06"X!0XaV\L.,tp<tg HFh`\MPC#A@c ~ /,Ɗ R,˲,Sh|,o"q 1/ F@:FD! >̤ B*% $ 񆂙T 'w&H<&@C >sM*IIL R`1#%"0$VB' #8`#΍hT7(s=xSCx"f M$)2% 顄 S4 $4H9#(V"3-.OQB.2J3I"Ï "aD8X> K& @)+s epS3=. R:2q8j ]ċ/(ϊlL7\ F-X4 f=ú!ԣ lh&¸T&3FKJ n#!b"HT9ޓcd0? 0"t>%D KTuģ1J 0B3ۭ~F @g2 h=Dh c;@K#Q:3A^BbPrm-h^ DC3#c4 JFb 0/32b;=Ngߕ&/nrowv´,/.3t`aׂ) )j0 `+  @ꄙG1t`n gN~mN'IUu2`{ GN I t2tv3Q : tjR!>kdC`EņfxV)-FiGJ B@pgZT!x0d=QtT(wv-8rɐxlCRth>g2r, H' QVQ)<w#XUAf>ņUgF53kx=vI 1Vw27ty7rrM1v)r_"qЊE^zM{W 0X/^WQڊR^I2CxxON`Qj&n-ogk8@%tq?Smx7HF-mO ĠTB>XAJ@% pA%(l: sbĸ؎"(u ¤:+|xSix|)3)^Ƹ8M Y1z$tm׈Ү8rS+sd>h\Rh F׈A(4=C00F{8%GQrB*D2je9*@#m@deY`&tRHX yVdBĊY6Y 8`gy&>Ĕ nTNIn0B\m5u4r""#P#uC("V b &nS!KS#j#j&V7閔^Q8j8-BNTͧ@>T'b+7qDR1 M(4 k8sXɀ.ʮF\% (" RѮ@W$svWE^v- BR,pj.#?: H;wBUs "NԱ bFFϋ8'fh6^i$ !C4 ,",CCpJ  A=@f,3Bh DFl@ 0`&9 A~9ԳRiXª j!l%,cńU:!{-Xڞچ!8s2`6x @@5ih /K=F ).эcbF m>f/S*$6Å$%p/&Ȥ}B2T2@4!f4qL#~_ͩ8iqVDͅ0cAn:@ґ vN=CuB5! zLlqxM3( BMj\CnWe]ts}17=8'w3=JU֕ ^='R}ٳ]۷ۻۿ]ܗ=S]֣٧WN@٧A=&zIK.!g^du}ʌHqѽȿ 3>y EX䗆fFOSOT_gkos^ws^ch~I{FfTh^ Z ^뷞^Ǟ^מ^^Z=C ̒_ _#_'+/mNX?C_GKOS_W[_c_gkos_wHJ\w: ___.`m_ן__ HP:P8q#JHŋ3jȱǏ CIɓ(SLᎆ I͛"ɳϟ@ JT&ΣH*]i B!.JUH: õׯ`ÊK,AϮ]fKUhK]Pec߿ Lpj ˸cM2˘-Vm,xLtҷ/)[6ͺu͈1g&ڵ$Nq<#n;s˦=N㪾6lԻo]=VHOYzwSzH !AT_ SQ5(UaĊ@=RL1X +;%0b1 V0._L1xTtaCT &0` !D1ؠ#CtD/hLjЕ\TE;8Џv 503 @ Q]I[ͥ"}YQ>id0iW G ԹfniFRCtD5AG Fȱ}a9Ze+x@F` Jؠ(BYëAbx†[Pyk@8nLrhr|B+F3h$zn9n7dQM Yg ߈ `\SJ$2y { @. s0(P*;&YC06s|ʵAץV)ՀBA+`-dr18c~Ydtmx{Bqn78+x[xO'dw砇./[~僿lz.n_ WO'nv=7gtG/}g}_WomWV/o_vЇw L:'H Z̠7z GHp0 gH8̡w@\SN@"HL&:PH*ZX̢.z` HF#VhL6pH:x̣> IBr;jhdf-2.9/docs/hdfview/UsersGuide/images/hdfview.gif0000755000175000017500000052152112050301073023214 0ustar sylvestresylvestreGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,HL2T720bD 3jܨ1aC1V䤊1BtpbE0_ʌ"ĒiФɹsN͉54ЁM ͺxPnviym~V̏Ǔھ*-SNֹh_J}(L1`X 1Ќ  43̅b΅v8 ~("f82[(@IB )DM'E4NBB?.$$Cic&dD`R$MmTD>1R8dL4QcePH)En@Vxy&Vw]md fuE[pע>aWyab_͙n<1%gMۨg*iP8z9@5j*7䵚j{Z[lluW=uiI΢xqש%j\rʊ}u?vŀ1!onyfa;hmJg zYUES]Afg9ekƍ%c$E#2@+, -(* H2= / ; s0K;G7͋L;MumtB7}2L(.|C є"}v S0 Cn{tE+=yE%mSA >$[idB {4Ii|qPmRQOԵRcuYYUaujNi¨BVqY{Y}h&NQeQ꫑vg|9ۺ^\)X!ZֽZn'hE>t!8 Q^r -M]Nk)Y@CWjG$ \Mr>]MU83BU0v LzU_"×-BSEҦ֋(Rh #0bi`0 1&џHEpt%nx1CM͏wԣ iT$yJ\ ]'\:$ *Ui'TQ>mV^5e0!HiCQ6bSB.yerYANBϳrU@[r4yat+*V֤N[/9ӘI"^O/|^| L~Hٺe \ ;I*!'_SZ4u+yXʁg_ʂPxsJVTuzU&2E*>IqP>F1LPC㟄H rSMaGMb5#HM*TLRTf*VF=*T2 DU80M"2@ԶG &-pFr3$KIHF"p&7 6%H.Ƈ ~hٹΠ%~j}'~CJͳ_lyբUJ߷w׸K)9S[wztQk0Youcq9,h%JT_|orYoIo4E}^PSJA.09/+'yK̲P1 ).OBByAiC7gnB 7n==8kwlsY݇;Nr;eg12FVה,FI|eiB:g?GKȔnĥI86T =Gɯt>k,)0࠸==ճ^W<;qU *U I%^x\_9Tq NHNMYԌAuS|ƙh{|9k;l;d7?"M  B/]ӣFK%ܘʙuG(C ?3C﯌tBؘ: &{ndH`H㹱ldlȔmah$rd$8mjwl*Nbj1GؔVeD9ėUfYNAzֳj?ʈE7;)GgBޜ=znIIVy1MY@RIk]DuGtZ6י(ۙr9Fh :~v#_TUʽIeTus2_>kX.y٠ݔc~/ze"rW5yGLD1ԙq:4,ы-PmSQnF" Ée?vH&XebPF !kr!DB䶸c^Ar8c8rG 0 kVˠ P G ex6Bc?@Ā PP ``((@oe?TCM5Wf^vmIn%GOw!7Hb#QBQ0jphJ1h!`Pg6Ak-s0bʡ@Pֈgo unĄduđ#L_1~Q?)GoMPbe=NKRaFvۇ9T P]PbL `*LQ`*^ T0  @ P `s8 XHdN G4P @ :Py$ 25$< 0r ) / 5Tf(Cf615&QGHgbug}c_oO&aw:O8w^Gz:!e=ц^c[(ʸSLka]x3lmʳ&!D|;aO,~k]Ekw>bؕ^ƒ7 @S-u@y."_Ɖ&'т(>x,׍a.@2R;AKerIU=#9,% Q9qAckpO 6vN@ @F @ a 9YН Dd e :j Hu7v:  t1ɠF ð) :5t)s3 QC $:BIDpa)BFpqF25L9KJg&"{4d؆Q)r(v+vhb(xgOWz6_.`lQaD'1C>yV.7r,wX[I5a/?Bvx'>2 rLx[n)X5-P{*UZ)t- phi D7%UZTYTxY ~ʎh1 2@ )is4GРI9X ))H XP IРfc294jpT? *~z5 3#Y<J 2 D~1X0 T` A#k8$u&4%0gaMƣWv<\[1T[@NAOL {=~裈(wDzʒ,J[g|ڄ;-&?v]y೘]ltz.h@>/+pN]ځr.F-+iXۥ)a!nt'OMi"vң%aǨ9i'Z3d 螤 Tw͉MJ TZ @) ~N8˻9àX>0G >p$$&X"( & `ʠ&h  0<,ɰp ?0,7-$#L(2t%sH8R'Ɨ2Mꔲ>A}+f^˖fkIlz!lJR;Bk8D>\=@,iˆfiô.Niq{. Pr?aHjvZdž݆ *g{ncM6e1/#šYW)۸h ۻɵP ]UEɝɘɋ`3.7 zTDsC@ڡ[˾ {  -? p7if٧8an6I3kR1T+[0:3l0yMJ)(hvo)-1=#ZAEqJ"pXMKSYyY kI_]j{g)oRAc?Q,QZ1Pn/'9lT\G'k vAjnd(BLYDKi 7 0W- HA Z0 л\֝lֽ֥k jm֋мG. C H C0nT#v~2)1C͛2!P ˡ U ˑ<{uu %uk6a$jP=j]s ʒ"n . [CG`p͞\20/ #D:wF]aC[sO'ިl?a;gMUIUZWX@td+ؘ,vl4 0ui#ӾeqT?ҥp9ޚBNE_d_%͉J]%QAnљΕ%&eU|:U8ZE1&i@ eS6 R @7 't2c >3/Cb&!%!f{7V#~Dt2/tѡAL1Pjid4˄0$M244Ҥ7Д<) H1AMHo(T#LcpIӇ4813)DM4L=ziS4caCdd95ӡIbfУJ[G}@0nߡֽ(׮>ƕJ5,ѵkF1`ŇV ۶hk|v578EW+m8_q8N .c܃#g }<ikmU-FEbzj격 (2 )74+ % ) o0@QDI,-TXQ\Ԣ Q-FuAG-z0h*ڧI'l&#J(T! eP sL,DR˄>Y2Ɍ4b#:Ύ荙(j%Qc'D-o?0)'@)K4D*`Z K-V، -|S=s7_-2X+&ó% Qt=B5zKV[0í?UL.`_S/Xժ׾=;CHNk',iTBt0|@} bu>p3N XI3_]QNf*d<\ӭ0m-(-4Xu=־U.BќN|;}ZarkX;/; qP 2^9Lf2G qi:l0%o$vdo2ւLrN;Bf}[PT!׏i&TwݖO6>ԧv4^ Exu_B,Ԧz'I-Oe|>K d&ܽn,Ϲ|d%9&(QH:EDqj!%!pI5g4؎̴]K).0ߪXU:}.9p˱MpMdQ:h#;-)C; n [Abph < `ى%sǀ8a9qZ0QaBjsJ'hԉ>[4EaZ3ȰL'}JܺbS@Q@bY)G)GXIixyGyǝi{ǂ(0G9Q(̒+!`ȀLHǤ)bp-Gze؇eXȄ$<1A"He@2"1)+Z+A/iDI'Jɇ(ǀL.2AI,I.J5)m &\ &ve`faEaua]a5`a\.`}]]W&(>aĭ_Mu_/V1&^=X(U!RomyS`Ta0&a4PʅCUɵ|?nۭEqctedG=TYN[X@m}WI Z=F=e_V[OfTu[u[fGUTUTW~T_^Tb&T]x.ݚyuJއy؂`G~]yYLf}0PX Q|PvD̝Y-ieYmMTi^>^ح~iEf{Y.km\%ijENǽk E [Ryd}Ci~fF]S@feC݇Zdyfa(`8蕒vZ8WݮSЇ=އm]N>և-]vX1Xu֕ݝm.X X^\)HDo^_ >f1o6])9n]o] ]_pnon^_o% oooo`^q.p^]qpVqouo6gpq W Gnrn"u_n wr.ߛEq)gs jcvب&'i\Yv:IU2f j&Շ*|dn^s}؅8BfBEB-0۵L}H'Qiu@gLWMtA7T} Q tx-|؂Fh_5uYMZ Pni%fiڜ髵}T[EQOpl[絭Wn_[FZ]k.展BggחNٳvwYRgw1Y~jig fݥnr݇e 5Zj.h&N\xa`\v`XJ^Hw]P ghdS0?'UnvMg*^Hg[f h.&itaj(pvM^v~Zv~~jv~NwFZ l'|'ڹ_w{y|ua.w{qj5j~OyZ'|Mз{eꭉk&}wjw|5/ذkmc}wxn.X 9SoLg`M>h`d[aʗXv^yh6n\]KE(_tkcnUy3+YEd\N'0Z>. ΓK}tXP߲}4xrc}TBzSꋹ/ZO]I3%ĔԷ}H\iSeQo6zNj4ԭcWFaڛP&znYuiTCd2dЂCZ)UƍfWǐƵ{m^4Z-WUkըa~Smcrc7,Yҵ JؗOf>h]=7}f?2ṴAOL'AYV4,ͤ72);dž;F7q_-FN<tÈc)R>1` qd!Ætme> eF4!WcXoSy>[PcB dk(KÍyO4C &y_*=Qe~Yyvu'W*.tBz%d&z" ]_v)4c(f٩&JQq6Zh' 'Ae Xi{Y'?YY"'}S?"+TO94ԣZ&{1WiUPl8m>1(3d221'ԍ.a1 < Wt`"?$QXĀCk>ĎR7EOcK eQҼ\HboIYvF_2OEԣ15l)MTCP1f5Dلj\VdNoWkΦSմ|ekM`Qf+,Q_w)mKtmYXY_u`=n7fumtoճ}[lwTjySf%`A='.8fʼߺʸ+r'kT:A⭘rZll$ӓߑ[=˻Y8CI43a:Yile_t$@*;_r#jN{Ϸ"|ܘQ,^z ڼ^mYB+`JcqI\ m4M(@yeVM3ZK#WlNJLArW5ՔɊSF`5Ք܂ )B*wDU|Ն3 ~>޷VCl@ןyp?\6y.cm|Tu)iq y}^Iuڵ 'vǚ练c\ꉽ77>mdlܶ@Q~]|ı`\xX]<TXd[@S _9}[^UہE})N[r wԑ iП>!A&Ї ] ~NyUӡc iA`* 㥟Q Uaް^Wh&( $U]bP]t$[OIm0"K2Kө"+xȐ( B9 yiUjВ.N_, ١l;U\9 5ΟFN(c\Ou_%G#*#eZϲ^R<_ͅwKb \ e@LZtƂyP--=$]YpZTHm_I"qK^} \wIF:3#vYFc EAS@EY<ĺĩiΩ$)ʩ˺))ҩ!MjL 2,$y4&X%:ʠhՃj̩ʍ,lȬ] SЬeɫ,~eZ%ֆ(̺ڣ,lg 2^q LvÚRZzƤV`]`Ub zZj6idܺٮgaɄ5TlrZFJʐ+^A+p۰r㚪6!*ncjkZP)Ԃvff,eJ.mȖ-r.4杢.V mPa(&0U?փ̶_է/QFowtzޗ>r-VfvVЬP*uj2 S꯮V>mw~oB_ڣq6.bog(75F%pnw`j qަNnfoAbO_}Uzz.3 _2|Nrt^|r(Q.6Wq3!05;-^)q~#-.s:tr1̯BZ+Ϧ2)Q`)OJlkZ1+,mJg~4QϾJͱ'mr,M3n2o ++=%ˢjNXM,)FM8te pgc4G3 7fJmO?@4^:co\R[47oq(t pUfآsXfZ߂푙.RO^00FMuI\O |BC˚I!n?L̒.T ۮw1/+JkV~fo"-~tȬ UC*;I75^qո58]yuR?+YwzS;w_n6q7SCs6]+ svRK{w|p 2vo68|Sj 7Ok*'~s5~wxsTw_k{5!x='{ewn e$A48JnVYvfZj2zU=> G.r<K,E'A92IX 25MKo1)_T/$-!кaq2 arI>呂%>WRcoޏ'{vK}"ǂMޝ:KrBe_pfw5߶Nozj0㵓8+R6zw*n?PK(ch(hi(JKNIp>g,h"Ҭ֖>4UwZX4gY1FLsg?[QQ7rGv7WGXs􇫸gj'0"o5C|:Y kλ7uk't;k-9Ys|w887== 20! ;xR;8~0vwS$g#Rf1>{O<3(!;|O8C6|[x<>5uˣ=}'Z6/OՏ|3xf[uRG^?@,ӷl@ыVOپzk8@)70.…>x0}&ҫQ#Ȏ).83bK!!<$E틡, 440>}B$tI*~fb4igMBUtW1a*l'}Y dRHV1R_M51ŏO Lxxō!CַqEp!^4I1$Ǹp?lH`ʕN&O$NѫQvR[Sk|8W~Ȝ IV=(P%v zy%Z7sgn~:.˱߾ @ʃk5 T:.-BJ9Zp25Z<{{ R__ۓM<UQZ.T75W5UP;Lm׆RhMcŐI6B]zR!916uy>-1k/.f˱OxOޱls$?^z䉇1}hc R΄6gʛhuԏ[}_D2^7|j@Ou m( }Cק%|{8 $9ٗ @=K!+:dv, |e[pOpHԍ&x&nωM,E-IAˈ 2D^ f4%"sB41,.IWrF(,K`=-%W:z[@7<s[LH*/?MԤ+ⓕ>g;Csl\+8lAD8)oWN]%U)hA AcR]r_JόPh} MWz i , [f[ ħ4|7ORSX~mEQéOnv(h(11؇i ڃ@!F(3&FNb2T⒉H S@lɒIPudBHP={<AЋIxn7pUÜʏ4 0ԱN5歯eJޗT/sOv:1=/1{rظRU}]_A|L6*s%MVnn?,o 8W"tǩEܞ^'=i#%ّ0nad11 0@ PF!=C(d/E&j=wmMFi*$+aVʒ%f L@S˒S>xHu𡛊b ̯On-_9{K iŸԬo-@+R1>6W$ qb$)d)t,e+BHBʘ!bic$&lȏt#$N,C^fiX8Ҟ8Tra-izASԱnm/js"\`cCOx4M~q <Yozs꒥fsȢM‹Qs$F8#CAR#gۢSy([XCř-BJ畉rvl xzwafx]2|z5}Z9֐3|1/yy6MDe!zӾ)޴_w[X`)9X<|h On[t›OV<у>sy2`@7LR&Ԫij](SŰ6dNx$m"scB1&@nxl))n""dJL'&d΋7K Ԟi"0LTϜBZ.(pfShZPkPM"jܧ0NΚj"R֩D 1Y躈8tOՠO L}&ebo\¢0|. )` m gp ">NZ /4,:~!fq~Ltz菶d%&VFqd5ɚie.O 2Aay$ڌC֎Jf"#B BH"bo g  Qp ;F{Кq&1A%np !bwPIxԜBH| Cְ kQ1$#$!2$Q? /5rk" i%gq1"''2"q"-rQ)(e" _V*R$Oq( h ͥzް/-#8bj9AJH$ 0A c!.sdκ8Fb6Pz.=V*tv d/7$gQNsHn'#&+\gXg7/o5 7oh'Ұ mS7~rzϺĶp{ +L)8;2|ҧ$ $A+}.l3 ?$ g(^Dd )ܢw:^jkBF'quj)n0˘$s B/e xj :yz$\g,k!O 8s( O 3H'&Y17FR!'ѱ%G t4fR@Dz7CL!Ô!}>U %P"r)5An*c:R-(DzcNVj+sO1oRS!%&Y EU1!JU&PU4R2TҜrR2-J{J0,4!XEqH3r2 HtDwBa.@wrOf1 A%g*HncV2s_%"3Eg&P@QP:n0mbÔ7)J&#vT!:ܴY3c 16=qUb8K6,v0+q 2'k/%+/IwUļ8AOHpbS)?!)Qh5RT=+1!$iP@iV!H U8u)1p5>p? $+B`1ήcCk˶V%q+uh 7 f,VH.BgJsM *ȤMv!b#SQj 2(Ak>lEdS76El2X42xlkJR0 iWQtgO{,&?gIgQ~y0Q2W6k+`5aWݳ)OVvbo˷Pf2OWM YE(ieUd4S{ R*KM 8l Sc}2'OeQ W|N\r|!c-wOB4,("(wc\9F|fۍ{3wZ'΄):!֋rJE ##zgn9:P, [ǂgi5% AK+r᜷!, rW8_OY$ҁW}g"g;cV.v$PtkW!ؖORnx'7:rXW0b-Շ׶ 5MUU9Yt$0zŶsbJKwiԜ@"\ 3Z$483pd,F˗7{2X Fâ0Jc;D"^FdL>g_C?b#<) ñ7`Ts9:·fgxtyU_3pІoGcq!'7YmQvte.(Iۥ4JMeu5"vR ;rnV-mYs]zEXzԏCo綴eVkRTz׆.U_N𭱇v<'/Ю 9 '\kqF)B;qauTVR 6>ZwƯ5uy2۵1 VR,c n;-$>ZBt.A('Ft8Bڎ oٱ pOv**w&)=*-=+]5=$!?)}{A)Лұ8:ї1"WvW5mR752Z{ q}[I2y#I͋$QmY~=+ ݊ߺRveOwI̵yyݐR }߃MyW}yTWc{mu7+momG[e9{ToUγXeJs\'drXwW^zgo%t)4N"sԡ-Gu{~Mg\9=ۛ]n]AyZw5-^Reu266g;AK{JQ\Av=Ym]*c! Vc{ Q$< y{;C52\ݱܱ4O{ ݔa;{e2e]RuqzZwZUݖ Γm;+E=9=˿|$鞹?E|;{B@ЖSLz5|,A ҃޲/n8DeT/!B 9THQ Cj) GmFC! O2zVT92ŎE3nh¤ˆv])3cGS)zղ:047V(zsO#[vzdVb9!PvWn<8{1bH6Hsli-Czɱ&#јIƊ!SyUs!KP'R3*24D[Ohۿ?~o_g,UV}1Ő\=H[Q vIHYXV\eVy 4HTdc+"}TM&=!ro:DpfW!WL-y5Re[EEHFP= ydֈ%`ͶcjVxXU|}bW@ZO%2u#嘎0ftAycd IiKr)_I*H#REdv媥*2oL2D#Ƈ4P[mkӯ*lPYeIbl^ObribjXfPnEeM`ۥ6١ vFD4..+BgAS*B'bB]&VA[^_BQ ~}9K7sz}:;Wx49|TS >%9s.=K~8}?/}W/x짣 xJwzS\<9pÜx_ ~c<K;scd3 7Z.{2+^ ? 2c!9Dr~#"HB,d$HICd% K~rD'9L2D%(;Qґ$%+5RnҔ*sK[βԤ/KKVDe2 >:0k)LNS,YLiS<"KNқ&:I[=@C7ܧ?}*?IMA{F(B%P?3O}vԡlB)Z4+%iH/И4((A[ωz4'NSϖS4iQzҢ2(JԀu*K_P~r*P:QԨEiH *T4\BӤBd}SIӈ.U|=HgTԪ_hO׵zժ7-OJю"֦l Z#oxܕ:Ea8wEzڰzs(D:PqEq ||' ׶>iۭȞH.!B{]>2+YqlQfq;^=\}s.D+zьn HKzҔ/LxMA UiXAcNh31[ʡ. ]]BPyu mxgtd! U]Yژm,=+áд p{.ύtczE=miϓmÒ]H]SbB]^Azl? 9A&}/N*0Ս|,o_ss+#Wf+9Z17]qo3F>P{Cn2 dd# Fv=҇uOr}t;9mZ9һgݨ;Kd47huD,#k{N{)cmAjɃ9\o_˾sU|_C:xy/oPrYayF~Y/G!6o/=smꬋ{j[|{^_8+x7lybOiiU:#|5E 8Kw9 8Edev!(#Hwl3.8wB=597sy$Th(BxFh&WKȄMOm0 @adX30EO ~kȆmo Gh+w:hO=YT-D DSx_hh'Ȉ般 <WdƓ}YXeİp hX(Tu{ldtt=K ƓDY1!;i?K0p)EU dI 1a m ?Dԇ+x0i1Qf#:0Ѱu :m 4  <+.l 2h[v<>GZ[o%ɀc{@vk̦[ I8 q>9~\mfq 9wv ќډCٝQ w Z9GqLa 3P9$=7zȗiu`y֘bⓍi,pfZ2 1аMK2@y6ɑj,z")lJ9c`Oߩ amP319zp?P RJgI8a ڛqW:Y]R`Y79O|Fu @ \ ^Z1pi bIMZO:akJs!+*`=TlH?ڑDqv a$?)9(Pmje' 'u%[z  {Y C° Z iCBٮ &.6j I찗m`:0ƙpJ 9 @0\ k[P򰙺p7&{*\69&k 7L &{97K848 -wDz1D;39ꨦ*$ ů76ʮņJ @P JQCѠ ` ?q :Oozl[ ˠ0 ?t 9{ ҹ+' % pˀ9 kຳfC7 _7_{cz z&ɴ>F!˶4F) Z;jGKLTjkGȴ6]p P)Gkg5 ɗ;9 ̼9l۝ېF:#3j91PcjdFo w> üIC <z 1` kS) w ;z"p@ɘƑ@f%Iʀ̅ftOSl?*C)) jo*ɼٛ `icLdUk PZȇL) b))۱ 13˗ȰvUʶ̟,$Lqo|{f)j`Àd8`<;9|dˀw7g8Oī }{!՛G _\-$Tm%b 8lֱ'ile . ʠKZ ] Lؖ:ƻ"`rļ!ʰ j`9Jס@˰xm֪͡+)Q ЫJ9}!mc c9ez .I9اh)>ˉ0Y܌:ɵ;m>궹lI[OY܁ /ϝl 4ߵ l-P=Ľ]܅*餛ygMgqbv8fq a+]?I  3۴ c `#:f}7S80y+7] ˺ ?qG[Чk Ⱥ'8;sܝ 9+1 Ɋ{8~>̌ My ̔, }N9ۛNa |{ mх G|,M+Is^>Ovi+A!*gy1q`z qڴ~lqvp}dobuM?gBỶ\>f>fiiz7knaon% V| oXzR .uVN7si7?/b&uf%!<hiݯv1/MD?'+lG9/o&W].oe }؈s./n\zB?bt/*zSn^iGi^ՕO6I4iCpϖo-ܙXK |2K&$gСE&]iԩd,#fF6c-62M eh&Q h9D-d_;~3zСowŏg:'iVnvt+dX \ (S&+пlp@L'\<;CCqD@2#T((cϢ't@clN846QF$ܱglEEdıD,rK.+qG4LiDQM$ wȯp&1FOG5k7$T } RKH#tRJ+$tr =3PE443SG~ nP9N0> }D 5*iŰVD\Ib,vcAIgVi QC6e6[pwa6lEkmv6YyeuUw??_!tZ!Pfa#nxb)b/b3xcCyKdOV9eQvyVL]iVL gőQTdsW]wzLïP n͚j驫zkZj ՋX6뫻vۖ5 I.m{V/nv&{q ozl |m|q?[tC7tG?]KosI}uYvg]vis} vZy7>qe\U)(̀?|ٲp{,_ݏrDhJ0(ԟ pk ʐ9&d"xC(:q}f{qta3z{7"m}C"D@bm*wH1;(FD/#>L/T8I}C(o8In1\*ըyNfiZ^N ǵqtk#-ɴbo\\LTXT"iLk1&6j~3'59͔&1un3ㄧ;yN{oj{0up»"!H?><* }{g?v `H( 6W >Q},#8a?Wʼ10y6LiOQSJ(>I C6uBfQN*Zů"5W"X*ֳuj-%GCҰe{")8Т"K QA}A i,e'[Y^Vlf=YɆ6%hE{ZԦ,k7ZӪVmmm{[VE)Ǹ92x.Ak.5p\.t5G=Ϯu.&$$PdieW`:zDzm}]{_ӖlcYW%[7-p `?X-\a _j#x/.d/ⲍ#PLuXT\S>]{w8X6,j;h3'e }$3J^,_%Ш> +Nb b3ifݬf89gs|7y3g99͂Lh@Zщf4}hHђ)-s=iPZԣ&uM}jTZ՗#jSPŏ-H64YuT ӗ2B˾A&f?[Ѧ6=kWvmn~6mntN7Ͻw7mvǛ$[l{NJmgYFptA< _xqc_YxU3@ա<9A5QI$'%h# l^<)[| KpjkL#] N]k'XOz{ug[յucu1 f7b}rw7i(wavJoNn8h0f8wz\%J=XVAFCRh/Uzz>i4zϻDqC?|W}[^O>wTKzoK_~{W>o~ݿp80_ǖ{Qr҇.P"%@3<Tl@ @\ D@@ @ @ A|A@܇{tRP#PRzRj}@2/ᘄ`هB,ļ;]S4Їe -ߓ)=z0ދ/rz˽ʽG1C0>CcC$z?)0lӫMߛ*E̅O;?)}pB `y#$HH.83OQڂȁEMS`P }TR2U`<@TK]IQbSO_+ Q,) L1Lɾɨ H|ƢhVi;V OʒNMJ#ΓIeMl]uAJ¼Clm]W||Qn%KUejH,QܬA}000؉}XM9uѻ,N;$%$ȏXUMY ٍMَ)$G|S|Xy3.R+l'-J2@J#  N{(NFHx-} ]Zy;TV=3L ݇aQ*Oe۳%yRեH,L.1,ڤxHH{b}\OXO(Zʕ*= ȅPHI\B WzE( E 0 08lYܭ\Y^]\^}̀GY-5o<ճBK`CPЃNh 7B£4pZȨHI5yߋI}p}XMh-U}USߡ_RQIu_ΎEh`Mݢ@͘,aT0PMcx`^ I^`[5U,AJӂXՂEp݇]yݒY&>ޕu%^%'S N)>m6^A4^X4)hٳ\f|GtLa+$ka9FԢByE΍t|N܅; O_}| GId> 'K1\Bߛ8Kȁp{8LWH PTLHeRy6ZԟdkMM zXLɣfkN:;!sa+4s_IMU\n5tzh.+PHBou_ևa``U7J7Qv8<1K.j/htC=:R8x)܇a1չt_V1CLHĵw7wPzVi6'TǏEjʑ˩y2E%eڗɩnG-%-|5)O&;RAN}8a´p/_b}1fJp߁WPCgTMJS$eJiٲhbN^ h֯cϮ};޿/~`$Z(spd4dHW>J-;ڢzVIуU0 <0@~1\ך6,=Iw|\oi=P͓o}N5̛cJ; $BPESHDb,%VN] L>jA"BOb >5@3(";HSۧZF^3WUKb AB$pU-AY)%pF\hJzBKȺp9OS>~rO\3 l,%6cJƤFA(dd<kC#:~NT΃4@R7f ` hZd Loa#0Jf8C! %\n I^]6;@TerJ ;h_\7@Iل2L5o1YBԌ 4Agmre3 n=ߎ) gPp (N&>P އ _a&$ڼ֙OCBk"vE!u!d^sv8高J›V;K۷Co!Y Y" Ld+U)4ҕVnjm#.!.2,(Ŝsϼ1 T7+2˓Fъ_<{&XrFz}O|Mlϱ<`'<1 @Mn UZ/} ԗ^-Bl(ݷ|IJϹI_ pHO{i $4T0Қ񙉜`EJ]XGfXJFfʺ,XS,Ki0 c0EaIRaaBFd`YP[IDF T U% Z]X8ʟ_*!PpL +4baZyz(u o) _YotހyQfA!!՗# Ez_"ތ&9  :q^ewl"IJplѨ(BJZ S8S(ĨYgXcƌ ď*XzU= `B H"%TlT9c5,,B,Ѡ]fm1fvQxȑnXL&dBX,$v @Up!M܀d%6b!nj&R#"FzN&r2_dGv¹$I(6ddN rdJzEB ܣW%CAiAT◩e] 9bUmG8 ]c!?iUjYr bf<ZJc%UJ T ъbF  cDV`Tcj%" SlBmڕ&ZU@pAvAzg8eBȼA*FVU[COfG"IަEkLGMqdO^nrn&@\pAl. ~1I\re(#/GX=Q0f 3:LYIc-Z _΋vVe` IJ 0J,Q| & 2btW%g\c<=fF!p裠dG@f(xpTSTT[2hب2(hhNΎ֨o&i(͒>iRj bZjr:ޒVzi ijiV)Q?E2ŧh yeRy~&:Vv]~%2ơ)g(zȋj#TSi2&*xz{ 0Ŝb{2}%4:f֑Aa& Sd^aGgh*vcΑBGLQkV((&)i&B):+Qk鍩F^Gf+6$&~j)).뻺kflKhR~)0{Y Ix 1gUveTI.ah]5!Z'0vSxlΐBM{Rh^VihQQ2j&>YuvB-&-B2|'8J_̣H^$p&`Bp#0ɼ/tTGʯǽ,pGpU ʰ̂]#?0@VJD:m2p4 @ ZƢfGa`pPDFHDMcFeD%1, E0paTF`a vjTD$p1L`f`@&Sx)AcA dŌ%d*o푭nfwlDrbxD&32mT$m?vp1/2m3^&1#1c2 6ў @Ӭ({| ,b7 +m34d@O8YJwpqDP,à5 ' BLn*qumvXud4*s/vCD yt(2@ RA2I/{0K s&uԴM$d4x:3 @ p@ dA+XC5PjbhG&HvpJXJf1| Gٴ$0+a*Jq[UuKoO_G^i`4O[LQơj;686>a20[vm6n(AD!4h0h'aYDvX 'uEix>K4 w®醤t3w2TQ7b0fF\Gtc͵O^e*Qs8@D +X5 fskYvd8[Ɲ:[9UJ^251lTuEMB HB \x8uQ_xs8v~zh \LisJ e02b2/Q0GIL#0'y7b;983ObgfK9Ls'6Wo9m Cς^eG10w+[G>ūXD<KH0 /E@abiIe(w EH1eDzAwc:c>wP/D`7C<8A L`̂55lakuOvhu6GXXo)Ù6x-LHo! SA d^;&u#Ig`\C" =h^= /u /g s'O{5;$G.C3t(@ ,B5MFSD׵%q&8 /NXg£c]Ƿkxv&>HG:EPg ^gL1Ta[?9BHoux}tSDybS{y8>8c=O=B4~kvHÛqJQD0E>NDv'A&ƦfA'FbL va^ ;zľ}'ಃ .ܷL @`7j燊*|-Ny|$ 5h$-iJn&f@bHO'U&PYTeˢңu4bTe"mL=BLS`(Fhղu;hރjДd eB$t^RGކY,bXu>H֭Ƿ=ܘWѐ Cy9whK͛Dݑs{>Y}%;;A~9p䟵֝x1ł1zՍcA渫,I쓍}vydk.Js .N  5ܐ=Ġ{!I4b,dl!,^ܫ/3 "IH,H#R ?76ze`D$a &ЁA'Xv#2C e20L*G@R+bF\$Rm-8BeEZk5H)- z#JC4QIb*.dkV.N,S &q#(ifEX4 \7Ub4H].;nUkE] WqYLZ};xaz:M"4Ob6>)%ع yH}晡'4sĖ]~9-(ʄ0S CK9{C5h"U*=F& zWEp0FTAa/Pa  ЇWAQ31vܤ!4TH8"" фZBKelC#:x,p17i$}cmTFT+v̑%JҘ Q ]WI @/r'\Mp1e2Ahs R!Fch]ѠS,#*A}碧Q/A2HE&9*1JR䇵r:o-Ŷ/I\tKRWB- rW[~] sgݞJ2ړWh^kt& BdZ ZF*aIl1X'OcwRK},Bۂ|l RF-v06x" Tb'Ke<2Mzk05/l 1Tq 7Pu o@G4"x#fIewWi_TUNXJ? h0t%(sD#t8,CeדG#ǵfu* خl'd, = EiQrZDxAbr zXQ!MŇ@㗜vW[1֢&ƽl=Ća:v<ŗlB놕 EPM$COPP+f֐,ӐjGiPRaD}4=pXaҊ␞*`X.;4F徭$.!NCp`1@]@. |A1'O@ f"\V`w"$ 4KSO`G]!P /q@Q 9!&2"Eo uZ.2>"n}HAHm(qP ]F(T2 bGED i(|?ɼP9 Xi_F}{QJ4-:}1ei)qlGU{ף*EY&]~?f%"Ս#@$vd B!VD&!0^$w ܠ f ` w闲oބJ/*.ObO" Eo$"H?R`-xdР zGq4p0+lrU~/R0E.릢j!v$g6 LKdgPtr^56k~$1PrJndO"@epI e1{HkP0D0loG oi jaV2Џ{E L3 rTO"Z(MRhR+e|FN4("+04aj<V6 0zgRe*/d Ƞ @o8bN8&]Pa>,ʰR$2\n*"w>G$A!u#$aFo$Fqud FRHwB b@$D6c̑2"JN;L, Ajq4-R`/w*,rD10yO6XXP ľ*~2#JңrhQxgF aҔa 0aU^6Fj'1)c1bHI$)CBJ0 9ӠSaN87Bn:>N8apP>ArP4APPI$jr\,$*$s f@CrS@b*4L0-U,k⢨0 d*~`2mB$55/'m# xDt+7(`(Tt6udSERGGutET'ytI{T0ws/S0F֌tQ2L'$,*VU6J6{1MbR(~*o6T@s8pbvS+`x "x3ܜ.UwXC9'L:FH*b +bq87a-qr+ `iGX$OR n*b"Ow.'Y**.'Rp(PT!O!4`*)wA bgdR+v'5G58vk kQ7rr5K/^Ua0y$JHR\i/ tO' u,vRT1A2Ce_eF"ҠxpN ޅ A/c˲"A;[CdgtAi*.J(Ry(ub>V?S vy&$[*FB #) R6k*ʳ4S#.+9uBZcF! U*p%qw`X"rTh16qDvPe{fci$t3Pha3qvΑj uюvus ihCx"xZWy7ywz5yh$xWgWs3{4F҃MPcTHf~9, 6s Pc'zq Aa[x s^Q7I`*nTv`B>8ͶJƭ:':Wi?oƊ;9" R{qڳ3Ulc,YWZL !_B`rUXQ{{p61 eG7XuD@+Wy^q XF7#Yahw{׎{8:wxy7xhYt5'"eSJX6~;ٓ-VDPTϑ_$|십/s[׊iדrgq7Ab2$  Fab H(󏢵Y;lQSH O%o B8Ӡ$7VmwUm'9UTs.zWy[_NxΑ*x*Skȋ٢9/7=XxE{yKO b@hlkg\9YOLw"]Рu궕_fF(Q"Y/a@YE!:R S%a 0Ҡ" ƀ(V s1mum1'X > fn#L"v_n$$ȹY՝95'WmߠA5y'Wq]Dnx*ΩY3];R+ `Q ?:x0#P ь4ڤAd5wXU:X׃*.=RZ֦L/ Mu"BH13r: O$b۠j*.p\nSѠBaA/܎2\p7D2 D qx#Z܆A3۱Ca*~9,WpVqӣpʷoЊD٠. njtA.˝ay[8s["*]  >KިpX# [>֣S]eϥ;*XMˣ%[;>#!71aA/EO~ =QC^֯b'C!1^=Ot}]qs{)Vl]^o\?#۝1@޿*naJż023^Ḙn#t^/s3yi?ʅYE"Lg棜y>+ ͞dk˷ZWf4}7d 8*\ȰÇ#JHņFӷ}LR&&5AS,%=e0[.SF/͕3|rzL'L`FKTeXV/M4Xb ֫[r}Ve^6Ho-w۲d3eW/߾|<)0Vdݾ`ҕuڮ">e 4eԙԤ1rei^L*h=h5_*%Lz+k6ithoUZkqYҴ-ԧQ>T%ӤB{iכJ_eԥ;K;ezuVFٴtwFQL$Tm!>i tl-h-t@A3'tъ,0JTaGIO=bV(jTHE44ҳO4?rD?)}?iDCU #uy^cc Gg%RGYFqyPv~QY:)hRUy囈d*hc'T97(鑥":#BѨf~䢕{f&HJjer:_PÂQByIxh6[1?ZR&ZʤP4[hG iztž ҖVQF`1:[ iIi"gq$ B r#F2$"DB])L>/&Uix֎Y96Y]Xu^r͏YXZq2JdgcjeȠ7nQDS. H t 9HD+# e8AO%hG4 cPYy? F11H {C҅_$`E }{òLhU ϗL|j2@Mj 8V{'1-O/B!=ьHE%KYh#&@(N-lAd$Hi0@ 78 J[앶teL0ba8)c\2B83'ыaHB ,3!aЀ0d|e3L7h&bPNLBh`D=Kb:ݹӖ+Pe Vh0(D# P4DUQip^`t ު2iR:Y؀##2L6)NwT9)P}ԡuZ-|JST,lLaҖe,Z]L[U6VeYTtUl-kXrY-]עT+!ڈiH"&XbØ~WHg.^f ƀ`)"W,M4 ++;* :L2)k-.2_-?KI R%6)I Ø1ڱM|.~ptz@`1A=ŹF xW^aZSG &$,aT`? `#󢇊0.} 8F#h[GUP lQ-2A,)P?7Ed k ed%'yK6\d;Q9KruEp=NXNtqe!<D~7Yf#Y"]-$s'8(9hZWD+N}wg+o \rp[.0s0&# V*㻰# D]_\Lh_hK%N%\ziȃNѴJT6 ՄMFؑiLB%N'l"#y4^DMG3KM}aqfX[T8YD(DX %$*voDoRT1~zb)Rp J/ORz-i.hB$p2(,weXjs~vס{JŒh*!p:4#r%q*N&mtKjPWK^) JrP"#K:wXJv[Ld^5 Mm+ l")Uygi4wwywwFjM HeMpMvMDz,.g}ː Ш* ڨ%b4bևb$b0(f|b2c07p"'b9/$}犕/_ɖ$ZwYȢdɊȸ-ږrʚ% ؀vIeVG G<",v4gN([hiu[O՚uJ]fNdv\Jw$_M%20nJ9y6\0OzviȅAUS$ %vv8 sT`R!z3109/ioA$AtRA!v 7x 9f&3&{O4v!|R;r (s H:rzy#euI?ea.X Q;3r+C2w`"M[Jh iEPfK6c^[ ve؉]\Щ^_h^ugviT$; ť8 ]p;"*肠bLLkkԋ=w-Z|&bi裂 S9 z34 ,%rb!bhmd;qq e, ,:|M QkNk肿ڒ] pɞRRJ((ѪXow b;0ڀ@ `_,%|V!61Qp6iG'_*D[v Kkuw4yMPZ[М\X:{iS4sxzpzi+`{CrGOUuuLݤOnGKWf)P= p :O21zю xǿª᪝8?`];(|+'yR;BG(ª#:l\&! a^Fc!Ð># [D]2o4d^Ǯki脲G JN[@`iShu(m5&Ġz;{; =_ĖvxOOה]*^~'vy ;Xd tAzC)NBc2{$v#G/ Ān[䥻J^Tukvsi6M{] wJxyz }{cM}<\$ 5& cPwm Q! MDhqga&}pA]jb},8\Զ D• Օd99&g*q;+zhRݗz;E Ć!9zH".hP>8^d[eI`ki?\"]a]dJwu]HE^$+f};00Oexg{Ly{X$#t39RC7M{譈a9R!עȣ؊l&Je<&Πp~Bof9.Aޚo%!b>2\]Zm߰<2$]s p 1Ӹ Wo P  ID[a~]d(^"F-op #f$1j(F$ %6(&e4,1.*$1`hCLL8ФG4oE۷>1nlP  H1qؤ0xQf`5yU PdͦGLڔjժtVZbІ*۷L_h{շlhF^ M]}+j741@|#$$+NX1exe X6}^}h zwrʏ;_\sУ_N}uܑ7rᷛx-YZ (qDzPp!;4@@v)pzvOIFA /0C 7C /204Q#Vti\*1¸ŗXdQ! jl1GĐiId ha$FL#phJ)4Y ^$y!zAɤ(iLf.$ɤ1$jƧ" b&AdRC+ eE prJ'tS$ZL0~ /|M2LUM,km}H+ 5NT曄RVի;U0f=.jE 3ƈdSb/5(Pq"hnBdXƕ_Aba:3IId"))z-z&}!Je)ĸI7䍲5$0d $QkKd'Ab j.ԇPL pԒ]Vkg|ɤ3h{l1Vd8Sqn{xǽ)ewd}xuA0A k?(X!Gq(P> `26A RL_xI ZA]( & `fPDbp L-Qt( a0`iF$a0H… QZH1 Mȍ"2!I&$@)#3Q&!3[&4a0JH =VqaAjXaE)+Gz0HAr !X6]dZ%-T.t_uæia0 *1W{ai91YzK׻e]K|:滼GL)\$E@AC(v Ha þ#}bBb ȅC lɎD#g>)VG2"E/yX1f,Z42#GD$H#(|TDjb. H ܶ2E,Hb# 2@aL"C}٦@ 4U"5" ! iZɟx?dFG.vgB:Vk5-*QgaV,!QW-9  lLvD!hXAB$4#%Tz'Xj֠<:5H[[I?iZ@hĉ"63lj6 MG)+hQVd &2d|1;̓C[e6(Trrx?j7TP_` k婨VjRGjFZíV\9.ꄖ0= az볆7MT881>!Ƈ rȜ NJP\>Q䃝 D)}ȃֵ>!nO=* "ahQxf[i% Id rI$4'͌HJ2A9IT z{( 5QCÇ3QAB%mK$4N556h-:yKT ۙ m -GR9W^Ԛ?E02׌_zd" i2ODSw]hxZI`)!YBP amaP7ga',#H##ҐVd pcɨͶ/ J*- dZ14 xS;T Ц=Fa腞:v0@L@٘%ò-z-GzR W ()OcTd(3RM@՚ 1Q!9TJBHy"rI "F?C8i) e!B3!*ˋzh}8PHʤTʦtJ4LJ$hH +2J҇,3b$.Ĝ %aiR"qKۘ ۹KKKԤ.Ý 1 P 0 9L؁cq1bL\R(sL:.|LU|NZP MG ,;80M+g) B5&L-ހ5:yB&z]@ y 6~\=KhP!r&)G\鯁PH"yDڂND.xyS0`4x 7;/# PBDy PbdŐ9DPP0SѨԳb̟99HP 5 8:&Ig!DHT-q%HS8aS5۸맼@5]rT~ʫ\ g,?7CS0; MBRI>E9dSK-!!G )6}XؼEg(GB-<LÜa<ңh?#Ɋ؈؎ R ԘV 9$H8ѣIM=9cE9#FGJMtޘ3yM5!FLZ }PL4]6b%b EQ=e3G2ڡ۠M4 (ZMEȤ ] kl4m D5~=`.~(Or);쑃/ٓ "7lɕq*yA8 ^0"6,b8ç @>i3 :5eޣȄJ#-b$ቼeCY%7+ЀRA bի\9 R40y_)_ *Ơ:}_z8M` *>` ___)x `Za`}` _߰_MEI(U9gNۤc]3-bb ؊sHӽX26\I@ףxXp3")RNyP!믂Pd!?;J䧓q/Iڱ3ÝYR j_8W1фYӡe1e ZRٜ@R͜x$GreYbefG:šf ڠf٠YYbYea݀gMAQۺy{R[(gjDo_]Wj#"UhÒ. h܂cy#ٙXC#eAQ4j'(=@Qi `]𫑂h";DfhFvꨆj+Ov3 D/Y e$Me ݜ~ˈ_!VUˆRa44 Ān4 &V Ε]k&߷e_kv ž_ؓ*a>l`66%bڸkVp}~dsPPQ@:,q)i{(:1#?TDE7uC⨕QjSaP&0^#W~CA7LIU}O xA8>1-JEQQT,:3ZӾ*:Rd4JeUIM+N kdBU,ĤU1,GJYZI '9 С 90K$a%(_K.5X:,"az¦9:gs~쮼|Iؠn>@ !.`zӓZAɽ~>e15o P ?</f0g?Y>K3ՙXr-rSjL媻0;-q_&rvޤwBm3dRD qю-sG~ݤYgj:F*>޾I3cAZ@ PL4`1W1ؒaGW^,VdV٨ق9>>eyHw؇Y(D05!-@P9Nu ?4dGe`$>>;{7N3C=+ѝ3jQ'P C8:K;#}Ks'_ }׷}Շ}ާ}};J дy4OZsyO *nE`#uAdܭ`HGg "1Ib2#I 0b%&[d$4ps 18~lC$"tP"0 P̤a1([/ھʢ-g}wYt&}ؙr &wJer'h,}ՃVvm۱̊M3n4􆕋-}ҨJM71Iqǎ'ICIgfΔ5N >?(hLX2(J1$ (!ZH 1 jj"" )bP>wQO4!f$hH7ɈDJ&p2ib$ 3L/YPL"I/I[4e*@ mf` b3W4ʄV:2;aAØEPM*қ7'B J"mq`p),ŰB 1F(4ҷ XuTR7t*a*C1Vl5םk%>k\ְ}؍XyH,YмX^n8PYle.[V`cum`"z/Yl=QXR.&B b_10>2>X Ls0Ƀ R8Lq3%PFaҦQ&DMh$ A>J7f#b,P4y8]*F#l"t&H5夌G2 C[P6Nà1ZXH85DQTTYtSI \Iʰ,U]zp5t`se`r4čMbeq Ksu[oؗ]j;|A%k X(o`~n4kl~Ra sP'.^z`qow˻g<OKJ-x.O{>j>Hb31F?ɗ‶c6k dD byD7R1?S0A`ÞİIoE41L DzF4^dJ`Q$Ep/լp1IM,\7:U (@Az #'ƀhbH>Ʌ2"=&&7a"0J(Zcq`%0K8X2X08+YL ]LoE~a0.g@VSxfIK/kK4ǩ]hYhe(wZ|L|La4LԅwiKDe}u9>t[t W!E#i3XpEbT* A !e 5e'!TP,5BUb"X#4ikd7 .1MA R6}Ibhb/Q [#n2#+ `Jo`] x'} GAC(C),b P4`:_g֏AEPJ6Ȧ@RST%Q B3Q^V` E l:}y1EmΈׁ hu9q0UЂx+n͠ep/\۶Ϲ۰_W7;)NK,۝D }1 ||WÒ%ْ"(~C>lA#tKi^`.t6R4E2pA(LYD ۻx`G D e ˇ>A (lNfB Y] ʀ0x\8QL6IȘIHTVxh׌Ym rZbh4]i]5~U C%L@f f(Ő8 Tى&՗ 1LĖ^BbEl̒X+" aNRv~Vd1YjC1E5AXOii\ 2!;tOuq_tb`ZC3X|HS!SR9ЁiyOEDž_ E&++]؋,̕OJCKŠ} MG(@D Y2p(BƾIdN~,Nh(Xf "kO$)܋tSci۞]]\ᝆ_HW,ٍM,2| Dm NA&Qb, EG̊^l sD՞'z ETt$eZɢ-6.2ă*1EnQߝLn2*gҴ Gf }ncTԶX~m}u\G1{5 K.ѭh2|LZvU%,&&9Nh&lhl(`O,˒(dZP$h$L&4oڤd*abd rr!Q2i2W1*C0FC#>4>2BEe7m/(Kƭn~i~K#2>(CCB2 roa$l1cy&sX^ȅp(fmP,C5/(F.(&k8~ 9 (A*Ȏ.3~Sp(Q0??@#ͤ0QhcԨHe&&HAѱ(YJGHޘL%"4`%$5(H 4 x,ڗ`MD֥L(fxnvg[5ݛ<iƅX{a4jKR6CI ȎqFKG"aHu/ʴ(LM(yx{ Ne{7PDbve2\Ɩ~ž.Y^4 L]1ZM,IOס@RǢUZΝtE4€$F!~B"NMԊo ;DN+Qle0Ke@9QH5ZvBrꖧAޅ$S9∾Z LŹ0I' I53Lu#/.c7ϻ%`w˹/vmh(8BLLhG ;GRwP04z2  ʀ2#4Cd2wldE'p{zp@tw7`܉$)&Y"a[A@M,ڣD׆ޟ -=xI@De&}&9[)b 4ƀ` K`b Y殁fI遞XREe^SL1ad=}E9THC r$}I6=ѢOA 41@&Ii~LV$: KwCo߷ =z4VJbd]9J2kާT߆L\mIYe-jNtIz soRm\դ/;IIٵTAk)EGeƌ>TUы~(E`i݇_^RBq?8BQPA %,pe$ `pCYiBOMPaQ )HC 51MxCHM4&d,M@"HI4XX2!.bB@3! FQ1\!I$c`$(s ȿx9EH >HI0Ʉ('LBÖ쀣z;7{;Xȧ(r+=Ɗ73f%1D@tPg<ڙw10gy޳g% ԢQhB@ZhўؐE4J Be'?T_4O(9VXZ7)88 IoRTIKYК$'tJ 9#EAH;$&-`dA8:DžS1⇪D v(RAn"~,D :Jq<7 ` yzp{Če9kD-e(́_R|b- e2#&M(c F2+)cTN2bMlR%5ȂXӄLIa,9B=͆|sF_K5g d[zpR衙4Q6ES&m%8 ѕB0WH[SPΰMGײR4-a1bBB%٥(02όa&+7V t4Y04"!qD,Bt )By7(C(Ѡ+(X$4.Uri00 40“Nz꒪P,)JZ.Dga# S4|0'04)T×'o RK!6-h'Rƭ[ &܌ɭf26VZ2@ydV8Ioa¶n7=.w{` %] YX J58lL wh3IҠ xh4J{ _|b6 v[$|jKJRj>qYIA"ҹ0@dmv'Mbq4Z,<4Nqlu#9]q;#QwtEbȑ *WF'Lه)G%ЬfF02 kv(%/e]Eͳj9\IW`6l,-yfssBQ3WUsLA8ɥ;Yi}4qyks(PȓA$H P-},` ;ࡪP|gֵއ?ZFucl#v]k[$~5alg{rl?jˠ*#\h04Y"MhEIUoʰ7!Մ`1ԯ2j'; Z!aYKpl!4x .) zer? c"$MO+""BB2!o{;h"§iOD:4IpTƈ?H Գʓd;c(0Sv%d.vJU.s%7sZtdA:O\9IY1M3Ub]0@aࡻy|y,;ƲM ~5pE,s/ֿ4[ho{" وsI=(3Hn`iþf(l:*hT*&V f iDjh: Y<,G@AHv ^ ZB ub`>!d($LDn r bN!uuVࠊQ'qF$2A ưDIIKB 27,:jn (T kK b)O1BbYe)C}%}Ee@-di "m`"`҄Az%re&@MBdfvA> Na0(TH<PFp!=RP3>DI>%֐"@B@=E@J2"&"$;ōb@8GĀPle2"bq:Ԑ)f j$j"2BpǬc"gu jn*L'@)-Q%T"nk̮,@]D>c3dn*0܂.Q"Ķd/ϸ&mM%M"Wx( 2*"QO'/3WogJ "*`Z1s X-8usCtPE%AN:/dNH4 ATQP4uQYQw1FU7 a؆Ti,C"$ eYѶSܫp =rFn>Zi:-!"a`@An@C>,K>;<(WrBb`&y]o KG_E'<%C|hvZ&aAHr„."dn˹nԚ. UB#S{HdMdŴ5ҭ}+^ 8 1-B8Вp}˜4't) 2#3w q&z~37g9ɣ7 Z^1!@kmsfQ8w:A>7mvvUmeFmf*HP.b@<%=sr1ƃc$z>x1PBhrD~a.5dIZtqT~ "(T"h!^ I25tҐ$xm޸X0yG`-EQ׮+´2V~ |ICH;D > 00")dCB#Lg0tK)H/QTy'/ "pJZ˃FM[q~φ]6U$ں5v(o(M s4jtnuϿF[ S9E85WYѡ'ZC E"A÷ ;)PO,d Nvx锤u;Vw%At Kz7&","R7#\bɣ@tJ(o2AnzY`z#Droukì*[Q.E PWz 8~*9j{ =+^"t6E~@ m0?QW͸.ɜp"+0E ӰkMj iD42E0 @'j?X h:"LΰZG; < "ĭ8hdr*LOG xz lЭ=lnxolyG"QaC[Vh#;&}| >B@H@I~`C0^emxkC(6(MIDͷ&McA}釋O3I ]F)cdo@zn@XgiC>`tfagCmo[u[2@:([Njf,Qn~'!LD#zoL*dAda?ie4@4DAB3Wi)4fbE(?ˣDUU`eiC$Z?v\7(Y n80\o2%՞}S4/kR_Y_G uSv{j(#U]R)f9NM;A8$S^ei٥fZye &_~uI[v xiI(\fVX`i8A;S B"bS&XYzr<]ԵO>cV4 iq <ɐ  +lz]G?aMiĐ`<8J|mL&^[h2V 5xCA[ o 9h0oL։1v^zǐ1 s$7GZmg m̡m\N"&(c}鷟gejd>٤2$$MC u/Kӽ5&Y˻MDf%"8svNȝa]ϣ=2Hf ] NK0xIE42>8PDy47T4c]U"[G >\p#UYҕV\mZt;?_RJ6ʹ 6Xa&FQ H3\m/禚j*nݶEb0 1w Wi>0Cj&AM"wK*HHs9#BPg NȀl-'ˀƂay^s̆!Ld6W&(qDR7DHTMJ E8c>xFeoj2H 8/r\F5nH bQ!AC*r46 m JG rܨS82@r*\(Rz Xه"V-2$XpWFخW0팅KZҥn fY袏]vOj4-A'9C/= l;ۂ$א %}g78vbH'Qǥ % p)Sfؕj@~BuzA$I@`jp@}Ȧ:c фa3H 0 '}oO60KA1J(E0B d.I94NشImn&4qDԘCU1U/ FE,Dd4y G)+C2F)UP-i^qMȢ$ plFzWJ/)~UN(4YdB$dIE0U垷js[+`X|K}htه0$Z<-RL5 ,ghuj؀Yo_@_#\n1A2 (Aޱ>1CF!d 7MX8܅) Ri(P8!0?&7TO8=:Gp ɉarӤ1݈u[GWnECoV5נ땯{k_UvlfpZ׻ul%[N mLu[]z.算$) ;bK#-UqH-RAY:3U!?+deȫoeGp V{5[ywLGN/In}b?6 - :m&_i\_t41ҷQ8d ڧϸ,7H!gq.M&ى'sAx|r ftaGEP? Cd]TfC%Gr'qr(7rwE5\xdEXDu X\s7XCw\Vf6efVG3Ge6> e_EG{eG_ks[f'jƥ!g pgd*C3=$aI9IYO"`TbQ:C`A /;ѐf,\~&@|jЃGx۲"2acU`&RPhQ Bb0OQS0p§ t71&1| 1QPtΡ4k]f$>pQ0]PapBbFccQ!eU-pE*7d h70RTOc4W41=QsXEs aMe$VatgUVteWf53 \VRVatKucuX@gyiGc;rja 80v"q4I9XEaʠg`x%TSaQyIӒ!1hהdjM3*3/ߓ (/20!S1s4 HpRqb 2{>pGi r5E2QUI$=!oӀФx"7BF=0=oCsxcss:!7}0ZFfZFVfkV\TFR&/G)r#jf#郉;i;p zzqHKFjQ(S8)aY 7!A*Si*Q)~?e !.Ql䔙hP~!#P 2_1e)s?~dð0YB AGco/_]bau"Jӕ=0rEcdځ`ᦁy.k`1TRdZĚ0$ucH767|!EEU<#;パ uJW| pEِ ttq;9;Cx% FK+-77){)AaIEaMAQ :F`J`hȔʬz]dTzΑ>` ݴM(Ť` gaT1ߖn8OaPPdqR]ӡ̷dPCV%a'-#` v17N3r';d2RT221Ao s2pr2D==aYD6:Q4rh%*)5fIgF^f?gEyM[Y4'cQzq6M8-40 ~ ?"`p۬sv)fkшj p.՚M{.(5Ȣ@aSQS2S{^!O3> _23{%ahs}0~1BhCI:ƧEE{ǻR{TWU"0B&7ms7d/; iV!xu[Vlڨ FV uqubǬQKSsv{yK44:>49ᓢGE|\GʈWiq.aM>p> 8U}0tb]ㆹO?a$3R<s0eAxZH]3HXa&8 R^g|! C'{TucTt,#Y,'H:a9\;=k|F:>i1X3س.VuE1Pj'klgɯULvʮtG w5DISIe[h 1J2J -1 σEH~'{bAp'\lڸaa1EN>m 2M1ѱ2`?Uanu?2A p?U{ /7o."VMUE2AR'qhqFqF"*Khy;ZT!"Te,[;i)djV5}tEguj5I7>vueiW3WCVwp͢^1^HJL+2|d)؁! !pop Ф)3iO*N*@:AaE?Q>A>l oNB @ qBh4GS)6!80!trw K!9A"""rFE6$rw\+6USB !bA$1 QO% ~ISAdJ.ee)N 1@7dmnEAo; ۝brQ뉁E4+#ر/mc2 #C~aDHbP@rm oM!2!pA0;. ȑ|l=DfnA4/&˚JTW6@6#=DXcEfT}EdO#?B%"OC$O$eD$E2%N&$q'_(%'YB'z'>'=%om%FFAGQS'8'7t ^wk])mZ= $2б#ˬ&Css=UxMu+|Ma3OXS'^ 4AM`sA@u DpViAdR2zb@ TպYb9bhbL6Sst\66d2q ˯o1kcbE,Փ6 96h{wTd{ ^ Nf--!Eƚ )coiP  T6A%dC%NXѢ4WھIiԨAL͛bLA*aHMiЌ 1zIY*FҰ}ʒdI̖Xcd") XlEi19߀J)Lplc.8&}Ih,hp,18Ѡ&8 ThʖEFzQyT l۵iM@\>0OW]є/{Gh#KiTȌɈ)FLzl}ǿ_k=/>*t0"Ipƒ(e bma0hHfvR&7&y#!,!-mđB{džI&ؚD%dZ dpPnz*1VdA1:J0z+1&g= X X˿2#On4~(+MtNcL1LKI/elSNHr8 7,EPBCp5ԮۇHPB^wU_{WZ+Ns).d%օ-X _+h!ؒTeʈPYUedE7etM{߭rW|Mr 64Hra,da"ĨlS8 D z09Pdi cyf,[OZrɕTA M:#-P4*(*(0 쉥 : H}24I !a I{11ˁlˊNue>S-aWwr妓Nʏ%Z]5 KՊ8<+0> L%5 P#pv* >iHb摡z*/?HGt5(n!"aK#Č,< 憄9l 3%F*`V>F#rJ# =+J8@h8>õi^"ʗ5Ff cJ0 pLYA^ըL 1A&Gq!Rq $t=![߬(peޠ 'J Y05GFT`p|#x8qGRq8)>I=6dh [yupeb\c#I}ғ#ƺ֕-AS%HRƒ)cj؇0`El`D, A1!y$s*95J9CK@q"r}B - yo8p =ed\83 *y:HH³L%MI& 0l+-cV2C*dLa`^h1Ax1[[ 11*!US.V[SQ䀳ʈp,nm9w,"qyTAh8cUA S5*qS: #-ɡ;@x(y"*yr||<5~]X}paHhGЃDb'ԇ2  @ E8 kd $) ΐʲ(a00- TYuϗ$ [v㭐@R vJVRD24+qKKIHj(ۨH/[SR,o9d@04J0#…GlNM̑4"VEwcGV;}c 8?FFtq5fӭUw*.&0,;iKZv )TYk3'IhcNlJ[q?}|V}+  o_WDDe64( a'E:xa\@N4&'y +XOZC'HƮo3 -U/iKxSz:*:AALp}_z2c६XYD\KFФ`AMSX EſdlpBL@%RrLd0?Q8rG,p~Bi#Gur i]67"9e,ȻHT>6nMcwfXAOu,4{ɮ=AcXf3\ZVX?@UV-4y#xPvsG\e4f0rB.#f7*> }!۝ǟKg&p3mu OaJoeQ7AIM:$N%>gI(11h'=+Z7Ko<+M; %(. o&s1QoTv87 OI*"U8X5qEcLJ67x :{ <2 &@` J|{zAA8ق83 lA̗ȥb˳< 4;?C-vȞۇca ߒ)a"8MCO(/XM`'BP{ ΋YЇ.85zy <0x # 0ˊ/+i"K? j8, sMSɩ> ,pڂSưPFg̊etfdЦEZ٭ 8 cĹ ΂⬨s!a8PXb9Reqe L$Q%YzW0A`%(v (X.}XۮBiJ=鞗J:Ӽ[aZ쎌A 0CYi*DP yB5ÆH:f(XS#5 HSP:=1Hȡӿ"CzFX ib@2XxYD'(5j>)QL46a 1XJIX/ JE1x M0@*I*h k 2 4ˈ̜W"0*T{T Ϳǂ2PY9G:TY ,:v|~캅TC-;SI^"P"F(2żHQ4M`B>4.0ĻSdr}Iiz}SI^%P8XmЄh`xy lhM@@/c7cFѬdIةJt$u"7HEE)']E#Ͱa, [ApJ r XX@>;˩1[@SM " Ӥ0P}SPP0M|M$X.g|چډ׀5m!&Q8'ArB5'E؂ZM~:9NVX8C0'ڈPk1yrDzMap\xHE" ƌ" x)z9z.Hw!RDXKj:X\j8,@[ňkNakԴ**xP޴p}MSӔ$5͖j\I9F4,~YԄD!1%܆TFvPҿm1U141yaBOky8~V&鉺HI8p0p{1 ⣛`48PM$ /R>lB]s bx8j>lᰡ8* rj*u*o ^ K1pǏ0}M??(JZM(ZX@m,*[n1#} #kMFJ N&\M0"eqAePfe.[aZY.+[NZɘ:JۇѴV=cNZ忁 Oe*W *sK0t=fXah0ʴ'Dq37q9 ı Xt"MjG)/-\@נXY<04Ł5^һlҔp*8bX9ph>֚4I+(GUH\&rIpTiFQM |SViVjvjOƭ궹KjI궩jjj.k>jjjjPkkkj.knjk̈́V _O9NW>QKI-Xm[iӌ o200EIrvSP80HXG7tS(1Y E)ĨMaDI / : 8O IpI`Xᗈ>ʱ##wuxoo 1Ԑ92͝Sͮ1 HPІ Z _a4#ʁޭ4> M*dpr? ڇQ80D hHZDʕ 30*-Ѥr!Kɰ"IЩ(8rMA FXPB/X78H Uj$JxD'=VсHBB_ 3}i-GEG`r:KwzDɊ;oZB#.OK[NNq\G6doqnZJRKmyYDѕ7h1 tq0.> -J,ے"8דLCtܝ7޹(~h,/?Ѵi)g1$䐖p1ӑSkl2YJ.Q26Ay N{MW7s&nh^ (Db6uGdԤډ6=LWƽ 4)hpPJzlS*vX tijKՊ)roшoկ= K hD[U4 &2e oͿ|Ώ |*_"#:t鯚p L,.BMGө/$LZKO+T@-ɵlf=('%P7؄X-K~l g^zg0Ӗq WL:: 1bpā bȘOL 1c-al1(i0I8,TRSIh@#(eѢiB#$+>n cP̤qՙe&o0&}ѠY}Xo&  hia7z^wj/߾~fwzuپS2Ѹ<}#4jbR3)M eiHTF1P΍vd|VId؎p/\:U̇δOߢP'~<3.GÏ/D}[}8|X`{yz߁qMh)O^2yI$^k700X=fx)آ/3waW\yea&jkB!=mQ \OFŀBltÓalŰ ?1"#b,"$49I&SISirS4r"C2pRRb4 h"Pib&u.s2ةh"kou `eZn)SetaX]u){**)}x>՘]&lcٮvƘIh*W1sÆ31|KlKn⢫ vإqˮ;;p< <И>hNxr+\q{7 ϒ&s1>@K6ɋX;bE]sƲhCHCaF;f=d2TUBt uYFC$#[xTH;wpÈ (rZC)TTzT8V͐P&74јJD*VM, f)ԀBV\*Vy${*UU-cٴXeIYb+gX}hӫ8 jrvQuqt1r5W]sݣι4LB>.Qp7hA`V:n.f7^(h^S4UfIO !4`I20Bv`l1"G0$\#T6=*)lREed k2c B O!7%.L8NAМTI&0CZDh8p zfQ <%W&'әW\K\FvyN^ą=I-7dyCJ67CqczO>p7wO<}b`}za,DbEN\6.us!j;-<7"Of*J 'X <"#h:RS'D!SWʹUsēPNQFOzxD&EYAŐ'?8ef.UD )% s5vRxYV::봊Xr Wm]TXM^~3LaK]򽸬.P,e9fb}G]8>$:J3 a cD%ƠUI$~T)hoUBQ*R[" w(/) \ @0 QYT =jjfQwК6#{#cUMHYLVKfNxʌ]XɻH=R k6$XvnhYx6ppr6YyArX;a{'r}6zƏy2zeo6 Gp9S*ĀNB`WzDp*ߢPI~ 0.w#;M  2Zl7*p)c%K3y0>dj 4l10[vƴˆ ~A(Z-O*Zo =-&lGɇ>ɇC؅>x0̹Of֜>k]W)ņkGI^9dnFq - QK$@Ad؜T[ivL&hJ 0K AY)E[`B&BA(`ZEqb'v4YmJ!ߋ1% ܒ;m DZ\ƁOPEˉlnFl c22:ճHH< BymP2EGuّٝ!`{ 6>5 ȿp 3Ӆajj\EzF@@Az ЪŐ!)Lq8Y pXTHOQX)D BDIZMd)dJCAm'"e'~ZZ(* gX)"Q%HpKi V- mdo9֗X٣|Y]]:FHS]x1(Dŀ8㝵ȥǧ:e HL 7=S@؇y#^Ѕ2HęAwF T@C{QɗlԚ,Gy͠АOO:@CF zm]%<HBs @H'zR bRI)DY\h >h($xn';Ic]c(Y I>ܵD  XAX !̌b ( RjƇ3[_SjH|!8Gؑ Rx`:#5Qhϭ$Ph) وhtE;Ae`,mj ք }AH DEDXKzMC'B@EMYEsTzNRM6J48D@ޤLARIUA_fb^02( kgh`U(M&!Ve* i$HlL|j!c~и tXkxk~P!x뽎'+y ,k.EkK'y6l",Ub,ZjnlaT`CaCp#ӋQ(m2xhڵ`eϦ0Aim#hO*ȚrFpv,aE, [Z|YGiDG@%}BY$dpDCdQNT"$[脫TH$WCF TgC`E G '9$^)HQuI'x-FY-M6DT [yȥ}.ln붚j'~Щ4n( *Nkd(aA=ϜR/͋C˹| ]^:-+c F*VGRxarЈG Hiى -Jq&yF%y2 >zFlR<4@vi^PqB C&$A\  /NF RyXXC$0kM|F$KO9WH\`kLqq',bnOsHС|ІqDqƔ& ƌhS:%TnaZOyHk<lz7УUc&5ircK  #bR\T1e􈉑Ĉ˖-aM4Le2iR&&7¤a9 G&P@i"CD(Q(?tKlSbM5lXK޸ RLoҔElKe=RmOgo؄LA;IS m_}uSv1ˎ'VO>&-jWGséG/GOp=h鮧^4}ccٛI?it^5sӱVN,u$vѣK}2M䉁Zo^ z^BȾ <@@Y$%B JCO};%1P 7)-8}.\.ep|P&&)p  "< 3QexC 5b%IbH(!JʅTP!I"Q(dad*4A# 7zCh$bIPf Y*331PMIh퉫'['JEue27ȪƥZs)bj}>CMrӇ5N|ӧ7R; *;lD@r*Әr94*swxUOAuapX/ 5w=PiN`?=Xec>.@twɌ]"P4@bCÊ'C-evL,ty2! %I*!m#馝~ {E *}#NZ+ޔӣ+%Fh&I21K \aOM#I${h1*N&1%MڋJsDo5JG@ˇjlݎID,ͶxM1tw|w1~hep{ D3-5M 'wlN4̿.I[;{O.om>v FEcj F 4Jڅ3 ΂#$>B0c<+Mp3I8RB$t GREᎍ.* L44aufQ<-F- PhD kx(OWJ1(hbRoԉ^ ԫD >^=!|Io.(&ph# 4&1}Z1sQ=RΊ fÛАH\Y= %PE.zϺ0] f0_g`!aA@(BM1"0,>#gLzBfT`݌xydT֢ݧ84JЊV-MHI[B +*$K-o0bk[Hb5- YB6bpD%~0 -hSWRA ƒCYHF=@<&5 }@S$tڜ[NF,IT)u=Ls\QID:蹳4Jx+#4 ʵ;kՖ<̬0 n4&p-0-1ј#?=3%T'^ZPB:4 F A!w6-|^[[| R e->!I;?"]2B5bUK)gDƥ*$l]:Tp'$V7a,iЄd%SO؝ҨEP `%VsaWP2oX2w,h0*P0c@ Kz2Uja-i6djظD¹nKs탗"&K`e.sUf5diiQ.T#3Y ճ02Vg He ]%B\iKOB$=e\aRv4q_bFP`ŨJVIcRF؊274jS ((qʯWq߰pPՀRH<~[ŶlWeE2lCx|pMo5I߮~W84}oK؜lNߙI599ڥ]W`Ns^1B#', tۓ tQpr 3uk~il @"d-"[H8NU|E&ojLp,`@,j#ζҰbiCƐT=x߽e&Ιv9>pX8!c$D _E ru\.OuRemO/9< U #-JzJُ[%.RCE;.M C tƨVȂs~F dP #cDQ(B-A": ,-DbfRzd+J0 ~@@aV'-. /JuIDL{k(71@! 01 W7L C6PYWPDpc{#-``b9 G9ȢhpO$(/IC 1 $)'%+1/O* Aq%3I[Q]1c1Aqbf>c8JFd $D ` @ €qH2[CE̫8 d*LK⋣b@B!J!lFdGlqւ`PaB&-"nQ pP\bRJD%885A@u`0 duJxrW|  @L!H~^{ nIX!j(&+!b/Ez尘4Kr C 1+HOXI d@* 6Zof4nI<F`@ѼG i$  `b. / DIPChF"0!K&I9P" @!,%"&Jj$h%"-$"$fr8v2R"KN ¿N!9d`j uXPNmX0 $P[&%L$Ln(|rDxz Wnj2 4jiJ]f;2K✃>*=#><);c?$/d@g AvC;g|qt@+HX@ -1*2D @KTj+6΋8&E!HBnPRdՖ -bnm qb0PgPN Rbrwb`ע(Ko0$ Ēܾ/Y04q UB-t*/ @!4aVM9GD1@@O*Pu$P'vh %/*|6Kғj@0,1^~]^>^ &UNUMU>EUaD/p48(g& O"x֏Bֲ@   €A)ca!KVB2eDcb|\F/alJ̱KL:>lMSGqF%Y&~F^wN0F" O.oRFH.p$"vpRN/a"3O,pEj^I* )/tHe [TdgUl@Pvh@Cy7.&BENo1(8=?#?|6B:~@K} R>bKK˻nUe¸~@]RB g!rO!h*DC}Z@D4IxCA &o>Fotf4jXT (6%~ia!`V`R|h"G̈'ڐ(pp@ t*lr0 NfMN2MMd=2/\qcb&-)<d /|@zFBr LR<c`B{dv+Ifr0*p4zC kn=Άɗ _c^TxT]bHUvAcc@f @$*滪Ordtépb`ctz2д8"|Bo@Bu@0w \6g0CB"BzxeVIAo? @b+]=@Ao_k\='\Jĕ`k$L֮\z%`p`JmiЊ͋%'z6E Y Xb_xG5L.*0`"t"Qhnmdb-&<2@tduh$&j+;yV 5fy{ ckZ/ [NGQvqNl뇣9 ; <66⪃,dB6eeGfvA>p>ٹΨ+9V4qB,@&B>`U6t@V&Xc "$d#e@&AvɀV:tظ(?>FIZ26+V s!9%"mLBp&a*0Jb9&(Olb!B"Yn2dJp[RHL+ rM( W@W& ݎ2cp1ĐUUxcH</zV6Ez;yu{BIlU_`UT  Ʉgja#K#dB94`Ct&b6DEfp{r=Uz9xBR'T+**>DG D&HiZ1DbAy!b Bv >bI)Ϙd(s=*g6[jَ-G>"B0-CǛXV>0>*vA!?LAsx$C!eB1:Uo)nFhzE䒘!nXX$hr!"o)l"{ I "Wn$mbdeJN&NB"T"+לY!*&$c&!CgMW|QY zQU"rHX@5Z@"_bڂ#B^Ky8\><  Hp  *\ȰÁiF'Q2}ҨIsC72C)&bЈ& hB3LӤ0bl!Q8)&FadfRIoT`*fjhˢa9I>d -7xf66ʖMY2J&PzM751H7c8N 2p0iA7q}IXs2jkML0P&z>⾋‡3Nkr1=7=ׁMӼ jDbu'#~}zw_}\/R(|Å@,.3>d*A<-E(h4 )Ƞ E tq"]1,$@ RSI idP'h!1r%A0 P>^JȢHE3>[ıO>,馈Ewҙf`2^Iр.GsP4bB'FP6Qv$xt5z3Per@!JHY10Ԭ+ c1i:կb&e2m$EF#bL"+5J,aX~tc*X 2ebnSg݀Xg8j5nuEbJ-u瞫Te`oMp=Tpow@]\u kGiESF1FF1(dD&&3לk5k"42'b|BL燛LI.g@Ԩ>!1dA Nb}$hwdM;dp^TudCrD|CUb@L㉏;[(r%C ~` c՚C*P\!?@>̐ lK",~{4.ĶۑRx⡬Sl18x_o&J2 #[T ޺AWlh$K6uus&׺8jJR.oJK~_EfV @ŮĬL̻0`3i 17\F> fa c!fbm"Ѩ߂S@`Pb KXdP8Ug} NjP4AaGIB B"uU r!SBrGG!qj$G*Ѓ(vU[L$\NJy>Py퐰!SDER <~EC$z^s` oPLf1$$[ 0V3R&Ia*A2ᒰ/Jxr+`Z؊Qٕq8AX~@^MSO$x|IWB)#3 &A"R>.! [G=я/%¿#b8{!(Dc1qhdwT#P47Yt,iQ+q h1Sn՚Gg_udIV heܒ'Ч/`ɳN}bਐȕȯ#HCiMbB~UFTCGV6h@Cf4@/&,H'Z`B/aNh3a+[ڇ(ѬRĠ.-2iNN(RV +$t E h*c}$|hH^]BH#P$N~AG9͑HX,!F218rn@ LWwFYXSFui#ڸMB{Q }LbpG N,N<'&Ho"= aC!E$I^ĊLe8e&6l0U2 Xi&O┵!e C?rʏK&$S׊NxLg:3(مg3ss;WQ|IȮzJC?JF;j~.Y 눀qŔ]WLMi2QqzDI$n6ɉ.Wș<жvr%iU&ZK(4)iR8:2׃)c-HN4pvL/UȂG eIҠ1k Lf(<1z!ILbx [5幉_+l%%N'nV*-uci bnpJʋC ߜ&GN\j4vø>iq˿AL'%/=T4>ZO#Z?ңa.=jwJO}];g?S__gd5w?28/DCF߶=NGB[ A[{??'h<1-O!-DM$ 2 >t.UK!j~FQ;Aq+0040SAM.t0t5xCI p\TC8/3V5tt|KhvD4RD3SC2~s1<S/2+N>JgeAnl()nX"dSEv 7 W"Xx0:eo(K0oNuvr1{a0M$h c$Yuyr8us<&0D]Eg.\/.*cP +Pi.bmB8jw@Q)x.!w+__C4}G_/ED'^xQD\2!21 F1 gEȏ1"y"~EDˑI{&ޥPzDAP4@ Cii.fCy\t@2wQ2=!*/)G#3㖉)ȡStFBs nՎ 2WdFY[( EghJ)iG|SG!R°DjpI:&y.Q(x70x?B@ x 1J%Ĺuea2ipt)F5 !^H*c+V h=, #iE 2 rq8) RZ 'Oi+RGE8[23>yhPVMQ)Wv=$vCfxTN3Ye3KT<p@ 0NNs\%:~3( r&:a;R7 Q `Æa%aQc;SK90T 挿))ɦ Kd#"#1E!p5 S-s& S[S3ѓp* $-?q9iꟉA,ijB/:L]\ȴrQ R#sqΕ3Pt6'ڶҶJo0et`6V3* 3?F{@jU"fl" &#p+T*Hn`G t+xK")[<XJBsKcS-H9 e+"WaN,[9tFCo2N<עLW+Z-h!ai)OKvEpS$R@rvrjiO3`oE_PڡD)jj6;<Ѫ$ӚJ>C<ߪ44 UKCKsP 2- Jnh' Gzp3,7 1[]zrcguɀMU1 z)[[LWaű)Ўu=P#Ѱr@avð3 `Lif[!*iE!>!8H][snq7B3Xc _ҿjܿ8ġXK+ %D]\w^IB.zcyfķkES# [LCal{$YhHc-*H`6Gΐ2!Q<+l#7o aHc|UY"`ON09%e] k]<Udi%u+Ei$qacOg/Oєǥij:J>SRD%ANt|BR1i9@2iWceZ]\\թV)ԵȊj Eˢ#:`Xf33"Fz 5(,%L†UUc΀&wӤ5Œn4+6!f3S+b+%r.Jh--eA\xz]#+eP ]P:1!d|J d+i1DB+ > 0.-s@94gTԬ4ҐA`FU_EH?`!޷* /S3 n'm*4?1ˁv  %2 NNdHN #! ;;ĝk"ute!>!b+p~2K- b3">,ar@{0)I܀tΤ+{QGf- Ui[OUSQ.ka2N*:or;1hvԑR"zjQ~YlN$l8Y'.S5̭׺T!bʰޚ$պ֊8+@; >53.""gScCcc m!OdcJN!! @Όkrq)i=adž邾PBKA?GAG04"cp+0cIwe7B s הno)l}|C>Ɓ)jC$ɚQ`&Y&a" n7C24/nAs ;مxbrDGcCOG 2F WM^')P>5%H*"6ίH!0q;3P'Gmj ;!0gFP;F!5 GTsN;2 ~$:qS D0z9\H/$5ibR3) 72E#F4[bA)ILaЈ9R&hc^1F48a0 #f ʨ;cuE֞[cq@E^ͺP1gȉ&Lin=#盹iҠ٨ͲLb~LƤ}9xh-(sfFaiy"ПEm_hCzȍ%L9 }QCM MiLq2b]{veijk'=u_]vgP~P?4$@  5}l3n2!$'ĸ0(CR# E a$}]ا"|dF-~$ apd'8&|fyQ*3HEq 0 r* Ia,0}q aI8a$k10ѬL0Pպ 5Ӥq@ã6C¡@ӄ8#L&NV c *F[I I&iDa2KL3N c-V8ٰEYbӥ#P@y0!R M6ZE 3_2, WS i#N2W]g 85w{!~"+ec,>bKo;S9=Re[Fv* 鐌,HԅdL$ҝf$Ɏє*s%ٙ'2# '.H02E#DW:DÔW)K l6jLãtTJ. *=a ∪a B0kJS+1$%7P|μD%RWL,"K=)ڻ[r*'z2P@\ G,2h< p@ ҳ#G󚈽M BVMK6)0 %1 {P6JAԆ2NMS2*T*3V<*fE+ZVխW$_׸ծw+:ĺHMUi Y kQB!n1!#"E$D݇ˆdԈo"-q3i)JGHqNc\D)]L86E$rF#Bxru  =2iHMs'&Q:uw(׼E47Us(D+JGbb]D5"kT| |ɊDZF lSPAÅ+̿ ,㘚5/CNb1dL! E2bh6)o"Ch m T@6#*p*GO.Pf6eS2:f1g6s˼fYj+[ͦ9ùhsg50 D7 FT - [P;y vYi#n aZi<ǭiHmrӑIsk \$/\JvQ-)G`$ L(%hWڈ:$|V?iX?syi7g-n!c>3Agrew(mg1mc2.fxm.W$c cPEVU!%VBP"O1HU l|0 xC'51zU}#=jTUyP}7&9;Ǫ;w86r ~wE2 ihl >;'nÕ+2:ʷ&MgB5)z נM ` D`$v FOp ZI/.BvHns3BsGr\:\d@=B_$Ym J$Ur5ȉ Hw9C Ȑhf'ٟ\/DK4?'j"2zh"1@;؍4:`e0Lh Sqys13e(!hPez 9hcŽ1;ZBJA%21[,ר2Cz2Bk Pʈ@ 5:"Z kɻ>03ԘEYFdGlDxкY 301A&scz(;,7*  hL;=#N2[5$] # 6<%s h19˘ذdxYCA1$6S@&B>DE(+P ȩ-؜ $0+ JwZN.I}=UF.W% 2C`^0#S[SRU㬕[LOa}Tv ee]e_f|כ6U#KфhEK3tV"&*(}{F301~IEg21Vݡ3P`fle :YG kǴ4SSBSXiAv>piPhߩKeوS)J4/RZ(]ͭu(FN2yDX]ųS5(="ۺb冐9~j2ld^0H R-5ES3=ݸ*.,^ фPuq %6+L ~}˝1kV 023F(a-ç~Mj N`e@< ܅91qn6Heɗiã`/#:ߌ_\J^~J;’kͻ~H9ܷXꩉ٬Rdӵtge^: E!2f"̛{IhXkf$X M8sNKq2ʶ͐ h3CƷг|-m#Ikfc«p| +t9O}lu^{<&iDn5@sPs48إG߼~VKZP+DMO/;2ksL[cv6hs |YX.`|#h\^m{BXR-G &݌UpO 2z]q.M <5zoMxli2"BK -"%߳Pwp73Ҏ$5]7SID[h [e zBxX``wɔJ@ IKM-ɨB`1*967oZVh5{=^4D3[;f$ݩEQuCc\p#sYUOj@H KP$1F0?E uOFvAԮxp 2<[|3}K:9[w>cF`dT.ޥF%z֏McmX a|/WAQdU^$i /c\.Nx{6`TyE^u8 9$ɥŭpL~;t}GjG*lMVHn=J]mK.eOg/W8WiI-M=}&o*@z LJǐ G.)e@-Cq%L2cTLce FKoF9ӨF9W46Vt_}1.f`WPX0kօRl-\aRsػ:KZ_?-MXÇ@6|3qȏ!Kl2ʗ'O9Ο7lz4iϐ9Ztḳ_vmвcg LI>bhC bWvo\;Ǔ/oo [mvڀQ`FxY$aOp-T{OEaVEhePSaZ U@Pu5x#9#Mv\rmŐ t787xiEnCIB_=UݷJ-K-Wuʪ[-;eG,bmg6^zY5آ}/א9w~r#8Ȋ7;|߆[8g޸s{.\c:끧갣߾-gIt2t:coi,-2#MW@?4\`"Y/+;_4)U??`@ p_c@-+` pȩ&#& h#V(>ء41clے+t'@/Phv#ENWR5K>"ja^0@ST2a[}rC Aa Uz3LU:ֵvO{9 xIàb3Ox{%"m@v!2QVccEQP4WPa-O`^ 0Qaj#c L4+\UcŮ-moֶ-pg }o7eskV+m&װV+04uh}kWۯУdu N}_ξS]m ֯`S d"g9Wyt1T<f'`c< ʢ+Jq>4[Q4cer2 sթe*['1Ye2f4̴r }]a/gEl_mNQ kC& StUE;Z҉ )BLg?ϥW6hNkzӛ}L20Sy 1:ށ1whG BA+) h%QB!9.hp + Y&ӍuVɽ@wK17]o}ߛ6^-ovA ~)|38|j9_;1o7A#S^r(_9[\69GCsbO`DmB_bt."V"(b fQ}lB4X'Idla47 MkӖx2py xa"wOK|i7&㹹x${(T%ɮz7` >'M/^/ߡ`eg|&e|oL:OzS?X3:&z-\?<ğEѪa#$/?_rUZ9٣\%I1Zz_}``Sm~X`rZyZ M N" Z u̐sߔH\]aUČh0$X]E[@@Xa@MAnYDzRa~!TaTT!ΈU!!!Ap a .b{ԡ֡V!OD{HA}afbbD ĥa!!&*a)")a)ʡa#"B"Ot!.+"R׵.ڢb2&c#Z,Jb4#b"W`rPx@0 #bJ{cPaERhEEJpOXʞ2EQ J=ZQJ$ʣN ʆ_,acAH$=`;#CމDd0>EddD#H6dVEމB ECBHU\b'o^HxDBhrhIU6EwcVňaTOdDDhIRIeGy5D{H "YHE`p&^T"]$ }VZQ $H*N)gnHFzNF)")p։]LeiElN9FM'ܫ@ąd(XUuF;*hj*'ngr*|6)2J_iQxFd'TW v")Uix*r jk)PJ*g%Ebbr D*`T.B'$'$U#_ѕeTn낂PEs>i:f>k>;TfVće]+=R!Tw,IJ0JE ULTT\S [lBFCbIlf4hA88"@,B[l"gfTCFXe% ťƣNk=(a=EH,v*%>)F4-VдZ̾XŇ\=/Di˺+ltPDaD6Erb=-H_Ԗ@~ b*yy`^`S{1"8A8 k%U%(ɷXN*+Zvk)"N{ )IrĻFjUq\h4i#鈩U.nbBR"n^eSU%e}V*mfeek.([fBNNrFt$q/XLRn tDž0(tL A*"+=,–6Fg4ԂaQ40p)nQm&L.3=X(T.zJ=wvo- WĒ"PO! ˴"h,AمE+j'mICmS/[o$BCsN[.E[.PfN5vVp ax瀒0!5[Sid7I6H7q;$!YE 4D.P^ET08qp^4lu|KjE"pwxۄr_mrty|2\8\QRUux۠T>Tr>s.D1VCQO=,B1ՃHWf]-CO0@X(_9=CEу>P=jOC@)ظ0p%@1' `4c=$HH]3=398ȀC%ۆw[L1ӐiCV,v[&cxck=lEot7E>9GcBAE! D4|ʮˀ4yG&T40eE;["L~y @4@1񰖷Il6lhL:z&9(TԺ-e^=z7>@ȥ_DedӶE11G4x8#pqN (Ç򅮆"uvTK2D M7CϷwԂ,!Cr5>hb=coRT 8Z@1Ij;K7>׃0>B Yatjo}":!Fekg5[=+['V|ž^nDDV:P{T` f&g2t@8`A&TaC!L#peUL3icP-fC2>z郙K}\SEp\F3OFg\@W.#G3Pq9n 4F[fNzA 3d=^RKf(Z4q\<mV:yV9&ZL:1 E4Z2XQ]Z\tY@ fS-S"VNnc};R3wzacN/uL7qu=T\9pWOh:--Wkz@;]uiR\.{)&:ж}ڇlCFzJhޫ2Pې6e를6 ][*Tc("\- ? A^:6C/:,IT|N%5ph&Mn15!phA9 8M9;luк4ވA4 $Z /LrU'bhv ] j-bXKjeLTJ-C>AeԒIcȁ-Қ'mS6]XLa򱂴XMA4aϪZDƢG-+)UPm (LgP2.&3Ѧ"UBm$EL3A 7)?IC;e8 tPOQ$ VU+seXTdKIR ԂKM]l 8E2z@hۧJu0RiK\ȭ 9^ )tJevM_i.LdDqՃ 5Sz_,Cp a&B"t"=cDp!bЃR3s*x tXY6ht6{cxlU3=d6'HFM!5u.m 8Ғ;c-OJ|z*F -ּʄ0}vѮ9,?;'W0"9R*Bը*+}oCb$\( ʈ1Xtxc/ zaIҳIVP88t|z<`Az$cb"x#bE܏|䄈JZ!ɨ'sI-@ AA{S*H (:)*l&.&#;An74>yFXsl,( jWOAAbˮz"& #mD&8L􍉬.1Lbudb)M YF(X ڸ#"vGQ*lJS @Cr=/J>fGOl87{wD DɢAQǃ;ca.0GZT jCkڄH P訴C0 -z]f<2Ă8tYPG-Q )hG),AgIR20<@@RF{(}kODCb :IUE@$DHzp-n>͞ñ0-k{U{ֹQ?`;,7JjC\3?n =q堒#Z):7/IcHN2Z3* R+C}AsbHvn(77_mg? wSwz®vDŽN ]D@ P(cH&i}dÛ`|tC xkz&/Al""C#ittIpb~#*fPn!Heڔ" /LLIlBL,\Ic]i-IZ ֢vp^rblۼcR W^ #!%u),&!ʔj|dǬiWtG0OcNA0/rJiJ,4hㆌC-'P%w, WF"_tVB!jHK gd@L#Ѣwi KL$ 1 .@>j .4܉QvIAsAPvڈ v tJ_6ªxz1 <>F);{^2:ynJIx"+ @&Ʈ#i@*}Q'5ܰ@ZKnN IS55mKS0} /Ms :0L(IBJ\&ϲ5k6MzeS^h6OMVRsX}kMPTYtOB`.OCu.I-؆,3eFYaOV3F|5RQµXPAֵ Ao^ gz|T%\uD3#38Yѱ"'$R85'C4#Ϲ^L5زaUgqGm1'sM4<16tEwt 9gM&;Z6[uu_vcuiukWwmwy7wsvvwvwWvavvww}7x}yWyxv7{{x:&y@w{xwٷ}x7~շ|67;z߆7}W{u|w]+70Hc2 6.t`sHa?q9b66<8"U'r\rX\{[x#Nm BKE}8WqCrKsфtA2StMAG+ " Etc ѭjzf+ɸ1PB߮،ٸ5j10w s88Ϯ;z'"*et^xq#n%y%|x8C )zl&dl"Τϕ‚͘Oژ_Ӗ5  q9sȘ$Y٘ٙyyY!l9y ř t/i07^9 ن$-0&\׭ٛZY5%Sa~zy/5:7!ڣ92bxGf._ndҒN]RWplejNiZ逺6od􂺋АXLԊ馫ean$0Dmyy~ofWnȶ 1:Z{S٪Ǩ tQyop%o ;({-9=;nM[y4GW7ExM ?S[YHyBNqb[koryYbudqr? O{[[;IY[mBO(͏{cdgۊr99$ E[p;#ܜ'-/c5a MwNԩ#.˫znLvа nDYhetgƧOR gX3ȁɓ::m:MŁsR>o7H%]M{Be_ P15k.E%)85Ш;jzAM<Һf5fl0{C8ݳK0_Qi$1_1T> &)%E(qL4G=ReRKAdDxv'!yס&N!8F9vvwGSO"$NfI:5⒓QbCݗ{d&hp1]-@hJhwvXS c4-<[C4F JE4E 2Ҡ{AQFQmOOaeѴ]v/iuQQH{(JO-ӓZ| }"V4%-Jm6Vo=Fi|9>)1`*(,iDI#~V?j9h掴):Y&sJj똰!1M.,%v2"yrJ:<.7Sl-(Y jwmL=VihZo͵_pMKqUd`Zbp1e -ј"p 5cq4 U +M@۬ }`>.T−$yZDGZfM~4쒥yVF!B(eJ 3VdADڇT)$:3L.aMOG5/Y?jq!a}Sk>w~OC~忴ؿ%r\4-˞"yCT ipX$^12*,cmEJ 8 Ũ؆2,{j h I {%I0RQC:k]H9 aIX7-hL1Il;*X&uAH`م0XD(fx%'fLd!&Vaa1CYȏ hi-e(#YRFNBȑ$(Jd<$t%P1]44hb/'( vpl]R140iJJ Sh)!"<*AvM!GjK cDQFkͨ3UFE'dz|~%K8C$L8ϒ}sT䨯dHCFhhC=AEx4 tӜ4鸮ӠQm)Qqԏ/ImBuR% tzrTiE;&p ܀o&Ҡ/h[N-t9A Oқ0 aAl,բQRDFzc pj 01Ub%P2hC᐀R" {Ֆ71U4$tX",{yq(@51*@ϙ)G;S-=ړ;O8š$H2D|SEKO׾U} Lb ~/ pN'q*&Cǒ1djykp)HhR %_6EBF-ln|@Q[Q*!2HÞ%2Z~fQ>Z䗷'iJ()}KwS^3c2Ph$/G kQUo_Zw0=w5k)ƶ5f'ʾkzvMmkOd3 $ ˌe6\>noǵc9>q0°I[H˖5L"zKWS㱭AaNC\fM5LvIC{_ z N=Fд]LsYTUۙ{(~C1R+B1R[QͬB}Ȧ]Zon|G wӱ7u|~xi7`%Ҳ^ŬT^ުט "x1 .BBu-4O4@O #&?C65fπv~{o]{w}gXjwLk.Go=߽W]MX%9kC)" #(#f`ixZ'H ak'( *8vaT&18_0^.8/8E6EO<8EAXBh)h/8_%]E s'v wy7cYMu*74S]pxqS{o(-\k_~'~%r/AZF$}^eSvǁFu=7G~_lcmKl FkWx`1x#Muh'_5Gx7^7E8k ^g "؁8؀ S4ܨ cgkXwBgHFOx (xHx&bHb4\Ljc yuyPpdJp.ddNHБ n#$_l{iO^`kgiZC6[ ~Dˇq4mdgvx|҆ʦ֊k}lell xцghh( 聺8>LjX=+(ݸ|szi)ਘߘ9*xYHl&*f}9vFɘxh8+^"G6''I TVvc}y)to'p7@1`(BzMDљTq BlrT58m61 fF7/מJx_]ym#чm$AU&a `c_= Vi=Wiqq[9۲2c¢2:Q!XBR>S.AC&rr:9.8tQ9F=9sIt,,'"X#uQY.DCZڢQGbG'rW|1pVtLk(}Aq1=&ʈI[ȠY=x_YWCo IOk)k984ц|91̨:eLj1ᨌ H$8凄ߨ J*pߘJڭʭޚ亭 *zʮ늮 j 骭Nx7 8Pv'p~ʱ(*&B^ٌ\wɫ6E)k^6$DYfSx T` QȕׂSҸm|6_9vj2H8Xa[ĸaqq#&*l2Rt&x;ys}{{zpk~+K{q[bqx·j[˹&hi&Pnh:7 a8r2+c1X.h1R8k.ȗ1;6Y`Ckً %*c}텂߈Uqi#?d[owi^8囌Ni)T+EhUFK:ٙ0hi6kJ`q9U*:Q-q\+zUZ̻)̻1@ Gb 4R*9n,32 |VXk62 x"r1R9hQF#+`+8({2kđD,9[f|_ yK"e/KtYeB>?WB)2.B3$` ʡ,ʣLʥlʧʩ//bn[/I^6 b1b pvh( wb# MBؙPМ|(L^"!lL^NЋNb!(E݂37E= $%|~- a-6!q潮e6e'](ѮͣEr}-(.*|"ЙAݎͿQ.q>wyAvAn>{G }3ٽ797*r.\7\ذ j V9PW\{!qZ"cCRo B_W= '`>/Pk8HBOL H%q^VocO.bNRg4O;:'iOt#]4M[$o#~/l qU !n(M9LE؉킎$Q";D\FF ,|S^OTWb_]ߢ.fM6 -$u9Z"-B3G ,1#bN۟pr4Kýbb{1 98 _A Rkb MV/}E}Ep`Ee!̸} odL$Dz>1at9f˚8o93'M@oIϢ:qѣ42ͤ&]*̍%=xI DA}n%ظݎl _&\aĈc="cȑ%'ު2Me+W Ghh&楩Uƙu1aI{^ogNofRJ-8ݤÆnK2%Ky)7#e4jj;6Mj4Poo_j˼B4;5-Hڮ<ΪH…!$ : F+5}xm1@a+ͩ\!F1`A"y5-$i)`Sr#a U0 aLu LChcK'5;) %e1C!"1z8cΔ'~fG,PiH9įn%c@tTվx,/k `hUImOvXGqE 9=D"r#)~c# IIBZy$HO.ĤЖ#770 26Yj\ V -1ڠyl!+cNq 5ss^ҖfӄƁFI=%9\w5/d]oWR ZD)Q'׼ifD̙k {f PFT4Rbp 1JS 7xd+43F\Ch^tO5qI˜hQyB*{:`x}#"VRN E5<3<ox'=O%1aO#KS k b$y^ (u%` auẍ́2 beW&x5QM{Z8 &sk$4MȀi |@i d.Ah9O[2iT:NhZZ. i4舽7iP8v4T“ڕwc+Yjh*):Oyͣ$vUed?A e .!,ZeUeњ5MMwOk:=LoN_Iw9bf r t5 ˿FLc|zy uʞZUH@5c99~#Y Q@Rק?]̍a:x*rHds֝[Wwfd(Xg{O pgjm+\w8$rGv35zGNKcʇh&DEЩ j@%(VRѐ9)^P:=p e9:q0䐐!s235:a7/cB0 0B?X4[J㴇?Ś0ڴ 9 ; ۬ë6[0ڜ.H.}9,ȓ,'ӒODA J$K>l @ԒBD&0DLėP&PĄP&,yă!ŃPEH UxHxQAfS .oɄ\kAd6;A٣ph! iL(B؝+4┚CcGau7B+Cm;j?L+5Rð C8\00\{)0lB Z j܅H$.a&) ɗ}g؂}'c}A}II@2Ʉi  rɜd|ȖJ,SXڢe_1\JF$!{ :; iy0AF)ԋRy3S³B}cG ?>z 9 ^}0C8tT?9μg *{ML.|.L}`-s\̣ *|i2ܗ\Sٜ@ʑ4 LXTF]ahTHTF}ILTH}TKMLxT >UQ-m3CJUR=UVUUT]UWmUXWUYXUZU^-@̣0\8HQbQ;? 74QaX5h \ C,7P}`0VV҇|t&<ȁWhڼ|-jW *؜x%OTUCO_lp!$@X9q(@YeP0<тTHOk4Q+?B-C0Ma "R06aӗP8I?TR6#HZVQZlbӰmD[HH$Z67=ڬGS1ASӒ[m LB%-\åQX c-a5V[C59@*C\y* :d# bK?5;d V:\Q 'ЎBu*5zP!08%IUsV#Ve}ģV9< ۴\2Y]1֚=U#KE=Ӯ@KY ``1P1PKa{v v(a }&Twg[aav3:~tq6|e9`qhPNh`胦G3b <#F4Js,:%g}bf*@miSOՓ)9ޘxJ{iV26GJj4iz4(ȈV.86hH^ᱞh\ oyvkHk  lX^kX6N6Լf`kX.llNb&..L3CLQ:3<˿)&ú+Ǎm.n8¨aA҈cؘ4ۀc0hC{qI`haYj'x4o`[:ٙF&XGyv́מ \aah pcaSõĻ4ܜ_6K< +c@[*ۑuA1H78{ 9yA?3?ʑe1T44Hm<6el=l8lFkr<9m^:?Vk )ms&Vmf?Wml t@rCw벦Bs6sD'ƞt 4"~ \ۆֿ8MsmФю8](/4 Oߨx{XI`rrͩX/YËAFV HF|!7` `Sp'Tz vxg`ola *w!t_~) 4`pKz֝k\1T%뻚ֻٶiPQ#^uddbh_K^zs / vv0kRAFw3z:cLF~Dj1f^]\cVմ?0bÛQH cQb0?\Xj ^疽Uoa{@Y-9 5NEL2dʤ ]8.ίbpRUU6wQe#OW$Y 4xx3) i$A Păqĉ)!Ǐ=^$JP0)Ӥ,SΞSF,O? ʳh2.:(TMTP}\NǬl׬]Gwn}X/.|x4fkjob0A֥H= I3 ޝaxgO_tO/;zw}`{}w ( I`{ g~I w`$1,CaLU@UBQ; #10U2[TOVX2ÈUR4bAuqI 26 Y~u1bcwpj$3 +!=!ڕ䀖>9%lҩ ԣ2˙믾O4AZl*mr5k,FV{ֹv)sy[bXīqGUSRG#O<񒃋@]UO_ %V!9DΕaمcqO;㶏0@Vs!ݙESA 9[ 8B,HZ&)ej)cUbvkщl'>öO.[2-l=ʽylymsox"Z+n{-4Jvr+sj[' ,߿7ڎ>Ӯ\s{{_,2#`Gu- 0H"Pbi0182&G/qͶ#fI5h۠E7@b 10iP 'PE3$`@MF յ:.&ņel! k{/9e3qgqXRbԽ`J,BI~@H䠖6bV`ty_neid0aCT-@!˒-/ҹٹn?'˛\M̀m Fl KIHgmQCeQpXmHo;Rܧ6i$&6xl = ʡwyv/ uyCp*.rXP6OUVQ7E.p,_RǡVmX7H:0EA3'D"%Alec0lo*6yḂ Tr㱂8S$a4&<-e'N\w7 -.>;r7,[żm$JHiz8Ү6/NE@`A477RIT9w 3 "HNBynz%rqv#L)"l3eX:~pj̆ň_2PfdAl,8 ,Dm@ g u0״=1{S=l̙2xzM 106p֭.>ڞ)w 6&SpwI,b j8f1 41&\:U;`sa\LfixNyKM;M~PXI%=r˼KجsEbA yuťf㬴׉dR1[f+W>\>i'Pif0M#G^Yo&OB8h;OPUKԚm1Z,R9񦻆O9Y庍cs!jvk[2tBӀBqjTؓ߰)˄!-aJ^S77o|]̿׬5c1rDV2S#\W~-k_[LKUHLD_9LSЏ$SaEda^ˑqtgP2bI7Y` m4XHdzT*mWrS !۸ ;NCv>|I4d9i Z"Kb=FSZqmU*1\Z|ɍuQ 4}ejdϭRW%}Y N=X_ ZrE4V͈U$*`) 0Ќ jbC@)2AMBMi 1l*ɹX^dĊDQ^ō4%)UV)؎XYUذ̃ڲd2Ԃ@iL㔌ij ԱZPYEUUSQ i8VdNŔ WMDsO+-CY(bяX|0IhHM1q hbX I$]ML!>I..1Ur w5ǥTr@B><"yHɐ~ 4@XM$Ú`mQeT$ܚ k4#(pMƮ5.W8ς8Q5b /Y_ UYL&tnQВ$ԛ+flq`t|Wr)j9_-I\U-MC5 ^i A#nA3 CS|BP$2PѮMfQ؁NmJʀcȐ](& N ?j~Wp(]M8մ (ɍ(0nX$ȓ扺MlVJ@ɾhKɛ߸G+i߈aJcsT%}WJuqZW }]2]\v!/ t)Bmc-©ޔmWER $aɍ>8ʚp!m]ޜiHv-{x ҝ^ " T 01I1۳6 -Mg~F *詖 UŤ$("$II1mBjx ZB#顔t 鏶А 5虦Ď ( *n")J f6e SK?Wr%h&=kKUHNO˵Y$hv$Ffg`Xq,Bꭖſj`HG$qh "t iOgYVN%|,4g-S 2oښ-zQzW@~Kqx!DMĵG|T~]q"ݝhnݍ$В^&ӧ]#vGH^xjZ۫bknՅwA&dɗ1&c`ILIazN>RzUbFFnEHĮ:Kl.KKn|Jɴ_^L^ļUaG:PGf"@fogdeNo/-E&H=%AaAk2*̵ɉih6υ؜S_<cq%ig]$yO0(IPbOLTE ^Uq[z9PlR5 ?ʰvCw[ZOQT,U*q4VV8G;.Y;&O5\_^1^jJ4]Z= @aPDB<ȃ0$샏lZP&֬0kP-h[8<ƌC0aK 50ZƦx1}Mǿ=Ulw7DE: xbU)ӆ |Bפ [ˌq˘.ZcJѫYlqEb8208Sf1Ȉȁ"4#[, )&nOH1 JD&)N]hc(&((,NPA< lFx1@Y8,Q,O6ou5_oFy5lbiIUN>j6XS]N*!EL„yPf$.F2`WH:`xpY7]3Bت|MaH|y?O[MtY=N\yeA&,r$^}Khf* @[rtSl; H=pB2jxfGP;koCn$ZyEO)hE/B{lLwzG0B*ˁ@GY]JgEU) s00l>tu?=l2Yq^w>u lڅrg>ݢISCww|I(F.ND|\hBҠҰ A|ǬrzG#yv q!|tKe͘35{|ͨs;e eHͫ`={C=.Z`DoKHzh1~> GdĒiRСˆ2)fbŒyoh8eJ+YtfI*9oH}\BˡsKϟyKI)AhS8Z=Ҥ&!fR׮Ҥ}ӵl۰]-]l WojMzqbŋ7v㾴1Ar4h29!eHedHsF|2nҖ7'H.'YrPv9-9|}&_c]'cq̣F].E\(#W5=DGpEb/^jd?*#F"9JP#b ܏#i+:PB04d+OICnbѐT$=";f }gB B2*+ɹ+JKL\Kʷ ,L:4\6|8圓:LK7A# 1:G3H(d`A h &QqhCiMWi$a!;"<<՛keڳLnFe"f.၁N0qiY)\f'&+r7܉6p!Z[TqAr-W!P? hoT.ЖJiO[ V5b*]F)+Dڭ<6#Đ\CgxGupAHݻm=)<}bPA3G /i.)bnhf~#nZ2Xԟzf/%œ[P4r(tz [ '@Wuׄ"/n`CLT#yGѴɀ/ h? HF*RedBF*22 /_:uDB;&PjRҠWH>rZA.nr46y@*PDXHm"386.ƍǴط[DS(2EH#[VHw@ CNw7Չko$áA%g D(exzCh#\LMҋZ2.s_"[eLJyfm`儶 N2E&bB,Ԧ [M(,[6tb{!&S@7 N{6n+=œǠ)JT?%zi.RX2-iITB Z4L HF/QJ hF;Jҏ! H5 RP0ŨIIҍ޴8ũGyѝ#mK:T  O*T5OUS:4XHseG9R@, );u<zuS R{D[\[bW&,Iꝟ8ʜ]+HP+$`áƪIJufUCĨa26o՜W*ͽ- ble `g%J`q%Bލeb FE4njuL$~soAF㬨+]e@>k Cě8jD4N#;.#Ve2>~b{K7HtSI7 sdo*#&cT*C $ D0")!0õyяp OBXc&KHH';񇣓c3G`PJj5*s"A(z%$m 5/BH7Y&N1l0(4'ֲvol-U؂$ly I`ayHFGh5ߒœ}g$j[Dh!hFBP0nA^`Fz$t4GO $(Rn^&7hD6º&I4^ aBe`ѻN1tD+L;,37Jt! Fr4#.pJ1Tk + JOAX@UwW_گ0EI6%lr ꪬ*GS37'R+6'C&d"&DIцm4XWV% cLsnxδgal3T4QYCVFPbm$m9ԃ6:q=O'ڡ7TDd׼îhO%*:+XZO%O(AQ?~HG ngM/K<]bT_b}>S2>Qn"L8-r^(e30) lډp`FBkH ngSg{vE+Y<t.P GbUTBw#x{-jq>ANCah\I r!Pwdi%K0lrbJFPsVIQEHgG6 \z~NTe57X-I,CG ަt gc"ZrA <3 3i!ײ*Nbڐ|'D jAhVn*C@Y+%2NΕf j0D0sI6c>&Hl0#4U7@~"0Q4qE]G4!o8 Ӟ+tgA1-&8sg6(Z X4 w\ A #tib d86}PB>ɟ.D* Ld&jJN9LBۢKdIxfyjYnf FnYc*l{yE*y9ٙٗQ9ٖAb7 B8g,Dtc_DGqy4Ċ޼ȞacAXX=faδ4cc]3 avQi,8l=isWhqq.u 1e;v(IdoɎ9.&Xp ӤH8r?RV#66od_9)͜O]"TY2d82D%u%5, WL yv1%_rxm0S/2B" z ġ#"K6t8" `?$1?SA'E$$ML+pH;Iryd, *,]7F/ g]U/; .%R_BwH2 !ԉ.) q@#ya@=yy-U1P'.Z[(1QemZH(~jn&`ˎ'AaV+Z#nDW?FM\Zzussv=D>E$: G`R;bل7~-]"8g>"o7 4HfʇzеAj>DÇ3]&;g(/XxD9R!lNHQsEDGvUTM&}ptkk^jgljѱǝA8ďx|l@E^Na@ֈK&^; 1*X]=j.LDPn;nootq BT)@"^eȍ:_ܬܾ}qg&SkrN0R5Iir}զHv~:禨n͆n _P1S¯ʲ,9̸Rg Ơ2/j |1̘Oy+ %ƕ-sd͏h4[Pat2FT4ob$}H,YBe"T)&\z(@e.u׷%.]/>v]dRXvQAte 0.BMq $i2S\,MPE[Ƭװc˞aLRmg i&)|l+_μ'i7Rپ:|h1u/onviˏY5ط^nY>y2$݀I<]4E|`d&K[aDS>2#.cT(֖CڽzꝵVVuWյCYH֋kI6䓓2]$hsvYdHC4nURKAW՘YA@a\dIgg1q>lfseY!iL>QNmMj2,S"[pQQP݈x%d6U֜mBqz>(jRetC&FmPІ+n#Y%STUy*ޱ0W2I߰H5*F2> SO0+<1Ei1!jx].[&Uq2\vqs5,s2뜳O=;] 74RŠb!`>W`]q HJ;ǀr#B랖QCW9 ֐Ahf1h(GVB>[ĐJ?θ*`QԓHʄ D"ˠ༔љD SO-%4v^\*-뵭ꮯ:8K<m|;/=Wog5e:U{ rs# EF*^Vw(aɥ\c5AXϼH41&L BMAu:IEg RI0r. l E(C&|a@!1!4TB2JDDbC%L4D&DXa.r^ #(21АNvPT 8؋ֺ@6V&2>B8j_H\RE%?xrKʲ@ ,{~ǚ!dl,1Y?HL9lXF+}R,aCsRMb!aPBNf z`<1m 4?ܥ5*S8O8orP2b.գl2;Yyz|O|i?zT'm+`$Ð de||I_M&1 8H= P!0Bu8^w3ǦB<4J'H*e4tfgKj^D!#˫^uW,yAtP(%11hNjk*lJUC봕)V]b Z"6%lY;&c*jDo,u9ĸ  C8HJh"=G4M! .T;NwJl'vDKZWhKݝ.xӀriVzKW轮x^w/~~Is]*$ަ8]zMj )u,41vjTzbhJjr:o1VGbǚ$X|6pe+ldt8E,Wip0^b:* : n! 43p18&wf6 PH!I2u!X3EK'ANի|38KKXŖ=1STǢRd椿#/*q\i,*dӨjPSګb0="g/d61cw/ymҭg?F`qA{)$[=a a @+&Ā >:`68Hhۊx]!gaNY@*nH$'DP,(=H~a UN7pȲ|X~bmΒ՚+6ӊVªv U{O2Lӥ2y 2xk2?5<(SBjQhNc i^gR@ϱ~N2'P{!#S!C Ⱥ2It}pu6,~qN0:gpؖK~sN7uӖVZdMWu}r)Vl~XԔK#&VxJUFt\i_f5G@Z +p+p  `]p  Q =(02=CX1* g)  EIY< EkCtR(w6|ycQ,qtIS8AIg&ŠRm2]sFdeWMX%ksj cbX4GvfAäRkap11pp:a w0R3- 019A FT~>#w$e2?sHe7'~3(YI9TrIIqr+$vsidHVFMLNHEjee'c&tdtuUi8t@LVaY XkEWӦveWyj=vd[GkWhVd%WԀrP 1p-5ɒQ5,8,) *iDq a C)x~/&u!DA"4{|?!#履bw/gD*QA4f9@VeQt::4#TaMGcdǠc`Ak BfTkecbj}JlT&CSXHU kvڟ Fv*jwwvcc$,>aظ aPQ qo2<8p** a,0 9Qya2"i\ 8G#Hpkқ*(b2CBop{aHzA0z~$CƋAF~JALXVyEwDW47Aqa~:iv [XTVx[|nWepG['e)u^UZ&hS:oR%d>b ` h*a[Z 3I!Q  z`2 thrC@pQ0$)/0{$HcUg,bLCVYtm]8^k+tbHŖx6x*HVOnt]NsmiwD؆AFeqɟkקm%GUp-@i02p \ 0ckD6#qlU'<-# 4q7Ƣ -iq2(Ԯ"&@ rR8HLj 2`GT֙ ɁjarLVu2fu18<aT%KBL;vlHk˨j*KXq509*ѿZDhː3LJr{T P@[+/ķ/4#ޱZ T1ɐѢTB)H:.䔬;MWVBkkG&ذ٩zU0,6JxmdmH6mj&X7iͫbVFVF`1phfuf jt<{a!TS- Hihy@7/p##fQV(s\[xh@WHS0 Amc:bXdWEic+ThW" ۄYW hittV4XɴMD&Ygh!Vb50 `=6L%)$Kǘ{|#>2#w~S,_qVg61 &˫VBpqmNa|2٫\GeH[V+}eBK]Oәʲ*bӜltشcY}aCٞjbuwn*YAZq;3 6|+3',('+ΧhL[=6}oʵQUVUkwWW"lAx "ž,3*h/nFuW3{e)2TbQ"ٛj۩ZqK.:Mmæ˼ƊVӊ=~6 ( ;w`պxF+sVbb{nǽ->!U;;]\u\>;A<^_Ue~E^%^]5^컮ξˮ]߅^֎_g̴V }t'vtxJ j%}N:s5+4lfuR/ͪ[6ETt?taMTfe@ {fjbLFLEih h]GM.w*L"*'ƘzlW6t:j;lconlAQFIljfGug'b c=GI"+ cv+KceT.%1ƽ65dCwtSj4`*7ibBb+]#DN[%дGus5dʠ3L LǦkgM檈u( {cu5 XRʩ ۄZ荪DVvۨvYkZHsSk'u]aǾC1+&U?|[pt@-/Td^KSBCY7EOپhk/2*ӧpe;XObB "gEhY4(C ERhrfʛtX#I>]TYtϗ:Q>MxTEB, )VoJIgX(-F3hڳ_HiUKO&6i_I1@MOpL1ĠIo Y)_ƜYfΝ=c.nLƁ#,0ecϮ-[׺m nܿ&7lݚMz,x_,)ؽ[GIccnFί2nC 2 H0rfB~j$BB {Ьlji?;%&T Z P'e>p0a!!Ab ,e+@mL$K/G직 (LR+}%MT9'tN7|38tHbPM6EO EPP|%h.Rɢc'(StXL{h/+2&K#BnEǘj .+4‘àZ*BR;*=6UUd!tС|LhΊu!^.Ö",({ ՁT r̔;9$1rHN/8c̢K7%Ԡ#ۈCN^ۄ! 8T7sfeU4>OJg> Zh/+1{ck~P7Z ]W\_|KEdT +Sr>V]Y ]}Éx"v66\QzD黐GB\FNh5MT%}>b#ŠKM:# uF 2};PE %A%y-@^8qQݔlI^RNٷ}IO?OZ% ' b^×4KyɁ KnS(,s1MW78Uj; T}AUq"2xD8t% ]j.2RClOWd/$ $FA$br n<(}pLb#Ǥa~9Sg) R<@ˤ8胴umi21A<8ٍ=B dpZ2ߊ Dvs]pI?YʠK)6o"Fj".{^ng9'Z{$Tk\|.R:bvc?&T4kOح0⩅hZNoU;ǢMal Ko\黗ˆI`9]GɄ$1 +.y#2A4A<yDy,;tMi\>]@leea.<172``&m4}$菎o6:_&\vxϜJ?P43\VUĸvqx3&\ _thR _ÕCP]2f3$Ӡ}-,['˂}ZVK^,ĵCJaȠpHƥe(c 2@Q * &8 V36 1-N81)Ι lwq*S '*T6mPH:1֘9>7.{tf)_m W5gҫ٨gfꕤLొj['Sg_4+3 _E{ۛX 3,փ (֑DJJvT>[XAb3K\pkf%Ng3:(Thd`a=819&pylJyWNn(zIGcFi Lת"S'&zQ'di6nsYH?gnj!b *{*:!Uj ؑX6fIf /r*vfډ&5`i)1ꩺr! +a8H'}SM@XB8)z$"5ӇC, Gz25}0[ȉi#C}8B9?C?B I?${ $HG::\ $x@&f+kJj& {1Ķ 17x+̻i0aTnŶ[0fg#=}M0 p/` )08c4,S-Qх#؇x廽#/ó,-ヹ}X;HȨm p$⋁HHi#ȍHIHMLl (3Q I5Z*A"<\;D;dsEf$oS!˵eE頉3P Y;U)rW%\P5)~ًxF$e"G'd h7}8'340a`3S9}(6\"G͂L=̌pLhD8(M NOB\N44hLN4pN DDO48OLtO,O\hġO9Pepp_"kaě"!fAE<FTj9 0]ʯA!r;@֬ eJ[)\"6 zC k܇['*bNuL̟y/K#r"D+5+F1IU|ۋ ;R^T]1;@ Zb[SzAuuC*`c{ At^RdA0BFz=J=dbcRu|B`2@ ?W81;a]ə(ٰeg$? ,\3jИƧK Ep DѩULE(%H@ Y# k"2<TZ"0w^R 25a YJnVЄ8 |+AL)V\M7/JJ:dYi/R2V#97UPù*3AZD! ]K;$[<^ xѪt ;U{[*;k|+s'aՓU0VD>.V`Є#.ѽ ΥC?K-OkxݚS3_2Yd5)ĖB- 3 {\59@|T: f,TXùIT!@X ?n~AL"45Y=) 5I?:^?=YEI`;a ^?'1Ia4lP a3ވE(>C#8958I IXKLS^J}FɉE;{YQ!˫;8ӗr?*LT*g 1FU"$nɣ0r;ɰ6֨ F&n#c4z DC-[V)qu99|  9F CPd 7 =ӌ7ЄTY€1&6 a t1[IAjxdj@@b MFk$&u۶-LҦA5 "<|[wҠ!V```h )#N"囟1~aɠS0M zWe^7&e%Q!l2 Q^y6Ɓ JӮ߈ ]TLk lZ}!A8 \&籾O98BC>D a؞ڀ`u1F|8>+62 N,[5썰EݍI,vê0;!B:%ruM;c!ѿÑ%W]\Xv&!-tq;nнF!mt"y g ;P{| ޓgf4 y[yRθRi$:QU:M"DU괤-KmAti8 ,Jjj[A0 q0- \f/dkīm%e78\w!?x D)dIk.hBz Eř@ h>a 5N>H29Eb-DİH Y7$^@gⶎi.fQ fhs5I qa 8~[lMRasYTK?\ttQi`XnL\"u ~iPYgCbLL9 n`~8!Ʌ&3,av4 bȣt@]ؠT ᯻Yq-si +ba]_T&u%ۣ 6А cR<m L^!cA(%ZWy20I3 '8jrͽ#/F?$!,GV?:;z]#Ri-` LǦ7 2llRI XDai+UT% ^ve7 1 lP dQcY *QeNrd*UV5p pFb͕|6P vvyAԨۀ?eeN?ōDj1^eRUhj &WP[Yf*Z:7'~8Pb*!+mQٻZf % 68V}{3)M&2"*8QSEeaƌiJ$d)Q|H"D_R<&Μ:w'О-jhNIHoQL߾O޾47$T5S PJzʞݧl=nBJ0.ܫT[7zz5۹{YP 7Tn;0ÚצKavbPwϟkd0Foi+3ϝY4oF CS 1(eZ`Ǔ/o%pL ;{ӓJ|LȿE%L/|/JU4EߛQZm}zu빹(\G䝖Mq$dI9ћ懱|.-zG0э*YJrFyJ`J&2g/#[e'deh~2bp!D|>!XR.#KIxP$(8-nĉL1C V _Դ\.!B4 n |4KXDHDE13V@d2i3ДF5i>NFczvݱGI[̅{B(-ȝ(ag= :5peĸ§K$?ʈe QKZYHUx͌gblV0r\|èōnD&XIosd24SZrlu= F˦}g5F-[D ͐kdNl9耞P  IYv,Bج_STJ -aYY&WX]ZC3Nay`T Se!om੉jA q﹈ u`aH PT|gϽ✔Űpr\(Ő  _9RK \!.F1InX0VL[u_F$]5}LPq5Ÿ@$uW=icD%S" ɈmZ ڰ\Y^0$g { TiQ>(C1ҭF@L" źI- s؏!ОH @ ՍQ. O]D\}JNl2D1!DH䷑c%ZoȇU Д "QXim(یMP񘌐_RC;\@ \%Dg`PM`9ն"KfH9%\J3[FDcPn5=Dh1SEYekDC\R\S 5]c]PAmab`KSTICGD%\e5V(Tqq͠谒!eVu`^dTu<,`JJ:fz߼~̤}@H08G~$臀dMi'QD*dD ȅ}shRE9qEPkh+yأuUTNO]LPiNqNԆMԠMe%X0Y4iĔUh!)){PkWD1i2(BBF*NJ*VjN*vd*(ꨚꂖi"4ռ@ga*a̧% : ɐ'TAou6 &V^gEY'س4ň AVEd)2wZ ~VM&g'+y<[f@ ʉPԊ""$Q(,&2&,(1FVfJ,Z,j,Ċ8ʪ2(>ĪĶlάSl;,,,ڬʬlo%9uEj4dWqCEݗnV?o1$f$i8mLٶ횐<['dڢj :r2rbN)DPeN{@Ui]饧bIe?R`HΊnFnn4HN8lpeUP H_ؑ 9.͘VjPNRQ ˄]EZb,w޶0sL-GZ~VI ^Jkfdi'2T> V&5kĐ EHV~J2R.D; UZo"Y@ c< L@ԇ!qF]d(`p4uH=EpmPYZjpa }*eWڏ\"*$|(Z6&!cAEqOEW@z\vPTI-bGCmZޭ%T,60qh2NEFr ìyk o1hBE L`&Ĝӛ3cPd11ІΝ𨥚'ڠLs`3*zF H a`n/řhyg(#_q`e N Xr 3#>@ˌW&d˸ "BƠʹԆE!^r䠠v)%(t(Wt(p݌s(/Q^%PR$Q0Buc]3Bu5Ku!a(Ơ%I-^ "^ R@^AIyps"47L Um |D9|aPPM-JI(G"crh[\Qݯ` %]maXu2s6N0k0ϣNHL0ӈf4p>W2b\mal7)I'zfXUZޖr 8:}*V*rlZ&z ;n=Rsc"k/&C/E%SuiIV]gK{9rﱞR? hM*  HzذZ[D08ct&vY<9qpdYslud9Fcl)n~\J Di/VVu&Y xKށs`#}N2rwm%{dic]JрEҌf@lIˏB$N_biIx# Xʵ=FH ^0;@yTB2HoC^t2n/ -ޞSy]_b A@b|u#C"Ev&nj^qLTbas~ ;bC+d@ak;ŧv gc M\H CRHk8g0$L~T(21d^%I:bS쮯Q\87!z$*YCYzhGXAlI:t/`QdRٌ:3B9Ƙ֏{UE4ׅ`N׺8#0(EģPwLLlqV_Џ"ઑ^|^]΀ `.eB(萚vOAŧ瘉z~RPS{:5<"fG+@8ůCnsѷG#Fg֗ u 0L 'NS{SC}*N(qƋ jdȑDz "mI1vlP!hwcęr$H%#Wy%ƈ>Q䨓RLOf%S$Wr> Zs4ndJbȈ1 i&9paÇ'VqcǏ!G<07ZͤΝ[\4QCMm:G? tJB *${,c ԲeʎW q62hɛc,M(lldL#L+uCU~S)džNsJٔ1Bɭs-$v+0,:%ѢʷJ[ʣ`j-4!*xC7> vB(<;sF2›jj*kD[ѼBK><'I+h÷ pثWYo02^_^Bت`ZQ{qfvڢQ8^寿8_~eP6ܙuADn6nH_Q,Q)a,)Lk9GF.(IJz\uJONrFJB\G9ʋҏ*+9?m x)^=wdf$QT3US7 x90tzORW ò؜%L$GhhukTud$eQ{_Xu},`c&JRUAulS!6v'-e)Wl_ ڷvj5l^ u jU;ZѺ,mg궶gցѦ1)v VJO⩇fOynf+3Rnv40v @йuZ 4Ίdyv_W%_7C [ඖ]0jY¦ .%aؾֶ {`Z$;Z2Yu=uua 2O>K.1d!1Ad%/Mve)OY0؁G[g7( !YdY] 1 ks|<9}wςi05M Ҙ?KH4ȟ嗳ٔ6u?LgOӠVoqjԯS>uT4\ָ5N}lO'{rmb浫G}oyn#`le?ǖ_ lc'n;okws;4vl[6u~[ -Wu0WNaFoܠQN}( I_JI$yYrܥv%eH9ʛ&yOS^M|eFlbANzMH1zj uS^ݒT+)M#ȧ{D;ۿȸ=EY5Ӹe8EyK/_yo^o)̋|Qיִx!q '~׾m{=/y|_u}o@/?{Oi?/_gƞz( i r_~B/" +z nh0 /L.̂86K@z:pIMMp4AdOP0U暺Dmq0upyJ.0 vp0 #4!2b'JDJlhBp*07p"0(p_Ȱ>% p P ΰ+  ;Q|CVe$hD^mE5q`EQhȘlpt…t2,0mDbxG{Rq|@ YdI!OC!Ah4R$BhH"#!)!"!#r!7#3#'"IP-@'5)X =))&&e\h2,Vh!tsP@FcR&s2V\''KczR|C_E^@x^Dd!&)lKh)Y*% ]d sf=5%_4 -{BdET$BO]ryEЩbrr%/%q&?1[([r}*̞ppH8-n$H -D[HsNA4 5߰4W5Y-B66],F36U7S6y6eSBbd60*| 3"3p(H""$G$7Ű[7)΂34 q5g; *(s<QdC$hE] (EFQ h"41v:";<>)Ndw8Fo͖wv<> >qWAVMZP \Keua5Uٵeӷ!~ ^u~}U~}c8~~؀7~7 ]accU_[dAVV{GX5fE3փv~1؃r`)M6\;cUD`3[UVBaFÃSx!L  0UVC`5\O` Ԉ%5f4}q8R~AZQaID]Ճ~ACOMd[uaM\4`bQ։8^\;]~"V$f$e񴏳xU"_&X%#3،vMX-y%ČL 'hs"Ri&< ftdprb{h9=lW}*Sq٘YOy%&"fDH/-(!oo9ax="e:}#Ǭ'lֺ]ڭ#SCڮsګoygEaCG;ə޲v('*|+>%-Ɯ|mbJ:۹&h*R8me*Qrav"6h8{|yIj,%tfR_^J]'AbȪ$Hz 6&0)$oH[B"Mzn:`j~.;hΕ5JܿIjrVYJjO juNϥFjE\n7<<@S*E Sap|Oܲfܕ"/ Ԡʩʫ˧\˯˳|ʽ˳Ŝ˿|ռ|̵ͷ|ϯ|<ѿ| |G=?I=\/]C;+EY]ic=y]e1] לLh͞0|;=:9ڗcگ=ګ]ڻڻ]}ڽ}ۿܿ=ϝٝ}=ޗۯ]ڵ=ݥ} ~=ݱ>%^]+}]㟝]>7}=9C]S~A~];y8|7O/^ۉ~c#>䓾^g}8>۱}9~ݨ/p48j8K~j&>;f9!?j+?3S9CK-W#5_1_IE 1#c}_g?Q/Q=^mE?9¾5 g^⻞^T~Obeˢ *3"B=L(ѢD)6dhGAlѡʐCycJ OdФ̓:*5fڈ2HEC&fĊGOR#јPhV:L8\EN\%:'Ew3{LQb9"+L{؃pvtV =F eU'ӝ'1GK2bhҤ G5?~ ̛;]9ԗK=zίiy&\wx緯}ï?>u_I{Qw_~\ Nz>'~iD`񇜅18X_&z hq,f衄AI 1ܠI&˄12>DYD*idI6y$OJdH.)eZbeQRd[%`Zd\f=L fSy'bɦz6yh)zdS:gj嗃Nen2Zmf:&K9erJ&O{ZjEF*+yy꫊9h& l&Y$Ԗ r")좸Jn#ndC 8$j(2͝ʴ˼oº/@cp;0C/? +l0pkr*Kq$yq'1"S ﳯJcmYȰKo]<g_G _xO=poBvRwHol>.q[5wKh{]3悳9pʭ5*5aw#n1:Y:w/C41컧}55G;D/u9G= K Mйpo>1\4Юvr*+^ZDKiK 89]S?^JFh-π=Ǵ;A퀣 )4kqؤ+-a@ zr T5ς%Tq+O?$(+H%:4ZLcķ0["әj 6Ѝjm$&0X aS㧴ZQqӢ(,>!Q?5Q+$/I.L\(&C2ܟJ )FWgB8‰p31eԣ nd7< xj$1G+`:ƹEO @3{?cESy 7Gqr3-?`/䙷"klE6>oa$Gx WYvO<;42ܢF5z MK Yē"x.(tu}hYm>^=1hl1 Q]x-;A_ SρY`48 eJW,r s7h]kL=0'ue#ћ<9QyL~ NYؼLك3]Ej`Miebk$6y12D(wSQY<SjR3֬k#`kЊ4;LCvSV7t[)5EX6ڇoL /dB Bb(X88mԠfBHFePk!C>S*0Qm灃0b{4̮.]7c4Q[9%PBI|wFV*pT=yaNzY4c9$w̪'x r87-fFNZ4d,zqi6~k7e^b@dX8C\H#< ?+GsB)eOdOBdJͣa_VãE=ZJs'h.ű #u $$ pF`P5vh j@[eiafM8[pw^X h`H V<j] u'Zɳ1A:6?onCf#VDVHdV}rwlGUC7?cKv6ܗ8b Ł$c5T13nb%oVb7f`4TlTXS{#@4S^%F8EiULst01vQUoxSxoAL3B5ٸB;NM| `C?F|hBP~Jbs5ddYe'g~rc`B 2vDHj+n)Icfv+%a\W5e 7o u#esg6xӄ>}6Ł/p/ %hKVp 6 eha1h`i :0jp҅1`0tXh &`Ҩo2gܤrmn0݆KYrvqVzC?ODYT;^iyrlcrYEXŧbr`smA;5Y8-t PUaFiWtIDe:PeIv$U(gGQR F\)cc}.@nr5$<2c2|b؜(RS&|rDD@)W$,jZ b.QZ[J*[6H+i3) owwudi[ג[.5@:<:BpJJ`PkUzVIdGG(+f7F`e#?TIe㢭^[C1 ~oJd{<.eD5A =CN&qS&b,;q?D3`mče*V$d\ 4 m1qzиvMH>Ez\8z+Wk?Xxc^CPY+IbF䇀a)O{Qz 5r/ZsL+.|>q])?Ly <]؟ch\tMHcZٕF[Mq\0Eewy` <.`姧t5kWCZeZXGewC^ygieM:N*mqJʧC$RWSw2 hV6Zye|dNűb hsaY{FHA?q.[Jq3]UƧnodd8FX5HnG9?%fH2E4`2k{|Ug7\3cT/k`L7Z@ dTZvU[ªʰv0zy]0/Tlih\/WY'|4#N܅˟Frh0Q)%Fnhz{NmgT0Υ⛛տmG}5՚<?>i0 MBpMc Ρ]NWfUө-ABC"mŽ:DkUZaON|ds9^ V-.{6vbeu>Q ,Y@B OӲ gWFTnK;=CfvZNu˟ biOw G:()IR#fzRUlvʌg HU}kz*Kɪ{ego7#a R{`zFj6> v3 {,VԨ(I]WԞb(c36m%x'4÷=%3d9.FT8W\"O_Pʏ{-fV~4l'̉,9,|&[&0}T޾z JԷl}*sH#LjB!(!H} 90Lzy`}PbȒ b,(bΐUiɆ)IOE;Gi@*'G}i.{ 7Ĥ!#@>L*iSIƼt,ԜhaZ<UYM*9sGɒyOe{ا'Yj,"R S9aD-s3FQrܟm;j<*7 '~Ѣʳ/jʗcIKIjʓj#THR5"1J k -( ;>ݬ=j8j:%s$ yiC0{ L驋|5bh KhRAb 1! 5+J4P8 K(Dkβ k.2+u2͠8$$$J:T* >0/!0k³8HUt*,Ěut+*Q&,Jh[/4UԴ))+M%C !j\n[#=r{տXJIUGQ"q!:2OC\y)t=TS)R[1> A,*ŴҴJuk.`4A}؉!Ncchjzyvv9e(%VHke@:XJ(8.*sfj'y!`z("^F`hpeO3JJڕW9XlF+U²0SNJã4fӊl=!>cvLAPV&]g!0ů&#g%Wd~P-:h݈=zCa cPS~t+O)݅5(:GqQq~4DLB"e@.A "PILin2bE}N2.Аt-O׸|2HqH4I4.@c{ܲ&PddS.}odbD-yl1> P ~%VҀDF#xF;rTppE]PjFDkoC=xQ(3ռ(tg2Hi~L3Ur+eV{Nc_v{=~'X(u R-h)4遪aI^Kk@ܽV?a'$O.yUl.6yٙdӐ[$dы|)#lo^-ܥ͓Oct"0&1Px#I# |훆IAh@ ?˄&#aUY|p7G-7i-rj aB Is2"FX3BrCmN4.X.ƭV( A<ƀ x+o$'$CơHwrkrEdlɁEdw@ ^Zp.*tH_#F\ӓ;OVFf|K[p$+Җ +Z.n'숗BKY̦'!j:IU292tSfVR.EFQѸçp!D87cCZ3{#ɪZoĩf{<y(%>J1qCD}v*&s܉(Q9rEvQMBί&V{R[?<12+$K 215r2"! z|$j T!.)v)31a?s2iAb ¦;Is/Aؔ3 +::;w” B:["x0 =l~]BZ.sJe/:C5\ Q#AK .\/苼h"ncc x}-Ң50 1}8 əҰ}{9gp8-b7bE21+ۚ ©adBzHEط|EⰏ4X }?z0 WY%raẻx*miy@$`CK 1aa mJĐS]&0nC pۇxH P}؅ħ(Y" gH*h7 YF+-œК z9#s"PF-R)25))Sa8b[!eiMēEiI}LԳ0G2 5)9 S G߬`;!CS٭II]W` 1xŔ;tv:(Wu0=:X53nz Ȱ0`_ԴM6%?.뺺H;ǀ.]wPpWŐE`@t1U0 捲cfbbQ:tmyHimQ:_չ Ef=i#ܫ510_A] /Ρ$\ih)0^J96aha>f^z̵%`PYPY0jH;L65sRJ`ep0԰Ssz>[FQ,$@ U:y_l~2ZƋ bb d5+̼̒@Œ>bϨp1!:JOwq\A !ZdQVHjcMI %| J[mPa P|e Bߚ<2+ʁ.8[ 3}= ͳN٨P^fy\#,]!4IbDEZݘQ!L 'D--POC?&y]:k ~'$aȮC"Nڽc ;I{AJRNԩH(sM1B>"hTrb.7frG i~@`a4<3-}_hZzi2֘5f 'G T|uDa~rI`ZPpN.H :;jb/$v"X04 tfZkVo]_⪢,($jGv3<^c$vKy5H9LYr}{<"j z=NsUՍ5fisJSf"$FSI=C˝F-J+X/ݼ Is͞7G~ kuiVP 闯ºb䏰rb%a$x\C6r| @l3rtNF L7-xU-cBe#HH0hS}!;NI+IFm<`U<.ڱ!z- xk >`G.r䌺YW\hzg&E'ov Zߩ*w.Y3XZxB*l[}¢+&]ҙ g2F:w$J%w<{me">p)sзL߾hB % hYܧ BHⲉJBt2pĸ!,KE #꛷E2f(x'JmW<)2 YE=aI %HO $b|CjDMoHyRYO&f)qfwҹz)gF&ڙhxY}B~:)^Ji )F&uh,()ɦvjꚒJ+꫱hZj髶*n:(Zꩴ k*:mMMvg+&7 M^ D~[⛯ۯ\# 3ܰCR Kư% KeTBE ш\,{205}onڜ}xy>:Jk9vsN틇>z= IC&?g:;qgwBw߷λ%<4G]=I/䎏[9ܥpFG9-x[,w1]ȴg2Ex[3n(mu >-w`τkQ0})< i'C"DA"{,S`ƲUl*8 2&b`jҗ03Kg,F5itG7tT iUDȞy<$#23}t#)G51 fD3Y6Q_&JSZ#QRrl$SYJ2BRk%YJST/XL`"3{c8LJr-QiT2D%//)5bҙѴ)Jr6f8KprS3{M]N͜e:Jad@MWzӕT'9PS%f?mSDuG #]2 !*Єvɔ$1Ɓr"44)>@r~`YP u)ӢUeCuІFF*@a9Lb҇$:!XSSͨUQw0D!'fv((gC% oTpmg8s`ǮbN46U+L%85,Ie3Y" bUY61Ri;ZBd}IF@ӑp%e,ʣu+k n`kX|/.^ bΖr7k] 4#A,O"Tg0rÙ EmYS -B,gdzg$U]dZɾ9 BtRBtRʦ;iOvnhojXS$' dm+~h3L RI0MYė4%6@J"cm4<<".h dźѕC H5[N=,k;e k(7I`Mc]3<29<']t$D ݞh!`.ТaH]mF4^"IJϔPG2g3ȾQ h7zP/SiH7W2leF&4IO@͎aD & I@a34erB{2DaZ2%mvˌVom2gEAPj]h $I r&=Վ3z?:LmRNBԖy:r|1\vm+}w<}9"IxyZ蠋IJ^ q AH>/㚑4ѝyd=4{!";`=~i [׈Ma.&]庙񣞟11a`yC"=k;nV܌ NU9[=z"5NWQ#E}vKÝArzM_GZ?g8'nr~&1c͞|ːRc;/x9վBjy o`!9ى-wz0eݚɖD$c%O) EZF[rZdA~Dm`=eȇYщ C@EԋܚyƸQƠAC\e9D)Q)CR)i}[Ȁt^ ¡zE{dŒ__HwTj]5[Glƌ4]1f ]ekq<cıF\Z5)bĥJݬKb )Fh \%Em`ޖH-HɆ!N"WFr٪uU ^`yq_*b B&`BjmFXit,0p) D@"ĀW]iބ@ ҄TҊ)CāްD؍2:muߨ]6ZyF`eƥZ ]KdIWM",j؈a̹T]Z`EƥQFn<TFc1}ƑQ#k`D :=NFa~b _b_$IEdۙ Ѣ_`/VԚf=o95IxdHyJȌe)tYY'ꚡarT E@HNhX|@?B=hAƄ^l&Cd A>TaP|iDPݘǠ&2 @2|")$B0@ @F*2xfd2@i2f2U ㇚*%ieېpoNzIY#%#>*e)c9fH) +ŧcbF/3.ax$( Y Rڜ_jy(K䪥'`\~ژ V6^#)9櫎蝁8b0V,cjE#)jC8ȄIN|DC@D-> hC&(Eʖl44L΀ʰ`L "[HaD/A^D"Tr4lA2DB 0n.Ra \Mcj{Ģ]c,k c-gL͢Y|Z,1>xe\y|gydyZ{ *&"o/-Z\a֙Yu}%zB\9ݎag踍e5r|Bv)L(?VjmR(BBd2V-B $3G՚*2KU(:(J3"5քL9.*k\e^Zga'nfǕSJ#>7d2(]V n _ `;L' !U ,\Z$ƿZR*e>)!r(r'Zn_I㔂}D\)҃>lA(ԯAc=įCj.C>X({E,!1"r?L4L0\[+ā\)L$ SyLqcdEw8j%AZk]"'P@,9 SLb!x%2kŚqҍeǕFmU_dѝQ.\q%-KaƼI6_`]AY B_tI q%vhRh-/`%ݯ`"qHKD݀2PXOgB2> ADr2QER$0IHLp]0 mC (3GR&2TQ'uMɈmxRE{#:qX!&BeaVVmk 9 ]"xƪ9a D|?"gvwǛꟕ1rAJdUW'`5Js#yI oWdYfvH?֊XڨIMN%Zn>_ԱșogߪXv` DXML_ckoD2.>)pD>xoYʦ::3V!֖c E.T@r;/l;Fb{(h;u`I5jݷQf%l{V9OZvYIbv}>IG9w(ܥ%ynYK: ywYJݪ-"Y¨~["qmxڕ *xe^©F5 #[b rqu.㢱yNf|c]%NvuGdAA&xIy 3XهXţD DSԻ[X!L,ݴXUЌ:z{c1:zkIvݤ w+y#u.ut߼i~z4S޻"ac wߧ\-_lF.vx8eqsG'nj$2MvO`zyIn:\)^:Am OgC$b7.B\̃i >=\r"Ċ1B z2}"Ä BܗfB-S2h&DrYK3]D-&I'mjeePLϣB)>["LJ*Tjƒ4qaÇU#[1kֶRUJ֫ĩh=w_XuVXo߰UGJ364di'N^i_H3 vRNؐj`˩ݚ`cb ͘>fBV.=bׅcu:ҩ3G~kgfX{[K1GNvvb#lߐ+[ Î;4>h+J( BA!`48Ϊ-- ; ņ&H i$"D)Z)'eN(2 "O226+n!\H2A0;n+s-nP&BҪpN#Ȅ.5J5']P@0)7\KV Pt-PQk,>J[h5- jP QPq\ LCՐ2sOUj]:/>Apbkܥnmm;gYS1% GIrNZIR$DIQ#іү3^;Z h./ҔZrwW4yI[m%S+SsE`֔-Q45ON>Rk)ͬc!nc1]3\ ?HIz3}PP̅ 3aqLp`45qmZMs T7]Ȁa@121E}ҸI{> ~{ KC g_ ՘珟g~'Sf.עFJIRt3TqzLtD#~ȃ۔o2ZF'؆l섵-l!Wr4fL;z]M> Ҥv Bcf |x0Nvk)K9$l zg9Tr {Ʌ-mQVض% tasrqXR=8P/.a4n" g*D2L_ )GiR,%,2VAHvVu FARlGJ$)#ʺ'7Bb /ԩ"<RmUxc|nyɹo*k$]2T*%MrWgW=E8m9AMUx`)k*=:Ȕ-~j9#+TeҪïF:pB{עB8:oֳ&rJl滌*L'jq8I4"ʉy&wL@&, ǤU.Y91)\a _9a!I\b)VYb1cǙC 2$  1`p";P<!K<򕃬1=^DyDj\g , sg?_Lh@ЇVhG?|J#v2rd(Ynt)0Ȩ62Y}:Se!zַu=k"wӮ4e,[ȞH$/Zvf3ٿ]deN&{X\Xcr eOOy67Wn% ٮw|.^2kmVo洶!dW?|o} )?8Ni1f>sM 暨9͉ \4WFy<9yotPԕQuD'MI^+:ץNuM gWУ =.{v]{_w}~{?h;>Rz.}ꖧ|L=AyOә^q~{KϽ}>z퇡{~o}_{oG~_|7~'Ηoo~暏rX0N OO<ׯo pzVP[G`XP_dpgZ0c@ {4a2~koPo3A{ r@ G }0z0  P  P P |` p | PQq` P ɐ[zlnL :ѼLBQ- P1Oqafe`7I6qq1dC7)&uumQ|w9qylBDUk`0)QgkW0Dر qcCDqTPfǢG` d BdD "R * y#P{0otoPp|GQ e '! P'!1''0(r(( ur'q'pD0* &0PP+0'@Ӡ, -@&'0 g"q,̶vT(M s0m3 dqd1 L2cV7s/yQ2q`d2Q54_q;25IS0i355qQŌw7YS07SQ7QDsS ?6g Qo,!q0n p`8<3"{P`S$RD1Cs24]4$ae 9 =Ds$<;cp*$pFPa^PzEUlo`@{fR&'R pR 0-GuGpGHG)u(4J(2zt 2z&rGoMMP&tt 1I1IѲJ͐<߬<׬,;=S5 ?1s̘33Q538mq4SQ9]379@SǬ9C`@=u:c@S3;;u9 5O#c9H|Q0{Vq83 DU5U'S D<s?3?>"R/q!\;[!3[yL$)ҫ5o5GTA ?Al"+R$ϬS[[l@N%/ uODPF4' w(HP +{&E+}P T')P* r oGR',ے+mMH'+LjF  Bl@SQn231Umu72wQРS,3/2lSs3Wcs7A5@uVTSTEu8wpe3[SoSq4aUn9S5 VX[o=ST T6:aViQU4Q5^s`kpP1U!\;g@UrRD! ;jhdf-2.9/docs/hdfview/UsersGuide/ug01introduction.html0000755000175000017500000000653412050301073023732 0ustar sylvestresylvestre

    [Index] [1] [2] [3] [4] [5] [6] [7]

    Chapter 1: Introduction


    1.1 Overview

    The HDFView is a Java-based tool for browsing and editing HDF4 and HDF5 files. HDFView allows users to browse through any HDF4 and HDF5 file, starting with a tree view of all top-level objects in an HDF file's hierarchy. HDFView allows a user to descend through the hierarchy and navigate among the file's data objects. The content of a data object is loaded only when the object is selected, providing interactive and efficient access to HDF4 and HDF5 files. HDFView editing features allow a user to create, delete, and modify the value of HDF objects and attributes.

    The HDFView graphical user interface (GUI) is simple and easy-to-use. First, HDFView was implemented by using the JavaTM 2 Platform, which is machine-independent. The GUI components have the same look-and-feel for all machines. Second, HDFView uses conventional folders and icons to display groups and datasets in a tree structure. Users can easily expand or collapse folders to navigate the hierarchical structure of an HDF file. Third, HDFView shows data content as text (table or plain text) or as image.

    1.2 About This Release

    1.3 Further Information

    General information about HDF (HDF4 and HDF5) is available at http://www.hdfgroup.org/.

    Information about the HDFView tool and related products is available at http://www.hdfgroup.org/hdf-java-html/

    Questions and feedback may be sent to the HDF Helpdesk.


    [Index] [1] [2] [3] [4] [5] [6] [7]

    jhdf-2.9/docs/hdfview/UsersGuide/ug04treeview.html0000755000175000017500000004660612050301073023052 0ustar sylvestresylvestre

    [Index] [1] [2] [3] [4] [5] [6] [7]

    Chapter 4: The Tree Viewer


     

    4.1 Overview

    The Tree Viewer (or panel) shows the objects in each open file, and supports the navigation and editing of those objects. Multiple files can be viewed and edited, and both HDF4 and HDF5 files can be opened. The viewing and editing operations work for both HDF4 and HDF5, although some operations cannot be implemented for HDF4.

    Every HDF5 object appears in at least one group. A set of objects can be stored together in a group. You can use the group object API functions to create and manipulate the groups. With the groups, you can organize the data objects in an HDF file. Objects in HDF4 may or may not belong to a group. An object that does not belong to any group is called a lone object, such as lone Vdata. To map HDF4 structure to HDF5 structure, a “dummy” root group is created in the tree view and lone objects are put at the root group.

    Since objects can have names in more than one group, the set of all objects in an HDF file is a directed graph. It is difficult to manipulate and browse the graph on a 2-D virtual screen. Instead of showing the directed graph of the HDF file structure, HDFView displays HDF objects in a conventional structure as a tree of “folders,” breaking the “loops” in the graph when necessary. The tree viewer of HDFView provides users an easy way to browse and manage HDF data objects in an HDF file. The following icons are used to represent HDF objects:

    • --- HDF4 file
    • --- HDF5 file
    • --- Collapsed group folder
    • --- Expanded group folder
    • --- HDF4 SDS or HDF5 scalar dataset
    • --- HDF4 GR image or HDF5 image
    • --- HDF4 Vdata or HDF5 compound dataset


    4.2 Tree Structure

    Upon opening an HDF file, HDFView displays the tree structure of the HDF file in the tree viewer, which is the left panel in the HDFView window. Every HDF file has exactly one root group that is created when the file is created. The root group is added to the root of the tree. When two or more files are open, the root groups of the files are listed at the root in the tree view.

    Groups are presented as folders in the tree viewer. Opening and closing folders, you can browse the individual HDF objects in the HDF file. Datasets, images and tables are leaf objects in the tree. Clicking a leaf object allows you to see the content of the object displayed in the data/document window in the right panel of the HDFView window.


    The tree viewer

    To select an object in the tree, point the mouse at the object and click once on the object. You can open the data content of the selected data object from the menu bar or from the popup menu.

    The popup menu appears by clicking the right mouse button on the object in the tree view. When a command is selected from the popup menu, the command action will be taken on the object clicked.


    The object popup menu

    4.3 View Data Content

    The Tree View allows the user to navigate the structure of the HDF file, to select individual objects, and to view the content of the selected object.

    You can open a data object in the tree by a double-mouse-click or selecting the “Open” command from the menu bar or the popup menu. By default, data content is displayed as an image, a table or text based on its datatype. See the following chapters for a detailed discussion of the data viewers.

    If the data value is not in memory, the “Open” action will load the data from the file and display it. If the data is already loaded into memory, it will just display the data. If you want to refresh data in memory or open a dataset with a different selection (subset or display option), you have to use the “Open As” command.

    Using “Open As”, you can select a subset of the dataset to display or change the default display options. For example, you can display the data values of an image in a spreadsheet, or show a scalar dataset as an image. For multi-dimension dataset, you can select any of two dimensions to display. The mouse-drag navigator allows you to select a subset by dragging the mouse over the preview image. For more details about how to select a subset and dimensions, see 5.2 Subset and Dimension Selection.

    The “Start” field(s) determines the starting coordinate of the selected area.

    The “End” field(s) determines the ending coordinate of the selected area.

    The “Stride” field(s) chooses array locations from the dataspace with each value in the stride array determining how many elements to move in each dimension. Setting a value in the stride array to 1 moves to each element in that dimension of the dataspace; setting a value of 2 in the stride array moves to every other element in that dimension of the dataspace. In other words, the stride determines the number of elements to move from the start location in each dimension. Stride values of 0 are not allowed. If the stride parameter is NULL, a contiguous hyperslab is selected (as if each value in the stride array was set to all 1's).

    4.4 Show Bit Values

    HDFVIew allows users to view bit values of 8-bit/16-bit integers in two ways:

    • applying a bitmask to data values
    • showing values of selected bits

    The figure below shows tha GUI layout of the two options:


    The bitmask options

    Applying a bitmask means to use the bitwise operation AND to the original data. For example,

    Showing values of selected bits means to apply the bitmask to the data and throw away any unnecessary bits that are not selected by the bitmask, i.e. the 0 bits in the bitmask. In most of the cases, this will be the beginning and ending 0 bits in the bitmask. For example,

    For the current implementation, only contiguous bits are allowed when the option of "Show Value of Selected Bits" is selected.

    4.5 Display Metadata and Attributes

    The metadata dialog box appears by right-clicking the object (icon) in the tree or by selecting the “Properties” command from the “Object” menu. The HDF metadata display contains two tabbed panes, showing the general metadata and the user-defined attributes.

    General metadata includes the name, type, and path of the data object.

    For groups, general metadata also includes the name, type, and size of all the members of the group. The following figure shows an example of the general information of a group.


    General properties of an HDF group

    For a dataset (or image), the general metadata also includes the dataspace information (rank, current, and maximum size of each dimension), datatype information (type, size, and order). The following figure shows an example of the metadata for a dataset.


    General properties of a dataset

    To see the attributes of an object, click the “Attribute” tab in the object's Properties window. The name, type, size, and value of all attributes of the selected object are displayed in a table. The following figure shows an example of the attribute display.


    The Attributes tab

    4.6 Edit File and File Structure

    The HDFView allows you to create and save a file and to add and delete objects in the file. Users should be aware that all the changes are made to the actual stored file. This version does not support the undo operation; editing results cannot be automatically recovered.

    4.6.1 Create and Save File

    The file creation dialog box appears when you choose the “New HDF4/5” command from the File menu. Choose the path and the file name you want to create and click the “Ok” button from the New File dialog box. A new file will be created with an empty root group.


    Create New File

    Select “Save As” from the File menu to save the currently selected file into a new file of the same format, i.e. HDF4 to HDF4 or HDF5 to HDF5. (HDFView does not support HDF4 to HDF5 conversion.)

    For HDF5, a new file is written that does not contain the inaccessible objects, and it packs the unusable space. Thus, the new file may be smaller than the original. Dataset or attributes values that are object references can not be updated. For HDF4, a new file is the exact copy, same file content and file size.

    4.6.2 Setting the Library Version Bounds

    The library version bounds of an HDF5 file can be set by right click the file from treeview, and select “Set Lib version bounds” from the Object menu and set the earliest version and latest version. In order to see the library versions of the HDF5 File that had been set, select “Properties” from the Object menu and it will display the library versions that had been set earlier.


    Setting the library version bounds of an HDF5 file

    4.6.3 Add and Delete Object

    To create a new group, select the “New Group” command from the Object menu. Then, give the name of the new group and the parent group to which the new group is to be added.


    The New Group dialog box

    By clicking on the “more” button, the user can set the options, creation order, and link storage when creating groups. Help buttons are provide for more information about the options.


    Create new group options

    To create a new dataset, select the “New Dataset” command from the Object menu. Then, specify the name, path, datatype, dataspace, and storage layout and compression of the new dataset. The current version only supports creating simple datatypes. This version cannot create an HDF4 VData or an HDF5 compound dataset; however, these objects can be viewed. Supported datatypes include integers (byte, short, int, long), float, double, and character. For HDF5, it also includes String and Object references.


    The New Dataset dialog box

    The “New Image” command from the Object menu allows you to create an empty image with default image attributes. The new image does not have any palette attached to it. You can create two kinds of images: an indexed image with 256 colors and a 24-bit true color image.


    The New HDF Image dialog box

    The “New Link” command from the object menu allows you to create links to objects. Three types of links can be created: hard, soft, or external. Hard links and soft links are links to objects in the same HDF5 file. External links are links to objects in a different HDF5 file. Soft links and external links are symbolic links and are allowed to dangle, meaning that the target object need not exist at the time the link is created. A Help button is provided for more information about links.


    The New Link dialog box

    The type for a soft link or external link object that links to a non-existing target object is unknown, so it will have a different icon as ‘’ The user can change the target object being linked to, by slecting the link object from the tree view, right click and select “Properties” from the object menu. In the Properties dialog box, select the “Change” button to change the target object.


    Change the target object for a dangling link

    To delete objects from the tree, you first select the objects, then choose the “Delete” command from the Object menu. A confirmation dialog appears to verify that you want to delete the selected objects.

    Deleting an object from an HDF4 file is not supported. Deleting the HDF5 object calls the H5Gunlink() function of the HDF5 library. The unlink function removes the link, and when an object has no remaining links, it can be deleted. However, the HDF5 library does not currently reclaim the space in the file. This means that the size of the file does not shrink even though objects are removed. (Users are cautioned that repeatedly creating and deleting objects with HDFView can cause the HDF5 file to grow.) To get rid of the inaccessible objects, you have to save the current file into a new file and rename the new file to the current file.

    4.6.4 Copy and Paste Object

    HDFView allows you to copy an object and paste it in the same file or a different file of the same type. To copy and paste an HDF5 object from the tree, select the object and then select the “Copy” command from the Object menu. You then select a group by a single click on the group to which the object is pasted. After you select the “Paste” command, the object is copied into the selected group. HDFView does not allow you to copy/paste an object of different format. The “Paste” command will create a new object in the selected group instead of making a hard link.

    You can also select multiple objects in the tree and apply the copy/paste action into the selected objects. Selection can be contiguous and discontiguous. To make a contiguous selection, hold down the Shift key and click on the first object, then click on the second object while holding down the Shift key. All the objects between the two objects will be selected inclusively. To make a discontiguous selection, hold down the Ctrl key while clicking the objects with the left mouse button. The objects being clicked will be selected. The rest of the operation of copying/pasting multiple objects is the same as that of copying/pasting a single object.

    Copying a group will also copy all the descendents of the group. Copying a root group is not allowed.

    4.6.5 Move Object

    HDFView allows you to move an object within the same HDF5 file from one location to another. Moving objects from one file to another file is not supported by HDFView. To move an HDF5 object from the tree, select the object and then select the “Cut” command from the Object menu. You then select a group by a single click on the group to where the object is moved. Select the “Paste” command, the object is then moved into the selected group.

    You can also select multiple objects in the tree and apply the move action into the selected objects. Selection can be contiguous and discontiguous.

    Moving a group will also move all the descendents of the group. Moving a root group is not allowed. Moving objects is not supported by HDF4 Files.

    4.6.6 Add, Delete and Modify Attribute

    To add an attribute, click the “Add” button on the Attribute panel. You can create an attribute of a string, scalar, and 1D array of simple datatypes. Attributes of multiple dimensions or a compound datatype are not supported.


    The New Attribute dialog box

    To change the value of an attribute, type the new value into the cell. Only string and scalar attributes can be modified. The new value must be interpretable as a value of the correct type for the attribute. For a string value, the value typed will be truncated to the size of the attribute if it is longer than the declared size of the attribute. A valid data value must follow the rules specified by the section 5.4 Change Data Value.

    To change the name of an attribute, type the new name into the cell. Close the file and reopen it. Open the attribute, the name will be the new name set. Note: once the attribute name is changed, it cannot be changed again until unless the file is closed and reopened.

    To delete an attribute, select the attribute and click the “Delete” button. Deleting an attribute of an HDF4 object is not supported.


    [Index] [1] [2] [3] [4] [5] [6] [7]

    jhdf-2.9/docs/hdfview/UsersGuide/ug07textview.html0000755000175000017500000000355312050301073023074 0ustar sylvestresylvestre

    [Index] [1] [2] [3] [4] [5] [6] [7]

    Chapter 7: Text Viewer

    Datasets with data of type “String” are displayed in a Text Viewer window. The Text Viewer provides a scroller for a large string dataset. Users can scroll up or down and left or right, as needed, to view the full content of the dataset.

    TextView shows the text of a one-dimension text dataset in rows of text areas. For multiple-dimension datasets, you can select one dimension to display using the “Open As” command from the TreeView. The following figure shows that two rows of 1-D text (dim[0] = 2) are displayed in separate text areas.


    A dataset with string data

    You can modify the text content by typing new text in the text area. The modified text is chopped based on the maximum length of the string dataset. A string dataset of variable length is not supported.


    [Index] [1] [2] [3] [4] [5] [6] [7]

    jhdf-2.9/docs/hdfview/index.html0000644000175000017500000001171312051032172017536 0ustar sylvestresylvestre

    HDFView


    HDFView is a visual tool for browsing and editing HDF4 and HDF5 files. Using HDFView, you can
    • view a file hierarchy in a tree structure
    • create new file, add or delete groups and datasets
    • view and modify the content of a dataset
    • add, delete and modify attributes
    • replace I/O and GUI components such as table view, image view and metadata view
    About This Release
    - new features and major changes of the latest version
    the User's Guide
    - information on how to use the HDFView
    the Module Guide
    - instruction on how to implement HDFView modules

    Download HDFView 2.9

    The HDF Group is conducting an HDFView user survey. Your kind participation will help us improve our commitment in serving the HDF community. Please take a few minutes to go over the survey questions at

    HDFView User Survey

    HDFView can be downloaded quickly from here. JRE1.7 is bundled in the distribution (except for Mac). No additional software is needed to run HDFView.


    Install/Run Instructions

    • Unix:

      • To install, type:   sh ./hdfview_install_xxx.bin
      • To run, type:   ./hdfview

    • Mac OS X:

      • To install, open hdfview_install_macosx_xxx.zip
      • To run, {where_you_install_hdfview}/hdfview.sh
        or click on the HDFView Icon on the desktop

    • Windows:

      • To install, type: hdfview_install_windows_xxx.exe
      • To run, select HDFView from the menu, Start -> programs -> HDFView 2.x -> HDFView 2.x

    Install HDFView in Silent Mode

    1. Edit Installer.properties file for customisation
      Eg: EDIT the installation directory in USER_INSTALL_DIR property

      # Installation mode (Silent)
      INSTALLER_UI=SILENT

      # Installation directory - use "\\" to separate directories.
      USER_INSTALL_DIR=C:\\Program files\\TheHDFGroup\\HDFView

      # Installation set (Complete/Upgrade)
      CHOSEN_INSTALL_SET=Complete
    2. Place the installer.properties file along with hdfview_install_xxx.exe[.bin]
    3. run the HDFView installer with the following command, e.g.
      hdfview_install_win64.exe -f installer.properties

    Documentation

    The HDFView User's Guide, accessible from the top of this page, contains detailed information on installing and using HDFView.

    jhdf-2.9/docs/hdfview/phaseout_jhv.html0000755000175000017500000001136312050301073021130 0ustar sylvestresylvestre

    Phase Out JHV

    The need to phase out JHV

    Viewing HDF files visually on different platforms is always a challenge. With the JavaTM technology, the HDF Java team was able to develop HDF visualization tools such as the Java HDF Viewer (JHV) and the HDF5 View (H5View). Using the JHV, users can browse through the hierarchical structure of HDF4 files and view content of HDF4 objects. The H5View is a Java-based tool for browsing and editing HDF5 files. With the H5View, users can easily create and delete HDF5 objects, and modify the content of HDF5 objects and attributes. However, there is variety of challenging problems in visualizing HDF files.

    The JHV and H5View support only a single format, HDF4 or HDF5 files, respectively. Since HDF4 and HDF5 files are incompatible, JHV cannot read HDF5 files, and vice versa. To be able to read both HDF4 and HDF5 files, users have to install both tools. If both HDF4 and HDF5 files are named with the same extension "hdf", users have no way to know which tool to use in advance.

    The JHV and H5View require different Java Virtual Machine. The JHV was built and can only run at JDK1.1.x. It does not work on Java 2 platform(JDK 1.2.x or JDK 1.3.x). The H5View was developed at Java 2 and does not run on JDK 1.1.x or earlier version of Java virtual machines. To build the JHV and H5View from the source or install the pre-built binary bundles without JRE, users have to install both JDK1.1.x and Java 2 in their machine.

    Supporting both the JHV and H5View are expensive. The HDF support group and HDF Java team have to maintain separate bug and feature-request lists and web pages for the JHV and H5View. The tool developers have to work for both the JHV and H5View projects, which include source tree, building environment/scripts, documentation and release work.

    Converting data objects between HDF4 and HDF5 is not supported with the JHV or H5View. Since both the JHV and H5View only support a single format, and opens only one file a time, users cannot copy/move objects of different types (HDF4 or HDF5) between files.

    The new tool, NCSA HDF Viewer (HDFView), is a visual tool for browsing and editing NCSA HDF4 and HDF5 files. The HDFView will be implemented by using Java 2 Platform that is designed to be machine-independent. The interface and features of the HDFView are the same for all platforms. When the user opens an HDF file, the HDFView will call the HDF4 or the HDF5 library based on the file type and displays the structure of the file in a tree with data groups and data objects represented as conventional folders and icons. Users can easily expand or collapse folders to navigate the hierarchical structure of the file.

    HDFView is the tool to substitute the JHV as the JHV to be phased out. As editing features are added to its future release, HDFView will also be the tool to phase out the H5View.

    The difference between JHV and HDFView

    Although HDFView is the tool to substitute JHV, the Java virtual machine, the GUI interface and object model are different. The following table is a list of differences between the two tools.

    JHV HDFView
    Java Virtual Machine JDK/JRE 1.1.x JDK/JRE 1.3.x
    HDF Object Model Designed only for HDF4 Common model for HDF4/5
    Implementing GUI interface java.awt classes, interface for HDF4 only javax.swing classes, common interface for HDF4/5
    Supporting file format HDF4 and HAIF ASCII HDF4 and HDF5
    Multiple file access No Yes
    Mouse-drag to select 2D subset Yes No
    Animations for SDS or raster images Yes No
    Image contrast, smooth, and contour Yes No
    Make transparent and overlays images Yes No
    Field selection in Vdata Yes No
    User preference Yes No
    Yes No

    For further information

    General information about HDF and HDF4 and HDF5 are available at:

    Information about the HDFView tool and related products is available at:
    /hdf-java-html/ jhdf-2.9/docs/hdfview/ModularGuide/0000755000175000017500000000000012051203651020121 5ustar sylvestresylvestrejhdf-2.9/docs/hdfview/ModularGuide/tree_view.gif0000755000175000017500000001566212050301073022612 0ustar sylvestresylvestreGIF89a"}lL,$\LD\$DDdD ,TļD$\dl4,,ttd $t\L,,$MtSXKNժׯ`чؚ#ӊ<˶۷pK/^J捲woܿ  sYv[W/H(n!׆y櫜 }p]ҨS^4|˖3۸st}21x;dɡAwͼ_&};N:\%\L{pȖ*1[__wϞm$^HYQFyawt$~aYT@=â,z&y X⎩ |4iD(iAF, B&`]הfZqHyI`X(8av5 > XIpuimy}./Ln& 1&ܤ#~%D&]**f2j@B|^Vjtmj+䅼ZR8L1 'd Cxze]_Nkmr+H-:fQ|(Ր"(!+ $Fq Ax" BUZ#YV떼z2 Rl\`&фbd`U1\p2D8F ܟ9<4[v+rPJ*i驕tZQwZ X{2jm`d!wR^qy}(TQaሳ8޵Ϩp (xVt$Wٟ{M W #SٰoP CY@! #uҟeUI':fģipO8WC, ȟ+R0Qr9 },e:3;jj]mG4{;40,x,L旱Zǵy}u|X"1Q$Tp#ȲIeT)U<_-sKRzwiOQEܛ&Dѐ"Pı^Z3t4%2 s3d:T ɣt L2v˝~Db6,g;/1Mw'g6)TFc9 bD6JN23gN( ?%OH F 8E"ʥyl%4 c@(ڠMH 4A͙3>P%Umu^K(0J 1ԠJb(/7@Ep$ :HaC9Ѱ!,H׮,YR)UJYK=Ԑf;YZ ])[$': OXhz­TY[;nձ^MK;JrvW x 7/%.Rs@6Dू(9ʒvTahUbMn|ce]51t[N8Mܖ?$VF.iP J8K 6̼|񴴭jmuܨ^e>1cSѕ\% &PPAHQ&#WB*#h"6 ų1tw@4qm.[8jŪU1 ft5iNwS=I:2dE=jRԧt@z>fY 2lE;3YO&MJ[Ҙδ7N{ӠGMRԜ^ syǡDz3i5E1}5"ָεk^:#hb':مQ:^4lM6OqE w6LDw `J/6.+m{Ǚ729rN>(o"`.x6p{J|ˬg|Qn5ĹIȡQ./P("q]X5Kl j;b]LH=P3P/)4Z'[ìuIM=eEhcm fx\9> 'Q YtշR{pwNvPhH% zP1\ֽC|_$$=Dlh;r/SCs?;,K$6ũNyjѬ&_h(,b Yb*m-W T2թK }dA7Ϡ+v+BwI'h2~}}Bw܁v;GG>s )[VlEXU? WjU'a%c42%s2)Â$P"%Tb%XR#ZѦ0\Y$34c383<3e[Hn`w]%ZsR'wv~vg)GNHx]\ẖl\Ԅq/c3Vc7cE='b?$@d@@6s(瀘rzGHąEvdIdMdQgAm['DUWh%B#TBnaᆮx?r|i|lWj80!}15d}8};pI4x 8P~$H_1~zf~}vLJ^Sb H{؂(rEr/'E^ wz!nts}8) s9$5yy!!u7P>5AH-BX-zZeZihag*bw3^09sX`5^򍷅U-mד4[V%3Hh`/3T=b9dE6CXd4X8f_uvL^j~ogh7a%U#a%DIfN* I(jف6韤qEV}g-bN 9etęm꺮Zj:K wy:jDz:ُsJɟ{IHCR.WVwV~jy獭;NU( `SK '*暈_o*qgzCƳ@91D }wuHkQw}qSxGű!'(/ƈoP; S9,hv'2׶Y*sg 븲 +/yhLK;2Q 8ʸ5\fbx+nr{tok홭h\j۲ȝ8IH#K!;!x֊L%k[#Ff;װsTٛu[Y?pL:ye(1-6Gaw++z'rq37y2q zc!Oi, ^9j]]D|8LwhKx%{2wGxs^""$JR\DbZ_׎{˿ρn{.D|C\I,tFs(./1uwhc8v+O IV jVn;V<-F hmP@4-RŁEQ,C1pmop÷3Hq\,QdidJ :dPpƌw/Qw DWG'q4"ZsD"QHGȾL$ q 4aH̹bҬr,J˾O+H|{Jk׉R9cH4X[ɼZ)q i)̣Ky𙻊E '[JHLЗL"gdդ҅ebFͫ,'Ϋ$ƾ;Q<Ȯ )8$}Tgui`,] HN5۹vI]fM~;^w.Nl Gl_;Gn ysB9p%1[!MRq^]ArOב! AsMu;7o.n+؁y!3e{nk(emt1/~W ̅n^.v-O])v4u9|s϶F%Y3t=:*=ֻXd:U6T:$IIKZ8ÑYݙt|[:'}}?Զ㜿h~;'5ym/17'n*1;q@@DPB ><bD'^ĘQF=~pM>| 2TRfØc֜SN=wTK-U~ bň5o:mM -FO]~9R(FCsRTS.]۔C[W^ M TKi*EnݺL>vo_ʕ-kQfa*:XEOVմ˭] Ɲ[}\pgG\ye ,]zGOǞ]; c 3&4"fz`_+DjTD (.K5 ;{ȍk嶡aGݨDn]O(mBJ肆 *Oe/Z=ТJ뜈_^;ER]&#:Y6F@ ,ia9Ia]Megllƈ$a!2"Dv.@:YE4 7$qJo}ט!:h?*M8! >tksI58ֈ. bwt{U8[}c;~=wֽf=x ;jhdf-2.9/docs/hdfview/ModularGuide/components.gif0000755000175000017500000001413612050301073023001 0ustar sylvestresylvestreGIF89a|\̜̤|ԬĜ,Z&s@h_aH(фJ`VhDDPp|dddttDDτ1NpV{~H(vW,ꈸO?ѝzlItB_1LTy!\d\X$$n3T*IvyZ\JlG|Btvn'AusLD4:̼\ߧ]{>ZT<L8T |[L$x|//{3dTT̔6xql lY$l^|LL4ydTdLd:tt,Dl|tP`T444dD||T,4t0l|L\̴t|lT\XT|ttYT\LtLddԔll\\Ԍ4TtdyuLtt̬<̼Dd|윌<|$$̄\4|! MSOFFICE9.0 msOPMSOFFICE9.0B<! MSOFFICE9.0 cmPPJCmp0712Hs,%H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKV&hӪ]˶۷pʝKlٻx"Ƿ߿ LÈ#˘Đ#KLƘ>̹}/gu3ӨSMVӪcڵg}PsN<4Q_7G39BS:=s?;8œ_oW6KoJȟe& \ςF(Z HF4v ($h 0(4h8Ƙ[^@)D#A+L6=cTVi9PNv9BHSbih~@\`9fHeiU)Ap'rQxjhz碌z褔f٠bf裐n$i('fi9e&xڛvIkDj&N$,Тx)Vk#Fl܊hlaZ+fa-aؚж`[m*p"^ WܡB<hNr1 [~$\ֽ K,-'k2{XYey|i9b25ԀX/"=iY^I~]#k6n ׆!w#4U;bSvV{3v{k4>#G_B}G !Zjû_;7 59͑O>ޟ߮99Oyؼ>|nf_bl߸ɲM[ѻ{.ן zӯ?ÞPK_;㕏wh/_& J0 \x@.  GA]Ђ WDo3 B0'T,=H35M^d h] #śQh] 4n};ֵx?X**op=Rf&MR5-j`w=Z~0BbɐC]ƳJ'x Ŕ> $'U\)-*%,MJ Zr)]R0Cb̘$'eFˉf 4j֒>.Ѝx۲9EeuҜ(/OEL–DuazҬ&^6k1<=I#4 ք}v3cHXN24CCED=2y^cHƔm4eFo/L >ЁۧJʔz8_NUgAKBi׳dvvT(UHI RLVՆM*NQRASU ]]hD")'[T:֊X"]W<³l_֡ճK,aiڳS!iStm$gSu0ԬORvgx_smj/Mq՗ lC52eprds5RUӥis8Ke׼zn^k~e ,׾Vz~gZ |w>Ep`9XPɫU86L, 8Ӏ4Lv'~z1ZZ7 9ߎ"D@eӭ/~5dyOb7eUy2娥?G²2;iђ|6IgϚL:.Bl3,!ѐ>PrH[\=6N{ӠGMRԟe̤'8(@)ZָuD%GLy5#Y{Fd;{n6-jGƶmNb5"aֵS0RnssNwv[7Mp&wpSp ^pt# ϸwWJwRo/GW"#JsRrȞw.css;`җ;PԧN;@'^tXVN>O$V~w9[yg]a:o Ηt:s;'OwzgH'yxuhv|WaQ11'7w؃zx6Ex9(Kt>؄MTRPM|{w2I(x;sV8XYH@؆QHn[ȁ܇yXfx{k xSȇW'z}m؇a8(H7/r||XHWlO|dhȉa0u芷؀HǗ*hhxps"'e,ȸt^h_xXXȅXz3荲8Kȃ׏'㦉NhpGxxyxYh艑} ُgv)x x IX{'Ir)a.ɍƈ4 69~?@47="i~-hԘhR)$ȔM .uT醽8ywx짔mǕ]/h.؅y`wYXsǖm)p-Ȉv9V|~I|_"d'XH蘘[ɓYoSHt)̈9IIhwsxpx؅8逳IgYW/{HzlR9#ywI{G9wiIV7~y,y ٞ:` ڗgǞ閞r機'uypi釠ɠ}:k7ɉosW:{YJ0:gz~)jpb~ɢ$Z|(:C'8*z}ǣ ZsN :"硷XZ\ڥ^`b:^uj=WJnpr.Wdhjj Ãsڧ~ppv:2Kئt A'q:膨ZoTtvqߖfj*k:ڪpS Ydڪ*yJiOn櫔) b!:]> Pzؚ Ӻ:Zz蚮:wk:zw޺گڮD|gQ[[w ۰.[K۱hq$[, *&1&;4J&*۲: 0K'2[B;z<+!;@PF[ HVL۴Q۵CѬW;)^^[bKnf{>j[P;RorKhvR;|m˷{~keB6;OEKʸ_˵)z{3kKjuv۳/+bkK{ *{˹;/+K${'+˻ۺk+KAKk;+\˽k#˼d뻿?K+K k[[ S{蛾*b˿˿ E˽닱jnhQ# ?,L՛ : V,,;u 7|rbܳA,$^Nް~Рm-כߍ->il屻J۽?ؕKd BN ܟ-i -nm\W^.M뵾t>džԖ{ɇĞƾ^>[ǬuLɽ<^7.|ݎX ܩ. kߙnۮ豮ﱽ< M'YO/y?!/ m+)aK 3+o

    How to Implement HDFView Modules

    Table of Contents


    1.Introduction

    This document describes the modular HDFView interfaces, and provides user guidance on how to implement HDFView modules. This guide is not the HDFView User's Guide. The HDFView Users Guide is installed with the HDFView or you can visit the website at HDFView User's Guide.

    1.1 What is modular HDFView?

    Modular HDFView is an improved HDFView with replaceable I/O and GUI modules. It consists of several interfaces that enable users to write and use alternative implementations of I/O and GUI components to replace default modules. The current replaceable modules include:
    • File I/O (already implemented)
    • Image view
    • Table view (a spreadsheet-like layout)
    • Text view
    • Metadata (metadata and attributes) view
    • Tree view
    • Palette view

    1.2 Why modular HDFView?

    Early versions of HDFView (version 1.3 or earlier) are implemented with standard GUI components such as tree view, table, and image view. These components cannot be replaced. There is no optional tree view, table view, and etc for users to display the data in different way. Supporting a new data format will also require major changes in the GUI and I/O source code. To solve this problem, modular HDFView is introduced. Modular HDFView will have the following advantages.
    • Separation of file I/O and data viewer: GUI components do not depend on file I/O implementation. Adding a new file format does not need to change any of the GUI components.
    • Replaceable GUI modules: users can implement their GUI components to replace the default implementation of the TreeView, TableView, ImageView, etc without change of any other code. The development of use modules and HDFView are independent.
    • Reuse source code: users can extend their classes from common packages and abstract classes for less coding.
    • Configurable installation: users can choose to install HDF4 support or HDF5 support or both.
    • Easy to maintain: replacing/changing one module does not change the rest of the source code.

    1.3 Basic requirements

    The modular HDFView should meet the following basic requirements.
    • Separate file I/O access and GUI components so that adding a new data format does not require changing the GUI, and vice visa.
    • Provide abstract interfaces/classes along with a default implementation.
    • Dynamically load user's modules: automatically detect user's module, which is packed in jar files
    • Provide a mechanism for users to select which module to use when multiple modules are provided.
    • Extensive documentation and examples on how to implement such a module.

    2. Fundamental approach

    The fundamental approach is to re-architect the HDFView so that it separates API definition and implementation. The HDFView only calls the abstract interfaces not the implementation. This will allow users to write their own classes (or modules) which implement the interfaces to replace standard default implementation. The main goal is to make the modules easy to implement and flexible to meet user's needs.

    The HDFView consists of three basic components: the main view, the object package, and the GUI modules. The following figure explains the relationship of the three components.


    HDFView Components

    The main window is the first window frame you see when you start the HDFView. It has access to only to the the common object package (abstract data object classes) and the GUI interfaces. It does not depend on any implemwntation of theI/O and GUI components. Therefore, adding new modules does not require any change in the HDFView. This will separate user's implementation from the HDFView development.

    The layout of the main window is shown in the following figure. The main window has two major panels: the TreeView Panel and the Data Panel. The TreeView Panel is used to display the structure of the file in tree. The Data Panel is used to show onther GUI components such as ImageView, TableView and TextView.


    HDFView Main Window

    The common object package, ncsa.hdf.object, consists of abstract classes for file access. The abstract classes only define abstract methods such as data input/output from/to file. Sub-classes have to implement these interfaces. The HDFView only depends on the abstract classes. For example, when you open a file from the HDFView, the main view calls the method, ncsa.hdf.object.FileFormat.open(filename) and retrieves the file structure. The details of how to open the file and how to retrieve the file structure are left for implementation classes.

    GUI components, such as TreeView, ImageView, TableView, etc, are interfaces instead of implementing classes. The main view only access to these interfaces. For instance, when you launch a command from the HDFView to display a dataset in TableView, the HDFView calls TreeView.showDataContent(dataObject) and returns the implementation of the TableView of user's selection.

    3. How to implement an I/O module

    3.1 Classes to implement

    The following diagram shows the class hierarchy of the object packag. The class diagram uses the Unified Modeling Language (UML) notations: association (has), generalization (inherits), refinement (implements) and composition (belongs), to represent the relations of classes. HObject is the base class of all data object, which implements DataFormat. HObject has two inherited classes: Group and Dataset to represent HDF groups and datasets. Dataset has two sub-classes, ScalarDS and CompoundDS. Each FileFormat contains one or more HObjects.


    I/O Class Hierarchy

    To add new I/O module (file format), the following classes must be implemented.

    • FileFormat
      FileFormat defines general I/O accessing interface to file resources, such as open/close file, and retrieve file structure. For details, read FileFormat.html. Two implementing classes, H5File and H4File, are provided for the HDFView to support HDF5 and HDF4 respectively.
    • Group
      Group is an abstract class. This class includes general information of a group object such as members of the group, and common operation on the group. For details, read Group.html. Two sub-classes, H5Group and H4Group, are provided to represent HDF5 group and HDF4 group respectively.
    • Dataset (ScarlarDS or CompoundDS or both)
      This abstract class includes general information of a dataset object such as datatype and dimensions, and common operation on the dataset such as read/write data values. Dataset has two abstract subclasses: ScalarDS and CompoundDS. User's classes must inherit from either ScalarDS or CompoundDS. For details, read Dataset.html.

    3.2 Steps to implement an I/O module

    To add an I/O module into HDFView, you must follow the steps below:
    • Download and install HDFView and and include $HDFVIEW/lib/*.jar files in your claspath
    • Implement your I/O module (FileFormat, Group, and Dataset)
    • Pack your binary classes in a jar file and put it at $HDFVIEW/lib/ext.
    • If there is any required dynamic link libary, put it at your system path or at $HDFVIEW/lib/ext for the HDFView to detect it.
    • Register the new dataformat in HDFView or property file. You only need to register the new dataformat once.
      • Register the new FileFormat from HDFView: Start HDFView and go to "Tools" --> "Add File Format" and add the full class name of the FileFormat with a file extension and key associated to the file format.


        Register FileFormat from HDFView

      • Register the new FileFormat from property file: start HDFView and close it if you never use the HDFView before. After the first use of the HDFView, it creates a property file, hdfview.props, at the user director. Add the new FileFormat in the property file in the form of
        module.fileformat.KEY=full_class_path.
        For example, the highlight line registers the H5File in the HDFView property file, C:\Documents and Settings\xcao\hdfview.props.


        Register FileFormat from Property File

    4. How to implement a GUI module

    4.1 Replaceable GUI components

    The modular HDFView provides several interfaces for GUI components along with default implementation. Users can write their own implementation of these interfaces to replace the default modules. A HDFView GUI component is TreeView, TableView or ImageView to show file content visually. The main HDFView window is a frame to host these components. The current replaceable GUI modules include Tree view, Table view, Image view, Text view, Metadata view, Palette view
    • Tree view
      TreeView defines interfaces for displaying and operating file structure in the form of tree. When you open file, HDFView will invoke the selected tree view module and display the structure of the file on the tree view panel. User's module is responsible on the details of how the file structure is displayed and what action is take when a tree item is clicked. The default tree view displays the structure of the file in a tree with data groups and data objects represented as conventional folders and icons. Users can easily expand or collapse folders to navigate the hierarchical structure of the file.


      Default Tree View

    • Table view
      TableView is a spreadsheet-like table to display numberic or string data values. The default table view provides very limited prreadsheet features.
    • Image view
      ImageView is used to display images. The default image view is provided to display HDF4/5 images. it has very limited function of processing image. An HDF4 image is raster image of 8-bit pixels with and indexed RGB color table, or a 24-bit true color image. An HDF5 image is a dataset that confirms the HDF5 Image Specification (with atribute name="CLASS" value="Image"). The default image view supports two types of images: indexed and true color. Both indexed image and true color image have predefined attributes and data layout according to the HDF5 image specification.
    • Text view
      TextView is like a note pad. It displays the content of a dataset, usually string-type datasets, in ASCII text. The default text view is a JInternalFrame with a JTextArea.
    • Metadata view
      MetadataView shows metadata of objects. Metadata includes attributes, and other properties of the object. The default metadata view is a JDialog with a tabbed panel to show general information and attribue of a data object.


      Default Metadata View

    • Palette view
      A palette or color table converts the logical colour numbers stored in each pixel of an image dataset, normally represented as RGB triplets, that can be displayed as image on the monitor. The palette view is for users to display and modify the values of the RGB pixels.

    • Default Palette View

    4.2 Steps to implement a GUI module

    To add and use a GUImodule in HDFView, you must follow the steps below:
    • Download and install HDFView and and include $HDFVIEW/lib/*.jar files in your claspath
    • Implement your GUI module (TreeView, TableView, ImageView, etc.)
    • Pack your binary classes in a jar file and put it at $HDFVIEW/lib/ext.
    • Restart the HDFView. The HDFView will automatically detects and load the new GUI module.
    • Set default GUI modlue. By default, HDFView opens dataset with default GUI modules. You can change the default GUI modules by
      "Tools" --> "User Options" --> "Default Module"


      Set Default GUI Modules

    jhdf-2.9/docs/hdfview/ModularGuide/io_classes.gif0000755000175000017500000001721612050301073022742 0ustar sylvestresylvestreGIF89a! MSOFFICE9.0 msOPMSOFFICE9.0B<! MSOFFICE9.0 cmPPJCmp0712Hs,H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjU*`Êڵٳ[ǂ,ڷp;ܻx ޿+\kÈk8K8h帑!f̹ۤ+ZeӰ-v:[umcNx68kjy&>xWE[Μt)_zf܎汦g~i}S-WLh%H ^Gzr5!A.!G nGBb#V]."C+N"F%f#&RሐXь?"dUG&)6aP:Mn@>ҐYqIM7aT.gS餕utc(:_hMKz8&{&i'yg:hIilbFҙiC*Tf)%n9ꕆ~zjB>g+9T:J,*y,z礁W6h-Vmݪmz->)I4f.[j*Ԯ% ;R,G. \n/4GfD>̺ɰr:CxC^n- |.Ʌr<+ˣ>ke˸ l #΅9'PZ-3YOL0F*ηzMdl^dTqr]f.eDm7xk|Zޔ;Wیm?t{CΆ4片N8B Dv˸:=NU-Ek>˖ [h`d%ZC`;'NQp#ovF06#A+Ef _s_G!0~Q_RP#Ud!WI53rgf:Ќ4燪 Ɨ;cEnsc.L:v<9'XN'gIЂg Ϙq54SKdTzY΄z 9*"1x[#(uO*~.]e1J¾8i;I9_өP*RMc3:5j -&!X*;z'ƫ k䮪ղj!r:.Ϭp*ZִJ-L\:Թ@^ԯX|ǰ)bu`U/UTfe"tr }DXlMBwYm l˜-[\ݎX9ܸ& -oaHM pyq6mnբȷrgqOzԼ @o\9hvƻK]T+{u78=p{I \`t"8FB!n:`s*Xvpa ~)Z LA;K"0w,n/wS?h$Fr3>.늃|gI>?dgPYKeIE3NeZqeNO`>Ins B7ٰwsӞ=VcƝ{>HF4'˩57ixZ4_GJROi ˪UhWˬ]k[w4ղ;ؾ.iLdb۳NvݰH&:ٝU@h^gm+gboT脷ÝZm{iNGoz+7s[ݖd D-xQnhlV!.TO$U|&xCc)]HFHRT{((yi|imքׁL9=uTl4SR1S~6BJ4dSyݗHntJQQdA=;-@ח?xMio$LNGk~h63:9Sst6ԘaDǗ8YKU&BCKə~HDTIJ 84@`)Fԛ F 48V 9dIÛ$tCiٙtKYPSMTlyGEԞ9 6DyMImY'GJّ`YމIS4?驅Y:tPqv:m |tEH:9jܧ9 _"GJ ,b*j6ں=4{JajozTک&HbՆM[\b8ZF ˰JA ?K1K=" $[:({, Hyt2;-5K-< = BA[d8L+RQ[zX Tƪ^۬`_{d[]{>jKG۶bpr;Wv'| {)[FZKK ۸*۱ {iZVj幘{FM۴[뺖v뻭;{kKz* ," 7 ׫ɋ*۹ [k*<#}/bҾ[ RiZyިۿ+uxx-1 Jx/ %ے.髾#I+wx4)| /"L./ܒy!c0"3Kñ (<5x< JB3hG|+b3U">\V̌#|2l[0X4X:LC%m,l4٠<.m3,9Gݟ4%2ʜgl?ʜ\t!]*;yB]DmWMل*ԌkPNJ1-Ӕ =K ^ឍd{>L[;&)^(\O0n3δ2^n6R{<.?^>wK<;F>ܽLI>IͶO>D[mX#[fbd~T~e~j>chpZ> vn\f^܊|o^gxN]z唾ʮ=iե.l>qiC~N֮^4긎UJ.Ϸڵ^PMöv/˨>Nɳ~۾m%^.z#>X~-nNNsD7,BIײ#,%M ɾfs2\^rA(#MK*#;4B,Us7B_GrLS>E?sSrH=~%' خA,| +FC2Kl;,mߋjZgOL #ҧwi Lm</3Hc1vOt0hHCy^Pb(ܨ/ɳ58oo0O޾@ȟyʏx+q^o̜. O oT؏n)]@ $A *|QDNxbE=R$QdĄ?DRJ-]bliR̔4?LhQM_ƔOi pТM>aғBW25JOJIRWM6lYmݲ]ˑg\tŢ8ݷk}3؃sFXqث8 ْ_eJ޻!Y\!όtpHE$̓=k[6ژY>{{5茸-> s6uu&myڴ/Nխ}\7ܻs^:`9myQ7^Z>hwU~+0z K;|soïB 34 U/ ! U"/ ODJFh$.UT &IB0E>!t0B1J)7+Z+JLE|H.qJ71Ņl3?3WTsE$,snd8EJ&Ni*HLgRJ-]tS 5.k6UWcͰżpVZwIW^o1\X|5K[Bdh /ۢ|vZm56lk6p\%\ev]]N套z pQ~~=ث]߄}XنވX%޸݌ގ5Yݐw=Y̒E^ܔc}ۖUyߚi-Fu,V:h&h@figj:kk;l&lF;mfm߆;n离n;ooL^ڃmJq yS|wa[Xok?Oɛ-``Nl4+,H^Q1s9󧖌W'+ZLe"I d^tL%)M/WFp r;Ҡ%t0X(@>"gZ((nP!NxC!O戀(lC%fO)fj>5lwE'FH0b7"F/I4"v7&PfycCn/CX%±R=2h$z|䛬?JRfU9r[&(JQTbOʒ}d,))KA; AI/4.9bS(uV*SbAjRFVsubnmZ֟4]FWv|Kؾ> [R6ֱ$ld%;YVֲlf5YvֳmhE;ZҖִ# ;jhdf-2.9/docs/hdfview/ModularGuide/palette_view.gif0000755000175000017500000004440112050301073023302 0ustar sylvestresylvestreGIF89a$<$DLd̄̔<\ $ldddDDDtĜ4t4LTttČ/`@g L&m aKa Rx wnO8<ɱ9 8zjahb,x5X#8F#>x3iTF$PJY%Qn%{ifeu|At ^hJ*JJO* ʗzj* ܪ˅=0NR:hVoP#+mXHL:'H Z̠7z 8k #< R0 gH"WB0?DHL&:Pa @1X̢.z gxE0hL bH:x ^,#<L"ϸ8Ɛ$'IJc_IKz %(XG*WDЕeJY-+Ierr@/fZP3UIZ6@iЛܬ$-xlՉN;~g )2l>П( },RO:T %*@ƐC8N9* )D9hQ!ԨU*. BOҐ6= Y@4%$UhKzrA@SD)JAu6u*rуpoЍO>ϯ¦og@}hCCW}]$q^e vXHII(tc?Dȁ"$8&X(x*,.؂/82H1/-5H>؃BxAhE6HA8PRT$H. `.Z.\؅^hf!qdlQp1pa~}q## 1q0q0|؇}8P188ӈ/Q&<<aq0ɑ<aO <>ʢ,,> -rW W-\ Ui-?pbQ{a.h/pwAxQc0# S C0i/1HAaQ2*2-Ӊ23S3(11@s:B?㚳ɋAAŨ끌x@pQZ5H6" hC 8!B!mÍ;0"xy+7Q"H#(8XI$菐#%M2% P9%[9 )&dB:kR&pr:rbI'o:|;{' )S(;(`S)ij) )sγ)$=+rۣ+CG >\0F,;*-b-UY-_9?:!BgC N\,"hHvyvA1sdeJg{pp1!1xz82#3X909J!ʋI H+QQi 66^8  !m!Jy"'RJ1pɺ1|ìJ#i8j8x$C$يN89%%%몮 p:&j: : ;~'b(5((( +<)аB)s)))C*<;=-ڱՓ= "+${%˔%²,0K-R?8?7#.C^fu8D XdBCwEwx@WPuLR\;K?[z׵b;PaKhnD unvj;RAxqKrt۷]kTr~;PQLdzEmxzǸDj@ uW xY;_nCkL@vs"M{_ǶI{vy幧KԻ^4V{y[T˹dO AB9eCf5;׺ Ec_ռ]g.\sV%p$eL W1y׹b^{ f۾Vw+yHdًA5hm.VxlByViGV(h\cv |aERd,h~ZYLf'|[-:Q76/rK%leJ\traFlU:]N&` 4hlM}u'v@6i@l.!tnuwzmn?"|qi^g-~^1L~LXf b^chrix{}q}q0jn1!ш묁hᙛ2R!9Hߑ4L3iSs[5a`5^6  y r6׉!r6ɝ "w7x"8#H8鹞CH$ڏ$% %T%%U9]`R:&9:.':#;!;3(( 2<48y<Г*`*ғ0*ܣCYNb7:>Ӕ,,@bL.i/?[6^(j/crh\  3b*1A0X~1N22Ⱦ2*Ӟ1؎/8ցAq(@4PxP25:* z!qn!!7~c##꩞y8cH29C%!?V @. Db ]4tġ qqH# qc20`L42E;C3 @?| 鍥7-uTU%HPqCVNlD\̞E{Ô*VG)⺚ %o(|  !r\BH -7ePBѤQ.ӬY`„#V36>'8~o0G˗:_0@gtg`(ȇzͷaB{)>!(~Q0r'((AD(x V 7p` = q%WDx1FgFd8A%nT"GtrGzG%T!Wn` E wYw$pg+i,$H )`˭)t/ {:2(2ͷ"*7f&` 6hc86sۀ$* 48 晇9.{:{Xf:û.fj6! zo=)ぃrH: NPk)XB-PC 9?pDSDEa[FosG =8AH#D2"I2ƣ2,R.rLL8|36N=PP%TQ Io҇!2t"2O/*TRzu&^bzbםx5_{e( _cbYgVz rKB\q璫 _ҥΫ^L! @`3AV0aE8BЄ OBp/ta aP7 [ 0*DLq q #D ZKdbx$RUxD.n^11dF4f|cFgTC>яd 9HBҐDd"HF6ґd 4 &5INvғe(E9JR6򁒹d$PJVҕe,e9KZ{ *3A]re09LbӘnj$e\6ӗd!49MjVӚ&2oJHJ3g89Nrqf9չNvӝTf%tӞg>)srh@:Pws$hBP3(`?:QVԢ4(K?hHE:R1ܨ3yAԥ/Hу47iNzRUT?jPnTGEjR9y:J*>}FDRvUU X N:U\kZ)V Ud9zZ[zMB{5&V˺+`[̿u,k#V61*Q$6m%fA`@MYGQ:ֱeed9Yֶ,7[R6]$nJ.Z>}׆e$OWM򸝅.>Gr7sA("rDJ].nw?-dqJů8)K_C}H7D#Oؔ$DQ;[V'aj8!Q\Ҟ%ɩϷŘsuH#&|HxÄ IxJj>@2|L-?~ ktQfY&7B_ňsg F13H@l9N[,d1/"$;?B;,?᣾r>R8â8 %$; L(s D ý9bD*C˛8#@DDIl @c!CD4@@d-G\g"$SATT=$=Wl!CD DE:\-\CJ_\{hWC .sKD EFiD&cԪA3DܤoT'gt?r%s$$tGe~,;Gv*y\%G{LB($}0s1v4,?ddKNbLǼGIAHLN|kK%jL<,F|A$t3W@qA7AM7BSF2!>u"92JJL=!I-TLlh#UJ,rL=]?SU%QrUU[mPV-!FV `v` 6`a``VFfNa f`a^af<*` bp"fRZ# "6Ң'$R"*""3r#)#'*V"+Ƣ,53&&'b)b0!):c.v)zr#:7.c=!#c)5!C.c*>#&@c?nJn"NN Q.H8IH٨ ݠYe1x$bIYașA)1ဦfyp)Ɂ08wVy ! {Ɛ}gy^1hp%PhّV!)!)a&I'%)A)&04ќ68i:9AY>ACi@iFI JqjДY0A Wpp0 \i^k(`A 8h 1)mHlŞ  sqW ց9ldMO6e@eI `׎mِԐyڨe\ !\FN$((`X0efYfi@k.f g1rtFguwg gxg  hhiah FA~p6i֒ɉ̉~ii@aBi٩A@IINOHfH (_ 艕Z ]敷 _bXHPh`9N ; Ћ-"K6-.TQ~1Ta@ PטmyȘ`YnbXweiPiu9ngsFs6gvIgyvA v )^oh_ohh9#A((*a/ɒ,.qV7igqד (qGFqH $ &WSaWr`Xiy .  1W 'Xckw5Wn9mɟ;Olp(` ? t {(D1Foa8_@hXt`hQGiHQŗui玘ii' o(@rvgA` v~F&vhf9p {p1f#wo,x3ف~WЁx=Ǔ1qQHY~ N8y. lBp!21a'p0CT R$A$ʓ7>XNݐA w:up׳*(\&eʴS:BU*֩SuHuŵ`;pE !B E[0U+ iT EE (0ƇQ<LR(SMO kQ= ԭCV%$;̖Z͖Ö:P^j-ebXdL8dE~;#$?05Wmp0 Mlr(L 0/ r08ܘ.B':tH;@ɸf${SC=aOzt>3QC{$I1iK($!y C\6k+6G4JX$m>RV$( J{HaJG2q\2IRr9=p 58(Q7`$Cȥ@օd$)I:0 ~=1Q`)/y 3+_5o*X WR '|Z|Iu|@#r}Lg?6p@ PRl2pA- n hpxpAi,9(( 9`4:0l! _B,.Yr2gf@rZ#G,PT(Bhb(!Q C]P!qZf66^AWql[ Զ uK7p!d`$X6Qr%/IDO:d"ɚ 줆ʋH!y`[Le(t T+y 6m 8.rܺDZii8*X/խu]nޭ. wk `u+җ/}/Mxb<3"՘t:RN)R _0 20&.1 P0f`qY&x5f&>1v!;`F> @%+yCV2Hd)U\e+[`*X}D1`aAѬ5Dr3\$9Is<0-J~,47I043C/ю^t :t43l:"WQ#IHnjU.-Ac@k](SmWW7ӭu~7-yӻ7]m7.?8^}7B8#.S88C.򑓼x;n򕳼.9cm\69s9Ѓ.>϶ʓmYn):ԣ.S=4vǝm[U:.v}^nn;܍\KG;^nǽ~;~=?<o<#x<3? =|>?i_y3>Sп^Lzt>۳u?s;iǶW]y;][ 6%`-N Vn͝9ܵ :қ ] e Ơ [ ` z\!Λ _` f[>ՠu8!^[nYaa}!-a5r!}E^a!ḑa &⹹ 52! R"!$$b"Y"(""*  A a,\+n}b--⻝/_/㵱!1^1#00.#3z%3[4Jb5"2*2jq8^#e89j9:q#Σ,~c~b>#??#@@$AA$B&B.$C#u-`,!<[DjF&![E^$@[$K$uJ\+`n0fIJ䶥$%՟NB O$d eQe%`e"d$`S TқY%aV= SeI引eKeP$#ťS%ZZ&L:W\fT~b[b^Zc+d`Rf]aKiffbcn7NEfhO[jje_r$gfV&mFmrmnks՜lNpfq&n\reo:&.~set`Zg]f'mgugx~'繍qZ' 2 {||R'rgv.oB~Bg[Vbrb (w&w.h5(a٧} Es_W $rnvʛf XW]N~g狚[hU(}ۈ hdWd@*萊[U*ffkbZg('~'Vfh'u}iD昂b>酶i~i)ۍN> j:ک⨙:*ꢂ[!k)&)gbv[*ڨisz.Zꩢj*髂*#\jz['j\\*+*vƩ*5*RKM+埾h6ujryR"[`b-j 踆e[{":kNhj',᧲k"hJ,R,+i5++WJ!"@¬zllZmƎFi,r|z+kƦA%-,6my:~b^,->ms+>l^-֊%5n-ܾ~RKL*Ef-޲fk6.n!m."n.:BGVnV.f2.rmlMҦ>_ئ\n^6W o^biv..-../Z. *?o\ЭضooIfo*on.(wkF&+,`n>pFe N>Brf҂pz _vץ op#B0>0+\_C$1p :\'k'6q=1na>:>\B/Ip}q[1ĥ1Q/g #װߞZXG16T hU\!(r6^#;2`(%Ubps"c_';$yNK1 )2+k$( 2-*orrq2y f2i-s'.2mr0c0S.q5*y6;Pv7{o8Ss5#3c93e?0>R |1s^|2:O"ts43@@[s9sZoO%^?+Rvb0 K'Se, -Kfv4b1I[`44FkLS.HbMMO9fpmrN`&{4Ֆ5^&5-uS/Z)<4AC2h]SJs5IDK]Z5X3\1+inZ7Ew_0-qiY5NquKK'eOXuJ5+uWwNi6(j${vdd3u|vT1ij7;4#5O[+V[es)m9]Wmv96'vDtlm)Fr__/0YokpZp4vWAn-G dwt_[~ay7xpW_g{wJ|C'wwZfwZ6gxx}3(jn~7Ru)鄟jZw/7n975Y#vxsxxuG!Bኗqa[C#dx`g5Q9Sj1/;?yb! g8,3?v8gyQ9zW7[xvnso9+d:zfCrc9 Go[++(#fz+zns:c S:g17z뤏99Sw{co#n#k?^`§R]oQH5{cf# S{}c;Yl:ʻC8èb;{r!y%³J_SJ|;oKcz'>߷uq=W~[;G~fx~6G>yƛW+;'S>U~jz>v{[|}嗺ya)~w{?Ϻ\#s~?@@8`A&TaC!F8bE% c?v|1aOyчJ/#  C#(؄PcH)w:hQGѧæFndӉ-f(@BJIU+͞eVBm]fSxw Y~-+Dp~ȵMm{ExqǑ'WysDmױc~\zw??|yѧW3Myr}׿pas hLPlAlI' t 1P 9/@: QI,P@YlQ ]QF>- GohvF"} (#)11|R1IRj )dM^?^_V曏@ AZC & ,B%:?Nj9֮Y@Hinbf쇬oj ׮j{k]ѡ߾ 5Ȯ ;! B| P;޴kAˇ&mfg!:oກp*<躣K{$L^$̑֘w6k;MN A/=Tz{'qW_vjw /iR3Wu`Ǥpe A.5M `?Ll:;]6:}t#::¥vI>yq$CMN Tƅ/  $2g=n7A "P_2kA#MquqAFٹ|e8.ni'ˁҋ@'> 4H !<1"փO&y|e|'IHܣؖ!h c>B&h-qYSETK+Y&/Y<_Ei^9 %ðMmn7Ё49)Ntf4ٹjΓO}@?PI5A >`_B!QҊƔE1QnGAҋnP$5cP T-eKWS3iMqJSz47թOJҎ u=-*J{ԟ~TAQEӨ)hSZՌUYuWjՅ6e5YњVmu[VX$ìs]W}_WX5l[[.V]kbYN'1YngAZ)GiO۵ ri-T~Ʉ4#&e V5o[*Ay-kV˭-mw⶷msq+݁vEj\nm@;jhdf-2.9/docs/hdfview/ModularGuide/attribute_view.gif0000755000175000017500000004517112050301073023654 0ustar sylvestresylvestreGIF89auh $lLl4Ll̔<|\tD\t4t,D<\d4t,lTl8b‰ fў2a'{njw^XI` 2 `Ab XXѸ2 aȊAlϦ7[P %Yeq{d xW`۫dh֚|okfm%\opFoM\t5q 1MDx$7ߡy{{2뇟 € (` "Aw!!f贇z b)آ3(=#ACXD?&飒P6QReXJYZfIf `fr"uiB|Y蠘 hv^gtziJ,/o'7G/WoΗjN/ooӯc HȪhgO"8< O`"x ^Ђ ! '!)APA`. oxCP>!yD=HL&:Y@=0/".r^| MC("fL6ьc`p'7x̣>nhWяL"HP,cGI"!hH"^09(DR~R+qGQR +]yPL+^w<^+gYYvMKf4"$oő|4nzL9Mq&)Gq{(5*PL(B:Ѕ*(AJщZԠͨD7Oz -hEEjѐDI9JҖJgЎ3d;s@Ӊe/סM5 ;4*LU'ԧB1#N=wtV&uGVYi&s0ŮYE+`+밈Mb:Aa a!zMd Ovzl`Sʪlje˶mgGZ gq՚Zk! >:ЅhKZױ)/^.xK^W2j*Iwu]e+W./wc N],oo~7;ִj!_ /8ok[[㮓 ׊ňU0gcmX,x?hEfrZZ/|NuLYߎś^l7ѮvCWWֺxϻYiU*ƩO \*Qߵ/jIy:Z~򗗼+o>COzЛ~K֯>cO{~k>O|y_;Џx/b{?O@$bHJuChM(xRF2U1u.VhSS؅j|PbFWn@VcHvnD$L4DoxĆ<|@?%TKVs?) "hxHnS;WB[ETAbB'TA$A[4cBe\hFf{UIYKAA*%Br vPT8KthJLKt;e۸wDQ踒;Khc[sKSFNX~%CsMVƣSL<<˹+@;K˺[NJ;;3`شwۼГH+VMes؛;<%_Qռ˼{Nxs=[@iTC4VF [klTUKDw@U;Dpw v24KYLnc]Tb罤jk(|ikdoJWeF5p4,ktuu V}'(LfGĢW:(m+go6îYEfd6]`H(t;lt.o-7cgl/|]^?wuO*MqϜ|c(M:~+l N4}t]5 m|=~]؆o};E΄}؎95݃}٘-}xuBlٙ٠tzڦ}7O(>?۰=C۲]۸}ۺmۼ۽۾=ܿ]m}ʝ̍ν=]}]\R=i8yw}^HޫKD+Kؾ]w[]hm]ViP~ >^~ ">$^.;r$#* :2!41:;.?,BN8EN<~A*6JHU^AAnK]^ a2^[_:C^j~k\.]Y>^m~Dr_N[Z>n^~|[R}TNk*<Y~:@98IOXQ8VQ^-:8'^AYQፘ!aᎣÎX0󞵱0Z8֪q%s2 3:3j5c3QJR*j4y5/"+-$p3##;R6e6?r#;M6KRucVIWF &J es8h#''l80p']{B9y(e9◂):)X6`)x7;A8QIqꊳ,"Jreʸ.|~(YXڍ"!Z./Q#p ˺1)11 2܁-?!YaʯB>4Dʒ4ZP!VS""$5<"/*k#`#6GffC$O$l$M2GjyH7#C>BH*!  1â Mp4QG LFĄJ+Md`3 4eƐ$I=q&"ZetJobȱB(V~e a5"Z7}"B azC߰,0L#a>&>axBdOPP#e,:!l IfAԤYVղ0 Y0H#?>Ȋ ō4Q7X^ 7|ɗ=S~DX0??/X@,p\p%\%xa#(#*#6;x#L<1E;E:`g P!1GGz$!$ILIZ !J)IaJH,R.K0T2Ɍ4wP!ޜN9㜳\سO>?A\PBK >` Bh!ᡉ,0 NGH%PUrTP)r&bVw! RJ )x=r⫯@Xe%KzV!n0kZ!u˭.0ƒK]&`1ڝ&72;~Q4 N(`DSTa r{X %f-rc4fVX8ԢS8cۮ^.< <Ϋc>/?/aig % =CQDMD!W\q[Qmw21#Ļ%H)urJ-(Ē1L2d7ˬN8sN>1|P>,QB?Pс="Ja"M5]#J%hOAEi$SMR)Q 'X[5Yk *JF7*a]*_|G(g?˧?*?_>ЀD`@6Ё`%8A VЂėAn|EBz0}|rP az@ e8CІ7auCЇ?b8D"шGDbD&6щObث0RbE.vы_c8F2nq(, sڑy?1A`AE6ґd$%9/j!<ōc(Q!{tc(AIHTaġQ CİoyDCRҗf09L/R1W&Hȱe'IHҔ#6Aqn9\g9gINhR;%19OzӞ´1mLVf?7LRu%,x.ԡhD%:|3d$4QvԣiHE'ӡhJURӘE RԦ7iNeRVԊ4N:TBԤ.թM*SԩFWMj2ժv^WzÆjQպVJ4 J̸b/ Vկ$нr /&Tg: YɦӲ #Yqr-hIYFug;=οֵA I ϲ.syӢahh'.fwٚuo߾ֻgashNWo +<nYX׾osChamEƭo~`㐍`X:01է^8,X+bv9뤥-rY`n,z% h9~g>f%g]b2TkgGWEmZHYѿjJͩ^UG^Lp1b[AH ef?UE󳛽liWѦvmkKvn {ʉr^elȲݨyw]hwo~f‚Û_7x"#~p[9)^'Gyz,F$ :okxuS2Ins˜vC/̉q:g-5/zu9iyW+!ӽdq}E?zҗG}Uzַ}e?{/;,Sicˇ8ݎO>G;otSև|'=|OO|[}أ_} E}7Y/zM˟O'<>>;?{?#@s@?@=B{b?t?þ??k4 ;K[k<\38{ ؾ<,D;B7糀[>C}+"E;?ͫCü : kDWL@9{;C::J@GdԾʻD[t^T4d|D\ck79/ *v;3=FX|[;q,>YdĿE\E4Cu,AGKFr4: GófDZ Pƅ̷S3N <8ȋȌȍȎ DJc;aTAGsAFHEsɔ;9@DGjdj8NDiFɡ R4n<6EVIǃ|t\y ȩćI$J ĨdLK|@|7>JCSHT|oTEx$AlʫˮxJʶ,LK~DKE4ktK͋ƣL$m%933LMNOPQR%S5TEUUVeWuXULI%ɬ"\]%*ES¡/b5c(_mNJM6dug`2ѐ<clm#_=4nq%,Zk W[uU4rt}WvvzW{{|yW|} ~؂X%؃U؄e؁uX}؅؊X؋،؉tM&Tñ5ٓEٔUٕeٖuٜٟٗ٘ٙٚٛٝٞڠڡM٥6u!tm,oԦuڧڨ>o[m;ڬڭZ~IUZCXܻF_;UGrۻ<ήۻ[SVe߃J>TI&O><G&D+0"bSۮz2s32n)a7v-3/7΁>;n-;&?=B6cB>EfdJIIւJdKKNOdPQP6eRRFSVVNWfeX^YvXeZZ[^_e`a`6fbbFcVfNgffh^ivfN'lmnopq&r6sFtVufvvwxyz{{~~]Y[)b9!!5R!!qhf膞hiib蒶6~h bhrP:Rii0iihhi.>Y雦ij1i Fj~ꏎiv8Fk^:hvk- Nfhq i9 kmn p p @Hxp x{{˨}!!0 ! 8` ٮm%ؘ%1mqxP먎؀ٙaa8@ɏqX 9oYp9 8#`i !Y g%a(10IaoH6698ٜ@=C!BC1F1IGyKqMMO PpRy`VXi/ 2'sbS@Mk8ef!h~p@l@xưlz pp }˘!LG>6umvUn09H؀疙nƙљ o"n)1lyqpQ9בwppp w'Y(*!-.Aqq4i7̉>yxx_GYH)֙Jyirx(W)'py,rYqySns (zgk9g lmpƞlwpntͰ{tҶt&MX)   ՘ Qu^n n`晠g|~v1aofmo o!y?oqyw w phw w+~.Gaȁg8iq?xw'@/0HJ1IyۡMߔPy)r+&&210A&*\! !&ɐ"Zr @J#GxXA7,VerCL fҬ& 8YS9BHB=(©P 91@Ã0 >DֳFY Z okx5eA]J4(1P`¨9بF2`dÈGoCSWК`ӎ=mcI pŋpd %GYoE{(^tH#(~сB2 F @!f -d! !8= &Š,b/ 1ҸE; ; %y%|E~$p%R~0]n H)hi&0H e` l 'I P%dB14TDYdQ IdRH1ZII1|T)M4)7ŴEBN!(0PE)eTSB4TkU\a`Pa%UYiuCV]9]k`z XNEbJƂc9]feF46eigv.iVZkZmݖ[oV\p*opD0rAQ73l}00{蝷{B|q0`l` r ѠQaVxn$@b(HŠ=2*"1pc8:Aju;P.<%LSny%\香gqD}7AyП|2P"PE-QpyJ1p0rڀ zC)LRT^+VZWa VVC;m!S^2o} F`Fb2\^{ }˂jSfm6g;mr9i @a { &G=yO^>}@ BYR9C 3$C܌C" "h>\Z45 j:RA#YH[$)ic6*anC%0 nhr d&ӝ$Osr1QjIH.w9Gs:IJ,u)@Sb$`*T/y]nM&(sSB)``ӝw`Np^[N˹ze^ge0J1B(j&4=% p5>D2A֧>4YMD.~W*G8QqU@:1Xu8:f@T= c͇c a4e RZ6Bf9 i(">|銒äTcQkH#E IE"X+gT/"A`憦5Lld7nfS$¸\d:l#9ȜEAR~B*IJTDd6*Wqr(IiS*^a宺]M@xlgm R[4pڼz!2Eƙ; XlL[qf&41.hPsj3w7O9DX?0"iXu04t< ;C# _ RT>OF@&(SƬf!p.LĘ2yz#= ? *$*-IMڒ*6)eQmY"anhָ6 q+! Dc G>&ox2l7Ly\rWr˞2SyHI c @W;uVE[K~ dp 0 `*Z{Ԣ)ISZҍaiL74 ӹhשSTf6M릠ֶNj}S-a{66v (tшQ[}+1p-nI[&ґ{YJ^2EQh4 UW30R`$-n23>F-oxӛ$ %Sɇ\#G.D4P5ss9xЃ.F?:ғ3N:ԣ.SV:ֳs^:د(a?;Ӯn;.}$=_~;/xcN%Z3<<3sjʮ ARճWc/Ӿv>#??#@@$AAdE^Н ;>$DFD>]4!a"+um.&tjaʥ+Fglga.V5dFx!yr*gʧ{jf{r kueggbl~'"f}Fo&p d ft'e*VgblfxJ,g~mҧ:U"6ibx^a6e-dѡ(`('[(^]:(HZb&)蒪]6ޓSe~ud?]zN))nd4v)q:ne"d⟞))*.*6>*F*V^N*n*vꥮCV$^$T_*$**>ƪΪڪ^gbcNujT:Spf}+Ij ^F֝Х;镢 eiޥ *v&kN& (ݺ+e.,Š&{%)権V2& kru.2 +6fvf%j,-v'iW ^͒&+"Җl..Ͳ:˾]m*-2mc]愲][Zlr,zjvl&"mޝm^mQIȦ(jdV_,v-1. N,N)T>vnnA@ᖫŎ@.ޮ?.n>.< fd.EE6oFo禍B/JQl/Zobo~o@V=NynG^. rr/.>/noƪJ/o3'0 R^pn/Ѝ-ob0K p . ? g03p nvpآi"0 Gqް O1Bp0K0J0 k1 ?@N&1.k11.솰121""/2B(!;S26%*&gB2zr%>@s2#n)o*.V$O0 0 1^q'+o.7*o s?1r0۪'(*p r21_18{37rG0G0;0s767s9.25c p8j6w.33sC>B#s7{EwqF?=s4=D.?# 5+tAAK180H71FHsBt?rqNHBOs1C4r$k[R**GuANSThV;tX#XuYs! [\ǵ\5]׵]5^^5__5 vNF3N5a,AZ@`;6>KvA2uS+7pr>sFsKA st@@co6-g32N5hZ?v #g;s)2e6W+[[qgSp>tLH6Bj+7W28nglBvpsq<5`C#{pas?'6rz4oki3Q07Av@'}WoO7is~?vdQw28mk;s/^9xzm9n}3rk7~C@C=vg:zxo5y G7: xZ/8 :_zl:s#O79K't7YwO;G_4xO 9 x;:˷?b+zS6%[yJjKȡ倍)WtfST{&XIR6Uq…VZkRSc^Vz'<4²ѲY$ܴ.יvR[n~n=PsFW!_#\)\s9ϼsApnE]JRVo]emu}/Oo睏饯뗔Spgay_d'_OݏU<9Snѣk@AQX*"l.u)!A NFRж:vABXKWEB*$!e4X95 q2T^/əlxqsE)N!/_8EC.NL^:HsD%Rm" 8,'!#psq2k#eG'd 1Xnq[#^ޣFҎףƽoA$ "ufR`:yc)2Xrle-kIRȓ%iZ41?Ysj1B3MZe.!F)Mmn2c(Mq fYNua%3{vΓ2/(LО?JBAN+ gB!QhZ?%Q򛬱f:7RHQsԢJa bLqS 4O2/ QZ"D:ͼiRӢÔT 3VV9sXњⳄWtWW$MAK 8:W!d*Wv u%jsSY6[DK$Y>v|fAUʮ)ShQUΊu-Tgmq;K%_[o_\.us]zƵnq[LhMWn^WV"yћ^P5_2m}d޷◿^∭_oɽtZ ~5` C &V1]$6/ Cg"XyB'\XRYbx:+1&1ኌSI<2}ehiIleWyJ>~e/gZF0krTlVs|I,gY[g8͂^/H]s!iI7)ΓfLoftAj#%Q-_s$*qakYϚ^ֵqk]׽la6le/.vimiOնmmonq6ѝnuvowl@;jhdf-2.9/docs/hdfview/ModularGuide/property_file.gif0000755000175000017500000004151212050301073023475 0ustar sylvestresylvestreGIF89al,l@H*\ȰÇ#JHŋ3jȱǏ9I'ShRɖ-GdIȘ8sIL'}dP3\)gӧ=]j)BHʵׯ`1MhhѤR<TڴۢLj3Ωko4+_zUO*˸ǐ#KL˘3k;ٷy4 N8BVW{F;ޫ?-հ7 NCĻ+_μǓXtk;Vn1E)'Wgo/:koZj#Y|&{( ~ w؀%=!r-VY($G^( n'Wl G`i"v6jl.Gndo5~x[h6¶c߃]kYtmPi)>*U%W }a*!VU%Pz S2|S@ *!J )hX&hRZРZhNz9Z)fڑ6ک^jh 0裷rD*A:j+ ۬6Pv:R,bPJm+6jHސp[adA/UCעl$KtېTiD y>0{Lfۙ!vL2,cY]B)<$3kTNx % yyn%4vF,ݒS33 bܲ6&h]Z^Q\J=VR}E݌Zqa]P 'iUr}ޱ]%Tx#Jcb#FV4(n߀ d2M+'"7؋1Ŕd'bwX5pí_,5qoecީ13錷/9]!G =?QSjq{ڌF?{J7VLJ aE SfOwq:;7#ax7vp*aӖF0> P{Hr\vτ|a gxYXb7@c#ƬI| WFuF};#((.. Jce?F`4fZL"3U1"Y #"l_b>It9Cr(R2Dbx^/&oS&rt,RnD#qyKe0O2<ܒ_bҙ, xǍ,Mc0:vc\(4J.^HX:鉩e^4`2{"vncZO ,g4'JъZ[Xv/7Y&ssZ^lx0y'O)2ua6aV̲9Mm˨6:NO>!tacK5qh^>&QAL1B1^ƌ&ɻ^&c"JIo◱7etc)xJٺ#76r`*[ʂe^ykG.*DR|rDk$\t]bXγgz]A"9FX6bϙQ%ep2ފna#5D3G*>ک髝3r*z6i7ֳ6fF)đ25Wfa\-j[;mY0ZCwt6nq{glk䎷Mo8:,"n mkkNj4puMU" w'N'R+:84IRFGl7Ɍa+0Y.jlEB'|\Ki7xj7dYS3V?MamV,*ޝ݉:,f%e-4A8;w& :$I"uE@VJY/S9t[956.9֝7W!o/D}Hm#=_ۜq3=xy8An-RR̳+u Ҫn>+I׋oR5ZZ|s"į=ao~ w}moXW&7l{Wxm{|F{veT3tVEM]h'Dkfw euex{g}gRWl6VbUZ]&1GOsU||fHrG[@XZW9egIc;Mу}(so#LE;@:R4w4F#:&]X.Sт[`PT<_'GfWQ7[({a mq%uӇW3۵a~Rf-,ʢ--B-,b*-b-x.X+.),*(Dz,茰,8貌8/8،Ȋ(+،Ψ+؎8XH2xh+H(H(x*X먐HHx.Ȋ)o-~j{5mYpaVy%(&S/U,s,D”B9gBj/"YMH~(A 4))scKxidj瀘hx{+h5%sdDp0}jFriqg&cP7i"kMQʧm!䗋GNO/SU.}uWG&X'\ xkX!\8SIl#\r@Yg/ҷ3 L|F b.Swu4疅iFȹ6 m>ej`G6Wm%H}5T֓#ciqu5'1O X gcci2quȑx$&Tɜqnxw.Ihkuy# Tk|٠ʩ P ߹ɃY" HZfVhyEL?39 zJ'f05uŠ Hr&wl&g^ɡRzQ`x#\v:шWrh\DRgdNZuAu^W"QVoa:wcXvV\^Cm g F]bdyJY~ewx_9w\YVU0$wrTWwS:zVd ]i}@X棺檎zuawJ-6YZsc:6]G釉18Ԧ}ʧ65tdcS7v%u>IErx\}*eZ^BV$[_~P׭I*l!9yEug 5G=JVq"ɄEnveJj˚ss7OiyYBRFחjiiuzٖf?*R[ hEz5y29@hFbk7@VtAtD VUYjz#LJz:x!,l7HwLZ0 (`ǥ{Sip Ƈ,:2{[TT=r+Gy5boFyg06 g? MrQܗ; Ƌ8}^ŒǓۚ>kiuhˁK˼\\Xjq|K}/7ە (O Μz;x) PtՋY[Z`;RIÕ[Iz,hϤ)RK[c3pq9VyVvKKp;<-lvՙq[LЎ!q2=Ӊ#ҚϵIh4 㴽OcftD74HKWהmEo̽[omLI͹k(=ݻ̩jNSʲo(&˷B DDȺchv&"eͿ};ȟ]M;؎-Y/^$v9yˌڴ'*hVMyħ:t)wKCa~pv[Ka6`zhԬՏIjsǔռ&?Ov,W99"Re'_YæLB= =Tcӊ6=bGY= vaaȰm9ߊky-I>桋M-+`w$ MۥvlfPhk` UοOd %4-9JZΓwa/¾`1ut ZM`]rص;hN|b^{X(.Wّ‹"Ҋv>纘+Lj(z^΍}n^"䂋2蘎x.s ,؋N ΋ ->^~ꦎl밸-$뾘~-"~ ފ>>-a22t>,پ.渾(޾Nn3&ȟw C˖IKܒqtx ̭NLۊd Fu;u }i}0׵L[3vsINjHzқ &T\ӕ-}P[̸0oǃͻ;.) -v=D?䏔Snϻi/v鹛ֹ\mG*@@4𠂂 6\1!D)FĘbB/z\q"Ǎ!',!J-)~%F3IZTfʜ4%J͛=ETЇBEdڑg΋RyVZVC_>Uy3(KG:2YXZeumQDg)(Y}RV`… FXbƍ?٪dʕ-_ƜYfΝ=ZhҔD ԫ 6jsg}vn޴Ͷ9m仟 uSz``b!x[now$_ ˾O9.;C*tܫP >M:NTEHt>E@}tPAjkK2V\M*qk .Ou^Bv=hS+WVʵ2E V[n0\k5sXr?\|V$dOF9eWfe_&8-T3ta7uG4/}9[]^a%'~W][jpuYOG~mFXׇ.GYƻZG<ؐV;Y=:M޵dwi'9.#ihUJECWStt Un|MW=Ou5CF'M QgSv鿕gƴ>{{?|dy[qyXgLA]c?sJ>$GWA+`-M ΕMr6JEAEJt@8raIQ t?ʅ?,v}J_8D"шGDb[> HL=}J3+ NTΏp"1W@EPm#ÁGVDOP+ X&O낆uKvVdl^ fa:` {h/j·k}Qn%Kje.uK^җ|[~.9c,vcb4`.m\jꞇ(gT\R) OcK3Kaw9IUS SU;nmLX1KA{[bCpǜj3ψ2*l(˒E#FzLd k8RY(2UfEMXS)@i/Y"TI]UөOjT:UV1먙7F/FGws؝ςXu VOy{B\yM:\fc{OUzg1vs.~gZJ|kM=J~RPɹ="޹}wߏr.׈?K {d<{?<9umJu0Jy7<ʿw#:~#t\9:.y8@@ۛ@ѭ6|j0:k8Aaes*;\"çH2!s2SM2 Au[!wc.j%׺,k%B!!/1$'q?p/gJC#1n2DSH6qz8CeBg 5H%C2- ! s*Ϛ?;߃lCClӹS}R.ͫ:J.fS<|.:CLXYE׻0yEXí-)a9EEF+3苙;)H %;):>7,⛑ʑDET-TSa"!5\ZFgCl\;j̯3@c\G,GDV-2%9\<0]ǃD̈IȆdH E=B4%f bH;:WuȓDɔTɕ/lܒh9qdIR&;c =PuT}K=Vh32E"WCF1 T}]BVDEfFn䣀( JIddH^ LdMQ R^PM6 VpeƘPeZeQFKFSvP]e(Vd8f]ee\NbeiNe qfSdVkF gfm6fpeSgZ.g`cHVh^N]Z]xvwgVyfgelf`v~gXge~agleg}N6hfvag6hf&gx>hfg>.h雎i{&hi f&pgefq饖onjVjoj6SFꑎhj)y&6iiF^hf溦먎fhigNjkF컶e.lvl^lfk츖ld^~~밆>ln鐮lfNhN6fخVlmlٮln̶|vk V>nf^Wlцj6iavvd5rNt=Cc'!&]]CoBT2^8UՄQ"SU;d"]m %F-0/ 'ta~e=`c<Ω>E63z]̥ 7R ?uKa>,,\\g/7J*o蚲z8/f̝R=S*)%a܃6dr Bl"Lq>}q ~$<{B`$~[;'C7+G<"bI4TtU%$WfgEcLu,@摠Cb{bs<_DT׮akm-'};rqvghicbTw #[DU?K'GRREaCvn';a^ ][Zҍ ׌k*N%R ?vرMucXkr_ҒT 7ɿXPT5mEfXTd=+KY5w/>@;e1u:v,wFTTLFFWttcaMSEtmb8s0IR7̵u`EULgKݓbqEz3rftK^lk]4Sn\x)wF?-?7+;g _A$l3y'uť|]?u%VWp_w@Jū8q26bUYyG"c`- ~W w5yȜ!q+?ea`^?H;$&R3r?^/mk[r#H,hP@LȰCJLѡŊ/"DD(7DqaƗ#-v&Μ:wޜ#K@F,i2С?at)PN[H*OLr,:iИWu,HFn]gUhwŪlּzL-QI=cJ#QኅIsabʖSVh"]F:1`+k6]6i_5ѫb5j|8ݖw]6ն8╥NqH?7|téSϬe/{y? 8 YW * : JyZx!j!z!!8"%x")ҁeb0Xak(cE߃@6ՊˆcI#Xd)i`r٥WcxZ*%q!7_\oϭ#}5h1hUtdyfZsbr{7ޓwi_EA%Zs9ecaR7infwIlS~kRMZ*>֖kEjX):[:}Eާ}qe-κ*fO%KlY,N 엡 ƬNƂd*:l;0ꙠdK$l蚛ouQpJB+&e:nw1zꭽN_WuG+t14OB=5J]5Yk5]{5a=~G!HBHI^chi&m x>}e n[7yջ7euއ[yʰUW-찴asRfkĆ%ki2+qB kT  <ꥰ^^s;--2f;i++2NeTr5>ce۴YxLvݑ/449Y\9_缠XenJ඾QpgsڜgfslFeU ( ^6# C6?Ҁvͳ𣥷!Ւ|8AφXC"zz@1`N$VG(ݝZiH~qPn]4GBSF'AyAaOu7wtV'@aP8lhIMg,d0GMr$(C)Q<%*SURID^KMHB%ɼJq[=qZ 69Z*(Q 01L~4-K"|0-9 c#$]"YI8͂ewk&FAJj/tȉI T||TzP8WK5Ur-*PS:)HMUtoź ,0ӌF8QNB!>eD$LęN6-au0\р`/eV5} WR(c {WVRgiRd> Q~L=<&WC4Ҵ'=D=*qfҨaFa*$+8me.Qղ?k-lc+Ҷ-ns;6cbjoۗRxRloukB&'2 9wTS[,*޽.xIr0-*,2ub*:2EϢI` ֘A6Ps4վdSmv93*ɇuXvD}WuXJb~uUqS9SAOd!ުuV!Ecvty*6Y9 EMjc.'^G)t]a\̯x:bK9#9ўR 肺g H#1z?=Pvծ~5c-YӺֶ5skڎq  vf޼saK^:n>v MV.Y!ڋcwmnkOg=1_2O~_Q:o|%eJw!Oq9b8t?>w& 5}'Qoi)} }!Y)9 5Ɣ-e]\ *_~ߤ^6yIxYXֽqYN)`XQUMS\x\q#۝S›)Q Q\%TFTNe-RVF`pM2VV%(\JJ#M]}~Pe_yӼ&VeX&^_ba[e8^ @eEZUFRW2D ff`,nd%fUQUYI4>ZHLu_G8Ef"Yi"Mŝ&8Bdi6~Om5R>\n: XP^='-b'X^z>''a=9!٥a?"VKzjh.ei#bœR%(R͍c(("xW%f' ޢ%&_%)Eh_"e7)&ڧ)bz^_qݨm@[ƅ\f($ ൓pGg.#NJrtڦrR˗R`N91`j#}(>Idr&ؑGp槹UՕf(Z*vhsyf;٤~ٜpWIiS;-hߍTapi2jΡ*++.1`ޚ6ŤV_Z:&'\z"bf !*.~+si(See6žf"u#1mEd*KBub=&-9%k-iju_kzSlZeak$1⯊* *7*En]y)IIޫitƧXb8 ثҖ>6fQ~,aIj*'Ғ&1&vFnro">z' N(2֜j)e^ڟr!fHl)".$9EXQ..*M.^ Q!"[h:vP"@Fbb"a2o[qxe,bfk%#2+&-)<}ʋOrc61YŽ Ui~JDvkr`4~֔D*>SDUe!־Ϣ6&VkCY*ࢭӊ..~md9+ǚR 60~kp&~*b" ! ""bntn'}դ&ac,Y r*5h0o"jڱ1  Cffqo!M ZBTm#+#Hi%K&1,6ΰKɬkg䷆,k3%-Ӥ"j 9ntz.r6$ sx Bz8f0 àv4cǢP m೮0]S23=׳=3>>ss"#$hj51kB*AC;WԐfCC*SrPNGI_pom4KG2-n2n%tXa"Lќ܆^U&QO5UWU_5VgV;یrV^ [nuZPGl@OO3Yn@z!*]{20 b V10r"WvbŲ^Wt H57VcgR/+µtt.` sg9s^ڂv$5Ow\v$Fh)pO< [&.YokOu_7vgvo.Mz @r~Q4s,eC5'«*5(z;.`[m+%sj;ڀϷilK o^jmg0qXpY;~,(k5X6!e-77juVF4'H:*E9gnc 4'#o-e|JWq_x79G_2mf8X]WCjsWX#Bsu/a-u5ifsͭ5 @_99^riy/ZnޖJvf`s)x aO߰f]bs]_eklpҌ7LOJ'84j6hz? /q7gsg@_AxZvncy8jݒhQD-m;B&NC;C~ٙ9H_q?s6 8F-Z6B#TB3zrkh"c4"zrKŗuw<r]kPŇIg"i|״7"rSͯHӣ[it"]~\ۦƷr+= {1τ*37J=w=؇{s^`{n4ԣΫZ9ܻRp5J5qCзDv{zWO3ox-3(Gy\%v{5g0BU/k3뚺=>׮G"|MjӠJG374{0r?[~ ~<˧1_|ycn8Aksz_R8@(P@4h… F|!Ń+bxqDA9dI'QTeK/aQf„ -Թ'D?qz&CA+R)ƥJ#B1/fUWfպkW_;lYgѦUm[oƕ;n]wջ`@;jhdf-2.9/docs/hdfview/ModularGuide/addfileformat.gif0000755000175000017500000002465512050301073023424 0ustar sylvestresylvestreGIF89a]̄|dddddĔ|tttltllĜ|DDDdd||4dddlĜ||ttlľ̜,]@H XȰÇ#JHʼn(hǏ CIɓ(S\ɲ˗0cʜIJ8s*@@'O99TN Z<ɐ) JEpի3nɵׯ`ÊKlףhӪ]{4)֥TʝkQٻx˷_t LX+^̸c:ԦF͕'Ǎz**z* S몶O(H"|J6F+Vkf)(2Hch.8=? oF"Y/ANRBy_j%^9j&0n);l}V!FrL) E7ps yJ9n,dY7t$haH)Ғƣ IHMҖF)J]JӚ 1LnO]tHMZP#S8 ABJժZXͪVծz` XzU5*yM45j@z>dxk[֘ƕvA7j6D7D vUkJRͲ y,4 hG+ςHjWֺlgKͭnw pu M gu:1I Pp2]T'ӥnvB66^sK$MnR(}|Kڷ~_WX1fNy~v'݋ްagx()yx@13\NaD@ldzcFbC xz3t発ˌ"2U..\2ڵt]񢗚$'Y_TW%g]`sT0>+j"&hIOu:4$ d[T#-dڔRT5tB%XѪ:U^+^g@ Jv" cE3ϊRʘuTfvh^W׼6kJОegKS h ONE/P;$2JWQ&T3ũM{ޢlv3W 9UX3W*(ȰE,z'N[_Q[_{ 9c(OW0gN8wy~ELY[\+l#HC=;t@xy@0+2< x+B.zbNԕqc\!ݳD@<LOg\6|`\ ;(?5f]lhŘޏ &`91jϽ?L܏B;1 ;'3D$:qL+z&?QQMo}þ׽{c_v#}C[#_@pЀ#u_|9i…!K;}'z5zԱ}մPduE:|WGXRecwTY\c㗂5TsPdgz?zMM|MV|×~dهG.GFԄTOYu*łRx[DdX؅QąS~XJ.Je$PfsW"$Usx`EbByCaXxN^XtXPGGduM7GՈׄX5؉OHB;AxQ7Gud(˕ U]Q؊KX=Ldu qWݵxX;ŨKe>1˵ d7јKH e8RF Oʨ{x5KxHȋ|^xKIGA]jX_ Y u]D]@i&5ڕD ?Q|y8:QT9B<6F)*HcGhuHMLzH؄fN#IZJ"5zSUdj|@ɗi2Yy9-)~yh)Y+&|bԀ|xy 9eiI'7YAAvAO՛9q 9ٜBƜ9)ާ9;}8a|Ief]ea6fbfvflf/p/"muVmggy&g1&hSs16(Ҡn2$3oFov/o6j&pjpfp+'ZRkбhx0H{]Lkf5R."e6@$Bp%іbҟmz& 1Fhnnnji&ij&+3jg+G+rE,O2#k"ffdƞB#&$lHZJ$MJm]ŸI& U nz\'Vn֪2*2"mZofoo:6S8sp34 Z pDFkO$q^:q5qݚ9ljvH/Z%*mjmV%Q*~hmW0'ƪ1a1ꠓ:)֦ko233#3jjj+2z|rz4:""$;&[({*,.۲02a:{lfFfoMꤞ*0H%VL;h0Z_: +62i+rot*phj pKtAm o[z+s[5_5Ggy39)}6qkw CgwtP8/ͼ6e3-|lV {nHdYPƝ'd4H+}U'LL،=uԗ(M쎁Q!s}Qq{Nȱ's7bmci ҼR J@GEEK<-Ĭ8!f{>~ 2fKż݊).~^wˑ x tȘ 桋ә`uu";&lM+. F 6u<>DserIJP^LET.5~DF@85sY[@].5_;>ace@g$iΈq9̉ W7WQ篍ڒ̍a>$Y4r_nQr |”.Z>Z.reկݒq뺾>^[ƓȎnΓH2;9X~)902im7A;U*]'^ɩ.09-t] IԟH_=)񍹐 I9!GeT $o02?9~66>dˢ@=OdE]=D4?ɕmiq?M?_,HoɕL\uԂTf pX!uoYKOYo嗟%,O_=9iV=O__tyL_7?b|49ryڝc߼ͿŝoN@ F. ^}ԝx3ݿRC鿋d"^OF6A@ DP! Z<QD-^ĘQF=~RH%MDJ-]SL5mę>0UjԞ?)eUV]~KqXe'аmݾWҳu3ޟX`ae"@19|31y^堗fΝ=ZhҥMFZj֭][鞠knq8ō{'F \80|ow+&\ϗSݽH=x ̟G< 'x$ǟD:p?<0A' A'P .p 7B<?`OdM\E[lFbqFi1vGOHyR"82,I'%rI|2.2La2PTD4AW+|AY+PC o0IDO,}Xck1idv! Y#=I%6[' nLqr-\]|"exڎ:u*s|O}wG5v%tRLcHL94TT U[}ukV[kյe_E X]YuveMR&E(Ԓ[0$71.WNtTw1N3/͆L($ӺָTS @KvQf ]nW`evmƹrwY<h=:im2jͲqDu6Tݭ{uѳZJ@~n1Λo9.T|#Ld_qy5qCc|+wq<vЉh&G/]&)A[]\'&8ivm6݁`^ X“$alD(5$b^*FQzPU!p _řWf&9/g7S9}NtF@kYt|:%u ݹXu 1k`Ɲotc8G9֑wcDžiƏ^<0UJy2Oy6z+8ld Ô).W=!ϔNJ_*1dz1C7%Y1Hֶ .~їbrւ@^Sa€$7 jVӚTc#K-zu[O~9\( K(%(8z a  \[֯bK9(؞+,S508gV A+6. ,[ Ss3  C^dΗs<`BSu/#gQ-r͌XpK+ p/ "vK`?Pc|bzWo]e,z`Q׌)=G]iڷ@P@A bb3^6-3@_$ϙֳtUL-m )p:-߬~Dvm\P@H qxW`/x].a,\=usĦ0_ɨ\%#XxN|^n4bzUyQ"[ -uQV5}hH7:<}zϱ!] ( N @zu׻.vel_Y/FkӚƓF;YԾv&/-%P 4zW#=i8*3>{׆4c,->e<t\`NNd,wJO=jVO];uXƒW/B#CDC5>×/A@JT45>d0$$<;??<C D?)?(!l>45PVL]D ^6MA#3^1ܫSDŏ0 C$6flƎPEjm,kDpǷosDn,ǤttuĈv,ۺ?L\7_& :ʈƙGyg.{=QCK5[C#E$;E~ W:4X,IHXHz,H>=IC,E\FID| 1A$EQiTGL@pD3 ~|%Y ĠTIK8:$N5%Ȱ̽T˧I|ǻlˇI˝˽˿$L LTL;Lńj˪aE6,D+AG\sÞ䍬͜ɂ Ce˜A lLLLPDZ:V$ٴNNȺMHCA@,=M#OȷSJlIMMb,PdL;ưD%,ʳP\GT 0,FeAO`3 ށ\@]G".!- 5%4$F"e(,'F(+,*mF%.--EE+1,0=D1%4+3%C.U7=,6A4:E+9@:= <@7@u+?}@=C= BE@CtdM9PlM,ųD\J |Z _r˫ ߃e14W/#K}#][kTE[eɃXQTU-4 E@F הV=OV<'\4V%K5Ldʸ6VkE/CV#U`VOjEOG %P͓E{P.ތŗѡTyQr\WT B`tQ5ZDALќ4m M_ܺMMdQJˆuXD;HGWT]LeſvEԞ U١=<%ڤ ];UڧN-CS mH%`W~פK9}:24W\P HKVm=!WF1K\lI$w4۔C[|I{W[E|Iݼ ɼL+ۉZVk[bD9ܲEר4݃]ݷPڞڑ`UZ˥ܝؕ]MT^D]cU^8K#U^;^KUE07^Mՠ=ңUeuT]b63 :`_(`d&@_{ `0j &a5`(va:|aL`jaˆHYaav %"#af) 'V`!Fb-v &0~/2/L3V+,^"ʺi;<=>c@Accj&`b).[(NqGEf^Kf:m<俚̫NV+LNbR^+MOD@S,XV UV+Nd4vQvWuh*bK Z@VPF;]v %[Y^G\zeT.fI~Gg[Ztf[NMak@c^IGe^fdZf`۲, "sbfapޫ{@tV&7}n+vf 6+NG>6uGL߉#~fsF+@& dF;iBcSe&Vi@&7~0vi Yli5cݝ9Wi \^#BVfv꧆j 1ۉꮾ!&6FVfv;jhdf-2.9/docs/hdfview/ModularGuide/default_modules.gif0000755000175000017500000003624712050301073023777 0ustar sylvestresylvestreGIF89a4 $lLl؃o~Е&A h&2  `ajXhA#RE၊"24 2 ;У  d(ФM e(P% D8hЄ]~)f I5D  (Bw@ |-h Z%(6|1饒f X 7|z 0Az 0!LPHjk v;, CDЁ6lNK?P{B'd{B pB; . ,`@` ⋯<&,p &8 s4\  $2"0'`rI0A . 3Ls мNl9Kl`H L7$ Xgu .jx!"H"jx'b3xfm{ێCkAˮ¾ /#,_# 00*  (E  ,Aqlcɒp) Z6,f.͜0,=φֳhI# v4H<@X)`kPZ6 `aІv"lSN"t{QhMo|SAd H!('IKҕ ,y)L^ȴ45Miz8NvI>IQSԣըD-jvT>L}R]D*VT"+YRz7W2,fZjVuk]k[z5[߸uxO^:絯vk_Y,adX!fAA,&.FucM f,&0C 8ܙ6C͇?Wt45ֺv ,:BW$ۆ<6hm$"f"m9[#oãg8IITT%B2 4HIt_,IIiPԠe&%V~jw,PZ`ńXJW+&ʘ[ V ,fY^Βﳠ5gMr~_@+AX'ůP mHU3A?AnLc! zPСIhtcØaf9nHCuԣ! ҖF5D.F["S4k] M(C[Ј+ƜQnE"7oE-T' Ic*)HCF,S &HÞkY3iVyғ\+JC-*Q8h)LRz~*2mUǼSzbk\%S{; 2 ΖOZgls}&~Kd Ox^X< l` 3€ Cֱd+|C_PVe SÝU@+5-|&jzʃT !aBd~ 1DOFny;棤HL$9Nr[)mFfsSzK&$ZDQp++ecL.^kxR^ao$MY,>uZdZ7ff|?|fT[R@'/@+Oz}51Es1Gss st+s-e3WQ;34iI3D6P^!uUuDE uh #RPqv/ "jvj"v2!/@` zGGalO%S%HcH9Uxo&VsBIDbwV(;)(J(26;3)vE)9&zWq5q.?fq|R@NU@/Frg4A&@ss!\\%1=h?t.i]EQ9AtFiK4Ku!S7Ds Rdy^^'PAbs!!v =%0"7v H$FwߘlP2lS9fmH)I F:x"'hVfn鄸yt%c7֚#]K y9PŲEyPJB,4LE3^Aѕ ,j vb_[EewS!(rq7iwl7076#F$GۢLTIYBUokU\9&bۦmwBGy:S-c*;Sc®򤠂{B<+J{pŲeG>jZװrqwZdNOO Dgkyg7sA'kYP~YŒJ7t7Q=$ d\DAQ5 "l "_0E!FvdE v8Fd"ftFm"7B7;#Dc˂l)%L&m\H&&ؙyr&JJ(cP(bI |':"ݦ\J>=;y)ܭWS*Ը&<̓X{uYYB -= w[̓[r]0S r 31171PEP\ 2(B[D=a7X>JAFDkF~HM6[lP嵝$eVXW%\nHeebdjy;D:c,npx]F*$肮KX^Tc85Y.Y+陎5ł,pt!Iw<. ' >뱮N@S}`Î0 sȞ~ 1RԞ*Pخ22ܾ;sQH4+QFR %D1~q!܁^~ _oJ"?$_&(*,.02?4_68:QD^ĘQF=~RH%MDRJ {<8B=^zT|;}3(ϟ= -s(äB4*T9yUV]~VX_[EVZmݾUk35?炇 }W} lĊ  -_ƜYfΝ=hҥMFd|siŴgmuvW8zArʙ?]reֽomƄo\ƻ.o{ԟ;w_|_l# 00/y87L 2J ɿ4=D M VdEٲ.4OBT<;/}.=;qDHPC&G4QĎ ET|1K-2#-#003?4m˱33t@;ӼĈI|@E PPAePFR#,RK;P/"|4AK=6AeR] T?J\ŕCEk5P`I/E6YeߺOchLD5OPW-MkS]ZR6\ cMZ^wmE@m@E7vwu ]6_}-)2]5 Y5`aoߔ0Y2X_3NwX*w^N7eW^KgDTpk~3m۹Ոι1>hv=2גub7Be_|1@gVbvݤM<UIxc^][Rfg"!Dn-[۞VٱrOR{%'o%ϦE~&tt~c;ubG׽wMs0 Ž72yW~M׾xzB=ftؽ{ÿ=ީ>}IY홇?~,?l}?IG?ЀJ@6p#sE2A VЂ$K0AvЃaE8BЃ lH)/a !.HuCЇ?b8D"шGDb"* FTъWbE.vъ"8F2ьgDcոF6эoc8G:юwtAؚ o!8ԋ 9HB&˅XO5'ґd}ICZ8ld$5INfPTu%E*vҔDY>yp܈ObY2%ĥVEk9̒C1&1sLfm-.@69NrVj ̅Ɏ$S'ONe^3L5iLyƳh|>J7Po=χ:4DQfdB{4&>+{޳e:SԦ7iNuSԧɓY2H7 ϋ2u }*SaϦvԪWe R}5Ppld^4TYiCݙԗbխo]V?ZТ!Z=SQլ|+_ W#r :Nt<'͆Bva5Y C4a)Ζִ,  x=mlek1-lg[ު\W}׸g-/υnIRXQ2bnv䶌 )i;v7Hx6Ľ{_׾}_׿`F`/ %a +AroZNqE'mA~}w<}Ꜫfǻ)I6")o'6?$ @dt@l@|@ @ @ @ܦϛ$Adt2Zr"*A4%ԥw{>=&$)B95x/t&'33A04é.,3dÔB2T6CeIT#9KAB87,H$+ ,Š<6(e>Z,gJZER+"ˤJk|tKpI,Cz˺.+,J˻l|Ĭ#TKńLʋTȴʄ $4DTdtּ$J*ڴ1:Ay#4DT#?^"9ֻ̺l;.=h:hN>|N ϴ 4LL;KL㻍C{kE3Đ%4OND m=$Ӷ5 X;DASKTU}#:ҴSSTOR鼺ZT;=98-VSM-:CMdOS;]- QǫαWRû5(Û5D)VuQw9j eKVy=F_W|D!}l UD}}IOCz-cEu/)Xp/=>ِّ%ْ@}}%`ztٗ٘ٙM1z%ČøO Ħ tE@TڤelZuڨک]ZZ}ګڬZکɀÁ-9RT۵e۶u۷] 2ٺŎMQm-۽T_}%[Y[f,\ýهM\{LLj\oXUܔMX"[\J#[B<\K]F\B=N]H[}]I,][]?L]+ڝeXݵ]R,,k݅]յ^,l('m}ǥunB^$&Rzƕ \]TJ+tGҨ5_̚je#埽.N޴ P SP׏? V~O|PZVWP# d/6KnuK-QK9`ѽ5weWufn5{EkՇ#E$%%nMyxgqf{-S@YB ;V=DMEmzyvnտsR6=tVP,F3%+叆SЄ6N:Ra}T|[;\kgc#gֱը>Lge:j論iDVmѐԬ;kKq>)7mhm khE>WPkl΄V0Z9wg]"l{݂ta]WOMm;vfghij/C^opwm2FtWugwdY>AyǪȮdYbM~o3Φmœm] DSB+ ^. }ՍeЙVq}'U= k/|PkGw\gj;RneQ7Ulkstd RWuIUҟj;:gDUGE騧fuVhN`j&iffx֧ҀuzQEp"fSGjzTGFTLUR74M=RO_UWRUVEըVU~NX[S^~hnh\ Ϲ6x7kaԦj3Vӷ^zCiM7wNWg5mwuyuԵ+dm_|?eg(П:7xz*l_~lgw=mhz,x3>x1=za` APČicE9rcɔ WdiRe˘/]œ)&N:o3'Ϡ?{*(RJ.54)ӨOB**H|'_C =^,H@jײm-ܸrP[w.޼z/.l0ĊNhl̚7s3ТG.m4ԪWn5͏&vlYǐ7‡/n8rϳ2thҧSn:K/ !n)nn<׳}rd/Goo>mdUEx *l HsAW Zx!&_xi8"%xbfB(߀"18c~*H#=cq*ny$I*9߉c;.9%U9ۃCJ]z%6~"y`y& Yٖ!&qʩ]chI0͹'^a(>:Zd}:b!G6'M5:Х)j!i(f]ꡉĨʚ觟(맧 ;,~uNJ'5̾ڬz(ʨzyHm ,r+ޚ묢{///rW7>IJlr*;L+^K-7;-{|\y&ZZ-\m2ʲ̲|o!w坝EnUʾ mqи,Lo8;j:C%tG tH 5e&5mޝiVf=7qh3W5]to.g* 8≟H"YۊK>9uv׶6$_D9=pdݶɞ~kO$>o:챛BzG?#3C?Scsc_޳>>?????(<  H>YpDx#( R 3 r C(&DuJLy"HeM`SB TQ.)EMr *XeџT^e(W P^UJ͘Щ5 kUwӏӮtMzջԛ{g_W#KM´)bKr(hǪӝ,Rk3ƩZ.Vt]i$cn c#=&n=j؃rShD.tjs.v6nv 'p.}/|+ҷnAm]Ną/,>0f-SZH% Pf#at* UB| 1K,~cbX'kWȈ"..qbF>2% ),RIpX2!fs2o1iW&3`GZi~sLFvNw<;Gfpͣ*΂>tּ"(ю>Q 'GSBr~** ]M/a0CiE_x>"}fQa*3 ^YCǩ~\ E%eѺ+(m1{S͎ɥlIף2/}NZ$b zիbކY-VscѪJBsoaZV4v՛enwOyZUn[ њW֘,S8VUp3#vpٛbJڮ53™n4ւsq|1cǝWk>nwgdmlNG[f =g?%Mӝ5iՠs?;'/WeRE[u_v;esN#rnxfX@'+{ݾjD=3_Jʿ_jVRW5g@T%IbcEdSeu'9QgC5iY0qVU!X OES^qT _Y SVYaaEє`E֟ G@eDT]1TZ"OSYY^% 2eAa֓V!plbޟQ=a4!i!QšR%Dva5TaV& ?J f}U zTb$J( W.fU!aN.2-acEQa+VG>*V:}] jUi( >R!"4$&#r v9]%%#"pX:!<];J=b:>"`?2^3d$d,(dC2CF$DNCVDZ$E^Ff$GbGnGv$HHdH$II$KK$LdLL$M<\A$PP%Q!iS6S>%TFTٚb ޽_i% @^DƕY%ZZe^ĢWX&ȲeuR]i^_A|Qkt`%%>ELdN&eVe^&fR),U!Dʡap%jj&kkhg,flݦh^nҦWff&q_Jq6q.gqrs2oF%mRg5'wvDw~ '„jk6ix=dAevcv0}G~"z@bq}qg]F*%}'N'v1t(xNugvItৃnUn*hmNNGӈFhnFeƅr$F9vHNS'hƋz& 2!(( SF2&y`jeƏҊJYZ4Ƒr%!g9)t)(.hR"arQB)bjF([!2(>i^(' #&j0vחRNV F0fjnƞv"מ薆F*ꢖrQh#hTWFk*"kqz( +oI+l@zXkoAg}:+q`kzhQlkk+z+pO傾jzk"lUedf'vVg8- Ᵹ,5l1,FNl}iƶ[>B,ɂɎɊʖ,ʶʦ,˾,¬ʬ,,- -6&->F-BNՎlrgǞGT؎-ٖٞ-ڦڮ-۶۾-ƭ-֭---:Į ..&..6>.FN.V^.f=n.vnZ膮.閮.ꦮ.붮.Ʈ.֮..;jhdf-2.9/docs/hdfview/ModularGuide/hdfview.gif0000755000175000017500000026355412050301073022262 0ustar sylvestresylvestreGIF89a}4DDČKRl"YNң+҅ N"PgM LEE/LTIDɿO~4׿xH`i <`2 Vh\ѡ &a#H&b2'Ȣ.0#K? ,YD)RA;Z35< DYJ-%ht٥Kh5hI&ʐyf(Ki&jÙwyKI UVVVQYR}X^-Wb9uVZP(oU^wuק~ŗ^6ajaVYje6`ekm&lllɶZ&۳G\s61p5\5VWvmt޺}^w^w^|g}0 < X` 3FS|%آ(n" ۘ6|#9$/DE Ā7JhN:;R&ހID-+F'L7PG-T4X4A+ʯļB_6/6H}6ppCs{m@bm@[7k˝7j wՈ'7%,hsr?t桗Pב.C C d nC9{ '{/{9 u9+_|9g/Ѫ@/@?>D͕K/c`5A_W Qu 6a4,EؿLe>?ĀC!LB+l ap6a wC: qFLbD&Jl(RqVbx wA_ڨ2" hLӈuk# bBp4(" %pI=d6rD"XY̤&7Y4 Ӟ(GIDVbȫ,;VbΕå.o\r &0b Ә<2Ld:sl&4)jFĦ5mzSf8)r$JxΞ:~ @JЂMBІKm uC:dC'RuB)IGzOԝ!EK9yt5uNwӞ@ PJԆB4<!ETJժZXͪVJ:v! FΨ#L,תֶn+\*׺v+^׾~ ,`+M,b2VlfEfNNxJҎ;-RV5jQTV{-lu{܎ҷmQvhS;\:w}^h@=ц[& r\v=y ^ݭ{˫wmrK\.ztPh"Ɂ4j05\ SS0)L TZ,(u]d n0s 8 :`3C¬olqÁk_Ц m4ޢf95@2Km !d0 Qae. zY\ILRLT,o"H)h Ђ` P Z @c1k_\2Uvw!]"9wKv-c?zj 5z"ylrlV3+Ɋ ilG&5dۃ_68lizќ÷¿mZtD˝n?(chZ~g1f5͛/Oj>s/ɣ͎ YBҧvuѧɦ;6 yquܝ+L&p-aӴvJ9a7Ǻ#! B$pH=@a8bP8 D$BA=/x;  2 %,a B+鱤q?u~~c/buYy!H?֣j) \yEL`^ Gy|kU>9 _YlQCNayׁN883d֢ߐ49:J` (Dp Np (B-3${s9FGjȁく66> tsAt~@m66||Wx_0Wx'qtDNJG4Xu-ۀr&'ONYH qVX b(0fxhj'Ogs8'uaƧ){vzt#Qz{eTW:3sF#Fq>IB$nZ%\uUH&WO[`dxe08xmOowqZ|0@60`|P@ЋZ6XPΘQ 0 p6P( `XX@p| wpӠ5V`+ް(  Hp6 pyQ`w |ph;S@ ))hpȈx<َ9x~SdxoΖ6G6CJu et4~ud\ɕ^&`f$ԀlNnIiyrٖteٕzYo9d;Y}]W9vOjPQ8X` h00 ހ 8h 0P 㰋܀3 - 0|00 p Џ9h+4?`VO;Ř# )Y0p0)09+pSPX `b 6@ ?Gp: H3)ؐ ڡС& D= V k)23Zayct9jYz9jBڣ;Cf >Iz<&~?u03Ib0E\JSb:a)U./O6P)wjxH9+0` iX0')yS S@|p {ڑ*b=*  ]P?` w@0p Vd'0 /Sp `|P b`bP Z P ? z00  ` @ʮʮ D`d JdZ*dSDǢ 4jsٰ  +NjQzK&S #'bQu)e *,kvvr({dÇwP zJOyY s*N댢Pؒ8`kw`Ѝ) (H:kتb g  J&Y` `c⨴Y{yPÏP0 Z  ㈮zi*c˺:պ)gxCevVzA9,:;G#śkȻۼ˼ԛ[ػ۽˽իjU*OOxO닳W;z9 ,`Kp '+  P XPx 9|`Eۋ;?Р/pˉ` ؎0 pQpF )-0HXX[0 ֈ#˦ɹ\h?9ƕ[cj\:WeS9eF|cwgDZPN ~f pTԾjȠ qafv76bu O c    b MКɌYYy2i9zE˧lb >0gpԐ>jKx p Xpˈh9ɳ'SG2+ +  p } Xo]o ChEy۔s[|?4m@:zva9AFe9mrK2Nbm8 8z&MB ԸG? T%$&k\O OЉj74[nWw0{ga\P;٬Jʺ wݡjP Md)U 'Pj̸)\LLwp:6ǹĠQʏ  j*psQ(ҙf+iB&;+jj Y` Ppͮis0s M=}s pwK/S u@WYP*bjp8|M شb3bcд̹]oʶ .)șΈV涙یǫ̑͂+?S0M>0cuS0V`S0 i tjVTuҠg060ǃoq>o,u7?>^~茎kn3lYߔUKBB߀$K\u2v-s.Wvw/;w'u_YF$F52e6Oq u`P寀N㴍E۴](I` G K :NV0 Ql +p<|ͼg , Om@ Zs|1kÏD޿_EN!161H~No.Ne@J5jl b /x1$Z1=jQH%MDRJj_|Y.mxN[^܉m 6ĈɀKyUVx'7%֭ް8|ssʉbe~P{b8,V7/ -#㣉qTǭ Ċr2ƒq7͕+w44ңb̘&A<{Pa:ψ-N5g|֭8dV|,wlLy t Q8n/۹o^v۩DtӯGc)r?b'IۺP9PD5TC 1%D&L'()*?@$A4BDCTDdEtFGC5TੇxкD!r0#i@[9EEK;t[Eً1"E\]^_`a$b4cDdTedf\El:>N@IFI0n4 Z?$lP( P8ܻ(B;܋5J{ț{S}G(zzǀ(ȀVxDH5G+wȂHkB$~@BC\DLC{^JBIS+ɚɛɞʙ J`J$ʞ,]ʝʥJJ|nūLʦJʟ,F Ih$aKE˳,<>Fzjdį˽'A}!%S L %QFQstluqvG3"Yx@@H}E9eɔPP P U!ipAk;K|(Tܑ̿LrM !̈́ՓWtXЗ}&#.S/0%SЌˆLQOL;<= Pؼ?@A%B5CEDUEeFuGHI|S8=q@s@@ riє0O=BL$AZZAa _4._EbUډM2!8sȈ- mm֏pVqq=WrVsEWsVvutUWymWy}Wzr}}W}WuVlKePѺFS+ = H- l֍X-W}A=%ْgh=j]rw{]יqY{ut٘YYZ֢סVMW0؊Lu>DecVڮzAY#US"p)5۴E۵U۶e۷u۸۹3EBۼ۽۾ܿ%5EUe\x*M]ت Ԥ\US;VlQ\4\lQo4ݖ"QXؕݤ [8R꘼]]ݑ$0^4-^u^^^^ 5#RMN|$\A \ϵNo] Sߌ5ڍ֑|l`=` =-4ݨaY}o`_r_ń]Fۛa2ө+ ^b035#b/. +c]hRSX@c[-cLb=d]uc+`9^ Mu.]@:ClU}bTX*F +` X"0P*:/4ZP6e:>cV~A3A.C4EeB)[FV4H/)e9@cVfPNe#W#fu Qm3pv;'N_T_̈;sX RQ{0O`gGlcYgQIe6nUsƅ#.L#lNc\mv=;r^SivXph.`~L^VYUfuc4X5iNјiaMU̚Igvh.jeDAA%Z_.`/8=,k-jSjr1&X&4Dn}h_)1fvVQ~bžӲccfꪾClɮ!?TdO MdæS&YVkZmh>fdξD멭\Ԧ]n>aVnTkf lkO쌶mEiCgGF*V>k^@Q6/~[>om اm8(i6q;oc>nnvjN* 7-F_VFpG[4W*=x?qA- G6a`_K #oxT :GG^* yۍFgvб=Dhq>33E'>'؀6Zs3<#s=>?s@A@7t-G(7 q+IChIt߱~ގLPQ'u@UgVwWXYI9]leXubVa?`flȶ_Wfu^l7qbvdbvfffVm&lVivcvmzwvwިvi-vshvf϶a7beWvyO{ m_z__okpw_wxxex?]Ow~'m_wovwߍov_bwv{yxxorGxaWj֜wwgzGzbsz{OwvVzx/wjn7y_c/yewy7 z-{?x[Ke`_gqp0Al|uhGyu0@~|~?zy>'|~ ܷߍ|jo^}~wx ᷋η֟}w}'|}Gpza/xv{|?{qmzj~1ZAj nQvaC 4P #T0NJJxpHRaI-M8݁'^ָ0P2 `\DسjIJf^9tǶ4;;*l^os k[u3BxngԽW%ʙCjo;_'ZjQi-M2gJ ?^q"_pf\|euIaO^gweUL,DR^Q;e(5!wk"\qǒIMp5 JzeM=4ׂ}5TX00+)BcL7%P5V8DZZ%5^jZf)& ɟCiƙ6'|f`,&c &=}F&OlhbZ}mYgkĩQsE(Y'Gy*i`pꥫk2Jg`I9-#si%M]wxi[f*~Gjrm'naD·QOIsLk|GًoebmߋK@V\HxBGnpD5B$+d~⥣>;e3䝛^ٯơ<.՞'aѲ =OQw_~??(1<,p| #( R`/қR:%M&3Hf1,L! Qv/1IЄ)<E$w8D)}c_j)RV"-r^b!P0~{#(G81v#=~ctoL2aqHk$a$HR2Dd%IJ:d"#dA)K$,_)M.ҕ)kSҖ+-KP.e(TR%3ue $69HӚt&8Wjzқ&:InRf1v"S&#KrB<'6i~2_M2TgC΀st;Ȍe8@4$ IK*ҕtuiK_*әҔZMq9NoTuЂQԢp*RԧJUE**Z>u^W֭«fͪXֵ͚EXV5v}+^W4+^WaKŚ uAXFlc% lg7Yv6 h=kԲvh- ^m5^6m5x[!5nq\6un< Lu{bwn5/z4{ {aկ~X>0 .8 np`/+ k8ΰ+,&>1SJ xB6d$״)Qo*eԨTjRuU&S*ꂫ\-3* V5hUgxk]\XE3?կkc=E7E4h'Hv,g+KZrڴNmhW ʶԸge;[ջm5qy7E.r. .ua{/}^2{%o|_Ծ6k`m86a K.7lns&Oo2J:"#<`4'B22~A:xT'Pz҈;$=iFR:)Nӟ^Tișj1SQê\Yͼf=3*;UF+W;'~:DcZ,h?Т6i>걏Zզ-[v};ܛ+w;b_ xd'نOڎ<Rڞ<~?mk~ܞGݝ vMxϛޮ=W'H6\aJ1מ3>{D-S K:Da Y$ Oa+ُa =.D@ۏ?7 "P2 "& . *`6>^ bf nV j`v~ ` n b @ L #%!`!&!&a.!.a6javz!D!a!!a!!! "!!&b!.""2"6"$>$"%"m ̿=vP%FC>(Fa014O5O @1xÒ""/RF"0 I11#2&2+f }"YOQP5V#6b!7~c8#hOc ClB#8)cT:X 8rp@=c q?z@c8d+.C>$DFDN$Ր@#b4($G#G6" C <4_(RC?MGFM "EO$Pe %Q6 9SF%TNTV%U^Uf%VnVv%W~W%XX%YY%ZZ%[[%\Υ\%]ޥ]%^^%__Z Le9a&b&faB%b`dOae^&fffn&gvg~&hh&ii&jj&kk&lf5Id@#*alM_b /J@ s:rPsI(gu2's>Pp't6 ugt"gvjulz'{{'|Ƨ|'i$_< u0Qe'((&fCQ$x7 ^hlb & TNV.6)>F)NVT(~<;x=S$C@#z'0Vur&jfƩ,he*a)nO)&u9٤dM)iYуNebdV*.I՟5~i9|~R9 䙎v盖'y"'j6gr*&h"E*C)h؂-h=܃ | P _p}eиP'+ Rj FZN.`.bI@v +,I ikjrl%_M뺖,o g߼~lǢG̮lbp' ,U&l.+ |dTb1`Ӗ",ÖjBPPje2 Tm-mn-.@v @P4eB,+@H,5H߶+tun8y筲gԲԺmNQ_bOpap#\4|P6 "A DBC(LR_M׾rq/5#Qnþ-bLRfPfnپm"x.Pݚbnwdu*y2n/of&+"o֫p__$abp#(X$=p'DC3%+@0'dL^ @x j̊*IONok 00a$ $/9B/ MW=A* Df111ZN,j* (1b|A|A#A r@Bȃ<4L2$lnb&sv ojjO-٦2*#+q|A|A+ O1+_+V \:-/10eB1Xs 65s6{38q.i:6e:;c3<3Ƴ3:h<:;b?:ϳbB#&@> 4DXs`tFFw4G4F+B߳aS9 JfKKJ'&R55C5~>_*_o}ؒq\S'?.<ܶ9c?\+.| 6v*^304TJlv ~f#v ]Ow6@؀b\Q$&[ 3(`9ˊF17n )17oQRDq]7u-'N)H(<4"ԛEoLaŸ+džCV:dڶnڠ&]u޽{3Y^}k7n<9r,ի&bÇ<13@91|ܹsNcɂA`oP,"Iai*J!&V! sJXftA,t)7+lX*^2H* b(sj$,Qjq& VIJD$b`Hq҂LZc6|M7t4P O t.CTD?{2BE3ݬR65s,MBx^H17@yC`7[õ9IuUWj|5_uXݬ  5)eeX8EqΰBi[~`oyVpG]+ISwzWCb4W s( &ɛލbs(r蜏Έ8ehW5z]+Ꮶ` RɥJ`?Ŋri@r҆ ꏃdL4~K.n駡vN_4Q)M,<32g1Gѱ=2I]tѫ^j)e+t4I{nVj'SgGo@~k:ɏoslfÖXlV 'to3Yqx"4r,jҢJ$Qj7X]/dy`A lv liajʄAȏR`Hxr#P=/|@݈XRRlr!~p!EXyfY姯Q qCPCLaXÀ^*XHtoX">r s8X'InPN:d +X4Rckhe';=@:a.?( avkS) &0ޕFpY0b  RkY 0 )C?Ȃs |0!:^lD nAXp"5ᏯP8@x`pe' & KXfS[H8 hg2 x:@ t';Nwf OVC Ls QT+d* uCu88N9QEucQZ11Ѣ%5JUb α4j̍ZŴWS 5Eb-W=5"Ouz̑YuDhmތ5m22Mid# vPI(>WC%z$TBQV0,`MyC.r  13(!,Re4Y020XM:s 0vSl62ayPYs¬5~0!Z4rmq[61o 4r!D!*O1JE4pNA"emA[ʑPm17)1u9;r3y0iaCDn{Z;9 /xV2l0Cyj`EQ:W`$QI:g 2`(gc7JhX,92`"Wk. #{M=VVd@M0KŌ\HKh9s,юcpBfw2 =nsg>s5:Q ƃ t\ċ>QIݬtSawRkTzsv|vl5]E #l,+HJ>x@]سdMS._o OP knf-FW-"_ΘҺ/ /hB xb)L ^b6,RP)1H|]\Cx;.] ky3AC?-TAd.>^r!6S}bhc&/H'5%e{C閾 wDbݺe'sv 󒙔y&twj-'xa |b}kbJ<,,AݔSoz]R:Q` Kt`̾DDD"V}WleaVC dzeX i*^`.|/ҿI-#gqeH t1w~8 ?0:&Սe]V",,Ɓg^")d,"lfMj @̡l!.&E$B<\J!~| =) *D"ld,lMV >N)i'Xp&f/j—F$@lD P0 00emp4XNxȇq+o:~NQ:玈c1:b 69VHl**7o"&>+ H &4 <.609pCq^e.}V2@XMR!t2 `) ^a=`B5ȡ &M '<am-a`ro XL!bX@2C.#=򚸏3L32Uҹh+G\KUqN6:"',ꮎ( q츮澮XsKYD;dQ(x ~tm7NCE)ơ'C)B@ew"٦ZJ>bFĢ]A\DE^cD LuZ*^M&s 3`A ipP B,R a /C.샘Ġ6k[t6o60bh5VV҆b8mH2&C29:rh2/Je"M:r^bL@ڧ("b^ƒᩜp |``\ =/|` ◂0=Z2|`d` X`'zB gVZ$r ) =3b b#e"h!aH ǛoaII!J4&m&3NrS93<Ll483YhsCNR(:]rVrV&FTBȰE/B+ FΧ^|Mlң2WaigWhT0HP0IM! P$\!P =ֵ ]]C4L_.9U9eOst:Ҕ4*e HjUz;cOa*v*.s;#-dMdQ6eUveYe]egfifmfq6guvgyv$a,=}x((0.m6p(`^Ae3C -lvlɖlev^6m\;s2#nH;U4`쾦o9jm:l-- wp p7qqMbvr ofS%8SW-2=WA(w#֎"ClJwrcڢ>@vil7vowvsvgWrWwAr6p#qtI_bEѥVxbr4oxJQz5{5(7ӖRUl` &}A}Y}7~w~~~7w8 x X~Ӳots&u!%8)x-1589x72U#Fa7oōzz{h|=Wjbq{W^1Q1gffxg8{֊f8gFU}Ax،Xvvٸ8x鸎ߘO6nKokܗ0b7YC9|NЖ3Z(߶&3蓋 Krj k(r8јdMV^mq9uyy}sȘ7ZVKNAdyeN-%! P1zcyzWT3s#!C\fx'Ppop.wpEju柇٠ 2yZmAyY&jQW91^kfe(Ve dWzYR\:[]ZeZgzaeimzu:es}::eڨzUzo٘U7dGZw5Q6\sU;1wZw亮:z;{ m !;%{)-1;5{9=+Y !MQX:5wӞ6$jwimtE@GGm? #^ Ôo{[QP'Y0VK8eu#)(W{2f ;延s{ j#`&+P;0;1<0ַϿi״VźfzS[7I|MQUO~WQKl6dcy+NY'~>~*2;㙾~kMu''v<\7{:2z< گA-q'~^Ss?~߰#6hɺ7~-7'oVEQgkFkI}qNofZ! p@ 㼕=)/3eC =:zc}yƵŋAىV ]؍`()/_l|a96(` +Z1ƍ;z2ȑ$K<ѠÈ6ADjټ3Ν; )(D0)AԘ|ZhӤ:UՊ%D6l]$"ŧŰڽڱ :(qn >8J,Ɯ8%ɔ+[9f :{ :K>:ϤW~ u.kavٗ1|Ò qf:1WDDsB|x*H'&!K˛?>ōy4X3|>9Ҍ_JUUJ@6| :ZjYsgL呣{!UhA aUUb2nv7ƨc6zC7UX.UI"8!$%b8> fiՒFJVP:QQeR^If_yfU^ibԬ$Qmg~9Yl&hvhFhiC! B>HA\\jxC&Fam2E&I7k{3w_6嫯t`W*V6򈬁>dRJT)Bqd}ljxnꂊkKhΫh= )ӖjYbp^uFp_Rzl>|ÚT,v"[,FerLA-f^<-\ra]U\LtEkJ/Y>횿PO=Zj<ͽM zht!<`v"}֮!2o4rI-3[+zwH}XS! gxEdON9bl?/Ӛo>T>(WA MzBg͉pajCqf.{u'cs,>r-{唶BC^C3NDI}{{m~}?^X/ \)aq p,88A~wx[XVg:q.ru ^7mpW% E'<_( }[tu-}$ֻ5Rg{v+bW&<޻Wdo|؎%jp}$ý{n_+^jū;Aw7mk\?_S7ì1:~w'2%x|Lk^zAio~ a6c1Wdxqsgeqgbiw]3X)ްu1ZjcfkFgltvVc/wv~OkEaUk8GuRWh&p|Fpö&ڶp1nʷ}\+[/6eMhqviIq(|S6l`f/6oTXkK֐k/? j@˰#% K[{);/3K) 6k0ۖ# ;>!+[XcԴ {' #K/pXk<+/]>;?˳akh?j o۶m˵Th;Y[>۴c[Yg[bK){˶kD ;˸*7S"˹8"K;{p뺯 88 [[KZ‹ Z {k˫ P˼ث˽{[ Kkk4⫾kE+E0 KE0KLf` f ,L\L Ll%$\ (%A+,ÀP (@À9;+Ր= =LD֘|e⟬j֡lqK,:{c1;0OJI+Mk`O;SX<̷M{f~,M۸l }<ܽk" ^ǭͿm-˭[= |=m m!LMѡ><0|꫾BE<1L ŷӹӷ>= A_H}pnJϞK-Q-NȆ<^^}<).3>0Nm}P ԰n~)xIo C1s/0)Ј5X2DOo')+ނAh;Y8-v5yCh! @4?@8o-MO?)So]{M?B?>aAe?c!?Hf_><9Kwy{D)1Y;Hht"?=׆*jE|]?70ci1cOoVlQE*G`t>Vtۋ s'?8s_5P`PFOY]v?P UO-/| XP\C.dD+FرGE$qɒOL$J,c\IF9mĹSgO9fP>"=SQ Z; j/#[9aծ K0WR)v-XF FFJ٬AҘƋE5r=1G|8\СE&]iԩUfkرeϦ]j.jH^\ʊ9/_~iF1K #W0BWS=2H6sLͼr45s`}pt-tn2t.lB ;3 /0iġeC: ,OEYt1FsqG{G #(ݮB9Ԓckɶ.Co.^0dž+rK-K.J 4L4TsM6Y{ zAH)sO!:tPB 5PD' r?qRJ+RL3tSN;SPCuTRK5TTSUuUV[uUXcuVZC0@D 3\A tX$uYfuYhvZjZlKU5^_*Gʳb)*WҔv]vu]xw^zW} j&Hq/҇.,'bK#~xc*=)T9QeJ)9zcyfkf[\xb5M?-,:68wVyKZd[NcAd]Kgvm~҄*oM܆SWn|p 7|U$'>r@^|r+x7."顷tl}tK7tSW}u[wucgrʱvEr-(gsx0'xG~ѕw~磇~z髧zLE+m{W?y/}ۏ?_}y].+xl9I pL`-xA fP`=AP7ߍatKGBP3a mhAݕ}6_' R`:YUZ27d|STYs. k5"E/EchFuQ4j4ݕPL7)G=qP'?,&!2ct|wB "A49щg %(-\|TH7 `@S>`ӕWWr<.мbr7K~mצdFtmziUOzw=GM>ԍnJuV܅MS!(d}/ ˻'.x. P/Px1,/A8X} =D@CoC{x=r˕ ҭʢ?[@#>ǚ@;lڕrS "*YkwAA+83ڪ"@3//xkB3& x7Phj @ ['pn3Ы0 <Cɕˢc=c>?)|/x(DAD,?B҈8<C:iL?nR:+=3o 3 ÏZEu)\BH|GA:L|>dP}P8(EwCb T4E4UϺ F;H4`6lhJEKp|=3 |xI05H8ɕ\,(,?k8Qo!(XKMĤTLތt7810(rhrXLq?KXQ[oŒζL$LO/̤˺\τLT^OOL:I <2`]6JLAKQPjPPeu }P  P  QP ]Q Pm P D݈t8ʪJ|KJ! K;8?Rs@ʜdqHq#lK8}qMsoZ jSfmf}VgVt@1+9CVPcOq#=!-UW]Pw}wMQyeQmWWv|]Q}W uQ ]I'JkRtX-Kr##K˺L,LraQN 'ζN+KLntָUNcurkDMK7 (%hڦ%/N7T/N7NQbVфp?҄741(51Q,jٙ农}LLϮU\e TP}qVW6)PKX~WWu5QҝW QՔM=]xPuyoøG&>lq#'ԍN,(ֻTLKMx|dT()q,]c̽RK8[;k)DZTH%/X&0oh`;`s̶l7=Q8tO;2łNo]=\7LDd h&!.bb$%ͽύׂE%X*W,>)N*b.}Pv .cw-c4н]ź}yQ%YpKTc x=^=TJcM%PLnPi8>,`d2}_;NoʜK/׼  &1eX9RO5,rrWKf 4\s(h1R`N,Ȃ9%bygz]@|g|ւ~g]}8hb GShTS(WXUcϝh/hh{hh3be}:>g緃iiI((B⚏)7B5VlH,lM= I58O]O8mvRK>LĂq8Ă;;i`͜UTs+ȂW8a>`,VDQ@(\Nؤ&@`Uo>M fK,QxVjT &Ķ1`l4M;\xxܞg^IO nm@'ޑG;ެM:tC:Δn&J>&jJb>=.UJZޱœdT2`R5UmKhdU˙L΄K͵iQ8+oL}M,_3"7]^iaGQ)=DdJ`xPbnysg9j^~ *thP/"M*)ӦN_,Mji9z5 F~=زPŞ%,صnF=J)ݴH=7]{{1.zFki=ܷ'5sV~Am0o7HWu3JN]ҠR&HPڭ!(`7ܷqMڷƏ80Rm 1>afE.dc.]3=VxކqX`zk4?wN4gC#P E .+,s2sQ#!&LF1 0 59 LבLc(uE9Xp 0 S<9 Hǒ`w\75f (mѸY' ObzBvTU[iUU}ZхSnI񆔣GE*)VڨO5v(i](>iovRi)gVm5< hdkșV\lb[kvjȢFn ,= gRV݂Єgȣ<#ML <˔R ˬBu+𻂗68-HsE6aL) (^N, dWEs^q)mq@)60^vTs#2N#0IKy4<à Xa@'g^{gNR3LdC -$XW#M-#-F1%,(iX^qj'B%5q x1$0ۙʴ4Q>+hW0Jd)N1WŜS # 2.gL#db7Z FuPhG>#$!qW _| CnȐ-,4'HHO:$ȣ8@9Jix`JF$  UB,n L`z x G6"~Rc 0GY ?sS`aLi`C<Fyf# b'PD#=5jiMhAѧe,jŕ$0(G;я4-iғn(])!Uhƌ{#nuw _ӟ5\d#2yd@ OpE:W䑮 yA b dYAّ7F2G%r<)8x5] ̱ />;WF+p0` ːpYyHM?P=? mv,ca6w\-qϐ6:e*JSEQB.uGZQ+Auivy<ҥciLrqV;7:;/}Q:m[tvcyG=`s8~!~M_b(ǽP%lP`(\u6Pqm/R/1{@>&v  0éy'4xf١h@R F33xHUU!ܦ45eJSZD -Wd*)ʻ<.yk\ns912hfZCNK R:ICJKzZo,}=Ͻ#ӛ '=qjL:%Ali7ih-1@ CV /jAmPxD!nlZ aV;t0;h! C2@&aYE=ԆGʸH:rSéH?}c/œ9(Ӡ?ZдV6e`tkA~uK{] ]ىٍ]e"W}K,4;\`64ВŌDRU( 196{0LCU7X K1(CBA$UGېXD  d@dA B[9=)5<P-h!2(ATu!zTY5#$?N\ҡN:E Ib)R$R1ە$mH܍GwC4@P^1ÂpHG=90@@9ǔG`HCǴ|< -fM9"fj&y.`B"AFsfoo&Wd䵬_qq0gs:s]{餵ߤ_v"'r@PTO`CyƋdd&JU3ۄuܓ59HVQ A<,ȝU%U0{@Kd ||ː)TGwˆT wGe$@J&G6 &A%UXN 5Jd"鑾MtȽJG dR#ngKv('K&Z8Etv%N6e `w"bwJ He1@_<V-9@øp7LAR U_=jKb4;NG)yUQu R-$%)e&5Ay.Z4Bب棻8dH !aLʬa}+nz+G>^THj)G亖~)jѫ9")$"pAN.FiJ".`j6KݱH,8Kw>7t[OTRbHU;Ȑ&ߍURż4{<~dSADJ8@*#9#>Aa ˂11*e&(о]u y; Um 8Vf<-}뿡,Îw^HazG)Lx8ٰRP,(#@cʃ0BMdA0gG^ ;cPeRWےr ċ^ Dp@ *r6LqE^dH#C"hdJ!mLF ˗1eִygN;yd`fOCY3hў^S_:a#Xy!?5 y˖aA22,cqL1\!"ƌ ~y3Ș7wh`g@vҰ:ΠS٨"h#SX`2X70ˆ&DQ\QEr2&FrqQG y %t%L'o2G窊"zt(&2S'Va6d3'BH8S)$)-0o >|(e'/(@?xBy;`yVpCG1@m\]f3Ǹ;`1JY 1g<ݦ9v Ƈ}N3H2ֳtѥ LT%G\mAteo[ceg fy1r!:hy 0@!xPx8&+=I,5hU^eZfff鼒+ St MI6_R))n gzkN ljKR?RQ@wp茚~)KErD{ re '[!e+0)|X)X`KaJ$2diB M5jPIuMta\XØ,e;?X 1Rq|q>SoT0TkVFrnU+2P 2T(VrhA%p=7+ Wc]"&gzQ$S[H 47hIzwtg.UF_@b|HC ҒԤ$UiJYR+})IMJ)Tӛ9i5*Mj WiֳU=D=j"H N3.&4S~J=UU њgiZAJ~pk[V"ģ7^Ղo>,h nO(A8t'd)[)+v!ƴihe*ZӖyl_YMRE܈inY[iNYp5+>utv!]KWnsxWwz^7B5HU_ g\zAWf mrY !7,¢ϊ4++%|t 0J3 (^^Ur[4+F5쑁9Ʊ=vT*6jc#HVҮx69N.|d( r>UoVͫ(f7m l! )M (@g?t =hCчVthP/yy_DiJ[/|6`d6I]jg)zأ,ŐiB[{k1Q^(CRtμ B ,ЋQش]mk_moí>iݠFwLnw]oq9ș=1:,0{ST5.C4 k6wfq!I^r)WYkR9g)Ys9ysAziNs pjHQlM_Ygmsu*F'׹OiWvq^wyݞNUN f)BP/8<_)ףv3EdW5wIu'9B{r=k~i_{=0󧻽6nN/ +a3 |׹IM@QP#$lB(ߢno_Udş0_יOy@s_gI+p(Fb ^kG)Dd $0)P,43/8+E$PQNYph%ixϣz~+o'@P 0 f/H2§o'@!J/&\ o c / ~ ! /J P/BBo6 PK^@bM@pT-CPaF;1U0A`GQYW?Kp5qfqy0Sѣxi(ѭ+zNbmmв*N ' uB ~: 1qPQjQ)#&ծid!!ة#Rh K \ߦQ(RB2$Fq$ Gʽ/l./' 'O|R''j'=((rr)IK!R***"+@L^`W2-bdR-ג-RL"rg /)8 /rR0A&+Bɒ1,0r0+2/ 8/d>3SS50=#P6q1-b ok5S8s$q3@.$3"4_ JS  L+;3Zh&̊p&C3'Q=a! Qn(kr (jS>&>M>o&r3 "v@ 2ws!ԛ 4"@!:S!*;@?/_<_0dz>ob==qFƒ m?R)SLGQGeGwG{HTH4HHц.Atj |  4:-T  :T;AL#6IKO:Eڠp%mHNs>S?Qα u EP QUQQQRUR#R'R+S/US3S7S)+53A%rHk2;4KEU_COLk-GtMO{UJ|UXU?9g22ԽY CmZYLbԀEb,ɲFñ(ټ56X2^l%Yu^_5_U__^6^%Y~)` a5va/"a 6aAaab`16b5.d=6d;vdAbMV>veKVHdSeOeea'bN8S6[`. U]s\4`ȁ`FN%(k(ljmزV>-.%%jsO]*]YOվZ'd !p&7pp Wqq peqp_q#7rr!7qq3Ws9sr'wq-&Hr7Ws/teb jgF3T  t4@ll!ZN]'jjzb\yn]"Buв{/{×|w|`?'Xt1tCwuWuwrM}Wto߷qYw~W}Wrkuyf[b@ L pw}fak 6i5zSX'z-YD_!} x~tw}x'Wum8~؇iGuawbՀ+٢[_ Vȱz !NW-Z.A4};7syuX}1}XSC׎xMKh7b؋Ԅ5K/y_X{٘6qC9uEMYQGSWٕeg9oٖsYqxD .@13f{b3ٙuWN'2 +F֘y6Y)QY9㙝yٝ홞﹞Y9Y 6Pi̓Ǒl96Y!yGZ?rDWm[1xZ[l!!Ze3zoZZ)s.C} T&o"bD-6̢%[flZ];o35Ԩl,"Z:v3RhW֪cZTV}:ګLo!̬wJB#5Lo`%"P+;,xz] 4 뒉h+cM(  d2xbbcfx'r;O"l&;-[ 3{e -nWW&(cFDh8'BC 4|Ɓm]n[6m;[/gD5QFWB\e{-h;\G yfD䁥X(@4@0 0ΐQE_ZO>Q zg|Ԋ{,U%r<% \- |\y[|ȧL5:bԪeƫ|{w;˿\˜ǡ$j[?ݼ*<;\vΠ\i,}D\lyБ{m33ѵˤݤχbp]]Ib[#]) |?X fFR$Kh|aO'a0 x5`h;[kO>Snl׮}Oݾ )Ia$^A֋"Jp'jYkfmC кk ›:<5 Jֻkkk%Fk_:\Or-, LWHJ-UQc>eg(1u,K%5@>́\|N=\{&t]&>]tm鴒<߻)pc>Wܽ\Þm,Әo$p~(x>,+2su ^~>Ŷl]rn==O8k&0STG$K'>I=՘ܽ_(w[ gFDӺyDq}Ё(p}MM[?1ү-J_sak^e H*\Ç#J$pa)^hQ D @Gjx[5''ʜI͛4On,DZ IѣH*]j9Am)5Wjʵׯ`Êjc ΊLD-[3v{2dU5{ңǘm PF;B ǐ#KIiT$Πɚ'C|`֪V< ;9s;*R$I.'$6,QiNY}G^mغZS+|īP TZqʙljfivJj!?-M>Xx #k3K)ޫ9w\.whôNժ&w竈·h-˃,)~NzAzbokF+ZYTOmuX_I`g-+T ̲dcg1(Om>a3UL9is@*qk괿6wĦ}|A[䤗nCκ3 ,Oc<8 *,6nM sYys#oؗx4~0r=yCK/?o?}~c]G0 ٭^$!0Qx V 7xNPyA˲q.4A.a gCʰYFD8g243# D9qOԟEͩpt^;7) H2hL6pH:clJ>) IA<"A\$#IIZ&3Mz)y7\PȾϝp~",Jr|e+iK+φdvAu11Lbһf:Ќ4IjZ̦6nzs>a& L:vLVՠZX TzUլ^MSUkVZֺծt^*ֹU~uR Xkb رuhdV=d!{YΞlh=;Z`5Vf֨ejG-ͭnw} =} Jl-PCKRc X8&ʘ.t+]bWǵu{wƝx]@v;.}k]+.Uou{ЅoFؼn;cW.r[pwӻ`$yKb5o1}YB8Fr| x3nvG`u񔉬_u+a#qkb5rK6{rs 8l>ze,f8Wޱs4?y:o璑bI%< pM`eF0FP2h7iދ*ֹ60{kV3~n{i2|eZs_d\7a '^`+Gv`p`Nv_mns0BRUvUqf'&t@V|6o duu)G_HpWej&`(xt|FcuD&b||K}fHwshdtz6cbHm@wo?frYarFp9؄۷]\gp/w69ֆE}GȀMvpbd;rYbXpRjf\7}T'fge&mXbex=sep6b@e愇؆V|IA & P;1~{d>'bX8g[`qrV8hM0s+8`dž d˨o;k`fbzGeh"'rf,dUjwf`ZoWgGrV~wg1˷d3e`oI\VpH`9Ih3'Bmtbe&i8b@\BGIAK?ACL]D NHWCZO E\^<5LZA|bl-rRt|e|CzLǐö~."Ǥ6ũSwȌȍ ɑȔ<ɔ,ɕɚ,2Þɠʢ<ʤ|:>`S\ʩRD3suQ71=ӊq7M57;?2xc= 87A=]}S]SMS= S?8.S .Q 8RYP=n]:%>%.Q>#>^ Q9A!vE1L?uP9B8V~X8@8\ab_n_agnpZ vN8Ps>uy{Z0P脞稠苮^^麀 n.^^Z~ꨎ4髮E`nE@빾뽮n^f@fpȎ~>@^fpn~퀠^@(^ N^^//A A_?"i0_#$%_//-_37i:;8@_Fi ;LNOMM_IX_ɰYW`b?d_fh)1`ܯZ@\Ne^enaq~g>p.^_莮^^nꝿ.^~귞 4~^ͮn֞^įn~Ր^ޯno _  o_&*O4„ 6d04 +xQcƍ=~1YőiJDrɕ$UlJ0ݤs͝8}IEt^}a[Uj T)TnvB+phVڴpF,tօ{Wݼ|X0`Tq>CKʼnZ(LY3fΜ/wF Уui)B:ujԨVv]DvײgƝ[7n{.bƷlŋ8 ʛ\tf[7:v۱:x@fėOy|ߧ_-|/@D@ DjF@tA b+B )CD) DbE_e!lqt##32$N#t`R&)c⩦*} (*bʩ 2:"31&4EC,krˬ >՚2.5T.J/ފ RtH#02<,NA J=F+So5vmnUdW⎋nv9+9c{;N;<=lO[̻\\5vp@ 3B}7P S; xāQ<gDf!rF'7 ;&c#G&Ht2I)mJi,˭¤ͩL&/_0SzzᬷB#j(+ϼ.:/F.lEjK 4242n6lT.M:MDkmU MU[uZUW] ca{̟\XE!a%zkĘExc3G%*#$4JT}*m+yf(vJ祠JJMe_Ҽ bIY9 kCP #KIJS)JSFpQ\*qcܭ\7U0]}XLd+r?OKZb3pgDCJM DZF ,_vA ,qK׎9Bf&mI7Y&S5G3P2LS*]0:N!q4[UrNp+SvU,ZAE'F5N^ndTU(/>_$؉-̐\$մ$DŽđa2}(d2Oo&GHiJ,~YSR UȒT@.f!POÁ a ifL56ӭ|&b$#N4ui4uW5Uy XWjQ~Nrsg<9V'uzAh5F6t\=#+Z۱6?2:ǎ6_ nAC*KǼamqcQz>#= RE>LA}Qr~2s*P^׽u7|׾r˦Yn][`mR( cM W&U_ Æ}V#b׈XE81mbƢEl9c7lzt̜-xmZNTk1:[&7Ommh<*̏VqvY 1fĨ ft5oys 9sJZQA)^25t=)U=W,яRIGҗƴT|M//t9=jOԦuU}UկvuQ=Vֶuu}]׿uq=^v}e'vv=fSڤn3h]xѕ*=o6wӽnvw=ozw]opS-7- 6NH:v%>qWx5q;M?|'Ii+W8]^K76ms΁>tD?уt/HѝM h2[S&`g*--=_nvVN(xw|M47,pz*!?yɏMOs=O>?D= DBD?4DDec |0KDN[5*O$Ÿ{CTUdV87d7p J,{Jq,^ PoMs8dDeTd|hFfFe,WkltF_|GqMT@?)LEPu 0b0ps<|v$8XtÀ|% ԴTȂ\ȃlȄdȈtHȉȊHSPȎȏ| IIDHb%*+Zu?J4޺Kߋ .b&a ^c7`$&^ 8n_#a߽c,@AX-~D\ ABHIگON ]xEFOPemDۋQfVvW6ܹ,V *M8N\]5GAշ^6cFdY٠Dhijklmno-h,1s>q>FsFvvwxygwFz|}~gugs(g(s61Nygh臎芶~nghg&hs.Vgs 4yf9Feلթ8ƅ&g&玶v>h.6FiNr UfMZHVvg%4B ¯vBB6kNBt&VhVgFF!tkk#d뽶BCn†6hHڑMi0^j+&{5՛Mf{Fj>ӆ7\9~EDNPhDR\Q35(>$^_ܝ?P~饀6?K[mznsI^4Cmtdml{7|\GNZ:^S ] _l&Wʂ6)`K6醴\E  ;PF*hvF`GWG oq'9p8cICjV︀9`<] m)(,+W[6Vg#Y&Qs`pWn[wp<qm#q+1ƙ6`UXhX V<s=Jo9;MqЌsm@'A'j6E:`pǴQL]`Rc۵c.r.u# @s0NЀhwHpLJo` ;7 c뙻K޼uSm>j qjj@'ss,tsDONdo[u?c% K##5{YAWxlo =L:p9/oƅ{;0qwsVl#W^<\)by+brlfge+!X]hhw(8{NS`+c#?-=< +zvmC^s&1AyF)hPq/{AO{{s4#c?g|_`|o{ cs\{e/s|W_rÇ tPyɄzp_b*/&i}7 1 hF`$9C><ag8?ӻOF?;[?O],Hr0G' d!5j6l(qFS8i R.D%+D7+ysgΠA Q3)"SI'УTV=uTToʕ"Z Jדl3n`ȑR /bTi0Ċ3n1Ȓ'7vVrcv$Er \A-xt)UQy IV"<\:4,NgiܬMδƏVjqû K,G$A+3|R&Ka;YEyͺk5u`~ٗ vE_P5)F6qQv/e t71 Wa"-c"VF| uGVuC*$M:DB9%A s%W^6DVfxgI(R{?פI&&9'u٤`n}n^M'e#:2b6f6F9 AC99 gZHr ꝥzzjR%c@+4$ +{,o&[Pp Y3"آj-ʸg ., C~HH;/{D85'^X:z|pZB_)yy1.{1!<2|22-ƶT1S 3,2=3A =4fDpXI0,~[+g̶Ðl.7tvGٝ=Y6i=u-6Gڽ7cMv`)x5NDTfswl7>ecs.硛>饣ꭋ: ֦hXԺag}|F g.!ٰgM'ў2)}P^n.E+v{-'?n4;ՈǞ!01(y[gG?|O* RWz0H4V*hc(C7"`bzt p/AUp"(%qa8!F" Qx4mcYu44$+p"+~xCWk4ǁ*#tQҖvvN<(9d D B\Y}V2"pB Zt=EpE D<+]^C'Tw>_ ԆBQS\S-ыuɬb7;PIR_T}7.p~_[}\ &q"jjG'X= `yȣ DC,tOήp y#O Ȯ\d7P<8|1^񤷸C.ԟ.FS:m,1U1 5𱓽.82]Kh?dVn:w BЄ&|8xWo N9D247r4)ESI` ;Ӫd{moyw讗_jyqc@PXCFgG|0 @ǧ@;~> }.oU?u;MR9MQ2 !@18%KxWܜ߼Ќ͐ Fݠ`ߔ | J/ ڸ̍Nщ߆ ̠ F %!d0w {P(d.RN}MO4`\&-χLơށ֡!N! b !!""&*"#6bҡ#F" $V%^"&f&n"'v":ٞtuaDV)r!5 +B > "-! 7 x8x( @9 /0 $82z x x(tc7z2" B%5 c78p44T `= 7؀7 \Ad48vctcLd7< 9x AB#CF8C ;FA D- JJ(Ld -A dPdD/C9`G@CT*2ǭ0@VNh%t%Wz%X~XeV%Z%YZeXnVjf]r\@]֥l90F_f_`"faa%a6a%bJf`B&cR`^Zf.fgNcj^fK]```țs(VaQ"00 ̹n"Vb!Xq>B$1tcK0zC#DA4z@֤KC6jFDc67z8` $ 8d2bA4\ \Cd(L5Dz/27Lw*cDFdFV#AB)pDIhM*RZ(0R(0>dCT5 (PdLz(=1vVA(D/(h f~a%^ZݫPdPCĕZ)nijb\iviz~)Ƙibbiib))fi`hHalaXb,"o6pRe`yxS DS81n'2r'8FA5b5'v"K((x#46;r53&2@֨9\ޕd>dNC>hNF6(LF>5֤9#nf58pCM*AF$=20@@1xCLc ꈾu燎Cp;); l]TIB4łtw$ٸy()!Dʆ)ҩά,ҩji̚)΢ -b.Ӿ<.(b&onMpnj+r1/&$5z8j90%G;&h7*1#3C|bA%TV51.08:ž>~RPRdLF14hNANf.ER(`2?AH2FPBNj8A9X( X L T488<9tv6 j:'ʗUDBD/nJoBo^lETIzhYe.AN¯/ޯίRDͶ읪p,'&07- 횎ep 9J~0dTP#v6dK211d+D 8>tkf-8~b5jVB -8g|-2z 78ڂdD7xAzAN>A J+2LqD(7(8A# t1\,CFLXc!.4^= L2%W%_r%OyMpJeI/A),bĩl2Zr2-,2+˦),r.2)513]< ?3珽Zw"#4*%duJFf.#LkCA/r+c\7&;2$y!cC2dQhAZ#HhA98+8$S2$N4C"c7c|ɐ'^㕔 hG"!g2X5Tg4 /B4/@*tP5/uO4OKl)Go',_m-20.WUsrV35dU),3RQaJ\[ .rU6NMj J*2h0xaGJkD>4p4p㪭78'86¿c3>T5\FcCkP bjGd 2XA 7dt9~,5s90ޤGZ5k }+;pN`CxcxcEwxwzwxIђTpUO50S,c00wx, o5pp͵;%Fh1LDNqIۀ:P¤>C'Fn+RC8. G##wmpRb7H.~ @ڀjNnD" L2  <Զ0cܮ.t~G3AnsE94,XAs9|@RCse@#:+z¯I)K~1?-wo:)s:"2\O8 hw炣ɌhnO*h^jBvI&(7hD"A.x*/$0n9.>(L4 닂r/GG*tL9&2L1@fCb'97Hv#yLVnN 8I[6+% AL75)ȋ<><*U⌄)[}{uW~l803y:'~Q(k%.?r%;GCsPhުZC@{+. ?S_w*/-{u}WwScw?sk:҃_ M@8{[gD=vQ=̔/26@aÜ(oQ%.$hn+qETGa1>Rsρ'ʍ[1M0ڏR㼙۟`tL!(/Y! MjkӮ9qBiwEgn2jʔO?La026PSjrԉ?cG)h\52呱:ti2Qy+֯aǖ=6r6Lq;)j>xߝP|̟;oԥWמ;v[ɣ?o|z;SC9< ʕC@2LlAIH0$@ /3pC A QI,͹^(gt+naFb)oV`(e<`ȋ<(snh?lGqRhěqj??1n1rgæFi*#beI7@RXf3q^†ǩԠ/mo05, jix)T[y6,̹#dJ$2|a$! ^!p՜eY_{68wM7sVo q-sM[j}WxzW|~W URw%DWAtP# 3 AēQNYe^¶k8,s)RHҍqtMJ5z^H*:NcJa *rlc$ IWbnjҡ$ha`X`G/K< )G(jlxSU7e0ݦ8 ob 4!HE.t0{Y*f2=Ah*!mC*(ʔeYnn0Z4'%Q+F6S6Jn0P&EDb8BiiKwR#8U3B#la٢!0 @1 ,hT ra iUa+ũ)^@ջxDĚl ##hIfMb&)Z5~I-hQk*pכה65] Moj;O}ԞE*QjT*KMSզNU*UjUf{ 1̞&͚Ve@hOy #Ud bfB?UjRh2I]Qq`4^%dj_ Ƣh,bjnp#|`vn.2 8F9Jz D אU4/|[:`"Ri7T i1]fnw =2 Sfj{^5}a_׾~0|`u60UFy/H<UBeUa\}nؚ z*(j,C UX}#XxCl 'N$ IKo2-9Q)[9&)X!Z!WA| г'x,.k&E#8#8AT'f+q/RA0zQg-iLoR(FqKPdOjUխv0aX× Gk]rы M b,V)BC%fW (SbF,]diTH2B`&B!awS J@w)HIX T@*HrQomQ) Z@0 REDDs 3j1]2ѺpasÜY6im-Xf6ρtE7z%t9"}u\Pz SR_])k@ڛxyRd,Q3NԍeN~XA#}PAHjA&il e քSN<4V a7(W\6dNp)x!¢%[Z}"NP(!:~¢Qb{E>~5]ٛ&8vϚ?xc٘ijnhJHFVG|0)Ae&,PzE\Df` f-X`z BA/,V,dk@R !$ $Jpfkd)P~b J xHo oC/dO :r˸Ʒ"JOϪlꌠ>bό 1 eֈ ̏/eC-6 P0*c0fb |lD@D@AuDޮ. ^pf @ 2 `2`I TJ|D&.Fdd e S (Gz靂d\k $'D$.IrH؉)*a$.(鯌ID jF^ N g~^14n&&&Vb%%b*&c9k Y-zCM(Y]xR8\w)2*'rj)(3QN>**aN_Dbqdb-j=}~P vQD2Э'ƀA k|@IȠ tͪŠ% L@$&eR`MdRx1~H@h,GhP@fkCM(Sh $#D-pKKi-NZL Z! JF&hE/Xs<ɳ<xA<ť@kZ꯼\$'uRՖr*(*h?=eCIyVꥦ2 A3y@6R7?(io,I,1P4E-ݒ|\--ĔLCBfzfNEL nlquA1pA @@ cl@ؘ:"G1\K$<"ILa( bt M evFPFa^! 1̢,2"$h:F# u2 JP~ǎ!U[ ZuZ@xn>/?!6T@HsZA@icB)B'4Z IAY#T>r56$a>@*D\\D3]WTdP-ɧFIf^-? U~Mf@ % J3[!a#F2HLhN !e!#BP4L "U | pX gādbS"jMjB1ş~ QHldF5@TKFRlDdNrDպnlakk` nlE5z'mqU@ҽ|u^F(y2o!@ xR))nNjZ pV1TYVZVY q#*Orq/Zr[;{ D2ŕDGD]]aDZ^K$@uu*G]JPe1+zH`-`Ja`0.bSm  lG ,IJ-Ka "UҴ(dUTUt漢X`p@ )tqq4RP,MȄ,$ |-A^a Nfda#zKNRҴֺt,EXaoX[==^dn[*eЋkxn8cs+ @WD]qeUBLwdE_]Gi}F锤U..aT0lY`tƠ0 t6RUT*G0K ab>CߘM.S"-:*8P V`uSl &qBW뤹yu 撲9`sSa UtK,uS^3Im^?F.vn nQ74jKN5Y` J7*K)Mg>2m r>RͱLDdg\P`k %iܠq!)Lv JjTF-$D'ګ~ `L7>`火zګzJj#CV2En:z麮~c.qTOa(L9*\ϙtZV7E @+hL!nR xY3N4fR8j&P?Zr$HlxVKbtM; J}w|w%irj-n[hcbi`B/*f^.QLj'b>$' BuW.+,{,B-ϭzZtD:9~RYÇU$?D!D9,XE|zwtS@`SI* X"3ihJM1B# RD-AL:OA^!)M;)4 UјYA*(c N`hD/䡭[5_6.ۏ 8 Rew =i`>QN1$=JA]Oo?< \\yGovE]9H=«AY9TQHyDCm7UA`.K(*b*j/8vǕz"RdPo8ND RlJhiL3Í IJ``@(BNa^}Ň VC@FG2΀&'YS{MZGZa~A}]o]B(<ԟXS}WEy+ [`͙yDoa6 i+ޖa/`/ɸ%)}#zܩ n )<ºB1%€oI&i}iTn A]JM8֗B+~@_@p5Afaps6^8R`?e`ep+ۚf>o=[wzX5C7ޱC?'{Տ`AbiaHW` a5t$෗@zL(t"q&Xr \1^80n7oxKH/^܀!&2ZZ13m0'os0hbi|8Rg|8#SNN6>82^8,7ڵlז&&ܹt}m_E k (ر sY9͜p )RX=:լ[^i{_۾[uҵsߦo۷725k/*jjjjhJ+lznl)7rĩu(-7reyxࡖ5U[ja{Z3Fb肮.d@MSsUqb41W?0m0"a#xG%pS XxC7`CSA )38xS)a7SRl ? ) bh) LA9Q0esStiSuUtAG,DC<9UKnbi?ZQk57`u\ 75Z[Nxx/O?yONySoygyDN4>:q~0lsNթjA˝Uڵ⥶U /[o-o- Zy !OUe TOtS<$7 1 W?A(14<G#H_IR`D$tdWrCb/&6yegP vD,`yChB +@)gz֠ E9R~` -Ԁ@% JHщP"ĆE0aenec̸ʄfll7#o17[S;R?Sɑ E'٥vadjn-iw%W-ly I=ϐrKV(%d=6Q o68@UIn@&2 M^+89*(V)Ȑ <2`I,rS9 ] ^D(Ȁ?`52igC3iJ <- , $ғ2i-!]GFq KGQQuLwU;}cOy*HuBtCE5 xKyTd&+!Xdljm*X6OK4>%WiST~-xG$D 5"mH\0EX86 bot J7WM,UIgPքI}M XL٘?dh% 9́js0EԎk 2a D%mouj$]w[6zJ/egʻƘv zKluV;AuRa^%uYK $Nu^/6`x? `^ 2w0 dN@Q t"NB`CQ @`]?Q6A+@z5=ʕ=_CoC[&2|N7ydS6H `0aha8e džKd}"2uHwX*}G+yćᇬ_k_"=XhGajA.DE" GB$c.p&-#@%  A!5f0PLK4| "Dn!|!'''@̅9$ H`|ny`|4O'U#r`P5[b"Kbr`ˆ&Xh \XFpk d7vُ 7_Da!FBs}a}8Ii:: 9 s1BHDǂThY0 3'=wFEDH$"'HY03E!7p 4)r F ] AQ>'X5 Mp# V6/7saN@ @Y K | AqZ.k)l3Tg[oׄYBZEڃ#Fz^d晹ՙ[E])za)B)e77oiGnDj4yr~R_+`,Q`R`IH/PGEQ]gd f> M x2?ހ)mq>W#Lc lqQq hz1szT%3P >J Ji=ȡl" %r1Td B@md`C%H6 1K\Q<ʣ-mQw7FJF57)%W-OqTi+ Ia7S߂Y#B%ktik.i;TFtUI\:ag}CVaA^W Hn t&Qsb YWWcĞiadZ?㠗W"qE2+`AHyZ23nM0K?эQ%Џ&a'An 4[` s5*DFx4VvxsF ؚٺr7`T7|yC~3^!zUvʇ`à k~H5Gd_D \PuvĜӰCVu³I ˀ @e.V}X,V"X3y [1DŽLk33ى@XB ڝ YARдMvhdbP 9Mp.(BpWPC/Z6%A)7oy7 %˸{]F} UR4"RMQTZVJYGꯃD(9wK  Q ;PIūUKI;l=zHL%!%vJWE>W X>{Wy""Q` IGRQ`?K1y/WUB%S2% 4R2$AgKb,V0JPJOQb'F&s BVh5<( 6+nW-|svs˹tIJ'R1~kUj+a*RuO 8; M;a2+S+ts vduSP!~c$'1?uU"Q!iwr)9S1wn`?l02 r~5X1@jAXቩŲ+WOȝ)vcvd$,&p{z4de5H#5hA^ Z%Z7[|#]xshs.=<\H^ ' uȒƹPRkǫXLXZaL<–&@ 0 pd x1*mgqcH vPCnw{K2}1bxZ$.3M$ ;S[%DNkǵj; _,VCSA FbV.97]iqemgmְr؜^Q+~Sʼn,;R^\͂X:_arz1#M~43IiV0 2C8cڭ0{fXN;cO2 @AOP@v 5mPY3, Փ.:vd cmU550tI)RxAmzmۆ]^bpw=" 9N P)HJo8'M|ЍV?~ǎZDN%m3bE>>T;fh$qq ж+|}JcJ)H05] Ӑ/7 O4ev*N'j0LvW(Jr,PzP|'|rNunrnߔF|Lo]踢<ױ֒O׃NbٝF0`bD/a6 '``Cbe X>"w"6 eS^#=3Pf%Md [{i=4Y\4M(& PT [f\-߅A EzSF~>:l̓^lkrr^R׵{N~ᖨXt D z6-dZ 2>}gX0 @[R'%9164QxGWazꆪ1!6 S9o/CZJ؞ff/'B hxx(r O(@A˄+p\uowB)b)>Fs;,ɯdζ˦ÖNawF1S 0w>06$W$|nC#!0N{kbd 94{i gslQUP,`"&`['N$8-A-J (0e(V'`/$@*THpCm@0F9mG!EI)U151cYM9uA͙=%*'͠E#m|(ڋOvu#bJ_YfŮeΧ9U D[s >QRx)7Ś)lE^c {3G!B(`x=n6 %N5׮Ϝ-e+VB̉g`SMr6Z1Nw9sbJqbc/C 3#ذklw{]fϙǂmqfhP00vaW z#X# %0B 3dBh D?l .h"Vrq%bzqF\-q< {,jG|iA$z,pc+jy᫛RJX&-.I&bL&4sKr[Q%2 E1"tPA˱9?l/Ţ`N91Y 03蘃 2ᴼd1l+|aeh(4rƹ s)st/7AݴaE2n926jA1@X] ]t Ͽe5'硃vZ2rW|`#l܈B|_7 ~O4xވ^M#qbPƖ^*Lu̎C 1}$`$W Rl’q:k.oqm깨E15kEl"L34[ $L2 R@PϺlFL6)iBݴC>]NBe)E7>V/pn:1@["vÕoXSp:) owe!0SΛM^T\/@dPR8"-J~yy蟗>z꧷z>{Qh2SJɮ &-ur˗ig$`5Ƴge & Mviӡ4'dfQL 3`^ Ɖ4GaP8]:M(9v' !6/oMDXF)g[A'W8t-=>#'Ċx@:jѡ?X@?3;,w}tה"d! IHA"2L;HaH9pILfRd'=IPzR0$e)MyJTRLXJXRt,my?Ux)Ɂ+Rrg9<htKAMQF) l7>:4x <0\cnvk64 KOЫ|$ +P7 F~N_⨹ae tg`.П1\쁂 `dgo"JrjJU*Tͩ`2 ER{Zt1uF#WV3L @g- +OW`c$j_hBsg7`igJFT &7yi'̋Iq$JQ\+a<#Fs9|x Oh˘B9җm/ycL ӘʀRD:ҁn8-bns.9wT`h!S\4 TSCQORo_jU~æDIL/тWB5GcBaH{Txy ~SM'R3 \ bdD&<Ӡ0/LӈvlEC+ $#ɢ) LzR͵[e@:x! 3+s/ܤB17+V(B*yU61m Xuù ,e1!)iOξCXUTGJթ^vKHf5KW;`X *p- S{O xIb%c}Xl=!Dc4* 0 “QnLa?4 Q(EegUM a4N1`e\ Y\VpGyTm1[ "7{*\ <-wI+SGuGtG]Q^5b:H )b_uI>پvO>_8Hl 지 xl1׸^'nKc<-'sw87p9%?$ N_^$Y2X0 2~`Eѥcwp%VJ*837"]!V.~Me3[@ڹu:N<`fi<]Ԩ$FTy#( 1?IꪱK +^S,#T:6y$%)Ɋ.131{@4* B[ˬ&k<J"&,Y+b3">ذ&!W(1溤ћQ+GI2{>KP;" J1-sjJepтp38/OIQٱAB?8C|D\DF\DE3lؿaDH,O +E1d`'(*@TE03rs =]ю X4 ۪.hy81;`)P!rӼ9p6 {7zȀ H4+lɖft>2Hy`Kɔw*#QYɑ̂4IDI4̿:J?)III|E4 (z T+? [DJQxq)|< z' 7n&@l10)PhP Z*ʎ*‚S"H뫔e8 97"yIa](p|)>l3X8 0ld4KbBNSDl 0R:ňAK %NL%Y%N4% OUZJ]RVJjh ZʸKFi@ac\0K*/oq@ӎcZd na4؍Ky3刂E"zA۝yي>2ٰJЅԜ^`(2Щ לvHS8?([00 1MzN5  E9W$t; 2:1qŬY@6elREnCA4?p#F)U1)ZBUrP-7>i,& WD>eixנ4G7PxVFQqGSR?I2?#WNHh}5-؈D8%99uA,4ʏ<!S;JϢjԿgr1l0I bX14+8eWHSk@v[5!7PKpUmɎRіmIF/xP:r겪$\&^ ZTQ)( :9{ݑw :8 ؜顑~"H".yzyh-C:Hz:y%C%| ]UI[kؓp]s X݊m@G IA_JYb8^E^O2QTM۶ڥ;o r.qXj$,e(Vwڋx()o8`&b|"ʕ;>(83#7z9# !p٧"Fa!Pq3PH|4N-5=8H#>#~3pA03Z PPL;;]Sܵ]bˑ!NWh_x6D}ϫe1H=kY1=&Yni| !Rxl2dtӋ,63y) Vy@O.2,Q1=3FHK]eҕ; +VlCN k)/-c|-җ."ٗMlxH3,hwg*zI|QHQvn,PguvgwV.e=OѥF"Ύ8|8hh.h8Pn~b= J 0;hIőr%h!*I@oX5icŲPjkc^ۍii.&%D.D"j.j>jNj^jnꡮjjjjjj*X-b-f-˴>kIIIb& "H^ll.l"N^lnMB0gH:c;,ޡXiY|ٗ@:16 و-m5|4ٞmڮm۾mmNlmeӎ֪lbo3F~LDJɅкnZ@(ncm&b&o^ofono~moF*} Y &&\icX hi ;oĞom"p p p mo$X kj`q7q1뜝vpNo$w$%? rn'^@t%Ysjϣq\0rog7_s9ws r)q*W?tAO(AW񺇘WEǿEgD)p;W#&t%t&w:tR0#׍E~ʖ^Zp0TDpp:8uavb7g^OvTvd_vgovhg )R380$9#R'6$(w>sOvPwy&m grv=w稜0 `cZGJiA1؎bv8xxas} *thC?CWlX,Ԉ^}Ȋ!]~ lXˢ0-Ym},BsJ4Z(߾~,x0†#Nx1Ǝ9pM8q>άy3Ξ?.5k/8h:*êC"=VljϮv6]eq*,⹍e tKj,#Gl^ScϮ};޿/~<ϣO~=1ѩ{2}'ϯ?^] -PX]٦oW\p[oFsx$Ђ6DY|6X,8`7ژ#;#?$C Y$G$K*$E]u*@Vr%Yj\vcYgk٦o`f1ځt 9gIXC! rHh։+99^rکZڪ8Y⚫ګ&^ v-HZDQb:tb)JG`9߂ n9b[@[∮h[K?CS\9(x7~$جTؒ\E)6a^-23\1ۜK8㬳, S?]C߼J3JD1SS]Wc[sݵ_c]g}uys_KIf1?#wL ̈́wFo8K7zw|]s޹giצZ>ri"F4)7K05q #-BoL,<w˄x 9N<=LU^a^uV--֕pZ[?զcyBB v \`DY%BpG ew͛\3HK= o,2Uةv{ ]™0 vH<.* AOqJCAgIy`uG`}YaDX ]D@'9/Nhƪujj841Y#xPW5S#V RDHEAbdۖQ(A|C搅tYBU²?"U(p-QK2!+(L^r77QdF̧:ǦojܚQD*V**IfMA$JjғP"RDTIk99Aؒ z*!(zYß*(0ZTΨJ%&ScbԣP-Y*-qXUU.T=f.=ZSrS]Clu2b7k[l_b2S^wLcCW8ѯzc_ ޵AD"2ZE3{4b֢kGH*(\,Z׶OPlrIN7(›ܺ\ hjt΄W6Z=e YI]̖D3 Mea.ZcP =W|󠨷c=,&MkEujXgB`EsJ6‡ee #|7t򬰇7laq 鿇Yf6) &%BvllD#2Rt%)nM?)Ԙ jtsL~8r2La.SI(_Lb+͜(6xkQ-jM+'dO4hZċ/H vӢU G-qƃ<0 3J.=^j'2d!Gaqmym&''뒲ĸNG4y0MkKSvmosmy` jU7ij Ejz֩+rF!Fnqd !GГ) {8;<6L"hw;*_9[o!|ܺ!5{ ʞ_r>ͅ^lj 7&r=h;'é'Mջuy]Vӳ󰭃q]=g7NCsGc| En#>9``?]:oc>1a=@ 0";-ݦ[LOy;Q({B%\=~>=}vBrㅏ5)1,~oc탿O{ht@/Iѯ g*?] `\28`"> [A[}x i^ ` ά ԱqR (N `>`"*!2!.6FaNJ!bj!f!Z Mpv] ^}`ʡJ0< aP_9Va!!.^!_M!@$iVz"(~(b)~ DXoΝTV xŗt!/c0n=\5 wW#&"%RK@%f! 10jqKai D}| J$-Ri*R=n=c>_xR2teLxaJ@&@&j5nD+28 ОTlcCkIBZ\$;.uUIW|Q)"*M"NdNNM$P#!2U=8J,dK@S:e& RU LX`+9c;~$ƣȰQJ]Oɣ b\/*"Q zOAD|AC&@C2SC&۸5fAcJcRfd:f`8oX$J䢈HB$ %=`]fkb]B^?"||LS~AAn |AbV\k"qu WmQih"h"``lbSR#aJ(bUbfi0sZnhFgM؈h^Y""+!X(Xg@"gsB.*]<(鑒 ^եg#91O^)e m:)~NE!)씨唣nRmDEej5'K(L KH_H_Nj$jǣB|L4*Nj*ȦFrbjf]dEnO)ҍ)rHVYj[tZ֪]mGnkpY*@ܲ AiuP(P&zBk붒빢+B+뷖k+k+빆++)BiEL=ATC90O>9ܰY]pEvhf瑭,Ȳl&)i•+`+6D2 m:m",>m2-++iWDL B `l-&9KҬI6+hZlo6\,-)lfC,mRZ.k,jRm:m^mNNn7`d 6lDX,#|BC;A,F+:b1n,*ٮT\)&phoo9ȬZ>k-i:n e$ޯD B꯹BCpD wYB9*؂p0+='$n-b઩^q+jhgHiĪR4As0G"C m!%*К  l/ #@+p1n /, + n#1R1yǼnS9h H`'k*^ppKb1r-ӰeZ 2/0170+1+33#s33+VGyDpOp2B 3PNooq +0-˳ l1bGn:1'2@?s^-AA+/5DZEl 1mM>G+n =sOeNeo'2tt4"GK4LL4Mt%s&6čQ3;..r>gk/K.bUk5n5rW{uX X30#5[2=5g&75dtTu]SW+>_$]75P ٝDǮ_ӟ[s%I2a;3M4c3z(#ڴXw2jNg6,㲎vjosjfFDp8upGL;\viൃ[}p7rrwr;r?wsCtKwu3uG7vV&golWNgu zgRpUXwv7ukw||w~~7K7u1E$iZlӕ /w>/Iɂf4!n3oow׍H۳jzN6Z l J- l\sa2NLɌƏy , }p!8Dӕޢ7xm0GyInlky4 /Aye[68xQDdQx;j'v-꜅k'Soy#uC5eP$P>n?Iz6z-:͐9c̚ vvaùxyLR `没 Cs#v姪:͐:+l5/̚p3Q7P:LT}ФLnn 8w{nmx{O${I_-o?f-{*;# x{[r ލ{;w\{y3eG=AjfP~[c~ks~cD{';p5ඣSC_poppRWx=3 pKYC؏ @> j 6t!RlhF9vQbƊ1jx%ʐ%ڠūh" ED @Η/h+5Hz[\-Ydlk(Pf\D5܍&h%@eGa]T1~#83RsW<@d!-3^(C:޵XB~h$9Gd@b#vORz4$ ^K]@ޛ ?_|oCyɄ[:-d,ƶmiض1R$ 뾾n XC!S ݫ -N@5y<ՙՓg-Ӟ`Bz#S<8㡄xQ_[YX7)^iXA AVApxsx; ùan%[^e= ^08H^-V:R0iA P@@쬦|?4wCz0",iq_9lc9 m'2{|!֨5&d qXݪDOL@1`0:E"dH2A$&hS&?iOrrhaI"GiPR!(gN1=[ :U0;@:#Iy/cx1Ȕ$ D:$eYrNf,{* 4 *s3i`F^# ͒:"_tYu񥩂I$1ʅxڧ( K1q-YINnzR-Jn M)-ORR'G]93g_\v h dZS!% BpUbUJң*voU ħ+xMGoQ1%~V'W llr[~?{?|fc?FTo,5>ۥAGƒ&THET&r :䮨<km~/N&J`#`o6$kq t&eme7R7Bтo _DJYlཪ  pބ' 1ЄP Ӑ ë ʡ༁o } Oʹ. QP.LJjNbkQD okDt~ BZ,1Oko&.OCKjRb'ko AOϢ ]ޏGxF q*^jAQ}gbQm0<,V. D Qp [&ArR/2/[/W6]5KP"(Y0MT0+># 3oQ3+2S91HjKH1>S>>>?S???@T@)"87 *y3m*S3+C;3C29QB/)$OLRTLTEWE[F_TFcFgFkGoTGsGwG{HTH4GMT/sA4*ѲJTJJJKђKFP;9TC;tCT6)3"HNNOTOOOPUP&Jr UQQQR#O1*$&0'S;S?u>TPSUUWU[U_VcUVgVkVoWe.W{WXUX_1H$ttAZt9Z[U[[[\'x X"R.u0]5XԵ]]^U^_U_u____`V` a Vava aa#ab'Vb+c)Vc/vc-c3cCc;d=6vVnmlnoolϖnopSmV3qmWo'woϖrr!Ws3q;wsvo7B34k͒CMUY]tvcvYqvvs7\ P7,%AHs!~xISxA`yxwx4wzyz{W{{yāz7yBxzϷ{w!wyٷ|}W|ŷ{W}}y7}X}`~7~xxׁx 8}~}7x{'׷{w|7x)؁[x#zIX|#{7|[8w~{zWzS8{Uya}|}G؂wzqwy؄x|!׃8%};8mzww}W-x؃aW|縈x8xw,O,{WY_,xxz َ؇9|Myחׇ8)XXzzYؑ㸀5}q8~k}u8 ه=x 8;8WØX5X%ل#XxA}YٓmXX?Q~7ٌG8yxX[Xsx[ x!Xx9XMؖ{q!׃9mXәQ:8O8yW8M&]& }77#6D"&zw83")8kW&Qxx/x:I8ٷw؀:~w'"@:@ڛXyuxZ~:~؊C8噀ٓsxո͹+mzٍy7yy9-zX/ش7c8iY ع+}:yM9Wxۗ9Z]8X|':x?T:0ww3xWxڝZ)ibyCͺ;\97z!x ܰx,.<':#׬]ڱ; 9zky&[eyģI[{xKکGxיouؔX!xז1X;eXex?eyKَm:QYiX;ۊM鼞\!EEz7IX~{'Q&^! p}9YZ("}MS "y_lxfQ>HS=7'I hlN@'{Ej띊[{7*vsž(f'^2ewI\i)#5v,z6hGΛ+~, m~ܢꝍ2GK@`sR!nF|;\-NUܷۙC7'ҝiIV,^W.TǭG eCFӣyM2@[ oT4p$ QXs!g!&oRbʥ!yGbxea^n;\ VtCS!X3ωpEaUe$ GR"*$cJJ4S'S4:0Ϟ|4AbҘJbȒPv*I7a9o3󛒋R*Nj^# c 3A ݊g;c}^7/&Jt5Q YtQ'r@ZV&KB2h&rEX5 ;9]En d CyB*rvuHOpv%)F KMg&%$hr8h3lYB֜N Uj5{h i(5y~%Q&ʩĶG_DC< 9u0O|ش:|Z#}G{(Tv4<m0& i»y _ˁ)&H*xUvd}b,E7 MnRt\.ىb;KEɫG^ŷ1d F[v/(f \[l;p6NEhEڢ#-l. v>apKk Rd)Ng?ҢuF'Em6bTXu:W[ϡUYgG͕T*͗źSP9sy"IW̴FwYc  -Dq%& 2 kt6Xf̳<1(qcΓz&j˒5 TDvST2Ouuzi^뵐q$DjX(:dnu/55 X)&:9 s+ |DwF(vg~ef%lӿY6c52{ 8bb'$>N`"sQJbo]dG"(CP]$LJIQTϡ%0Of u ]ΞC\xˢۅAМjNp.Q$jTJ-3wG)uhL.S~&`Gr`tZt1A57*b^r"a{ }DR^w!,0с#xui#Cb`H%C<&̓{VssUSu[Uk1a"=H3d:*T0r^t4:Ue 75y&:~S`:!g7 lk vFW13S9o50DV3>rF$S'HRAkqX9/A'r򒽤IeQC$g+Oa_@)qG+IODɔFT"&HYSO^9)_WhYjɓf nٖV!1haP,fU9Yyh搘V٘Y9k%ٙ9Yyٚ9YnW@v)yʹĜ9YYڹٝ99tؙvaO`iV T6ٟ ڠ:Z Wn@d ٝyV/0 6mSl&$++zn4zmá/9<ʣFJ BI¤ECGVJYSLZ=zab c\Jbfc hMm pCv ֜i6(2ڢoZ0.ZJSXکy::Zzxv{* ?s8 kux, qz+(꫕6*ʢ6:Z֚yڪ ҧZ J 9/Pu::9 6mcZ3ʢvI;[ ۰ ;9+[; K"[({*k,-zʧ*jފJ A;{@z,H LʯQ zXZ\۵^, 06zi[Tmkk oKgū&oK˷LL;Uk `۸)lc"7~<{?˳B+ #{%~Gʺ:ڬϊʩ+{뛶 II;0+ʻ™詝2Zr̩)ʢ6;[{曾[۾) P v["V̢+| yJۺ<\+l4k ɞ,s(*,.02<4\6|8:<>@B$)wzJhI58Ihkյr05#)n&/K3ithg X.V79oNPmMHUWƼwvx*%! Q亙5Zh3KXfəOWZ܅6EJJ/3:OeRw;uwNSӆTX.:Cffilf3|Ɇ̙ <}╅6xa\`#٥%.#*pu|F8ɕ-~3ϞAy'OBHZװ9E[mSnp7qƕV?Vh\tUAYǐC+fWыiwiTdTRe驷RLMhjړOlSFᆠ]_G"V?sds!o)"]$8݉".j"wQc9V^$z'%OeQ&eQYy^e 9fqNHm >Zk!*rᙧtQ8k>lFtw֘8F6Y5mv)LnTRRYZEjꃭ:0(vktc, 3 %p߅'dZhz=BBDNHM).`!gk >;h&& gl?VX'3FhH3ٲԞhdiPKk \y9/XKrDٸz+J]mr[v_xԚ#ζMDL*gjwR/Z3[V6/ HE4:I+7zE~ˊZO# BO0RPSэxlĮб9jGXͪVլ]<_z>A?7Cu3Oćp#6WVCIToL{cG gghsXDYL%̉&1![JPi~2B}LWtӆycET.U U26MEnw;/+Mr:Ѝ?KZͮvz xKMz|K7~o~LNpu;0{u+ [/3{.A+%nkW αc*1]򔟼xQ_wCD+x_hs=Uk^ ]{zoew׫z$aگ=W(>xR]wW> )"~]ȷu]~HXx`!6X!8f]}5|x ЀЇ &_Q} y7b5o7|PցXzwRng~Uy؀z 0K/ZhZ'f}Xz Z=:xg]~x8xgy ( "Vxa\؅fxY PvXhhjz `؅؉E7]Ȁ+Q -phdX98aXhXN&~؉X~s]/~x'- l؅ (XňaȋXw5x` ȀT J Ѝ$FhȈ腐8[mx明7(hgy"Ќ8]\xxfV"Ɏ|lz\{z|<̾,σle M^l=kˬk V,*=ό{Mm\!#]}L$-OZ8-4|=-:ݫ=W\ԼH?]MJ+=9E ،8\մ^ZQc`]A-ik-G_]SlnM׫z-|WjmZLة*֊ ׆g؏đm֕sCך C|o<&m+ڠ:جۖѪ ymۭڇڼ-۾șM-}ܾJI ]ԍŽm]Ɉ]M=ݣ [ލ ͨ=_ް t۶ʻ[ON˷ <,̑.^ -%n".~!~ϬJ6^~>D^[ǀ~ sPڤTrKZXΠvxrwv>]Ē.>~n莞>^N~n鞞>^5`z|箾>^~뱎봮붞뮾` w>^~NȮn;~]S؎_W_k>Q~f5^>>v A?_ . xy&(*,X-?4_6)$[?@o(_+EOOJS (=RONG^gZ+.lV/eomtc0chZBw?HsO+pge/o{oSOVnwq/^{?OW??oO//k_x %oqȟ_/?O_ԏAHPA<ȰÄN1"E B|G!Eϟ})U<ɒ@GƊ *LN= ȋG8(Ѡ8s:}Ju(ӠV>Mԕ)uYA^dvm̙.6Tc.z_\.ޯ!/.k+_Z9pZ ׶LsUZkӏv<=rꛪvmpĪ 2e֤Yg&.r3gALշp<ߎ>]SUݨwRKKn]C{kwa.N8r&]~[84@TS#A&B 3w=/xo]=wa\z{µ{U]|aYjy(wuhoلgAt#X,XPTm$2P VZ]P:! P }ȩp_E&]L':QSUxE,R̊Yb۵E/QxF)RkdcF8QstdrG[hzaA϶vۭfbuEζhiϽoy# +c٫,) 7'gnw,P#(T\642?#㜯šɔO@{ D|.,LJ3m5,o |׿ޜsQ/t?UTl5p ܓ MqecsLiTLEqmcN TwL^xWw\^7#5WZˣ$6F/=0Orh:nwx3޹MڹJކ3Ί'I;yoW]=Yݺ_m/?܃O:~ͫW~gUh~怷5sRh《~"鍭郉 @J8Ȱen_ p]UX}!]ЀG o#"qxsY]KL~D:x`a2",z{ (&h]"Xz]Y3,olQpTc#';0٣&yqo^ܤ(qbȭ0*g?50+W9FKvђ^ 1,샗L iRj-4Nȶu%d&[I6L3rܥ%f1/Q6dˊu9)`a·e j & ?iDzI? QB#L4Ffz&Ί ~S7"n>ltMHzN^5JeҖ*od(;sBrTSFo(dBNhj)|y/R>JֲZbY(%ԐՄ>ҕ@u13DWfӣh<laUDPbݚ?,X.R#*dZcL[* gX=YZWj c7jlg_ St.GgR'] ]2}%kbr\":¥VS*{rX'_PW t[$;T%rkm^lzFंѪᚸ7!վH\^M6p]XVD* NcEL< U1zDYuord>/// jq{\ʬr@ӌ$n{cp~i'zܽY&Q;b8^e0hsm/+l*mn aS9+ЩAA8zi]/S&FY2\'cv5rE>mQ7[n!(gfY7Ynu۩Bv%i}l*.YB\[yuۛMMq~-ކzN}| WZC:\oINǸu|gH|;%S/ߤ pm4w_uKe/^ovrMp)HDFJ[)=BaN\zG8a:ٟ͋rrߓx r|H:O;ղ.6c]n$׃y2'ww~ڳzOl#>'/h&KK(lhο=AgXՑs6kp)tXUmc~[?#yptWNuzcM݅m&q\qhvGҖ7'T'elx*Sho5~:ur|%yw(XXw&(W}5Ay#Hw|9|&%47(g)r=Fw8zw}N.:cUY[yuhgBPFY@8wvUWa\fDʷ&ouNH5gw;}&wgbwymWjDž0_^b`,t1sqe'Vf%#LjP{''{xGz|ń-(Dć8{ W`xԇgS8odžX_Z y$ꁍzHy'Lp3&HBX(1h~§y)yR WvgqFk6LE"VYoCȍ(uU72tfBELY_bGuWg8Y?_vb׌osczvXKM98 d8yWX, וkTG8%"bx;x{{=UwYj7B*W׈_eO؈MvjEr{g(}fAWyWiYn %I)J0IYi )xTW X©I ڟ%Z ڑȂYJ ʌ]Z Z(aɓohI+:1Xh-'yh8{bE!:#kY'wbi#ewJspR94Iuـ>J5|&~隽i|*,ZpYz>wE|چ )ssل:ɕrYʡ$ƛ8Ȝcԣɖ^dBajt ڥ%ȝiZ-A `3Ykܚ2xqFz4Zݚ:"J l8ժF*{*ڡ9$DƮj*Eqfke9K CS[0񪍨;hHS;h§!aD'O;)TuWe^Fƺ 9,vQQdhk6ziB.{꣗鴞QZBf8um$+j xhHN̩Iz`y%wB饒.趣kFUJFaL{p+8k SZk/@۹'ѸIit:+0<}ʌ{zG9 !^'|9 WK0˿7bˌ%W6b⫡2 '{PN:XaQȌ24K{E+y/L[ѹ3ܿ[K,BŁì+Kj?K"ϳAp<WQ^eKl ySuxɠZ"h2fNO{vj{׵[exeq:Q+UW{)YkG̖kmgc|wl[,7,uT+n#| |yP[hO:8klhͿ|NLlB;ʟR ͽ,hkQK]]j?Ap RlW|Ιd}.QF,̤<R2RmU{[y|Fc֡ڤͽcBNNI=w@!;nP@"0b0C@`nPƐ!n#1O@PPӝ1m<`pup*>cnf N ^@ f0Ps fPY.M{"H$~}@ @pfsc=VtJզ.(PY .k =K.&B|8fp`0Ӿn 舀ܫ\ɾ'+]n 4n @@ňN)!,,R H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\㒗0clI͛8M.Ç- *tIΣH*]*p'ϟC}ɴիX9.SLŠE`Ygqm|l=xv,صr}kvoY :݅E}ź7IrPhKvdfxfOMYjKF{랎*_X߿1sv⩍ۅ\xp]KuչoF>߿˻oyq'o/2-W9t%ǚuBI{)xש}Eaҗ{7߁^ 8[T%lH6*W_'@>w㎎A$yB(Xz矈XblGF(cR8$/cp4 $↚:b|ٱaHHQdv^8dh#AwYf؟z5(s柜iWiәe{\ i8W+)Bx#yX*jjdjSzlyܡKF"B笲袟yĹ먝ه]&yx6:wrG"魋bUԬ:cV 7w-W[5 y1,$l(,04l8<@-DmH'4PG-TWmXg\w`-dm6l>g-tmxϷ|O?y.n{774Wn#?uL褗nzwK.zo֬_ﳧy֬.|ӬW7o|TGg/yc .ЋHqhLbUrт}tXBrkE66<$'>l$HNc5%C7Г(/4@I˵D2a q2!Fbv0T`ߖd:l4IjZ̦6nz 8Irf1v] @JЂ?І:;IъZԢPh'6юz HGJҒ(MJWҖ&^FӚ8ͩNwST= PJԢ?QԦ:)M*TJժZRVծz4^ XjThMKֶͪe+\JWʵx+U׾|`UaƂtlc!+l_1ҕ m[A+ҒMjWIlgЋ\nw pKMrVЍt+YimZvj׻xKozˋ׽}|Ko~׿O&N\#xv0,Sΰ5\cx 0?,#NU\bg_˸8cc8?ޱWLG62%;OV2,*7G.`L2hNל9p{q,gҹn^L^9Tޟ7h?^h5a C96Jg Cc&tM'0ҡ6uaZkVuZQ[ Դ۫a\7/5b8TkNAO?Mw }=fpVऋ(iiSvv->`bmli[j־uٽnv-V7ݝmUkZ(mٙڲwNW[{Cj o5qD^|8pkzwW]szO]O;I,8+]_yqxi\WUO嶺s j?mqC-K/; g^ud4̻ p tfyJ<=ݩ9.[OϽ3_O[?msG_}w+ZUFFe7?oO~7'^2D{7 H xW|g~x| ( ؁A h)HH|؂ķ%h~*(8h:h![0Ag+G +׃HK[C(|/XWL68+8N58"TwhX2(PXfasg凇׆n8^hrH}Xq[zȇn؅xH+[؀gxׇ~fEoH~h\Nh(HoN(Np؋8XxȘʸH芨ȅz84yɒə{f ȕ3o6w r DLJl|9fUB2 a:X]\gIDG™y~S)ڹQɁ!Hy~Yg)9\9 7z7 ۩\ڐ )IA]Yw觅#:F):h-9H}9YX*\ xiJ{AhIT\NQS՘dMyhjlbiJ rzGuɧ5 !I两8 ,ڢڜ6ږ *^9םy/J^bz}. '#iAjE{~j{>بk ڧ/ 8 Pi)eɡ4ڪժ*|IJIi *z9Jz{a\]ZL_UkMmZ{~ +~; ˭{y9Z{dX`zWYHJzͺzk: ڳ>+Jz>I <0Ju6@ :⩤*?ڵBkz1bʮl4JJݚ}GZ*ZLKz|8{(*Z+g =';:q:+(vʲK~+soO Ѥɱk˺-;ɫۼƋ/۩ʨJkh5kY[y ۶+jCxY͹mKm j{J{Mȴ:KI;e,ž `I'L#+ %,7-RK1<ˬ{ Mk˼pFnSz)`;;d\f{Ű;R<_Xl\nLO,kU[;I| :*ӊkǏLE9nk3lɛój *ɞs:r˘jGʮ7Z{:,u ˋ ɾ,l! ~L=Ǒ,̷Ǭ\y[u ws\\\ jȥ[`ez]iDyå = mʜ^ѷK㉖˿Aظڛ媰( XԌe*3-} lň5;ݚ(*ԴѡԜ,xڊCL]\ZI=|I]lꇢ<=ַ ,|Kˆl6< ؁MuM-|p|Lĵ،=A[ώ6}-b<Т=ڤ؞|\|}tYЫ B̯MiO}Ľ]z؇Dދ 1~U:㯭ڬ=l"ٰ0(NĹY봈WH|\ݷ+qݿi8iwU.>ܤs>҃Յ{.%[$/^ ?NMny鹥ҙ0.}ͫ'Ҽ.{2翭 ;:ĠNiuj^N^솽CT=~-MH㰗j6N\@E>GPn%S^~I|N]KqYFnZ~>>;u>O(?nc)=OzY5 ,e^~TI_?>i^V ~!,,R H*\ȰÇ#JHŋ3jȱǏ CIr?((S\ɲ˗0cʜI͛8sɳϟ1JѣH*]T}PJJիXjʵׯ`ÊKٲNg\˶۷p2KݻxL2߿ LÈ+^̸ǐ#KL`P,k̹ϠC֌yӨS^͚qְc˞MׄZq ;#7u#%rãKNrb !ǡ< Ny=zHeP?,u3U~7~QןT1 aVb>)nģH b,qoQșVc> Hfh6;Ș. 9ak&dbNR`IP^\B18uq_0If@ٟhFdBy&4ƙfF!uiz  ٤PAI!Dh`b& nd b)٧jaZhmZiJk k*kVꮷ&[ङ dɶF!hu:kB9;.H#YKm`yqCf©K1%" kגּg[ cƊr.r1|€iqr&nj ^ BD.r9mg"'oS-sz+Z1_(Ci`fAFxGq$Ma곸_=xヂh;^5Cm8jnn 4`7ԍ7:_~xn.9~Ӟ=`<§07_px{}'}m{NXuFgO^U$49=~H@诀L- b( Z0ҋ7z)?FH(L W0 gH8̡Q(0H"Q8$2Dt"*ZXGC}` 8FËdLhF4al#~pxc GzqAڱg}G `3G#ww̕/ `iGbW$ WC uB^.4~sC޹s/aH8<{B +|?|'% ogX|OD߯c~yw~K~|ǖ\TWC uSDSEg$EDL"Xu \tkpԂ.F0itO:<؃>@B8DXFxHJL؄NPRTXVxXZ\؅^U8p !P ` `@&` @0{sH tX P $  0`I@ ?P O װ &0 .#(!p p]+@]@(] 7 {X H p??H=O:pbP:+p( (7t||@-@ |P (@|p- `?@?h@ 0 @ p  3e0 00``.PPeN N` P $` $ Y` < X @u( tu0o N`$px`_`0Y<ɕ0c)ڐ y |i)-ЎX E*m m9;Z0z|h!0Ic`J ]:jː㊳TP.v8{hY88 Z]O)꯾<0O:`dj!o B g Xۗ}Y<=II lH:l  06:\y:yj p "7˖k?y/KUdJ+Jdrغxr( OP @u)ik{huت]i "J : $@1陦mI0e`䘤\Y䨯؏uh,eę+Z!I30 #ڀ g` t蔓<< p m[{) 0ypu8P ĠV)04̖ RyH U:h&P I 7[*b٣[ A: Ɏ _z zH2۔&ke9x͟h x8*K˱l888`|j@I0 #@>. B Ӡ l` PɠIGMZ9h-!`i0̮ۺ+݀Rzæ[K; M"`l9;븠( CQܻ9H 0< 9= O 8Ԧä _ b+pI{ќp(7 FgנѧPyjʡ 0\-;ڨ9|ȍ~:h8) w`, l XmNoHLiƿ&= -U ~ILLh]KZJD0U vyϮ Њ8-d]k(@-&pm +=P l"3R`P @UZk:L ~ [ի{Ǫ+:(Нs|, # Н`(YNJ谳'o p a y # 2xx㕌 ڟ. wÂ헰 3=ޠfuH&*Ļ)ڨ?@<)E+Ȑ 5ULB *POj4TWu# 6Μ+e͘ *SpIt"^hq(ȌTU9xVH8D)SH* !m|8*(U g՟0E©SS&` L.ʸ &L*)1Meu?Ⱦ~ʾ\{{S(F ` |AA(Vz8 V쁌ɈT`p@\'\XDD)NA@UaASD BF@ >n( 6@`txA\9 Zrena  6 E'RX6QcPTp2rU*>QD (Q¹pȜ-3lp4uT0NII,Ut.n NYPPNq@F(é`Q\AX!$C,fA%fp-f]%!:;M@;.Mqa `KM!2UKِbXl0VḦ́Vz.8'Xc IlIS/΋;/vo>8cUxM6 pP=eHBjHoLQ%t\@nC`3CP  0i#! 0@%7 +$SD4ȭf* Tk(` y!V$)I(מh/`\pj Bat"!3I}C>-QCq3ӁY`@ %XAK4 fuYApĄ(BYOL] E^ C-a 6@Q62,*6Xz~,QH#$7$[\%(|$Pr'B14$Tq`4gi,Xm|$aӻ9A Q)n$ iPb1$"r}|x#L[Ձ5("Oƨ2&0$DB0M 8%P"h4V @hn_ @E*pA 1"^=^+|o]B7YfX taF\QOWC MtJW4yy6 5 F)%j"}&pG-~LL׭MkKк rNչB"ݎHHu-Tٚ9T2x MI` '@V0.S,poFB.F FL EI+F!!ANyRxt4 u/jA #PdP+Z 1gH!ĘJ ř `b0~1 ]h V1[ +@?h8v'beA#W w(PT{olC Y:["`Ҕ4w7ɎRPGK%vrJאuL>[^6$DQ4UDD#`+Q0#fLCpX(&@.,l F0Ƃ3T`*)Rbe6B^AV 7(yaxCaAaS.@GSLmM);# h md^?t0+fw P Umosp 8U[< |,V{k}:Ldl6B{yBu RF [*%dUX4H)FPH Da9Sh'$p$" VuAx $<FΜ812濂nL*ئ b@|z;1wB ro2TakT)'Pγun:sك"((GÛ$`sЛq3 \JX"` 9 *PIB">pPgӈ(;ӭ 11AjV HQz`7$:>917왁$ђ[^= (6c978W3u'-) -3 R4QaҜ )rP+*@N1Q9PQ3ސ*@#bo;q.I^i0`#(j!xa;=E*UiF$-[DiSϠ4+k5BG{2-~%W<10QQ. X~KHd$8#0z<+YS@ ,) (; aWpSIC܀W-xdA+P@TQs[RQ i WLj`**  ɍ34"sHow`@nPWl[#kK# gIWhDB-QV W$V04+PU8S]ϫ(t $ $xx ` ,tX7 b8THcP+R:ֈ) TH^81;xЁ:肘 Ԙ@#曁1hAo1VَZ3PX@9 A s QۜobX ʉ1bԒ @ȍQ }0mId"fq [>*hR ز 4TxXbJD#“b Á<؀;ȃjс}c0S,6>@2RB@<8x.X:SWw 3;q0@QHb r>:Q4>bKE (\Yq A;?I":3("APX!=BIhh:(:Laql̞뉝0; I ِPp GH=9<;<(ySqn xx4܀`VVN ةOÌ3.W 8@%!(7(=W Ц>@8_ӛ(LOlX19.ɛ -V*O (`C4L{Sڈ9 e, EXa *Е(BQ;̠DtƼ(y9#v J:61G8WVҦ0EQ vQ[R#0 ַ1uk%2 ـ3x PPR'A1؀[*0c]8`p -Y2+$Ո@s:w؀.؀ۀ>CK)px|%|îq(l*8`ЗDUTN xސRX11ϫX9 lØkx"FD)>e'RpԮä)0YrC{r8p(۩F  $PS09u+Uةi!ݩ^2eXeuю3j i_tx1qET)蹪ᑼ1jA!,tq8ʈS/;%)˔ H0&\qB.9өk.(茥 ЍSJ 2L = 1R(3ȍR315 &ɘB<` WY.aZ{{I*W! xq{*;/۰ M#aeס; FVf>=0ucT#1!+3Z( ͨhbt) HXۋ++cj tOd g5Qrhq-3gt)׶r7U Ϡ0wW|qL<$dl WhY8<箥NQ7wd riOWO~UCCR@ԩP(HBP&L"ABGQ>`%P @%  ȄbeR!I uJB!\H0D+?)80jԌS F$JjũW}ذM2֕|Jee.>JӁ`ꂠWRL05(#sUW2:$M6e„hDh:ر$ }yNU+B%N!ÄK Hĉ 'W1@*&cʖTHAbFBA( Y%7'ܡd(c7#@ ?A3-BE9f`WIԑ Bc1^'?@Ca(RI$ QyUB3WA2rcŭ al`.F |=R}'R)]5X! pd &BGG!p#G$005 NR "lv[napJST ä *AL0(/w0)lR0W1J10 Q((+)`x `?m 6U RfD N `0X8 @ D0K2&(0ڥ&G(^{,es9(S6“d쇂Y)P!PT.h%!|RK("&xЎ҅BA Fb ҕ}D) ~e c RL+im궓-yư0kJ.[Vj ƪnP3]! :QB(  P7ޔqXiz{W. .'( 0µ @Gr8ԋ”q;my0B =OВ@/90 gd[s$0@G h$[/ޒЗJXJ8K ɒ <8A!T3N ¼/lm ^<2(4VOo" 򂀃KipWvtUQUPn7+^q R 0p/_LBB0~ (RfPl ϪPF*N4jP( Sbd/"Nd FpT g!$g=A FQB+'OZPP1PzV"'i  #`D:Q6hmĩc8ϑ/ynIP<,3^8g(n]3?,{ '~@6>] VҘ.@` t6RQJBs0(2畠$]Hp詂d-̨E- ],:*8s-[vp0ҽӒKqgB;*)FEԠ&GYJw4&)K%%cx! C*A h3p # ,P#`^PIHR' 3`} 3 0AT06E F3"h1d9A@P`gp Ḛ4Tĝ)HRlq5_WXV&+U8N22bJN<@d#iL1]A*D9Xݮ`BO@Xi8 HAyF p}#Y!@(GICWܙP@@X^9Gxd ,AJMHHHHCx9Y8Y\)V `1A ւ5!6 ADxj(Y5(,Qh )$K_ Az{x\CmPȒPiM j\Cr9@?(B+BA2,^]*L$4 JQTg"A{)`Kʽ&W3VxkxYN'$[@(4 *03A/dȂ<3^AFЄŔlRh xxP?-Rj ~ @I8C0`.*DUBsOB`W}BȔ |F Z Iq&՚;d| `z Ԅ0 I&yN(T .ƈZdcaDb%@"*(P@36A @7C- EVGi\8@@py嵬 l \JJ.YJh| n"‚ԩ@0x.g^^@000A6gs>[VţtK _8R]L0VdzYHNY-,TX+4C4R2X4M|@ڡ=L+&uO_$q}DExiBו:*>'+iFU!Ad1ELlL]v^e NDJdv~SvYI HU\a˦ a>xj8e 6i ,cʢ#4@GWKP.E.LZO|׽7E%ȃPk F3ʌ3cI62L$, q=C%D> B f&WzZObDAR(Xr1]M[A`F+! `uzW;E {l(*$*B k$p$L2A1 `mFPA 28g$Q]8hՅ )IzIQ @@h Hh$4C9E_~d*BgmF1+&(s|b1`)cDKFV>x%Bk0"@*> C& PZ\QΔbK,C=鱎|#BU:  s-həB YTCXpR#`E%SD'pB j ^ 3H*T@ #Fj1s3X)2ԁx[t G(>d h$3ɱ+ [p6OtCOPXܖ(DP+gq`m;Cd*@%Ljx2t&@Fj1| x1,h񱈥` %E IR $!If0 HҖPxK`:@TOnš- ] x NMdBZ|)M)pFz 4BM1!BUviMw6C h@Q@PHHB YBch O!hwQf_bWl T`?1F$$&.G*'0j L҇ ɴB++MT DZ xeQZx㙴*<|Pz(ap ~.}Q`1 rpAP67 !2U9O ,nt6l gP`Q ,[)@H.&ipN`Z&hWXNO</IEgCӋ)f-sPL͢d8SN.tA,p YzCmz&>DV)1G`tu#)Zn$DA 9@PD e30xd`KYȣXԍ203>۔ $>T*v 6MQ<@  XEe :^nFhE5lL3$!\JWLF1X$bF@0a-cruv˅SyDpԧΖa@`$ eLktcBnФ%~\(= KF`^L&AZچ/_ VZxgVb?'.daF$! `DGxA $b% Z*bOKX X pB,HNO ,v*o l0PV1j#jV ij *9aXGfQFz ew@Ɣ  UK %D]g F`0LD ',=\❤ȅl. aPz6 veN GX". &.bBP"Z%IGt+1 .>m ؒUpV`%D ΄`AN:FG&zA 6@V en1ޠ ! Ja~@ ΀ ΐR RAp BnhJrb#R~Vr20FvuZXApucv 1l)p d0~ggAL`"]L@5\BH#=2~uƂ,!$t v| ^ F!ZQآs[lB(gh/lKAoR@^3.TӴVt.B,fuX  `X@-Nk 3Vd(IKVNEL/S BB`?aC $@ Bt53 P`` T@@D:AG&mx! x , & ;K/"X:TPAc9e<(Zc~@KPr WVk Fd z!zvv:1L H!C,g?$ (@^]w LcL],sB%J4HW\E&~ 2tv(Vo,%\Q \֕T+X\T o6r{ZlC]1r̅ $1EE ,u!`:btGk!V@" zAVIBn fC$F #>u`n@Gf ̡̕j+Zd } )\xd8Ba 9j5tpFv)'wjo*#dqƿfP 0$ J6,.fc΁n NC?uRpKJdeD^`%FTj"2#5!r l4t@zj Ҍޓ`JaQ,G01 a$r ȠBN*tDK6-V +0Ɛط R2oZ Rxt:G~[hV5N)F7P |ANO<:wV`XO>H! N?,WA[FnB@~׭H4AD[yBG߬EtjMT@ a 9aJҖfA XJh2&/#= chZVHL78ʡBaTd:LjT|/&Vc`LFYxA RviY/L F Ζ"J:)7.vHh5q@[Bn^Al⎠خi 0k KΏcag F6D^.GRzvBK$2^5 F<84oP0(GVQuQBެΞ`HOhiY UT| Rim͌ZrΆ:5Fy4AhB 7`cK6S+V*@Sd\"0 ;\6fY ǀNd! ހVU@$#hoJR(ȄdnC @1IDڄ0gTsZ$o>A'LElpQLjG^ f*)Ȏdr񙈱._7.gfA{A6 3ai&;H.~Sj(AP&FBl$%:6VcnRV  dg\<C8%8XF>Ҡoa٬- N,( X?S!2WnV xhM9F,$0С PjJ4dĠV<8f7#3H%tL5^2+i.[ES[{ޟ=ˑ`=&燨9^ 2g #Jy@6KD<.r)EN>N)L=vTQS$KᚠBkh+0 z`ؿ{< ˆ1\P2h0#cHm12Ⱥg*-ʘd(P( ]nj1vfT)J}")hPPyE:7̂ Y _"(PHB' | LbbU"1h%F'RB8''oм/^ɋS /ZX EǏ[`2g͛ei}:&C1Njp0wV*(B+R]v|O L}2 2 BQA aSB`"`w\vT:*\gmFvZj 033Lk+pPBs|PI^ I(& r d NrdҁA~GF E :pC`c0/}t%|tAoa1<s0iLAẛI,sB6lñ2>Dc c,SCŜ09:4 .F2 8\S@vQ=Ad4,Ԁ,"/u@)+Bt/(!x\)ŀ[1GWpʣ`RX)"+ޝ: jᢍ8hi>h Q[*}'ƲX^ 2t$(@~@v0r E)+)(Ѕ(+q']H #,`K0J Ѕ+R(!< L['BmCXY57JApD.CJxe$` ` !"h*0 ApplA(x`#r31cFpr+dFuCl!/s`0 2pCP;  nr=\CH`i +n/YL H[3A%R8Ib -NJP#E/MƘ3@t1:, 26xXv(X h[(h o }0 ^VA]-~"F_C1 :8Cvĕ \U9g*s7RЋhVhX`؛<.wrAx9 HwC&B{b@= \ 1o+&'A)Od=OIW'2 NPDP71o}ؙ>h!@MB g([Ird0 pt$ La oI2au)VaC P:=ܢhƆAo@% a( øn-V&7SBFC!tCYh!LلJPA2<#$rF1<`IbMi<K$P^4A1o)tx$I1 $CJ:`JY(H0Mpoֆ cVڙq,fQYRN 2hgh@t@2p$O0L|6 X:KW^OW2u('PQC+UQpX`Dam@sU+$;?9W{,ƍ):dF[F4<F+N6)HtQ"CQ5췞~ ~ {U@ 8P;ȲA,6| @jPDr\A $ c'v & @-ّu'uk[dF#*?`H4OBPll ѐc +[ $,BDҠ߱ U-e0(p d\|00 t|>  qJ F1/= ugpp ?d` B@ 0L e 9Y6T ~s ~0gAs].rQPoABC-|FTÂ\ # g  0 " Blm3#HP-$@^ `.0:X2_"wqkHD%k[}p:upG p \ yF@ "t4Jp  â:// X33I.d5RP$tp ,9Ve҃D7B7:\Pi &J/Ns 3@FsquTr ~w?)@c`<sJ0^#& _(x;Uґs[[ @u@& P i ]#:8p!8# BR51 |BpW$.`'v)H8-ky,)xg_8֏(BB0BDx t@`)`p : B ,+%yqP-f(:"X~V QN%UP̠8 t`* `4:ph7p%bL {C7 p u5f" p@h8P $C2Yta\?'?? @ 㜆u mxs.(;âj1 `!0“..A#@ 3@`&7l(]UQ5 pЁv ))&u{IƳ8妚|Gh?p=p4`H :PU`: g ) & t - kL3#b9  >~E\ aЃGciP}|15-T4dI`P  *g.$~}]Ɖ! @`t@Llhshm3q]PQOa4(P jr ݈7qB 7$pǡ-=Բ,$/DQS Ez`)`ak Ac4,ɑ6BEw} F" F+@5X\HhS%d x 0_HAaVgc tR@ `f)K HIQ G]pqB&`( wtp~ #C+W?ud+ۺ"tJ P$ |â\t b4q%T#< I+:p$#N0}2&l0% ~R#8|$0R\kfJF/3,[OuJt{ "dO@   `PD8yzaUPtbcr #V˸A$jwK ~, \0@4 Bb 85E K0l'l6|'$WY!u2<2H@+ALPb& @qmHWAm+] .bPo?[~ԩ'C#0Ip`-0)MzO282e^UR%)7#;Y-{8&{.yqĘ @ N.YAJԆn&`J8!T٦BO%`|AKBd!onYR үYBV-&x Wldf`:S VP ٰ@" G*T $A3H~6Ɔ۱BTA[Ӷ$HAj3Զ0!w5%KnE9e)[ppaZ,i|w6FDtFǧ? i>S$%-?[!U%TeűVͥ&őTyT :Pmkhq`h5 pqFy(a!Pin: xV'P؅j ܪ SV ] ' d*  lH, ÆK(Po_\CЇѶIU T#CdXI{6` @)SGǀL,@ "!D`6 >#wˈ6e ƒc=gh &@ ˢ|D4((B`pR0ԭD͒$%#7k*UOD=PB`q8Y+;2r*%XjB]+ ``4P>|I#xöHSu SVW?€ N>@N$=@  Ϻ \p` 6 MYB pc)uanW˵iN.! G.NZEjNnq 0'+*[s("@D,jYts'+}װ|Ѓb bvsɀq`TD*Va1:жnɜOr&B?@\'ڎR"/Jh|=?ɛ˛>4~f`p)p;ób10Z |,V|R] @u"J5ISxA$ta؝C-.;ZL7|' m8)m_{Gk:(idZ>?0HP`pC3̀D7a=;1CZ XW.qO`Z8O¡E OzBbdPe)\ QbNF(Zb'#Z9F947nY# UV L=MTtz>w821jժQN\JaԔYM\y$$I" V!i)R$ l(sPfA`Hhjը[`p- a L}R`fF\r|A> ?'?z!I dvL0TV0i` ۟Lu sA> P ȐRL8n Z~Β'#3rWCBzpEhɢjȦ` 깅 | :lq1i)bJ^YnIq>eD)kSD0L!^YaP3kRB)EVD`QN9EpHE2H->!K@^H Rk!604S0(ŔRJYńʪ04pVӏ5Sm5砓 }HH!~pdAVYjeDO`e 肕QAU D!C#pKuMIkF 6K&TB{%Ϻ 9@ %tСXb;4NFXhyx%zYf v` *f `JMNVZƙ+Ƞ:j@ hOB`-DaP>Q8tpEkAnKA r5b@FpkF= P^N˴SL>J-/?Yq(e6C碛 9䃏.hXZ>_x !WNa RPznHvenMNzW# hR"Xܰ rh&"X,_QqfI?VO%TR`21!  La (PBG2J @ɇ1ZӁЧqI2H(@ M7# ֶ'n-p[ AEސ`Q3p^М-'V[j+}@  \QW p(D 8  HQ @+0 * 6 jS) ]gN' LEt dg`é,h‚(AC $/v_+1:HQpT`=D]8+,l" `v  ( A%2A@ 8ۂ~!Laj 6Ґ)V'xͦ!i3g[$n .0 ]}aWxڞdc+ h]W F>yC`N@?V-@Zb,(tc!P M ]H؇*+bdjPdq6r&佲ш-ьf 0+lۈA-a0H q mTCJ `m)[L0\! 0[$%G#Z#*L@U!߾4 l [ YVq ÊF ׃# Fn! 8:C0A*0*Щy_@]hGA HdG./D i̦+:ƻh0P40 D(<#HhBA(0} g>@/##ӸeX,`4X$@ TH!5~ psJR @Lq18l.fN\ 3Kԏnјap틠RN! R#@g[*=c0ءE 0* WP`i '~)#s68407x^H! b ## sCˀ44S:e'[] p-(>[8 1R ^6QD*SWZ $-Aȓ;8?ixLLIc2ʯQaj PIױ!k.F i@SȃSpGpPH68c#cb؀7xYP*!:>`@SW aX<WPzX0[8#5<!aPi0 Cb.m۶r^؀<(J%H.@>;qAI9Sp в@xX"KLi!h '8i"Q@@iK`<:\O qi<8KLDD4YI|h`٭⨿Q aS4/xMf*@X`3`kym0p%8WtChȀ/gTB4۫1+bXje8H(P/ܶYXȋS8q 9-S@LКPhP@ k0FՠVs(؏/u 0xiuܝiA>ӣ9Z)GFɈ V RT x 8MFA/1$QaH3`>]@5}l_(xWWjPA$综05u9ClYF EVh)ඇ ̡΃*bPU[fXhXN6 QƘ Qy1!!Sxc 59cO 0) Znȝn0H Z@ "։>_L4`4aYW*{ R\R+J(3(aB5'kʐ; \`a e7 ap,P<@i2lʘ_8q !؀9/N]@bZ_( '@[Xe-(/mW AnrIW?*x P' 6)LM/X X-!J xtIuOxb(&ja ?Q)3ypT68@pcY jRr!1^cFfL@cPY>*;x@,!` y!x IriZ1 _6D%+6_8b@SEbHU+PKm;:7 x0C` p2#hBEaMɔԏsk- P Uc=N( Eq!PJ@+JF{r -Jh#PGp*,&Hu1SCr;S<^Eݫe_@YЦ@=O6l$pf x48ū)Y]:SCEkmm` 0Odx_ h H"9h:lgNIݶ_H[1BG jSp{/hLqJBN Ni BE ?uQ-9KZ4Օ<°ی(ȎR e-2Rhi1d _^z" Th87肌9aӫ.':W@^hнl+Wo`(VO01IhpQ1ȆH&ۂ-Xe+(xUCd[@a(|x6SP <*V ZnɣgK :w)Џ2SܖAsܣ&~ 0`4B=mq%ؠnPѦ9X ne ylNmyC"4TTG#د,YFmZg{"t!12x)?kX":q?u6#@]0N%+i0 1P>#pb`1P# D[< NҀx'US<+ȆjXlkş*/]_h%81g+p)fcohfI®G 7P5q u/- M#4o1=&Z^T.ڨ矛y"Uf[i! G) oոȌ[E+@$%h?p[؂lإl J#84_ȟ7p0!„* Y%Nu6c&VwzbJCc172$ŖBjRX€Sl჋j$-*ƦQ{skX, G/>:j`>$ C[ HD`B'>RȪ)H_HmqS֪imWj?)|>5Ԧ@W_)2U"V *0?\RMz .ҧ")E+YB hH]A6G Ν J0f3O* 4hSUGթb0+nX=f՘F\}4͙CӕmY6 R/u@ E @4npR cp3.a1)} @=Ρq hð@ BB]=PE9gRCFV}=Wj5QE_k@) PJaeuRN5SN`t!IBJ)w]uLa Jqg/Xn)0(CI)tsB!K ,Q1J$2/#D-h蠃(y]%TZ`6j(u%+nc<:ZK]҂(xd>d P`PLd + W< 7cC8``Yf!#(dU,00T(AbCpP+S'"Zͪ[<,/ҍTz⃆ xH蝾+NX4+8c0 ,4g$#(VMD|2>=_FBQ`(@/HY .HW.),K"_~"3&&-S xQB`U@6%IZ1,VYWA`cCT4ͱpL\&Ary`AIZԠZVp7a8 @ #(_ Fހƹ:8+V0A n ̳Ÿ9Ks1#g<#sьf&At_[6p&Gn$!H8(CV%C1E*P: ԄפC`?}IV" QL&X$Ͱs/Th"Akd5(1X 5N2 XXSP sdgO`O=7l4U)auN~P #BxD3gy.n"UG6FikSUG \a7Xt | VM}&蔧G8B fnM@2bl@ W gցyQvgC3s`[49: j<` PF 鞆"CyƅHh-6@ fgZ?@XeA+ 0>+Z6-5)xa"3D3ˆ.ki3+mȌP@7HЍDI9aFԯ~(Nt E^Ȱv0o `΀ T!1? !@4;YbwpQGZցtpm,ܥg0G x# $x4Z)!PH ) BLTEv; d*ܛUVS 6R ҪLhI]北YHP^O U(]&(ŕ'@ZHIY 9)M)@BT+KA/B0Ё,BđР)) 4 6.60PDm&QM{;/lsJ Az,te44ˆXAld2TE8PN5AĀuB=TN`t<4 W1XUҫAM[]yPÅ.ŕb@c0# T (8 :*0l+%XCAB-w'KT(tA tܛ},!@0@U@ Cn  00/P0LN@ωۭC-4zPRs9K8.BTC1lC" # ENOD@D1PǼ9Qt@HF6!- ,OL1X-(Pb݁y^)ֳYD x)DN ()e، 0H)$B0A(+4 TlF\1C)B+/d 5(6.A@0CPd013h6P/$ۼa1.l. psB,:Q2P@lD2$"dP7X a P (%xYӰ WR+-PXzׁ%,u e%2U,WneR]RRPY' )(TA *8롂 80 p@ga 3MeY=?1 I(@j*A|Ru[kUU)0P$ C05r<<@B16V ;zr-\IK+2(-H1 \$#nH2T~F ĀfNK )MFWS2U,5ILYԢ^`X(/͌S)̀ 4 B( @ +A|g/(AJ@8{ԂCxC! A5  B C0H.(v"Rs \-C0 0l9wk/@-g@R-?"قnDU R38T{yS~QSPUXS\թbXbfjR(`_O[D Լ^(B19y Q Ɛ @ j)dG/pN ,0@C&7C T+R[|/"|e*dsZl.p'0R“ւt!/0ʂF4†4,@ ! #\8m h(e(4FWD.Vƪ]`J2ŪT\RIҌ_j-/ /3)Ƴ@ T3At@J@'ے (&#0rmB&L肕AC\ u}g9Ȃ)^,P0},âv-X-L 8E`7C8z%J=3`mʠ_d-ުқ/`.ɕ4٥b/+h eb(1,1REw>g0JX|E+\݁AH@3z @2C0r3.*G.8Õ9hG*P?@:WCP ЁYAnXX7lA<$WQoDDMyδ@[q̯//."XAU/I_6r]nHpb-k\ OEQO.ԃ@D}G(܀+jPH3` Ebz3*. lD1u$0Ge/x9B:ʕfCGq8P N:4Ow- L_1pGS=U H"@eEv+/*"*MÅD ~r@Q]x3gXv!P,A D-N 0)x tH)$5 H\CҜ,3\4se5,C/d~kfâ&޵.|I6@ aI}4XEX@",p{0e2@\@X%.ZoI%HKr_W r#3.4 lI؍PH3`x,G4Ԃv APTG j t|!o.)$./0 ))̣uD0TШÃg/nDdxS1TIMd_4˭pryPBC18 $8RI;B=M ;Hʅu)0*Z$laB`BdEC 6\PF.*ѣBG)sqeŐ?R }4#B)Lej!dKrGLPz*D ?z`# +=Թ1+@WFQ ]VIO›W]$i}t)%TR+FsGİC0j;BFu1(>B ?z %b0&h(\%jiAh 'DP'i2! TX4 aWL>2`ѡ-4dKanH24_ȫ1CKW@C?4xQz`eWH.ސ@$Q"T 4 qF+ƸhZڞAZ 6gYjp4":[xA_Ple^̳e#.# U+l W*iEms-BHL A^C%XPi-$ 1t×Dx!DP`\#\`\>C%>j >xArkKbt@ ~ F#E1*#冺P._, /$@S5 7 0f 83lt9 4gze+84P4j j@A+gV Du& qbX`#{ h!Wb`s^k. ERLQ@O"ʨrs+"7v#6]ZQw%RxlƘ}Q p@j7ȸ1i2YÌaFl\ 1 2a/KWV` (PN933EŘ9[ OgĎ8N 0 -`(Op ,6Yt7-P=Opp< ]\TfU [@#vÍVǦρ#@OptnAk"He)jK&"UEhtVJV.>ܨ $PF1l/"\B#@\ i$-=xWD'Z 73a!R&|( ֈ^ b0 `mzZ WsPmfA@|~Lb>auO[`'J %k$*Q&Nk\dPItQCUR )^aBAp@Va cv'4HB0- rI } 0`%|[q`(z`SB-[#/B ے^22j!i=(GEpV\ڊax\5I>Nч I3/V`]W! 03~>E72 (ʊ#m`Ѱi֧l.!oq>Y|P+> ؽ Ѐ:\a ix D90 CZvUM!+{ɴ Ԭ ^K"nhÍbBʡ-h l - : 2tC5fm"9]p,"yi+ LT_AQ˟8VRkOu+zP7`RjqnY# a /!407x)v^1 ő. bG-Z < dAPZ0Y(vj^knՀAZA.Ā a-,cd {R|B()^P0("*/XM`0|tFB>\뒤&H蠩jd\CX좱EZ--Z$ͯ +~<| 5ia`N` la  Pkx n">hA#@D&* 0θ8JB.DZ"Bn!@~X3@ ox$9Ѐ F`$b\@vC'xyz~ RЀKʡJ \Ȁ@Oepn7fI,P)!V@BnQ Ŵͫ0z`jd52pڍo` N`N` lߜRK>Z/V] P!ܑt@#2ƥ2 1' ( -@Ac):#~AĂ`(B@)F@(` )!VXހ 7Ѐ-$ yRDIZ,\,I VG7Ł j # ^ j)k-l~z曪a14/W2`|=@JR/b˺!"[P{@'Bl409 31Y@ k~AbJ 6B R^f@p 4I PMB 6X`0j?>W.M%:w'łs+Qn(-%L't1Brܖ(z6~d ```vC;Ua pS`S`%D [*/FJ ᴈDL '~$ . .~jkTj4 @HA "J$@^aXdZoC Ia|.xVDDAS'j:H3`Sh%j"R%0oͰ1e~f!lc{ Ρ|R r,-gr'Ob Q6YsB(Z4*TNAt/rHl>E%?jLfId4jtA!!{V`lhA1|0l` k -@ εd$DIQgưB"-ִM -` rѡs8RlnKnvej -|`HRcW4U@&Oprla.{!Q!`$.t"4Ξ<21KEL2GRAM B/B ҄|`0?F`%l> <z&OGM$TbSl87 ABTc/WhI  .c٢&0YĀdǓH`a947>yB @ dfu+LuntJǍ:b6ljiFl[lQ {p.sI&+)Δ/ӼI+>}4jׯonm3tj̞q{$DI @ٗ\Â3ƆY%X @  ! UQrc tT8O (O@)Ut @ 0))K>a AF]a D R8@(lBFJ)񉑇oBB!tAd+]!B((JQ3:Op@G a  ,nQ \!F}d%r 1X1WbCG )f) \A0gMxYg4)tq"l槚 gLP QhG)L1tCXӔѕL*+8PEPX. `Ev V`# x :TS @A^u"*F B8IEC5{ K@T.rBAP(E0:OXp #Pm @ hYnnW]A-s ,;F$aJZ!|@[P]66$fQJӴ9mP6[ , X`7,LS`Y$AN1YR h"]PM@+P " BFn=̄"@vD!Bb8UD i^bvt:s.Ј A!V2YAaYl^Q,n1 #cܿ X vjCa+ThRcZ]fiU9iGKDЍi0(* JLAA'|]@+ p |h@#wԶW:j[&>O>A =t3 @A]G"ՂOj/bX2Jz Y"#}IlKw@[4c(xZDJ8@a^&D!Qsӕ(:BlhN"KLxx7PΐS\he, :Ԣ`'_uWQa8|aJVCVPA2l.ѡdALbb?if@rMS.mUMԃBp#(XxOhDVx`P""';y`F\18! A9_t; QAdCIPvr*ύ[b7d_%Ir  PB`NR$jAj 0>䅡^t`["KX /cNz{'H2S N ?Q4D i{ӛO<@(Huֶt+` )0WxVgH f+C!@hPd2`?tHF-uPu7$bDFW% @ o# w6UI@F&Gp9 }TuK_FS`J''K@43t(bu$Kh$7-n LR5( eB`6w wv ނ{>&8@ /F, F &@d,(!00Fu!rs}qo@ vFh P{tPfd C[8:6Xd &+1rjhS 1 &ʐ7 G0p}3(_ĈLK6jf@(_j"`e rD5`a6PA 0PF} zXD|u&v-d --0B@PM' xaEP']7R/] |B 0Ip-̠;Ā;uqD#]@xbP|,%t1]h%)^ŀI Ő I'@j`S'5uUTŒdS?8iMAYca',05hY p+ w0*ou !{ (T Ќ%-eY6!Pd)Dmh h\8op7g/ *)S 8 `p u"~YKBUU3Aj'7(iK@[ - `aZ:X3 u6 ]J .6l 69P"gQ %ok8yo:آ+Mf( a+paD9ߙbJoBpp QRB`xD Hd! u W"E?#G o RDf^IAj}[`}8GIzTpK^e44Ո,KFg~4Ix"nV,55r9.!, !Mzp0YSuU 3l9eWHo05 +0lm(ϸmPn)*r # c JlplP]t"0 %f-e.<.ղ:*cv%6A&grΰ Z cppsGܐ s?KW\WcUsUKj/ A (PՉCy 0DʘyPbBsR!7`upP9-CbuvY*] :t-PnT,Ht' }Gu`F0S *2N)Z"Q'*;IV1HhߕSICs^6'_Yt2 ij4TK_auj'PE U"aad0 &92  lxpxpo( &#@ Vnd:nEdSp-D y`!P:4: r8y0b Y+h<@ * w>z 5N%5M&[$zi`]0$vA&jؐvfS[PT>Iհ%S^Wp¢,+]ՈqiQ4.j AD%!aa 5lp&@v+` ].][AZ 6uXd).08 :nb-bü#XBe8!M€pZ 37]! 0PtP{d  J`Q3QHE)2ϵfcB&]bs АPi G{¥tvW48}aʬBJ(k_b-6POP cI([9hxMfxcJRά0hE: -DVY[wp`I"b+8 o0  * zt嫫(U!,:`us KƠ;1A I/@J/>1)i>25 ?l?&KCGKVs@~ʝ(M1:'[/.F P 2=r1,  > Ű-_L~Jw_,˝78 ZguTLWH7syB:Wfp(P []H]d5Aid,4.".D6D# +$`0W o#68eHTSVh2h \PP?&xyet } p *@`r@n&NY!Vp ;#~,tVa(Q?D9U,Lo @ۊIess79 ,GiIC"bT[bI@LZ{w >i9Bw0%#@HP Fhp&p -+PJ2FNy@ *h r~۱Ir:! xt>s0]B&nFT9Pԙ{@ y d4QBcGZ/ B - @tV(b˩x)jp x#qwnDP#VO8 d,a0C" Ch8\q~Ja0 ЭȈIgg<"XlA68-2d0iBDŊ`Z`#CvQcǎUXyRdF\SMt@Re)HʾP @1̛.+^i Q֪Ujж4C1[Pc ⦡#LB H% '\ɣ [b '`+ERQhꩨĨõ.pmx z#'Jq2B0ハR>i)hIt2QBQ$IHA^#$p J   B%daXk$W6#и j! C#4> .8I)e:0>.H$;|X0BTS+z b>db?ƀI86r$(t0"\q(܏JBvi&0[1i>ELDf }#H8:WC0 ~ %L^\QBk2 ӮP< 1R6C(Q^N %#%Ņ.NRRPeI8^z6$aBStaxp!O(8Bq Wtx b|5+Z?IBN&$5-FĮuP3.5t=PeЎDuP2JQ*F! @H>6%a+\ L|zr&}0o`(3 .(QB.P%ST`?H2H: L6 xT`LB' zfP8N( bCTun@_h >}";L[ റ *G VF|< :KV2l[>PRP_I*#QԡuK.P@+20fP*3 @^Q)f\q?y(*m]C:{i ('QUvj0,P5=@8W8 )R;oH F8+ 0tPLaaEz)ߠ t**Փ1 lOf`lHm}|>˶-3Wt]^Iy\&qU'QW#ݪ:·P')2@'0$B+ PC wb1`bL@V:azVY1@!%b\L`5@[Wa}x@,H=`E\#R@6+nĀP_\(aG9=NA mNǡC=Bh (x! ΩÞPgATTXF5U,KYLmbm𧶶2VEɅTgs1WCUn]p; |{A7`{xAM1pICQЂj)r}Ic)a"VP `d. 4^(X$}Pz@I$=*ذDmTahJ"`(n0dY< ~ä~X$\JJ(zZS$0aPα|>΢-^|T"a 2:NrM}6z˺L|ܼ.e n8@ ~T5Ap.@|s>B{y%Sp;.a %Ƴ R"ȥ7Xyx7i! ? ;qVx1G8+{!!b@+@^8X!ݘ:肿1 J%'+B"A!ߠ+(@Ѐ3{m ybv33*@{.>:j`*xFl:n@aQ`)`0P/! B xxV9/c-q*l XxAPJ '!@+V%>ȑ[ҁXX`a(b ڍ1e ٠C2p —)7:!.*3_P)ح-4((9z (0pKnqZ;ձ#= h()np~2bĊ ?R)k#{XO`Y G S` ЫRHƢ -y P%R`tȃG((WbMQi,s,wx T}ɹċ^ ڍz+%/sC4[-.dH䳁mC,ZH .2bqry.uQۨr#(ҡ'9Zay)psB'(aMD}P.K'0GVc$KrbȨ! 0Qz`|O׀2JL 밋kхT8'>xn;2t]:*׏Đ>C N!(<QLdB+KC65 3*J+Sp 8J( b<3r$5ѸkJn0$`6 ;ɨE7T0#rp!}={xbDBڬ/)ʣS0QVTbX['dѭ L[m_у@;$%J; 5Z1[֩ Q ^(5P iIL8mnNd/ÈOƠ XD) O 20{)RPHPRQIbP$X 6RB.* )-ƸS*@2X@a p0*9}Z9WxԥUy8c}9%0 XrM^ڀrz Wx6X9j7!! ! W P 4O>G劀Tj0Q_mQPQ ȏZD߃P_[WCt Ϳt)-9+4:Xa  |q pONXW(#yTI£DR8_,HO CphN3P&T Rj{U2Q σr!Fs @SpNpc.(J$eh0ڭ_h@>kh^II)9RY3.tŨ8BĎD'&S4Y Em)(%[4@檜2eW ?aŪm'@S 7KTe+KO͙"56\P!ј?| +p k,4O7X4+yPDI,_eLֺlŭl>q- @me{KоSd~։(y^RH ~q)FVyUhDbn}RhR6c'L i1%hH&o\%\[ʈf`37%ڛK pȃӍP 1^PсH 5 g )n`4g'tBҍ"hh1PqXk:*p0# vMB|m[tBe1~sf@R H1YUR.'8%+.tg4gKW48o@^ѨZ) fhuK^|01X.D7`@Wp^\kp)|J)Ǭ=`]R4`5-Y?qV@a Kg93K(D ) q &))u}21àcTjTN)ϡ.mGl{aGKUkNPb^ޝԣq:PAH6e.$;W[ wf7̄6ЁE c>Ǜp y<_`-h!.(N}fXC2p@ nz&ima |\ 8mӥPn1ÖBqЍ5C~ &dV+8jOYG uTV?%퓉*L(3aC>=7P@b*N@%Qj2.ʹ Q.`EuBr+p ODuB( $ dRbOB܂F%rKhPC:+TS-\GUE# =X|.@xp-@ p9Yn`C[Qʵ_>|8M Yciv9ZglYsfITa]|y &JwUwҐ5 ))ǜsFgZF^e!idF*h)J((UW:</Oq tOOQ + ᕢ[(5t+~ %!hdH",-pd`'T!M R U) TXd-M1ŤpN.i%^TZoQM9a"dwig));E$0SMmwDE(o4s)38`rPsέ2BUުmJRm&PW ,h b+p+!b@?ư` R/voJhK*,<1Ryjw(&4[d r@[L6 M<1^(S%{E%I?-!jggw=e-_46-'uR'=@4\4HVi R)F kiDOUX^ }XA^xC@$H CȀ )ɲJA "Ox X E-x`s+bEJX&CS!CwV7fdG!"02;Ex~ r&h0,K7@>O,;dIf2t 5 T74YT̢V B0)$DB vS"hGO< $@!KS8'ZHqW   A0Y >> nSX^!.?=+fR_lhdAxӁI`^J1xj @=|q#x6RQzcbS@6SegZAsb*ՉNyM`eǩ拊zH|L(hnH=/.Vb Zɛ_UT"* ҕ8m8\eTlS b@) `)$p  &|,nE wUU+B D*$E~: >t/ E0!]BwX)E3(^)H]vm` 1e.-M[ldb^R1 ٻ:A:'45l`Dé 2LUD4 XlE4*NunH@R?{Mmb9x$ |"C>/)yStnJn0H>:o3BLZ;~( 1N<#(H(/^Q!RzY.ui<*xMQLb0;] O@w5;"XHY7z2SR113Kd I0MH0e :@@!,, R H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI⾚+#ɳNO@ :ѣH2YʴSJJKhʵׯ[!^KٳhӢygI9$nЁM =Xӈ^vJ1ۺ ]F6Nѩ "3Ƴ9/>x4&<7BA+#"la'Jka ^`M[D]P5 u޶kpwKLh`ٌ]l8ĉ+Ȝ3/mO_ԅƻTcw! ҠPy!hy6kBC_AxC [BN4Vw&}(Q:B/:c6!%!^Cؙ(DDbIB"G^cBSZz݈PAx@?*Uq }9҇KpIi\Ui%A;6lPiEOo [)Rƥޝ]by1h6G>gREbEmfU*G+ bPHXhFVC6ɠ G뜶Υ须~zBZ $otB"E4i%fZ FhAhīG"FʴbZ;#qMi8"8@kfqjrę#(<4i|BV2`7C[Q* 2  Q9&: L*.M[4rz&rп6dJHu/o[PF6Dqg/R-?U6DEjQVxNR/ 674ys?ԸmJlݝi3olsB/:ߗcΫ;r2N,.Qo*ͷAo;leKD}Bst3Ozv툾:"_dŮ}~i A72Y@D=y4avGһD_cG@ fѠ xƹ:ٝEWB9 t 7ĊN !h8 q E$3-AH,#VJ964p#LDOO,F@(ZlQk+91 a ovEB$  RG;".$9}Oq`4FЇ(5IUId|#dEWe*dAxI)xtD=$6$C*F>(kKE]|V+ʤYrӘ\oHaWJ{i)-)PqrFp;yjWkrNM9ݹ!؄"MO_b>a>uRtO|>|=U ɘ#c_anqxA/B Nd|)M1'ʓX-2>w +8F)]OǿU~Kcc##\X~T6()+cbzsG h6aWG^kJ*rJ@.^pyЄ+:;eydPQ\n:^0k<@RkzZB2/Z̜]*S=薖ה殘KsF$qC:E6urn+i@j'԰vt-\(v!n[OwպGmnyjv]=ktE$vmi:w*a2H샏z#j;fW5j'br臂'!RrU5px|&2 ~|\ef<$Aϥ}b;h:o7<=]$Q7Љiw$CN:{&aO03RbhCpV}#qguZcܪ7 ݘv$%ի~=8*pA/~7oMsS&vo7ϳoV%? JY~gNA+ A͑ܟ}cHU9[Ç^pIҌ=gsLh=FgW|0?#$Orqgh%Wܷv|}q]M{Vr!mg!fz2&_O&NCN7 H#H~wo(X&yQvqeVUs&'En}C~au@}CeJ}1鄄5~C"F}9VM8QVg6ƅq|TiWxf87L3Xo腱`{%RqsyxM PO!qyXh p{57ewuW#Xl 1',&xzʼn hq quh1%䋸 !K6wga(kdgp]2؊tA˸وhm(tI2S]HXPt(9"9SBXRsf3HɑqiX.F\(mh'hhErQ y] R }"='A(وb"ؒ׏!'ed[9IFnxX> j9xo"IIgFy'’NYH@IB9f+Ha-h!gO72eiDg:×bU+;Uw1y}67af)9Rr<29oٖH/!s_wv{8'Q9)SIp٘旉8ISv)@e8n oXтGmًÔ]w{1ɏyDy8F+Ix8虞޸{9aiq7U,bywjK}O'x iKP6UhZU {,>qFB%zPXvpuAk4Hc3b5ʗ~jHU\AZ\axm#.Lڤ4II1å9@΄=Ηf8ע.*)qqʘ'Jq7(&A{5OJftF:h42ڨ7In|5zV'ā"Vn QdP)`ڪ3AS5+;T+uG۷KSZ8纠K+0;?{bƻK(f ׶;(xiz&E;),񴫔۽EՉ ˼Y)D[{A2+Axq+[t]{/$a;  ,,O[ !\ %# )+-\1L 5lq˾6l2%ĸEF/l[K|m;ly|G:Ĩڿzy\|p^\yPc; N j<@UiMY q,ap3:|{܄>|k0ȏ|¶+ɓ<,dɗL)|lMLʼn\ɣȐJ}IS=rf\fb=d]f}hjlnpr%Tj^ x ?׭MI,Ӫׄˊ]ٖ}٘.Y} b|s#[yϣmU , T0,Fm=/ۿzݩ_ 7]ݿM-}[aM})mͫm=ݸ}۶ Ό8]xp  P7d( | ( d` 0!@ 0]]u? (~7Pp hPƎ @ @Ѯ@ @d@|d^  )'p^N)P ^-`-  __odN"P k^^ ?_-cc# )//| `$` $0 Nw4^sK.S 5\yB$ФY#z+fh>} ]Qn$z?≣^W; wD$tݞ&=oܶ94u04$gOB7Ne+T M,v ! IB1_L"F:DHIi%3fmƒ$}r6̀TЕ%GV)KR4%,iBK&ڊ~]n}2 f|i0364E~br5QC#̂򘧓OҀFٍFӌvׄ&;OuDOs'=95uwX%7ٙ'ӟg: 4 E'8)#Dq4}fA:O`"#gHZRJ\L/< @9}m\D9ПBHj4Б5m`?K")(PSRU$uHNUhnQ&KzPjҗCEs* Fq.+cТ:5jvg qzu;Lv԰A)+BV^|Ek<ŊH)-\!JC.X"$w .o}+\->\,us/Rӽns]rwŻ]׼FZNÖ}Žezkm[w-O~ۂfj9p\ `j7[+XMp#, }}ahX-V#N~Aa ;#/50{)Lc _o !X..; &q&g!n0 a%q\5 =o1[$9V[d/Ϧp@Ƈ+hDc9VKv:Ϙse? 1޴gӇC-0#ǫF{-V5\{]63lzŔ]j7ZgfObf37:>2IL}un z&wklCh{][7;־w>KN]t3|x2AK| .j''Sά'WgN8y_,_.rs7+F ғsLxԟټu7۽Kxɾ |ꅦI rC\~yf/?{^g-mO8k#+j1KPo?Y~nbwƻп?v>ok39R^)[ow9Runp2F|,nG{>k/wƳv|O=oOO{ﱿ}rK̺o_7E-}.9 #[Mw$˞P&p`cwu~={j|fkvww}~,7xWt}}c/gJFo!7{&o6/hu78z7cWwFppm6)8+-DŽhuGtItkNBWoÇuSxsQuVa(+sfxhjj(Ipr8tXvxxz(QLJ}HXx؈؈I'4BgX4@hxe'зhiur&v[gbR[y*hh8舴xx?m'mhqɘ[&Zhx֨fw*y#x𸎲fdfz{<zYzF]nxȏ#Y$Iz聹fyňa%{m7n9I~{VvՑ((J|ZǓxu5ovl-YtBHxnىPk|Ivד8ٕ"ل.Yieؖֈ蔅u9wyאV$ƗW7Dy)9 ovgLi Hx I+Xm)xIɜEJ f4苢g{c]dW9oEfw>Yqeىٞ~dԎ rՑtT6-[, -/n ڠ zbyņzʆP'DžK(!jG% (^⇃n1Hz:w9ʁG=(wkGVƌHJezFkI8΅6赛Éb︤~X|xǒixyWlEJ]ZdR<oyPa`M:~w~9{Uuji'x5m5v2tƕ9֦_Fiu gF|s37:;҅.jj9[L$ڭH7UpG궣kozx',LID6ѫ`Tzxt\KjHy񖰷nsɃ ȇ է?Iz||,kln a:hJ:c q̇}gNj[uvo[?x4j`ǂ t|EȪ ڗg+;ylKmL{\pj H )ZgtƘ،"ּ K,6͌˄zň,I|v̯<_ t::_LFA,J\_ѕtqѠ :(Ԃ*jV9E?02-G6}t:2>9BA=FM1uJ=2INER}UM=V]W+Z\-^Nbd]F}h-j>np6=tG9]\z|~G0D;؄M^R؈ؗxwԫ^خ =ٕٗMٜٛ٠٢٤٦ڥڧ=ګڬڰڲڴڶF[9ۼ۾]ۿ-=Mʝ̍}н-=Mڝ܍}ݸ]۱-޳}=M}-٘Mם=^~ Nِ=ԏJ]~ג}Ҋ=$,"^(qq*-.$2^M6::*> B^NHFQJ?sTiv1fś| i,Uc9:Mü`]ʓ1l_l [b^,PX>S>mb w;b{] ~Len\nb r[~~YJH[bfn砎,ypINjtn1j~<ăNp^ٶʿ.~>\)q˾s.UŞRnV~/N(vf%X~N^>m/F[|Ef>q~\n`ۙNZů0#1o3g}漮S0#(LbLPfVnQO~B\`?"dh;lp?btvhzO|`?Q_I5 ?O_]_-o C]_oᢟ!,,Q-H*@i>Z~AdPFyF 9aZ.)dbH_VI}fh`馐iY'{$ɤ}e&(gҩ'UgyNkJ*'r:؟z h詨"بlj٪UbڨIiakߪzzy:+~kJKv mivٶ貶6켎BK.N. %|"[_跸 |f 2n,2!l2%r)8,38c89H7摏{D! 4&r$'IJZ̤&7Nz (GIJ0tdd"UFQh N:|o HYĥ#JGri/qp%^*slL*lb)k<':u"|/|_(=!-o_-FW.0B,+&*Tl k]t_D ßBHl3K;85,6 i1}nn{=#;g򓯜39q/}P¹>Zpwiͼ֯3Q~!r'Ws;ܔ񃔺~ReX΂8,@?IV+xY}foTVmp2ZkTȁAU鶁 xVvՁﷁV\108Xo <7e[}6րnWqsnLV\Z>SVu9EXn%{eWdW\/X]C5]oh<([ٵ3}~Xqhшyeqx1`;#a,&?!NA"#2XN"1(N"1X~M4)RSFDXe..b b$ײ2?gtV@S(BJ.‹ӌvc-˸.H-2"Bt76/"x2؎7x㘌s|8DHb92x (b*N2KX0Icy&.(K"1-3)K5y"7I2HqqBYqr]xWxTYVyX2'\ٕ^`b9dYfyhjlٖntxTtqtz{vw|waՇutJIrvvFzJxHvǔxDvysJyGIuvvF zL7YOzTwuGuzyIL4yJכEZ9INiyũv陗i9YM'iˉyvy`ěiwĞ9y TGY7Yٝdzt9)ysWyzyw ʙI뵗sQGƑ9pi014*6z:<ڣ@B:QFeIjAՇ[b`apML08^9QBQ8P1$rXSW&QC"W(fRbCi짇EVV88nA%.ȀTHT3uT@Ȧh#7BY/eDT?c#VQ>LĩlhQ=gd SJgGiʫ_u|7=hʬDc ׅvGQBk z]%>fx8@e8b*C(FSl֫ug_Os~]:#b^wW1,XK: ; G~L!;jhdf-2.9/docs/footer.js0000755000175000017500000000102112050301074015732 0ustar sylvestresylvestredocument.write("\n\ m01 (int) * comp --> m02 (float) * comp --> nest1 --> m11 (char) * comp --> nest1 --> m12 (String) * comp --> nest1 --> nest2 --> m21 (long) * comp --> nest1 --> nest2 --> m22 (double) * * * The data object is an Java list of six arrays: {int[], float[], char[], * Stirng[], long[] and double[]}. *

    * * @version 1.1 9/4/2007 * @author Peter X. Cao */ public abstract class CompoundDS extends Dataset { /** * */ private static final long serialVersionUID = -4880399929644095662L; /** * A single character to separate the names of nested compound fields. An * extended ASCII character, 0x95, is used to avoid common characters in * compound names. */ public static final String separator = "\u0095"; /** * The number of members of the compound dataset. */ protected int numberOfMembers; /** * The names of members of the compound dataset. */ protected String[] memberNames; /** * Returns array containing the total number of elements of the members of * compound. *

    * For example, a compound dataset COMP has members of A, B and C as * *

         *     COMP {
         *         int A;
         *         float B[5];
         *         double C[2][3];
         *     }
         * 
    * * memberOrders is an integer array of {1, 5, 6} to indicate that member A * has one element, member B has 5 elements, and member C has 6 elements. */ protected int[] memberOrders; /** * The dimension sizes of each member. *

    * The i-th element of the Object[] is an integer array (int[]) that * contains the dimension sizes of the i-th member. */ protected Object[] memberDims; /** * The datatypes of compound members. */ protected Datatype[] memberTypes; /** * The array to store flags to indicate if a member of compound dataset is * selected for read/write. *

    * If a member is selected, the read/write will perform on the member. * Applications such as HDFView will only display the selected members of * the compound dataset. * *

         * For example, if a compound dataset has four members
         *     String[] memberNames = {"X", "Y", "Z", "TIME"};
         * and
         *     boolean[] isMemberSelected = {true, false, false, true};
         * members "X" and "TIME" are selected for read and write.
         * 
    */ protected boolean[] isMemberSelected; /** * Constructs a CompoundDS object with given file, dataset name and path. *

    * The dataset object represents an existing dataset in the file. For * example, new H5CompoundDS(file, "dset1", "/g0/") constructs a dataset * object that corresponds to the dataset,"dset1", at group "/g0/". *

    * This object is usually constructed at FileFormat.open(), which loads the * file structure and object informatoin into tree structure (TreeNode). It * is rarely used elsewhere. *

    * * @param theFile * the file that contains the dataset. * @param name * the name of the CompoundDS, e.g. "compDS". * @param path * the path of the CompoundDS, e.g. "/g1". */ public CompoundDS(FileFormat theFile, String name, String path) { this(theFile, name, path, null); } /** * @deprecated Not for public use in the future.
    * Using {@link #CompoundDS(FileFormat, String, String)} */ @Deprecated public CompoundDS(FileFormat theFile, String name, String path, long[] oid) { super(theFile, name, path, oid); numberOfMembers = 0; memberNames = null; isMemberSelected = null; memberTypes = null; } /** * Returns the number of members of the compound dataset. * * @return the number of members of the compound dataset. */ public final int getMemberCount() { return numberOfMembers; } /** * Returns the number of selected members of the compound dataset. * * Selected members are the compound fields which are selected for * read/write. *

    * For example, in a compound datatype of {int A, float B, char[] C}, users * can choose to retrieve only {A, C} from dataset. In this case, * getSelectedMemberCount() returns two. * * @return the number of selected members. */ public final int getSelectedMemberCount() { int count = 0; if (isMemberSelected != null) { for (int i = 0; i < isMemberSelected.length; i++) { if (isMemberSelected[i]) { count++; } } } return count; } /** * Returns the names of the members of the compound dataset. The names of * compound members are stored in an array of Strings. *

    * For example, for a compound datatype of {int A, float B, char[] C} * getMemberNames() returns ["A", "B", "C"}. * * @return the names of compound members. */ public final String[] getMemberNames() { return memberNames; } /** * Checks if a member of compound is selected for read/write. * * @param idx * the index of compound member. * * @return true if the i-th memeber is selected; otherwise returns false. */ public final boolean isMemberSelected(int idx) { if ((isMemberSelected != null) && (isMemberSelected.length > idx)) { return isMemberSelected[idx]; } else { return false; } } /** * Selects the i-th member for read/write. * * @param idx * the index of compound member. */ public final void selectMember(int idx) { if ((isMemberSelected != null) && (isMemberSelected.length > idx)) { isMemberSelected[idx] = true; } } /** * Selects/deselects all members. * * @param isSelected * The indicator to select or deselect all members. If true, all * members are selected for read/write. If false, no member is * selected for read/write. */ public final void setMemberSelection(boolean isSelected) { if (isMemberSelected == null) { return; } for (int i = 0; i < isMemberSelected.length; i++) { isMemberSelected[i] = isSelected; } } /** * Returns array containing the total number of elements of the members of * compound. *

    * For example, a compound dataset COMP has members of A, B and C as * *

         *     COMP {
         *         int A;
         *         float B[5];
         *         double C[2][3];
         *     }
         * 
    * * getMemberOrders() will return an integer array of {1, 5, 6} to indicate * that member A has one element, member B has 5 elements, and member C has * 6 elements. * * @return the array containing the total number of elements of the members * of compound. */ public final int[] getMemberOrders() { return memberOrders; } /** * Returns array containing the total number of elements of the elected * members of compound. * *

    * For example, a compound dataset COMP has members of A, B and C as * *

         *     COMP {
         *         int A;
         *         float B[5];
         *         double C[2][3];
         *     }
         * 
    * * If A and B are selected, getSelectedMemberOrders() returns an array of * {1, 5} * * @return array containing the total number of elements of the selected * members of compound. */ public final int[] getSelectedMemberOrders() { if (isMemberSelected == null) { return memberOrders; } int idx = 0; int[] orders = new int[getSelectedMemberCount()]; for (int i = 0; i < isMemberSelected.length; i++) { if (isMemberSelected[i]) { orders[idx++] = memberOrders[i]; } } return orders; } /** * Returns the dimension sizes of of the i-th member. *

    * For example, a compound dataset COMP has members of A, B and C as * *

         *     COMP {
         *         int A;
         *         float B[5];
         *         double C[2][3];
         *     }
         * 
    * * getMemeberDims(2) returns an array of {2, 3}, while getMemeberDims(1) * returns an array of {5}, getMemeberDims(0) returns null. * * @return the dimension sizes of of the i-th member, null if the compound * member is not an array. */ public final int[] getMemeberDims(int i) { if (memberDims == null) { return null; } return (int[]) memberDims[i]; } /** * Returns an array of datatype objects of compound members. *

    * Each member of a compound dataset has its own datatype. The datatype of a * member can be atomic or other compound datatype (nested compound). * Sub-classes set up the datatype objects at init(). *

    * * @return the array of datatype objects of the compound members. */ public final Datatype[] getMemberTypes() { return memberTypes; } /** * Returns an array of datatype objects of selected compound members. * * @return an array of datatype objects of selected compound members. */ public final Datatype[] getSelectedMemberTypes() { if (isMemberSelected == null) { return memberTypes; } int idx = 0; Datatype[] types = new Datatype[getSelectedMemberCount()]; for (int i = 0; i < isMemberSelected.length; i++) { if (isMemberSelected[i]) { types[idx++] = memberTypes[i]; } } return types; } /** * @deprecated Not implemented for compound dataset. */ @Deprecated @Override public Dataset copy(Group pgroup, String name, long[] dims, Object data) throws Exception { throw new UnsupportedOperationException( "Writing a subset of a compound dataset to a new dataset is not implemented."); } } jhdf-2.9/ncsa/hdf/object/Dataset.java0000644000175000017500000012654512050301060020344 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.object; import java.lang.reflect.Array; import java.util.Vector; /** * The abstract class provides general APIs to create and manipulate dataset * objects, and retrieve dataset properties datatype and dimension sizes. *

    * This class provides two convenient functions, read()/write(), to read/write * data values. Reading/writing data may take many library calls if we use the * library APIs directly. The read() and write functions hide all the details of * these calls from users. * * @see ncsa.hdf.object.ScalarDS * @see ncsa.hdf.object.CompoundDS * * @version 1.1 9/4/2007 * @author Peter X. Cao */ public abstract class Dataset extends HObject { /** * */ private static final long serialVersionUID = -3360885430038261178L; /** * The memory buffer that holds the raw data of the dataset. */ protected Object data; /** * The number of dimensions of the dataset. */ protected int rank; /** * The current dimension sizes of the dataset */ protected long[] dims; /** * The max dimension sizes of the dataset */ protected long[] maxDims; /** * Array that contains the number of data points selected (for read/write) * in each dimension. *

    * The select size must be less than or equal to the current dimension size. * A subset of a rectangle selection is defined by the starting position and * selected sizes. *

    * For example, a 4 X 5 dataset * *

         *     0,  1,  2,  3,  4
         *    10, 11, 12, 13, 14
         *    20, 21, 22, 23, 24
         *    30, 31, 32, 33, 34
         * long[] dims = {4, 5};
         * long[] startDims = {1, 2};
         * long[] selectedDims = {3, 3};
         * then the following subset is selected by the startDims and selectedDims above
         *     12, 13, 14
         *     22, 23, 24
         * 32, 33, 34
         */
        protected long[]          selectedDims;
    
        /**
         * The starting position of each dimension of a selected subset. With both
         * the starting position and selected sizes, the subset of a rectangle
         * selection is fully defined.
         */
        protected long[]          startDims;
    
        /**
         * Array that contains the indices of the dimensions selected for display.
         * 

    * selectedIndex[] is provied for two purpose: *

      *
    1. * selectedIndex[] is used to indicate the order of dimensions for display, * i.e. selectedIndex[0] = row, selectedIndex[1] = column and * selectedIndex[2] = depth. For example, for a four dimesion dataset, if * selectedIndex[] is {1, 2, 3}, then dim[1] is selected as row index, * dim[2] is selected as column index and dim[3] is selected as depth index. *
    2. * selectedIndex[] is also used to select dimensions for display for * datasets with three or more dimensions. We assume that applications such * as HDFView can only display data up to three dimensions (a 2D * spreadsheet/image with a third dimension that the 2D spreadsheet/image is * cut from). For dataset with more than three dimensions, we need * selectedIndex[] to store which three dimensions are chosen for display. * For example, for a four dimesion dataset, if selectedIndex[] = {1, 2, 3}, * then dim[1] is selected as row index, dim[2] is selected as column index * and dim[3] is selected as depth index. dim[0] is not selected. Its * location is fixed at 0 by default. *
    */ protected final int[] selectedIndex; /** * The number of elements to move from the start location in each dimension. * For example, if selectedStride[0] = 2, every other data point is selected * along dim[0]. */ protected long[] selectedStride; /** * The array of dimension sizes for a chunk. */ protected long[] chunkSize; /** * The GZIP compression level. */ protected String compression; /** The datatype object of the dataset. */ protected Datatype datatype; /** * Array of strings that represent the dimension names. It is null if * dimension names do not exist. */ protected String[] dimNames; /** Flag to indicate if the byte[] array is converted to strings */ protected boolean convertByteToString = true; /** Flag to indicate if data values are loaded into memory. */ protected boolean isDataLoaded = false; /** The number of data points in the memory buffer. */ protected long nPoints = 1; /** * The data buffer that contains the raw data directly reading from file * (before any data conversion). */ protected Object originalBuf = null; /** * The array that holds the converted data of unsigned C-type integers. *

    * For example, Suppose that the original data is an array of unsigned * 16-bit short integers. Since Java does not support unsigned integer, the * data is converted to an array of 32-bit singed integer. In that case, the * converted buffer is the array of 32-bit singed integer. */ protected Object convertedBuf = null; /** * Flag to indicate if the enum data is converted to strings. */ protected boolean enumConverted = false; /** * Constructs a Dataset object with a given file, name and path. *

    * * @param theFile * the file that contains the dataset. * @param name * the name of the Dataset, e.g. "dset1". * @param path * the full group path of this Dataset, e.g. "/arrays/". */ public Dataset(FileFormat theFile, String name, String path) { this(theFile, name, path, null); } /** * @deprecated Not for public use in the future.
    * Using {@link #Dataset(FileFormat, String, String)} */ @Deprecated public Dataset(FileFormat theFile, String name, String path, long[] oid) { super(theFile, name, path, oid); rank = 0; data = null; dims = null; maxDims = null; selectedDims = null; startDims = null; selectedStride = null; chunkSize = null; compression = "NONE"; dimNames = null; selectedIndex = new int[3]; selectedIndex[0] = 0; selectedIndex[1] = 1; selectedIndex[2] = 2; } /** * Clears memory held by the dataset, such as data buffer. */ public void clear() { if (data != null) { if (data instanceof Vector) { ((Vector) data).setSize(0); } data = null; originalBuf = null; convertedBuf = null; } isDataLoaded = false; } /** * Retrieves datatype and dataspace information from file and sets the * dataset in memory. *

    * The init() is designed to support lazy operation in dataset object. When * a data object is retrieved from file, the datatype, dataspace and raw * data are not loaded into memory. When it is asked to read the raw data * from file, init() is first called to get the datatype and dataspace * information, then load the raw data from file. *

    * init() is also used to reset selection of a dataset (start, stride and * count) to the default, which is the entire dataset for 1D or 2D datasets. * In the following example, init() at step 1) retrieve datatype and * dataspace information from file. getData() at step 3) read only one data * point. init() at step 4) reset the selection to the whole dataset. * getData() at step 4) reads the values of whole dataset into memory. * *

         * dset = (Dataset) file.get(NAME_DATASET);
         * 
         * // 1) get datatype and dataspace information from file
         * dset.init();
         * rank = dset.getRank(); // rank = 2, a 2D dataset
         * count = dset.getSelectedDims();
         * start = dset.getStartDims();
         * dims = dset.getDims();
         * 
         * // 2) select only one data point
         * for (int i = 0; i < rank; i++) {
         *     start[0] = 0;
         *     count[i] = 1;
         * }
         * 
         * // 3) read one data point
         * data = dset.getData();
         * 
         * // 4) reset to select the whole dataset
         * dset.init();
         * 
         * // 5) clean the memory data buffer
         * dset.clearData();
         * 
         * // 6) Read the whole dataset
         * data = dset.getData();
         * 
    */ public abstract void init(); /** * Returns the rank (number of dimensions) of the dataset. * * @return the number of dimensions of the dataset. */ public final int getRank() { if (rank < 0) init(); return rank; } /** * Returns the array that contins the dimension sizes of the dataset. * * @return the dimension sizes of the dataset. */ public final long[] getDims() { if (rank < 0) init(); return dims; } /** * Returns the array that contins the max dimension sizes of the dataset. * * @return the max dimension sizes of the dataset. */ public final long[] getMaxDims() { if (rank < 0) init(); if (maxDims == null) return dims; return maxDims; } /** * Returns the dimension sizes of the selected subset. *

    * The SelectedDims is the number of data points of the selected subset. * Applications can use this array to change the size of selected subset. * * The select size must be less than or equal to the current dimension size. * Combined with the starting position, selected sizes and stride, the * subset of a rectangle selection is fully defined. *

    * For example, a 4 X 5 dataset * *

         *     0,  1,  2,  3,  4
         *    10, 11, 12, 13, 14
         *    20, 21, 22, 23, 24
         *    30, 31, 32, 33, 34
         * long[] dims = {4, 5};
         * long[] startDims = {1, 2};
         * long[] selectedDims = {3, 3};
         * long[] selectedStride = {1, 1};
         * then the following subset is selected by the startDims and selectedDims
         *     12, 13, 14
         *     22, 23, 24
         *     32, 33, 34
         * 
    * * @return the dimension sizes of the selected subset. */ public final long[] getSelectedDims() { if (rank < 0) init(); return selectedDims; } /** * Returns the starting position of a selected subset. *

    * Applications can use this array to change the starting position of a * selection. Combined with the selected dimensions, selected sizes and * stride, the subset of a rectangle selection is fully defined. *

    * For example, a 4 X 5 dataset * *

         *     0,  1,  2,  3,  4
         *    10, 11, 12, 13, 14
         *    20, 21, 22, 23, 24
         *    30, 31, 32, 33, 34
         * long[] dims = {4, 5};
         * long[] startDims = {1, 2};
         * long[] selectedDims = {3, 3};
         * long[] selectedStride = {1, 1};
         * then the following subset is selected by the startDims and selectedDims
         *     12, 13, 14
         *     22, 23, 24
         *     32, 33, 34
         * 
    * * @return the starting position of a selected subset. */ public final long[] getStartDims() { if (rank < 0) init(); return startDims; } /** * Returns the selectedStride of the selected dataset. *

    * Applications can use this array to change how many elements to move in * each dimension. * * Combined with the starting position and selected sizes, the subset of a * rectangle selection is defined. *

    * For example, a 4 X 5 dataset * *

         *     0,  1,  2,  3,  4
         *    10, 11, 12, 13, 14
         *    20, 21, 22, 23, 24
         *    30, 31, 32, 33, 34
         * long[] dims = {4, 5};
         * long[] startDims = {0, 0};
         * long[] selectedDims = {2, 2};
         * long[] selectedStride = {2, 3};
         * then the following subset is selected by the startDims and selectedDims
         *     0,   3
         *     20, 23
         * 
    */ public final long[] getStride() { if (rank < 0) init(); if (rank <= 0) { return null; } if (selectedStride == null) { selectedStride = new long[rank]; for (int i = 0; i < rank; i++) { selectedStride[i] = 1; } } return selectedStride; } /** * Sets the flag that indicates if a byte array is converted to a string * array. *

    * In a string dataset, the raw data from file is stored in a byte array. By * default, this byte array is converted to an array of strings. For a large * dataset (e.g. more than one million strings), the converson takes a long * time and requires a lot of memory space to store the strings. At some * applications, such a conversion can be delayed. For example, A GUI * application may convert only part of the strings that are visible to the * users, not the entire data array. *

    * setConvertByteToString(boolean b) allows users to set the flag so that * applications can choose to perform the byte-to-string conversion or not. * If the flag is set to false, the getData() returns a array of byte * instead of an array of strings. * * @param b * convert bytes to strings if b is true; otherwise, if false, do * not convert bytes to strings. */ public final void setConvertByteToString(boolean b) { convertByteToString = b; } /** * Returns the flag that indicates if a byte array is converted to a string * array.. * * @return true if byte array is converted to string; otherwise, returns * false if there is no conversion. */ public final boolean getConvertByteToString() { return convertByteToString; } /** * Reads the data from file. *

    * read() reads the data from file to a memory buffer and returns the memory * buffer. The dataset object does not hold the memobry buffer. To store the * memory buffer in the dataset object, one must call getData(). *

    * By default, the whole dataset is read into memory. Users can also select * subset to read. Subsetting is done in an implicit way. *

    * How to Select a Subset *

    * A selection is specified by three arrays: start, stride and count. *

      *
    1. start: offset of a selection *
    2. stride: determining how many elements to move in each dimension *
    3. count: number of elements to select in each dimension *
    * getStartDims(), getStartDims() and getSelectedDims() returns the start, * stride and count arrays respectively. Applications can make a selection * by changing the values of the arrays. *

    * The following example shows how to make a subset. In the example, the * dataset is a 4-dimensional array of [200][100][50][10], i.e. dims[0]=200; * dims[1]=100; dims[2]=50; dims[3]=10;
    * We want to select every other data point in dims[1] and dims[2] * *

         * int rank = dataset.getRank(); // number of dimension of the dataset
         * long[] dims = dataset.getDims(); // the dimension sizes of the dataset
         * long[] selected = dataset.getSelectedDims(); // the selected size of the dataet
         * long[] start = dataset.getStartDims(); // the off set of the selection
         * long[] stride = dataset.getStride(); // the stride of the dataset
         * int[] selectedIndex = dataset.getSelectedIndex(); // the selected dimensions for
         *                                                   // display
         * 
         * // select dim1 and dim2 as 2D data for display,and slice through dim0
         * selectedIndex[0] = 1;
         * selectedIndex[1] = 2;
         * selectedIndex[1] = 0;
         * 
         * // reset the selection arrays
         * for (int i = 0; i < rank; i++) {
         *     start[i] = 0;
         *     selected[i] = 1;
         *     stride[i] = 1;
         * }
         * 
         * // set stride to 2 on dim1 and dim2 so that every other data points are
         * // selected.
         * stride[1] = 2;
         * stride[2] = 2;
         * 
         * // set the selection size of dim1 and dim2
         * selected[1] = dims[1] / stride[1];
         * selected[2] = dims[1] / stride[2];
         * 
         * // when dataset.getData() is called, the slection above will be used since
         * // the dimension arrays are passed by reference. Changes of these arrays
         * // outside the dataset object directly change the values of these array
         * // in the dataset object.
         * 
    *

    * For ScalarDS, the memory data buffer is an one-dimensional array of byte, * short, int, float, double or String type based on the datatype of the * dataset. *

    * For CompoundDS, the meory data object is an java.util.List object. Each * element of the list is a data array that corresponds to a compound field. *

    * For example, if compound dataset "comp" has the following nested * structure, and memeber datatypes * *

         * comp --> m01 (int)
         * comp --> m02 (float)
         * comp --> nest1 --> m11 (char)
         * comp --> nest1 --> m12 (String)
         * comp --> nest1 --> nest2 --> m21 (long)
         * comp --> nest1 --> nest2 --> m22 (double)
         * 
    * * getData() returns a list of six arrays: {int[], float[], char[], * Stirng[], long[] and double[]}. * * @return the data read from file. * * @see {@link #getData()} */ public abstract Object read() throws Exception, OutOfMemoryError; /** * Reads the raw data of the dataset from file to a byte array. *

    * readBytes() reads raw data to an array of bytes instead of array of its * datatype. For example, for an one-dimension 32-bit integer dataset of * size 5, the readBytes() returns of a byte array of size 20 instead of an * int array of 5. *

    * readBytes() can be used to copy data from one dataset to another * efficiently because the raw data is not converted to its native type, it * saves memory space and CPU time. * * @return the byte array of the raw data. */ public abstract byte[] readBytes() throws Exception; /** * Writes a memory buffer to the dataset in file. * * @param buf * the data to write */ public abstract void write(Object buf) throws Exception; /** * Writes the memory buffer of this dataset to file. */ public final void write() throws Exception { if (data != null) { write(data); } } /** * Creates a new dataset and writes the data buffer to the new dataset. *

    * This function allows applications to create a new dataset for a given * data buffer. For example, users can select a specific interesting part * from a large image and create a new image with the selection. *

    * The new dataset retains the datatype and dataset creation properties of * this dataset. * * @param pgroup * the group which the dataset is copied to. * @param name * the name of the new dataset. * @param dims * the dimension sizes of the the new dataset. * @param data * the data values of the subset to be copied. * * @return the new dataset. */ public abstract Dataset copy(Group pgroup, String name, long[] dims, Object data) throws Exception; /** * Returns the datatype object of the dataset. * * @return the datatype object of the dataset. */ public abstract Datatype getDatatype(); /** * Returns the data buffer of the dataset in memory. *

    * If data is already loaded into memory, returns the data; otherwise, calls * read() to read data from file into a memory buffer and returns the memory * buffer. *

    *

    * By default, the whole dataset is read into memory. Users can also select * subset to read. Subsetting is done in an implicit way. *

    * How to Select a Subset *

    * A selection is specified by three arrays: start, stride and count. *

      *
    1. start: offset of a selection *
    2. stride: determining how many elements to move in each dimension *
    3. count: number of elements to select in each dimension *
    * getStartDims(), getStartDims() and getSelectedDims() returns the start, * stride and count arrays respectively. Applications can make a selection * by changing the values of the arrays. *

    * The following example shows how to make a subset. In the example, the * dataset is a 4-dimensional array of [200][100][50][10], i.e. dims[0]=200; * dims[1]=100; dims[2]=50; dims[3]=10;
    * We want to select every other data point in dims[1] and dims[2] * *

         * int rank = dataset.getRank(); // number of dimension of the dataset
         * long[] dims = dataset.getDims(); // the dimension sizes of the dataset
         * long[] selected = dataset.getSelectedDims(); // the selected size of the dataet
         * long[] start = dataset.getStartDims(); // the off set of the selection
         * long[] stride = dataset.getStride(); // the stride of the dataset
         * int[] selectedIndex = dataset.getSelectedIndex(); // the selected dimensions for
         *                                                   // display
         * 
         * // select dim1 and dim2 as 2D data for display,and slice through dim0
         * selectedIndex[0] = 1;
         * selectedIndex[1] = 2;
         * selectedIndex[1] = 0;
         * 
         * // reset the selection arrays
         * for (int i = 0; i < rank; i++) {
         *     start[i] = 0;
         *     selected[i] = 1;
         *     stride[i] = 1;
         * }
         * 
         * // set stride to 2 on dim1 and dim2 so that every other data points are
         * // selected.
         * stride[1] = 2;
         * stride[2] = 2;
         * 
         * // set the selection size of dim1 and dim2
         * selected[1] = dims[1] / stride[1];
         * selected[2] = dims[1] / stride[2];
         * 
         * // when dataset.getData() is called, the slection above will be used since
         * // the dimension arrays are passed by reference. Changes of these arrays
         * // outside the dataset object directly change the values of these array
         * // in the dataset object.
         * 
    *

    * For ScalarDS, the memory data buffer is an one-dimensional array of byte, * short, int, float, double or String type based on the datatype of the * dataset. *

    * For CompoundDS, the meory data object is an java.util.List object. Each * element of the list is a data array that corresponds to a compound field. *

    * For example, if compound dataset "comp" has the following nested * structure, and memeber datatypes * *

         * comp --> m01 (int)
         * comp --> m02 (float)
         * comp --> nest1 --> m11 (char)
         * comp --> nest1 --> m12 (String)
         * comp --> nest1 --> nest2 --> m21 (long)
         * comp --> nest1 --> nest2 --> m22 (double)
         * 
    * * getData() returns a list of six arrays: {int[], float[], char[], * String[], long[] and double[]}. * * @return the memory buffer of the dataset. */ public final Object getData() throws Exception, OutOfMemoryError { if (!isDataLoaded) { data = read(); // load the data; originalBuf = data; isDataLoaded = true; nPoints = 1; for (int j = 0; j < selectedDims.length; j++) { nPoints *= selectedDims[j]; } } return data; } /** * @deprecated Not for public use in the future. *

    * setData() is not safe to use because it changes memory buffer * of the dataset object. Dataset operation such as write/read * will fail if the buffer type or size is changed. */ @Deprecated public final void setData(Object d) { data = d; } /** * Clears the data buffer in memory and to force the next read() to load * data from file. *

    * The function read() loads data from file into memory only if the data is * not read. If data is already in memory, read() just returns the memory * buffer. Sometimes we want to force read() to re-read data from file. For * example, when the selection is changed, we need to re-read the data. * * clearData() clears the current memory buffer and force the read() to load * the data from file. * * @see #getData() * @see #read() */ public void clearData() { isDataLoaded = false; } /** * Returns the dimension size of the vertical axis. * *

    * This function is used by GUI applications such as HDFView. GUI * applications display a dataset in a 2D table or 2D image. The display * order is specified by the index array of selectedIndex as follow: *

    *
    selectedIndex[0] -- height
    *
    The vertical axis
    *
    selectedIndex[1] -- width
    *
    The horizontal axis
    *
    selectedIndex[2] -- depth
    *
    The depth axis is used for 3 or more dimensional datasets.
    *
    * Applications can use getSelectedIndex() to access and change the display * order. For example, in a 2D dataset of 200x50 (dim0=200, dim1=50), the * following code will set the height=200 and width=50. * *
         * long[] selectedIndex = dataset.getSelectedIndex();
         * selectedIndex[0] = 0;
         * selectedIndex[1] = 1;
         * 
    * * @see #getSelectedIndex() * @see #getWidth() * * @return the size of dimension of the vertical axis. */ public final int getHeight() { if (rank < 0) init(); if ((selectedDims == null) || (selectedIndex == null)) { return 0; } return (int) selectedDims[selectedIndex[0]]; } /** * Returns the size of dimension of the horizontal axis. * *

    * This function is used by GUI applications such as HDFView. GUI * applications display dataset a 2D Table or 2D Image. The display order is * specified by the index array of selectedIndex as follow: *

    *
    selectedIndex[0] -- height
    *
    The vertical axis
    *
    selectedIndex[1] -- width
    *
    The horizontal axis
    *
    selectedIndex[2] -- depth
    *
    The depth axis, which is used for 3 or more dimension datasets.
    *
    * Applications can use getSelectedIndex() to access and change the display * order. For example, in a 2D dataset of 200x50 (dim0=200, dim1=50), the * following code will set the height=200 and width=100. * *
         * long[] selectedIndex = dataset.getSelectedIndex();
         * selectedIndex[0] = 0;
         * selectedIndex[1] = 1;
         * 
    * * @see #getSelectedIndex() * @see #getHeight() * * @return the size of dimension of the horizontal axis. */ public final int getWidth() { if (rank < 0) init(); if ((selectedDims == null) || (selectedIndex == null)) { return 0; } if ((selectedDims.length < 2) || (selectedIndex.length < 2)) { return 1; } return (int) selectedDims[selectedIndex[1]]; } /** * Returns the indices of display order. *

    * * selectedIndex[] is provided for two purpose: *

      *
    1. * selectedIndex[] is used to indicate the order of dimensions for display. * selectedIndex[0] is for the row, selectedIndex[1] is for the column and * selectedIndex[2] for the depth. *

      * For example, for a four dimesion dataset, if selectedIndex[] = {1, 2, 3}, * then dim[1] is selected as row index, dim[2] is selected as column index * and dim[3] is selected as depth index. *

    2. * selectedIndex[] is also used to select dimensions for display for * datasets with three or more dimensions. We assume that applications such * as HDFView can only display data values up to three dimension (2D * spreadsheet/image with a third dimension which the 2D spreadsheet/image * is selected from). For dataset with more than three dimensions, we need * selectedIndex[] to tell applications which three dimensions are chosen * for display.
      * For example, for a four dimesion dataset, if selectedIndex[] = {1, 2, 3}, * then dim[1] is selected as row index, dim[2] is selected as column index * and dim[3] is selected as depth index. dim[0] is not selected. Its * location is fixed at 0 by default. *
    * * @return the array of the indices of display order. */ public final int[] getSelectedIndex() { if (rank < 0) init(); return selectedIndex; } /** * Returns the string representation of compression information. *

    * For example, * "SZIP: Pixels per block = 8: H5Z_FILTER_CONFIG_DECODE_ENABLED". * * @return the string representation of compression information. */ public final String getCompression() { if (rank < 0) init(); return compression; } /** * Returns the array that contains the dimension sizes of the chunk of the * dataset. Returns null if the dataset is not chunked. * * @return the array of chunk sizes or returns null if the dataset is not * chunked. */ public final long[] getChunkSize() { if (rank < 0) init(); return chunkSize; } /** * @deprecated Not for public use in the future.
    * Using {@link #convertFromUnsignedC(Object, Object)} */ @Deprecated public static Object convertFromUnsignedC(Object data_in) { return Dataset.convertFromUnsignedC(data_in, null); } /** * Converts one-dimension array of unsigned C-type integers to a new array * of appropriate Java integer in memory. *

    * Since Java does not support unsigned integer, values of unsigned C-type * integers must be converted into its appropriate Java integer. Otherwise, * the data value will not displayed correctly. For example, if an unsigned * C byte, x = 200, is stored into an Java byte y, y will be -56 instead of * the correct value of 200. *

    * Unsigned C integers are upgrade to Java integers according to the * following table: * * * * * * * * * * * * * * * * * * * * * * *
    Mapping Unsigned C Integers to Java Integers
    Unsigned C IntegerJAVA Integer
    unsigned bytesigned short
    unsigned shortsigned int
    unsigned intsigned long
    unsigned longsigned long
    * NOTE: this conversion cannot deal with unsigned 64-bit integers. * Therefore, the values of unsigned 64-bit dataset may be wrong in Java * application. *

    * If memory data of unsigned integers is converted by * convertFromUnsignedC(), convertToUnsignedC() must be called to convert * the data back to unsigned C before data is written into file. * * @see #convertToUnsignedC(Object, Object) * * @param data_in * the input 1D array of the unsigned C-type integers. * @param data_out * the output converted (or upgraded) 1D array of Java integers. * * @return the upgraded 1D array of Java integers. */ public static Object convertFromUnsignedC(Object data_in, Object data_out) { if (data_in == null) { return null; } Class data_class = data_in.getClass(); if (!data_class.isArray()) { return null; } if (data_out != null) { Class data_class_out = data_out.getClass(); if (!data_class_out.isArray() || (Array.getLength(data_in) != Array.getLength(data_out))) { data_out = null; } } String cname = data_class.getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); int size = Array.getLength(data_in); if (dname == 'B') { short[] sdata = null; if (data_out == null) { sdata = new short[size]; } else { sdata = (short[]) data_out; } byte[] bdata = (byte[]) data_in; for (int i = 0; i < size; i++) { sdata[i] = (short) ((bdata[i] + 256) & 0xFF); } data_out = sdata; } else if (dname == 'S') { int[] idata = null; if (data_out == null) { idata = new int[size]; } else { idata = (int[]) data_out; } short[] sdata = (short[]) data_in; for (int i = 0; i < size; i++) { idata[i] = (sdata[i] + 65536) & 0xFFFF; } data_out = idata; } else if (dname == 'I') { long[] ldata = null; if (data_out == null) { ldata = new long[size]; } else { ldata = (long[]) data_out; } int[] idata = (int[]) data_in; for (int i = 0; i < size; i++) { ldata[i] = (idata[i] + 4294967296L) & 0xFFFFFFFFL; } data_out = ldata; } else { data_out = data_in; // Java does not support unsigned long } return data_out; } /** * @deprecated Not for public use in the future.
    * Using {@link #convertToUnsignedC(Object, Object)} */ @Deprecated public static Object convertToUnsignedC(Object data_in) { return Dataset.convertToUnsignedC(data_in, null); } /** * Converts the array of converted unsigned integer back to unsigned C-type * integer data in memory. *

    * If memory data of unsigned integers is converted by * convertFromUnsignedC(), convertToUnsignedC() must be called to convert * the data back to unsigned C before data is written into file. * * @see #convertFromUnsignedC(Object, Object) * * @param data_in * the input array of the Java integer. * @param data_out * the output array of the unsigned C-type integer. * * @return the converted data of unsigned C-type integer array. */ public static Object convertToUnsignedC(Object data_in, Object data_out) { if (data_in == null) { return null; } Class data_class = data_in.getClass(); if (!data_class.isArray()) { return null; } if (data_out != null) { Class data_class_out = data_out.getClass(); if (!data_class_out.isArray() || (Array.getLength(data_in) != Array.getLength(data_out))) { data_out = null; } } String cname = data_class.getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); int size = Array.getLength(data_in); if (dname == 'S') { byte[] bdata = null; if (data_out == null) { bdata = new byte[size]; } else { bdata = (byte[]) data_out; } short[] sdata = (short[]) data_in; for (int i = 0; i < size; i++) { bdata[i] = (byte) sdata[i]; } data_out = bdata; } else if (dname == 'I') { short[] sdata = null; if (data_out == null) { sdata = new short[size]; } else { sdata = (short[]) data_out; } int[] idata = (int[]) data_in; for (int i = 0; i < size; i++) { sdata[i] = (short) idata[i]; } data_out = sdata; } else if (dname == 'J') { int[] idata = null; if (data_out == null) { idata = new int[size]; } else { idata = (int[]) data_out; } long[] ldata = (long[]) data_in; for (int i = 0; i < size; i++) { idata[i] = (int) ldata[i]; } data_out = idata; } else { data_out = data_in; // Java does not support unsigned long } return data_out; } /** * Converts an array of bytes into an array of Strings for a fixed string * dataset. *

    * A C-string is an array of chars while an Java String is an object. When a * string dataset is read into Java application, the data is stored in an * array of Java bytes. byteToString() is used to convert the array of bytes * into array of Java strings so that applications can display and modify * the data content. *

    * For example, the content of a two element C string dataset is {"ABC", * "abc"}. Java applications will read the data into an byte array of {65, * 66, 67, 97, 98, 99). byteToString(bytes, 3) returns an array of Java * String of strs[0]="ABC", and strs[1]="abc". *

    * If memory data of strings is converted to Java Strings, stringToByte() * must be called to convert the memory data back to byte array before data * is written to file. * * @see #stringToByte(String[], int) * * @param bytes * the array of bytes to convert. * @param length * the length of string. * * @return the array of Java String. */ public static final String[] byteToString(byte[] bytes, int length) { if (bytes == null) { return null; } int n = bytes.length / length; // String bigstr = new String(bytes); String[] strArray = new String[n]; String str = null; int idx = 0; for (int i = 0; i < n; i++) { str = new String(bytes, i * length, length); // bigstr.substring uses less memory space // NOTE: bigstr does not work on linus if bytes.length is very large // see bug 1091 // offset = i*length; // str = bigstr.substring(offset, offset+length); idx = str.indexOf('\0'); if (idx > 0) { str = str.substring(0, idx); } // trim only the end int end = str.length(); while (end > 0 && str.charAt(end - 1) <= '\u0020') end--; strArray[i] = (end <= 0) ? "" : str.substring(0, end); // trim both start and end // strArray[i] = str.trim(); } return strArray; } /** * Converts a string array into an array of bytes for a fixed string * dataset. *

    * If memory data of strings is converted to Java Strings, stringToByte() * must be called to convert the memory data back to byte array before data * is written to file. * * @see #byteToString(byte[] bytes, int length) * * @param strings * the array of string. * @param length * the length of string. * * @return the array of bytes. */ public static final byte[] stringToByte(String[] strings, int length) { if (strings == null) { return null; } int size = strings.length; byte[] bytes = new byte[size * length]; StringBuffer strBuff = new StringBuffer(length); for (int i = 0; i < size; i++) { // initialize the string with spaces strBuff.replace(0, length, " "); if (strings[i] != null) { if (strings[i].length() > length) { strings[i] = strings[i].substring(0, length); } strBuff.replace(0, length, strings[i]); } strBuff.setLength(length); System.arraycopy(strBuff.toString().getBytes(), 0, bytes, length * i, length); } return bytes; } /** * Returns the array of strings that represent the dimension names. Returns * null if there is no dimension name. *

    * Some datasets have pre-defined names for each dimension such as * "Latitude" and "Longitude". getDimNames() returns these pre-defined * names. * * @return the names of dimensions, or null if there is no dimension name. */ public final String[] getDimNames() { if (rank < 0) init(); return dimNames; } /** * Checks if a given datatype is a string. Sub-classes must replace this * default implementation. * * @param tid * The data type identifier. * * @return true if the datatype is a string; otherwise returns false. */ public boolean isString(int tid) { return false; } /** * Returns the size in bytes of a given datatype. Sub-classes must replace * this default implementation. * * @param tid * The data type identifier. * * @return The size of the datatype */ public int getSize(int tid) { return -1; } /** * Get flag that indicate if enum data is converted to strings. * * @return the enumConverted */ public boolean isEnumConverted() { return enumConverted; } /** * Set flag that indicate if enum data is converted to strings. * * @param b * the enumConverted to set */ public void setEnumConverted(boolean b) { if (enumConverted != b) { originalBuf = convertedBuf = null; this.clearData(); } enumConverted = b; } /** * Get Class of the original data buffer if converted. * * @return the Class of originalBuf */ public final Class getOriginalClass() { return originalBuf.getClass(); } } jhdf-2.9/ncsa/hdf/object/h5/0000755000175000017500000000000012051203651016423 5ustar sylvestresylvestrejhdf-2.9/ncsa/hdf/object/h5/H5File.java0000755000175000017500000030523512051203553020356 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.object.h5; import java.io.File; import java.lang.reflect.Array; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; import java.util.Vector; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.structs.H5G_info_t; import ncsa.hdf.hdf5lib.structs.H5L_info_t; import ncsa.hdf.hdf5lib.structs.H5O_info_t; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; /** * H5File is an implementation of the FileFormat class for HDF5 files. *

    * The HDF5 file structure is stored in a tree that is made up of Java TreeNode * objects. Each tree node represents an HDF5 object: a Group, Dataset, or Named * Datatype. Starting from the root of the tree, rootNode, the tree can * be traversed to find a specific object. *

    * The following example shows the implementation of finding an object for a * given path in FileFormat. User applications can directly call the static * method FileFormat.findObject(file, objPath) to get the object. * *

     * HObject findObject(FileFormat file, String path) {
     *     if (file == null || path == null)
     *         return null;
     *     if (!path.endsWith("/"))
     *         path = path + "/";
     *     DefaultMutableTreeNode theRoot = (DefaultMutableTreeNode) file
     *             .getRootNode();
     *     if (theRoot == null)
     *         return null;
     *     else if (path.equals("/"))
     *         return (HObject) theRoot.getUserObject();
     *         
     *     Enumeration local_enum = ((DefaultMutableTreeNode) theRoot)
     *             .breadthFirstEnumeration();
     *     DefaultMutableTreeNode theNode = null;
     *     HObject theObj = null;
     *     while (local_enum.hasMoreElements()) {
     *         theNode = (DefaultMutableTreeNode) local_enum.nextElement();
     *         theObj = (HObject) theNode.getUserObject();
     *         String fullPath = theObj.getFullName() + "/";
     *         if (path.equals(fullPath) &&  theObj.getPath() != null ) {
     *             break;
     *     }
     *     return theObj;
     * }
     * 
    * * @author Peter X. Cao * @version 2.4 9/4/2007 */ public class H5File extends FileFormat { private static final long serialVersionUID = 6247335559471526045L; /** * the file access flag. Valid values are HDF5Constants.H5F_ACC_RDONLY, * HDF5Constants.H5F_ACC_RDWR and HDF5Constants.H5F_ACC_CREAT. */ private int flag; /** * The index type. Valid values are HDF5Constants.H5_INDEX_NAME, * HDF5Constants.H5_INDEX_CRT_ORDER. */ private int indexType = HDF5Constants.H5_INDEX_NAME; /** * The index order. Valid values are HDF5Constants.H5_ITER_INC, * HDF5Constants.H5_ITER_DEC. */ private int indexOrder = HDF5Constants.H5_ITER_INC; /** * The root node of the file hierarchy. */ private DefaultMutableTreeNode rootNode; /** * How many characters maximum in an attribute name? */ private static final int attrNameLen = 256; /** * The library version bounds */ private int[] libver; private boolean attrFlag; /*************************************************************************** * Constructor **************************************************************************/ /** * Constructs an H5File instance with an empty file name and read-only * access. */ public H5File() { this("", READ); } /** * Constructs an H5File instance with specified file name and read/write * access. *

    * This constructor does not open the file for access, nor does it confirm * that the file can be opened read/write. * * @param fileName * A valid file name, with a relative or absolute path. * @throws NullPointerException * If the fileName argument is null. */ public H5File(String fileName) { this(fileName, WRITE); } /** * Constructs an H5File instance with specified file name and access. *

    * The access parameter values and corresponding behaviors: *

      *
    • READ: Read-only access; open() will fail file doesn't exist. *
    • WRITE: Read/Write access; open() will fail if file doesn't exist or * if file can't be opened with read/write access. *
    • CREATE: Read/Write access; create a new file or truncate an existing * one; open() will fail if file can't be created or if file exists but * can't be opened read/write. *
    *

    * This constructor does not open the file for access, nor does it confirm * that the file can later be opened read/write or created. *

    * The flag returned by {@link #isReadOnly()} is set to true if the access * parameter value is READ, even though the file isn't yet open. * * @param fileName * A valid file name, with a relative or absolute path. * @param access * The file access flag, which determines behavior when file is * opened. Acceptable values are READ, WRITE, and * CREATE. * @throws NullPointerException * If the fileName argument is null. */ public H5File(String fileName, int access) { // Call FileFormat ctor to set absolute path name super(fileName); libver = new int[2]; attrFlag = false; // set metadata for the instance rootNode = null; this.fid = -1; isReadOnly = (access == READ); // At this point we just set up the flags for what happens later. // We just pass unexpected access values on... subclasses may have // their own values. if (access == READ) { flag = HDF5Constants.H5F_ACC_RDONLY; } else if (access == WRITE) { flag = HDF5Constants.H5F_ACC_RDWR; } else if (access == CREATE) { flag = HDF5Constants.H5F_ACC_CREAT; } else { flag = access; } } /*************************************************************************** * Class methods **************************************************************************/ /** * Copies the attributes of one object to another object. *

    * This method copies all the attributes from one object (source object) to * another (destination object). If an attribute already exists in the * destination object, the attribute will not be copied. Attribute names * exceeding 256 characters will be truncated in the destination object. *

    * The object can be an H5Group, an H5Dataset, or a named H5Datatype. This * method is in the H5File class because there is no H5Object class and it * is specific to HDF5 objects. *

    * The copy can fail for a number of reasons, including an invalid source or * destination object, but no exceptions are thrown. The actual copy is * carried out by the method: {@link #copyAttributes(int, int)} * * @param src * The source object. * @param dst * The destination object. * @see #copyAttributes(int, int) */ public static final void copyAttributes(HObject src, HObject dst) { if ((src != null) && (dst != null)) { int srcID = src.open(); int dstID = dst.open(); if ((srcID >= 0) && (dstID >= 0)) { copyAttributes(srcID, dstID); } if (srcID >= 0) { src.close(srcID); } if (dstID >= 0) { dst.close(dstID); } } } /** * Copies the attributes of one object to another object. *

    * This method copies all the attributes from one object (source object) to * another (destination object). If an attribute already exists in the * destination object, the attribute will not be copied. Attribute names * exceeding 256 characters will be truncated in the destination object. *

    * The object can be an H5Group, an H5Dataset, or a named H5Datatype. This * method is in the H5File class because there is no H5Object class and it * is specific to HDF5 objects. *

    * The copy can fail for a number of reasons, including an invalid source or * destination object identifier, but no exceptions are thrown. * * @param src_id * The identifier of the source object. * @param dst_id * The identifier of the destination object. */ public static final void copyAttributes(int src_id, int dst_id) { int aid_src = -1, aid_dst = -1, atid = -1, asid = -1; String[] aName = { "" }; H5O_info_t obj_info = null; try { obj_info = H5.H5Oget_info(src_id); } catch (Exception ex) { obj_info.num_attrs = -1; } if (obj_info.num_attrs < 0) { return; } for (int i = 0; i < obj_info.num_attrs; i++) { aName[0] = new String(""); try { aid_src = H5.H5Aopen_by_idx(src_id, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, i, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Aget_name(aid_src, H5File.attrNameLen, aName); atid = H5.H5Aget_type(aid_src); asid = H5.H5Aget_space(aid_src); aid_dst = H5.H5Acreate(dst_id, aName[0], atid, asid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); // use native data copy H5.H5Acopy(aid_src, aid_dst); } catch (Exception ex) { } try { H5.H5Sclose(asid); } catch (Exception ex) { } try { H5.H5Tclose(atid); } catch (Exception ex) { } try { H5.H5Aclose(aid_src); } catch (Exception ex) { } try { H5.H5Aclose(aid_dst); } catch (Exception ex) { } } // for (int i=0; i * This method returns a list containing the attributes associated with the * identified object. If there are no associated attributes, an empty list * will be returned. *

    * Attribute names exceeding 256 characters will be truncated in the * returned list. * * @param objID * The identifier for the object whose attributes are to be * returned. * @return The list of the object's attributes. * @throws HDF5Exception * If an underlying HDF library routine is unable to perform a * step necessary to retrieve the attributes. A variety of * failures throw this exception. * @see #getAttribute(int,int,int) */ public static final List getAttribute(int objID) throws HDF5Exception { return H5File.getAttribute(objID, HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC); } /** * Returns a list of attributes for the specified object, in creation or * alphabetical order. *

    * This method returns a list containing the attributes associated with the * identified object. If there are no associated attributes, an empty list * will be returned. The list of attributes returned can be in increasing or * decreasing, creation or alphabetical order. *

    * Attribute names exceeding 256 characters will be truncated in the * returned list. * * @param objID * The identifier for the object whose attributes are to be * returned. * @param idx_type * The type of index. Valid values are: *

      *
    • H5_INDEX_NAME: An alpha-numeric index by attribute name *
    • H5_INDEX_CRT_ORDER: An index by creation order *
    * @param order * The index traversal order. Valid values are: *
      *
    • H5_ITER_INC: A top-down iteration incrementing the index * position at each step.
    • H5_ITER_DEC: A bottom-up iteration * decrementing the index position at each step. *
    * @return The list of the object's attributes. * @throws HDF5Exception * If an underlying HDF library routine is unable to perform a * step necessary to retrieve the attributes. A variety of * failures throw this exception. */ public static final List getAttribute(int objID, int idx_type, int order) throws HDF5Exception { List attributeList = null; int aid = -1, sid = -1, tid = -1; H5O_info_t obj_info = null; try { obj_info = H5.H5Oget_info(objID); } catch (Exception ex) {} if (obj_info.num_attrs <= 0) { return (attributeList = new Vector()); } int n = (int) obj_info.num_attrs; attributeList = new Vector(n); for (int i = 0; i < n; i++) { long lsize = 1; try { aid = H5.H5Aopen_by_idx(objID, ".", idx_type, order, i, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); sid = H5.H5Aget_space(aid); long dims[] = null; int rank = H5.H5Sget_simple_extent_ndims(sid); if (rank > 0) { dims = new long[rank]; H5.H5Sget_simple_extent_dims(sid, dims, null); for (int j = 0; j < dims.length; j++) { lsize *= dims[j]; } } String[] nameA = { "" }; H5.H5Aget_name(aid, H5File.attrNameLen, nameA); int tmptid = -1; try { tmptid = H5.H5Aget_type(aid); tid = H5.H5Tget_native_type(tmptid); } finally { try { H5.H5Tclose(tmptid); } catch (Exception ex) {} } Datatype attrType = new H5Datatype(tid); Attribute attr = new Attribute(nameA[0], attrType, dims); attributeList.add(attr); boolean is_variable_str = false; boolean isVLEN = false; boolean isCompound = false; boolean isScalar = false; int tclass = H5.H5Tget_class(tid); if(dims == null) isScalar = true; try { is_variable_str = H5.H5Tis_variable_str(tid); } catch (Exception ex) {} try { isVLEN = ( tclass == HDF5Constants.H5T_VLEN); } catch (Exception ex) {} try { isCompound = ( tclass == HDF5Constants.H5T_COMPOUND); } catch (Exception ex) {} // retrieve the attribute value if (lsize <= 0) { continue; } Object value = null; if (isVLEN || is_variable_str || isCompound || (isScalar && tclass == HDF5Constants.H5T_ARRAY)) { String[] strs = new String[(int) lsize]; for (int j = 0; j < lsize; j++) { strs[j] = ""; } try { H5.H5AreadVL(aid, tid, strs); } catch (Exception ex) {ex.printStackTrace();} value = strs; } else { value = H5Datatype.allocateArray(tid, (int) lsize); if (value == null) { continue; } if (H5.H5Tget_class(tid) == HDF5Constants.H5T_ARRAY) { int tmptid1 = -1, tmptid2 = -1; try { tmptid1 = H5.H5Tget_super(tid); tmptid2 = H5.H5Tget_native_type(tmptid1); H5.H5Aread(aid, tmptid2, value); } catch (Exception ex) {ex.printStackTrace();} finally { try { H5.H5Tclose(tmptid1); } catch (Exception ex) {} try { H5.H5Tclose(tmptid2); } catch (Exception ex) {} } } else { H5.H5Aread(aid, tid, value); } int typeClass = H5.H5Tget_class(tid); if (typeClass == HDF5Constants.H5T_STRING) { value = Dataset.byteToString((byte[]) value, H5.H5Tget_size(tid)); } else if (typeClass == HDF5Constants.H5T_REFERENCE) { value = HDFNativeData.byteToLong((byte[]) value); } } attr.setValue(value); } catch (HDF5Exception ex) {} finally { try { H5.H5Tclose(tid); } catch (HDF5Exception ex) {} try { H5.H5Sclose(sid); } catch (HDF5Exception ex) {} try { H5.H5Aclose(aid); } catch (HDF5Exception ex) {} } } // for (int i=0; i * This method creates attributes for two common types of HDF5 images. It * provides a way of adding multiple attributes to an HDF5 image dataset * with a single call. The * {@link #writeAttribute(HObject, Attribute, boolean)} method may be used * to write image attributes that are not handled by this method. *

    * For more information about HDF5 image attributes, see the HDF5 Image * and Palette Specification. *

    * This method can be called to create attributes for 24-bit true color and * indexed images. The selectionFlag parameter controls whether * this will be an indexed or true color image. If * selectionFlag is -1, this will be an indexed * image. If the value is ScalarDS.INTERLACE_PIXEL or * ScalarDS.INTERLACE_PLANE, it will be a 24-bit true color * image with the indicated interlace mode. *

    *

      * The created attribute descriptions, names, and values are: *
    • The image identifier: name="CLASS", value="IMAGE" *
    • The version of image: name="IMAGE_VERSION", value="1.2" *
    • The range of data values: name="IMAGE_MINMAXRANGE", value=[0, 255] *
    • The type of the image: name="IMAGE_SUBCLASS", value="IMAGE_TRUECOLOR" * or "IMAGE_INDEXED" *
    • For IMAGE_TRUECOLOR, the interlace mode: name="INTERLACE_MODE", * value="INTERLACE_PIXEL" or "INTERLACE_PLANE" *
    • For IMAGE_INDEXED, the palettes to use in viewing the image: * name="PALETTE", value= 1-d array of references to the palette datasets, * with initial value of {-1} *
    *

    * This method is in the H5File class rather than H5ScalarDS because images * are typically thought of at the File Format implementation level. * * @param dataset * The image dataset the attributes are added to. * @param selectionFlag * Selects the image type and, for 24-bit true color images, the * interlace mode. Valid values are: *

      *
    • -1: Indexed Image.
    • ScalarDS.INTERLACE_PIXEL: True * Color Image. The component values for a pixel are stored * contiguously.
    • ScalarDS.INTERLACE_PLANE: True Color Image. * Each component is stored in a separate plane. *
    * @throws Exception * If there is a problem creating the attributes, or if the * selectionFlag is invalid. */ private static final void createImageAttributes(Dataset dataset, int selectionFlag) throws Exception { String subclass = null; String interlaceMode = null; if (selectionFlag == ScalarDS.INTERLACE_PIXEL) { subclass = "IMAGE_TRUECOLOR"; interlaceMode = "INTERLACE_PIXEL"; } else if (selectionFlag == ScalarDS.INTERLACE_PLANE) { subclass = "IMAGE_TRUECOLOR"; interlaceMode = "INTERLACE_PLANE"; } else if (selectionFlag == -1) { subclass = "IMAGE_INDEXED"; } else { throw new HDF5Exception("The selectionFlag is invalid."); } long[] attrDims = { 1 }; String attrName = "CLASS"; String[] classValue = { "IMAGE" }; Datatype attrType = new H5Datatype(Datatype.CLASS_STRING, classValue[0].length() + 1, -1, -1); Attribute attr = new Attribute(attrName, attrType, attrDims); attr.setValue(classValue); dataset.writeMetadata(attr); attrName = "IMAGE_VERSION"; String[] versionValue = { "1.2" }; attrType = new H5Datatype(Datatype.CLASS_STRING, versionValue[0].length() + 1, -1, -1); attr = new Attribute(attrName, attrType, attrDims); attr.setValue(versionValue); dataset.writeMetadata(attr); attrDims[0] = 2; attrName = "IMAGE_MINMAXRANGE"; byte[] attrValueInt = { 0, (byte) 255 }; attrType = new H5Datatype(Datatype.CLASS_CHAR, 1, Datatype.NATIVE, Datatype.SIGN_NONE); attr = new Attribute(attrName, attrType, attrDims); attr.setValue(attrValueInt); dataset.writeMetadata(attr); attrDims[0] = 1; attrName = "IMAGE_SUBCLASS"; String[] subclassValue = { subclass }; attrType = new H5Datatype(Datatype.CLASS_STRING, subclassValue[0].length() + 1, -1, -1); attr = new Attribute(attrName, attrType, attrDims); attr.setValue(subclassValue); dataset.writeMetadata(attr); if ((selectionFlag == ScalarDS.INTERLACE_PIXEL) || (selectionFlag == ScalarDS.INTERLACE_PLANE)) { attrName = "INTERLACE_MODE"; String[] interlaceValue = { interlaceMode }; attrType = new H5Datatype(Datatype.CLASS_STRING, interlaceValue[0].length() + 1, -1, -1); attr = new Attribute(attrName, attrType, attrDims); attr.setValue(interlaceValue); dataset.writeMetadata(attr); } else { attrName = "PALETTE"; long[] palRef = { 0 }; // set ref to null attrType = new H5Datatype(Datatype.CLASS_REFERENCE, 1, Datatype.NATIVE, Datatype.SIGN_NONE); attr = new Attribute(attrName, attrType, attrDims); attr.setValue(palRef); dataset.writeMetadata(attr); } } /** * Updates values of scalar dataset object references in copied file. *

    * This method has very specific functionality as documented below, and the * user is advised to pay close attention when dealing with files that * contain references. *

    * When a copy is made from one HDF file to another, object references and * dataset region references are copied, but the references in the * destination file are not updated by the copy and are therefore invalid. *

    * When an entire file is copied, this method updates the values of the * object references and dataset region references that are in scalar * datasets in the destination file so that they point to the correct * object(s) in the destination file. The method does not update references * that occur in objects other than scalar datasets. *

    * In the current release, the updating of object references is not handled * completely as it was not required by the projects that funded * development. There is no support for updates when the copy does not * include the entire file. Nor is there support for updating objects other * than scalar datasets in full-file copies. This functionality will be * extended as funding becomes available or, possibly, when the underlying * HDF library supports the reference updates itself. * * @param srcFile * The file that was copied. * @param dstFile * The destination file where the object references will be * updated. * @throws Exception * If there is a problem in the update process. */ public static final void updateReferenceDataset(H5File srcFile, H5File dstFile) throws Exception { if ((srcFile == null) || (dstFile == null)) { return; } DefaultMutableTreeNode srcRoot = (DefaultMutableTreeNode) srcFile.getRootNode(); DefaultMutableTreeNode newRoot = (DefaultMutableTreeNode) dstFile.getRootNode(); Enumeration srcEnum = srcRoot.breadthFirstEnumeration(); Enumeration newEnum = newRoot.breadthFirstEnumeration(); // build one-to-one table of between objects in // the source file and new file int did = -1, tid = -1; HObject srcObj, newObj; Hashtable oidMap = new Hashtable(); List refDatasets = new Vector(); while (newEnum.hasMoreElements() && srcEnum.hasMoreElements()) { srcObj = (HObject) ((DefaultMutableTreeNode) srcEnum.nextElement()).getUserObject(); newObj = (HObject) ((DefaultMutableTreeNode) newEnum.nextElement()).getUserObject(); oidMap.put(String.valueOf((srcObj.getOID())[0]), newObj.getOID()); did = -1; tid = -1; // for Scalar DataSets in destination, if there is an object // reference in the dataset, add it to the refDatasets list for // later updating. if (newObj instanceof ScalarDS) { ScalarDS sd = (ScalarDS) newObj; did = sd.open(); if (did > 0) { try { tid = H5.H5Dget_type(did); if (H5.H5Tequal(tid, HDF5Constants.H5T_STD_REF_OBJ)) { refDatasets.add(sd); } } catch (Exception ex) { } finally { try { H5.H5Tclose(tid); } catch (Exception ex) { } } } sd.close(did); } // if (newObj instanceof ScalarDS) } // Update the references in the scalar datasets in the dest file. H5ScalarDS d = null; int sid = -1, size = 0, rank = 0; int n = refDatasets.size(); for (int i = 0; i < n; i++) { d = (H5ScalarDS) refDatasets.get(i); byte[] buf = null; long[] refs = null; try { did = d.open(); tid = H5.H5Dget_type(did); sid = H5.H5Dget_space(did); rank = H5.H5Sget_simple_extent_ndims(sid); size = 1; if (rank > 0) { long[] dims = new long[rank]; H5.H5Sget_simple_extent_dims(sid, dims, null); for (int j = 0; j < rank; j++) { size *= (int) dims[j]; } dims = null; } buf = new byte[size * 8]; H5.H5Dread(did, tid, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, buf); // update the ref values refs = HDFNativeData.byteToLong(buf); size = refs.length; for (int j = 0; j < size; j++) { long[] theOID = oidMap.get(String.valueOf(refs[j])); if (theOID != null) { refs[j] = theOID[0]; } } // write back to file H5.H5Dwrite(did, tid, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, refs); } catch (Exception ex) { continue; } finally { try { H5.H5Tclose(tid); } catch (Exception ex) { } try { H5.H5Sclose(sid); } catch (Exception ex) { } try { H5.H5Dclose(did); } catch (Exception ex) { } } refs = null; buf = null; } // for (int i=0; i * * @see ncsa.hdf.object.FileFormat#createInstance(java.lang.String, int) * @see #H5File(String, int) */ @Override public FileFormat createInstance(String filename, int access) throws Exception { return new H5File(filename, access); } /*************************************************************************** * Instance Methods * * These methods are related to the H5File class and to particular instances * of objects with this class type. **************************************************************************/ /** * Opens file and returns a file identifier. * * @see ncsa.hdf.object.FileFormat#open() */ @Override public int open() throws Exception { return open(true); } /** * Opens file and returns a file identifier. * * @see ncsa.hdf.object.FileFormat#open(int...) */ @Override public int open(int... propList) throws Exception { setIndexType(propList[0]); return open(true); } /** * Sets the bounds of library versions. * * @param low * The earliest version of the library. * @param high * The latest version of the library. * @throws HDF5Exception */ public void setLibBounds(int low, int high) throws Exception { int fapl = HDF5Constants.H5P_DEFAULT; if (fid < 0) return; fapl = H5.H5Fget_access_plist(fid); try { if (low < 0) low = HDF5Constants.H5F_LIBVER_EARLIEST; if (high < 0) high = HDF5Constants.H5F_LIBVER_LATEST; H5.H5Pset_libver_bounds(fapl, low, high); H5.H5Pget_libver_bounds(fapl, libver); } finally { try { H5.H5Pclose(fapl); } catch (Exception e) { } } } /** * Gets the bounds of library versions. * * @return libver The earliest and latest version of the library. * @throws HDF5Exception */ public int[] getLibBounds() throws Exception { return libver; } /** * Closes file associated with this H5File instance. * * @see ncsa.hdf.object.FileFormat#close() * @throws HDF5Exception */ @Override public void close() throws HDF5Exception { // The current working directory may be changed at Dataset.read() // by H5Dchdir_ext()by this file to make it work for external // datasets. We need to set it back to the orginal current working // directory (when hdf-java application started) before the file // is closed/opened. Otherwise, relative path, e.g. "./test.h5" may // not work H5.H5Dchdir_ext(System.getProperty("user.dir")); // clean up unused objects if (rootNode != null) { DefaultMutableTreeNode theNode = null; HObject theObj = null; Enumeration local_enum = (rootNode).breadthFirstEnumeration(); while (local_enum.hasMoreElements()) { theNode = (DefaultMutableTreeNode) local_enum.nextElement(); theObj = (HObject) theNode.getUserObject(); if (theObj instanceof Dataset) { ((Dataset) theObj).clear(); } else if (theObj instanceof Group) { ((Group) theObj).clear(); } } } // Close all open objects associated with this file. try { int n = 0, type = -1, oids[]; n = H5.H5Fget_obj_count(fid, HDF5Constants.H5F_OBJ_ALL); if (n > 0) { oids = new int[n]; H5.H5Fget_obj_ids(fid, HDF5Constants.H5F_OBJ_ALL, n, oids); for (int i = 0; i < n; i++) { type = H5.H5Iget_type(oids[i]); if (HDF5Constants.H5I_DATASET == type) { try { H5.H5Dclose(oids[i]); } catch (Exception ex2) { } } else if (HDF5Constants.H5I_GROUP == type) { try { H5.H5Gclose(oids[i]); } catch (Exception ex2) { } } else if (HDF5Constants.H5I_DATATYPE == type) { try { H5.H5Tclose(oids[i]); } catch (Exception ex2) { } } else if (HDF5Constants.H5I_ATTR == type) { try { H5.H5Aclose(oids[i]); } catch (Exception ex2) { } } } // for (int i=0; i0) } catch (Exception ex) { } try { H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_GLOBAL); } catch (Exception ex) { } try { H5.H5Fclose(fid); } catch (Exception ex) { } // Set fid to -1 but don't reset rootNode fid = -1; } /** * Returns the root node of the open HDF5 File. * * @see ncsa.hdf.object.FileFormat#getRootNode() */ @Override public TreeNode getRootNode() { return rootNode; } /* * (non-Javadoc) * * @see ncsa.hdf.object.FileFormat#get(java.lang.String) */ @Override public HObject get(String path) throws Exception { HObject obj = null; if ((path == null) || (path.length() <= 0)) { System.err.println("(path == null) || (path.length() <= 0)"); return null; } // replace the wrong slash and get rid of "//" path = path.replace('\\', '/'); path = "/" + path; path = path.replaceAll("//", "/"); // the whole file tree is loaded. find the object in the tree if (rootNode != null) { obj = findObject(this, path); } // found object in memory if (obj != null) { return obj; } // open only the requested object String name = null, pPath = null; if (path.equals("/")) { name = "/"; // the root } else { // separate the parent path and the object name if (path.endsWith("/")) { path = path.substring(0, path.length() - 1); } int idx = path.lastIndexOf('/'); name = path.substring(idx + 1); if (idx == 0) { pPath = "/"; } else { pPath = path.substring(0, idx); } } // do not open the full tree structure, only the file handler int fid_before_open = fid; fid = open(false); if (fid < 0) { System.err.println("Could not open file handler"); return null; } try { H5O_info_t info; int objType; int oid = H5.H5Oopen(fid, path, HDF5Constants.H5P_DEFAULT); if (oid >= 0) { info = H5.H5Oget_info(oid); objType = info.type; if (objType == HDF5Constants.H5O_TYPE_DATASET) { int did = -1; try { did = H5.H5Dopen(fid, path, HDF5Constants.H5P_DEFAULT); obj = getDataset(did, name, pPath); } finally { try { H5.H5Dclose(did); } catch (Exception ex) { } } } else if (objType == HDF5Constants.H5O_TYPE_GROUP) { int gid = -1; try { gid = H5.H5Gopen(fid, path, HDF5Constants.H5P_DEFAULT); H5Group pGroup = null; if (pPath != null) { pGroup = new H5Group(this, null, pPath, null); obj = getGroup(gid, name, pGroup); pGroup.addToMemberList(obj); } else { obj = getGroup(gid, name, pGroup); } } finally { try { H5.H5Gclose(gid); } catch (Exception ex) { } } } else if (objType == HDF5Constants.H5O_TYPE_NAMED_DATATYPE) { obj = new H5Datatype(this, name, pPath); } } try { H5.H5Oclose(oid); } catch (Exception ex) { ex.printStackTrace(); } } catch (Exception ex) { System.err.println("Exception finding obj"); obj = null; } finally { if ((fid_before_open <= 0) && (obj == null)) { // close the fid that is not attached to any object try { H5.H5Fclose(fid); } catch (Exception ex) { } fid = fid_before_open; } } return obj; } /* * (non-Javadoc) * * @see ncsa.hdf.object.FileFormat#createDatatype(int, int, int, int, * java.lang.String) */ @Override public Datatype createDatatype(int tclass, int tsize, int torder, int tsign, String name) throws Exception { int tid = -1; H5Datatype dtype = null; try { H5Datatype t = (H5Datatype) createDatatype(tclass, tsize, torder, tsign); tid = t.toNative(); H5.H5Tcommit(fid, name, tid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); byte[] ref_buf = H5.H5Rcreate(fid, name, HDF5Constants.H5R_OBJECT, -1); long l = HDFNativeData.byteToLong(ref_buf, 0); long[] oid = new long[1]; oid[0] = l; // save the object ID dtype = new H5Datatype(this, null, name); } finally { if (tid > 0) { H5.H5Tclose(tid); } } return dtype; } /*************************************************************************** * Methods related to Datatypes and HObjects in HDF5 Files. Strictly * speaking, these methods aren't related to H5File and the actions could be * carried out through the H5Group, H5Datatype and H5*DS classes. But, in * some cases they allow a null input and expect the generated object to be * of HDF5 type. So, we put them in the H5File class so that we create the * proper type of HObject... H5Group for example. * * Here again, if there could be Implementation Class methods we'd use * those. But, since we can't override class methods (they can only be * shadowed in Java), these are instance methods. * **************************************************************************/ /* * (non-Javadoc) * * @see ncsa.hdf.object.FileFormat#createDatatype(int, int, int, int) */ @Override public Datatype createDatatype(int tclass, int tsize, int torder, int tsign) throws Exception { return new H5Datatype(tclass, tsize, torder, tsign); } /* * (non-Javadoc) * * @see ncsa.hdf.object.FileFormat#createScalarDS(java.lang.String, * ncsa.hdf.object.Group, ncsa.hdf.object.Datatype, long[], long[], long[], * int, java.lang.Object) */ @Override public Dataset createScalarDS(String name, Group pgroup, Datatype type, long[] dims, long[] maxdims, long[] chunks, int gzip, Object fillValue, Object data) throws Exception { if (pgroup == null) { // create new dataset at the root group by default pgroup = (Group) get("/"); } return H5ScalarDS.create(name, pgroup, type, dims, maxdims, chunks, gzip, fillValue, data); } /* * (non-Javadoc) * * @see ncsa.hdf.object.FileFormat#createCompoundDS(java.lang.String, * ncsa.hdf.object.Group, long[], long[], long[], int, java.lang.String[], * ncsa.hdf.object.Datatype[], int[], java.lang.Object) */ @Override public Dataset createCompoundDS(String name, Group pgroup, long[] dims, long[] maxdims, long[] chunks, int gzip, String[] memberNames, Datatype[] memberDatatypes, int[] memberSizes, Object data) throws Exception { int nMembers = memberNames.length; int memberRanks[] = new int[nMembers]; long memberDims[][] = new long[nMembers][1]; Dataset ds = null; for (int i = 0; i < nMembers; i++) { memberRanks[i] = 1; if (memberSizes == null) { memberDims[i][0] = 1; } else { memberDims[i][0] = memberSizes[i]; } } if (pgroup == null) { // create new dataset at the root group by default pgroup = (Group) get("/"); } ds = H5CompoundDS.create(name, pgroup, dims, maxdims, chunks, gzip, memberNames, memberDatatypes, memberRanks, memberDims, data); return ds; } /* * (non-Javadoc) * * @see ncsa.hdf.object.FileFormat#createImage(java.lang.String, * ncsa.hdf.object.Group, ncsa.hdf.object.Datatype, long[], long[], long[], * int, int, int, java.lang.Object) */ @Override public Dataset createImage(String name, Group pgroup, Datatype type, long[] dims, long[] maxdims, long[] chunks, int gzip, int ncomp, int interlace, Object data) throws Exception { if (pgroup == null) { // create at the root group by default pgroup = (Group) get("/"); } H5ScalarDS dataset = H5ScalarDS.create(name, pgroup, type, dims, maxdims, chunks, gzip, data); try { H5File.createImageAttributes(dataset, interlace); dataset.setIsImage(true); } catch (Exception ex) { } return dataset; } /*** * Creates a new group with specified name in existing group. * * @see ncsa.hdf.object.FileFormat#createGroup(java.lang.String, * ncsa.hdf.object.Group) */ @Override public Group createGroup(String name, Group pgroup) throws Exception { return this.createGroup(name, pgroup, HDF5Constants.H5P_DEFAULT); } /*** * Creates a new group with specified name in existing group and with the * group creation properties list, gplist. * * @see ncsa.hdf.object.h5.H5Group#create(java.lang.String, * ncsa.hdf.object.Group, int) * */ public Group createGroup(String name, Group pgroup, int... gplist) throws Exception { // create new group at the root if (pgroup == null) { pgroup = (Group) this.get("/"); } return H5Group.create(name, pgroup, gplist); } /*** * Creates the group creation property list identifier, gcpl. This * identifier is used when creating Groups. * * @see ncsa.hdf.object.FileFormat#createGcpl(int, int, int) * */ public int createGcpl(int creationorder, int maxcompact, int mindense) throws Exception { int gcpl = -1; try { gcpl = H5.H5Pcreate(HDF5Constants.H5P_GROUP_CREATE); if (gcpl >= 0) { // Set link creation order. if (creationorder == Group.CRT_ORDER_TRACKED) { H5.H5Pset_link_creation_order(gcpl, HDF5Constants.H5P_CRT_ORDER_TRACKED); } else if (creationorder == Group.CRT_ORDER_INDEXED) { H5.H5Pset_link_creation_order(gcpl, HDF5Constants.H5P_CRT_ORDER_TRACKED + HDF5Constants.H5P_CRT_ORDER_INDEXED); } // Set link storage. H5.H5Pset_link_phase_change(gcpl, maxcompact, mindense); } } catch (Exception ex) { ex.printStackTrace(); } return gcpl; } /* * (non-Javadoc) * * @see ncsa.hdf.object.FileFormat#createLink(ncsa.hdf.object.Group, * java.lang.String, ncsa.hdf.object.HObject) */ @Override public HObject createLink(Group parentGroup, String name, Object currentObj) throws Exception { if (currentObj instanceof HObject) return this.createLink(parentGroup, name, (HObject) currentObj, Group.LINK_TYPE_HARD); else if (currentObj instanceof String) return this.createLink(parentGroup, name, (String) currentObj, Group.LINK_TYPE_HARD); return null; } /** * Creates a link to an object in the open file. *

    * If parentGroup is null, the new link is created in the root group. * * @param parentGroup * The group where the link is created. * @param name * The name of the link. * @param currentObj * The existing object the new link will reference. * @param type * The type of link to be created. It can be a hard link, a soft * link or an external link. * @return The object pointed to by the new link if successful; otherwise * returns null. * @throws Exception * The exceptions thrown vary depending on the implementing * class. */ public HObject createLink(Group parentGroup, String name, HObject currentObj, int lType) throws Exception { HObject obj = null; int type = 0; String current_full_name = null, new_full_name = null, parent_path = null; if (currentObj == null) { throw new HDF5Exception("The object pointed by the link cannot be null."); } if ((parentGroup == null) || parentGroup.isRoot()) { parent_path = HObject.separator; } else { parent_path = parentGroup.getPath() + HObject.separator + parentGroup.getName() + HObject.separator; } new_full_name = parent_path + name; if (lType == Group.LINK_TYPE_HARD) type = HDF5Constants.H5L_TYPE_HARD; else if (lType == Group.LINK_TYPE_SOFT) type = HDF5Constants.H5L_TYPE_SOFT; else if (lType == Group.LINK_TYPE_EXTERNAL) type = HDF5Constants.H5L_TYPE_EXTERNAL; if (H5.H5Lexists(fid, new_full_name, HDF5Constants.H5P_DEFAULT)) { H5.H5Ldelete(fid, new_full_name, HDF5Constants.H5P_DEFAULT); } if (type == HDF5Constants.H5L_TYPE_HARD) { if ((currentObj instanceof Group) && ((Group) currentObj).isRoot()) { throw new HDF5Exception("Cannot make a link to the root group."); } current_full_name = currentObj.getPath() + HObject.separator + currentObj.getName(); H5.H5Lcreate_hard(fid, current_full_name, fid, new_full_name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } else if (type == HDF5Constants.H5L_TYPE_SOFT) { H5.H5Lcreate_soft(currentObj.getFullName(), fid, new_full_name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } else if (type == HDF5Constants.H5L_TYPE_EXTERNAL) { H5.H5Lcreate_external(currentObj.getFile(), currentObj.getFullName(), fid, new_full_name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } if (currentObj instanceof Group) { obj = new H5Group(this, name, parent_path, parentGroup); } else if (currentObj instanceof H5Datatype) { obj = new H5Datatype(this, name, parent_path); } else if (currentObj instanceof H5CompoundDS) { obj = new H5CompoundDS(this, name, parent_path); } else if (currentObj instanceof H5ScalarDS) { obj = new H5ScalarDS(this, name, parent_path); } return obj; } /** * Creates a soft or external links to objects in a file that do not exist * at the time the link is created. * * @param parentGroup * The group where the link is created. * @param name * The name of the link. * @param currentObj * The name of the object the new link will reference. The object * doesn't have to exist. * @param type * The type of link to be created. * @return The H5Link object pointed to by the new link if successful; * otherwise returns null. * @throws Exception * The exceptions thrown vary depending on the implementing * class. */ public HObject createLink(Group parentGroup, String name, String currentObj, int lType) throws Exception { HObject obj = null; int type = 0; String new_full_name = null, parent_path = null; if (currentObj == null) { throw new HDF5Exception("The object pointed by the link cannot be null."); } if ((parentGroup == null) || parentGroup.isRoot()) { parent_path = HObject.separator; } else { parent_path = parentGroup.getPath() + HObject.separator + parentGroup.getName() + HObject.separator; } new_full_name = parent_path + name; if (lType == Group.LINK_TYPE_HARD) type = HDF5Constants.H5L_TYPE_HARD; else if (lType == Group.LINK_TYPE_SOFT) type = HDF5Constants.H5L_TYPE_SOFT; else if (lType == Group.LINK_TYPE_EXTERNAL) type = HDF5Constants.H5L_TYPE_EXTERNAL; if (H5.H5Lexists(fid, new_full_name, HDF5Constants.H5P_DEFAULT)) { H5.H5Ldelete(fid, new_full_name, HDF5Constants.H5P_DEFAULT); } if (type == HDF5Constants.H5L_TYPE_SOFT) { H5.H5Lcreate_soft(currentObj, fid, new_full_name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } else if (type == HDF5Constants.H5L_TYPE_EXTERNAL) { String fileName = null; String objectName = null; // separate the object name and the file name fileName = currentObj.substring(0, currentObj.lastIndexOf(FileFormat.FILE_OBJ_SEP)); objectName = currentObj.substring(currentObj.indexOf(FileFormat.FILE_OBJ_SEP)); objectName = objectName.substring(3); H5.H5Lcreate_external(fileName, objectName, fid, new_full_name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } if (name.startsWith(HObject.separator)) { name = name.substring(1); } obj = new H5Link(this, name, parent_path); return obj; } /** * reload the sub-tree structure from file. *

    * reloadTree(Group g) is useful when the structure of the group in file is * changed while the group structure in memory is not changed. * * @param g * the group where the structure is to be reloaded in memory */ public void reloadTree(Group g) { if (fid < 0 || rootNode == null || g == null) return; HObject theObj = null; DefaultMutableTreeNode theNode = null; if (g.equals(rootNode.getUserObject())) theNode = rootNode; else { Enumeration local_enum = rootNode.breadthFirstEnumeration(); while (local_enum.hasMoreElements()) { theNode = (DefaultMutableTreeNode) local_enum.nextElement(); theObj = (HObject) theNode.getUserObject(); if (g.equals(theObj)) break; } } theNode.removeAllChildren(); depth_first(theNode, Integer.MIN_VALUE); } /* * (non-Javadoc) NOTE: Object references are copied but not updated by this * method. * * @see ncsa.hdf.object.FileFormat#copy(ncsa.hdf.object.HObject, * ncsa.hdf.object.Group, java.lang.String) */ @Override public TreeNode copy(HObject srcObj, Group dstGroup, String dstName) throws Exception { TreeNode newNode = null; if ((srcObj == null) || (dstGroup == null)) { return null; } if (dstName == null) { dstName = srcObj.getName(); } List members = dstGroup.getMemberList(); int n = members.size(); for (int i = 0; i < n; i++) { HObject obj = (HObject) members.get(i); String name = obj.getName(); while (name.equals(dstName)) dstName += "~copy"; } if (srcObj instanceof Dataset) { newNode = copyDataset((Dataset) srcObj, (H5Group) dstGroup, dstName); } else if (srcObj instanceof H5Group) { newNode = copyGroup((H5Group) srcObj, (H5Group) dstGroup, dstName); } else if (srcObj instanceof H5Datatype) { newNode = copyDatatype((H5Datatype) srcObj, (H5Group) dstGroup, dstName); } return newNode; } /* * (non-Javadoc) * * @see ncsa.hdf.object.FileFormat#delete(ncsa.hdf.object.HObject) */ @Override public void delete(HObject obj) throws Exception { if ((obj == null) || (fid < 0)) { return; } String name = obj.getPath() + obj.getName(); H5.H5Ldelete(fid, name, HDF5Constants.H5P_DEFAULT); } /* * (non-Javadoc) * * @see ncsa.hdf.object.FileFormat#writeAttribute(ncsa.hdf.object.HObject, * ncsa.hdf.object.Attribute, boolean) */ @Override public void writeAttribute(HObject obj, Attribute attr, boolean attrExisted) throws HDF5Exception { String obj_name = obj.getFullName(); String name = attr.getName(); int tid = -1, sid = -1, aid = -1; int objID = obj.open(); if (objID < 0) { return; } try { tid = attr.getType().toNative(); sid = H5.H5Screate_simple(attr.getRank(), attr.getDataDims(), null); if (attrExisted) { aid = H5.H5Aopen_by_name(objID, obj_name, name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } else { aid = H5.H5Acreate(objID, name, tid, sid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } // update value of the attribute Object attrValue = attr.getValue(); if (attrValue != null) { boolean isVlen = (H5.H5Tget_class(tid) == HDF5Constants.H5T_VLEN || H5.H5Tis_variable_str(tid)); if (isVlen) { throw (new HDF5Exception("Writing variable-length attributes is not supported")); } if (attr.getType().getDatatypeClass() == Datatype.CLASS_REFERENCE && attrValue instanceof String) { // reference // is // a // path+name // to // the // object attrValue = H5.H5Rcreate(getFID(), (String) attrValue, HDF5Constants.H5R_OBJECT, -1); } else if (Array.get(attrValue, 0) instanceof String) { int size = H5.H5Tget_size(tid); int len = ((String[]) attrValue).length; byte[] bval = Dataset.stringToByte((String[]) attrValue, size); if (bval != null && bval.length == size * len) { bval[bval.length - 1] = 0; attrValue = bval; } } try { /* * must use native type to write attribute data to file (see * bug 1069) */ int tmptid = tid; tid = H5.H5Tget_native_type(tmptid); try { H5.H5Tclose(tmptid); } catch (HDF5Exception ex) { } H5.H5Awrite(aid, tid, attrValue); } catch (Exception ex) { } } // if (attrValue != null) { } finally { try { H5.H5Tclose(tid); } catch (HDF5Exception ex) { } try { H5.H5Sclose(sid); } catch (HDF5Exception ex) { } try { H5.H5Aclose(aid); } catch (HDF5Exception ex) { } } obj.close(objID); } /*************************************************************************** * Implementations for methods specific to H5File **************************************************************************/ /** * Opens a file with specific file access property list. *

    * This function does the same as "int open()" except the you can also pass * an HDF5 file access property to file open. For example, * *

         * // All open objects remaining in the file are closed then file is closed
         * int plist = H5.H5Pcreate(HDF5Constants.H5P_FILE_ACCESS);
         * H5.H5Pset_fclose_degree(plist, HDF5Constants.H5F_CLOSE_STRONG);
         * int fid = open(plist);
         * 
    * * @param plist * a file access property list identifier. * @return the file identifier if successful; otherwise returns negative * value. */ public int open(int plist) throws Exception { return open(true, plist); } /*************************************************************************** * Private methods. **************************************************************************/ /** * Opens access to this file. * * @param loadFullHierarchy * if true, load the full hierarchy into memory; otherwise just * opens the file idenfitier. * @return the file identifier if successful; otherwise returns negative * value. */ private int open(boolean loadFullHierarchy) throws Exception { int the_fid = -1; int plist = HDF5Constants.H5P_DEFAULT; /* * // BUG: HDF5Constants.H5F_CLOSE_STRONG does not flush cache try { * //All open objects remaining in the file are closed // then file is * closed plist = H5.H5Pcreate (HDF5Constants.H5P_FILE_ACCESS); * H5.H5Pset_fclose_degree ( plist, HDF5Constants.H5F_CLOSE_STRONG); } * catch (Exception ex) {;} the_fid = open(loadFullHierarchy, plist); * try { H5.H5Pclose(plist); } catch (Exception ex) {} */ the_fid = open(loadFullHierarchy, plist); return the_fid; } /** * Opens access to this file. * * @param loadFullHierarchy * if true, load the full hierarchy into memory; otherwise just * opens the file identifier. * @return the file identifier if successful; otherwise returns negative * value. */ private int open(boolean loadFullHierarchy, int plist) throws Exception { if (fid > 0) { return fid; // file is opened already } // The cwd may be changed at Dataset.read() by H5Dchdir_ext() // to make it work for external datasets. We need to set it back // before the file is closed/opened. H5.H5Dchdir_ext(System.getProperty("user.dir")); // check for valid file access permission if (flag < 0) { throw new HDF5Exception("Invalid access identifer -- " + flag); } else if (HDF5Constants.H5F_ACC_CREAT == flag) { // create a new file fid = H5.H5Fcreate(fullFileName, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_LOCAL); H5.H5Fclose(fid); flag = HDF5Constants.H5F_ACC_RDWR; } else if (!exists()) { throw new HDF5Exception("File does not exist -- " + fullFileName); } else if (((flag == HDF5Constants.H5F_ACC_RDWR) || (flag == HDF5Constants.H5F_ACC_CREAT)) && !canWrite()) { throw new HDF5Exception("Cannot write file, try open as read-only -- " + fullFileName); } else if ((flag == HDF5Constants.H5F_ACC_RDONLY) && !canRead()) { throw new HDF5Exception("Cannot read file -- " + fullFileName); } try { fid = H5.H5Fopen(fullFileName, flag, plist); } catch (Exception ex) { try { fid = H5.H5Fopen(fullFileName, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); isReadOnly = true; } catch (Exception ex2) { // try to see if it is a file family, always open a family file // from the first one since other files will not be recongized // as // an HDF5 file File tmpf = new File(fullFileName); String tmpname = tmpf.getName(); int idx = tmpname.lastIndexOf("."); while (idx > 0) { char c = tmpname.charAt(idx); if (c >= '0') idx--; else break; } if (idx > 0) { tmpname = tmpname.substring(0, idx - 1) + "%d" + tmpname.substring(tmpname.lastIndexOf(".")); int pid = H5.H5Pcreate(HDF5Constants.H5P_FILE_ACCESS); H5.H5Pset_fapl_family(pid, 0, HDF5Constants.H5P_DEFAULT); fid = H5.H5Fopen(tmpf.getParent() + File.separator + tmpname, flag, pid); H5.H5Pclose(pid); } } /* catch (Exception ex) { */ } if ((fid >= 0) && loadFullHierarchy) { // load the hierearchy of the file rootNode = loadTree(); } return fid; } /** * Reads the file structure into memory (tree node) * * @return the root node of the file structure. */ private DefaultMutableTreeNode loadTree() { if (fid < 0) { return null; } DefaultMutableTreeNode root = null; long[] rootOID = { 0 }; H5Group rootGroup = new H5Group(this, "/", null, // root node does not // have a parent path null); // root node does not have a parent node root = new DefaultMutableTreeNode(rootGroup) { private static final long serialVersionUID = 991382067363411723L; @Override public boolean isLeaf() { return false; } }; depth_first(root, 0); // reload all return root; } /** * Retrieves the file structure by depth-first order, recursively. The * current implementation retrieves group and dataset only. It does not * include named datatype and soft links. *

    * It also detects and stops loops. A loop is detected if there exists * object with the same object ID by tracing path back up to the root. *

    * * @param parentNode * the parent node. */ private int depth_first(MutableTreeNode parentNode, int nTotal) { int nelems; MutableTreeNode node = null; String fullPath = null; String ppath = null; DefaultMutableTreeNode pnode = (DefaultMutableTreeNode) parentNode; int gid = -1; H5Group pgroup = (H5Group) (pnode.getUserObject()); ppath = pgroup.getPath(); if (ppath == null) { fullPath = HObject.separator; } else { fullPath = ppath + pgroup.getName() + HObject.separator; } nelems = 0; try { gid = pgroup.open(); H5G_info_t info = H5.H5Gget_info(gid); nelems = (int) info.nlinks; } catch (HDF5Exception ex) { nelems = -1; } if (nelems <= 0) { pgroup.close(gid); return nTotal; } // since each call of H5.H5Gget_objname_by_idx() takes about one second. // 1,000,000 calls take 12 days. Instead of calling it in a loop, // we use only one call to get all the information, which takes about // two seconds int[] objTypes = new int[nelems]; long[] fNos = new long[nelems]; long[] objRefs = new long[nelems]; String[] objNames = new String[nelems]; try { H5.H5Gget_obj_info_full(fid, fullPath, objNames, objTypes, null, fNos, objRefs, indexType, indexOrder); } catch (HDF5Exception ex) { ex.printStackTrace(); return nTotal; } int nStart = getStartMembers(); int nMax = getMaxMembers(); String obj_name; int obj_type; // Iterate through the file to see members of the group for (int i = 0; i < nelems; i++) { obj_name = objNames[i]; obj_type = objTypes[i]; long oid[] = { objRefs[i], fNos[i] }; if (obj_name == null) { continue; } nTotal++; if (nMax > 0) { if ((nTotal-nStart)>=nMax) break; // loaded enough objects } boolean skipLoad = false; if ( (nTotal> 0) && (nTotal < nStart)) skipLoad = true; // create a new group if (obj_type == HDF5Constants.H5O_TYPE_GROUP) { H5Group g = new H5Group(this, obj_name, fullPath, pgroup, oid); // deprecated! node = new DefaultMutableTreeNode(g) { private static final long serialVersionUID = 5139629211215794015L; @Override public boolean isLeaf() { return false; } }; pnode.add(node); pgroup.addToMemberList(g); // detect and stop loops // a loop is detected if there exists object with the same // object ID by tracing path back up to the root. boolean hasLoop = false; HObject tmpObj = null; DefaultMutableTreeNode tmpNode = pnode; while (tmpNode != null) { tmpObj = (HObject) tmpNode.getUserObject(); if (tmpObj.equalsOID(oid)) { hasLoop = true; break; } else { tmpNode = (DefaultMutableTreeNode) tmpNode.getParent(); } } // recursively go through the next group // stops if it has loop. if (!hasLoop) { nTotal = depth_first(node, nTotal); } } else if (skipLoad) { continue; } else if (obj_type == HDF5Constants.H5O_TYPE_DATASET) { int did = -1, tid = -1, tclass = -1; try { did = H5.H5Dopen(fid, fullPath + obj_name, HDF5Constants.H5P_DEFAULT); tid = H5.H5Dget_type(did); tclass = H5.H5Tget_class(tid); if ((tclass == HDF5Constants.H5T_ARRAY) || (tclass == HDF5Constants.H5T_VLEN)) { // for ARRAY, the type is determined by the base type int btid = H5.H5Tget_super(tid); int tmpclass = H5.H5Tget_class(btid); // cannot deal with ARRAY of COMPOUND in compound table // viewer if (tmpclass != HDF5Constants.H5T_COMPOUND) tclass = H5.H5Tget_class(btid); try { H5.H5Tclose(btid); } catch (HDF5Exception ex) { } } } catch (HDF5Exception ex) { } finally { try { H5.H5Tclose(tid); } catch (HDF5Exception ex) { } try { H5.H5Dclose(did); } catch (HDF5Exception ex) { } } Dataset d = null; if (tclass == HDF5Constants.H5T_COMPOUND) { // create a new compound dataset d = new H5CompoundDS(this, obj_name, fullPath, oid); // deprecated! } else { // create a new scalar dataset d = new H5ScalarDS(this, obj_name, fullPath, oid); // deprecated! } node = new DefaultMutableTreeNode(d); pnode.add(node); pgroup.addToMemberList(d); } else if (obj_type == HDF5Constants.H5O_TYPE_NAMED_DATATYPE) { Datatype t = new H5Datatype(this, obj_name, fullPath, oid); // deprecated! node = new DefaultMutableTreeNode(t); pnode.add(node); pgroup.addToMemberList(t); } else if (obj_type == HDF5Constants.H5O_TYPE_UNKNOWN) { H5Link link = new H5Link(this, obj_name, fullPath, oid); node = new DefaultMutableTreeNode(link); pnode.add(node); pgroup.addToMemberList(link); continue; // do the next one, if the object is not identified. } } // for ( i = 0; i < nelems; i++) pgroup.close(gid); return nTotal; } // private depth_first() private void depth_first_old(MutableTreeNode parentNode) { int nelems; MutableTreeNode node = null; String fullPath = null; String ppath = null; DefaultMutableTreeNode pnode = (DefaultMutableTreeNode) parentNode; int gid = -1; H5Group pgroup = (H5Group) (pnode.getUserObject()); ppath = pgroup.getPath(); if (ppath == null) { fullPath = HObject.separator; } else { fullPath = ppath + pgroup.getName() + HObject.separator; } nelems = 0; try { gid = pgroup.open(); H5G_info_t info = H5.H5Gget_info(gid); nelems = (int) info.nlinks; } catch (HDF5Exception ex) { nelems = -1; } if (nelems <= 0) { pgroup.close(gid); return; } // since each call of H5.H5Gget_objname_by_idx() takes about one second. // 1,000,000 calls take 12 days. Instead of calling it in a loop, // we use only one call to get all the information, which takes about // two seconds int[] objTypes = new int[nelems]; long[] fNos = new long[nelems]; long[] objRefs = new long[nelems]; String[] objNames = new String[nelems]; try { H5.H5Gget_obj_info_full(fid, fullPath, objNames, objTypes, null, fNos, objRefs, indexType, indexOrder); } catch (HDF5Exception ex) { ex.printStackTrace(); return; } int startIndex = Math.max(0, getStartMembers()); int endIndex = getMaxMembers(); if (endIndex >= nelems) { endIndex = nelems; startIndex = 0; // load all members } endIndex += startIndex; endIndex = Math.min(endIndex, nelems); String obj_name; int obj_type; // int lnk_type; // Iterate through the file to see members of the group for (int i = startIndex; i < endIndex; i++) { obj_name = objNames[i]; obj_type = objTypes[i]; long oid[] = { objRefs[i], fNos[i] }; if (obj_name == null) { continue; } // we need to use the OID for this release. we will rewrite this so // that we do not use the deprecated constructor if (obj_type == HDF5Constants.H5O_TYPE_UNKNOWN) { H5Link link = new H5Link(this, obj_name, fullPath, oid); node = new DefaultMutableTreeNode(link); pnode.add(node); pgroup.addToMemberList(link); continue; // do the next one, if the object is not identified. } // create a new group if (obj_type == HDF5Constants.H5O_TYPE_GROUP) { H5Group g = new H5Group(this, obj_name, fullPath, pgroup, oid); // deprecated! node = new DefaultMutableTreeNode(g) { private static final long serialVersionUID = 5139629211215794015L; @Override public boolean isLeaf() { return false; } }; pnode.add(node); pgroup.addToMemberList(g); // detect and stop loops // a loop is detected if there exists object with the same // object ID by tracing path back up to the root. boolean hasLoop = false; HObject tmpObj = null; DefaultMutableTreeNode tmpNode = pnode; while (tmpNode != null) { tmpObj = (HObject) tmpNode.getUserObject(); if (tmpObj.equalsOID(oid)) { hasLoop = true; break; } else { tmpNode = (DefaultMutableTreeNode) tmpNode.getParent(); } } // recursively go through the next group // stops if it has loop. if (!hasLoop) { depth_first_old(node); } } else if (obj_type == HDF5Constants.H5O_TYPE_DATASET) { int did = -1, tid = -1, tclass = -1; try { did = H5.H5Dopen(fid, fullPath + obj_name, HDF5Constants.H5P_DEFAULT); tid = H5.H5Dget_type(did); tclass = H5.H5Tget_class(tid); if ((tclass == HDF5Constants.H5T_ARRAY) || (tclass == HDF5Constants.H5T_VLEN)) { // for ARRAY, the type is determined by the base type int btid = H5.H5Tget_super(tid); int tmpclass = H5.H5Tget_class(btid); // cannot deal with ARRAY of COMPOUND in compound table // viewer if (tmpclass != HDF5Constants.H5T_COMPOUND) tclass = H5.H5Tget_class(btid); try { H5.H5Tclose(btid); } catch (HDF5Exception ex) { } } } catch (HDF5Exception ex) { } finally { try { H5.H5Tclose(tid); } catch (HDF5Exception ex) { } try { H5.H5Dclose(did); } catch (HDF5Exception ex) { } } Dataset d = null; if (tclass == HDF5Constants.H5T_COMPOUND) { // create a new compound dataset d = new H5CompoundDS(this, obj_name, fullPath, oid); // deprecated! } else { // create a new scalar dataset d = new H5ScalarDS(this, obj_name, fullPath, oid); // deprecated! } node = new DefaultMutableTreeNode(d); pnode.add(node); pgroup.addToMemberList(d); } else if (obj_type == HDF5Constants.H5O_TYPE_NAMED_DATATYPE) { Datatype t = new H5Datatype(this, obj_name, fullPath, oid); // deprecated! node = new DefaultMutableTreeNode(t); pnode.add(node); pgroup.addToMemberList(t); } } // for ( i = 0; i < nelems; i++) pgroup.close(gid); } // private depth_first() private TreeNode copyDataset(Dataset srcDataset, H5Group pgroup, String dstName) throws Exception { Dataset dataset = null; TreeNode newNode; int srcdid = -1, dstdid = -1; int ocp_plist_id = -1; String dname = null, path = null; if (pgroup.isRoot()) { path = HObject.separator; } else { path = pgroup.getPath() + pgroup.getName() + HObject.separator; } if ((dstName == null) || dstName.equals(HObject.separator) || (dstName.length() < 1)) { dstName = srcDataset.getName(); } dname = path + dstName; try { srcdid = srcDataset.open(); dstdid = pgroup.open(); try { ocp_plist_id = H5.H5Pcreate(HDF5Constants.H5P_OBJECT_COPY); H5.H5Pset_copy_object(ocp_plist_id, HDF5Constants.H5O_COPY_EXPAND_REFERENCE_FLAG); H5.H5Ocopy(srcdid, ".", dstdid, dstName, ocp_plist_id, HDF5Constants.H5P_DEFAULT); } catch (Exception ex) { } finally { try { H5.H5Pclose(ocp_plist_id); } catch (Exception ex) { } } if (srcDataset instanceof H5ScalarDS) { dataset = new H5ScalarDS(pgroup.getFileFormat(), dstName, path); } else { dataset = new H5CompoundDS(pgroup.getFileFormat(), dstName, path); } pgroup.addToMemberList(dataset); newNode = new DefaultMutableTreeNode(dataset); } finally { try { srcDataset.close(srcdid); } catch (Exception ex) { } try { pgroup.close(dstdid); } catch (Exception ex) { } } return newNode; } /** * Constructs a dataset for specified dataset idenfitier. * * @param did * the dataset idenfifier * @param name * the name of the dataset * @param path * the path of the dataset * @return the dataset if successful; otherwise return null. * @throws HDF5Exception */ private Dataset getDataset(int did, String name, String path) throws HDF5Exception { Dataset dataset = null; int tid = -1, tclass = -1; try { tid = H5.H5Dget_type(did); tclass = H5.H5Tget_class(tid); if (tclass == HDF5Constants.H5T_ARRAY) { // for ARRAY, the type is determined by the base type int btid = H5.H5Tget_super(tid); tclass = H5.H5Tget_class(btid); try { H5.H5Tclose(btid); } catch (HDF5Exception ex) { } } } finally { try { H5.H5Tclose(tid); } catch (HDF5Exception ex) { } } if (tclass == HDF5Constants.H5T_COMPOUND) { dataset = new H5CompoundDS(this, name, path); } else { dataset = new H5ScalarDS(this, name, path); } return dataset; } /** * Copies a named datatype to another location * * @param srcType * the source datatype * @param pgroup * the group which the new datatype is copied to * @param dstName * the name of the new dataype * @return the tree node containing the new datatype. * @throws Exception */ private TreeNode copyDatatype(Datatype srcType, H5Group pgroup, String dstName) throws Exception { Datatype datatype = null; int tid_src = -1, gid_dst = -1; String path = null; DefaultMutableTreeNode newNode = null; if (pgroup.isRoot()) { path = HObject.separator; } else { path = pgroup.getPath() + pgroup.getName() + HObject.separator; } if ((dstName == null) || dstName.equals(HObject.separator) || (dstName.length() < 1)) { dstName = srcType.getName(); } try { tid_src = srcType.open(); gid_dst = pgroup.open(); try { H5.H5Ocopy(tid_src, ".", gid_dst, dstName, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Exception ex) { } datatype = new H5Datatype(pgroup.getFileFormat(), dstName, path); pgroup.addToMemberList(datatype); newNode = new DefaultMutableTreeNode(datatype); } finally { try { srcType.close(tid_src); } catch (Exception ex) { } try { pgroup.close(gid_dst); } catch (Exception ex) { } } return newNode; } /** * Copies a group and its members to a new location * * @param srcGroup * the source group * @param pgroup * the location which the new group is located * @param dstName * the name of the new group * @return the tree node containing the new group; */ private TreeNode copyGroup(H5Group srcGroup, H5Group pgroup, String dstName) throws Exception { H5Group group = null; DefaultMutableTreeNode newNode = null; int srcgid = -1, dstgid = -1; String gname = null, path = null; if (pgroup.isRoot()) { path = HObject.separator; } else { path = pgroup.getPath() + pgroup.getName() + HObject.separator; } if ((dstName == null) || dstName.equals(HObject.separator) || (dstName.length() < 1)) { dstName = srcGroup.getName(); } gname = path + dstName; try { srcgid = srcGroup.open(); dstgid = pgroup.open(); try { H5.H5Ocopy(srcgid, ".", dstgid, dstName, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Exception ex) { ex.printStackTrace(); } group = new H5Group(pgroup.getFileFormat(), dstName, path, pgroup); newNode = new DefaultMutableTreeNode(group) { private static final long serialVersionUID = -4981107816640372359L; @Override public boolean isLeaf() { return false; } }; depth_first(newNode, Integer.MIN_VALUE); // reload all pgroup.addToMemberList(group); } finally { try { srcGroup.close(srcgid); } catch (Exception ex) { } try { pgroup.close(dstgid); } catch (Exception ex) { } } return newNode; } /** * Constructs a group for specified group identifier and retrieves members. * * @param gid * The group identifier. * @param name * The group name. * @param pGroup * The parent group, or null for the root group. * @return The group if successful; otherwise returns false. * @throws HDF5Exception */ private H5Group getGroup(int gid, String name, Group pGroup) throws HDF5Exception { String parentPath = null; String thisFullName = null; String memberFullName = null; if (pGroup == null) { thisFullName = name = "/"; } else { parentPath = pGroup.getFullName(); if ((parentPath == null) || parentPath.equals("/")) { thisFullName = "/" + name; } else { thisFullName = parentPath + "/" + name; } } // get rid of any extra "/" if (parentPath != null) { parentPath = parentPath.replaceAll("//", "/"); } if (thisFullName != null) { thisFullName = thisFullName.replaceAll("//", "/"); } H5Group group = new H5Group(this, name, parentPath, pGroup); H5G_info_t group_info = null; H5O_info_t obj_info = null; int oid = -1; String link_name = null; try { group_info = H5.H5Gget_info(gid); } catch (HDF5Exception ex) { } try { oid = H5.H5Oopen(gid, thisFullName, HDF5Constants.H5P_DEFAULT); } catch (HDF5Exception ex) { } // retrieve only the immediate members of the group, do not follow // subgroups for (int i = 0; i < group_info.nlinks; i++) { try { link_name = H5.H5Lget_name_by_idx(gid, thisFullName, indexType, indexOrder, i, HDF5Constants.H5P_DEFAULT); obj_info = H5 .H5Oget_info_by_idx(oid, thisFullName, indexType, indexOrder, i, HDF5Constants.H5P_DEFAULT); } catch (HDF5Exception ex) { ex.printStackTrace(); // do not stop if accessing one member fails continue; } // create a new group if (obj_info.type == HDF5Constants.H5O_TYPE_GROUP) { H5Group g = new H5Group(this, link_name, thisFullName, group); group.addToMemberList(g); } else if (obj_info.type == HDF5Constants.H5O_TYPE_DATASET) { int did = -1; Dataset d = null; if ((thisFullName == null) || thisFullName.equals("/")) { memberFullName = "/" + link_name; } else { memberFullName = thisFullName + "/" + link_name; } try { did = H5.H5Dopen(fid, memberFullName, HDF5Constants.H5P_DEFAULT); d = getDataset(did, link_name, thisFullName); } finally { try { H5.H5Dclose(did); } catch (HDF5Exception ex) { } } group.addToMemberList(d); } else if (obj_info.type == HDF5Constants.H5O_TYPE_NAMED_DATATYPE) { Datatype t = new H5Datatype(this, link_name, thisFullName); group.addToMemberList(t); } } // End of for loop. try { if (oid >= 0) H5.H5Oclose(oid); } catch (HDF5Exception ex) { } return group; } /** * Retrieves the name of the target object that is being linked to. * * @param obj * The current link object. * @return The name of the target object. * @throws HDF5Exception */ public static String getLinkTargetName(HObject obj) throws Exception { String[] link_value = { null, null }; String targetObjName = null; if (obj == null) { return null; } H5L_info_t link_info = null; try { link_info = H5.H5Lget_info(obj.getFID(), obj.getFullName(), HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { } if (link_info != null) { if ((link_info.type == HDF5Constants.H5L_TYPE_SOFT) || (link_info.type == HDF5Constants.H5L_TYPE_EXTERNAL)) { try { H5.H5Lget_val(obj.getFID(), obj.getFullName(), link_value, HDF5Constants.H5P_DEFAULT); } catch (Exception ex) { ex.printStackTrace(); } if (link_info.type == HDF5Constants.H5L_TYPE_SOFT) targetObjName = link_value[0]; else if (link_info.type == HDF5Constants.H5L_TYPE_EXTERNAL) { targetObjName = link_value[1] + FileFormat.FILE_OBJ_SEP + link_value[0]; } } } return targetObjName; } /** * Renames an attribute. * * @param obj * The object whose attribute is to be renamed. * @param oldAttrName * The current name of the attribute. * @param newAttrName * The new name of the attribute. * @throws HDF5Exception */ public void renameAttribute(HObject obj, String oldAttrName, String newAttrName) throws Exception { if (!attrFlag) { attrFlag = true; H5.H5Arename_by_name(obj.getFID(), obj.getName(), oldAttrName, newAttrName, HDF5Constants.H5P_DEFAULT); } } /** * Rename the given object * * @param obj * the object to be renamed. * @param newName * the new name of the object. * @throws Exception */ public static void renameObject(HObject obj, String newName) throws Exception { String currentFullPath = obj.getPath() + obj.getName(); String newFullPath = obj.getPath() + newName; currentFullPath = currentFullPath.replaceAll("//", "/"); newFullPath = newFullPath.replaceAll("//", "/"); if (currentFullPath.equals("/")) { throw new HDF5Exception("Can't rename the root group."); } if (currentFullPath.equals(newFullPath)) { throw new HDF5Exception("The new name is the same as the current name."); } // Call the library to move things in the file H5.H5Lmove(obj.getFID(), currentFullPath, obj.getFID(), newFullPath, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } public static int getIndexTypeValue(String strtype) { if(strtype.compareTo("H5_INDEX_NAME")==0) return HDF5Constants.H5_INDEX_NAME; if(strtype.compareTo("H5_INDEX_CRT_ORDER")==0) return HDF5Constants.H5_INDEX_CRT_ORDER; if(strtype.compareTo("H5_INDEX_N")==0) return HDF5Constants.H5_INDEX_N; return HDF5Constants.H5_INDEX_UNKNOWN; } public static int getIndexOrderValue(String strorder) { if(strorder.compareTo("H5_ITER_INC")==0) return HDF5Constants.H5_ITER_INC; if(strorder.compareTo("H5_ITER_DEC")==0) return HDF5Constants.H5_ITER_DEC; if(strorder.compareTo("H5_ITER_NATIVE")==0) return HDF5Constants.H5_ITER_NATIVE; if(strorder.compareTo("H5_ITER_N")==0) return HDF5Constants.H5_ITER_N; return HDF5Constants.H5_ITER_UNKNOWN; } public int getIndexType(String strtype) { if(strtype!=null) { if(strtype.compareTo("H5_INDEX_NAME")==0) return HDF5Constants.H5_INDEX_NAME; if(strtype.compareTo("H5_INDEX_CRT_ORDER")==0) return HDF5Constants.H5_INDEX_CRT_ORDER; return HDF5Constants.H5_INDEX_UNKNOWN; } return getIndexType(); } public int getIndexType() { return indexType; } public void setIndexType(int indexType) { this.indexType = indexType; } public int getIndexOrder(String strorder) { if(strorder!=null) { if(strorder.compareTo("H5_ITER_INC")==0) return HDF5Constants.H5_ITER_INC; if(strorder.compareTo("H5_ITER_DEC")==0) return HDF5Constants.H5_ITER_DEC; if(strorder.compareTo("H5_ITER_NATIVE")==0) return HDF5Constants.H5_ITER_NATIVE; if(strorder.compareTo("H5_ITER_N")==0) return HDF5Constants.H5_ITER_N; return HDF5Constants.H5_ITER_UNKNOWN; } return getIndexOrder(); } public int getIndexOrder() { return indexOrder; } public void setIndexOrder(int indexOrder) { this.indexOrder = indexOrder; } } jhdf-2.9/ncsa/hdf/object/h5/H5CompoundDS.java0000755000175000017500000014452012050301060021477 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.object.h5; import java.lang.reflect.Array; import java.util.List; import java.util.Vector; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.structs.H5O_info_t; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; /** * The H5CompoundDS class defines an HDF5 dataset of compound datatypes. *

    * An HDF5 dataset is an object composed of a collection of data elements, or * raw data, and metadata that stores a description of the data elements, data * layout, and all other information necessary to write, read, and interpret the * stored data. *

    * A HDF5 compound datatype is similar to a struct in C or a common block in * Fortran: it is a collection of one or more atomic types or small arrays of * such types. Each member of a compound type has a name which is unique within * that type, and a byte offset that determines the first byte (smallest byte * address) of that member in a compound datum. *

    * For more information on HDF5 datasets and datatypes, read the HDF5 User's Guide. *

    * There are two basic types of compound datasets: simple compound data and * nested compound data. Members of a simple compound dataset have atomic * datatyes. Members of a nested compound dataset are compound or array of * compound data. *

    * Since Java does not understand C structures, we cannot directly read/write * compound data values as in the following C example. * *

     * typedef struct s1_t {
     *         int    a;
     *         float  b;
     *         double c; 
     *         } s1_t;
     *     s1_t       s1[LENGTH];
     *     ...
     *     H5Dwrite(..., s1);
     *     H5Dread(..., s1);
     * 
    * * Values of compound data fields are stored in java.util.Vector object. We read * and write compound data by fields instead of compound structure. As for the * example above, the java.util.Vector object has three elements: int[LENGTH], * float[LENGTH] and double[LENGTH]. Since Java understands the primitive * datatypes of int, float and double, we will be able to read/write the * compound data by field. *

    *

    * * @version 1.1 9/4/2007 * @author Peter X. Cao */ public class H5CompoundDS extends CompoundDS { /** * */ private static final long serialVersionUID = -5968625125574032736L; /** * The list of attributes attached data object. */ private List attributeList; private int nAttributes = -1; private H5O_info_t obj_info; /** * A list of names of all fields including nested fields. *

    * The nested names are separated by CompoundDs.separator. For example, if * compound dataset "A" has the following nested structure, * *

         * A --> m01
         * A --> m02
         * A --> nest1 --> m11
         * A --> nest1 --> m12
         * A --> nest1 --> nest2 --> m21
         * A --> nest1 --> nest2 --> m22
         * i.e.
         * A = { m01, m02, nest1{m11, m12, nest2{ m21, m22}}}
         * 
    * * The flatNameList of compound dataset "A" will be {m01, m02, nest1[m11, * nest1[m12, nest1[nest2[m21, nest1[nest2[m22} * */ private List flatNameList; /** * A list of datatypes of all fields including nested fields. */ private List flatTypeList; /** flag to indicate is the dataset is an external dataset */ private boolean isExternal = false; /** * Constructs an HDF5 compound dataset with given file, dataset name and * path. *

    * The dataset object represents an existing dataset in the file. For * example, new H5CompoundDS(file, "dset1", "/g0/") constructs a dataset * object that corresponds to the dataset,"dset1", at group "/g0/". *

    * This object is usually constructed at FileFormat.open(), which loads the * file structure and object informatoin into tree structure (TreeNode). It * is rarely used elsewhere. *

    * * @param theFile * the file that contains the dataset. * @param name * the name of the CompoundDS, e.g. "compDS". * @param path * the path of the CompoundDS, e.g. "/g1". */ public H5CompoundDS(FileFormat theFile, String name, String path) { this(theFile, name, path, null); } /** * @deprecated Not for public use in the future.
    * Using {@link #H5CompoundDS(FileFormat, String, String)} */ @Deprecated public H5CompoundDS(FileFormat theFile, String name, String path, long[] oid) { super(theFile, name, path, oid); obj_info = new H5O_info_t(-1L, -1L, 0, 0, -1L, 0L, 0L, 0L, 0L, null, null, null); if ((oid == null) && (theFile != null)) { // retrieve the object ID try { byte[] ref_buf = H5.H5Rcreate(theFile.getFID(), this.getFullName(), HDF5Constants.H5R_OBJECT, -1); this.oid = new long[1]; this.oid[0] = HDFNativeData.byteToLong(ref_buf, 0); } catch (Exception ex) {} } } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#hasAttribute() */ public boolean hasAttribute() { obj_info.num_attrs = nAttributes; if (obj_info.num_attrs < 0) { int did = -1; try { did = H5.H5Dopen(getFID(), getPath() + getName(), HDF5Constants.H5P_DEFAULT); obj_info = H5.H5Oget_info(did); nAttributes = (int) obj_info.num_attrs; } catch (Exception ex) { obj_info.num_attrs = 0; } close(did); } return (obj_info.num_attrs > 0); } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#getDatatype() */ @Override public Datatype getDatatype() { if (datatype == null) { datatype = new H5Datatype(Datatype.CLASS_COMPOUND, -1, -1, -1); } return datatype; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#clear() */ @Override public void clear() { super.clear(); if (attributeList != null) { ((Vector) attributeList).setSize(0); } } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#readBytes() */ @Override public byte[] readBytes() throws HDF5Exception { byte[] theData = null; if (rank <= 0) { init(); } int did = open(); int fspace = -1, mspace = -1, tid = -1; try { long[] lsize = { 1 }; for (int j = 0; j < selectedDims.length; j++) { lsize[0] *= selectedDims[j]; } fspace = H5.H5Dget_space(did); mspace = H5.H5Screate_simple(rank, selectedDims, null); // set the rectangle selection // HDF5 bug: for scalar dataset, H5Sselect_hyperslab gives core dump if (rank * dims[0] > 1) { H5.H5Sselect_hyperslab(fspace, HDF5Constants.H5S_SELECT_SET, startDims, selectedStride, selectedDims, null); // set // block // to 1 } tid = H5.H5Dget_type(did); int size = H5.H5Tget_size(tid) * (int) lsize[0]; theData = new byte[size]; H5.H5Dread(did, tid, mspace, fspace, HDF5Constants.H5P_DEFAULT, theData); } finally { try { H5.H5Sclose(fspace); } catch (Exception ex2) {} try { H5.H5Sclose(mspace); } catch (Exception ex2) {} try { H5.H5Tclose(tid); } catch (HDF5Exception ex2) {} close(did); } return theData; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#read() */ @Override public Object read() throws HDF5Exception { List list = null; Object member_data = null; String member_name = null; int tid = -1, atom_tid = -1, member_class = -1, member_size = 0; int spaceIDs[] = { -1, -1 }; // spaceIDs[0]=mspace, spaceIDs[1]=fspace if (rank <= 0) { init(); // read data information into memory } if (numberOfMembers <= 0) { return null; // this compound dataset does not have any member } if (isExternal) { String pdir = this.getFileFormat().getAbsoluteFile().getParent(); if (pdir == null) { pdir = "."; } H5.H5Dchdir_ext(pdir); } int did = open(); list = new Vector(flatNameList.size()); Vector atomicList = new Vector(); try { // to match finally for closing resources long[] lsize = { 1 }; lsize[0] = selectHyperslab(did, spaceIDs); // read each of member data into a byte array, then extract // it into its type such, int, long, float, etc. int n = flatNameList.size(); tid = H5.H5Dget_type(did); int tclass = H5.H5Tget_class(tid); if (tclass == HDF5Constants.H5T_ARRAY) { // array of compound int tmptid = tid; tid = H5.H5Tget_super(tmptid); try { H5.H5Tclose(tmptid); } catch (HDF5Exception ex) {} } extractCompoundInfo(tid, null, null, atomicList); for (int i = 0; i < n; i++) { boolean isVL = false; if (!isMemberSelected[i]) { continue; // the field is not selected } member_name = new String(memberNames[i]); atom_tid = ((Integer) atomicList.get(i)).intValue(); try { member_class = H5.H5Tget_class(atom_tid); member_size = H5.H5Tget_size(atom_tid); member_data = H5Datatype.allocateArray(atom_tid, (int) lsize[0]); } catch (Exception ex) { member_data = null; } if (member_data == null || H5.H5Tequal(atom_tid, HDF5Constants.H5T_STD_REF_DSETREG)) { String[] nullValues = new String[(int) lsize[0]]; String errorStr = "*unsupported*"; for (int j = 0; j < lsize[0]; j++) { nullValues[j] = errorStr; } list.add(nullValues); continue; } if (member_class == HDF5Constants.H5T_ARRAY) { int tmptid = H5.H5Tget_super(atom_tid); isVL = H5.H5Tis_variable_str(tmptid); member_class = H5.H5Tget_class(tmptid); try { H5.H5Tclose(tmptid); } catch (Exception ex) {} } int comp_tid = -1; int compInfo[] = { member_class, member_size, 0 }; try { comp_tid = createCompoundFieldType(atom_tid, member_name, compInfo); try { // See BUG#951 isVL = H5.H5Tdetect_class(atom_tid, // HDF5Constants.H5T_VLEN); isVL = isVL || H5.H5Tis_variable_str(atom_tid); isVL = isVL || H5.H5Tdetect_class(atom_tid, HDF5Constants.H5T_VLEN); } catch (Exception ex) {} if (isVL) { H5.H5DreadVL(did, comp_tid, spaceIDs[0], spaceIDs[1], HDF5Constants.H5P_DEFAULT, (Object[]) member_data); } else { H5.H5Dread(did, comp_tid, spaceIDs[0], spaceIDs[1], HDF5Constants.H5P_DEFAULT, member_data); } } catch (HDF5Exception ex2) { String[] nullValues = new String[(int) lsize[0]]; for (int j = 0; j < lsize[0]; j++) { nullValues[j] = ""; } list.add(nullValues); continue; } finally { try { H5.H5Tclose(comp_tid); } catch (Exception ex2) {} } if (!isVL) { String cname = member_data.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); if ((member_class == HDF5Constants.H5T_STRING) && convertByteToString) { if (dname == 'B') member_data = byteToString((byte[]) member_data, member_size / memberOrders[i]); } else if (member_class == HDF5Constants.H5T_REFERENCE) { if (dname == 'B') member_data = HDFNativeData.byteToLong((byte[]) member_data); } else if (compInfo[2] != 0) { member_data = Dataset.convertFromUnsignedC(member_data, null); } else if (member_class == HDF5Constants.H5T_ENUM && enumConverted) { try { String[] strs = H5Datatype.convertEnumValueToName(atom_tid, member_data, null); if (strs != null) { member_data = strs; } } catch (Exception ex) {} } } list.add(member_data); } // end of for (int i=0; i * The data buffer is a vector that contains the data values of compound * fields. The data is written into file field by field. * * @param buf * The vector that contains the data values of compound fields. */ @Override public void write(Object buf) throws HDF5Exception { if ((buf == null) || (numberOfMembers <= 0) || !(buf instanceof List)) { return; } List list = (List) buf; Object member_data = null; String member_name = null; int tid = -1, atom_tid = -1, member_class = -1, member_size = 0; int spaceIDs[] = { -1, -1 }; // spaceIDs[0]=mspace, spaceIDs[1]=fspace int did = open(); Vector atomicList = new Vector(); try { // to match finally for closing resources long[] lsize = { 1 }; lsize[0] = selectHyperslab(did, spaceIDs); // read each of member data into a byte array, then extract // it into its type such, int, long, float, etc. int idx = 0; int n = flatNameList.size(); boolean isEnum = false; tid = H5.H5Dget_type(did); extractCompoundInfo(tid, null, null, atomicList); for (int i = 0; i < n; i++) { if (!isMemberSelected[i]) { continue; // the field is not selected } member_name = new String(memberNames[i]); atom_tid = ((Integer) atomicList.get(i)).intValue(); member_data = list.get(idx++); if (member_data == null) { continue; } boolean isVL = false; try { isVL = (H5.H5Tdetect_class(atom_tid, HDF5Constants.H5T_VLEN)); } catch (Exception ex) {} if (isVL) { continue; } try { member_class = H5.H5Tget_class(atom_tid); member_size = H5.H5Tget_size(atom_tid); isEnum = (member_class == HDF5Constants.H5T_ENUM); } catch (Exception ex) {} Object tmpData = member_data; int comp_tid = -1; int compInfo[] = { member_class, member_size, 0 }; try { comp_tid = createCompoundFieldType(atom_tid, member_name, compInfo); if (compInfo[2] != 0) { tmpData = convertToUnsignedC(member_data, null); } else if ((member_class == HDF5Constants.H5T_STRING) && (Array.get(member_data, 0) instanceof String)) { tmpData = stringToByte((String[]) member_data, member_size); } else if (isEnum && (Array.get(member_data, 0) instanceof String)) { tmpData = H5Datatype.convertEnumNameToValue(atom_tid, (String[]) member_data, null); } if (tmpData != null) { // BUG!!! does not write nested compound data and no // exception was caught // need to check if it is a java error or C library // error H5.H5Dwrite(did, comp_tid, spaceIDs[0], spaceIDs[1], HDF5Constants.H5P_DEFAULT, tmpData); } } finally { try { H5.H5Tclose(comp_tid); } catch (Exception ex2) {} } } // end of for (int i=0; i getMetadata() throws HDF5Exception { return this.getMetadata(fileFormat.getIndexType(null), fileFormat.getIndexOrder(null)); } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#getMetadata(int...) */ public List getMetadata(int... attrPropList) throws HDF5Exception { if (rank <= 0) { init(); } try { this.linkTargetObjName = H5File.getLinkTargetName(this); } catch (Exception ex) {} if (attributeList != null) { return attributeList; } // load attributes first int did = -1, pid = -1; int indxType = fileFormat.getIndexType(null); int order = fileFormat.getIndexOrder(null); if (attrPropList.length > 0) { indxType = attrPropList[0]; if (attrPropList.length > 1) { order = attrPropList[1]; } } try { did = open(); attributeList = H5File.getAttribute(did, indxType, order); // get the compresson and chunk information pid = H5.H5Dget_create_plist(did); if (H5.H5Pget_layout(pid) == HDF5Constants.H5D_CHUNKED) { chunkSize = new long[rank]; H5.H5Pget_chunk(pid, rank, chunkSize); } else { chunkSize = null; } int[] flags = { 0, 0 }; long[] cd_nelmts = { 2 }; int[] cd_values = { 0, 0 }; String[] cd_name = { "", "" }; int nfilt = H5.H5Pget_nfilters(pid); int filter = -1; int[] filter_config = { 1 }; compression = ""; for (int i = 0; i < nfilt; i++) { if (i > 0) { compression += ", "; } try { filter = H5.H5Pget_filter(pid, i, flags, cd_nelmts, cd_values, 120, cd_name, filter_config); } catch (Throwable err) { compression += "ERROR"; continue; } if (filter == HDF5Constants.H5Z_FILTER_DEFLATE) { compression += "GZIP: level = " + cd_values[0]; } else if (filter == HDF5Constants.H5Z_FILTER_FLETCHER32) { compression += "Error detection filter"; } else if (filter == HDF5Constants.H5Z_FILTER_SHUFFLE) { compression += "SHUFFLE: Nbytes = " + cd_values[0]; } else if (filter == HDF5Constants.H5Z_FILTER_SZIP) { compression += "SZIP: Pixels per block = " + cd_values[1]; int flag = -1; try { flag = H5.H5Zget_filter_info(filter); } catch (Exception ex) { flag = -1; } if (flag == HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED) { compression += ": H5Z_FILTER_CONFIG_DECODE_ENABLED"; } else if ((flag == HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED) || (flag >= (HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED + HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED))) { compression += ": H5Z_FILTER_CONFIG_ENCODE_ENABLED"; } } } // for (int i=0; i attrList = getMetadata(); attrList.remove(attr); nAttributes = attrList.size(); } finally { close(did); } } /* * (non-Javadoc) * * @see ncsa.hdf.object.HObject#open() */ @Override public int open() { int did = -1; try { did = H5.H5Dopen(getFID(), getPath() + getName(), HDF5Constants.H5P_DEFAULT); } catch (HDF5Exception ex) { did = -1; } return did; } /* * (non-Javadoc) * * @see ncsa.hdf.object.HObject#close(int) */ @Override public void close(int did) { try { H5.H5Fflush(did, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Exception ex) {} try { H5.H5Dclose(did); } catch (HDF5Exception ex) {} } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#init() */ @Override public void init() { if (rank > 0) { resetSelection(); return; // already called. Initialize only once } int did = -1, sid = -1, tid = -1, tclass = -1; String fullName = getPath() + getName(); flatNameList = new Vector(); flatTypeList = new Vector(); int[] memberTIDs = null; did = open(); // check if it is an external dataset int pid = -1; try { pid = H5.H5Dget_create_plist(did); int nfiles = H5.H5Pget_external_count(pid); isExternal = (nfiles > 0); } catch (Exception ex) {} finally { try { H5.H5Pclose(pid); } catch (Exception ex) {} } try { sid = H5.H5Dget_space(did); rank = H5.H5Sget_simple_extent_ndims(sid); if (rank == 0) { // a scalar data point rank = 1; dims = new long[1]; dims[0] = 1; } else { dims = new long[rank]; maxDims = new long[rank]; H5.H5Sget_simple_extent_dims(sid, dims, maxDims); } startDims = new long[rank]; selectedDims = new long[rank]; // initialize member information tid = H5.H5Dget_type(did); tclass = H5.H5Tget_class(tid); int tmptid = 0; if (tclass == HDF5Constants.H5T_ARRAY) { // array of compound tmptid = tid; tid = H5.H5Tget_super(tmptid); try { H5.H5Tclose(tmptid); } catch (HDF5Exception ex) {} } extractCompoundInfo(tid, "", flatNameList, flatTypeList); numberOfMembers = flatNameList.size(); memberNames = new String[numberOfMembers]; memberTIDs = new int[numberOfMembers]; memberTypes = new Datatype[numberOfMembers]; memberOrders = new int[numberOfMembers]; isMemberSelected = new boolean[numberOfMembers]; memberDims = new Object[numberOfMembers]; for (int i = 0; i < numberOfMembers; i++) { isMemberSelected[i] = true; memberTIDs[i] = ((Integer) flatTypeList.get(i)).intValue(); memberTypes[i] = new H5Datatype(memberTIDs[i]); memberNames[i] = (String) flatNameList.get(i); memberOrders[i] = 1; memberDims[i] = null; try { tclass = H5.H5Tget_class(memberTIDs[i]); } catch (HDF5Exception ex) {} if (tclass == HDF5Constants.H5T_ARRAY) { int n = H5.H5Tget_array_ndims(memberTIDs[i]); long mdim[] = new long[n]; H5.H5Tget_array_dims(memberTIDs[i], mdim); int idim[] = new int[n]; for (int j = 0; j < n; j++) idim[j] = (int) mdim[j]; memberDims[i] = idim; tmptid = H5.H5Tget_super(memberTIDs[i]); memberOrders[i] = (H5.H5Tget_size(memberTIDs[i]) / H5.H5Tget_size(tmptid)); try { H5.H5Tclose(tmptid); } catch (HDF5Exception ex) {} } } // for (int i=0; i 2) { selectedIndex[0] = rank - 2; // columns selectedIndex[1] = rank - 1; // rows selectedIndex[2] = rank - 3; selectedDims[rank - 1] = dims[rank - 1]; selectedDims[rank - 2] = dims[rank - 2]; } isDataLoaded = false; setMemberSelection(true); } /** * Extracts compound information into flat structure. *

    * For example, compound datatype "nest" has {nest1{a, b, c}, d, e} then * extractCompoundInfo() will put the names of nested compound fields into a * flat list as * *

         * nest.nest1.a
         * nest.nest1.b
         * nest.nest1.c
         * nest.d
         * nest.e
         * 
    */ private void extractCompoundInfo(int tid, String name, List names, List types) { int nMembers = 0, mclass = -1, mtype = -1; String mname = null; try { nMembers = H5.H5Tget_nmembers(tid); } catch (Exception ex) { nMembers = 0; } if (nMembers <= 0) { return; } int tmptid = -1; for (int i = 0; i < nMembers; i++) { try { mtype = H5.H5Tget_member_type(tid, i); } catch (Exception ex) { continue; } try { tmptid = mtype; mtype = H5.H5Tget_native_type(tmptid); } catch (HDF5Exception ex) { continue; } finally { try { H5.H5Tclose(tmptid); } catch (HDF5Exception ex) {} } try { mclass = H5.H5Tget_class(mtype); } catch (HDF5Exception ex) { continue; } if (names != null) { mname = name + H5.H5Tget_member_name(tid, i); } if (mclass == HDF5Constants.H5T_COMPOUND) { extractCompoundInfo(mtype, mname + CompoundDS.separator, names, types); continue; } else if (mclass == HDF5Constants.H5T_ARRAY) { try { tmptid = H5.H5Tget_super(mtype); int tmpclass = H5.H5Tget_class(tmptid); // cannot deal with ARRAY of COMPOUND or ARRAY of ARRAY // support only ARRAY of atomic types if ((tmpclass == HDF5Constants.H5T_COMPOUND) || (tmpclass == HDF5Constants.H5T_ARRAY)) { continue; } } catch (Exception ex) { continue; } finally { try { H5.H5Tclose(tmptid); } catch (Exception ex) {} } } if (names != null) { names.add(mname); } types.add(new Integer(mtype)); } // for (int i=0; i * Using * {@link #create(String, Group, long[], long[], long[], int, String[], Datatype[], int[], int[][], Object)} */ @Deprecated public static Dataset create(String name, Group pgroup, long[] dims, String[] memberNames, Datatype[] memberDatatypes, int[] memberSizes, Object data) throws Exception { if ((pgroup == null) || (name == null) || (dims == null) || (memberNames == null) || (memberDatatypes == null) || (memberSizes == null)) { return null; } int nMembers = memberNames.length; int memberRanks[] = new int[nMembers]; long memberDims[][] = new long[nMembers][1]; for (int i = 0; i < nMembers; i++) { memberRanks[i] = 1; memberDims[i][0] = memberSizes[i]; } return H5CompoundDS.create(name, pgroup, dims, memberNames, memberDatatypes, memberRanks, memberDims, data); } /** * @deprecated Not for public use in the future.
    * Using * {@link #create(String, Group, long[], long[], long[], int, String[], Datatype[], int[], int[][], Object)} */ @Deprecated public static Dataset create(String name, Group pgroup, long[] dims, String[] memberNames, Datatype[] memberDatatypes, int[] memberRanks, long[][] memberDims, Object data) throws Exception { return H5CompoundDS.create(name, pgroup, dims, null, null, -1, memberNames, memberDatatypes, memberRanks, memberDims, data); } /** * Creates a simple compound dataset in a file with/without chunking and * compression *

    * This function provides an easy way to create a simple compound dataset in * file by hiding tedious details of creating a compound dataset from users. *

    * This functoin calls H5.H5Dcreate() to create a simple compound dataset in * file. Nested compound dataset is not supported. The required information * to create a compound dataset includes the name, the parent group and data * space of the dataset, the names, datatypes and data spaces of the * compound fields. Other information such as chunks, compression and the * data buffer is optional. *

    * The following example shows how to use this function to create a compound * dataset in file. * *

         * H5File file = null;
         * String message = "";
         * Group pgroup = null;
         * int[] DATA_INT = new int[DIM_SIZE];
         * float[] DATA_FLOAT = new float[DIM_SIZE];
         * String[] DATA_STR = new String[DIM_SIZE];
         * long[] DIMs = { 50, 10 };
         * long[] CHUNKs = { 25, 5 };
         * 
         * try {
         *     file = (H5File) H5FILE.open(fname, H5File.CREATE);
         *     file.open();
         *     pgroup = (Group) file.get("/");
         * }
         * catch (Exception ex) {}
         * 
         * Vector data = new Vector();
         * data.add(0, DATA_INT);
         * data.add(1, DATA_FLOAT);
         * data.add(2, DATA_STR);
         * 
         * // create groups
         * Datatype[] mdtypes = new H5Datatype[3];
         * String[] mnames = { "int", "float", "string" };
         * Dataset dset = null;
         * try {
         *     mdtypes[0] = new H5Datatype(Datatype.CLASS_INTEGER, 4, -1, -1);
         *     mdtypes[1] = new H5Datatype(Datatype.CLASS_FLOAT, 4, -1, -1);
         *     mdtypes[2] = new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1);
         *     dset = file.createCompoundDS("/CompoundDS", pgroup, DIMs, null, CHUNKs, 9, mnames, mdtypes, null, data);
         * }
         * catch (Exception ex) {
         *     failed(message, ex, file);
         *     return 1;
         * }
         * 
    * * @param name * the name of the new dataset * @param pgroup * parent group where the new dataset is created. * @param dims * the dimension size * @param maxdims * maximum dimension sizes of the new dataset, null if maxdims is * the same as dims. * @param chunks * chunk sizes of the new dataset, null if no chunking * @param gzip * GZIP compression level (1 to 9), 0 or negative values if no * compression. * @param memberNames * the names of compound datatype * @param memberDatatypes * the datatypes of the compound datatype * @param memberRanks * the ranks of the members * @param memberDims * the dim sizes of the members * @param data * list of data arrays written to the new dataset, null if no * data is written to the new dataset. * * @return the new compound dataset if successful; otherwise returns null */ public static Dataset create(String name, Group pgroup, long[] dims, long[] maxdims, long[] chunks, int gzip, String[] memberNames, Datatype[] memberDatatypes, int[] memberRanks, long[][] memberDims, Object data) throws Exception { H5CompoundDS dataset = null; String fullPath = null; int did = -1, sid = -1, tid = -1, plist = -1; if ((pgroup == null) || (name == null) || (dims == null) || (memberNames == null) || (memberDatatypes == null) || (memberRanks == null) || (memberDims == null)) { return null; } H5File file = (H5File) pgroup.getFileFormat(); if (file == null) { return null; } String path = HObject.separator; if (!pgroup.isRoot()) { path = pgroup.getPath() + pgroup.getName() + HObject.separator; if (name.endsWith("/")) { name = name.substring(0, name.length() - 1); } int idx = name.lastIndexOf("/"); if (idx >= 0) { name = name.substring(idx + 1); } } fullPath = path + name; int typeSize = 0; int nMembers = memberNames.length; int[] mTypes = new int[nMembers]; int memberSize = 1; int rank = dims.length; for (int i = 0; i < nMembers; i++) { memberSize = 1; for (int j = 0; j < memberRanks[i]; j++) { memberSize *= memberDims[i][j]; } // the member is an array if ((memberSize > 1) && (memberDatatypes[i].getDatatypeClass() != Datatype.CLASS_STRING)) { int tmptid = -1; try { tmptid = memberDatatypes[i].toNative(); mTypes[i] = H5.H5Tarray_create(tmptid, memberRanks[i], memberDims[i]); } finally { try { H5.H5Tclose(tmptid); } catch (Exception ex) {} } } else { mTypes[i] = memberDatatypes[i].toNative(); } typeSize += H5.H5Tget_size(mTypes[i]); } try { tid = H5.H5Tcreate(HDF5Constants.H5T_COMPOUND, typeSize); int offset = 0; for (int i = 0; i < nMembers; i++) { H5.H5Tinsert(tid, memberNames[i], offset, mTypes[i]); offset += H5.H5Tget_size(mTypes[i]); } sid = H5.H5Screate_simple(rank, dims, maxdims); // setup chunking and compression boolean isExtentable = false; if (maxdims != null) { for (int i = 0; i < maxdims.length; i++) { if (maxdims[i] == 0) { maxdims[i] = dims[i]; } else if (maxdims[i] < 0) { maxdims[i] = HDF5Constants.H5S_UNLIMITED; } if (maxdims[i] != dims[i]) { isExtentable = true; } } } // HDF 5 requires you to use chunking in order to define extendible // datasets. Chunking makes it possible to extend datasets // efficiently, // without having to reorganize storage excessively if ((chunks == null) && isExtentable) { chunks = dims; } plist = HDF5Constants.H5P_DEFAULT; if (chunks != null) { plist = H5.H5Pcreate(HDF5Constants.H5P_DATASET_CREATE); H5.H5Pset_layout(plist, HDF5Constants.H5D_CHUNKED); H5.H5Pset_chunk(plist, rank, chunks); // compression requires chunking if (gzip > 0) { H5.H5Pset_deflate(plist, gzip); } } int fid = file.getFID(); did = H5.H5Dcreate(fid, fullPath, tid, sid, HDF5Constants.H5P_DEFAULT, plist, HDF5Constants.H5P_DEFAULT); } finally { try { H5.H5Pclose(plist); } catch (HDF5Exception ex) {} try { H5.H5Sclose(sid); } catch (HDF5Exception ex) {} try { H5.H5Tclose(tid); } catch (HDF5Exception ex) {} try { H5.H5Dclose(did); } catch (HDF5Exception ex) {} for (int i = 0; i < nMembers; i++) { try { H5.H5Tclose(mTypes[i]); } catch (HDF5Exception ex) {} } } dataset = new H5CompoundDS(file, name, path); if (dataset != null) { pgroup.addToMemberList(dataset); if (data != null) { dataset.init(); long selected[] = dataset.getSelectedDims(); for (int i = 0; i < rank; i++) { selected[i] = dims[i]; } dataset.write(data); } } return dataset; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#isString(int) */ @Override public boolean isString(int tid) { boolean b = false; try { b = (HDF5Constants.H5T_STRING == H5.H5Tget_class(tid)); } catch (Exception ex) { b = false; } return b; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#getSize(int) */ @Override public int getSize(int tid) { int tsize = -1; try { tsize = H5.H5Tget_size(tid); } catch (Exception ex) { tsize = -1; } return tsize; } /** * Creates a datatype of a compound with one field. *

    * This function is needed to read/write data field by field. *

    * * @param member_tid * The datatype identifier of the compound to create * @param member_name * The name of the datatype * @param compInfo * compInfo[0]--IN: class of member datatype; compInfo[1]--IN: * size of member datatype; compInfo[2]--OUT: non-zero if the * base type of the compound field is unsigned; zero, otherwise. * @return the identifier of the compound datatype. */ private final int createCompoundFieldType(int member_tid, String member_name, int[] compInfo) throws HDF5Exception { int nested_tid = -1; int arrayType = member_tid; int baseType = arrayType; int tmp_tid1 = -1, tmp_tid2 = -1, tmp_tid3 = -1, tmp_tid4 = -1; try { int member_class = compInfo[0]; int member_size = compInfo[1]; if (member_class == HDF5Constants.H5T_ARRAY) { int mn = H5.H5Tget_array_ndims(member_tid); long[] marray = new long[mn]; H5.H5Tget_array_dims(member_tid, marray); baseType = H5.H5Tget_super(member_tid); tmp_tid2 = baseType; tmp_tid4 = H5.H5Tget_native_type(baseType); arrayType = H5.H5Tarray_create(tmp_tid4, mn, marray); tmp_tid3 = arrayType; } try { if (H5Datatype.isUnsigned(baseType)) { compInfo[2] = 1; } } catch (Exception ex2) {} member_size = H5.H5Tget_size(member_tid); // construct nested compound structure with a single field String theName = member_name; tmp_tid1 = H5.H5Tcopy(arrayType); int sep = member_name.lastIndexOf(CompoundDS.separator); while (sep > 0) { theName = member_name.substring(sep + 1); nested_tid = H5.H5Tcreate(HDF5Constants.H5T_COMPOUND, member_size); H5.H5Tinsert(nested_tid, theName, 0, tmp_tid1); try { H5.H5Tclose(tmp_tid1); } catch (Exception ex) {} tmp_tid1 = nested_tid; member_name = member_name.substring(0, sep); sep = member_name.lastIndexOf(CompoundDS.separator); } nested_tid = H5.H5Tcreate(HDF5Constants.H5T_COMPOUND, member_size); H5.H5Tinsert(nested_tid, member_name, 0, tmp_tid1); } finally { try { H5.H5Tclose(tmp_tid1); } catch (HDF5Exception ex3) {} try { H5.H5Tclose(tmp_tid2); } catch (HDF5Exception ex3) {} try { H5.H5Tclose(tmp_tid3); } catch (HDF5Exception ex3) {} try { H5.H5Tclose(tmp_tid4); } catch (HDF5Exception ex3) {} } return nested_tid; } } jhdf-2.9/ncsa/hdf/object/h5/Makefile.in0000644000175000017500000000261312050301060020462 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = ../../../.. DIR = ncsa/hdf/object/h5 SUBDIRS = NULL JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ JAVA_SRCS = \ H5CompoundDS.java \ H5Datatype.java \ H5File.java \ H5Group.java \ H5Link.java \ H5ScalarDS.java include $(TOP)/config/Rules.mk jhdf-2.9/ncsa/hdf/object/h5/H5Group.java0000755000175000017500000003106212050301060020554 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.object.h5; import java.util.List; import java.util.Vector; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.structs.H5G_info_t; import ncsa.hdf.hdf5lib.structs.H5O_info_t; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; /** * An H5Group object represents an existing HDF5 group in file. *

    * In HDF5, every object has at least one name. An HDF5 group is used to store a * set of the names together in one place, i.e. a group. The general structure * of a group is similar to that of the UNIX file system in that the group may * contain references to other groups or data objects just as the UNIX directory * may contain sub-directories or files. *

    * For more information on HDF5 Groups, * * @see HDF5 User's Guide *

    * @version 1.1 9/4/2007 * @author Peter X. Cao */ public class H5Group extends Group { /** * */ private static final long serialVersionUID = -951164512330444150L; /** * The list of attributes of this data object. Members of the list are * instance of Attribute. */ protected List attributeList; private int nAttributes = -1; private H5O_info_t obj_info; /** * Constructs an HDF5 group with specific name, path, and parent. *

    * * @param theFile * the file which containing the group. * @param name * the name of this group, e.g. "grp01". * @param path * the full path of this group, e.g. "/groups/". * @param parent * the parent of this group. */ public H5Group(FileFormat theFile, String name, String path, Group parent) { this(theFile, name, path, parent, null); } /** * @deprecated Not for public use in the future.
    * Using {@link #H5Group(FileFormat, String, String, Group)} */ @Deprecated public H5Group(FileFormat theFile, String name, String path, Group parent, long[] oid) { super(theFile, name, path, parent, oid); nMembersInFile = -1; obj_info = new H5O_info_t(-1L, -1L, 0, 0, -1L, 0L, 0L, 0L, 0L, null, null, null); if ((oid == null) && (theFile != null)) { // retrieve the object ID try { byte[] ref_buf = H5.H5Rcreate(theFile.getFID(), this.getFullName(), HDF5Constants.H5R_OBJECT, -1); this.oid = new long[1]; this.oid[0] = HDFNativeData.byteToLong(ref_buf, 0); } catch (Exception ex) { this.oid = new long[1]; this.oid[0] = 0; } } } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#hasAttribute() */ public boolean hasAttribute() { obj_info.num_attrs = nAttributes; if (obj_info.num_attrs < 0) { int gid = open(); if (gid > 0) { try { obj_info = H5.H5Oget_info(gid); } catch (Exception ex) { obj_info.num_attrs = 0; } close(gid); } } return (obj_info.num_attrs > 0); } /* * (non-Javadoc) * * @see ncsa.hdf.object.Group#getNumberOfMembersInFile() */ @Override public int getNumberOfMembersInFile() { if (nMembersInFile < 0) { int gid = open(); if (gid > 0) { try { H5G_info_t group_info = null; group_info = H5.H5Gget_info(gid); nMembersInFile = (int) group_info.nlinks; } catch (Exception ex) { nMembersInFile = 0; } close(gid); } } return nMembersInFile; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Group#clear() */ @Override public void clear() { super.clear(); if (attributeList != null) { ((Vector) attributeList).setSize(0); } } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#getMetadata() */ public List getMetadata() throws HDF5Exception { return this.getMetadata(fileFormat.getIndexType(null), fileFormat.getIndexOrder(null)); } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#getMetadata(int...) */ public List getMetadata(int... attrPropList) throws HDF5Exception { if (attributeList == null) { int gid = open(); int indxType = fileFormat.getIndexType(null); int order = fileFormat.getIndexOrder(null); if (attrPropList.length > 0) { indxType = attrPropList[0]; if (attrPropList.length > 1) { order = attrPropList[1]; } } try { attributeList = H5File.getAttribute(gid, indxType, order); } finally { close(gid); } } try { this.linkTargetObjName = H5File.getLinkTargetName(this); } catch (Exception ex) { } return attributeList; } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#writeMetadata(java.lang.Object) */ public void writeMetadata(Object info) throws Exception { // only attribute metadata is supported. if (!(info instanceof Attribute)) { return; } boolean attrExisted = false; Attribute attr = (Attribute) info; String name = attr.getName(); if (attributeList == null) { this.getMetadata(); } if (attributeList != null) attrExisted = attributeList.contains(attr); getFileFormat().writeAttribute(this, attr, attrExisted); // add the new attribute into attribute list if (!attrExisted) { attributeList.add(attr); nAttributes = attributeList.size(); } } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#removeMetadata(java.lang.Object) */ public void removeMetadata(Object info) throws HDF5Exception { // only attribute metadata is supported. if (!(info instanceof Attribute)) { return; } Attribute attr = (Attribute) info; int gid = open(); try { H5.H5Adelete(gid, attr.getName()); List attrList = getMetadata(); attrList.remove(attr); nAttributes = attributeList.size(); } finally { close(gid); } } /* * (non-Javadoc) * * @see ncsa.hdf.object.HObject#open() */ @Override public int open() { int gid = -1; try { if (isRoot()) { gid = H5.H5Gopen(getFID(), separator, HDF5Constants.H5P_DEFAULT); } else { gid = H5.H5Gopen(getFID(), getPath() + getName(), HDF5Constants.H5P_DEFAULT); } } catch (HDF5Exception ex) { gid = -1; } return gid; } /* * (non-Javadoc) * * @see ncsa.hdf.object.HObject#close(int) */ @Override public void close(int gid) { try { H5.H5Gclose(gid); } catch (HDF5Exception ex) {} } /** * Creates a new group with a name in a group and with the group creation * properties specified in gplist. *

    * The gplist contains a sequence of group creation property list * identifiers, lcpl, gcpl, gapl. It allows the user to create a group with * group creation properties. It will close the group creation properties * specified in gplist. * * @see ncsa.hdf.hdf5lib.H5#H5Gcreate(int, String, int, int, int) for the * order of property list identifiers. * * @param name * The name of a new group. * @param pgroup * The parent group object. * @param gplist * The group creation properties, in which the order of the * properties conforms the HDF5 library API, H5Gcreate(), i.e. * lcpl, gcpl and gapl, where *

      *
    • lcpl : Property list for link creation
    • gcpl : Property * list for group creation
    • gapl : Property list for group * access *
    * * @return The new group if successful; otherwise returns null. */ public static H5Group create(String name, Group pgroup, int... gplist) throws Exception { H5Group group = null; String fullPath = null; int lcpl = HDF5Constants.H5P_DEFAULT; int gcpl = HDF5Constants.H5P_DEFAULT; int gapl = HDF5Constants.H5P_DEFAULT; if (gplist.length > 0) { lcpl = gplist[0]; if (gplist.length > 1) { gcpl = gplist[1]; if (gplist.length > 2) gapl = gplist[2]; } } if ((name == null) || (pgroup == null)) { System.err.println("(name == null) || (pgroup == null)"); return null; } H5File file = (H5File) pgroup.getFileFormat(); if (file == null) { System.err.println("Could not get file that contains object"); return null; } String path = HObject.separator; if (!pgroup.isRoot()) { path = pgroup.getPath() + pgroup.getName() + HObject.separator; if (name.endsWith("/")) { name = name.substring(0, name.length() - 1); } int idx = name.lastIndexOf("/"); if (idx >= 0) { name = name.substring(idx + 1); } } fullPath = path + name; // create a new group and add it to the parent node int gid = H5.H5Gcreate(file.open(), fullPath, lcpl, gcpl, gapl); try { H5.H5Gclose(gid); } catch (Exception ex) { } byte[] ref_buf = H5.H5Rcreate(file.open(), fullPath, HDF5Constants.H5R_OBJECT, -1); long l = HDFNativeData.byteToLong(ref_buf, 0); long[] oid = { l }; group = new H5Group(file, name, path, pgroup, oid); if (group != null) { pgroup.addToMemberList(group); } if (gcpl > 0) { try { H5.H5Pclose(gcpl); } catch (final Exception ex) { } } return group; } /* * (non-Javadoc) * * @see ncsa.hdf.object.HObject#setName(java.lang.String) */ @Override public void setName(String newName) throws Exception { H5File.renameObject(this, newName); super.setName(newName); } /* * (non-Javadoc) * * @see ncsa.hdf.object.HObject#setPath(java.lang.String) */ @Override public void setPath(String newPath) throws Exception { super.setPath(newPath); List members = this.getMemberList(); if (members == null) { return; } int n = members.size(); HObject obj = null; for (int i = 0; i < n; i++) { obj = (HObject) members.get(i); obj.setPath(getPath() + getName() + HObject.separator); } } } jhdf-2.9/ncsa/hdf/object/h5/CMakeLists.txt0000644000175000017500000000242512050301060021156 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_NCSA_HDF_OBJECT_H5 Java) SET (CMAKE_VERBOSE_MAKEFILE 1) INCLUDE_DIRECTORIES ( ${HDFJAVA_NCSA_HDF_OBJECT_H5_SOURCE_DIR} ${HDFJAVA_NCSA_HDF_OBJECT_H5_BINARY_DIR} ) SET (HDFJAVA_NCSA_HDF_OBJECT_H5_SRCS H5CompoundDS.java H5Datatype.java H5File.java H5Group.java H5Link.java H5ScalarDS.java ) INCLUDE_DIRECTORIES (${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${HDFJAVA_NCSA_H5_LIB_CORENAME}.dir/ncsa/hdf/object/h5) FILE (WRITE ${PROJECT_BINARY_DIR}/Manifest.txt " " ) SET (CMAKE_JAVA_INCLUDE_PATH "${${HDFJAVA_NCSA_OBJECT_LIB_TARGET}_JAR_FILE};${HDFJAVA_HDF5_JARS}") ADD_JAR (${HDFJAVA_NCSA_H5_LIB_TARGET} ${PROJECT_BINARY_DIR}/Manifest.txt ${HDFJAVA_NCSA_HDF_OBJECT_H5_SRCS}) INSTALL_JAR (${HDFJAVA_NCSA_H5_LIB_TARGET} ${HJAVA_INSTALL_LIB_DIR} libraries) GET_TARGET_PROPERTY(${HDFJAVA_NCSA_H5_LIB_TARGET}_JAR_FILE ${HDFJAVA_NCSA_H5_LIB_TARGET} JAR_FILE) SET_GLOBAL_VARIABLE (HDFJAVA_JARS_TO_EXPORT "${HDFJAVA_JARS_TO_EXPORT};${${HDFJAVA_NCSA_H5_LIB_TARGET}_JAR_FILE}") SET_GLOBAL_VARIABLE (HDFJAVA_OBJECT_JARS "${HDFJAVA_OBJECT_JARS};${HDFJAVA_HDF5_JARS};${${HDFJAVA_NCSA_H5_LIB_TARGET}_JAR_FILE}") ADD_DEPENDENCIES (${HDFJAVA_NCSA_H5_LIB_TARGET} ${HDFJAVA_NCSA_OBJECT_LIB_TARGET} ${HDFJAVA_NCSA_HDF5_LIB_TARGET}) jhdf-2.9/ncsa/hdf/object/h5/H5ScalarDS.java0000755000175000017500000015075312050301060021125 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.object.h5; import java.lang.reflect.Array; import java.util.List; import java.util.Vector; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.structs.H5O_info_t; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; /** * H5ScalarDS describes a multi-dimension array of HDF5 scalar or atomic data * types, such as byte, int, short, long, float, double and string, and * operations performed on the scalar dataset. *

    * The library predefines a modest number of datatypes. For details, read The Datatype Interface * (H5T). *

    * * @version 1.1 9/4/2007 * @author Peter X. Cao */ public class H5ScalarDS extends ScalarDS { /** * */ private static final long serialVersionUID = 2887517608230611642L; /** * The list of attributes of this data object. Members of the list are * instance of Attribute. */ private List attributeList; /** * The byte array containing references of palettes. Each reference requires * eight bytes storage. Therefore, the array length is 8*numberOfPalettes. */ private byte[] paletteRefs; /** flag to indicate if the dataset is a variable length */ private boolean isVLEN = false; /** flag to indicate if the dataset is enum */ private boolean isEnum = false; /** flag to indicate if the dataset is an external dataset */ private boolean isExternal = false; private boolean isArrayOfCompound = false; private boolean isArrayOfVLEN = false; /** * flag to indicate if the datatype in file is the same as dataype in memory */ private boolean isNativeDatatype = true; /** flag to indicate is the datatype is reg. ref. */ private boolean isRegRef = false; private int nAttributes = -1; private H5O_info_t obj_info; /** * Constructs an instance of a H5ScalarDS object with specific name and * path. *

    * For example, in H5ScalarDS(h5file, "dset", "/arrays/"), "dset" is the * name of the dataset, "/arrays" is the group path of the dataset. * * @param theFile * the file that contains the data object. * @param theName * the name of the data object, e.g. "dset". * @param thePath * the full path of the data object, e.g. "/arrays/". */ public H5ScalarDS(FileFormat theFile, String theName, String thePath) { this(theFile, theName, thePath, null); } /** * @deprecated Not for public use in the future.
    * Using {@link #H5ScalarDS(FileFormat, String, String)} */ @Deprecated public H5ScalarDS(FileFormat theFile, String theName, String thePath, long[] oid) { super(theFile, theName, thePath, oid); unsignedConverted = false; paletteRefs = null; obj_info = new H5O_info_t(-1L, -1L, 0, 0, -1L, 0L, 0L, 0L, 0L, null, null, null); if ((oid == null) && (theFile != null)) { // retrieve the object ID try { byte[] ref_buf = H5.H5Rcreate(theFile.getFID(), this.getFullName(), HDF5Constants.H5R_OBJECT, -1); this.oid = new long[1]; this.oid[0] = HDFNativeData.byteToLong(ref_buf, 0); } catch (Exception ex) { } } } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#hasAttribute() */ public boolean hasAttribute() { obj_info.num_attrs = nAttributes; if (obj_info.num_attrs < 0) { // test if it is an image int did = open(); obj_info.num_attrs = 0; int aid = -1, atid = -1, tid = 0; try { obj_info = H5.H5Oget_info(did); nAttributes = (int) obj_info.num_attrs; tid = H5.H5Dget_type(did); int tclass = H5.H5Tget_class(tid); isText = (tclass == HDF5Constants.H5T_STRING); isVLEN = ((tclass == HDF5Constants.H5T_VLEN) || H5.H5Tis_variable_str(tid)); isEnum = (tclass == HDF5Constants.H5T_ENUM); // try to find out if the dataset is an image aid = H5.H5Aopen_by_name(did, ".", "CLASS", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); atid = H5.H5Aget_type(aid); int aclass = H5.H5Tget_class(atid); if (aclass == HDF5Constants.H5T_STRING) { int size = H5.H5Tget_size(atid); byte[] attrValue = new byte[size]; H5.H5Aread(aid, atid, attrValue); String strValue = new String(attrValue).trim(); isImageDisplay = isImage = strValue.equalsIgnoreCase("IMAGE"); } } catch (Exception ex) { ; } finally { try { H5.H5Tclose(atid); } catch (HDF5Exception ex) { ; } try { H5.H5Aclose(aid); } catch (HDF5Exception ex) { ; } try { H5.H5Tclose(tid); } catch (HDF5Exception ex) { ; } } // retrieve the IMAGE_MINMAXRANGE int asid = -1; try { // try to find out if the dataset is an image aid = H5.H5Aopen_by_name(did, ".", "IMAGE_MINMAXRANGE", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); if (aid > 0) { atid = H5.H5Aget_type(aid); int tmptid = atid; atid = H5.H5Tget_native_type(tmptid); try { H5.H5Tclose(tmptid); } catch (Exception ex) { } asid = H5.H5Aget_space(aid); long adims[] = null; int arank = H5.H5Sget_simple_extent_ndims(asid); if (arank > 0) { adims = new long[arank]; H5.H5Sget_simple_extent_dims(asid, adims, null); } // retrieve the attribute value long lsize = 1; for (int j = 0; j < adims.length; j++) { lsize *= adims[j]; } Object avalue = H5Datatype.allocateArray(atid, (int) lsize); if (avalue != null) { H5.H5Aread(aid, atid, avalue); double x0 = 0, x1 = 0; try { x0 = Double.valueOf(java.lang.reflect.Array.get(avalue, 0).toString()).doubleValue(); x1 = Double.valueOf(java.lang.reflect.Array.get(avalue, 1).toString()).doubleValue(); } catch (Exception ex2) { x0 = x1 = 0; } if (x1 > x0) { imageDataRange = new double[2]; imageDataRange[0] = x0; imageDataRange[1] = x1; } } } // if (aid > 0) } catch (Exception ex) { } finally { try { H5.H5Tclose(atid); } catch (HDF5Exception ex) { ; } try { H5.H5Sclose(asid); } catch (HDF5Exception ex) { ; } try { H5.H5Aclose(aid); } catch (HDF5Exception ex) { ; } } close(did); } return (obj_info.num_attrs > 0); } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#init() */ @Override public void init() { if (rank > 0) { resetSelection(); return; // already called. Initialize only once } int did = -1, sid = -1, tid = -1; did = open(); paletteRefs = getPaletteRefs(did); int pid = -1; try { sid = H5.H5Dget_space(did); tid = H5.H5Dget_type(did); int tclass = H5.H5Tget_class(tid); rank = H5.H5Sget_simple_extent_ndims(sid); isText = (tclass == HDF5Constants.H5T_STRING); isVLEN = ((tclass == HDF5Constants.H5T_VLEN) || H5.H5Tis_variable_str(tid)); isEnum = (tclass == HDF5Constants.H5T_ENUM); isUnsigned = H5Datatype.isUnsigned(tid); isRegRef = H5.H5Tequal(tid, HDF5Constants.H5T_STD_REF_DSETREG); if (tclass == HDF5Constants.H5T_ARRAY) { // use the base datatype to define the array int basetid = H5.H5Tget_super(tid); int baseclass = H5.H5Tget_class(basetid); isArrayOfCompound = (baseclass == HDF5Constants.H5T_COMPOUND); isArrayOfVLEN = (baseclass == HDF5Constants.H5T_VLEN); } // check if it is an external dataset try { pid = H5.H5Dget_create_plist(did); int nfiles = H5.H5Pget_external_count(pid); isExternal = (nfiles > 0); } catch (Exception ex) { } // check if datatype in file is native datatype int tmptid = 0; try { tmptid = H5.H5Tget_native_type(tid); isNativeDatatype = H5.H5Tequal(tid, tmptid); /* see if fill value is defined */ int[] fillStatus = { 0 }; if (H5.H5Pfill_value_defined(pid, fillStatus) >= 0) { if (fillStatus[0] == HDF5Constants.H5D_FILL_VALUE_USER_DEFINED) { fillValue = H5Datatype.allocateArray(tmptid, 1); try { H5.H5Pget_fill_value(pid, tmptid, fillValue); } catch (Exception ex2) { fillValue = null; } } } } catch (HDF5Exception ex) { ; } finally { try { H5.H5Tclose(tmptid); } catch (HDF5Exception ex) { ; } try { H5.H5Pclose(pid); } catch (Exception ex) { ; } } if (rank == 0) { // a scalar data point rank = 1; dims = new long[1]; dims[0] = 1; } else { dims = new long[rank]; maxDims = new long[rank]; H5.H5Sget_simple_extent_dims(sid, dims, maxDims); } } catch (HDF5Exception ex) { ; } finally { try { H5.H5Tclose(tid); } catch (HDF5Exception ex2) { } try { H5.H5Sclose(sid); } catch (HDF5Exception ex2) { } } // check for the type of image and interlace mode // it is a true color image at one of three cases: // 1) IMAGE_SUBCLASS = IMAGE_TRUECOLOR, // 2) INTERLACE_MODE = INTERLACE_PIXEL, // 3) INTERLACE_MODE = INTERLACE_PLANE if ((rank >= 3) && isImage) { interlace = -1; isTrueColor = isStringAttributeOf(did, "IMAGE_SUBCLASS", "IMAGE_TRUECOLOR"); if (isTrueColor) { interlace = INTERLACE_PIXEL; if (isStringAttributeOf(did, "INTERLACE_MODE", "INTERLACE_PLANE")) { interlace = INTERLACE_PLANE; } } } close(did); startDims = new long[rank]; selectedDims = new long[rank]; resetSelection(); } private boolean isStringAttributeOf(int objID, String name, String value) { boolean retValue = false; int aid = -1, atid = -1; try { // try to find out interlace mode aid = H5.H5Aopen_by_name(objID, ".", name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); atid = H5.H5Aget_type(aid); int size = H5.H5Tget_size(atid); byte[] attrValue = new byte[size]; H5.H5Aread(aid, atid, attrValue); String strValue = new String(attrValue).trim(); retValue = strValue.equalsIgnoreCase(value); } catch (Exception ex) { } finally { try { H5.H5Tclose(atid); } catch (HDF5Exception ex) { ; } try { H5.H5Aclose(aid); } catch (HDF5Exception ex) { ; } } return retValue; } /** * Resets selection of dataspace */ private void resetSelection() { for (int i = 0; i < rank; i++) { startDims[i] = 0; selectedDims[i] = 1; if (selectedStride != null) { selectedStride[i] = 1; } } if (interlace == INTERLACE_PIXEL) { // 24-bit TRUE color image // [height][width][pixel components] selectedDims[2] = 3; selectedDims[0] = dims[0]; selectedDims[1] = dims[1]; selectedIndex[0] = 0; // index for height selectedIndex[1] = 1; // index for width selectedIndex[2] = 2; // index for depth } else if (interlace == INTERLACE_PLANE) { // 24-bit TRUE color image // [pixel components][height][width] selectedDims[0] = 3; selectedDims[1] = dims[1]; selectedDims[2] = dims[2]; selectedIndex[0] = 1; // index for height selectedIndex[1] = 2; // index for width selectedIndex[2] = 0; // index for depth } else if (rank == 1) { selectedIndex[0] = 0; selectedDims[0] = dims[0]; } else if (rank == 2) { selectedIndex[0] = 0; selectedIndex[1] = 1; selectedDims[0] = dims[0]; selectedDims[1] = dims[1]; } else if (rank > 2) { // // hdf-java 2.5 version: 3D dataset is arranged in the order of // [frame][height][width] by default // selectedIndex[1] = rank-1; // width, the fastest dimension // selectedIndex[0] = rank-2; // height // selectedIndex[2] = rank-3; // frames // // (5/4/09) Modified the default dimension order. See bug#1379 // We change the default order to the following. In most situation, // users want to use the nature order of // selectedIndex[0] = 0 // selectedIndex[1] = 1 // selectedIndex[2] = 2 // Most of NPOESS data is the the order above. if (isImage) { // 3D dataset is arranged in the order of [frame][height][width] selectedIndex[1] = rank - 1; // width, the fastest dimension selectedIndex[0] = rank - 2; // height selectedIndex[2] = rank - 3; // frames } else { selectedIndex[0] = 0; // width, the fastest dimension selectedIndex[1] = 1; // height selectedIndex[2] = 2; // frames } selectedDims[selectedIndex[0]] = dims[selectedIndex[0]]; selectedDims[selectedIndex[1]] = dims[selectedIndex[1]]; } // by default, only one-D is selected for text data if ((rank > 1) && isText) { selectedIndex[0] = rank - 1; selectedIndex[1] = 0; selectedDims[0] = 1; selectedDims[selectedIndex[0]] = dims[selectedIndex[0]]; } isDataLoaded = false; isDefaultImageOrder = true; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#clear() */ @Override public void clear() { super.clear(); if (attributeList != null) { ((Vector) attributeList).setSize(0); } } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#copy(ncsa.hdf.object.Group, * java.lang.String, long[], java.lang.Object) */ @Override public Dataset copy(Group pgroup, String dstName, long[] dims, Object buff) throws Exception { // must give a location to copy if (pgroup == null) { return null; } Dataset dataset = null; int srcdid = -1, dstdid = -1, tid = -1, sid = -1, plist = -1; String dname = null, path = null; if (pgroup.isRoot()) { path = HObject.separator; } else { path = pgroup.getPath() + pgroup.getName() + HObject.separator; } dname = path + dstName; try { srcdid = open(); tid = H5.H5Dget_type(srcdid); sid = H5.H5Screate_simple(dims.length, dims, null); plist = H5.H5Dget_create_plist(srcdid); long[] chunks = new long[dims.length]; boolean setChunkFlag = false; try { H5.H5Pget_chunk(plist, dims.length, chunks); for (int i = 0; i < dims.length; i++) { if (dims[i] < chunks[i]) { setChunkFlag = true; if (dims[i] == 1) chunks[i] = 1; else chunks[i] = dims[i] / 2; } } } catch (Exception ex) { } if (setChunkFlag) H5.H5Pset_chunk(plist, dims.length, chunks); try { dstdid = H5.H5Dcreate(pgroup.getFID(), dname, tid, sid, HDF5Constants.H5P_DEFAULT, plist, HDF5Constants.H5P_DEFAULT); } catch (Exception e) { } finally { try { H5.H5Dclose(dstdid); } catch (Exception ex2) { } } dataset = new H5ScalarDS(pgroup.getFileFormat(), dstName, path); if (buff != null) { dataset.init(); dataset.write(buff); } dstdid = dataset.open(); H5File.copyAttributes(srcdid, dstdid); } finally { try { H5.H5Pclose(plist); } catch (Exception ex) { } try { H5.H5Sclose(sid); } catch (Exception ex) { } try { H5.H5Tclose(tid); } catch (Exception ex) { } try { H5.H5Dclose(srcdid); } catch (Exception ex) { } try { H5.H5Dclose(dstdid); } catch (Exception ex) { } } pgroup.addToMemberList(dataset); ((ScalarDS) dataset).setIsImage(isImage); return dataset; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#readBytes() */ @Override public byte[] readBytes() throws HDF5Exception { byte[] theData = null; if (rank <= 0) { init(); } int did = open(); int fspace = -1, mspace = -1, tid = -1; try { long[] lsize = { 1 }; for (int j = 0; j < selectedDims.length; j++) { lsize[0] *= selectedDims[j]; } fspace = H5.H5Dget_space(did); mspace = H5.H5Screate_simple(rank, selectedDims, null); // set the rectangle selection // HDF5 bug: for scalar dataset, H5Sselect_hyperslab gives core dump if (rank * dims[0] > 1) { H5.H5Sselect_hyperslab(fspace, HDF5Constants.H5S_SELECT_SET, startDims, selectedStride, selectedDims, null); // set // block // to 1 } tid = H5.H5Dget_type(did); int size = H5.H5Tget_size(tid) * (int) lsize[0]; theData = new byte[size]; H5.H5Dread(did, tid, mspace, fspace, HDF5Constants.H5P_DEFAULT, theData); } finally { try { H5.H5Sclose(fspace); } catch (Exception ex2) { } try { H5.H5Sclose(mspace); } catch (Exception ex2) { } try { H5.H5Tclose(tid); } catch (HDF5Exception ex2) { } close(did); } return theData; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#read() */ @Override public Object read() throws HDF5Exception { Object theData = null; int did = -1, tid = -1; int spaceIDs[] = { -1, -1 }; // spaceIDs[0]=mspace, spaceIDs[1]=fspace if (rank <= 0) { init(); } if (isArrayOfCompound) throw new HDF5Exception("Cannot show data with datatype of ARRAY of COMPOUND."); if (isArrayOfVLEN) throw new HDF5Exception("Cannot show data with datatype of ARRAY of VL."); if (isExternal) { String pdir = this.getFileFormat().getAbsoluteFile().getParent(); if (pdir == null) { pdir = "."; } H5.H5Dchdir_ext(pdir); } long[] lsize = { 1 }; try { did = open(); lsize[0] = selectHyperslab(did, spaceIDs); if (lsize[0] == 0) { throw new HDF5Exception("No data to read.\nEither the dataset or the selected subset is empty."); } // check is storage space is allocated try { long ssize = H5.H5Dget_storage_size(did); if (ssize <= 0) { throw new HDF5Exception("Storage space is not allocated."); } } catch (Exception ex) { } tid = H5.H5Dget_type(did); if (!isNativeDatatype) { int tmptid = -1; try { tmptid = tid; tid = H5.H5Tget_native_type(tmptid); } finally { try { H5.H5Tclose(tmptid); } catch (Exception ex2) { } } } boolean isREF = (H5.H5Tequal(tid, HDF5Constants.H5T_STD_REF_OBJ)); if ((originalBuf == null) || isText || isREF || ((originalBuf != null) && (lsize[0] != nPoints))) { try { theData = H5Datatype.allocateArray(tid, (int) lsize[0]); } catch (OutOfMemoryError err) { throw new HDF5Exception("Out Of Memory."); } } else { theData = originalBuf; // reuse the buffer if the size is the // same } if (theData != null) { if (isVLEN) { H5.H5DreadVL(did, tid, spaceIDs[0], spaceIDs[1], HDF5Constants.H5P_DEFAULT, (Object[]) theData); } else { H5.H5Dread(did, tid, spaceIDs[0], spaceIDs[1], HDF5Constants.H5P_DEFAULT, theData); if (isText && convertByteToString) { theData = byteToString((byte[]) theData, H5.H5Tget_size(tid)); } else if (isREF) { theData = HDFNativeData.byteToLong((byte[]) theData); } else if (isEnum && isEnumConverted()) { theData = H5Datatype.convertEnumValueToName(tid, theData, null); } } } // if (theData != null) } finally { try { H5.H5Sclose(spaceIDs[0]); } catch (Exception ex) { } try { H5.H5Sclose(spaceIDs[1]); } catch (Exception ex) { } try { H5.H5Tclose(tid); } catch (Exception ex2) { } close(did); } return theData; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#write(java.lang.Object) */ @Override public void write(Object buf) throws HDF5Exception { int did = -1, tid = -1; int spaceIDs[] = { -1, -1 }; // spaceIDs[0]=mspace, spaceIDs[1]=fspace Object tmpData = null; if (buf == null) { return; } if (isVLEN && !isText) { throw (new HDF5Exception("Writing non-string variable-length data is not supported")); } else if (isRegRef) { throw (new HDF5Exception("Writing region references data is not supported")); } long[] lsize = { 1 }; try { did = open(); lsize[0] = selectHyperslab(did, spaceIDs); tid = H5.H5Dget_type(did); if (!isNativeDatatype) { int tmptid = -1; try { tmptid = tid; tid = H5.H5Tget_native_type(tmptid); } finally { try { H5.H5Tclose(tmptid); } catch (Exception ex2) { } } } isText = (H5.H5Tget_class(tid) == HDF5Constants.H5T_STRING); // check if need to convert integer data int tsize = H5.H5Tget_size(tid); String cname = buf.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); boolean doConversion = (((tsize == 1) && (dname == 'S')) || ((tsize == 2) && (dname == 'I')) || ((tsize == 4) && (dname == 'J')) || (isUnsigned && unsignedConverted)); tmpData = buf; if (doConversion) { tmpData = convertToUnsignedC(buf, null); } // do not convert v-len strings, regardless of conversion request // type else if (isText && convertByteToString && !H5.H5Tis_variable_str(tid)) { tmpData = stringToByte((String[]) buf, H5.H5Tget_size(tid)); } else if (isEnum && (Array.get(buf, 0) instanceof String)) { tmpData = H5Datatype.convertEnumNameToValue(tid, (String[]) buf, null); } H5.H5Dwrite(did, tid, spaceIDs[0], spaceIDs[1], HDF5Constants.H5P_DEFAULT, tmpData); } finally { tmpData = null; try { H5.H5Sclose(spaceIDs[0]); } catch (Exception ex) { } try { H5.H5Sclose(spaceIDs[1]); } catch (Exception ex) { } try { H5.H5Tclose(tid); } catch (Exception ex) { } close(did); } } /** * Set up the selection of hyperslab * * @param did * IN dataset ID * @param spaceIDs * IN/OUT memory and file space IDs -- spaceIDs[0]=mspace, * spaceIDs[1]=fspace * @return total number of data point selected */ private long selectHyperslab(int did, int[] spaceIDs) throws HDF5Exception { long lsize = 1; boolean isAllSelected = true; for (int i = 0; i < rank; i++) { lsize *= selectedDims[i]; if (selectedDims[i] < dims[i]) { isAllSelected = false; } } if (isAllSelected) { spaceIDs[0] = HDF5Constants.H5S_ALL; spaceIDs[1] = HDF5Constants.H5S_ALL; } else { spaceIDs[1] = H5.H5Dget_space(did); // When 1D dataspace is used in chunked dataset, reading is very // slow. // It is a known problem on HDF5 library for chunked dataset. // mspace = H5.H5Screate_simple(1, lsize, null); spaceIDs[0] = H5.H5Screate_simple(rank, selectedDims, null); H5.H5Sselect_hyperslab(spaceIDs[1], HDF5Constants.H5S_SELECT_SET, startDims, selectedStride, selectedDims, null); } if ((rank > 1) && (selectedIndex[0] > selectedIndex[1])) isDefaultImageOrder = false; else isDefaultImageOrder = true; return lsize; } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#getMetadata() */ public List getMetadata() throws HDF5Exception { return this.getMetadata(fileFormat.getIndexType(null), fileFormat.getIndexOrder(null)); } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#getMetadata(int...) */ public List getMetadata(int... attrPropList) throws HDF5Exception { if (rank <= 0) { init(); } try { this.linkTargetObjName = H5File.getLinkTargetName(this); } catch (Exception ex) { } if (attributeList != null) { return attributeList; } // load attributes first int did = -1, pid = -1; int indxType = fileFormat.getIndexType(null); int order = fileFormat.getIndexOrder(null); if (attrPropList.length > 0) { indxType = attrPropList[0]; if (attrPropList.length > 1) { order = attrPropList[1]; } } try { did = open(); attributeList = H5File.getAttribute(did, indxType, order); // get the compression and chunk information pid = H5.H5Dget_create_plist(did); if (H5.H5Pget_layout(pid) == HDF5Constants.H5D_CHUNKED) { chunkSize = new long[rank]; H5.H5Pget_chunk(pid, rank, chunkSize); } else { chunkSize = null; } int[] flags = { 0, 0 }; long[] cd_nelmts = { 2 }; int[] cd_values = { 0, 0 }; String[] cd_name = { "", "" }; int nfilt = H5.H5Pget_nfilters(pid); int filter = -1; int[] filter_config = { 1 }; compression = ""; for (int i = 0; i < nfilt; i++) { if (i > 0) { compression += ", "; } try { filter = H5.H5Pget_filter(pid, i, flags, cd_nelmts, cd_values, 120, cd_name, filter_config); } catch (Throwable err) { compression += "ERROR"; continue; } if (filter == HDF5Constants.H5Z_FILTER_DEFLATE) { compression += "GZIP: level = " + cd_values[0]; } else if (filter == HDF5Constants.H5Z_FILTER_FLETCHER32) { compression += "Error detection filter"; } else if (filter == HDF5Constants.H5Z_FILTER_SHUFFLE) { compression += "SHUFFLE: Nbytes = " + cd_values[0]; } else if (filter == HDF5Constants.H5Z_FILTER_SZIP) { compression += "SZIP: Pixels per block = " + cd_values[1]; int flag = -1; try { flag = H5.H5Zget_filter_info(filter); } catch (Exception ex) { flag = -1; } if (flag == HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED) { compression += ": H5Z_FILTER_CONFIG_DECODE_ENABLED"; } else if ((flag == HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED) || (flag >= (HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED + HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED))) { compression += ": H5Z_FILTER_CONFIG_ENCODE_ENABLED"; } } } // for (int i=0; i * The following example shows how to create a string dataset using this * function. * *

         * H5File file = new H5File("test.h5", H5File.CREATE);
         * int max_str_len = 120;
         * Datatype strType = new H5Datatype(Datatype.CLASS_STRING, max_str_len, -1, -1);
         * int size = 10000;
         * long dims[] = { size };
         * long chunks[] = { 1000 };
         * int gzip = 9;
         * String strs[] = new String[size];
         * 
         * for (int i = 0; i < size; i++)
         *     strs[i] = String.valueOf(i);
         * 
         * file.open();
         * file.createScalarDS("/1D scalar strings", null, strType, dims, null, chunks, gzip, strs);
         * 
         * try {
         *     file.close();
         * }
         * catch (Exception ex) {
         * }
         * 
    * * @param name * the name of the dataset to create. * @param pgroup * the parent group of the new dataset. * @param type * the datatype of the dataset. * @param dims * the dimension size of the dataset. * @param maxdims * the max dimension size of the dataset. maxdims is set to dims * if maxdims = null. * @param chunks * the chunk size of the dataset. No chunking if chunk = null. * @param gzip * the level of the gzip compression. No compression if gzip<=0. * @param data * the array of data values. * * @return the new dataset if successful. Otherwise returns null. */ public static H5ScalarDS create(String name, Group pgroup, Datatype type, long[] dims, long[] maxdims, long[] chunks, int gzip, Object fillValue, Object data) throws Exception { H5ScalarDS dataset = null; String fullPath = null; int did = -1, tid = -1, sid = -1, plist = -1; if ((pgroup == null) || (name == null) || (dims == null) || ((gzip > 0) && (chunks == null))) { return null; } H5File file = (H5File) pgroup.getFileFormat(); if (file == null) { return null; } String path = HObject.separator; if (!pgroup.isRoot()) { path = pgroup.getPath() + pgroup.getName() + HObject.separator; if (name.endsWith("/")) { name = name.substring(0, name.length() - 1); } int idx = name.lastIndexOf("/"); if (idx >= 0) { name = name.substring(idx + 1); } } fullPath = path + name; boolean isExtentable = false; if (maxdims != null) { for (int i = 0; i < maxdims.length; i++) { if (maxdims[i] == 0) { maxdims[i] = dims[i]; } else if (maxdims[i] < 0) { maxdims[i] = HDF5Constants.H5S_UNLIMITED; } if (maxdims[i] != dims[i]) { isExtentable = true; } } } // HDF 5 requires you to use chunking in order to define extendible // datasets. Chunking makes it possible to extend datasets efficiently, // without having to reorganize storage excessively. Using default size // of 64x...which has good performance if ((chunks == null) && isExtentable) { chunks = new long[dims.length]; for (int i = 0; i < dims.length; i++) chunks[i] = Math.min(dims[i], 64); } // prepare the dataspace and datatype int rank = dims.length; try { tid = type.toNative(); sid = H5.H5Screate_simple(rank, dims, maxdims); // figure out creation properties plist = HDF5Constants.H5P_DEFAULT; byte[] val_fill = null; try { val_fill = parseFillValue(type, fillValue); } catch (Exception ex) { } if (chunks != null || val_fill != null) { plist = H5.H5Pcreate(HDF5Constants.H5P_DATASET_CREATE); if (chunks != null) { H5.H5Pset_layout(plist, HDF5Constants.H5D_CHUNKED); H5.H5Pset_chunk(plist, rank, chunks); } if (val_fill != null) { H5.H5Pset_fill_value(plist, tid, val_fill); } } if (gzip > 0) { H5.H5Pset_deflate(plist, gzip); } int fid = file.getFID(); did = H5.H5Dcreate(fid, fullPath, tid, sid, HDF5Constants.H5P_DEFAULT, plist, HDF5Constants.H5P_DEFAULT); dataset = new H5ScalarDS(file, name, path); } finally { try { H5.H5Pclose(plist); } catch (HDF5Exception ex) { } ; try { H5.H5Sclose(sid); } catch (HDF5Exception ex) { } ; try { H5.H5Tclose(tid); } catch (HDF5Exception ex) { } ; try { H5.H5Dclose(did); } catch (HDF5Exception ex) { } ; } if (dataset != null) { pgroup.addToMemberList(dataset); if (data != null) { dataset.write(data); } } return dataset; } public static H5ScalarDS create(String name, Group pgroup, Datatype type, long[] dims, long[] maxdims, long[] chunks, int gzip, Object data) throws Exception { return create(name, pgroup, type, dims, maxdims, chunks, gzip, null, data); } /* * (non-Javadoc) * * @see ncsa.hdf.object.ScalarDS#getPaletteRefs() */ @Override public byte[] getPaletteRefs() { if (rank <= 0) { init(); // init will be called to get refs } return paletteRefs; } /** * reads references of palettes into a byte array Each reference requires * eight bytes storage. Therefore, the array length is 8*numberOfPalettes. */ private byte[] getPaletteRefs(int did) { int aid = -1, sid = -1, size = 0, rank = 0, atype = -1; byte[] ref_buf = null; try { aid = H5.H5Aopen_by_name(did, ".", "PALETTE", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); sid = H5.H5Aget_space(aid); rank = H5.H5Sget_simple_extent_ndims(sid); size = 1; if (rank > 0) { long[] dims = new long[rank]; H5.H5Sget_simple_extent_dims(sid, dims, null); for (int i = 0; i < rank; i++) { size *= (int) dims[i]; } } ref_buf = new byte[size * 8]; atype = H5.H5Aget_type(aid); H5.H5Aread(aid, atype, ref_buf); } catch (HDF5Exception ex) { ref_buf = null; } finally { try { H5.H5Tclose(atype); } catch (HDF5Exception ex2) { } try { H5.H5Sclose(sid); } catch (HDF5Exception ex2) { } try { H5.H5Aclose(aid); } catch (HDF5Exception ex2) { } } return ref_buf; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#getDatatype() */ @Override public Datatype getDatatype() { if (datatype == null) { int did = -1, tid = -1; did = open(); try { tid = H5.H5Dget_type(did); if (!isNativeDatatype) { int tmptid = -1; try { tmptid = tid; tid = H5.H5Tget_native_type(tmptid); } finally { try { H5.H5Tclose(tmptid); } catch (Exception ex2) { } } } datatype = new H5Datatype(tid); } catch (Exception ex) { } finally { try { H5.H5Tclose(tid); } catch (HDF5Exception ex) { } ; try { H5.H5Dclose(did); } catch (HDF5Exception ex) { } ; } } return datatype; } /* * (non-Javadoc) * * @see ncsa.hdf.object.HObject#setName(java.lang.String) */ @Override public void setName(String newName) throws Exception { H5File.renameObject(this, newName); super.setName(newName); } /** * H5Dset_extent verifies that the dataset is at least of size size, * extending it if necessary. The dimensionality of size is the same as that * of the dataspace of the dataset being changed. * * This function can be applied to the following datasets: 1) Any dataset * with unlimited dimensions 2) A dataset with fixed dimensions if the * current dimension sizes are less than the maximum sizes set with maxdims * (see H5Screate_simple) */ public void extend(long[] newDims) throws HDF5Exception { int did = -1, sid = -1; did = open(); try { H5.H5Dset_extent(did, newDims); H5.H5Fflush(did, HDF5Constants.H5F_SCOPE_GLOBAL); sid = H5.H5Dget_space(did); long[] checkDims = new long[rank]; H5.H5Sget_simple_extent_dims(sid, checkDims, null); for (int i = 0; i < rank; i++) { if (checkDims[i] != newDims[i]) { throw new HDF5Exception("error extending dataset " + getName()); } } dims = checkDims; } catch (Exception e) { throw new HDF5Exception(e.getMessage()); } finally { if (sid > 0) H5.H5Sclose(sid); close(did); } } } jhdf-2.9/ncsa/hdf/object/h5/H5Link.java0000644000175000017500000000664512050301060020363 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.object.h5; import java.util.List; import ncsa.hdf.hdf5lib.structs.H5O_info_t; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.HObject; /** * An H5Link object represents an existing HDF5 object in file. *

    * H5Link object is an HDF5 object that is either a soft or an external link to * an object in a file that does not exist. The type of the object is unknown. * Once the object being linked to is created, and the type is known, then * H5link object will change its type. * *

    * * @version 2.7.2 7/6/2010 * @author Nidhi Gupta */ public class H5Link extends HObject { /** * */ private static final long serialVersionUID = -8137277460521594367L; private H5O_info_t obj_info; /** * Constructs an HDF5 link with specific name, path, and parent. *

    * * @param theFile * the file which containing the link. * @param name * the name of this link, e.g. "link1". * @param path * the full path of this link, e.g. "/groups/". */ public H5Link(FileFormat theFile, String name, String path) { this (theFile, name, path, null); } public H5Link(FileFormat theFile, String theName, String thePath, long[] oid) { super(theFile, theName, thePath, oid); obj_info = new H5O_info_t(-1L, -1L, -1, 0, -1L, 0L, 0L, 0L, 0L, null,null,null); } @Override public void close(int id) { } @Override public int open() { return 0; } public List getMetadata() throws Exception { try{ this.linkTargetObjName= H5File.getLinkTargetName(this); }catch(Exception ex){ } return null; } public boolean hasAttribute() { return false; } public void removeMetadata(Object info) throws Exception { } public void writeMetadata(Object info) throws Exception { } public List getMetadata(int... attrPropList) throws Exception { return null; } /* * (non-Javadoc) * * @see ncsa.hdf.object.HObject#setName(java.lang.String) */ @Override public void setName(String newName) throws Exception { H5File.renameObject(this, newName); super.setName(newName); } } jhdf-2.9/ncsa/hdf/object/h5/H5Datatype.java0000755000175000017500000011171112050301060021233 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.object.h5; import java.lang.reflect.Array; import java.util.List; import java.util.StringTokenizer; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.structs.H5O_info_t; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; /** * This class defines HDF5 data type characteristics and APIs for a data type. *

    * This class provides several methods to convert an HDF5 dataype identifier to * a dataype object, and vice versa. A dataype object is described by four basic * fields: datatype class, size, byte order, and sign, while an HDF5 dataype is * presented by a datetype identifier. *

    * * @version 1.1 9/4/2007 * @author Peter X. Cao */ public class H5Datatype extends Datatype { /** * */ private static final long serialVersionUID = -750546422258749792L; /** * The list of attributes of this data object. */ private List attributeList; /** Flag to indicate if this datatype is a named datatype */ private boolean isNamed = false; private int nAttributes = -1; private H5O_info_t obj_info; private boolean isVLEN = false; private String description = null; /** * Constructs an named HDF5 data type object for a given file, dataset name * and group path. *

    * The datatype object represents an existing named datatype in file. For * example, new H5Datatype(file, "dtype1", "/g0") constructs a datatype * object that corresponds to the dataset,"dset1", at group "/g0". *

    * * @param theFile * the file that contains the dataset. * @param name * the name of the dataset such as "dset1". * @param path * the group path to the dataset such as "/g0/". */ public H5Datatype(FileFormat theFile, String name, String path) { this(theFile, name, path, null); } /** * @deprecated Not for public use in the future.
    * Using {@link #H5Datatype(FileFormat, String, String)} */ @Deprecated public H5Datatype(FileFormat theFile, String name, String path, long[] oid) { super(theFile, name, path, oid); obj_info = new H5O_info_t(-1L, -1L, 0, 0, -1L, 0L, 0L, 0L, 0L, null, null, null); if ((oid == null) && (theFile != null)) { // retrieve the object ID try { byte[] ref_buf = H5.H5Rcreate(theFile.getFID(), this.getFullName(), HDF5Constants.H5R_OBJECT, -1); this.oid = new long[1]; this.oid[0] = HDFNativeData.byteToLong(ref_buf, 0); } catch (Exception ex) { } } } /** * Constructs a Datatype with specified class, size, byte order and sign. *

    * The following is a list of a few example of H5Datatype. *

      *
    1. to create unsigned native integer
      * H5Datatype type = new H5Dataype(CLASS_INTEGER, NATIVE, NATIVE, * SIGN_NONE); *
    2. to create 16-bit signed integer with big endian
      * H5Datatype type = new H5Dataype(CLASS_INTEGER, 2, ORDER_BE, NATIVE); *
    3. to create native float
      * H5Datatype type = new H5Dataype(CLASS_FLOAT, NATIVE, NATIVE, -1); *
    4. to create 64-bit double
      * H5Datatype type = new H5Dataype(CLASS_FLOAT, 8, NATIVE, -1); *
    * * @param tclass * the class of the datatype, e.g. CLASS_INTEGER, CLASS_FLOAT and * etc. * @param tsize * the size of the datatype in bytes, e.g. for a 32-bit integer, * the size is 4. * @param torder * the byte order of the datatype. Valid values are ORDER_LE, * ORDER_BE, ORDER_VAX and ORDER_NONE * @param tsign * the sign of the datatype. Valid values are SIGN_NONE, SIGN_2 * and MSGN */ public H5Datatype(int tclass, int tsize, int torder, int tsign) { super(tclass, tsize, torder, tsign); } /** * Constructs a Datatype with a given native datatype identifier. *

    * For example, if the datatype identifier is a 32-bit unsigned integer * created from HDF5, * *

         * int tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_UNINT32);
         *                                                         Datatype dtype = new Datatype(tid);
         * 
    * * will construct a datatype equivalent to new Datatype(CLASS_INTEGER, 4, * NATIVE, SIGN_NONE); *

    * * @see #fromNative(int nativeID) * @param nativeID * the native datatype identifier. */ public H5Datatype(int nativeID) { super(nativeID); description = getDatatypeDescription(nativeID); fromNative(nativeID); } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#hasAttribute() */ public boolean hasAttribute() { obj_info.num_attrs = nAttributes; if (obj_info.num_attrs < 0) { int tid = -1; try { tid = H5.H5Topen(getFID(), getPath() + getName(), HDF5Constants.H5P_DEFAULT); fromNative(tid); obj_info = H5.H5Oget_info(tid); isNamed = true; } catch (Exception ex) { obj_info.num_attrs = 0; } finally { try { H5.H5Tclose(tid); } catch (Exception ex) {} } } return (obj_info.num_attrs > 0); } /** * Converts values in an Enumeration Datatype to names. *

    * This method searches the identified enumeration datatype for the values * appearing in inValues and returns the names corresponding to * those values. If a given value is not found in the enumeration datatype, * the name corresponding to that value will be set to null in * the string array that is returned. *

    * If the method fails in general, null will be returned instead of a String * array. An empty inValues parameter, an outNames * array with a different number of entries than the inValues * array, or an invalid tid would all cause general failure. * * @param tid * The identifier of the enumeration datatype. * @param inValues * The array of enumerations values to be converted. * @param outNames * The array of names to be populated. If null, the array will be * created. If outNames is not null, the number of * entries must be the same as the number of values in * inValues. * @return The string array of names if successful; otherwise return null. * @throws HDF5Exception * If there is an error at the HDF5 library level. * */ public static final String[] convertEnumValueToName(int tid, Object inValues, String[] outNames) throws HDF5Exception { int inSize = 0; if ((inValues == null) || ((inSize = Array.getLength(inValues)) <= 0) || ((outNames != null) && (inSize != Array.getLength(outNames)))) { return null; } int nMembers = H5.H5Tget_nmembers(tid); if (nMembers <= 0) { return null; } if (outNames == null) { outNames = new String[inSize]; } else { // set values in existing array to null in case no match found for (int i = 0; i < inSize; i++) { outNames[i] = null; } } String[] names = new String[nMembers]; int[] values = new int[nMembers]; int[] theValue = { 0 }; // Loop through the enumeration datatype and extract the names and // values. for (int i = 0; i < nMembers; i++) { names[i] = H5.H5Tget_member_name(tid, i); H5.H5Tget_member_value(tid, i, theValue); values[i] = theValue[0]; } int val = -1; // Look for matches for (int i = 0; i < inSize; i++) { val = Array.getInt(inValues, i); for (int j = 0; j < nMembers; j++) { if (val == values[j]) { outNames[i] = names[j]; break; } } } return outNames; } /** * Converts namess in an Enumeration Datatype to values. *

    * This method searches the identified enumeration datatype for the names * appearing in inValues and returns the values corresponding * to those names. * * @param tid * The identifier of the enumeration datatype. * @param in * The array of enumerations names to be converted. * @param out * The array of values to be populated. * * @return The int array of values if successful; otherwise return null. * @throws HDF5Exception * If there is an error at the HDF5 library level. * */ public static final int[] convertEnumNameToValue(int tid, String[] in, int[] out) throws HDF5Exception { int size = 0; if ((in == null) || ((size = Array.getLength(in)) <= 0) || ((out != null) && (size != Array.getLength(out)))) { return null; } int nMembers = H5.H5Tget_nmembers(tid); if (nMembers <= 0) { return null; } if (out == null) { out = new int[size]; } else { // set values in existing array to -1 in case no match found for (int i = 0; i < size; i++) { out[i] = -1; } } String[] names = new String[nMembers]; int[] values = new int[nMembers]; int[] theValue = { 0 }; // Loop through the enumeration datatype and extract the names and // values. for (int i = 0; i < nMembers; i++) { names[i] = H5.H5Tget_member_name(tid, i); H5.H5Tget_member_value(tid, i, theValue); values[i] = theValue[0]; } for (int i = 0; i < size; i++) { if (in[i] == null || in[i].length() <= 0) continue; for (int j = 0; j < nMembers; j++) { if (in[i].equalsIgnoreCase(names[j])) { out[i] = values[j]; break; } } } return out; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Datatype#fromNative(int) */ @Override public void fromNative(int tid) { int tclass = -1, tsize = -1; boolean isChar = false, isUchar = false; try { tclass = H5.H5Tget_class(tid); tsize = H5.H5Tget_size(tid); isVLEN = (tclass == HDF5Constants.H5T_VLEN); } catch (Exception ex) { datatypeClass = CLASS_NO_CLASS; } try { isUchar = H5.H5Tequal(tid, HDF5Constants.H5T_NATIVE_UCHAR); isChar = (H5.H5Tequal(tid, HDF5Constants.H5T_NATIVE_CHAR) || isUchar); } catch (Exception ex) {} if (tclass == HDF5Constants.H5T_ARRAY) { int tmptid = -1; datatypeClass = CLASS_ARRAY; try { int ndims = H5.H5Tget_array_ndims(tid); dims = new long[ndims]; H5.H5Tget_array_dims(tid, dims); tmptid = H5.H5Tget_super(tid); baseType = new H5Datatype(tmptid); } catch (Exception ex) {} finally { try { H5.H5Tclose(tmptid); } catch (Exception ex) {} } } else if (isChar) { datatypeClass = CLASS_CHAR; if (isUchar) datatypeSign = SIGN_NONE; } else if (tclass == HDF5Constants.H5T_INTEGER) { datatypeClass = CLASS_INTEGER; try { int tsign = H5.H5Tget_sign(tid); if (tsign == HDF5Constants.H5T_SGN_NONE) { datatypeSign = SIGN_NONE; } } catch (Exception ex) {} } else if (tclass == HDF5Constants.H5T_FLOAT) { datatypeClass = CLASS_FLOAT; } else if (tclass == HDF5Constants.H5T_STRING) { try { isVLEN = H5.H5Tis_variable_str(tid); } catch (Exception ex) {} datatypeClass = CLASS_STRING; } else if (tclass == HDF5Constants.H5T_REFERENCE) { datatypeClass = CLASS_REFERENCE; } else if (tclass == HDF5Constants.H5T_ENUM) { datatypeClass = CLASS_ENUM; try { int nMember = H5.H5Tget_nmembers(tid); String name = null; int[] val = new int[1]; String enumStr = ""; for (int i = 0; i < nMember; i++) { name = H5.H5Tget_member_name(tid, i); H5.H5Tget_member_value(tid, i, val); enumStr += name + "=" + val[0] + ","; } enumMembers = enumStr; } catch (Exception ex) {} } if (isVLEN) datatypeSize = -1; else datatypeSize = tsize; datatypeOrder = NATIVE; } /** * @deprecated Not for public use in the future.
    * Using {@link ncsa.hdf.hdf5lib.H5#H5Tget_native_type(int)} *

    * Return the HDF5 memory datatype identifier based on the HDF5 * datatype identifier on disk *

    * @param tid * the datatype identifieron disk. * @return the memory datatype identifier if successful, and negative * otherwise. */ @Deprecated public static int toNative(int tid) { // data type information int native_type = -1; try { native_type = H5.H5Tget_native_type(tid); } catch (Exception ex) {} try { if (H5.H5Tis_variable_str(tid)) H5.H5Tset_size(native_type, HDF5Constants.H5T_VARIABLE); } catch (Exception ex) {} return native_type; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Datatype#toNative() */ @Override public int toNative() { int tid = -1, tmptid = -1; if (isNamed) { try { tid = H5.H5Topen(getFID(), getPath() + getName(), HDF5Constants.H5P_DEFAULT); } catch (Exception ex) {} } if (tid >= 0) { return tid; } // figure the datatype try { switch (datatypeClass) { case CLASS_ARRAY: try { tmptid = baseType.toNative(); tid = H5.H5Tarray_create(tmptid, dims.length, dims); } finally { close(tmptid); } break; case CLASS_INTEGER: case CLASS_ENUM: if (datatypeSize == 1) { tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_INT8); } else if (datatypeSize == 2) { tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_INT16); } else if (datatypeSize == 4) { tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_INT32); } else if (datatypeSize == 8) { tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_INT64); } else { tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_INT); } if (datatypeOrder == Datatype.ORDER_BE) { H5.H5Tset_order(tid, HDF5Constants.H5T_ORDER_BE); } else if (datatypeOrder == Datatype.ORDER_LE) { H5.H5Tset_order(tid, HDF5Constants.H5T_ORDER_LE); } if (datatypeSign == Datatype.SIGN_NONE) { H5.H5Tset_sign(tid, HDF5Constants.H5T_SGN_NONE); } break; case CLASS_FLOAT: if (datatypeSize == 8) { tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_DOUBLE); } else { tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_FLOAT); } if (datatypeOrder == Datatype.ORDER_BE) { H5.H5Tset_order(tid, HDF5Constants.H5T_ORDER_BE); } else if (datatypeOrder == Datatype.ORDER_LE) { H5.H5Tset_order(tid, HDF5Constants.H5T_ORDER_LE); } break; case CLASS_CHAR: if (datatypeSign == Datatype.SIGN_NONE) { tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_UCHAR); } else { tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_CHAR); } break; case CLASS_STRING: tid = H5.H5Tcopy(HDF5Constants.H5T_C_S1); if (isVLEN || datatypeSize < 0) H5.H5Tset_size(tid, HDF5Constants.H5T_VARIABLE); else H5.H5Tset_size(tid, datatypeSize); // H5.H5Tset_strpad(tid, HDF5Constants.H5T_STR_NULLPAD); break; case CLASS_REFERENCE: if (datatypeSize > H5.H5Tget_size(HDF5Constants.H5T_STD_REF_OBJ)) { tid = H5.H5Tcopy(HDF5Constants.H5T_STD_REF_DSETREG); } else { tid = H5.H5Tcopy(HDF5Constants.H5T_STD_REF_OBJ); } break; } // switch (tclass) } catch (Exception ex) { tid = -1; } // set up enum members if (datatypeClass == CLASS_ENUM) { int ptid = tid; try { tid = H5.H5Tenum_create(ptid); String memstr, memname; int memval = 0, idx; StringTokenizer token; // using "0" and "1" as default if (enumMembers == null) { token = new StringTokenizer("0,1", ","); } else { token = new StringTokenizer(enumMembers, ","); } while (token.hasMoreTokens()) { memstr = token.nextToken(); if (memstr != null) { memstr = memstr.trim(); } if ((memstr == null) || (memstr.length() < 1)) { continue; } idx = memstr.indexOf('='); if (idx > 0) { memname = memstr.substring(0, idx); memval = Integer.parseInt(memstr.substring(idx + 1)); } else { memname = memstr; memval++; } H5.H5Tenum_insert(tid, memname, memval); } } catch (Exception ex) { tid = -1; } try { H5.H5Tclose(ptid); } catch (Exception ex) {} } // if (datatypeClass == CLASS_ENUM) { return tid; } /** * Allocates an one-dimensional array of byte, short, int, long, float, * double, or String to store data in memory. * * For example, * *

         * int tid = H5.H5Tcopy(HDF5Constants.H5T_NATIVE_INT32);
         *                                                       int[] data = (int[]) allocateArray(tid, 100);
         * 
    * * returns a 32-bit integer array of size 100. * * @param tid * the datatype id. * @param size * the total number of data points of the array. * @return the array object if successful; otherwise, return null. */ public static Object allocateArray(int tid, int size) throws OutOfMemoryError { Object data = null; boolean isVL = false; boolean is_variable_str = false; boolean is_reg_ref = false; if (size < 0) { return null; } // Scalar members have dimensionality zero, i.e. size =0 // what can we do about it, set the size to 1 if (size == 0) { size = 1; } // data type information int tclass = -1, tsize = -1, tsign = -1; try { tclass = H5.H5Tget_class(tid); tsize = H5.H5Tget_size(tid); tsign = H5.H5Tget_sign(tid); } catch (Exception ex) {} try { is_variable_str = H5.H5Tis_variable_str(tid); } catch (Exception ex) {} try { isVL = (tclass == HDF5Constants.H5T_VLEN); } catch (Exception ex) {} try { is_reg_ref = H5.H5Tequal(tid, HDF5Constants.H5T_STD_REF_DSETREG); } catch (Exception ex) {} if (is_variable_str || isVL || is_reg_ref) { data = new String[size]; for (int i = 0; i < size; i++) { ((String[]) data)[i] = ""; } } else if (tclass == HDF5Constants.H5T_INTEGER) { if (tsize == 1) { data = new byte[size]; } else if (tsize == 2) { data = new short[size]; } else if (tsize == 4) { data = new int[size]; } else if (tsize == 8) { data = new long[size]; } } else if (tclass == HDF5Constants.H5T_ENUM) { // can be any integer // data = new int[size]; int superTid = -1; try { superTid = H5.H5Tget_super(tid); data = allocateArray(superTid, size); } catch (Exception ex) {} finally { try { H5.H5Tclose(superTid); } catch (Exception ex) {} } } else if (tclass == HDF5Constants.H5T_FLOAT) { if (tsize == 4) { data = new float[size]; } else if (tsize == 8) { data = new double[size]; } } else if ((tclass == HDF5Constants.H5T_STRING) || (tclass == HDF5Constants.H5T_REFERENCE) || (tclass == HDF5Constants.H5T_BITFIELD)) { data = new byte[size * tsize]; } else if (tclass == HDF5Constants.H5T_ARRAY) { // use the base datatype to define the array int superTid = -1; try { int mn = H5.H5Tget_array_ndims(tid); long[] marray = new long[mn]; H5.H5Tget_array_dims(tid, marray); int asize = 1; for (int j = 0; j < mn; j++) { asize *= marray[j]; } superTid = H5.H5Tget_super(tid); data = allocateArray(superTid, size * asize); } catch (Exception ex) {} finally { try { H5.H5Tclose(superTid); } catch (Exception ex) {} } } else { data = null; } return data; } /** * Returns the size (in bytes) of a given datatype identifier. *

    * It basically just calls H5Tget_size(tid). * * @param tid * The datatype identifier. * @return The size of the datatype in bytes. * * @see ncsa.hdf.hdf5lib.H5#H5Tget_size(int) */ public static final int getDatatypeSize(int tid) { // data type information int tsize = -1; try { tsize = H5.H5Tget_size(tid); } catch (Exception ex) { tsize = -1; } return tsize; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Datatype#getDatatypeDescription() */ @Override public String getDatatypeDescription() { if (description == null) { int tid = toNative(); description = getDatatypeDescription(tid); close(tid); } return description; } /** * Returns a short description of a given datatype ID. * * @param tid * the HDF5 datatype identifier * @return a string describing the data type. */ public static final String getDatatypeDescription(int tid) { String description = "Unknown"; // data type information int tclass = -1, tsize = -1, tsign = -1, torder = -1; try { tclass = H5.H5Tget_class(tid); tsize = H5.H5Tget_size(tid); tsign = H5.H5Tget_sign(tid); } catch (Exception ex) {} if (tclass == HDF5Constants.H5T_INTEGER) { if (tsize == 1) { try { if (H5.H5Tequal(tid, HDF5Constants.H5T_NATIVE_UCHAR)) { description = "8-bit unsigned character"; } else if (H5.H5Tequal(tid, HDF5Constants.H5T_NATIVE_CHAR)) { description = "8-bit character"; } else if (tsign == HDF5Constants.H5T_SGN_NONE) { description = "8-bit unsigned integer"; } else { description = "8-bit integer"; } } catch (Exception ex) { description = "Unknown"; } } else if (tsize == 2) { if (tsign == HDF5Constants.H5T_SGN_NONE) { description = "16-bit unsigned integer"; } else { description = "16-bit integer"; } } else if (tsize == 4) { if (tsign == HDF5Constants.H5T_SGN_NONE) { description = "32-bit unsigned integer"; } else { description = "32-bit integer"; } } else if (tsize == 8) { if (tsign == HDF5Constants.H5T_SGN_NONE) { description = "64-bit unsigned integer"; } else { description = "64-bit integer"; } } } else if (tclass == HDF5Constants.H5T_FLOAT) { if (tsize == 4) { description = "32-bit floating-point"; } else if (tsize == 8) { description = "64-bit floating-point"; } } else if (tclass == HDF5Constants.H5T_STRING) { try { if (H5.H5Tis_variable_str(tid)) { description = "String, length = variable"; } else { description = "String, length = " + H5.H5Tget_size(tid); } } catch (Exception ex) { description = "String"; } } else if (tclass == HDF5Constants.H5T_REFERENCE) { boolean is_reg_ref = false; try { is_reg_ref = H5.H5Tequal(tid, HDF5Constants.H5T_STD_REF_DSETREG); } catch (Exception ex) {} if (is_reg_ref) { description = "Dataset region reference"; } else { description = "Object reference"; } } else if (tclass == HDF5Constants.H5T_BITFIELD) { description = "Bitfield"; } else if (tclass == HDF5Constants.H5T_ENUM) { description = "enum"; String enames = " ( "; int[] evalue = { 0 }; try { int n = H5.H5Tget_nmembers(tid); for (int i = 0; i < n; i++) { H5.H5Tget_member_value(tid, i, evalue); enames += H5.H5Tget_member_name(tid, i); enames += "=" + evalue[0] + " "; } enames += ")"; description += enames; } catch (Exception ex) {} } else if (tclass == HDF5Constants.H5T_ARRAY) { description = "Array of "; // use the base datatype to define the array int tmptid = -1; try { tmptid = H5.H5Tget_super(tid); description += getDatatypeDescription(tmptid); int ndims = H5.H5Tget_array_ndims(tid); long adims[] = new long[ndims]; try { H5.H5Tget_array_dims(tid, adims); } catch (Exception ex) {} description += " (" + adims[0]; for (int j = 1; j < ndims; j++) description += "x" + adims[j]; description += ")"; } catch (Exception ex) {} finally { try { H5.H5Tclose(tmptid); } catch (Exception ex) {} } } else if (tclass == HDF5Constants.H5T_COMPOUND) { description = "Compound "; try { description += "{"; int n = H5.H5Tget_nmembers(tid); int mtid = 0; try { H5.H5Tclose(mtid); } catch (Exception ex2) {} for (int i = 0; i < n; i++) { mtid = H5.H5Tget_member_type(tid, i); description += getDatatypeDescription(mtid) + ", "; try { H5.H5Tclose(mtid); } catch (Exception ex2) {} } description += "}"; } catch (Exception ex) {} } else if (tclass == HDF5Constants.H5T_VLEN) { int tmptid = -1; try { tmptid = H5.H5Tget_super(tid); description = "Variable-length of " + getDatatypeDescription(tmptid); } catch (Exception ex) { description = "Variable-length"; } finally { try { H5.H5Tclose(tmptid); } catch (Exception ex) {} } } else if (tclass == HDF5Constants.H5T_OPAQUE) { description = "Opaque"; } else { description = "Unknown"; } return description; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Datatype#isUnsigned() */ @Override public boolean isUnsigned() { return (isUnsigned(toNative())); } /** * Checks if a datatype specified by the identifier is an unsigned integer. *

    * * @param datatype * the datatype ID to be checked. * * @return true is the datatype is an unsigned integer; otherwise returns * false. */ public static final boolean isUnsigned(int datatype) { boolean unsigned = false; try { int tsign = H5.H5Tget_sign(datatype); if (tsign == HDF5Constants.H5T_SGN_NONE) { unsigned = true; } } catch (Exception ex) { unsigned = false; } return unsigned; } /** * Opens access to a named datatype. *

    * It calls H5.H5Topen(loc, name). * * @return the datatype identifier if successful; otherwise returns negative * value. * * @see ncsa.hdf.hdf5lib.H5#H5Topen(int, String) */ @Override public int open() { int tid = -1; try { tid = H5.H5Topen(getFID(), getPath() + getName(), HDF5Constants.H5P_DEFAULT); } catch (HDF5Exception ex) { tid = -1; } return tid; } /** * Closes a datatype identifier. *

    * It calls H5.H5close(tid). * * @param tid * the datatype ID to close */ @Override public void close(int tid) { try { H5.H5Tclose(tid); } catch (HDF5Exception ex) {} } /* * (non-Javadoc) * * @see ncsa.hdf.object.Datatype#getMetadata() */ @Override public List getMetadata() throws HDF5Exception { return this.getMetadata(fileFormat.getIndexType(null), fileFormat.getIndexOrder(null)); } /* * (non-Javadoc) * * @see ncsa.hdf.object.DataFormat#getMetadata(int...) */ public List getMetadata(int... attrPropList) throws HDF5Exception { // load attributes first if (attributeList == null) { int tid = open(); int indxType = fileFormat.getIndexType(null); int order = fileFormat.getIndexOrder(null); if (attrPropList.length > 0) { indxType = attrPropList[0]; if (attrPropList.length > 1) { order = attrPropList[1]; } } try { attributeList = H5File.getAttribute(tid, indxType, order); } catch (Exception ex) {} finally { close(tid); } } // if (attributeList == null) try { this.linkTargetObjName = H5File.getLinkTargetName(this); } catch (Exception ex) {} return attributeList; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Datatype#writeMetadata(java.lang.Object) */ @Override public void writeMetadata(Object info) throws Exception { // only attribute metadata is supported. if (!(info instanceof Attribute)) { return; } boolean attrExisted = false; Attribute attr = (Attribute) info; String name = attr.getName(); if (attributeList == null) { this.getMetadata(); } if (attributeList != null) attrExisted = attributeList.contains(attr); getFileFormat().writeAttribute(this, attr, attrExisted); // add the new attribute into attribute list if (!attrExisted) { attributeList.add(attr); nAttributes = attributeList.size(); } } /* * (non-Javadoc) * * @see ncsa.hdf.object.Datatype#removeMetadata(java.lang.Object) */ @Override public void removeMetadata(Object info) throws HDF5Exception { // only attribute metadata is supported. if (!(info instanceof Attribute)) { return; } Attribute attr = (Attribute) info; int tid = open(); try { H5.H5Adelete(tid, attr.getName()); List attrList = getMetadata(); attrList.remove(attr); nAttributes = attributeList.size(); } finally { close(tid); } } public void setName(String newName) throws Exception { H5File.renameObject(this, newName); super.setName(newName); } } jhdf-2.9/ncsa/hdf/object/ScalarDS.java0000644000175000017500000003323212050301060020401 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.object; /** * A scalar dataset is a multiple dimension array of scalar points. The Datatype * of a scalar dataset must be an atomic datatype. Common datatypes of scalar * datasets include char, byte, short, int, long, float, double and string. *

    * A ScalarDS can be an image or spreadsheet data. ScalarDS defines few methods * to deal with both images and spreadsheets. *

    * ScalarDS is an abstract class. Current implementing classes are the H4SDS, * H5GRImage and H5ScalarDS. *

    * * @version 1.1 9/4/2007 * @author Peter X. Cao */ public abstract class ScalarDS extends Dataset { // The following constant strings are copied from // http://hdf.ncsa.uiuc.edu/HDF5/doc/ADGuide/ImageSpec.html // to make the defination consistent with the image specs. /** * */ private static final long serialVersionUID = 8925371455928203981L; /** * Indicates that the pixel RGB values are contiguous. */ public final static int INTERLACE_PIXEL = 0; /** Indicates that each pixel component of RGB is stored as a scan line. */ public static final int INTERLACE_LINE = 1; /** Indicates that each pixel component of RGB is stored as a plane. */ public final static int INTERLACE_PLANE = 2; /** * The interlace mode of the stored raster image data. Valid values are * INTERLACE_PIXEL, INTERLACE_LINE and INTERLACE_PLANE. */ protected int interlace; /** * The min-max range of image data values. For example, [0, 255] indicates * the min is 0, and the max is 255. */ protected double[] imageDataRange; /** * The indexed RGB color model with 256 colors. *

    * The palette values are stored in a two-dimensional byte array and arrange * by color components of red, green and blue. palette[][] = byte[3][256], * where, palette[0][], palette[1][] and palette[2][] are the red, green and * blue components respectively. */ protected byte[][] palette; /** * True if this dataset is an image. */ protected boolean isImage; /** * True if this dataset is a true color image. */ protected boolean isTrueColor; /** * True if this dataset is ASCII text. */ protected boolean isText; /** * Flag to indicate if the original C data is unsigned integer. */ protected boolean isUnsigned; /** * Flag to indicate is the original unsigned C data is converted. */ protected boolean unsignedConverted; /** The fill value of the dataset. */ protected Object fillValue = null; /** Flag to indicate if the dataset is displayed as an image */ protected boolean isImageDisplay; /** * Flag to indicate if the dataset is displayed as an image with default * order of dimensions */ protected boolean isDefaultImageOrder; /** * Flag to indicate if the FillValue is converted from unsigned C. */ public boolean isFillValueConverted; /** * Constructs an instance of a ScalarDS with specific name and path. An HDF * data object must have a name. The path is the group path starting from * the root. *

    * For example, in H5ScalarDS(h5file, "dset", "/arrays/"), "dset" is the * name of the dataset, "/arrays" is the group path of the dataset. * * @param theFile * the file that contains the data object. * @param theName * the name of the data object, e.g. "dset". * @param thePath * the full path of the data object, e.g. "/arrays/". */ public ScalarDS(FileFormat theFile, String theName, String thePath) { this(theFile, theName, thePath, null); } /** * @deprecated Not for public use in the future.
    * Using {@link #ScalarDS(FileFormat, String, String)} */ @Deprecated public ScalarDS(FileFormat theFile, String theName, String thePath, long[] oid) { super(theFile, theName, thePath, oid); palette = null; isImage = false; isTrueColor = false; isText = false; isUnsigned = false; interlace = -1; datatype = null; imageDataRange = null; isImageDisplay = false; isDefaultImageOrder = true; isFillValueConverted = false; } /* * (non-Javadoc) * * @see ncsa.hdf.object.Dataset#clearData() */ @Override public void clearData() { super.clearData(); unsignedConverted = false; } /** * Converts the data values of this dataset to appropriate Java integer if * they are unsigned integers. * * @see ncsa.hdf.object.Dataset#convertToUnsignedC(Object) * @see ncsa.hdf.object.Dataset#convertFromUnsignedC(Object, Object) * * @return the converted data buffer. */ public Object convertFromUnsignedC() { // keep a copy of original buffer and the converted buffer // so that they can be reused later to save memory if ((data != null) && isUnsigned && !unsignedConverted) { originalBuf = data; convertedBuf = convertFromUnsignedC(originalBuf, convertedBuf); data = convertedBuf; unsignedConverted = true; if (fillValue != null) { if(!isFillValueConverted){ fillValue = convertFromUnsignedC(fillValue, null); isFillValueConverted = true; } } } return data; } /** * Converts Java integer data of this dataset back to unsigned C-type * integer data if they are unsigned integers. * * @see ncsa.hdf.object.Dataset#convertToUnsignedC(Object) * @see ncsa.hdf.object.Dataset#convertToUnsignedC(Object, Object) * @see #convertFromUnsignedC(Object data_in) * * @return the converted data buffer. */ public Object convertToUnsignedC() { // keep a copy of original buffer and the converted buffer // so that they can be reused later to save memory if ((data != null) && isUnsigned) { convertedBuf = data; originalBuf = convertToUnsignedC(convertedBuf, originalBuf); data = originalBuf; } return data; } /** * Returns the palette of this scalar dataset or null if palette does not * exist. *

    * Scalar dataset can be displayed as spreadsheet data or image. When a * scalar dataset is chosen to display as an image, the palette or color * table may be needed to translate a pixel value to color components (for * example, red, green, and blue). Some scalar datasets have no palette and * some datasets have one or more than one palettes. If an associated * palette exists but not loaded, this interface retrieves the palette from * the file and returns the palette. If the palette is loaded, it returnd * the palette. It returns null if there is no palette assciated with the * dataset. *

    * Current implementation only supports palette model of indexed RGB with * 256 colors. Other models such as YUV", "CMY", "CMYK", "YCbCr", "HSV will * be supported in the future. *

    * The palette values are stored in a two-dimensional byte array and arrange * by color components of red, green and blue. palette[][] = byte[3][256], * where, palette[0][], palette[1][] and palette[2][] are the red, green and * blue components respectively. *

    * Sub-classes have to implement this interface. HDF4 and HDF5 images use * different libraries to retrieve the associated palette. * * @return the 2D palette byte array. */ public abstract byte[][] getPalette(); /** * Sets the palette for this dataset. * * @param pal * the 2D palette byte array. */ public final void setPalette(byte[][] pal) { palette = pal; } /** * Reads a specific image palette from file. *

    * A scalar dataset may have multiple palettes attached to it. * readPalette(int idx) returns a specific palette identified by its index. * * @param idx * the index of the palette to read. */ public abstract byte[][] readPalette(int idx); /** * Get the name of a specific image palette from file. *

    * A scalar dataset may have multiple palettes attached to it. * getPaletteName(int idx) returns the name of a specific palette identified by its index. * * @param idx * the index of the palette to retrieve the name. * @return The name of the palette */ public String getPaletteName(int idx){ String paletteName = "Default "; if (idx !=0) paletteName = "Default " + idx; return paletteName; } /** * Returns the byte array of palette refs. *

    * A palette reference is an object reference that points to the palette * dataset. *

    * For example, Dataset "Iceberg" has an attribute of object reference * "Palette". The arrtibute "Palette" has value "2538" that is the object * reference of the palette data set "Iceberg Palette". * * @return null if there is no palette attribute attached to this dataset. */ public abstract byte[] getPaletteRefs(); /** * Returns true if this dataset is an image. *

    * For all Images, they must have an attribute called "CLASS". The value of * this attribute is "IMAGE". For more details, read HDF5 Image * and Palette Specification * * @return true if the dataset is an image; otherwise, returns false. */ public final boolean isImage() { return isImage; } /** * Returns true if this dataset is displayed as an image. *

    * A ScalarDS can be displayed as an image or table. * * @return true if this dataset is displayed as an image; otherwise, returns * false. */ public final boolean isImageDisplay() { return isImageDisplay; } /** * Returns true if this dataset is displayed as an image with default image * order. *

    * A ScalarDS can be displayed as an image with different orders of * dimensions. * * @return true if this dataset is displayed as an image with default image * order; otherwise, returns false. */ public final boolean isDefaultImageOrder() { return isDefaultImageOrder; } /** * Sets the flag to display the dataset as an image. * * @param b * if b is true, display the dataset as an image */ public final void setIsImageDisplay(boolean b) { isImageDisplay = b; if (isImageDisplay) { enumConverted = false; } } /** * Sets the flag to indicate this dataset is an image. * * @param b * if b is true, the dataset is an image. */ public final void setIsImage(boolean b) { isImage = b; if (isImage) { enumConverted = false; } } /** * Returns true if this dataset is a true color image. */ public final boolean isTrueColor() { return isTrueColor; } /** * Returns true if this dataset is ASCII text. * * @return true if this dataset is ASCII text. */ public final boolean isText() { return isText; } /** * Returns the interlace mode of a true color image (RGB). * * Valid values: * *

         *     INTERLACE_PIXEL -- RGB components are contiguous, i.e. rgb, rgb, rgb, ...
         *     INTERLACE_LINE -- each RGB component is stored as a scan line
         *     INTERLACE_PLANE -- each RGB component is stored as a plane
         * 
    * * @return the interlace mode of a true color image (RGB). */ public final int getInterlace() { return interlace; } /** * Returns true if the original C data are unsigned integers. * * @return true if the original C data are unsigned integers. */ public final boolean isUnsigned() { return isUnsigned; } /** * Returns the (min, max) pair of image data range. * * @return the (min, max) pair of image data range. */ public double[] getImageDataRange() { return imageDataRange; } /** * Returns the fill values for the dataset. * * @return the fill values for the dataset. */ public final Object getFillValue() { return fillValue; } } jhdf-2.9/ncsa/hdf/Makefile.in0000644000175000017500000000243412050301064016705 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = ../.. DIR = ncsa/hdf SUBDIRS = hdf5lib hdflib object view JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ include $(TOP)/config/Rules.mk jhdf-2.9/ncsa/hdf/CMakeLists.txt0000644000175000017500000000052212050301064017374 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_NCSA_HDF) ADD_SUBDIRECTORY(${HDFJAVA_NCSA_HDF_SOURCE_DIR}/hdflib hdflib) ADD_SUBDIRECTORY(${HDFJAVA_NCSA_HDF_SOURCE_DIR}/hdf5lib hdf5lib) ADD_SUBDIRECTORY(${HDFJAVA_NCSA_HDF_SOURCE_DIR}/object object) ADD_SUBDIRECTORY(${HDFJAVA_NCSA_HDF_SOURCE_DIR}/view view) jhdf-2.9/ncsa/hdf/hdf5lib/0000755000175000017500000000000012051203651016156 5ustar sylvestresylvestrejhdf-2.9/ncsa/hdf/hdf5lib/HDF5GroupInfo.java0000755000175000017500000001177112050301064021346 0ustar sylvestresylvestre/**************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.hdf5lib; /** *

    * This class is a container for the information reported about an HDF5 Object * from the H5Gget_obj_info() method. *

    * The fileno and objno fields contain four values which uniquely identify an * object among those HDF5 files which are open: if all four values are the same * between two objects, then the two objects are the same (provided both files * are still open). The nlink field is the number of hard links to the object or * zero when information is being returned about a symbolic link (symbolic links * do not have hard links but all other objects always have at least one). The * type field contains the type of the object, one of H5G_GROUP, H5G_DATASET, or * H5G_LINK. The mtime field contains the modification time. If information is * being returned about a symbolic link then linklen will be the length of the * link value (the name of the pointed-to object with the null terminator); * otherwise linklen will be zero. Other fields may be added to this structure * in the future. *

    * For details of the HDF5 libraries, see the HDF5 Documentation at: http://hdf.ncsa.uiuc.edu/HDF5/doc/ */ public class HDF5GroupInfo { long[] fileno; long[] objno; int nlink; int type; long mtime; int linklen; public HDF5GroupInfo() { fileno = new long[2]; objno = new long[2]; nlink = -1; type = -1; mtime = 0; linklen = 0; } /** * Sets the HDF5 group information. Used by the JHI5. * * @param fn * File id number * @param on * Object id number * @param nl * Number of links * @param t * Type of the object * @param mt * Modification time * @param len * Length of link **/ public void setGroupInfo(long[] fn, long[] on, int nl, int t, long mt, int len) { fileno = fn; objno = on; nlink = nl; type = t; mtime = mt; linklen = len; } /** Resets all the group information to defaults. */ public void reset() { fileno[0] = 0; fileno[1] = 0; objno[0] = 0; objno[1] = 0; nlink = -1; type = -1; mtime = 0; linklen = 0; } /* accessors */ public long[] getFileno() { return fileno; } public long[] getObjno() { return objno; } public int getType() { return type; } public int getNlink() { return nlink; } public long getMtime() { return mtime; } public int getLinklen() { return linklen; } /** * The fileno and objno fields contain four values which uniquely identify * an object among those HDF5 files. */ @Override public boolean equals(Object obj) { if (!(obj instanceof HDF5GroupInfo)) { return false; } HDF5GroupInfo target = (HDF5GroupInfo) obj; if ((fileno[0] == target.fileno[0]) && (fileno[1] == target.fileno[1]) && (objno[0] == target.objno[0]) && (objno[1] == target.objno[1])) { return true; } else { return false; } } /** * Returns the object id. */ public long getOID() { return objno[0]; } /** * /** Converts this object to a String representation. * * @return a string representation of this object */ @Override public String toString() { String fileStr = "fileno=null"; String objStr = "objno=null"; if (fileno != null) { fileStr = "fileno[0]=" + fileno[0] + ",fileno[1]=" + fileno[1]; } if (objno != null) { objStr = "objno[0]=" + objno[0] + ",objno[1]=" + objno[1]; } return getClass().getName() + "[" + fileStr + "," + objStr + ",type=" + type + ",nlink=" + nlink + ",mtime=" + mtime + ",linklen=" + linklen + "]"; } } jhdf-2.9/ncsa/hdf/hdf5lib/structs/0000755000175000017500000000000012051203651017665 5ustar sylvestresylvestrejhdf-2.9/ncsa/hdf/hdf5lib/structs/H5O_info_t.java0000644000175000017500000000527412050301064022465 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.structs; import java.io.Serializable; //Information struct for object (for H5Oget_info/H5Oget_info_by_name/H5Oget_info_by_idx) public class H5O_info_t implements Serializable{ private static final long serialVersionUID = 4691681163544054518L; public long fileno; /* File number that object is located in */ public long addr; /* Object address in file */ public int type; /* Basic object type (group, dataset, etc.) */ public int rc; /* Reference count of object */ public long atime; /* Access time */ public long mtime; /* Modification time */ public long ctime; /* Change time */ public long btime; /* Birth time */ public long num_attrs; /* # of attributes attached to object */ public H5O_hdr_info_t hdr; /* Object header information */ /* Extra metadata storage for obj & attributes */ public H5_ih_info_t meta_size_obj; /* v1/v2 B-tree & local/fractal heap for groups, B-tree for chunked datasets */ public H5_ih_info_t meta_size_attr; /* v2 B-tree & heap for attributes */ public H5O_info_t (long fileno, long addr, int type, int rc, long num_attrs, long atime, long mtime, long ctime, long btime, H5O_hdr_info_t hdr, H5_ih_info_t meta_size_obj, H5_ih_info_t meta_size_attr) { this.fileno = fileno; this.addr = addr; this.type = type; this.rc = rc; this.num_attrs = num_attrs; this.atime = atime; this.mtime = mtime; this.ctime = ctime; this.btime = btime; this.hdr = hdr; this.meta_size_obj = meta_size_obj; this.meta_size_attr = meta_size_attr; } } jhdf-2.9/ncsa/hdf/hdf5lib/structs/Makefile.in0000644000175000017500000000266512050301064021737 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = ../../../.. DIR = ncsa/hdf/hdf5lib/structs SUBDIRS = NULL JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ JAVA_SRCS= \ H5_ih_info_t.java \ H5A_info_t.java \ H5G_info_t.java \ H5L_info_t.java \ H5O_info_t.java \ H5O_hdr_info_t.java \ H5AC_cache_config_t.java include $(TOP)/config/Rules.mk jhdf-2.9/ncsa/hdf/hdf5lib/structs/H5AC_cache_config_t.java0000644000175000017500000001164512050301064024206 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.structs; import java.io.Serializable; //Information struct for H5Pget_mdc_config/H5Pset_mdc_config public class H5AC_cache_config_t implements Serializable{ private static final long serialVersionUID = -6748085696476149972L; // general configuration fields: public int version; public boolean rpt_fcn_enabled; public boolean open_trace_file; public boolean close_trace_file; public String trace_file_name; public boolean evictions_enabled; public boolean set_initial_size; public long initial_size; public double min_clean_fraction; public long max_size; public long min_size; public long epoch_length; // size increase control fields: public int incr_mode; // H5C_cache_incr_mode public double lower_hr_threshold; public double increment; public boolean apply_max_increment; public long max_increment; public int flash_incr_mode; // H5C_cache_flash_incr_mode public double flash_multiple; public double flash_threshold; // size decrease control fields: public int decr_mode; // H5C_cache_decr_mode public double upper_hr_threshold; public double decrement; public boolean apply_max_decrement; public long max_decrement; public int epochs_before_eviction; public boolean apply_empty_reserve; public double empty_reserve; // parallel configuration fields: public int dirty_bytes_threshold; public int metadata_write_strategy; public H5AC_cache_config_t (int version, boolean rpt_fcn_enabled, boolean open_trace_file, boolean close_trace_file, String trace_file_name, boolean evictions_enabled, boolean set_initial_size, long initial_size, double min_clean_fraction, long max_size, long min_size, long epoch_length, int incr_mode, double lower_hr_threshold, double increment, boolean apply_max_increment, long max_increment, int flash_incr_mode, double flash_multiple, double flash_threshold, int decr_mode, double upper_hr_threshold, double decrement, boolean apply_max_decrement, long max_decrement, int epochs_before_eviction, boolean apply_empty_reserve, double empty_reserve, int dirty_bytes_threshold, int metadata_write_strategy) { this.version = version; this.rpt_fcn_enabled = rpt_fcn_enabled; this.open_trace_file = open_trace_file; this.close_trace_file = close_trace_file; this.trace_file_name = trace_file_name; this.evictions_enabled = evictions_enabled; this.set_initial_size = set_initial_size; this.initial_size = initial_size; this.min_clean_fraction = min_clean_fraction; this.max_size = max_size; this.min_size = min_size; this.epoch_length = epoch_length; this.incr_mode = incr_mode; this.lower_hr_threshold = lower_hr_threshold; this.increment = increment; this.apply_max_increment = apply_max_increment; this.max_increment = flash_incr_mode; this.flash_incr_mode = flash_incr_mode; this.flash_multiple = flash_multiple; this.flash_threshold = flash_threshold; this.decr_mode = decr_mode; this.upper_hr_threshold = upper_hr_threshold; this.decrement = decrement; this.apply_max_decrement = apply_max_decrement; this.max_decrement = max_decrement; this.epochs_before_eviction = epochs_before_eviction; this.apply_empty_reserve = apply_empty_reserve; this.empty_reserve = empty_reserve; this.dirty_bytes_threshold = dirty_bytes_threshold; this.metadata_write_strategy = metadata_write_strategy; } } jhdf-2.9/ncsa/hdf/hdf5lib/structs/H5O_hdr_info_t.java0000644000175000017500000000504712050301064023320 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.structs; import java.io.Serializable; // Information struct for object header metadata (for H5Oget_info/H5Oget_info_by_name/H5Oget_info_by_idx) public class H5O_hdr_info_t implements Serializable{ private static final long serialVersionUID = 7883826382952577189L; public int version; /* Version number of header format in file */ public int nmesgs; /* Number of object header messages */ public int nchunks; /* Number of object header chunks */ public int flags; /* Object header status flags */ public long space_total; /* Total space for storing object header in file */ public long space_meta; /* Space within header for object header metadata information */ public long space_mesg; /* Space within header for actual message information */ public long space_free; /* Free space within object header */ public long mesg_present; /* Flags to indicate presence of message type in header */ public long mesg_shared; /* Flags to indicate message type is shared in header */ H5O_hdr_info_t (int version, int nmesgs, int nchunks, int flags, long space_total, long space_meta, long space_mesg, long space_free, long mesg_present, long mesg_shared) { this.version = version; this.nmesgs = nmesgs; this.nchunks = nchunks; this.flags = flags; this.space_total = space_total; this.space_meta = space_meta; this.space_mesg = space_mesg; this.space_free = space_free; this.mesg_present = mesg_present; this.mesg_shared = mesg_shared; } } jhdf-2.9/ncsa/hdf/hdf5lib/structs/H5_ih_info_t.java0000644000175000017500000000266612050301064023030 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.structs; import java.io.Serializable; //Information struct for group (for H5Gget_info/H5Gget_info_by_name/H5Gget_info_by_idx) public class H5_ih_info_t implements Serializable { private static final long serialVersionUID = -142238015615462707L; public long index_size; /* btree and/or list */ public long heap_size; H5_ih_info_t (long index_size, long heap_size) { this.index_size = index_size; this.heap_size = heap_size; } } jhdf-2.9/ncsa/hdf/hdf5lib/structs/H5A_info_t.java0000644000175000017500000000321612050301064022441 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.structs; import java.io.Serializable; //Information struct for Attribute (For H5Aget_info/H5Aget_info_by_idx/H5Aget_info_by_name) public class H5A_info_t implements Serializable{ private static final long serialVersionUID = 2791443594041667613L; public boolean corder_valid; // Indicate if creation order is valid public long corder; // Creation order of attribute public int cset; // Character set of attribute name public long data_size; // Size of raw data H5A_info_t(boolean corder_valid, long corder, int cset, long data_size) { this.corder_valid = corder_valid; this.corder = corder; this.cset = cset; this.data_size = data_size; } } jhdf-2.9/ncsa/hdf/hdf5lib/structs/H5G_info_t.java0000644000175000017500000000272212050301064022450 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.structs; import java.io.Serializable; //Information struct for group (for H5Gget_info/H5Gget_info_by_name/H5Gget_info_by_idx) public class H5G_info_t implements Serializable{ private static final long serialVersionUID = -3746463015312132912L; public int storage_type; // Type of storage for links in group public long nlinks; // Number of links in group public long max_corder; // Current max. creation order value for group public boolean mounted; // Whether group has a file mounted on it } jhdf-2.9/ncsa/hdf/hdf5lib/structs/H5L_info_t.java0000644000175000017500000000315612050301064022457 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.structs; import java.io.Serializable; //Information struct for link (for H5Lget_info/H5Lget_info_by_idx) public class H5L_info_t implements Serializable{ private static final long serialVersionUID = -4754320605310155033L; public int type; public boolean corder_valid; public long corder; public int cset; public long address_val_size; H5L_info_t (int type, boolean corder_valid, long corder, int cset, long address_val_size) { this.type = type; this.corder_valid = corder_valid; this.corder = corder; this.cset = cset; this.address_val_size = address_val_size; } } jhdf-2.9/ncsa/hdf/hdf5lib/Makefile.in0000644000175000017500000000262312050301064020222 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = ../../.. DIR = ncsa/hdf/hdf5lib SUBDIRS = exceptions callbacks structs JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ JAVA_SRCS = \ H5.java \ HDF5Constants.java \ HDF5GroupInfo.java \ HDFArray.java \ HDFNativeData.java include $(TOP)/config/Rules.mk jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/0000755000175000017500000000000012051203651020337 5ustar sylvestresylvestrejhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java0000644000175000017500000000276412050301064027430 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_RESOURCE */ public class HDF5ResourceUnavailableException extends HDF5LibraryException { /** * Constructs an HDF5ResourceUnavailableException with no * specified detail message. */ public HDF5ResourceUnavailableException() { super(); } /** * Constructs an HDF5FunctionArgumentException with the * specified detail message. * * @param s * the detail message. */ public HDF5ResourceUnavailableException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5JavaException.java0000644000175000017500000000272512050301064024353 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** *

    * The class HDF5JavaException returns errors from the Java wrapper of theHDF5 * library. *

    * These errors include Java configuration errors, security violations, and * resource exhaustion. */ public class HDF5JavaException extends HDF5Exception { /** * Constructs an HDF5JavaException with no specified detail * message. */ public HDF5JavaException() { super(); } /** * Constructs an HDF5JavaException with the specified detail * message. * * @param s * the detail message. */ public HDF5JavaException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java0000644000175000017500000000275512050301064027071 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_DATATYPE */ public class HDF5DatatypeInterfaceException extends HDF5LibraryException { /** * Constructs an HDF5DatatypeInterfaceException with no * specified detail message. */ public HDF5DatatypeInterfaceException() { super(); } /** * Constructs an HDF5DatatypeInterfaceException with the * specified detail message. * * @param s * the detail message. */ public HDF5DatatypeInterfaceException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java0000644000175000017500000000271312050301064025671 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_PLINE */ public class HDF5DataFiltersException extends HDF5LibraryException { /** * Constructs an HDF5DataFiltersException with no specified * detail message. */ public HDF5DataFiltersException() { super(); } /** * Constructs an HDF5DataFiltersException with the specified * detail message. * * @param s * the detail message. */ public HDF5DataFiltersException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5AtomException.java0000644000175000017500000000265112050301064024370 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_ATOM */ public class HDF5AtomException extends HDF5LibraryException { /** * Constructs an HDF5AtomException with no specified detail * message. */ public HDF5AtomException() { super(); } /** * Constructs an HDF5AtomException with the specified detail * message. * * @param s * the detail message. */ public HDF5AtomException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5AttributeException.java0000644000175000017500000000270012050301064025426 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_ATTR */ public class HDF5AttributeException extends HDF5LibraryException { /** * Constructs an HDF5AttributeException with no specified * detail message. */ public HDF5AttributeException() { super(); } /** * Constructs an HDF5AttributeException with the specified * detail message. * * @param s * the detail message. */ public HDF5AttributeException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java0000644000175000017500000000263212050301064026255 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_INTERNAL */ public class HDF5InternalErrorException extends HDF5LibraryException { /** * Constructs an HDF5InternalErrorException with no specified * detail message. */ public HDF5InternalErrorException() { super(); } /** * Constructs an HDF5InternalErrorException with the specified * detail message. * * @param s * the detail message. */ public HDF5InternalErrorException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java0000644000175000017500000000270412050301064025450 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_IO */ public class HDF5LowLevelIOException extends HDF5LibraryException { /** * Constructs an HDF5LowLevelIOException with no specified * detail message. */ public HDF5LowLevelIOException() { super(); } /** * Constructs an HDF5LowLevelIOException with the specified * detail message. * * @param s * the detail message. */ public HDF5LowLevelIOException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/Makefile.in0000644000175000017500000000411712050301064022403 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = ../../../.. DIR = ncsa/hdf/hdf5lib/exceptions SUBDIRS = NULL JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ JAVA_SRCS = \ HDF5AtomException.java \ HDF5AttributeException.java \ HDF5BtreeException.java \ HDF5DataFiltersException.java \ HDF5DataStorageException.java \ HDF5DatasetInterfaceException.java \ HDF5DataspaceInterfaceException.java \ HDF5DatatypeInterfaceException.java \ HDF5Exception.java \ HDF5ExternalFileListException.java \ HDF5FileInterfaceException.java \ HDF5FunctionArgumentException.java \ HDF5FunctionEntryExitException.java \ HDF5HeapException.java \ HDF5InternalErrorException.java \ HDF5JavaException.java \ HDF5LibraryException.java \ HDF5LowLevelIOException.java \ HDF5MetaDataCacheException.java \ HDF5ObjectHeaderException.java \ HDF5PropertyListInterfaceException.java \ HDF5ReferenceException.java \ HDF5ResourceUnavailableException.java \ HDF5SymbolTableException.java include $(TOP)/config/Rules.mk jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java0000644000175000017500000000274312050301064026710 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_EFL */ public class HDF5ExternalFileListException extends HDF5LibraryException { /** * Constructs an HDF5ExternalFileListException with no * specified detail message. */ public HDF5ExternalFileListException() { super(); } /** * Constructs an HDF5ExternalFileListException with the * specified detail message. * * @param s * the detail message. */ public HDF5ExternalFileListException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java0000644000175000017500000000274412050301064026763 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_ARGS */ public class HDF5FunctionArgumentException extends HDF5LibraryException { /** * Constructs an HDF5FunctionArgumentException with no * specified detail message. */ public HDF5FunctionArgumentException() { super(); } /** * Constructs an HDF5FunctionArgumentException with the * specified detail message. * * @param s * the detail message. */ public HDF5FunctionArgumentException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java0000644000175000017500000000276312050301064027202 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_DATASPACE */ public class HDF5DataspaceInterfaceException extends HDF5LibraryException { /** * Constructs an HDF5DataspaceInterfaceException with no * specified detail message. */ public HDF5DataspaceInterfaceException() { super(); } /** * Constructs an HDF5DataspaceInterfaceException with the * specified detail message. * * @param s * the detail message. */ public HDF5DataspaceInterfaceException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java0000644000175000017500000000271212050301064025703 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_SYM */ public class HDF5SymbolTableException extends HDF5LibraryException { /** * Constructs an HDF5SymbolTableException with no specified * detail message. */ public HDF5SymbolTableException() { super(); } /** * Constructs an HDF5SymbolTableException with the specified * detail message. * * @param s * the detail message. */ public HDF5SymbolTableException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5ReferenceException.java0000644000175000017500000000244012050301064025362 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; public class HDF5ReferenceException extends HDF5LibraryException { /** * Constructs an HDF5ReferenceException with no specified * detail message. */ public HDF5ReferenceException() { super(); } /** * Constructs an HDF5ReferenceException with the specified * detail message. * * @param s * the detail message. */ public HDF5ReferenceException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5LibraryException.java0000644000175000017500000003144512050301064025077 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; /** *

    * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * Each major error code from the HDF-5 Library is represented by a sub-class of * this class, and by default the 'detailedMessage' is set according to the * minor error code from the HDF-5 Library. *

    * For major and minor error codes, see H5Epublic.h in the HDF-5 library. *

    */ @SuppressWarnings("serial") public class HDF5LibraryException extends HDF5Exception { /** * Constructs an HDF5LibraryException with no specified detail * message. */ public HDF5LibraryException() { super(); // this code forces the loading of the HDF-5 library // to assure that the native methods are available try { H5.H5open(); } catch (Exception e) { } ; detailMessage = getMinorError(getMinorErrorNumber()); } /** * Constructs an HDF5LibraryException with the specified detail * message. * * @param s * the detail message. */ public HDF5LibraryException(String s) { super(s); // this code forces the loading of the HDF-5 library // to assure that the native methods are available try { H5.H5open(); } catch (Exception e) { } ; } /** * Get the major error number of the first error on the HDF5 library error * stack. * * @return the major error number */ public native int getMajorErrorNumber(); /** * Get the minor error number of the first error on the HDF5 library error * stack. * * @return the minor error number */ public native int getMinorErrorNumber(); /** * Return a error message for the minor error number. *

    * These messages come from H5Epublic.h. * * @param err_code * the error code * * @return the string of the minor error */ public String getMinorError(int err_code) { if (err_code == HDF5Constants.H5E_NONE_MINOR) { return "special zero no error"; } else if (err_code == HDF5Constants.H5E_UNINITIALIZED) { return "information is unitialized"; } else if (err_code == HDF5Constants.H5E_UNSUPPORTED) { return "feature is unsupported"; } else if (err_code == HDF5Constants.H5E_BADTYPE) { return "incorrect type found"; } else if (err_code == HDF5Constants.H5E_BADRANGE) { return "argument out of range"; } else if (err_code == HDF5Constants.H5E_BADVALUE) { return "bad value for argument"; } else if (err_code == HDF5Constants.H5E_NOSPACE) { return "no space available for allocation"; } else if (err_code == HDF5Constants.H5E_CANTCOPY) { return "unable to copy object"; } else if (err_code == HDF5Constants.H5E_CANTFREE) { return "unable to free object"; } else if (err_code == HDF5Constants.H5E_ALREADYEXISTS) { return "Object already exists"; } else if (err_code == HDF5Constants.H5E_CANTLOCK) { return "Unable to lock object"; } else if (err_code == HDF5Constants.H5E_CANTUNLOCK) { return "Unable to unlock object"; } else if (err_code == HDF5Constants.H5E_FILEEXISTS) { return "file already exists"; } else if (err_code == HDF5Constants.H5E_FILEOPEN) { return "file already open"; } else if (err_code == HDF5Constants.H5E_CANTCREATE) { return "Can't create file"; } else if (err_code == HDF5Constants.H5E_CANTOPENFILE) { return "Can't open file"; } else if (err_code == HDF5Constants.H5E_CANTCLOSEFILE) { return "Can't close file"; } else if (err_code == HDF5Constants.H5E_NOTHDF5) { return "not an HDF5 format file"; } else if (err_code == HDF5Constants.H5E_BADFILE) { return "bad file ID accessed"; } else if (err_code == HDF5Constants.H5E_TRUNCATED) { return "file has been truncated"; } else if (err_code == HDF5Constants.H5E_MOUNT) { return "file mount error"; } else if (err_code == HDF5Constants.H5E_SEEKERROR) { return "seek failed"; } else if (err_code == HDF5Constants.H5E_READERROR) { return "read failed"; } else if (err_code == HDF5Constants.H5E_WRITEERROR) { return "write failed"; } else if (err_code == HDF5Constants.H5E_CLOSEERROR) { return "close failed"; } else if (err_code == HDF5Constants.H5E_OVERFLOW) { return "address overflowed"; } else if (err_code == HDF5Constants.H5E_FCNTL) { return "file fcntl failed"; } else if (err_code == HDF5Constants.H5E_CANTINIT) { return "Can't initialize object"; } else if (err_code == HDF5Constants.H5E_ALREADYINIT) { return "object already initialized"; } else if (err_code == HDF5Constants.H5E_CANTRELEASE) { return "Can't release object"; } else if (err_code == HDF5Constants.H5E_BADATOM) { return "Can't find atom information"; } else if (err_code == HDF5Constants.H5E_BADGROUP) { return "Can't find group information"; } else if (err_code == HDF5Constants.H5E_CANTREGISTER) { return "Can't register new atom"; } else if (err_code == HDF5Constants.H5E_CANTINC) { return "Can't increment reference count"; } else if (err_code == HDF5Constants.H5E_CANTDEC) { return "Can't decrement reference count"; } else if (err_code == HDF5Constants.H5E_NOIDS) { return "Out of IDs for group"; } else if (err_code == HDF5Constants.H5E_CANTFLUSH) { return "Can't flush object from cache"; } else if (err_code == HDF5Constants.H5E_CANTLOAD) { return "Can't load object into cache"; } else if (err_code == HDF5Constants.H5E_PROTECT) { return "protected object error"; } else if (err_code == HDF5Constants.H5E_NOTCACHED) { return "object not currently cached"; } else if (err_code == HDF5Constants.H5E_NOTFOUND) { return "object not found"; } else if (err_code == HDF5Constants.H5E_EXISTS) { return "object already exists"; } else if (err_code == HDF5Constants.H5E_CANTENCODE) { return "Can't encode value"; } else if (err_code == HDF5Constants.H5E_CANTDECODE) { return "Can't decode value"; } else if (err_code == HDF5Constants.H5E_CANTSPLIT) { return "Can't split node"; } else if (err_code == HDF5Constants.H5E_CANTINSERT) { return "Can't insert object"; } else if (err_code == HDF5Constants.H5E_CANTLIST) { return "Can't list node"; } else if (err_code == HDF5Constants.H5E_LINKCOUNT) { return "bad object header link count"; } else if (err_code == HDF5Constants.H5E_VERSION) { return "wrong version number"; } else if (err_code == HDF5Constants.H5E_ALIGNMENT) { return "alignment error"; } else if (err_code == HDF5Constants.H5E_BADMESG) { return "unrecognized message"; } else if (err_code == HDF5Constants.H5E_CANTDELETE) { return " Can't delete message"; } else if (err_code == HDF5Constants.H5E_CANTOPENOBJ) { return "Can't open object"; } else if (err_code == HDF5Constants.H5E_COMPLEN) { return "name component is too long"; } else if (err_code == HDF5Constants.H5E_LINK) { return "link count failure"; } else if (err_code == HDF5Constants.H5E_CANTCONVERT) { return "Can't convert datatypes"; } else if (err_code == HDF5Constants.H5E_BADSIZE) { return "Bad size for object"; } else if (err_code == HDF5Constants.H5E_CANTCLIP) { return "Can't clip hyperslab region"; } else if (err_code == HDF5Constants.H5E_CANTCOUNT) { return "Can't count elements"; } else if (err_code == HDF5Constants.H5E_CANTSELECT) { return "Can't select hyperslab"; } else if (err_code == HDF5Constants.H5E_CANTNEXT) { return "Can't move to next iterator location"; } else if (err_code == HDF5Constants.H5E_BADSELECT) { return "Invalid selection"; } else if (err_code == HDF5Constants.H5E_CANTGET) { return "Can't get value"; } else if (err_code == HDF5Constants.H5E_CANTSET) { return "Can't set value"; } else if (err_code == HDF5Constants.H5E_DUPCLASS) { return "Duplicate class name in parent class"; } else if (err_code == HDF5Constants.H5E_MPI) { return "some MPI function failed"; } else if (err_code == HDF5Constants.H5E_MPIERRSTR) { return "MPI Error String"; // } // else // if // (err_code // == // HDF5Constants.H5E_CANTRECV // ) // { // return // "can't receive messages from processes"; // } // else // if // (err_code // == // HDF5Constants.H5E_CANTALLOC // ) // { // return // "can't allocate from file"; } else if (err_code == HDF5Constants.H5E_NOFILTER) { return "requested filter is not available"; } else if (err_code == HDF5Constants.H5E_CALLBACK) { return "callback failed"; } else if (err_code == HDF5Constants.H5E_CANAPPLY) { return "error from filter \"can apply\" callback"; } else if (err_code == HDF5Constants.H5E_SETLOCAL) { return "error from filter \"set local\" callback"; } else { return "undefined error(" + err_code + ")"; } } /** * Prints this HDF5LibraryException, the HDF-5 Library error * stack, and and the Java stack trace to the standard error stream. */ @Override public void printStackTrace() { System.err.println(this); printStackTrace0(null); // the HDF-5 Library error stack super.printStackTrace(); // the Java stack trace } /** * Prints this HDF5LibraryException the HDF-5 Library error * stack, and and the Java stack trace to the specified print stream. * */ public void printStackTrace(java.io.File f) { if ((f == null) || !f.exists() || f.isDirectory() || !f.canWrite()) { printStackTrace(); } else { try { java.io.FileOutputStream o = new java.io.FileOutputStream(f); java.io.PrintWriter p = new java.io.PrintWriter(o); p.println(this); p.close(); } catch (Exception ex) { System.err.println(this); } ; // the HDF-5 Library error stack printStackTrace0(f.getPath()); super.printStackTrace(); // the Java stack trace } } /* * This private method calls the HDF-5 library to extract the error codes * and error stack. */ private native void printStackTrace0(String s); } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java0000644000175000017500000000274612050301064026703 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_DATASET */ public class HDF5DatasetInterfaceException extends HDF5LibraryException { /** * Constructs an HDF5DatasetInterfaceException with no * specified detail message. */ public HDF5DatasetInterfaceException() { super(); } /** * Constructs an HDF5DatasetInterfaceException with the * specified detail message. * * @param s * the detail message. */ public HDF5DatasetInterfaceException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java0000644000175000017500000000272612050301064026077 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_CACHE */ public class HDF5MetaDataCacheException extends HDF5LibraryException { /** * Constructs an HDF5MetaDataCacheException with no specified * detail message. */ public HDF5MetaDataCacheException() { super(); } /** * Constructs an HDF5MetaDataCacheException with the specified * detail message. * * @param s * the detail message. */ public HDF5MetaDataCacheException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5Exception.java0000755000175000017500000000412612050301064023551 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** *

    * The class HDF5Exception returns errors from the Java HDF5 Interface. *

    * Two sub-classes of HDF5Exception are defined: *

    *

      *
    1. * HDF5LibraryException -- errors raised the HDF5 library code *
    2. * HDF5JavaException -- errors raised the HDF5 Java wrapper code *
    *

    * These exceptions are sub-classed to represent specific error conditions, as * needed. In particular, HDF5LibraryException has a sub-class for each major * error code returned by the HDF5 library. * */ public class HDF5Exception extends Exception { protected String detailMessage; /** * Constructs an HDF5Exception with no specified detail * message. */ public HDF5Exception() { super(); } /** * Constructs an HDF5Exception with the specified detail * message. * * @param message * the detail message. */ public HDF5Exception(String message) { super(); detailMessage = message; } /** * Returns the detail message of this exception * * @return the detail message or null if this object does not * have a detail message. */ @Override public String getMessage() { return detailMessage; } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5BtreeException.java0000644000175000017500000000265512050301064024535 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_BTREE */ public class HDF5BtreeException extends HDF5LibraryException { /** * Constructs an HDF5BtreeException with no specified detail * message. */ public HDF5BtreeException() { super(); } /** * Constructs an HDF5BtreeException with the specified detail * message. * * @param s * the detail message. */ public HDF5BtreeException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java0000644000175000017500000000272512050301064026172 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_FILE */ public class HDF5FileInterfaceException extends HDF5LibraryException { /** * Constructs an HDF5FileInterfaceException with no specified * detail message. */ public HDF5FileInterfaceException() { super(); } /** * Constructs an HDF5FileInterfaceException with the specified * detail message. * * @param s * the detail message. */ public HDF5FileInterfaceException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java0000644000175000017500000000275112050301064027132 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_FUNC */ public class HDF5FunctionEntryExitException extends HDF5LibraryException { /** * Constructs an HDF5FunctionEntryExitException with no * specified detail message. */ public HDF5FunctionEntryExitException() { super(); } /** * Constructs an HDF5FunctionEntryExitException with the * specified detail message. * * @param s * the detail message. */ public HDF5FunctionEntryExitException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java0000644000175000017500000000272012050301064026004 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_OHDR */ public class HDF5ObjectHeaderException extends HDF5LibraryException { /** * Constructs an HDF5ObjectHeaderException with no specified * detail message. */ public HDF5ObjectHeaderException() { super(); } /** * Constructs an HDF5ObjectHeaderException with the specified * detail message. * * @param s * the detail message. */ public HDF5ObjectHeaderException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5DataStorageException.java0000644000175000017500000000271712050301064025671 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_STORAGE */ public class HDF5DataStorageException extends HDF5LibraryException { /** * Constructs an HDF5DataStorageExceptionn with no specified * detail message. */ public HDF5DataStorageException() { super(); } /** * Constructs an HDF5DataStorageException with the specified * detail message. * * @param s * the detail message. */ public HDF5DataStorageException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5HeapException.java0000644000175000017500000000265012050301064024344 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_HEAP */ public class HDF5HeapException extends HDF5LibraryException { /** * Constructs an HDF5HeapException with no specified detail * message. */ public HDF5HeapException() { super(); } /** * Constructs an HDF5HeapException with the specified detail * message. * * @param s * the detail message. */ public HDF5HeapException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java0000644000175000017500000000277612050301064030001 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF5 * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdf5lib.exceptions; /** * The class HDF5LibraryException returns errors raised by the HDF5 library. *

    * This sub-class represents HDF-5 major error code H5E_PLIST */ public class HDF5PropertyListInterfaceException extends HDF5LibraryException { /** * Constructs an HDF5PropertyListInterfaceException with no * specified detail message. */ public HDF5PropertyListInterfaceException() { super(); } /** * Constructs an HDF5PropertyListInterfaceException with the * specified detail message. * * @param s * the detail message. */ public HDF5PropertyListInterfaceException(String s) { super(s); } } jhdf-2.9/ncsa/hdf/hdf5lib/CMakeLists.txt0000644000175000017500000000563612050301064020724 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_NCSA_HDF_HDF5 Java) SET(CMAKE_VERBOSE_MAKEFILE 1) INCLUDE_DIRECTORIES( ${HDFJAVA_NCSA_HDF_HDF5_SOURCE_DIR} ${HDFJAVA_NCSA_HDF_HDF5_BINARY_DIR} ) SET (HDFJAVA_NCSA_HDF_HDF5_CALLBACKS_SRCS callbacks/H5D_iterate_cb.java callbacks/H5D_iterate_t.java callbacks/H5L_iterate_cb.java callbacks/H5L_iterate_t.java callbacks/H5O_iterate_cb.java callbacks/H5O_iterate_t.java callbacks/Callbacks.java ) SET (HDFJAVA_NCSA_HDF_HDF5_EXCEPTIONS_SRCS exceptions/HDF5Exception.java exceptions/HDF5AtomException.java exceptions/HDF5AttributeException.java exceptions/HDF5BtreeException.java exceptions/HDF5DataFiltersException.java exceptions/HDF5DatasetInterfaceException.java exceptions/HDF5DataspaceInterfaceException.java exceptions/HDF5DataStorageException.java exceptions/HDF5DatatypeInterfaceException.java exceptions/HDF5ExternalFileListException.java exceptions/HDF5FileInterfaceException.java exceptions/HDF5FunctionArgumentException.java exceptions/HDF5FunctionEntryExitException.java exceptions/HDF5HeapException.java exceptions/HDF5InternalErrorException.java exceptions/HDF5JavaException.java exceptions/HDF5LibraryException.java exceptions/HDF5LowLevelIOException.java exceptions/HDF5MetaDataCacheException.java exceptions/HDF5ObjectHeaderException.java exceptions/HDF5PropertyListInterfaceException.java exceptions/HDF5ReferenceException.java exceptions/HDF5ResourceUnavailableException.java exceptions/HDF5SymbolTableException.java ) SET (HDFJAVA_NCSA_HDF_HDF5_STRUCTS_SRCS structs/H5_ih_info_t.java structs/H5A_info_t.java structs/H5AC_cache_config_t.java structs/H5G_info_t.java structs/H5L_info_t.java structs/H5O_hdr_info_t.java structs/H5O_info_t.java ) SET (HDFJAVA_NCSA_HDF_HDF5_SRCS HDFArray.java HDF5Constants.java HDF5GroupInfo.java HDFNativeData.java H5.java ) SET (CMAKE_JNI_TARGET TRUE) SET (CMAKE_JAVA_TARGET_VERSION ${HDFJAVA_PACKAGE_VERSION}) FILE (WRITE ${PROJECT_BINARY_DIR}/Manifest.txt " " ) ADD_JAR (${HDFJAVA_NCSA_HDF5_LIB_TARGET} ${PROJECT_BINARY_DIR}/Manifest.txt ${HDFJAVA_NCSA_HDF_HDF5_CALLBACKS_SRCS} ${HDFJAVA_NCSA_HDF_HDF5_EXCEPTIONS_SRCS} ${HDFJAVA_NCSA_HDF_HDF5_STRUCTS_SRCS} ${HDFJAVA_NCSA_HDF_HDF5_SRCS}) INSTALL_JAR (${HDFJAVA_NCSA_HDF5_LIB_TARGET} ${HJAVA_INSTALL_LIB_DIR} libraries) IF (NOT WIN32) INSTALL_JNI_SYMLINK (${HDFJAVA_NCSA_HDF5_LIB_TARGET} ${HJAVA_INSTALL_LIB_DIR} libraries) ENDIF (NOT WIN32) GET_TARGET_PROPERTY(${HDFJAVA_NCSA_HDF5_LIB_TARGET}_JAR_FILE ${HDFJAVA_NCSA_HDF5_LIB_TARGET} JAR_FILE) SET_GLOBAL_VARIABLE (HDFJAVA_JARS_TO_EXPORT "${HDFJAVA_JARS_TO_EXPORT};${${HDFJAVA_NCSA_HDF5_LIB_TARGET}_JAR_FILE}") SET_GLOBAL_VARIABLE (HDFJAVA_HDF5_JARS ${${HDFJAVA_NCSA_HDF5_LIB_TARGET}_JAR_FILE}) ADD_DEPENDENCIES (${HDFJAVA_NCSA_HDF5_LIB_TARGET} ${HDFJAVA_JNI_HDF5_LIB_TARGET}) jhdf-2.9/ncsa/hdf/hdf5lib/HDF5Constants.java0000755000175000017500000021704512050301064021414 0ustar sylvestresylvestre/**************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.hdf5lib; /** * /** This class contains C constants and enumerated types of HDF5 library. The * values of these constants are obtained from the library by calling J2C(int * jconstant), where jconstant is any of the private constants which start their * name with "JH5" need to be converted. *

    * Do not edit this file! * * See also: ncsa.hdf.hdf5lib.HDF5Library */ public class HDF5Constants { static { H5.loadH5Lib(); } // ///////////////////////////////////////////////////////////////////////// // Get the HDF5 constants from the library // // ///////////////////////////////////////////////////////////////////////// public static final long H5_QUARTER_HADDR_MAX = H5_QUARTER_HADDR_MAX(); public static final int H5_SZIP_MAX_PIXELS_PER_BLOCK = H5_SZIP_MAX_PIXELS_PER_BLOCK(); public static final int H5_SZIP_NN_OPTION_MASK = H5_SZIP_NN_OPTION_MASK(); public static final int H5_SZIP_EC_OPTION_MASK = H5_SZIP_EC_OPTION_MASK(); public static final int H5_SZIP_ALLOW_K13_OPTION_MASK = H5_SZIP_ALLOW_K13_OPTION_MASK(); public static final int H5_SZIP_CHIP_OPTION_MASK = H5_SZIP_CHIP_OPTION_MASK(); public static final int H5_INDEX_UNKNOWN = H5_INDEX_UNKNOWN(); public static final int H5_INDEX_NAME = H5_INDEX_NAME(); public static final int H5_INDEX_CRT_ORDER = H5_INDEX_CRT_ORDER(); public static final int H5_INDEX_N = H5_INDEX_N(); public static final int H5_ITER_UNKNOWN = H5_ITER_UNKNOWN(); public static final int H5_ITER_INC = H5_ITER_INC(); public static final int H5_ITER_DEC = H5_ITER_DEC(); public static final int H5_ITER_NATIVE = H5_ITER_NATIVE(); public static final int H5_ITER_N = H5_ITER_N(); public static final int H5AC_CURR_CACHE_CONFIG_VERSION = H5AC_CURR_CACHE_CONFIG_VERSION(); public static final int H5AC_MAX_TRACE_FILE_NAME_LEN = H5AC_MAX_TRACE_FILE_NAME_LEN(); public static final int H5AC_METADATA_WRITE_STRATEGY_PROCESS_ZERO_ONLY = H5AC_METADATA_WRITE_STRATEGY_PROCESS_ZERO_ONLY(); public static final int H5AC_METADATA_WRITE_STRATEGY_DISTRIBUTED = H5AC_METADATA_WRITE_STRATEGY_DISTRIBUTED(); public static final int H5C_incr_off = H5C_incr_off(); public static final int H5C_incr_threshold = H5C_incr_threshold(); public static final int H5C_flash_incr_off = H5C_flash_incr_off(); public static final int H5C_flash_incr_add_space = H5C_flash_incr_add_space(); public static final int H5C_decr_off = H5C_decr_off(); public static final int H5C_decr_threshold = H5C_decr_threshold(); public static final int H5C_decr_age_out = H5C_decr_age_out(); public static final int H5C_decr_age_out_with_threshold = H5C_decr_age_out_with_threshold(); public static final int H5D_CHUNK_BTREE = H5D_CHUNK_BTREE(); public static final int H5D_ALLOC_TIME_DEFAULT = H5D_ALLOC_TIME_DEFAULT(); public static final int H5D_ALLOC_TIME_EARLY = H5D_ALLOC_TIME_EARLY(); public static final int H5D_ALLOC_TIME_ERROR = H5D_ALLOC_TIME_ERROR(); public static final int H5D_ALLOC_TIME_INCR = H5D_ALLOC_TIME_INCR(); public static final int H5D_ALLOC_TIME_LATE = H5D_ALLOC_TIME_LATE(); public static final int H5D_FILL_TIME_ERROR = H5D_FILL_TIME_ERROR(); public static final int H5D_FILL_TIME_ALLOC = H5D_FILL_TIME_ALLOC(); public static final int H5D_FILL_TIME_NEVER = H5D_FILL_TIME_NEVER(); public static final int H5D_FILL_TIME_IFSET = H5D_FILL_TIME_IFSET(); public static final int H5D_FILL_VALUE_DEFAULT = H5D_FILL_VALUE_DEFAULT(); public static final int H5D_FILL_VALUE_ERROR = H5D_FILL_VALUE_ERROR(); public static final int H5D_FILL_VALUE_UNDEFINED = H5D_FILL_VALUE_UNDEFINED(); public static final int H5D_FILL_VALUE_USER_DEFINED = H5D_FILL_VALUE_USER_DEFINED(); public static final int H5D_LAYOUT_ERROR = H5D_LAYOUT_ERROR(); public static final int H5D_CHUNKED = H5D_CHUNKED(); public static final int H5D_COMPACT = H5D_COMPACT(); public static final int H5D_CONTIGUOUS = H5D_CONTIGUOUS(); public static final int H5D_NLAYOUTS = H5D_NLAYOUTS(); public static final int H5D_SPACE_STATUS_ALLOCATED = H5D_SPACE_STATUS_ALLOCATED(); public static final int H5D_SPACE_STATUS_ERROR = H5D_SPACE_STATUS_ERROR(); public static final int H5D_SPACE_STATUS_NOT_ALLOCATED = H5D_SPACE_STATUS_NOT_ALLOCATED(); public static final int H5D_SPACE_STATUS_PART_ALLOCATED = H5D_SPACE_STATUS_PART_ALLOCATED(); public static final int H5E_ALIGNMENT = H5E_ALIGNMENT(); public static final int H5E_ALREADYEXISTS = H5E_ALREADYEXISTS(); public static final int H5E_ALREADYINIT = H5E_ALREADYINIT(); public static final int H5E_ARGS = H5E_ARGS(); public static final int H5E_ATOM = H5E_ATOM(); public static final int H5E_ATTR = H5E_ATTR(); public static final int H5E_BADATOM = H5E_BADATOM(); public static final int H5E_BADFILE = H5E_BADFILE(); public static final int H5E_BADGROUP = H5E_BADGROUP(); public static final int H5E_BADMESG = H5E_BADMESG(); public static final int H5E_BADRANGE = H5E_BADRANGE(); public static final int H5E_BADSELECT = H5E_BADSELECT(); public static final int H5E_BADSIZE = H5E_BADSIZE(); public static final int H5E_BADTYPE = H5E_BADTYPE(); public static final int H5E_BADVALUE = H5E_BADVALUE(); public static final int H5E_BTREE = H5E_BTREE(); public static final int H5E_CACHE = H5E_CACHE(); public static final int H5E_CALLBACK = H5E_CALLBACK(); public static final int H5E_CANAPPLY = H5E_CANAPPLY(); // public static final int H5E_CANTALLOC = H5E_CANTALLOC(); public static final int H5E_CANTCLIP = H5E_CANTCLIP(); public static final int H5E_CANTCLOSEFILE = H5E_CANTCLOSEFILE(); public static final int H5E_CANTCONVERT = H5E_CANTCONVERT(); public static final int H5E_CANTCOPY = H5E_CANTCOPY(); public static final int H5E_CANTCOUNT = H5E_CANTCOUNT(); public static final int H5E_CANTCREATE = H5E_CANTCREATE(); public static final int H5E_CANTDEC = H5E_CANTDEC(); public static final int H5E_CANTDECODE = H5E_CANTDECODE(); public static final int H5E_CANTDELETE = H5E_CANTDELETE(); public static final int H5E_CANTENCODE = H5E_CANTENCODE(); public static final int H5E_CANTFLUSH = H5E_CANTFLUSH(); public static final int H5E_CANTFREE = H5E_CANTFREE(); public static final int H5E_CANTGET = H5E_CANTGET(); public static final int H5E_CANTINC = H5E_CANTINC(); public static final int H5E_CANTINIT = H5E_CANTINIT(); public static final int H5E_CANTINSERT = H5E_CANTINSERT(); public static final int H5E_CANTLIST = H5E_CANTLIST(); public static final int H5E_CANTLOAD = H5E_CANTLOAD(); public static final int H5E_CANTLOCK = H5E_CANTLOCK(); public static final int H5E_CANTNEXT = H5E_CANTNEXT(); public static final int H5E_CANTOPENFILE = H5E_CANTOPENFILE(); public static final int H5E_CANTOPENOBJ = H5E_CANTOPENOBJ(); // public static final int H5E_CANTRECV = H5E_CANTRECV(); public static final int H5E_CANTREGISTER = H5E_CANTREGISTER(); public static final int H5E_CANTRELEASE = H5E_CANTRELEASE(); public static final int H5E_CANTSELECT = H5E_CANTSELECT(); public static final int H5E_CANTSET = H5E_CANTSET(); public static final int H5E_CANTSPLIT = H5E_CANTSPLIT(); public static final int H5E_CANTUNLOCK = H5E_CANTUNLOCK(); public static final int H5E_CLOSEERROR = H5E_CLOSEERROR(); public static final int H5E_COMPLEN = H5E_COMPLEN(); public static final int H5E_DATASET = H5E_DATASET(); public static final int H5E_DATASPACE = H5E_DATASPACE(); public static final int H5E_DATATYPE = H5E_DATATYPE(); public static final int H5E_DEFAULT = H5E_DEFAULT(); public static final int H5E_DUPCLASS = H5E_DUPCLASS(); public static final int H5E_EFL = H5E_EFL(); public static final int H5E_EXISTS = H5E_EXISTS(); public static final int H5E_FCNTL = H5E_FCNTL(); public static final int H5E_FILE = H5E_FILE(); public static final int H5E_FILEEXISTS = H5E_FILEEXISTS(); public static final int H5E_FILEOPEN = H5E_FILEOPEN(); public static final int H5E_FUNC = H5E_FUNC(); public static final int H5E_HEAP = H5E_HEAP(); public static final int H5E_INTERNAL = H5E_INTERNAL(); public static final int H5E_IO = H5E_IO(); public static final int H5E_LINK = H5E_LINK(); public static final int H5E_LINKCOUNT = H5E_LINKCOUNT(); public static final int H5E_MAJOR = H5E_MAJOR(); public static final int H5E_MINOR = H5E_MINOR(); public static final int H5E_MOUNT = H5E_MOUNT(); public static final int H5E_MPI = H5E_MPI(); public static final int H5E_MPIERRSTR = H5E_MPIERRSTR(); public static final int H5E_NOFILTER = H5E_NOFILTER(); public static final int H5E_NOIDS = H5E_NOIDS(); public static final int H5E_NONE_MAJOR = H5E_NONE_MAJOR(); public static final int H5E_NONE_MINOR = H5E_NONE_MINOR(); public static final int H5E_NOSPACE = H5E_NOSPACE(); public static final int H5E_NOTCACHED = H5E_NOTCACHED(); public static final int H5E_NOTFOUND = H5E_NOTFOUND(); public static final int H5E_NOTHDF5 = H5E_NOTHDF5(); public static final int H5E_OHDR = H5E_OHDR(); public static final int H5E_OVERFLOW = H5E_OVERFLOW(); public static final int H5E_PLINE = H5E_PLINE(); public static final int H5E_PLIST = H5E_PLIST(); public static final int H5E_PROTECT = H5E_PROTECT(); public static final int H5E_READERROR = H5E_READERROR(); public static final int H5E_REFERENCE = H5E_REFERENCE(); public static final int H5E_RESOURCE = H5E_RESOURCE(); public static final int H5E_RS = H5E_RS(); public static final int H5E_SEEKERROR = H5E_SEEKERROR(); public static final int H5E_SETLOCAL = H5E_SETLOCAL(); public static final int H5E_STORAGE = H5E_STORAGE(); public static final int H5E_SYM = H5E_SYM(); public static final int H5E_TRUNCATED = H5E_TRUNCATED(); public static final int H5E_TST = H5E_TST(); public static final int H5E_UNINITIALIZED = H5E_UNINITIALIZED(); public static final int H5E_UNSUPPORTED = H5E_UNSUPPORTED(); public static final int H5E_VERSION = H5E_VERSION(); public static final int H5E_VFL = H5E_VFL(); public static final int H5E_WALK_DOWNWARD = H5E_WALK_DOWNWARD(); public static final int H5E_WALK_UPWARD = H5E_WALK_UPWARD(); public static final int H5E_WRITEERROR = H5E_WRITEERROR(); public static final int H5F_ACC_CREAT = H5F_ACC_CREAT(); public static final int H5F_ACC_DEBUG = H5F_ACC_DEBUG(); public static final int H5F_ACC_EXCL = H5F_ACC_EXCL(); public static final int H5F_ACC_RDONLY = H5F_ACC_RDONLY(); public static final int H5F_ACC_RDWR = H5F_ACC_RDWR(); public static final int H5F_ACC_TRUNC = H5F_ACC_TRUNC(); public static final int H5F_ACC_DEFAULT = H5F_ACC_DEFAULT(); public static final int H5F_CLOSE_DEFAULT = H5F_CLOSE_DEFAULT(); public static final int H5F_CLOSE_SEMI = H5F_CLOSE_SEMI(); public static final int H5F_CLOSE_STRONG = H5F_CLOSE_STRONG(); public static final int H5F_CLOSE_WEAK = H5F_CLOSE_WEAK(); public static final int H5F_LIBVER_EARLIEST = H5F_LIBVER_EARLIEST(); public static final int H5F_LIBVER_LATEST = H5F_LIBVER_LATEST(); public static final int H5F_OBJ_ALL = H5F_OBJ_ALL(); public static final int H5F_OBJ_ATTR = H5F_OBJ_ATTR(); public static final int H5F_OBJ_DATASET = H5F_OBJ_DATASET(); public static final int H5F_OBJ_DATATYPE = H5F_OBJ_DATATYPE(); public static final int H5F_OBJ_FILE = H5F_OBJ_FILE(); public static final int H5F_OBJ_GROUP = H5F_OBJ_GROUP(); public static final int H5F_OBJ_LOCAL = H5F_OBJ_LOCAL(); public static final int H5F_SCOPE_GLOBAL = H5F_SCOPE_GLOBAL(); public static final int H5F_SCOPE_LOCAL = H5F_SCOPE_LOCAL(); public static final int H5F_UNLIMITED = H5F_UNLIMITED(); public static final int H5FD_CORE = H5FD_CORE(); public static final int H5FD_DIRECT = H5FD_DIRECT(); public static final int H5FD_FAMILY = H5FD_FAMILY(); public static final int H5FD_LOG = H5FD_LOG(); public static final int H5FD_MPIO = H5FD_MPIO(); public static final int H5FD_MULTI = H5FD_MULTI(); public static final int H5FD_SEC2 = H5FD_SEC2(); public static final int H5FD_STDIO = H5FD_STDIO(); public static final int H5FD_WINDOWS = H5FD_WINDOWS(); public static final int H5FD_LOG_LOC_READ = H5FD_LOG_LOC_READ(); public static final int H5FD_LOG_LOC_WRITE = H5FD_LOG_LOC_WRITE(); public static final int H5FD_LOG_LOC_SEEK = H5FD_LOG_LOC_SEEK(); public static final int H5FD_LOG_LOC_IO = H5FD_LOG_LOC_IO(); public static final int H5FD_LOG_FILE_READ = H5FD_LOG_FILE_READ(); public static final int H5FD_LOG_FILE_WRITE = H5FD_LOG_FILE_WRITE(); public static final int H5FD_LOG_FILE_IO = H5FD_LOG_FILE_IO(); public static final int H5FD_LOG_FLAVOR = H5FD_LOG_FLAVOR(); public static final int H5FD_LOG_NUM_READ = H5FD_LOG_NUM_READ(); public static final int H5FD_LOG_NUM_WRITE = H5FD_LOG_NUM_WRITE(); public static final int H5FD_LOG_NUM_SEEK = H5FD_LOG_NUM_SEEK(); public static final int H5FD_LOG_NUM_TRUNCATE = H5FD_LOG_NUM_TRUNCATE(); public static final int H5FD_LOG_NUM_IO = H5FD_LOG_NUM_IO(); public static final int H5FD_LOG_TIME_OPEN = H5FD_LOG_TIME_OPEN(); public static final int H5FD_LOG_TIME_STAT = H5FD_LOG_TIME_STAT(); public static final int H5FD_LOG_TIME_READ = H5FD_LOG_TIME_READ(); public static final int H5FD_LOG_TIME_WRITE = H5FD_LOG_TIME_WRITE(); public static final int H5FD_LOG_TIME_SEEK = H5FD_LOG_TIME_SEEK(); public static final int H5FD_LOG_TIME_CLOSE = H5FD_LOG_TIME_CLOSE(); public static final int H5FD_LOG_TIME_IO = H5FD_LOG_TIME_IO(); public static final int H5FD_LOG_ALLOC = H5FD_LOG_ALLOC(); public static final int H5FD_LOG_ALL = H5FD_LOG_ALL(); public static final int H5FD_MEM_NOLIST = H5FD_MEM_NOLIST(); public static final int H5FD_MEM_DEFAULT = H5FD_MEM_DEFAULT(); public static final int H5FD_MEM_SUPER = H5FD_MEM_SUPER(); public static final int H5FD_MEM_BTREE = H5FD_MEM_BTREE(); public static final int H5FD_MEM_DRAW = H5FD_MEM_DRAW(); public static final int H5FD_MEM_GHEAP = H5FD_MEM_GHEAP(); public static final int H5FD_MEM_LHEAP = H5FD_MEM_LHEAP(); public static final int H5FD_MEM_OHDR = H5FD_MEM_OHDR(); public static final int H5FD_MEM_NTYPES = H5FD_MEM_NTYPES(); public static final long H5FD_DEFAULT_HADDR_SIZE = H5FD_DEFAULT_HADDR_SIZE(); public static final int H5G_DATASET = H5G_DATASET(); public static final int H5G_GROUP = H5G_GROUP(); public static final int H5G_LINK = H5G_LINK(); public static final int H5G_UDLINK = H5G_UDLINK(); public static final int H5G_LINK_ERROR = H5G_LINK_ERROR(); public static final int H5G_LINK_HARD = H5G_LINK_HARD(); public static final int H5G_LINK_SOFT = H5G_LINK_SOFT(); public static final int H5G_NLIBTYPES = H5G_NLIBTYPES(); public static final int H5G_NTYPES = H5G_NTYPES(); public static final int H5G_NUSERTYPES = H5G_NUSERTYPES(); public static final int H5G_RESERVED_5 = H5G_RESERVED_5(); public static final int H5G_RESERVED_6 = H5G_RESERVED_6(); public static final int H5G_RESERVED_7 = H5G_RESERVED_7(); public static final int H5G_SAME_LOC = H5G_SAME_LOC(); public static final int H5G_STORAGE_TYPE_UNKNOWN = H5G_STORAGE_TYPE_UNKNOWN(); public static final int H5G_STORAGE_TYPE_SYMBOL_TABLE = H5G_STORAGE_TYPE_SYMBOL_TABLE(); public static final int H5G_STORAGE_TYPE_COMPACT = H5G_STORAGE_TYPE_COMPACT(); public static final int H5G_STORAGE_TYPE_DENSE = H5G_STORAGE_TYPE_DENSE(); public static final int H5G_TYPE = H5G_TYPE(); public static final int H5G_UNKNOWN = H5G_UNKNOWN(); public static final int H5I_ATTR = H5I_ATTR(); public static final int H5I_BADID = H5I_BADID(); public static final int H5I_DATASET = H5I_DATASET(); public static final int H5I_DATASPACE = H5I_DATASPACE(); public static final int H5I_DATATYPE = H5I_DATATYPE(); public static final int H5I_FILE = H5I_FILE(); public static final int H5I_GENPROP_CLS = H5I_GENPROP_CLS(); public static final int H5I_GENPROP_LST = H5I_GENPROP_LST(); public static final int H5I_GROUP = H5I_GROUP(); public static final int H5I_INVALID_HID = H5I_INVALID_HID(); public static final int H5I_REFERENCE = H5I_REFERENCE(); public static final int H5I_VFL = H5I_VFL(); public static final int H5L_TYPE_ERROR = H5L_TYPE_ERROR(); public static final int H5L_TYPE_HARD = H5L_TYPE_HARD(); public static final int H5L_TYPE_SOFT = H5L_TYPE_SOFT(); public static final int H5L_TYPE_EXTERNAL = H5L_TYPE_EXTERNAL(); public static final int H5L_TYPE_MAX = H5L_TYPE_MAX(); public static final int H5O_COPY_SHALLOW_HIERARCHY_FLAG = H5O_COPY_SHALLOW_HIERARCHY_FLAG(); public static final int H5O_COPY_EXPAND_SOFT_LINK_FLAG = H5O_COPY_EXPAND_SOFT_LINK_FLAG(); public static final int H5O_COPY_EXPAND_EXT_LINK_FLAG = H5O_COPY_EXPAND_EXT_LINK_FLAG(); public static final int H5O_COPY_EXPAND_REFERENCE_FLAG = H5O_COPY_EXPAND_REFERENCE_FLAG(); public static final int H5O_COPY_WITHOUT_ATTR_FLAG = H5O_COPY_WITHOUT_ATTR_FLAG(); public static final int H5O_COPY_PRESERVE_NULL_FLAG = H5O_COPY_PRESERVE_NULL_FLAG(); public static final int H5O_SHMESG_NONE_FLAG = H5O_SHMESG_NONE_FLAG(); public static final int H5O_SHMESG_SDSPACE_FLAG = H5O_SHMESG_SDSPACE_FLAG(); public static final int H5O_SHMESG_DTYPE_FLAG = H5O_SHMESG_DTYPE_FLAG(); public static final int H5O_SHMESG_FILL_FLAG = H5O_SHMESG_FILL_FLAG(); public static final int H5O_SHMESG_PLINE_FLAG = H5O_SHMESG_PLINE_FLAG(); public static final int H5O_SHMESG_ATTR_FLAG = H5O_SHMESG_ATTR_FLAG(); public static final int H5O_SHMESG_ALL_FLAG = H5O_SHMESG_ALL_FLAG(); public static final int H5O_TYPE_UNKNOWN = H5O_TYPE_UNKNOWN(); public static final int H5O_TYPE_GROUP = H5O_TYPE_GROUP(); public static final int H5O_TYPE_DATASET = H5O_TYPE_DATASET(); public static final int H5O_TYPE_NAMED_DATATYPE = H5O_TYPE_NAMED_DATATYPE(); public static final int H5O_TYPE_NTYPES = H5O_TYPE_NTYPES(); public static final int H5P_ROOT = H5P_ROOT(); public static final int H5P_OBJECT_CREATE = H5P_OBJECT_CREATE(); public static final int H5P_FILE_CREATE = H5P_FILE_CREATE(); public static final int H5P_FILE_ACCESS = H5P_FILE_ACCESS(); public static final int H5P_DATASET_CREATE = H5P_DATASET_CREATE(); public static final int H5P_DATASET_ACCESS = H5P_DATASET_ACCESS(); public static final int H5P_DATASET_XFER = H5P_DATASET_XFER(); public static final int H5P_FILE_MOUNT = H5P_FILE_MOUNT(); public static final int H5P_GROUP_CREATE = H5P_GROUP_CREATE(); public static final int H5P_GROUP_ACCESS = H5P_GROUP_ACCESS(); public static final int H5P_DATATYPE_CREATE = H5P_DATATYPE_CREATE(); public static final int H5P_DATATYPE_ACCESS = H5P_DATATYPE_ACCESS(); public static final int H5P_STRING_CREATE = H5P_STRING_CREATE(); public static final int H5P_ATTRIBUTE_CREATE = H5P_ATTRIBUTE_CREATE(); public static final int H5P_OBJECT_COPY = H5P_OBJECT_COPY(); public static final int H5P_LINK_CREATE = H5P_LINK_CREATE(); public static final int H5P_LINK_ACCESS = H5P_LINK_ACCESS(); public static final int H5P_FILE_CREATE_DEFAULT = H5P_FILE_CREATE_DEFAULT(); public static final int H5P_FILE_ACCESS_DEFAULT = H5P_FILE_ACCESS_DEFAULT(); public static final int H5P_DATASET_CREATE_DEFAULT = H5P_DATASET_CREATE_DEFAULT(); public static final int H5P_DATASET_ACCESS_DEFAULT = H5P_DATASET_ACCESS_DEFAULT(); public static final int H5P_DATASET_XFER_DEFAULT = H5P_DATASET_XFER_DEFAULT(); public static final int H5P_FILE_MOUNT_DEFAULT = H5P_FILE_MOUNT_DEFAULT(); public static final int H5P_GROUP_CREATE_DEFAULT = H5P_GROUP_CREATE_DEFAULT(); public static final int H5P_GROUP_ACCESS_DEFAULT = H5P_GROUP_ACCESS_DEFAULT(); public static final int H5P_DATATYPE_CREATE_DEFAULT = H5P_DATATYPE_CREATE_DEFAULT(); public static final int H5P_DATATYPE_ACCESS_DEFAULT = H5P_DATATYPE_ACCESS_DEFAULT(); public static final int H5P_ATTRIBUTE_CREATE_DEFAULT = H5P_ATTRIBUTE_CREATE_DEFAULT(); public static final int H5P_OBJECT_COPY_DEFAULT = H5P_OBJECT_COPY_DEFAULT(); public static final int H5P_LINK_CREATE_DEFAULT = H5P_LINK_CREATE_DEFAULT(); public static final int H5P_LINK_ACCESS_DEFAULT = H5P_LINK_ACCESS_DEFAULT(); public static final int H5P_CRT_ORDER_TRACKED = H5P_CRT_ORDER_TRACKED(); public static final int H5P_CRT_ORDER_INDEXED = H5P_CRT_ORDER_INDEXED(); public static final int H5P_DEFAULT = H5P_DEFAULT(); public static final int H5P_NO_CLASS = H5P_NO_CLASS(); public static final int H5R_BADTYPE = H5R_BADTYPE(); public static final int H5R_DATASET_REGION = H5R_DATASET_REGION(); public static final int H5R_MAXTYPE = H5R_MAXTYPE(); public static final int H5R_OBJ_REF_BUF_SIZE = H5R_OBJ_REF_BUF_SIZE(); public static final int H5R_OBJECT = H5R_OBJECT(); public static final int H5S_ALL = H5S_ALL(); public static final int H5S_MAX_RANK = H5S_MAX_RANK(); public static final int H5S_NO_CLASS = H5S_NO_CLASS(); public static final int H5S_NULL = H5S_NULL(); public static final int H5S_SCALAR = H5S_SCALAR(); public static final int H5S_SEL_ALL = H5S_SEL_ALL(); public static final int H5S_SEL_ERROR = H5S_SEL_ERROR(); public static final int H5S_SEL_HYPERSLABS = H5S_SEL_HYPERSLABS(); public static final int H5S_SEL_N = H5S_SEL_N(); public static final int H5S_SEL_NONE = H5S_SEL_NONE(); public static final int H5S_SEL_POINTS = H5S_SEL_POINTS(); public static final int H5S_SELECT_AND = H5S_SELECT_AND(); public static final int H5S_SELECT_APPEND = H5S_SELECT_APPEND(); public static final int H5S_SELECT_INVALID = H5S_SELECT_INVALID(); public static final int H5S_SELECT_NOOP = H5S_SELECT_NOOP(); public static final int H5S_SELECT_NOTA = H5S_SELECT_NOTA(); public static final int H5S_SELECT_NOTB = H5S_SELECT_NOTB(); public static final int H5S_SELECT_OR = H5S_SELECT_OR(); public static final int H5S_SELECT_PREPEND = H5S_SELECT_PREPEND(); public static final int H5S_SELECT_SET = H5S_SELECT_SET(); public static final int H5S_SELECT_XOR = H5S_SELECT_XOR(); public static final int H5S_SIMPLE = H5S_SIMPLE(); public static final int H5S_UNLIMITED = H5S_UNLIMITED(); public static final int H5T_ALPHA_B16 = H5T_ALPHA_B16(); public static final int H5T_ALPHA_B32 = H5T_ALPHA_B32(); public static final int H5T_ALPHA_B64 = H5T_ALPHA_B64(); public static final int H5T_ALPHA_B8 = H5T_ALPHA_B8(); public static final int H5T_ALPHA_F32 = H5T_ALPHA_F32(); public static final int H5T_ALPHA_F64 = H5T_ALPHA_F64(); public static final int H5T_ALPHA_I16 = H5T_ALPHA_I16(); public static final int H5T_ALPHA_I32 = H5T_ALPHA_I32(); public static final int H5T_ALPHA_I64 = H5T_ALPHA_I64(); public static final int H5T_ALPHA_I8 = H5T_ALPHA_I8(); public static final int H5T_ALPHA_U16 = H5T_ALPHA_U16(); public static final int H5T_ALPHA_U32 = H5T_ALPHA_U32(); public static final int H5T_ALPHA_U64 = H5T_ALPHA_U64(); public static final int H5T_ALPHA_U8 = H5T_ALPHA_U8(); public static final int H5T_ARRAY = H5T_ARRAY(); public static final int H5T_BITFIELD = H5T_BITFIELD(); public static final int H5T_BKG_NO = H5T_BKG_NO(); public static final int H5T_BKG_YES = H5T_BKG_YES(); public static final int H5T_C_S1 = H5T_C_S1(); public static final int H5T_COMPOUND = H5T_COMPOUND(); public static final int H5T_CONV_CONV = H5T_CONV_CONV(); public static final int H5T_CONV_FREE = H5T_CONV_FREE(); public static final int H5T_CONV_INIT = H5T_CONV_INIT(); public static final int H5T_CSET_ERROR = H5T_CSET_ERROR(); public static final int H5T_CSET_ASCII = H5T_CSET_ASCII(); public static final int H5T_CSET_UTF8 = H5T_CSET_UTF8(); public static final int H5T_CSET_RESERVED_10 = H5T_CSET_RESERVED_10(); public static final int H5T_CSET_RESERVED_11 = H5T_CSET_RESERVED_11(); public static final int H5T_CSET_RESERVED_12 = H5T_CSET_RESERVED_12(); public static final int H5T_CSET_RESERVED_13 = H5T_CSET_RESERVED_13(); public static final int H5T_CSET_RESERVED_14 = H5T_CSET_RESERVED_14(); public static final int H5T_CSET_RESERVED_15 = H5T_CSET_RESERVED_15(); public static final int H5T_CSET_RESERVED_2 = H5T_CSET_RESERVED_2(); public static final int H5T_CSET_RESERVED_3 = H5T_CSET_RESERVED_3(); public static final int H5T_CSET_RESERVED_4 = H5T_CSET_RESERVED_4(); public static final int H5T_CSET_RESERVED_5 = H5T_CSET_RESERVED_5(); public static final int H5T_CSET_RESERVED_6 = H5T_CSET_RESERVED_6(); public static final int H5T_CSET_RESERVED_7 = H5T_CSET_RESERVED_7(); public static final int H5T_CSET_RESERVED_8 = H5T_CSET_RESERVED_8(); public static final int H5T_CSET_RESERVED_9 = H5T_CSET_RESERVED_9(); public static final int H5T_DIR_ASCEND = H5T_DIR_ASCEND(); public static final int H5T_DIR_DEFAULT = H5T_DIR_DEFAULT(); public static final int H5T_DIR_DESCEND = H5T_DIR_DESCEND(); public static final int H5T_ENUM = H5T_ENUM(); public static final int H5T_FLOAT = H5T_FLOAT(); public static final int H5T_FORTRAN_S1 = H5T_FORTRAN_S1(); public static final int H5T_IEEE_F32BE = H5T_IEEE_F32BE(); public static final int H5T_IEEE_F32LE = H5T_IEEE_F32LE(); public static final int H5T_IEEE_F64BE = H5T_IEEE_F64BE(); public static final int H5T_IEEE_F64LE = H5T_IEEE_F64LE(); public static final int H5T_INTEGER = H5T_INTEGER(); public static final int H5T_INTEL_B16 = H5T_INTEL_B16(); public static final int H5T_INTEL_B32 = H5T_INTEL_B32(); public static final int H5T_INTEL_B64 = H5T_INTEL_B64(); public static final int H5T_INTEL_B8 = H5T_INTEL_B8(); public static final int H5T_INTEL_F32 = H5T_INTEL_F32(); public static final int H5T_INTEL_F64 = H5T_INTEL_F64(); public static final int H5T_INTEL_I16 = H5T_INTEL_I16(); public static final int H5T_INTEL_I32 = H5T_INTEL_I32(); public static final int H5T_INTEL_I64 = H5T_INTEL_I64(); public static final int H5T_INTEL_I8 = H5T_INTEL_I8(); public static final int H5T_INTEL_U16 = H5T_INTEL_U16(); public static final int H5T_INTEL_U32 = H5T_INTEL_U32(); public static final int H5T_INTEL_U64 = H5T_INTEL_U64(); public static final int H5T_INTEL_U8 = H5T_INTEL_U8(); public static final int H5T_MIPS_B16 = H5T_MIPS_B16(); public static final int H5T_MIPS_B32 = H5T_MIPS_B32(); public static final int H5T_MIPS_B64 = H5T_MIPS_B64(); public static final int H5T_MIPS_B8 = H5T_MIPS_B8(); public static final int H5T_MIPS_F32 = H5T_MIPS_F32(); public static final int H5T_MIPS_F64 = H5T_MIPS_F64(); public static final int H5T_MIPS_I16 = H5T_MIPS_I16(); public static final int H5T_MIPS_I32 = H5T_MIPS_I32(); public static final int H5T_MIPS_I64 = H5T_MIPS_I64(); public static final int H5T_MIPS_I8 = H5T_MIPS_I8(); public static final int H5T_MIPS_U16 = H5T_MIPS_U16(); public static final int H5T_MIPS_U32 = H5T_MIPS_U32(); public static final int H5T_MIPS_U64 = H5T_MIPS_U64(); public static final int H5T_MIPS_U8 = H5T_MIPS_U8(); public static final int H5T_NATIVE_B16 = H5T_NATIVE_B16(); public static final int H5T_NATIVE_B32 = H5T_NATIVE_B32(); public static final int H5T_NATIVE_B64 = H5T_NATIVE_B64(); public static final int H5T_NATIVE_B8 = H5T_NATIVE_B8(); public static final int H5T_NATIVE_CHAR = H5T_NATIVE_CHAR(); public static final int H5T_NATIVE_DOUBLE = H5T_NATIVE_DOUBLE(); public static final int H5T_NATIVE_FLOAT = H5T_NATIVE_FLOAT(); public static final int H5T_NATIVE_HADDR = H5T_NATIVE_HADDR(); public static final int H5T_NATIVE_HBOOL = H5T_NATIVE_HBOOL(); public static final int H5T_NATIVE_HERR = H5T_NATIVE_HERR(); public static final int H5T_NATIVE_HSIZE = H5T_NATIVE_HSIZE(); public static final int H5T_NATIVE_HSSIZE = H5T_NATIVE_HSSIZE(); public static final int H5T_NATIVE_INT = H5T_NATIVE_INT(); public static final int H5T_NATIVE_INT_FAST16 = H5T_NATIVE_INT_FAST16(); public static final int H5T_NATIVE_INT_FAST32 = H5T_NATIVE_INT_FAST32(); public static final int H5T_NATIVE_INT_FAST64 = H5T_NATIVE_INT_FAST64(); public static final int H5T_NATIVE_INT_FAST8 = H5T_NATIVE_INT_FAST8(); public static final int H5T_NATIVE_INT_LEAST16 = H5T_NATIVE_INT_LEAST16(); public static final int H5T_NATIVE_INT_LEAST32 = H5T_NATIVE_INT_LEAST32(); public static final int H5T_NATIVE_INT_LEAST64 = H5T_NATIVE_INT_LEAST64(); public static final int H5T_NATIVE_INT_LEAST8 = H5T_NATIVE_INT_LEAST8(); public static final int H5T_NATIVE_INT16 = H5T_NATIVE_INT16(); public static final int H5T_NATIVE_INT32 = H5T_NATIVE_INT32(); public static final int H5T_NATIVE_INT64 = H5T_NATIVE_INT64(); public static final int H5T_NATIVE_INT8 = H5T_NATIVE_INT8(); public static final int H5T_NATIVE_LDOUBLE = H5T_NATIVE_LDOUBLE(); public static final int H5T_NATIVE_LLONG = H5T_NATIVE_LLONG(); public static final int H5T_NATIVE_LONG = H5T_NATIVE_LONG(); public static final int H5T_NATIVE_OPAQUE = H5T_NATIVE_OPAQUE(); public static final int H5T_NATIVE_SCHAR = H5T_NATIVE_SCHAR(); public static final int H5T_NATIVE_SHORT = H5T_NATIVE_SHORT(); public static final int H5T_NATIVE_UCHAR = H5T_NATIVE_UCHAR(); public static final int H5T_NATIVE_UINT = H5T_NATIVE_UINT(); public static final int H5T_NATIVE_UINT_FAST16 = H5T_NATIVE_UINT_FAST16(); public static final int H5T_NATIVE_UINT_FAST32 = H5T_NATIVE_UINT_FAST32(); public static final int H5T_NATIVE_UINT_FAST64 = H5T_NATIVE_UINT_FAST64(); public static final int H5T_NATIVE_UINT_FAST8 = H5T_NATIVE_UINT_FAST8(); public static final int H5T_NATIVE_UINT_LEAST16 = H5T_NATIVE_UINT_LEAST16(); public static final int H5T_NATIVE_UINT_LEAST32 = H5T_NATIVE_UINT_LEAST32(); public static final int H5T_NATIVE_UINT_LEAST64 = H5T_NATIVE_UINT_LEAST64(); public static final int H5T_NATIVE_UINT_LEAST8 = H5T_NATIVE_UINT_LEAST8(); public static final int H5T_NATIVE_UINT16 = H5T_NATIVE_UINT16(); public static final int H5T_NATIVE_UINT32 = H5T_NATIVE_UINT32(); public static final int H5T_NATIVE_UINT64 = H5T_NATIVE_UINT64(); public static final int H5T_NATIVE_UINT8 = H5T_NATIVE_UINT8(); public static final int H5T_NATIVE_ULLONG = H5T_NATIVE_ULLONG(); public static final int H5T_NATIVE_ULONG = H5T_NATIVE_ULONG(); public static final int H5T_NATIVE_USHORT = H5T_NATIVE_USHORT(); public static final int H5T_NCLASSES = H5T_NCLASSES(); public static final int H5T_NO_CLASS = H5T_NO_CLASS(); public static final int H5T_NORM_ERROR = H5T_NORM_ERROR(); public static final int H5T_NORM_IMPLIED = H5T_NORM_IMPLIED(); public static final int H5T_NORM_MSBSET = H5T_NORM_MSBSET(); public static final int H5T_NORM_NONE = H5T_NORM_NONE(); public static final int H5T_NPAD = H5T_NPAD(); public static final int H5T_NSGN = H5T_NSGN(); public static final int H5T_OPAQUE = H5T_OPAQUE(); public static final int H5T_OPAQUE_TAG_MAX = H5T_OPAQUE_TAG_MAX(); /* 1.6.5 */ public static final int H5T_ORDER_BE = H5T_ORDER_BE(); public static final int H5T_ORDER_ERROR = H5T_ORDER_ERROR(); public static final int H5T_ORDER_LE = H5T_ORDER_LE(); public static final int H5T_ORDER_NONE = H5T_ORDER_NONE(); public static final int H5T_ORDER_VAX = H5T_ORDER_VAX(); public static final int H5T_PAD_BACKGROUND = H5T_PAD_BACKGROUND(); public static final int H5T_PAD_ERROR = H5T_PAD_ERROR(); public static final int H5T_PAD_ONE = H5T_PAD_ONE(); public static final int H5T_PAD_ZERO = H5T_PAD_ZERO(); public static final int H5T_PERS_DONTCARE = H5T_PERS_DONTCARE(); public static final int H5T_PERS_HARD = H5T_PERS_HARD(); public static final int H5T_PERS_SOFT = H5T_PERS_SOFT(); public static final int H5T_REFERENCE = H5T_REFERENCE(); public static final int H5T_SGN_2 = H5T_SGN_2(); public static final int H5T_SGN_ERROR = H5T_SGN_ERROR(); public static final int H5T_SGN_NONE = H5T_SGN_NONE(); public static final int H5T_STD_B16BE = H5T_STD_B16BE(); public static final int H5T_STD_B16LE = H5T_STD_B16LE(); public static final int H5T_STD_B32BE = H5T_STD_B32BE(); public static final int H5T_STD_B32LE = H5T_STD_B32LE(); public static final int H5T_STD_B64BE = H5T_STD_B64BE(); public static final int H5T_STD_B64LE = H5T_STD_B64LE(); public static final int H5T_STD_B8BE = H5T_STD_B8BE(); public static final int H5T_STD_B8LE = H5T_STD_B8LE(); public static final int H5T_STD_I16BE = H5T_STD_I16BE(); public static final int H5T_STD_I16LE = H5T_STD_I16LE(); public static final int H5T_STD_I32BE = H5T_STD_I32BE(); public static final int H5T_STD_I32LE = H5T_STD_I32LE(); public static final int H5T_STD_I64BE = H5T_STD_I64BE(); public static final int H5T_STD_I64LE = H5T_STD_I64LE(); public static final int H5T_STD_I8BE = H5T_STD_I8BE(); public static final int H5T_STD_I8LE = H5T_STD_I8LE(); public static final int H5T_STD_REF_DSETREG = H5T_STD_REF_DSETREG(); public static final int H5T_STD_REF_OBJ = H5T_STD_REF_OBJ(); public static final int H5T_STD_U16BE = H5T_STD_U16BE(); public static final int H5T_STD_U16LE = H5T_STD_U16LE(); public static final int H5T_STD_U32BE = H5T_STD_U32BE(); public static final int H5T_STD_U32LE = H5T_STD_U32LE(); public static final int H5T_STD_U64BE = H5T_STD_U64BE(); public static final int H5T_STD_U64LE = H5T_STD_U64LE(); public static final int H5T_STD_U8BE = H5T_STD_U8BE(); public static final int H5T_STD_U8LE = H5T_STD_U8LE(); public static final int H5T_STR_ERROR = H5T_STR_ERROR(); public static final int H5T_STR_NULLPAD = H5T_STR_NULLPAD(); public static final int H5T_STR_NULLTERM = H5T_STR_NULLTERM(); public static final int H5T_STR_RESERVED_10 = H5T_STR_RESERVED_10(); public static final int H5T_STR_RESERVED_11 = H5T_STR_RESERVED_11(); public static final int H5T_STR_RESERVED_12 = H5T_STR_RESERVED_12(); public static final int H5T_STR_RESERVED_13 = H5T_STR_RESERVED_13(); public static final int H5T_STR_RESERVED_14 = H5T_STR_RESERVED_14(); public static final int H5T_STR_RESERVED_15 = H5T_STR_RESERVED_15(); public static final int H5T_STR_RESERVED_3 = H5T_STR_RESERVED_3(); public static final int H5T_STR_RESERVED_4 = H5T_STR_RESERVED_4(); public static final int H5T_STR_RESERVED_5 = H5T_STR_RESERVED_5(); public static final int H5T_STR_RESERVED_6 = H5T_STR_RESERVED_6(); public static final int H5T_STR_RESERVED_7 = H5T_STR_RESERVED_7(); public static final int H5T_STR_RESERVED_8 = H5T_STR_RESERVED_8(); public static final int H5T_STR_RESERVED_9 = H5T_STR_RESERVED_9(); public static final int H5T_STR_SPACEPAD = H5T_STR_SPACEPAD(); public static final int H5T_STRING = H5T_STRING(); public static final int H5T_TIME = H5T_TIME(); public static final int H5T_UNIX_D32BE = H5T_UNIX_D32BE(); public static final int H5T_UNIX_D32LE = H5T_UNIX_D32LE(); public static final int H5T_UNIX_D64BE = H5T_UNIX_D64BE(); public static final int H5T_UNIX_D64LE = H5T_UNIX_D64LE(); public static final int H5T_VARIABLE = H5T_VARIABLE(); public static final int H5T_VLEN = H5T_VLEN(); public static final int H5Z_CB_CONT = H5Z_CB_CONT(); public static final int H5Z_CB_ERROR = H5Z_CB_ERROR(); public static final int H5Z_CB_FAIL = H5Z_CB_FAIL(); public static final int H5Z_CB_NO = H5Z_CB_NO(); public static final int H5Z_DISABLE_EDC = H5Z_DISABLE_EDC(); public static final int H5Z_ENABLE_EDC = H5Z_ENABLE_EDC(); public static final int H5Z_ERROR_EDC = H5Z_ERROR_EDC(); public static final int H5Z_FILTER_DEFLATE = H5Z_FILTER_DEFLATE(); public static final int H5Z_FILTER_ERROR = H5Z_FILTER_ERROR(); public static final int H5Z_FILTER_FLETCHER32 = H5Z_FILTER_FLETCHER32(); public static final int H5Z_FILTER_MAX = H5Z_FILTER_MAX(); public static final int H5Z_FILTER_NBIT = H5Z_FILTER_NBIT(); public static final int H5Z_FILTER_NONE = H5Z_FILTER_NONE(); public static final int H5Z_FILTER_RESERVED = H5Z_FILTER_RESERVED(); public static final int H5Z_FILTER_SCALEOFFSET = H5Z_FILTER_SCALEOFFSET(); public static final int H5Z_FILTER_SHUFFLE = H5Z_FILTER_SHUFFLE(); public static final int H5Z_FILTER_SZIP = H5Z_FILTER_SZIP(); public static final int H5Z_FLAG_DEFMASK = H5Z_FLAG_DEFMASK(); public static final int H5Z_FLAG_INVMASK = H5Z_FLAG_INVMASK(); public static final int H5Z_FLAG_MANDATORY = H5Z_FLAG_MANDATORY(); public static final int H5Z_FLAG_OPTIONAL = H5Z_FLAG_OPTIONAL(); public static final int H5Z_FLAG_REVERSE = H5Z_FLAG_REVERSE(); public static final int H5Z_FLAG_SKIP_EDC = H5Z_FLAG_SKIP_EDC(); public static final int H5Z_MAX_NFILTERS = H5Z_MAX_NFILTERS(); public static final int H5Z_NO_EDC = H5Z_NO_EDC(); public static final int H5Z_FILTER_CONFIG_ENCODE_ENABLED = H5Z_FILTER_CONFIG_ENCODE_ENABLED(); public static final int H5Z_FILTER_CONFIG_DECODE_ENABLED = H5Z_FILTER_CONFIG_DECODE_ENABLED(); public static final int H5Z_SO_INT_MINBITS_DEFAULT = H5Z_SO_INT_MINBITS_DEFAULT(); public static final int H5Z_SO_FLOAT_DSCALE = H5Z_SO_FLOAT_DSCALE(); public static final int H5Z_SO_FLOAT_ESCALE = H5Z_SO_FLOAT_ESCALE(); public static final int H5Z_SO_INT = H5Z_SO_INT(); public static final int H5Z_SHUFFLE_USER_NPARMS = H5Z_SHUFFLE_USER_NPARMS(); public static final int H5Z_SHUFFLE_TOTAL_NPARMS = H5Z_SHUFFLE_TOTAL_NPARMS(); public static final int H5Z_SZIP_USER_NPARMS = H5Z_SZIP_USER_NPARMS(); public static final int H5Z_SZIP_TOTAL_NPARMS = H5Z_SZIP_TOTAL_NPARMS(); public static final int H5Z_SZIP_PARM_MASK = H5Z_SZIP_PARM_MASK(); public static final int H5Z_SZIP_PARM_PPB = H5Z_SZIP_PARM_PPB(); public static final int H5Z_SZIP_PARM_BPP = H5Z_SZIP_PARM_BPP(); public static final int H5Z_SZIP_PARM_PPS = H5Z_SZIP_PARM_PPS(); public static final int H5Z_NBIT_USER_NPARMS = H5Z_NBIT_USER_NPARMS(); public static final int H5Z_SCALEOFFSET_USER_NPARMS = H5Z_SCALEOFFSET_USER_NPARMS(); public static final int H5Z_FILTER_ALL = H5Z_FILTER_ALL(); // ///////////////////////////////////////////////////////////////////////// // List of private native variables to get constant values from C // // DO NOT EDIT THE LIST UNLESS YOU KNOW WHAT YOU DO!!! // // ///////////////////////////////////////////////////////////////////////// private static native final long H5_QUARTER_HADDR_MAX(); private static native final int H5_SZIP_MAX_PIXELS_PER_BLOCK(); private static native final int H5_SZIP_NN_OPTION_MASK(); private static native final int H5_SZIP_EC_OPTION_MASK(); private static native final int H5_SZIP_ALLOW_K13_OPTION_MASK(); private static native final int H5_SZIP_CHIP_OPTION_MASK(); private static native final int H5_INDEX_UNKNOWN(); private static native final int H5_INDEX_NAME(); private static native final int H5_INDEX_CRT_ORDER(); private static native final int H5_INDEX_N(); private static native final int H5_ITER_UNKNOWN(); private static native final int H5_ITER_INC(); private static native final int H5_ITER_DEC(); private static native final int H5_ITER_NATIVE(); private static native final int H5_ITER_N(); private static native final int H5AC_CURR_CACHE_CONFIG_VERSION(); private static native final int H5AC_MAX_TRACE_FILE_NAME_LEN(); private static native final int H5AC_METADATA_WRITE_STRATEGY_PROCESS_ZERO_ONLY(); private static native final int H5AC_METADATA_WRITE_STRATEGY_DISTRIBUTED(); private static native final int H5C_incr_off(); private static native final int H5C_incr_threshold(); private static native final int H5C_flash_incr_off(); private static native final int H5C_flash_incr_add_space(); private static native final int H5C_decr_off(); private static native final int H5C_decr_threshold(); private static native final int H5C_decr_age_out(); private static native final int H5C_decr_age_out_with_threshold(); private static native final int H5D_CHUNK_BTREE(); private static native final int H5D_ALLOC_TIME_DEFAULT(); private static native final int H5D_ALLOC_TIME_EARLY(); private static native final int H5D_ALLOC_TIME_ERROR(); private static native final int H5D_ALLOC_TIME_INCR(); private static native final int H5D_ALLOC_TIME_LATE(); private static native final int H5D_FILL_TIME_ERROR(); private static native final int H5D_FILL_TIME_ALLOC(); private static native final int H5D_FILL_TIME_NEVER(); private static native final int H5D_FILL_TIME_IFSET(); private static native final int H5D_FILL_VALUE_DEFAULT(); private static native final int H5D_FILL_VALUE_ERROR(); private static native final int H5D_FILL_VALUE_UNDEFINED(); private static native final int H5D_FILL_VALUE_USER_DEFINED(); private static native final int H5D_LAYOUT_ERROR(); private static native final int H5D_CHUNKED(); private static native final int H5D_COMPACT(); private static native final int H5D_CONTIGUOUS(); private static native final int H5D_NLAYOUTS(); private static native final int H5D_SPACE_STATUS_ALLOCATED(); private static native final int H5D_SPACE_STATUS_ERROR(); private static native final int H5D_SPACE_STATUS_NOT_ALLOCATED(); private static native final int H5D_SPACE_STATUS_PART_ALLOCATED(); private static native final int H5E_ALIGNMENT(); private static native final int H5E_ALREADYEXISTS(); private static native final int H5E_ALREADYINIT(); private static native final int H5E_ARGS(); private static native final int H5E_ATOM(); private static native final int H5E_ATTR(); private static native final int H5E_BADATOM(); private static native final int H5E_BADFILE(); private static native final int H5E_BADGROUP(); private static native final int H5E_BADMESG(); private static native final int H5E_BADRANGE(); private static native final int H5E_BADSELECT(); private static native final int H5E_BADSIZE(); private static native final int H5E_BADTYPE(); private static native final int H5E_BADVALUE(); private static native final int H5E_BTREE(); private static native final int H5E_CACHE(); private static native final int H5E_CALLBACK(); private static native final int H5E_CANAPPLY(); // private static native final int H5E_CANTALLOC(); private static native final int H5E_CANTCLIP(); private static native final int H5E_CANTCLOSEFILE(); private static native final int H5E_CANTCONVERT(); private static native final int H5E_CANTCOPY(); private static native final int H5E_CANTCOUNT(); private static native final int H5E_CANTCREATE(); private static native final int H5E_CANTDEC(); private static native final int H5E_CANTDECODE(); private static native final int H5E_CANTDELETE(); private static native final int H5E_CANTENCODE(); private static native final int H5E_CANTFLUSH(); private static native final int H5E_CANTFREE(); private static native final int H5E_CANTGET(); private static native final int H5E_CANTINC(); private static native final int H5E_CANTINIT(); private static native final int H5E_CANTINSERT(); private static native final int H5E_CANTLIST(); private static native final int H5E_CANTLOAD(); private static native final int H5E_CANTLOCK(); private static native final int H5E_CANTNEXT(); private static native final int H5E_CANTOPENFILE(); private static native final int H5E_CANTOPENOBJ(); // private static native final int H5E_CANTRECV(); private static native final int H5E_CANTREGISTER(); private static native final int H5E_CANTRELEASE(); private static native final int H5E_CANTSELECT(); private static native final int H5E_CANTSET(); private static native final int H5E_CANTSPLIT(); private static native final int H5E_CANTUNLOCK(); private static native final int H5E_CLOSEERROR(); private static native final int H5E_COMPLEN(); private static native final int H5E_DATASET(); private static native final int H5E_DATASPACE(); private static native final int H5E_DATATYPE(); private static native final int H5E_DEFAULT(); private static native final int H5E_DUPCLASS(); private static native final int H5E_EFL(); private static native final int H5E_EXISTS(); private static native final int H5E_FCNTL(); private static native final int H5E_FILE(); private static native final int H5E_FILEEXISTS(); private static native final int H5E_FILEOPEN(); private static native final int H5E_FUNC(); private static native final int H5E_HEAP(); private static native final int H5E_INTERNAL(); private static native final int H5E_IO(); private static native final int H5E_LINK(); private static native final int H5E_LINKCOUNT(); private static native final int H5E_MAJOR(); private static native final int H5E_MINOR(); private static native final int H5E_MOUNT(); private static native final int H5E_MPI(); private static native final int H5E_MPIERRSTR(); private static native final int H5E_NOFILTER(); private static native final int H5E_NOIDS(); private static native final int H5E_NONE_MAJOR(); private static native final int H5E_NONE_MINOR(); private static native final int H5E_NOSPACE(); private static native final int H5E_NOTCACHED(); private static native final int H5E_NOTFOUND(); private static native final int H5E_NOTHDF5(); private static native final int H5E_OHDR(); private static native final int H5E_OVERFLOW(); private static native final int H5E_PLINE(); private static native final int H5E_PLIST(); private static native final int H5E_PROTECT(); private static native final int H5E_READERROR(); private static native final int H5E_REFERENCE(); private static native final int H5E_RESOURCE(); private static native final int H5E_RS(); private static native final int H5E_SEEKERROR(); private static native final int H5E_SETLOCAL(); private static native final int H5E_STORAGE(); private static native final int H5E_SYM(); private static native final int H5E_TRUNCATED(); private static native final int H5E_TST(); private static native final int H5E_UNINITIALIZED(); private static native final int H5E_UNSUPPORTED(); private static native final int H5E_VERSION(); private static native final int H5E_VFL(); private static native final int H5E_WALK_DOWNWARD(); private static native final int H5E_WALK_UPWARD(); private static native final int H5E_WRITEERROR(); private static native final int H5F_ACC_CREAT(); private static native final int H5F_ACC_DEBUG(); private static native final int H5F_ACC_EXCL(); private static native final int H5F_ACC_RDONLY(); private static native final int H5F_ACC_RDWR(); private static native final int H5F_ACC_TRUNC(); private static native final int H5F_ACC_DEFAULT(); private static native final int H5F_CLOSE_DEFAULT(); private static native final int H5F_CLOSE_SEMI(); private static native final int H5F_CLOSE_STRONG(); private static native final int H5F_CLOSE_WEAK(); private static native final int H5F_LIBVER_EARLIEST(); private static native final int H5F_LIBVER_LATEST(); private static native final int H5F_OBJ_ALL(); private static native final int H5F_OBJ_ATTR(); private static native final int H5F_OBJ_DATASET(); private static native final int H5F_OBJ_DATATYPE(); private static native final int H5F_OBJ_FILE(); private static native final int H5F_OBJ_GROUP(); private static native final int H5F_OBJ_LOCAL(); /* 1.6.5 */ private static native final int H5F_SCOPE_DOWN(); private static native final int H5F_SCOPE_GLOBAL(); private static native final int H5F_SCOPE_LOCAL(); private static native final int H5F_UNLIMITED(); private static native final int H5FD_CORE(); private static native final int H5FD_DIRECT(); private static native final int H5FD_FAMILY(); private static native final int H5FD_LOG(); private static native final int H5FD_MPIO(); private static native final int H5FD_MULTI(); private static native final int H5FD_SEC2(); private static native final int H5FD_STDIO(); private static native final int H5FD_WINDOWS(); private static native final int H5FD_LOG_LOC_READ(); private static native final int H5FD_LOG_LOC_WRITE(); private static native final int H5FD_LOG_LOC_SEEK(); private static native final int H5FD_LOG_LOC_IO(); private static native final int H5FD_LOG_FILE_READ(); private static native final int H5FD_LOG_FILE_WRITE(); private static native final int H5FD_LOG_FILE_IO(); private static native final int H5FD_LOG_FLAVOR(); private static native final int H5FD_LOG_NUM_READ(); private static native final int H5FD_LOG_NUM_WRITE(); private static native final int H5FD_LOG_NUM_SEEK(); private static native final int H5FD_LOG_NUM_TRUNCATE(); private static native final int H5FD_LOG_NUM_IO(); private static native final int H5FD_LOG_TIME_OPEN(); private static native final int H5FD_LOG_TIME_STAT(); private static native final int H5FD_LOG_TIME_READ(); private static native final int H5FD_LOG_TIME_WRITE(); private static native final int H5FD_LOG_TIME_SEEK(); private static native final int H5FD_LOG_TIME_CLOSE(); private static native final int H5FD_LOG_TIME_IO(); private static native final int H5FD_LOG_ALLOC(); private static native final int H5FD_LOG_ALL(); private static native final int H5FD_MEM_NOLIST(); private static native final int H5FD_MEM_DEFAULT(); private static native final int H5FD_MEM_SUPER(); private static native final int H5FD_MEM_BTREE(); private static native final int H5FD_MEM_DRAW(); private static native final int H5FD_MEM_GHEAP(); private static native final int H5FD_MEM_LHEAP(); private static native final int H5FD_MEM_OHDR(); private static native final int H5FD_MEM_NTYPES(); private static native final long H5FD_DEFAULT_HADDR_SIZE(); private static native final int H5G_DATASET(); private static native final int H5G_GROUP(); private static native final int H5G_LINK(); private static native final int H5G_UDLINK(); private static native final int H5G_LINK_ERROR(); private static native final int H5G_LINK_HARD(); private static native final int H5G_LINK_SOFT(); private static native final int H5G_NLIBTYPES(); private static native final int H5G_NTYPES(); private static native final int H5G_NUSERTYPES(); private static native final int H5G_RESERVED_5(); private static native final int H5G_RESERVED_6(); private static native final int H5G_RESERVED_7(); private static native final int H5G_SAME_LOC(); private static native final int H5G_STORAGE_TYPE_UNKNOWN(); private static native final int H5G_STORAGE_TYPE_SYMBOL_TABLE(); private static native final int H5G_STORAGE_TYPE_COMPACT(); private static native final int H5G_STORAGE_TYPE_DENSE(); private static native final int H5G_TYPE(); private static native final int H5G_UNKNOWN(); private static native final int H5I_ATTR(); private static native final int H5I_BADID(); private static native final int H5I_DATASET(); private static native final int H5I_DATASPACE(); private static native final int H5I_DATATYPE(); private static native final int H5I_FILE(); private static native final int H5I_GENPROP_CLS(); private static native final int H5I_GENPROP_LST(); private static native final int H5I_GROUP(); private static native final int H5I_INVALID_HID(); private static native final int H5I_REFERENCE(); private static native final int H5I_VFL(); private static native final int H5L_TYPE_ERROR(); private static native final int H5L_TYPE_HARD(); private static native final int H5L_TYPE_SOFT(); private static native final int H5L_TYPE_EXTERNAL(); private static native final int H5L_TYPE_MAX(); private static native final int H5O_COPY_SHALLOW_HIERARCHY_FLAG(); private static native final int H5O_COPY_EXPAND_SOFT_LINK_FLAG(); private static native final int H5O_COPY_EXPAND_EXT_LINK_FLAG(); private static native final int H5O_COPY_EXPAND_REFERENCE_FLAG(); private static native final int H5O_COPY_WITHOUT_ATTR_FLAG(); private static native final int H5O_COPY_PRESERVE_NULL_FLAG(); private static native final int H5O_SHMESG_NONE_FLAG(); private static native final int H5O_SHMESG_SDSPACE_FLAG(); private static native final int H5O_SHMESG_DTYPE_FLAG(); private static native final int H5O_SHMESG_FILL_FLAG(); private static native final int H5O_SHMESG_PLINE_FLAG(); private static native final int H5O_SHMESG_ATTR_FLAG(); private static native final int H5O_SHMESG_ALL_FLAG(); private static native final int H5O_TYPE_UNKNOWN(); private static native final int H5O_TYPE_GROUP(); private static native final int H5O_TYPE_DATASET(); private static native final int H5O_TYPE_NAMED_DATATYPE(); private static native final int H5O_TYPE_NTYPES(); private static native final int H5P_ROOT(); private static native final int H5P_OBJECT_CREATE(); private static native final int H5P_FILE_CREATE(); private static native final int H5P_FILE_ACCESS(); private static native final int H5P_DATASET_CREATE(); private static native final int H5P_DATASET_ACCESS(); private static native final int H5P_DATASET_XFER(); private static native final int H5P_FILE_MOUNT(); private static native final int H5P_GROUP_CREATE(); private static native final int H5P_GROUP_ACCESS(); private static native final int H5P_DATATYPE_CREATE(); private static native final int H5P_DATATYPE_ACCESS(); private static native final int H5P_STRING_CREATE(); private static native final int H5P_ATTRIBUTE_CREATE(); private static native final int H5P_OBJECT_COPY(); private static native final int H5P_LINK_CREATE(); private static native final int H5P_LINK_ACCESS(); private static native final int H5P_FILE_CREATE_DEFAULT(); private static native final int H5P_FILE_ACCESS_DEFAULT(); private static native final int H5P_DATASET_CREATE_DEFAULT(); private static native final int H5P_DATASET_ACCESS_DEFAULT(); private static native final int H5P_DATASET_XFER_DEFAULT(); private static native final int H5P_FILE_MOUNT_DEFAULT(); private static native final int H5P_GROUP_CREATE_DEFAULT(); private static native final int H5P_GROUP_ACCESS_DEFAULT(); private static native final int H5P_DATATYPE_CREATE_DEFAULT(); private static native final int H5P_DATATYPE_ACCESS_DEFAULT(); private static native final int H5P_ATTRIBUTE_CREATE_DEFAULT(); private static native final int H5P_OBJECT_COPY_DEFAULT(); private static native final int H5P_LINK_CREATE_DEFAULT(); private static native final int H5P_LINK_ACCESS_DEFAULT(); private static native final int H5P_CRT_ORDER_TRACKED(); private static native final int H5P_CRT_ORDER_INDEXED(); private static native final int H5P_DEFAULT(); private static native final int H5P_NO_CLASS(); private static native final int H5R_BADTYPE(); private static native final int H5R_DATASET_REGION(); private static native final int H5R_MAXTYPE(); private static native final int H5R_OBJ_REF_BUF_SIZE(); private static native final int H5R_OBJECT(); private static native final int H5S_ALL(); private static native final int H5S_MAX_RANK(); private static native final int H5S_NO_CLASS(); private static native final int H5S_NULL(); private static native final int H5S_SCALAR(); private static native final int H5S_SEL_ALL(); private static native final int H5S_SEL_ERROR(); private static native final int H5S_SEL_HYPERSLABS(); private static native final int H5S_SEL_N(); private static native final int H5S_SEL_NONE(); private static native final int H5S_SEL_POINTS(); private static native final int H5S_SELECT_AND(); private static native final int H5S_SELECT_APPEND(); private static native final int H5S_SELECT_INVALID(); private static native final int H5S_SELECT_NOOP(); private static native final int H5S_SELECT_NOTA(); private static native final int H5S_SELECT_NOTB(); private static native final int H5S_SELECT_OR(); private static native final int H5S_SELECT_PREPEND(); private static native final int H5S_SELECT_SET(); private static native final int H5S_SELECT_XOR(); private static native final int H5S_SIMPLE(); private static native final int H5S_UNLIMITED(); private static native final int H5T_ALPHA_B16(); private static native final int H5T_ALPHA_B32(); private static native final int H5T_ALPHA_B64(); private static native final int H5T_ALPHA_B8(); private static native final int H5T_ALPHA_F32(); private static native final int H5T_ALPHA_F64(); private static native final int H5T_ALPHA_I16(); private static native final int H5T_ALPHA_I32(); private static native final int H5T_ALPHA_I64(); private static native final int H5T_ALPHA_I8(); private static native final int H5T_ALPHA_U16(); private static native final int H5T_ALPHA_U32(); private static native final int H5T_ALPHA_U64(); private static native final int H5T_ALPHA_U8(); private static native final int H5T_ARRAY(); private static native final int H5T_BITFIELD(); private static native final int H5T_BKG_NO(); private static native final int H5T_BKG_YES(); private static native final int H5T_C_S1(); private static native final int H5T_COMPOUND(); private static native final int H5T_CONV_CONV(); private static native final int H5T_CONV_FREE(); private static native final int H5T_CONV_INIT(); private static native final int H5T_CSET_ERROR(); private static native final int H5T_CSET_ASCII(); private static native final int H5T_CSET_UTF8(); private static native final int H5T_CSET_RESERVED_10(); private static native final int H5T_CSET_RESERVED_11(); private static native final int H5T_CSET_RESERVED_12(); private static native final int H5T_CSET_RESERVED_13(); private static native final int H5T_CSET_RESERVED_14(); private static native final int H5T_CSET_RESERVED_15(); private static native final int H5T_CSET_RESERVED_2(); private static native final int H5T_CSET_RESERVED_3(); private static native final int H5T_CSET_RESERVED_4(); private static native final int H5T_CSET_RESERVED_5(); private static native final int H5T_CSET_RESERVED_6(); private static native final int H5T_CSET_RESERVED_7(); private static native final int H5T_CSET_RESERVED_8(); private static native final int H5T_CSET_RESERVED_9(); private static native final int H5T_DIR_ASCEND(); private static native final int H5T_DIR_DEFAULT(); private static native final int H5T_DIR_DESCEND(); private static native final int H5T_ENUM(); private static native final int H5T_FLOAT(); private static native final int H5T_FORTRAN_S1(); private static native final int H5T_IEEE_F32BE(); private static native final int H5T_IEEE_F32LE(); private static native final int H5T_IEEE_F64BE(); private static native final int H5T_IEEE_F64LE(); private static native final int H5T_INTEGER(); private static native final int H5T_INTEL_B16(); private static native final int H5T_INTEL_B32(); private static native final int H5T_INTEL_B64(); private static native final int H5T_INTEL_B8(); private static native final int H5T_INTEL_F32(); private static native final int H5T_INTEL_F64(); private static native final int H5T_INTEL_I16(); private static native final int H5T_INTEL_I32(); private static native final int H5T_INTEL_I64(); private static native final int H5T_INTEL_I8(); private static native final int H5T_INTEL_U16(); private static native final int H5T_INTEL_U32(); private static native final int H5T_INTEL_U64(); private static native final int H5T_INTEL_U8(); private static native final int H5T_MIPS_B16(); private static native final int H5T_MIPS_B32(); private static native final int H5T_MIPS_B64(); private static native final int H5T_MIPS_B8(); private static native final int H5T_MIPS_F32(); private static native final int H5T_MIPS_F64(); private static native final int H5T_MIPS_I16(); private static native final int H5T_MIPS_I32(); private static native final int H5T_MIPS_I64(); private static native final int H5T_MIPS_I8(); private static native final int H5T_MIPS_U16(); private static native final int H5T_MIPS_U32(); private static native final int H5T_MIPS_U64(); private static native final int H5T_MIPS_U8(); private static native final int H5T_NATIVE_B16(); private static native final int H5T_NATIVE_B32(); private static native final int H5T_NATIVE_B64(); private static native final int H5T_NATIVE_B8(); private static native final int H5T_NATIVE_CHAR(); private static native final int H5T_NATIVE_DOUBLE(); private static native final int H5T_NATIVE_FLOAT(); private static native final int H5T_NATIVE_HADDR(); private static native final int H5T_NATIVE_HBOOL(); private static native final int H5T_NATIVE_HERR(); private static native final int H5T_NATIVE_HSIZE(); private static native final int H5T_NATIVE_HSSIZE(); private static native final int H5T_NATIVE_INT(); private static native final int H5T_NATIVE_INT_FAST16(); private static native final int H5T_NATIVE_INT_FAST32(); private static native final int H5T_NATIVE_INT_FAST64(); private static native final int H5T_NATIVE_INT_FAST8(); private static native final int H5T_NATIVE_INT_LEAST16(); private static native final int H5T_NATIVE_INT_LEAST32(); private static native final int H5T_NATIVE_INT_LEAST64(); private static native final int H5T_NATIVE_INT_LEAST8(); private static native final int H5T_NATIVE_INT16(); private static native final int H5T_NATIVE_INT32(); private static native final int H5T_NATIVE_INT64(); private static native final int H5T_NATIVE_INT8(); private static native final int H5T_NATIVE_LDOUBLE(); private static native final int H5T_NATIVE_LLONG(); private static native final int H5T_NATIVE_LONG(); private static native final int H5T_NATIVE_OPAQUE(); private static native final int H5T_NATIVE_SCHAR(); private static native final int H5T_NATIVE_SHORT(); private static native final int H5T_NATIVE_UCHAR(); private static native final int H5T_NATIVE_UINT(); private static native final int H5T_NATIVE_UINT_FAST16(); private static native final int H5T_NATIVE_UINT_FAST32(); private static native final int H5T_NATIVE_UINT_FAST64(); private static native final int H5T_NATIVE_UINT_FAST8(); private static native final int H5T_NATIVE_UINT_LEAST16(); private static native final int H5T_NATIVE_UINT_LEAST32(); private static native final int H5T_NATIVE_UINT_LEAST64(); private static native final int H5T_NATIVE_UINT_LEAST8(); private static native final int H5T_NATIVE_UINT16(); private static native final int H5T_NATIVE_UINT32(); private static native final int H5T_NATIVE_UINT64(); private static native final int H5T_NATIVE_UINT8(); private static native final int H5T_NATIVE_ULLONG(); private static native final int H5T_NATIVE_ULONG(); private static native final int H5T_NATIVE_USHORT(); private static native final int H5T_NCLASSES(); private static native final int H5T_NO_CLASS(); private static native final int H5T_NORM_ERROR(); private static native final int H5T_NORM_IMPLIED(); private static native final int H5T_NORM_MSBSET(); private static native final int H5T_NORM_NONE(); private static native final int H5T_NPAD(); private static native final int H5T_NSGN(); private static native final int H5T_OPAQUE(); private static native final int H5T_OPAQUE_TAG_MAX(); private static native final int H5T_ORDER_BE(); private static native final int H5T_ORDER_ERROR(); private static native final int H5T_ORDER_LE(); private static native final int H5T_ORDER_NONE(); private static native final int H5T_ORDER_VAX(); private static native final int H5T_PAD_BACKGROUND(); private static native final int H5T_PAD_ERROR(); private static native final int H5T_PAD_ONE(); private static native final int H5T_PAD_ZERO(); private static native final int H5T_PERS_DONTCARE(); private static native final int H5T_PERS_HARD(); private static native final int H5T_PERS_SOFT(); private static native final int H5T_REFERENCE(); private static native final int H5T_SGN_2(); private static native final int H5T_SGN_ERROR(); private static native final int H5T_SGN_NONE(); private static native final int H5T_STD_B16BE(); private static native final int H5T_STD_B16LE(); private static native final int H5T_STD_B32BE(); private static native final int H5T_STD_B32LE(); private static native final int H5T_STD_B64BE(); private static native final int H5T_STD_B64LE(); private static native final int H5T_STD_B8BE(); private static native final int H5T_STD_B8LE(); private static native final int H5T_STD_I16BE(); private static native final int H5T_STD_I16LE(); private static native final int H5T_STD_I32BE(); private static native final int H5T_STD_I32LE(); private static native final int H5T_STD_I64BE(); private static native final int H5T_STD_I64LE(); private static native final int H5T_STD_I8BE(); private static native final int H5T_STD_I8LE(); private static native final int H5T_STD_REF_DSETREG(); private static native final int H5T_STD_REF_OBJ(); private static native final int H5T_STD_U16BE(); private static native final int H5T_STD_U16LE(); private static native final int H5T_STD_U32BE(); private static native final int H5T_STD_U32LE(); private static native final int H5T_STD_U64BE(); private static native final int H5T_STD_U64LE(); private static native final int H5T_STD_U8BE(); private static native final int H5T_STD_U8LE(); private static native final int H5T_STR_ERROR(); private static native final int H5T_STR_NULLPAD(); private static native final int H5T_STR_NULLTERM(); private static native final int H5T_STR_RESERVED_10(); private static native final int H5T_STR_RESERVED_11(); private static native final int H5T_STR_RESERVED_12(); private static native final int H5T_STR_RESERVED_13(); private static native final int H5T_STR_RESERVED_14(); private static native final int H5T_STR_RESERVED_15(); private static native final int H5T_STR_RESERVED_3(); private static native final int H5T_STR_RESERVED_4(); private static native final int H5T_STR_RESERVED_5(); private static native final int H5T_STR_RESERVED_6(); private static native final int H5T_STR_RESERVED_7(); private static native final int H5T_STR_RESERVED_8(); private static native final int H5T_STR_RESERVED_9(); private static native final int H5T_STR_SPACEPAD(); private static native final int H5T_STRING(); private static native final int H5T_TIME(); private static native final int H5T_UNIX_D32BE(); private static native final int H5T_UNIX_D32LE(); private static native final int H5T_UNIX_D64BE(); private static native final int H5T_UNIX_D64LE(); private static native final int H5T_VARIABLE(); private static native final int H5T_VLEN(); private static native final int H5Z_CB_CONT(); private static native final int H5Z_CB_ERROR(); private static native final int H5Z_CB_FAIL(); private static native final int H5Z_CB_NO(); private static native final int H5Z_DISABLE_EDC(); private static native final int H5Z_ENABLE_EDC(); private static native final int H5Z_ERROR_EDC(); private static native final int H5Z_FILTER_DEFLATE(); private static native final int H5Z_FILTER_ERROR(); private static native final int H5Z_FILTER_FLETCHER32(); private static native final int H5Z_FILTER_MAX(); private static native final int H5Z_FILTER_NBIT(); private static native final int H5Z_FILTER_NONE(); private static native final int H5Z_FILTER_RESERVED(); private static native final int H5Z_FILTER_SCALEOFFSET(); private static native final int H5Z_FILTER_SHUFFLE(); private static native final int H5Z_FILTER_SZIP(); private static native final int H5Z_FLAG_DEFMASK(); private static native final int H5Z_FLAG_INVMASK(); private static native final int H5Z_FLAG_MANDATORY(); private static native final int H5Z_FLAG_OPTIONAL(); private static native final int H5Z_FLAG_REVERSE(); private static native final int H5Z_FLAG_SKIP_EDC(); private static native final int H5Z_MAX_NFILTERS(); private static native final int H5Z_NO_EDC(); private static native final int H5Z_FILTER_CONFIG_ENCODE_ENABLED(); private static native final int H5Z_FILTER_CONFIG_DECODE_ENABLED(); private static native final int H5Z_SO_INT_MINBITS_DEFAULT(); private static native final int H5Z_SO_FLOAT_DSCALE(); private static native final int H5Z_SO_FLOAT_ESCALE(); private static native final int H5Z_SO_INT(); private static native final int H5Z_SHUFFLE_USER_NPARMS(); private static native final int H5Z_SHUFFLE_TOTAL_NPARMS(); private static native final int H5Z_SZIP_USER_NPARMS(); private static native final int H5Z_SZIP_TOTAL_NPARMS(); private static native final int H5Z_SZIP_PARM_MASK(); private static native final int H5Z_SZIP_PARM_PPB(); private static native final int H5Z_SZIP_PARM_BPP(); private static native final int H5Z_SZIP_PARM_PPS(); private static native final int H5Z_NBIT_USER_NPARMS(); private static native final int H5Z_SCALEOFFSET_USER_NPARMS(); private static native final int H5Z_FILTER_ALL(); } jhdf-2.9/ncsa/hdf/hdf5lib/HDFArray.java0000755000175000017500000013043412050301064020425 0ustar sylvestresylvestre/**************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.hdf5lib; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5JavaException; /** * This is a class for handling multidimensional arrays for HDF. *

    * The purpose is to allow the storage and retrieval of arbitrary array types * containing scientific data. *

    * The methods support the conversion of an array to and from Java to a * one-dimensional array of bytes suitable for I/O by the C library. *

    * This class heavily uses the HDFNativeData class to * convert between Java and C representations. */ public class HDFArray { private Object _theArray = null; private ArrayDescriptor _desc = null; private byte[] _barray = null; // public HDFArray() {} /** * The input must be a Java Array (possibly multidimensional) of primitive * numbers or sub-classes of Number. *

    * The input is analysed to determine the number of dimensions and size of * each dimension, as well as the type of the elements. *

    * The description is saved in private variables, and used to convert data. * * @exception ncsa.hdf.hdf5lib.exceptions.HDF5Exception * object is not an array. */ public HDFArray(Object anArray) throws HDF5Exception { if (anArray == null) { HDF5JavaException ex = new HDF5JavaException( "HDFArray: array is null?: "); } Class tc = anArray.getClass(); if (tc.isArray() == false) { /* exception: not an array */ HDF5JavaException ex = new HDF5JavaException( "HDFArray: not an array?: "); throw (ex); } _theArray = anArray; _desc = new ArrayDescriptor(_theArray); /* extra error checking -- probably not needed */ if (_desc == null) { HDF5JavaException ex = new HDF5JavaException( "HDFArray: internal error: array description failed?: "); throw (ex); } } /** * Allocate a one-dimensional array of bytes sufficient to store the array. * * @return A one-D array of bytes, filled with zeroes. The bytes are * sufficient to hold the data of the Array passed to the * constructor. * @exception ncsa.hdf.hdf5lib.exception.HDF5JavaException * Allocation failed. */ public byte[] emptyBytes() throws HDF5Exception { byte[] b = null; if ((ArrayDescriptor.dims == 1) && (ArrayDescriptor.NT == 'B')) { b = (byte[]) _theArray; } else { b = new byte[ArrayDescriptor.totalSize]; } if (b == null) { HDF5JavaException ex = new HDF5JavaException( "HDFArray: emptyBytes: allocation failed"); throw (ex); } return (b); } /** * Given a Java array of numbers, convert it to a one-dimensional array of * bytes in correct native order. * * @return A one-D array of bytes, constructed from the Array passed to the * constructor. * @exception ncsa.hdf.hdf5lib.exception.HDF5Exception * thrown for errors in HDF5 * @exception ncsa.hdf.hdf5lib.exception.HDF5JavaException * the object not an array or other internal error. */ public byte[] byteify() throws HDF5Exception { if (_barray != null) { return _barray; } if (_theArray == null) { /* exception: not an array */ HDF5JavaException ex = new HDF5JavaException( "HDFArray: byteify not an array?: "); throw (ex); } if (ArrayDescriptor.dims == 1) { /* special case */ if (ArrayDescriptor.NT == 'B') { /* really special case! */ _barray = (byte[]) _theArray; return _barray; } else { try { _barray = new byte[ArrayDescriptor.totalSize]; byte[] therow; if (ArrayDescriptor.NT == 'I') { therow = HDFNativeData.intToByte(0, ArrayDescriptor.dimlen[1], (int[]) _theArray); } else if (ArrayDescriptor.NT == 'S') { therow = HDFNativeData.shortToByte(0, ArrayDescriptor.dimlen[1], (short[]) _theArray); } else if (ArrayDescriptor.NT == 'F') { therow = HDFNativeData.floatToByte(0, ArrayDescriptor.dimlen[1], (float[]) _theArray); } else if (ArrayDescriptor.NT == 'J') { therow = HDFNativeData.longToByte(0, ArrayDescriptor.dimlen[1], (long[]) _theArray); } else if (ArrayDescriptor.NT == 'D') { therow = HDFNativeData .doubleToByte(0, ArrayDescriptor.dimlen[1], (double[]) _theArray); } else if (ArrayDescriptor.NT == 'L') { if (ArrayDescriptor.className.equals("java.lang.Byte")) { therow = ByteObjToByte((Byte[]) _theArray); } else if (ArrayDescriptor.className .equals("java.lang.Integer")) { therow = IntegerToByte((Integer[]) _theArray); } else if (ArrayDescriptor.className .equals("java.lang.Short")) { therow = ShortToByte((Short[]) _theArray); } else if (ArrayDescriptor.className .equals("java.lang.Float")) { therow = FloatObjToByte((Float[]) _theArray); } else if (ArrayDescriptor.className .equals("java.lang.Double")) { therow = DoubleObjToByte((Double[]) _theArray); } else if (ArrayDescriptor.className .equals("java.lang.Long")) { therow = LongObjToByte((Long[]) _theArray); } else { HDF5JavaException ex = new HDF5JavaException( "HDFArray: unknown type of Object?"); throw (ex); } } else { HDF5JavaException ex = new HDF5JavaException( "HDFArray: unknown type of data?"); throw (ex); } System .arraycopy( therow, 0, _barray, 0, (ArrayDescriptor.dimlen[1] * ArrayDescriptor.NTsize)); return _barray; } catch (OutOfMemoryError err) { HDF5JavaException ex = new HDF5JavaException( "HDFArray: byteify array too big?"); throw (ex); } } } try { _barray = new byte[ArrayDescriptor.totalSize]; } catch (OutOfMemoryError err) { HDF5JavaException ex = new HDF5JavaException( "HDFArray: byteify array too big?"); throw (ex); } Object oo = _theArray; int n = 0; /* the current byte */ int index = 0; int i; while (n < ArrayDescriptor.totalSize) { oo = ArrayDescriptor.objs[0]; index = n / ArrayDescriptor.bytetoindex[0]; index %= ArrayDescriptor.dimlen[0]; for (i = 0; i < (ArrayDescriptor.dims); i++) { index = n / ArrayDescriptor.bytetoindex[i]; index %= ArrayDescriptor.dimlen[i]; if (index == ArrayDescriptor.currentindex[i]) { /* then use cached copy */ oo = ArrayDescriptor.objs[i]; } else { /* check range of index */ if (index > (ArrayDescriptor.dimlen[i] - 1)) { throw new java.lang.IndexOutOfBoundsException( "HDFArray: byteify index OOB?"); } oo = java.lang.reflect.Array.get(oo, index); ArrayDescriptor.currentindex[i] = index; ArrayDescriptor.objs[i] = oo; } } /* byte-ify */ byte arow[]; try { if (ArrayDescriptor.NT == 'J') { arow = HDFNativeData .longToByte( 0, ArrayDescriptor.dimlen[ArrayDescriptor.dims], (long[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); arow = HDFNativeData .longToByte( 0, ArrayDescriptor.dimlen[ArrayDescriptor.dims], (long[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'I') { arow = HDFNativeData .intToByte( 0, ArrayDescriptor.dimlen[ArrayDescriptor.dims], (int[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'S') { arow = HDFNativeData .shortToByte( 0, ArrayDescriptor.dimlen[ArrayDescriptor.dims], (short[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'B') { arow = (byte[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]; } else if (ArrayDescriptor.NT == 'F') { /* 32 bit float */ arow = HDFNativeData .floatToByte( 0, ArrayDescriptor.dimlen[ArrayDescriptor.dims], (float[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'D') { /* 64 bit float */ arow = HDFNativeData .doubleToByte( 0, ArrayDescriptor.dimlen[ArrayDescriptor.dims], (double[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'L') { if (ArrayDescriptor.className.equals("java.lang.Byte")) { arow = ByteObjToByte((Byte[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className .equals("java.lang.Integer")) { arow = IntegerToByte((Integer[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className .equals("java.lang.Short")) { arow = ShortToByte((Short[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className .equals("java.lang.Float")) { arow = FloatObjToByte((Float[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className .equals("java.lang.Double")) { arow = DoubleObjToByte((Double[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className.equals("java.lang.Long")) { arow = LongObjToByte((Long[]) ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else { HDF5JavaException ex = new HDF5JavaException( "HDFArray: byteify Object type not implemented?"); throw (ex); } } else { HDF5JavaException ex = new HDF5JavaException( "HDFArray: byteify unknown type not implemented?"); throw (ex); } System .arraycopy( arow, 0, _barray, n, (ArrayDescriptor.dimlen[ArrayDescriptor.dims] * ArrayDescriptor.NTsize)); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; } catch (OutOfMemoryError err) { HDF5JavaException ex = new HDF5JavaException( "HDFArray: byteify array too big?"); throw (ex); } } /* assert: the whole array is completed--currentindex should == len - 1 */ /* error checks */ if (n < ArrayDescriptor.totalSize) { throw new java.lang.InternalError(new String( "HDFArray::byteify: Panic didn't complete all input data: n= " + n + " size = " + ArrayDescriptor.totalSize)); } for (i = 0; i < ArrayDescriptor.dims; i++) { if (ArrayDescriptor.currentindex[i] != ArrayDescriptor.dimlen[i] - 1) { throw new java.lang.InternalError(new String( "Panic didn't complete all data: currentindex[" + i + "] = " + ArrayDescriptor.currentindex[i] + " (should be " + (ArrayDescriptor.dimlen[i] - 1) + " ?)")); } } return _barray; } /** * Given a one-dimensional array of bytes representing numbers, convert it * to a java array of the shape and size passed to the constructor. * * @param bytes * The bytes to construct the Array. * @return An Array (possibly multidimensional) of primitive or number * objects. * @exception ncsa.hdf.hdf5lib.exception.HDF5Exception * thrown for errors in HDF5 * @exception ncsa.hdf.hdf5lib.exception.HDF5JavaException * the object not an array or other internal error. */ public Object arrayify(byte[] bytes) throws HDF5Exception { if (_theArray == null) { /* exception: not an array */ HDF5JavaException ex = new HDF5JavaException( "arrayify: not an array?: "); throw (ex); } if (java.lang.reflect.Array.getLength(bytes) != ArrayDescriptor.totalSize) { /* exception: array not right size */ HDF5JavaException ex = new HDF5JavaException( "arrayify: array is wrong size?: "); throw (ex); } _barray = bytes; /* hope that the bytes are correct.... */ if (ArrayDescriptor.dims == 1) { /* special case */ /* 2 data copies here! */ try { if (ArrayDescriptor.NT == 'I') { int[] x = HDFNativeData.byteToInt(_barray); System.arraycopy(x, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'S') { short[] x = HDFNativeData.byteToShort(_barray); System.arraycopy(x, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'F') { float x[] = HDFNativeData.byteToFloat(_barray); System.arraycopy(x, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'J') { long x[] = HDFNativeData.byteToLong(_barray); System.arraycopy(x, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'D') { double x[] = HDFNativeData.byteToDouble(_barray); System.arraycopy(x, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'B') { System.arraycopy(_barray, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'L') { if (ArrayDescriptor.className.equals("java.lang.Byte")) { Byte I[] = ByteToByteObj(_barray); System.arraycopy(I, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className .equals("java.lang.Integer")) { Integer I[] = ByteToInteger(_barray); System.arraycopy(I, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className .equals("java.lang.Short")) { Short I[] = ByteToShort(_barray); System.arraycopy(I, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className .equals("java.lang.Float")) { Float I[] = ByteToFloatObj(_barray); System.arraycopy(I, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className .equals("java.lang.Double")) { Double I[] = ByteToDoubleObj(_barray); System.arraycopy(I, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className.equals("java.lang.Long")) { Long I[] = ByteToLongObj(_barray); System.arraycopy(I, 0, _theArray, 0, ArrayDescriptor.dimlen[1]); return _theArray; } else { HDF5JavaException ex = new HDF5JavaException( "arrayify: Object type not implemented yet..."); throw (ex); } } else { HDF5JavaException ex = new HDF5JavaException( "arrayify: unknown type not implemented yet..."); throw (ex); } } catch (OutOfMemoryError err) { HDF5JavaException ex = new HDF5JavaException( "HDFArray: arrayify array too big?"); throw (ex); } } /* Assert dims >= 2 */ Object oo = _theArray; int n = 0; /* the current byte */ int index = 0; int i; while (n < ArrayDescriptor.totalSize) { oo = ArrayDescriptor.objs[0]; index = n / ArrayDescriptor.bytetoindex[0]; index %= ArrayDescriptor.dimlen[0]; for (i = 0; i < (ArrayDescriptor.dims); i++) { index = n / ArrayDescriptor.bytetoindex[i]; index %= ArrayDescriptor.dimlen[i]; if (index == ArrayDescriptor.currentindex[i]) { /* then use cached copy */ oo = ArrayDescriptor.objs[i]; } else { /* check range of index */ if (index > (ArrayDescriptor.dimlen[i] - 1)) { System.out.println("out of bounds?"); return null; } oo = java.lang.reflect.Array.get(oo, index); ArrayDescriptor.currentindex[i] = index; ArrayDescriptor.objs[i] = oo; } } /* array-ify */ try { if (ArrayDescriptor.NT == 'J') { long[] arow = HDFNativeData.byteToLong(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'I') { int[] arow = HDFNativeData.byteToInt(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'S') { short[] arow = HDFNativeData.byteToShort(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'B') { System.arraycopy(_barray, n, ArrayDescriptor.objs[ArrayDescriptor.dims - 1], 0, ArrayDescriptor.dimlen[ArrayDescriptor.dims]); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; } else if (ArrayDescriptor.NT == 'F') { float arow[] = HDFNativeData.byteToFloat(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'D') { double[] arow = HDFNativeData.byteToDouble(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'L') { if (ArrayDescriptor.className.equals("java.lang.Byte")) { Byte I[] = ByteToByteObj(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className .equals("java.lang.Integer")) { Integer I[] = ByteToInteger(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className .equals("java.lang.Short")) { Short I[] = ByteToShort(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className .equals("java.lang.Float")) { Float I[] = ByteToFloatObj(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className .equals("java.lang.Double")) { Double I[] = ByteToDoubleObj(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className.equals("java.lang.Long")) { Long I[] = ByteToLongObj(n, ArrayDescriptor.dimlen[ArrayDescriptor.dims], _barray); java.lang.reflect.Array .set( ArrayDescriptor.objs[ArrayDescriptor.dims - 2], (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else { HDF5JavaException ex = new HDF5JavaException( "HDFArray: unsupported Object type: " + ArrayDescriptor.NT); throw (ex); } } else { HDF5JavaException ex = new HDF5JavaException( "HDFArray: unknown or unsupported type: " + ArrayDescriptor.NT); throw (ex); } } catch (OutOfMemoryError err) { HDF5JavaException ex = new HDF5JavaException( "HDFArray: arrayify array too big?"); throw (ex); } } /* assert: the whole array is completed--currentindex should == len - 1 */ /* error checks */ if (n < ArrayDescriptor.totalSize) { throw new java.lang.InternalError(new String( "HDFArray::arrayify Panic didn't complete all input data: n= " + n + " size = " + ArrayDescriptor.totalSize)); } for (i = 0; i <= ArrayDescriptor.dims - 2; i++) { if (ArrayDescriptor.currentindex[i] != ArrayDescriptor.dimlen[i] - 1) { throw new java.lang.InternalError(new String( "HDFArray::arrayify Panic didn't complete all data: currentindex[" + i + "] = " + ArrayDescriptor.currentindex[i] + " (should be " + (ArrayDescriptor.dimlen[i] - 1) + "?")); } } if (ArrayDescriptor.NT != 'B') { if (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1] != ArrayDescriptor.dimlen[ArrayDescriptor.dims - 1]) { throw new java.lang.InternalError(new String( "HDFArray::arrayify Panic didn't complete all data: currentindex[" + i + "] = " + ArrayDescriptor.currentindex[i] + " (should be " + (ArrayDescriptor.dimlen[i]) + "?")); } } else { if (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1] != (ArrayDescriptor.dimlen[ArrayDescriptor.dims - 1] - 1)) { throw new java.lang.InternalError(new String( "HDFArray::arrayify Panic didn't complete all data: currentindex[" + i + "] = " + ArrayDescriptor.currentindex[i] + " (should be " + (ArrayDescriptor.dimlen[i] - 1) + "?")); } } return _theArray; } private byte[] IntegerToByte(Integer in[]) { int nelems = java.lang.reflect.Array.getLength(in); int[] out = new int[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].intValue(); } return HDFNativeData.intToByte(0, nelems, out); } private Integer[] ByteToInteger(byte[] bin) { int in[] = HDFNativeData.byteToInt(bin); int nelems = java.lang.reflect.Array.getLength(in); Integer[] out = new Integer[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Integer(in[i]); } return out; } private Integer[] ByteToInteger(int start, int len, byte[] bin) { int in[] = HDFNativeData.byteToInt(start, len, bin); int nelems = java.lang.reflect.Array.getLength(in); Integer[] out = new Integer[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Integer(in[i]); } return out; } private byte[] ShortToByte(Short in[]) { int nelems = java.lang.reflect.Array.getLength(in); short[] out = new short[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].shortValue(); } return HDFNativeData.shortToByte(0, nelems, out); } private Short[] ByteToShort(byte[] bin) { short in[] = HDFNativeData.byteToShort(bin); int nelems = java.lang.reflect.Array.getLength((Object) in); Short[] out = new Short[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Short(in[i]); } return out; } private Short[] ByteToShort(int start, int len, byte[] bin) { short in[] = (short[]) HDFNativeData.byteToShort(start, len, bin); int nelems = java.lang.reflect.Array.getLength((Object) in); Short[] out = new Short[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Short(in[i]); } return out; } private byte[] ByteObjToByte(Byte in[]) { int nelems = java.lang.reflect.Array.getLength((Object) in); byte[] out = new byte[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].byteValue(); } return out; } private Byte[] ByteToByteObj(byte[] bin) { int nelems = java.lang.reflect.Array.getLength((Object) bin); Byte[] out = new Byte[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Byte(bin[i]); } return out; } private Byte[] ByteToByteObj(int start, int len, byte[] bin) { Byte[] out = new Byte[len]; for (int i = 0; i < len; i++) { out[i] = new Byte(bin[i]); } return out; } private byte[] FloatObjToByte(Float in[]) { int nelems = java.lang.reflect.Array.getLength((Object) in); float[] out = new float[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].floatValue(); } return HDFNativeData.floatToByte(0, nelems, out); } private Float[] ByteToFloatObj(byte[] bin) { float in[] = (float[]) HDFNativeData.byteToFloat(bin); int nelems = java.lang.reflect.Array.getLength((Object) in); Float[] out = new Float[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Float(in[i]); } return out; } private Float[] ByteToFloatObj(int start, int len, byte[] bin) { float in[] = (float[]) HDFNativeData.byteToFloat(start, len, bin); int nelems = java.lang.reflect.Array.getLength((Object) in); Float[] out = new Float[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Float(in[i]); } return out; } private byte[] DoubleObjToByte(Double in[]) { int nelems = java.lang.reflect.Array.getLength((Object) in); double[] out = new double[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].doubleValue(); } return HDFNativeData.doubleToByte(0, nelems, out); } private Double[] ByteToDoubleObj(byte[] bin) { double in[] = (double[]) HDFNativeData.byteToDouble(bin); int nelems = java.lang.reflect.Array.getLength((Object) in); Double[] out = new Double[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Double(in[i]); } return out; } private Double[] ByteToDoubleObj(int start, int len, byte[] bin) { double in[] = (double[]) HDFNativeData.byteToDouble(start, len, bin); int nelems = java.lang.reflect.Array.getLength((Object) in); Double[] out = new Double[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Double(in[i]); } return out; } private byte[] LongObjToByte(Long in[]) { int nelems = java.lang.reflect.Array.getLength((Object) in); long[] out = new long[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].longValue(); } return HDFNativeData.longToByte(0, nelems, out); } private Long[] ByteToLongObj(byte[] bin) { long in[] = (long[]) HDFNativeData.byteToLong(bin); int nelems = java.lang.reflect.Array.getLength((Object) in); Long[] out = new Long[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Long(in[i]); } return out; } private Long[] ByteToLongObj(int start, int len, byte[] bin) { long in[] = (long[]) HDFNativeData.byteToLong(start, len, bin); int nelems = java.lang.reflect.Array.getLength((Object) in); Long[] out = new Long[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Long(in[i]); } return out; } } /** * This private class is used by HDFArray to discover the shape and type of an * arbitrary array. *

    * We use java.lang.reflection here. */ class ArrayDescriptor { static String theType = ""; static Class theClass = null; static int[] dimlen = null; static int[] dimstart = null; static int[] currentindex = null; static int[] bytetoindex = null; static int totalSize = 0; static Object[] objs = null; static char NT = ' '; /* must be B,S,I,L,F,D, else error */ static int NTsize = 0; static int dims = 0; static String className; public ArrayDescriptor(Object anArray) throws HDF5Exception { Class tc = anArray.getClass(); if (tc.isArray() == false) { /* exception: not an array */ HDF5Exception ex = new HDF5JavaException( "ArrayDescriptor: not an array?: "); throw (ex); } theClass = tc; /* * parse the type descriptor to discover the shape of the array */ String ss = tc.toString(); theType = ss; int n = 6; dims = 0; char c = ' '; while (n < ss.length()) { c = ss.charAt(n); n++; if (c == '[') { dims++; } } String css = ss.substring(ss.lastIndexOf('[') + 1); Class compC = tc.getComponentType(); String cs = compC.toString(); NT = c; /* must be B,S,I,L,F,D, else error */ if (NT == 'B') { NTsize = 1; } else if (NT == 'S') { NTsize = 2; } else if ((NT == 'I') || (NT == 'F')) { NTsize = 4; } else if ((NT == 'J') || (NT == 'D')) { NTsize = 8; } else if (css.startsWith("Ljava.lang.Byte")) { NT = 'L'; className = "java.lang.Byte"; NTsize = 1; } else if (css.startsWith("Ljava.lang.Short")) { NT = 'L'; className = "java.lang.Short"; NTsize = 2; } else if (css.startsWith("Ljava.lang.Integer")) { NT = 'L'; className = "java.lang.Integer"; NTsize = 4; } else if (css.startsWith("Ljava.lang.Float")) { NT = 'L'; className = "java.lang.Float"; NTsize = 4; } else if (css.startsWith("Ljava.lang.Double")) { NT = 'L'; className = "java.lang.Double"; NTsize = 8; } else if (css.startsWith("Ljava.lang.Long")) { NT = 'L'; className = "java.lang.Long"; NTsize = 8; } else if (css.startsWith("Ljava.lang.String")) { throw new HDF5JavaException(new String( "ArrayDesciptor: Error: String array not supported yet")); } else { /* * exception: not a numeric type */ throw new HDF5JavaException(new String( "ArrayDesciptor: Error: array is not numeric (type is " + css + ") ?")); } /* fill in the table */ dimlen = new int[dims + 1]; dimstart = new int[dims + 1]; currentindex = new int[dims + 1]; bytetoindex = new int[dims + 1]; objs = new Object[dims + 1]; Object o = anArray; objs[0] = o; dimlen[0] = 1; dimstart[0] = 0; currentindex[0] = 0; int i; for (i = 1; i <= dims; i++) { dimlen[i] = java.lang.reflect.Array.getLength((Object) o); o = java.lang.reflect.Array.get((Object) o, 0); objs[i] = o; dimstart[i] = 0; currentindex[i] = 0; } int j; int dd; bytetoindex[dims] = NTsize; for (i = dims; i >= 0; i--) { dd = NTsize; for (j = i; j < dims; j++) { dd *= dimlen[j + 1]; } bytetoindex[i] = dd; } totalSize = bytetoindex[0]; } /** * Debug dump */ public void dumpInfo() { System.out.println("Type: " + theType); System.out.println("Class: " + theClass); System.out.println("NT: " + NT + " NTsize: " + NTsize); System.out.println("Array has " + dims + " dimensions (" + totalSize + " bytes)"); int i; for (i = 0; i <= dims; i++) { Class tc = objs[i].getClass(); String ss = tc.toString(); System.out.println(i + ": start " + dimstart[i] + ": len " + dimlen[i] + " current " + currentindex[i] + " bytetoindex " + bytetoindex[i] + " object " + objs[i] + " otype " + ss); } } } jhdf-2.9/ncsa/hdf/hdf5lib/HDFNativeData.java0000755000175000017500000003576112050301064021376 0ustar sylvestresylvestre/**************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.hdf5lib; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5JavaException; /** * This class encapsulates native methods to deal with arrays of numbers, * converting from numbers to bytes and bytes to numbers. *

    * These routines are used by class HDFArray to pass data to and from the * HDF-5 library. *

    * Methods xxxToByte() convert a Java array of primitive numbers (int, short, * ...) to a Java array of bytes. Methods byteToXxx() convert from a Java array * of bytes into a Java array of primitive numbers (int, short, ...) *

    * Variant interfaces convert a section of an array, and also can convert to * sub-classes of Java Number. *

    * See also: ncsa.hdf.hdf5lib.HDFArray. */ public class HDFNativeData { static { int plist = HDF5Constants.H5P_DEFAULT; int[] version_info = new int[4]; try { H5.H5Pget_version(plist, version_info); } catch (Exception ex) { } } /** * Convert an array of bytes into an array of ints * * @param data * The input array of bytes * @return an array of int */ public synchronized static native int[] byteToInt(byte[] data); /** * Convert an array of bytes into an array of floats * * @param data * The input array of bytes * @return an array of float */ public synchronized static native float[] byteToFloat(byte[] data); /** * Convert an array of bytes into an array of shorts * * @param data * The input array of bytes * @return an array of short */ public synchronized static native short[] byteToShort(byte[] data); /** * Convert an array of bytes into an array of long * * @param data * The input array of bytes * @return an array of long */ /* * does this really work? C 'long' is 32 bits, Java 'long' is 64-bits. What * does this routine actually do? */ public synchronized static native long[] byteToLong(byte[] data); /** * Convert an array of bytes into an array of double * * @param data * The input array of bytes * @return an array of double */ public synchronized static native double[] byteToDouble(byte[] data); /** * Convert a range from an array of bytes into an array of int * * @param start * The position in the input array of bytes to start * @param len * The number of 'int' to convert * @param data * The input array of bytes * @return an array of 'len' int */ public synchronized static native int[] byteToInt(int start, int len, byte[] data); /** * Convert 4 bytes from an array of bytes into a single int * * @param start * The position in the input array of bytes to start * @param data * The input array of bytes * @return The integer value of the bytes. */ public synchronized static int byteToInt(byte[] data, int start) { int[] ival = new int[1]; ival = byteToInt(start, 1, data); return (ival[0]); } /** * Convert a range from an array of bytes into an array of short * * @param start * The position in the input array of bytes to start * @param len * The number of 'short' to convert * @param data * The input array of bytes * @return an array of 'len' short */ public synchronized static native short[] byteToShort(int start, int len, byte[] data); /** * Convert 2 bytes from an array of bytes into a single short * * @param start * The position in the input array of bytes to start * @param data * The input array of bytes * @return The short value of the bytes. */ public synchronized static short byteToShort(byte[] data, int start) { short[] sval = new short[1]; sval = byteToShort(start, 1, data); return (sval[0]); } /** * Convert a range from an array of bytes into an array of float * * @param start * The position in the input array of bytes to start * @param len * The number of 'float' to convert * @param data * The input array of bytes * @return an array of 'len' float */ public synchronized static native float[] byteToFloat(int start, int len, byte[] data); /** * Convert 4 bytes from an array of bytes into a single float * * @param start * The position in the input array of bytes to start * @param data * The input array of bytes * @return The float value of the bytes. */ public synchronized static float byteToFloat(byte[] data, int start) { float[] fval = new float[1]; fval = byteToFloat(start, 1, data); return (fval[0]); } /** * Convert a range from an array of bytes into an array of long * * @param start * The position in the input array of bytes to start * @param len * The number of 'long' to convert * @param data * The input array of bytes * @return an array of 'len' long */ public synchronized static native long[] byteToLong(int start, int len, byte[] data); /** * Convert 8 bytes from an array of bytes into a single long * * @param start * The position in the input array of bytes to start * @param data * The input array of bytes * @return The long value of the bytes. */ public synchronized static long byteToLong(byte[] data, int start) { long[] lval = new long[1]; lval = byteToLong(start, 1, data); return (lval[0]); } /** * Convert a range from an array of bytes into an array of double * * @param start * The position in the input array of bytes to start * @param len * The number of 'double' to convert * @param data * The input array of bytes * @return an array of 'len' double */ public synchronized static native double[] byteToDouble(int start, int len, byte[] data); /** * Convert 8 bytes from an array of bytes into a single double * * @param start * The position in the input array of bytes to start * @param data * The input array of bytes * @return The double value of the bytes. */ public synchronized static double byteToDouble(byte[] data, int start) { double[] dval = new double[1]; dval = byteToDouble(start, 1, data); return (dval[0]); } /** * Convert a range from an array of int into an array of bytes. * * @param start * The position in the input array of int to start * @param len * The number of 'int' to convert * @param data * The input array of int * @return an array of bytes */ public synchronized static native byte[] intToByte(int start, int len, int[] data); /** * Convert a range from an array of short into an array of bytes. * * @param start * The position in the input array of int to start * @param len * The number of 'short' to convert * @param data * The input array of short * @return an array of bytes */ public synchronized static native byte[] shortToByte(int start, int len, short[] data); /** * Convert a range from an array of float into an array of bytes. * * @param start * The position in the input array of int to start * @param len * The number of 'float' to convert * @param data * The input array of float * @return an array of bytes */ public synchronized static native byte[] floatToByte(int start, int len, float[] data); /** * Convert a range from an array of long into an array of bytes. * * @param start * The position in the input array of int to start * @param len * The number of 'long' to convert * @param data * The input array of long * @return an array of bytes */ public synchronized static native byte[] longToByte(int start, int len, long[] data); /** * Convert a range from an array of double into an array of bytes. * * @param start * The position in the input array of double to start * @param len * The number of 'double' to convert * @param data * The input array of double * @return an array of bytes */ public synchronized static native byte[] doubleToByte(int start, int len, double[] data); /** * Convert a single byte into an array of one byte. *

    * (This is a trivial method.) * * @param data * The input byte * @return an array of bytes */ public synchronized static native byte[] byteToByte(byte data); /** * Convert a single Byte object into an array of one byte. *

    * (This is an almost trivial method.) * * @param data * The input Byte * @return an array of bytes */ public synchronized static byte[] byteToByte(Byte data) { return byteToByte(data.byteValue()); } /** * Convert a single int into an array of 4 bytes. * * @param data * The input int * @return an array of bytes */ public synchronized static native byte[] intToByte(int data); /** * Convert a single Integer object into an array of 4 bytes. * * @param data * The input Integer * @return an array of bytes */ public synchronized static byte[] intToByte(Integer data) { return intToByte(data.intValue()); } /** * Convert a single short into an array of 2 bytes. * * @param data * The input short * @return an array of bytes */ public synchronized static native byte[] shortToByte(short data); /** * Convert a single Short object into an array of 2 bytes. * * @param data * The input Short * @return an array of bytes */ public synchronized static byte[] shortToByte(Short data) { return shortToByte(data.shortValue()); } /** * Convert a single float into an array of 4 bytes. * * @param data * The input float * @return an array of bytes */ public synchronized static native byte[] floatToByte(float data); /** * Convert a single Float object into an array of 4 bytes. * * @param data * The input Float * @return an array of bytes */ public synchronized static byte[] floatToByte(Float data) { return floatToByte(data.floatValue()); }; /** * Convert a single long into an array of 8 bytes. * * @param data * The input long * @return an array of bytes */ public synchronized static native byte[] longToByte(long data); /** * Convert a single Long object into an array of 8 bytes. * * @param data * The input Long * @return an array of bytes */ public synchronized static byte[] longToByte(Long data) { return longToByte(data.longValue()); } /** * Convert a single double into an array of 8 bytes. * * @param data * The input double * @return an array of bytes */ public synchronized static native byte[] doubleToByte(double data); /** * Convert a single Double object into an array of 8 bytes. * * @param data * The input Double * @return an array of bytes */ public synchronized static byte[] doubleToByte(Double data) { return doubleToByte(data.doubleValue()); } /** * Create a Number object from an array of bytes. * * @param barray * The bytes to be converted * @param obj * Input object of the desired output class. Must be a sub-class * of Number. * @return A Object of the type of obj. */ public synchronized static Object byteToNumber(byte[] barray, Object obj) throws HDF5Exception { Class theClass = obj.getClass(); String type = theClass.getName(); Object retobj = null; if (type.equals("java.lang.Integer")) { int[] i = ncsa.hdf.hdf5lib.HDFNativeData.byteToInt(0, 1, barray); retobj = new Integer(i[0]); } else if (type.equals("java.lang.Byte")) { retobj = new Byte(barray[0]); } else if (type.equals("java.lang.Short")) { short[] f = ncsa.hdf.hdf5lib.HDFNativeData .byteToShort(0, 1, barray); retobj = new Short(f[0]); } else if (type.equals("java.lang.Float")) { float[] f = ncsa.hdf.hdf5lib.HDFNativeData .byteToFloat(0, 1, barray); retobj = new Float(f[0]); } else if (type.equals("java.lang.Long")) { long[] f = ncsa.hdf.hdf5lib.HDFNativeData.byteToLong(0, 1, barray); retobj = new Long(f[0]); } else if (type.equals("java.lang.Double")) { double[] f = ncsa.hdf.hdf5lib.HDFNativeData.byteToDouble(0, 1, barray); retobj = new Double(f[0]); } else { /* exception: unsupported type */ HDF5Exception ex = new HDF5JavaException( "byteToNumber: setfield bad type: " + obj + " " + type); throw (ex); } return (retobj); } } jhdf-2.9/ncsa/hdf/hdf5lib/H5.java0000755000175000017500000123406312050301064017305 0ustar sylvestresylvestre/**************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.hdf5lib; import java.io.File; import java.nio.ByteBuffer; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; import ncsa.hdf.hdf5lib.callbacks.H5D_iterate_cb; import ncsa.hdf.hdf5lib.callbacks.H5D_iterate_t; import ncsa.hdf.hdf5lib.callbacks.H5L_iterate_cb; import ncsa.hdf.hdf5lib.callbacks.H5L_iterate_t; import ncsa.hdf.hdf5lib.callbacks.H5O_iterate_cb; import ncsa.hdf.hdf5lib.callbacks.H5O_iterate_t; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5JavaException; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5AC_cache_config_t; import ncsa.hdf.hdf5lib.structs.H5A_info_t; import ncsa.hdf.hdf5lib.structs.H5G_info_t; import ncsa.hdf.hdf5lib.structs.H5L_info_t; import ncsa.hdf.hdf5lib.structs.H5O_info_t; /** * This class is the Java interface for the HDF5 library. *

    * This code is the called by Java programs to access the entry points of the * HDF5 library. Each routine wraps a single HDF5 entry point, generally * with the arguments and return codes analogous to the C interface. *

    * For details of the HDF5 library, see the HDF5 Documentation at: http://hdfgroup.org/HDF5/ *


    *

    * Mapping of arguments for Java * *

    * In general, arguments to the HDF Java API are straightforward translations * from the 'C' API described in the HDF Reference Manual. *

    * *

    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    HDF-5 C types to Java types
    HDF-5Java
    H5T_NATIVE_INTint, Integer
    H5T_NATIVE_SHORTshort, Short
    H5T_NATIVE_FLOATfloat, Float
    H5T_NATIVE_DOUBLEdouble, Double
    H5T_NATIVE_CHARbyte, Byte
    H5T_C_S1java.lang.String
    void *
    * (i.e., pointer to `Any')
    Special -- see HDFArray
    *
    *

    *

    General Rules for Passing Arguments and Results
    *

    * In general, arguments passed IN to Java are the analogous basic types, * as above. The exception is for arrays, which are discussed below. *

    * The return value of Java methods is also the analogous type, as above. * A major exception to that rule is that all HDF functions that return * SUCCEED/FAIL are declared boolean in the Java version, rather than * int as in the C. Functions that return a value or else FAIL are * declared the equivalent to the C function. However, in most cases the Java * method will raise an exception instead of returning an error code. See Errors and Exceptions below. *

    * Java does not support pass by reference of arguments, so arguments that are * returned through OUT parameters must be wrapped in an object or array. * The Java API for HDF consistently wraps arguments in arrays. *

    * For instance, a function that returns two integers is declared: *

    * *

     *       h_err_t HDF5dummy( int *a1, int *a2)
     * 
    * * For the Java interface, this would be declared: *

    * *

     * public synchronized static native int HDF5dummy(int args[]);
     * 
    * * where a1 is args[0] and a2 is args[1], and would * be invoked: *

    * *

     * H5.HDF5dummy(a);
     * 
    * *

    * All the routines where this convention is used will have specific * documentation of the details, given below. *

    * Arrays *

    * HDF5 needs to read and write multi-dimensional arrays of any number type (and * records). The HDF5 API describes the layout of the source and destination, * and the data for the array passed as a block of bytes, for instance, *

    * *

     *      herr_t H5Dread(int fid, int filetype, int memtype, int memspace,
     *      void * data);
     * 
    * *

    * where ``void *'' means that the data may be any valid numeric type, and is a * contiguous block of bytes that is the data for a multi-dimensional array. The * other parameters describe the dimensions, rank, and datatype of the array on * disk (source) and in memory (destination). *

    * For Java, this ``ANY'' is a problem, as the type of data must always be * declared. Furthermore, multidimensional arrays are definitely not * layed out contiguously in memory. It would be infeasible to declare a * separate routine for every combination of number type and dimensionality. For * that reason, the HDFArray class is used to * discover the type, shape, and size of the data array at run time, and to * convert to and from a contiguous array of bytes in synchronized static native * C order. *

    * The upshot is that any Java array of numbers (either primitive or sub-classes * of type Number) can be passed as an ``Object'', and the Java API will * translate to and from the appropriate packed array of bytes needed by the C * library. So the function above would be declared: *

    * *

     * public synchronized static native int H5Dread(int fid, int filetype,
     *         int memtype, int memspace, Object data);
     * 
    * * and the parameter data can be any multi-dimensional array of numbers, * such as float[][], or int[][][], or Double[][]. *

    * HDF-5 Constants *

    * The HDF-5 API defines a set of constants and enumerated values. Most of these * values are available to Java programs via the class HDF5Constants. For * example, the parameters for the h5open() call include two numeric values, * HDFConstants.H5F_ACC_RDWR and * HDF5Constants.H5P_DEFAULT. As would be expected, these numbers * correspond to the C constants H5F_ACC_RDWR and * H5P_DEFAULT. *

    * The HDF-5 API defines a set of values that describe number types and sizes, * such as "H5T_NATIVE_INT" and "hsize_t". These values are determined at run * time by the HDF-5 C library. To support these parameters, the Java class HDF5CDataTypes * looks up the values when initiated. The values can be accessed as public * variables of the Java class, such as: * *

     * int data_type = HDF5CDataTypes.JH5T_NATIVE_INT;
     * 
    * * The Java application uses both types of constants the same way, the only * difference is that the HDF5CDataTypes may have different values * on different platforms. *

    * Error handling and Exceptions *

    * The HDF5 error API (H5E) manages the behavior of the error stack in the HDF-5 * library. This API is omitted from the JHI5. Errors are converted into Java * exceptions. This is totally different from the C interface, but is very * natural for Java programming. *

    * The exceptions of the JHI5 are organized as sub-classes of the class * HDF5Exception. There are two subclasses of HDF5Exception, * * HDF5LibraryException and * HDF5JavaException. The sub-classes of the former represent errors * from the HDF-5 C library, while sub-classes of the latter represent errors in * the JHI5 wrapper and support code. *

    * The super-class HDF5LibraryException implements the method * 'printStackTrace()', which prints out the HDF-5 error stack, as * described in the HDF-5 C API H5Eprint(). This may be used by * Java exception handlers to print out the HDF-5 error stack. *


    * * @version HDF5 1.2
    * See also: * ncsa.hdf.hdf5lib.HDFArray
    * * ncsa.hdf.hdf5lib.HDF5Constants
    * * ncsa.hdf.hdf5lib.HDF5CDataTypes
    * * ncsa.hdf.hdf5lib.HDF5Exception
    *
    * http://hdfgroup.org/HDF5" **/ public class H5 implements java.io.Serializable { /** * */ private static final long serialVersionUID = 6129888282117053288L; /** * The version number of the HDF5 library:
    * LIB_VERSION[0]: The major version of the library.
    * LIB_VERSION[1]: The minor version of the library.
    * LIB_VERSION[2]: The release number of the library.
    * * Make sure to update the verions number when a different library is used. */ public final static int LIB_VERSION[] = { 1, 8, 10 }; public final static String H5PATH_PROPERTY_KEY = "ncsa.hdf.hdf5lib.H5.hdf5lib"; // add system property to load library by name from library path, via // System.loadLibrary() public final static String H5_LIBRARY_NAME_PROPERTY_KEY = "ncsa.hdf.hdf5lib.H5.loadLibraryName"; /** logging level: 0 -- information, 1 -- warning message, 2 -- failure */ public static int LOGGING_LEVEL = 2; private static Logger s_logger; private static String s_libraryName; private static boolean isLibraryLoaded = false; private final static boolean IS_CRITICAL_PINNING = true; private final static Vector OPEN_IDS = new Vector(); static { loadH5Lib(); } public static void loadH5Lib() { // Make sure that the library is loaded only once if (isLibraryLoaded) return; // use default logger, since spanning sources s_logger = Logger.getLogger("ncsa.hdf.hdf5lib"); if (LOGGING_LEVEL == 2) s_logger.setLevel(Level.SEVERE); else if (LOGGING_LEVEL == 1) s_logger.setLevel(Level.WARNING); else s_logger.setLevel(Level.INFO); // first try loading library by name from user supplied library path s_libraryName = System.getProperty(H5_LIBRARY_NAME_PROPERTY_KEY, null); String mappedName = null; if ((s_libraryName != null) && (s_libraryName.length() > 0)) { try { mappedName = System.mapLibraryName(s_libraryName); System.loadLibrary(s_libraryName); isLibraryLoaded = true; } catch (Throwable err) { err.printStackTrace(); isLibraryLoaded = false; } finally { s_logger.log(Level.INFO, "HDF5 library: " + s_libraryName + " resolved to: " + mappedName + "; " + (isLibraryLoaded ? "" : " NOT") + " successfully loaded from java.library.path"); } } if (!isLibraryLoaded) { // else try loading library via full path String filename = System.getProperty(H5PATH_PROPERTY_KEY, null); if ((filename != null) && (filename.length() > 0)) { File h5dll = new File(filename); if (h5dll.exists() && h5dll.canRead() && h5dll.isFile()) { try { System.load(filename); isLibraryLoaded = true; } catch (Throwable err) { err.printStackTrace(); isLibraryLoaded = false; } finally { s_logger.log(Level.INFO, "HDF5 library: " + filename + (isLibraryLoaded ? "" : " NOT") + " successfully loaded."); } } else { isLibraryLoaded = false; throw (new UnsatisfiedLinkError("Invalid HDF5 library, " + filename)); } } } // else load standard library if (!isLibraryLoaded) { try { s_libraryName = "jhdf5"; mappedName = System.mapLibraryName(s_libraryName); System.loadLibrary("jhdf5"); isLibraryLoaded = true; } catch (Throwable err) { err.printStackTrace(); isLibraryLoaded = false; } finally { s_logger.log(Level.INFO, "HDF5 library: " + s_libraryName + " resolved to: " + mappedName + "; " + (isLibraryLoaded ? "" : " NOT") + " successfully loaded from java.library.path"); } } /* Important! Exit quietly */ try { H5.H5dont_atexit(); } catch (HDF5LibraryException e) { System.exit(1); } /* Important! Disable error output to C stdout */ H5.H5error_off(); /* * Optional: confirm the version This will crash immediately if not the * specified version. */ Integer majnum = Integer .getInteger("ncsa.hdf.hdf5lib.H5.hdf5maj", null); Integer minnum = Integer .getInteger("ncsa.hdf.hdf5lib.H5.hdf5min", null); Integer relnum = Integer .getInteger("ncsa.hdf.hdf5lib.H5.hdf5rel", null); if ((majnum != null) && (minnum != null) && (relnum != null)) { H5.H5check_version(majnum.intValue(), minnum.intValue(), relnum .intValue()); } } // //////////////////////////////////////////////////////////// // // // H5: General Library Functions // // // // //////////////////////////////////////////////////////////// /** * Get number of open IDs. */ public final static int getOpenIDCount() { return OPEN_IDS.size(); } /** * Get the open ID at the specified index. * * @param index -- an index of the open ID. * @return Returns the open ID at the specified index. */ public final static int getOpenID(int index) { int id = -1; if (index >= 0 && index < OPEN_IDS.size()) id = OPEN_IDS.elementAt(index); return id; } /** * H5check_version verifies that the arguments match the version numbers * compiled into the library. * * @param majnum * The major version of the library. * @param minnum * The minor version of the library. * @param relnum * The release number of the library. * @return a non-negative value if successful. Upon failure (when the * versions do not match), this function causes the application to * abort (i.e., crash) * * See C API function: herr_t H5check_version() **/ public synchronized static native int H5check_version(int majnum, int minnum, int relnum); /** * H5close flushes all data to disk, closes all file identifiers, and cleans * up all memory used by the library. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5close() throws HDF5LibraryException; /** * H5open initialize the library. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5open() throws HDF5LibraryException; /** * H5dont_atexit indicates to the library that an atexit() cleanup routine * should not be installed. In order to be effective, this routine must be * called before any other HDF function calls, and must be called each time * the library is loaded/linked into the application (the first time and * after it's been un-loaded). *

    * This is called by the static initializer, so this should never need to be * explicitly called by a Java program. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ private synchronized static native int H5dont_atexit() throws HDF5LibraryException; /** * Turn off error handling By default, the C library prints the error stack * of the HDF-5 C library on stdout. This behavior may be disabled by * calling H5error_off(). */ public synchronized static native int H5error_off(); /** * H5garbage_collect collects on all free-lists of all types. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5garbage_collect() throws HDF5LibraryException; /** * H5get_libversion retrieves the major, minor, and release numbers of the * version of the HDF library which is linked to the application. * * @param libversion * The version information of the HDF library. * *

     *      libversion[0] = The major version of the library.
     *      libversion[1] = The minor version of the library.
     *      libversion[2] = The release number of the library.
     * 
    * @return a non-negative value if successful, along with the version * information. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5get_libversion(int[] libversion) throws HDF5LibraryException; public synchronized static native int H5set_free_list_limits( int reg_global_lim, int reg_list_lim, int arr_global_lim, int arr_list_lim, int blk_global_lim, int blk_list_lim) throws HDF5LibraryException; ////////////////////////////////////////////////////////////// //// //H5A: HDF5 1.8 Attribute Interface API Functions // //// ////////////////////////////////////////////////////////////// /** * H5Aclose terminates access to the attribute specified by its identifier, * attr_id. * * @param attr_id * IN: Attribute to release access to. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Aclose(int attr_id) throws HDF5LibraryException { if (attr_id < 0) throw new HDF5LibraryException("Negative ID");; OPEN_IDS.removeElement(attr_id); return _H5Aclose(attr_id); } private synchronized static native int _H5Aclose(int attr_id) throws HDF5LibraryException; /** * H5Acopy copies the content of one attribute to another. * * @param src_aid * the identifier of the source attribute * @param dst_aid * the identifier of the destinaiton attribute */ public synchronized static native int H5Acopy(int src_aid, int dst_aid) throws HDF5LibraryException; /** * H5Acreate creates an attribute which is attached to the object specified * with loc_id. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Acreate( int, String, int, int, int, int) } * * @param loc_id * IN: Object (dataset, group, or named datatype) to be attached * to. * @param name * IN: Name of attribute to create. * @param type_id * IN: Identifier of datatype for attribute. * @param space_id * IN: Identifier of dataspace for attribute. * @param create_plist * IN: Identifier of creation property list (currently not used). * * @return an attribute identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ @Deprecated public static int H5Acreate(int loc_id, String name, int type_id, int space_id, int create_plist) throws HDF5LibraryException, NullPointerException { int id = _H5Acreate(loc_id, name, type_id, space_id, create_plist); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Acreate(int loc_id, String name, int type_id, int space_id, int create_plist) throws HDF5LibraryException, NullPointerException; /** * H5Acreate creates an attribute, attr_name, which is attached to the object specified by the identifier loc_id. * * @param loc_id IN: Location or object identifier; may be dataset or group * @param attr_name IN: Attribute name * @param type_id IN: Attribute datatype identifier * @param space_id IN: Attribute dataspace identifier * @param acpl_id IN: Attribute creation property list identifier * @param aapl_id IN: Attribute access property list identifier * * @return An attribute identifier if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - Name is null. **/ public static int H5Acreate( int loc_id, String attr_name, int type_id, int space_id, int acpl_id, int aapl_id ) throws HDF5LibraryException, NullPointerException { int id = _H5Acreate2(loc_id, attr_name, type_id, space_id, acpl_id, aapl_id ); if (id > 0) OPEN_IDS.addElement(id); return id; } /** * H5Acreate2 an attribute, attr_name, which is attached to the object * specified by the identifier loc_id. * * @see public static int H5Acreate( int loc_id, String attr_name, int * type_id, int space_id, int acpl_id, int aapl_id ) **/ private synchronized static native int _H5Acreate2( int loc_id, String attr_name, int type_id, int space_id, int acpl_id, int aapl_id ) throws HDF5LibraryException, NullPointerException; /** * H5Acreate_by_name creates an attribute, attr_name, which is attached to the object specified by loc_id and obj_name. * * @param loc_id IN: Location or object identifier; may be dataset or group * @param obj_name IN: Name, relative to loc_id, of object that attribute is to be attached to * @param attr_name IN: Attribute name * @param type_id IN: Attribute datatype identifier * @param space_id IN: Attribute dataspace identifier * @param acpl_id IN: Attribute creation property list identifier (currently not used). * @param aapl_id IN: Attribute access property list identifier (currently not used). * @param lapl_id IN: Link access property list * * @return An attribute identifier if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public static int H5Acreate_by_name(int loc_id, String obj_name, String attr_name, int type_id, int space_id, int acpl_id, int aapl_id, int lapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Acreate_by_name(loc_id, obj_name, attr_name, type_id, space_id, acpl_id, aapl_id, lapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Acreate_by_name(int loc_id, String obj_name, String attr_name, int type_id, int space_id, int acpl_id, int aapl_id, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Adelete removes the attribute specified by its name, name, from a * dataset, group, or named datatype. * * @param loc_id * IN: Identifier of the dataset, group, or named datatype. * @param name * IN: Name of the attribute to delete. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native int H5Adelete(int loc_id, String name) throws HDF5LibraryException, NullPointerException; /** * H5Adelete_by_idx removes an attribute, specified by its location in an index, from an object. * * @param loc_id IN: Location or object identifier; may be dataset or group * @param obj_name IN: Name of object, relative to location, from which attribute is to be removed * @param idx_type IN: Type of index * @param order IN: Order in which to iterate over index * @param n IN: Offset within index * @param lapl_id IN: Link access property list identifier * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - obj_name is null. **/ public synchronized static native void H5Adelete_by_idx(int loc_id, String obj_name, int idx_type, int order, long n, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Adelete_by_name removes the attribute attr_name from an object specified by location and name, loc_id and obj_name, respectively. * * @param loc_id IN: Location or object identifier; may be dataset or group * @param obj_name IN: Name of object, relative to location, from which attribute is to be removed * @param attr_name IN: Name of attribute to delete * @param lapl_id IN: Link access property list identifier. * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native int H5Adelete_by_name(int loc_id, String obj_name, String attr_name, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Aexists determines whether the attribute attr_name exists on the object specified by obj_id. * * @param obj_id IN: Object identifier. * @param attr_name IN: Name of the attribute. * * @return boolean true if an attribute with a given name exists. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - attr_name is null. **/ public synchronized static native boolean H5Aexists(int obj_id, String attr_name) throws HDF5LibraryException, NullPointerException; /** * H5Aexists_by_name determines whether the attribute attr_name exists on an object. That object is specified by its location and name, * loc_id and obj_name, respectively. * * @param loc_id IN: Location of object to which attribute is attached . * @param obj_name IN: Name, relative to loc_id, of object that attribute is attached to. * @param attr_name IN: Name of attribute. * @param lapl_id IN: Link access property list identifier. * * @return boolean true if an attribute with a given name exists, otherwise returns false. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native boolean H5Aexists_by_name(int obj_id, String obj_name, String attr_name, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Aget_info retrieves attribute information, by attribute identifier. * * @param attr_id IN: Attribute identifier * * @return A buffer(H5A_info_t) for Attribute information * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native H5A_info_t H5Aget_info(int attr_id) throws HDF5LibraryException; /** * H5Aget_info_by_idx Retrieves attribute information, by attribute index position. * * @param loc_id IN: Location of object to which attribute is attached * @param obj_name IN: Name of object to which attribute is attached, relative to location * @param idx_type IN: Type of index * @param order IN: Index traversal order * @param n IN: Attribute's position in index * @param lapl_id IN: Link access property list * * @return A buffer(H5A_info_t) for Attribute information * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - obj_name is null. **/ public synchronized static native H5A_info_t H5Aget_info_by_idx(int loc_id, String obj_name, int idx_type, int order, long n, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Aget_info_by_name Retrieves attribute information, by attribute name. * * @param loc_id IN: Location of object to which attribute is attached * @param obj_name IN: Name of object to which attribute is attached, relative to location * @param attr_name IN: Attribute name * @param lapl_id IN: Link access property list * * @return A buffer(H5A_info_t) for Attribute information * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - obj_name is null. **/ public synchronized static native H5A_info_t H5Aget_info_by_name(int loc_id, String obj_name, String attr_name, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Aget_name retrieves the name of an attribute specified by the * identifier, attr_id. * * @param attr_id * IN: Identifier of the attribute. * @param buf_size * IN: The size of the buffer to store the name in. * @param name * OUT: Buffer to store name in. * * @exception ArrayIndexOutOfBoundsException * JNI error writing back array * @exception ArrayStoreException * JNI error writing back array * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. * @exception IllegalArgumentException * - bub_size <= 0. * * @return the length of the attribute's name if successful. **/ public synchronized static native long H5Aget_name(int attr_id, long buf_size, String[] name) throws ArrayIndexOutOfBoundsException, ArrayStoreException, HDF5LibraryException, NullPointerException, IllegalArgumentException; public static long H5Aget_name(int attr_id, String[] name) throws ArrayIndexOutOfBoundsException, ArrayStoreException, HDF5LibraryException, NullPointerException, IllegalArgumentException { long len = H5Aget_name(attr_id, 0, null); return H5Aget_name(attr_id, len+1, name); } /** * H5Aget_name_by_idx retrieves the name of an attribute that is attached to an object, which is specified by its location and name, * loc_id and obj_name, respectively. * * @param attr_id IN: Attribute identifier * @param obj_name IN: Name of object to which attribute is attached, relative to location * @param idx_type IN: Type of index * @param order IN: Index traversal order * @param n IN: Attribute's position in index * @param lapl_id IN: Link access property list * * @return String for Attribute name. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - obj_name is null. **/ public synchronized static native String H5Aget_name_by_idx(int loc_id, String obj_name, int idx_type, int order, long n, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Aget_num_attrs returns the number of attributes attached to the object * specified by its identifier, loc_id. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Oget_info( int )} * * @param loc_id * IN: Identifier of a group, dataset, or named datatype. * * @return the number of attributes if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ @Deprecated public synchronized static native int H5Aget_num_attrs(int loc_id) throws HDF5LibraryException; /** * H5Aget_space retrieves a copy of the dataspace for an attribute. * * @param attr_id * IN: Identifier of an attribute. * * @return attribute dataspace identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Aget_space(int attr_id) throws HDF5LibraryException { int id = _H5Aget_space(attr_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Aget_space(int attr_id) throws HDF5LibraryException; /** * H5Aget_storage_size returns the amount of storage that is required for the specified attribute, attr_id. * * @param attr_id IN: Identifier of the attribute to query. * * @return the amount of storage size allocated for the attribute; otherwise returns 0 (zero) * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native long H5Aget_storage_size(int attr_id) throws HDF5LibraryException; /** * H5Aget_type retrieves a copy of the datatype for an attribute. * * @param attr_id * IN: Identifier of an attribute. * * @return a datatype identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Aget_type(int attr_id) throws HDF5LibraryException { int id = _H5Aget_type(attr_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Aget_type(int attr_id) throws HDF5LibraryException; /** * H5Aopen opens an existing attribute, attr_name, that is attached to an object specified an object identifier, object_id. * * @param obj_id IN: Identifer for object to which attribute is attached * @param attr_name IN: Name of attribute to open * @param aapl_id IN: Attribute access property list identifier * * @return An attribute identifier if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - Name is null. **/ public static int H5Aopen(int obj_id, String attr_name, int aapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Aopen(obj_id, attr_name, aapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Aopen(int obj_id, String attr_name, int aapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Aopen_by_idx opens an existing attribute that is attached to an object specified by location and name, loc_id and obj_name, respectively * * @param loc_id IN: Location of object to which attribute is attached * @param obj_name IN: Name of object to which attribute is attached, relative to location * @param idx_type IN: Type of index * @param order IN: Index traversal order * @param n IN: Attribute's position in index * @param aapl_id IN: Attribute access property list * @param lapl_id IN: Link access property list * * @return An attribute identifier if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - Name is null. **/ public static int H5Aopen_by_idx(int loc_id, String obj_name, int idx_type, int order ,long n, int aapl_id, int lapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Aopen_by_idx(loc_id, obj_name, idx_type, order , n, aapl_id, lapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Aopen_by_idx(int loc_id, String obj_name, int idx_type, int order ,long n, int aapl_id, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Aopen_by_name Opens an attribute for an object by object name and attribute name * * @param loc_id IN: Location from which to find object to which attribute is attached * @param obj_name IN: Name of object to which attribute is attached, relative to loc_id * @param attr_name IN: Name of attribute to open * @param aapl_id IN: Attribute access property list * @param lapl_id IN: Link access property list identifier * * @return Returns an attribute identifier if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - obj_name is null. **/ public static int H5Aopen_by_name(int loc_id, String obj_name, String attr_name, int aapl_id, int lapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Aopen_by_name(loc_id, obj_name, attr_name, aapl_id, lapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } /** * H5Aopen_idx opens an attribute which is attached to the object specified * with loc_id. The location object may be either a group, dataset, or named * datatype, all of which may have any sort of attribute. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Aopen_by_idx(int, String, int, int, long, int, int) } * * @param loc_id * IN: Identifier of the group, dataset, or named datatype * attribute * @param idx * IN: Index of the attribute to open. * * @return attribute identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ @Deprecated public static int H5Aopen_idx(int loc_id, int idx) throws HDF5LibraryException { int id = _H5Aopen_idx(loc_id, idx); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Aopen_idx(int loc_id, int idx) throws HDF5LibraryException; /** * H5Aopen_name opens an attribute specified by its name, name, which is * attached to the object specified with loc_id. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Aopen_by_name(int, String, String, int, int)} * * @param loc_id * IN: Identifier of a group, dataset, or named datatype * atttribute * @param name * IN: Attribute name. * * @return attribute identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ @Deprecated public static int H5Aopen_name(int loc_id, String name) throws HDF5LibraryException, NullPointerException { int id = _H5Aopen_name(loc_id, name); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Aopen_name(int loc_id, String name) throws HDF5LibraryException, NullPointerException; /** * H5Aread reads an attribute, specified with attr_id. The attribute's * memory datatype is specified with mem_type_id. The entire attribute is * read into buf from the file. * * @param attr_id * IN: Identifier of an attribute to read. * @param mem_type_id * IN: Identifier of the attribute datatype (in memory). * @param buf * IN: Buffer for data to be read. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - data buffer is null. **/ public synchronized static native int H5Aread(int attr_id, int mem_type_id, byte[] buf) throws HDF5LibraryException, NullPointerException; /** * H5Aread reads an attribute, specified with attr_id. The attribute's * memory datatype is specified with mem_type_id. The entire attribute is * read into data object from the file. * * @param attr_id * IN: Identifier of an attribute to read. * @param mem_type_id * IN: Identifier of the attribute datatype (in memory). * @param obj * IN: Object for data to be read. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - data buffer is null. See public synchronized static * native int H5Aread( ) **/ public synchronized static int H5Aread(int attr_id, int mem_type_id, Object obj) throws HDF5Exception, NullPointerException { HDFArray theArray = new HDFArray(obj); byte[] buf = theArray.emptyBytes(); // This will raise an exception if there is an error int status = H5Aread(attr_id, mem_type_id, buf); // No exception: status really ought to be OK if (status >= 0) { obj = theArray.arrayify(buf); } return status; } public synchronized static native int H5AreadVL(int attr_id, int mem_type_id, String[] buf) throws HDF5LibraryException, NullPointerException; /** * H5Arename changes the name of attribute that is attached to the object specified by loc_id. * The attribute named old_attr_name is renamed new_attr_name. * * @param loc_id IN: Location or object identifier; may be dataset or group * @param old_attr_name IN: Prior attribute name * @param new_attr_name IN: New attribute name * * @return A non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - Name is null. **/ public synchronized static native int H5Arename(int loc_id, String old_attr_name, String new_attr_name) throws HDF5LibraryException, NullPointerException; /** * H5Arename_by_name changes the name of attribute that is attached to the object specified by loc_id and obj_name. * The attribute named old_attr_name is renamed new_attr_name. * * @param loc_id IN: Location or object identifier; may be dataset or group * @param obj_name IN: Name of object, relative to location, whose attribute is to be renamed * @param old_attr_name IN: Prior attribute name * @param new_attr_name IN: New attribute name * @param lapl_id IN: Link access property list * * @return A non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - Name is null. **/ public synchronized static native int H5Arename_by_name(int loc_id, String obj_name, String old_attr_name, String new_attr_name, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Awrite writes an attribute, specified with attr_id. The attribute's * memory datatype is specified with mem_type_id. The entire attribute is * written from buf to the file. * * @param attr_id * IN: Identifier of an attribute to write. * @param mem_type_id * IN: Identifier of the attribute datatype (in memory). * @param buf * IN: Data to be written. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - data is null. **/ public synchronized static native int H5Awrite(int attr_id, int mem_type_id, byte[] buf) throws HDF5LibraryException, NullPointerException; /** * H5Awrite writes an attribute, specified with attr_id. The attribute's * memory datatype is specified with mem_type_id. The entire attribute is * written from data object to the file. * * @param attr_id * IN: Identifier of an attribute to write. * @param mem_type_id * IN: Identifier of the attribute datatype (in memory). * @param obj * IN: Data object to be written. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - data object is null. See public synchronized static * native int H5Awrite(int attr_id, int mem_type_id, byte[] * buf); **/ public synchronized static int H5Awrite(int attr_id, int mem_type_id, Object obj) throws HDF5Exception, NullPointerException { HDFArray theArray = new HDFArray(obj); byte[] buf = theArray.byteify(); int retVal = H5Awrite(attr_id, mem_type_id, buf); buf = null; theArray = null; return retVal; } ////////////////////////////////////////////////////////////// //// //H5D: Datasets Interface Functions // //// ////////////////////////////////////////////////////////////// public synchronized static native int H5Dchdir_ext(String dir_name) throws HDF5LibraryException, NullPointerException; /** * H5Dclose ends access to a dataset specified by dataset_id and releases * resources used by it. * * @param dataset_id * Identifier of the dataset to finish access to. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Dclose(int dataset_id) throws HDF5LibraryException { if (dataset_id < 0) throw new HDF5LibraryException("Negative ID"); OPEN_IDS.removeElement(dataset_id); return _H5Dclose(dataset_id); } private synchronized static native int _H5Dclose(int dataset_id) throws HDF5LibraryException; /** * H5Dcopy copies the content of one dataset to another dataset. * * @param src_did * the identifier of the source dataset * @param dst_did * the identifier of the destinaiton dataset */ public synchronized static native int H5Dcopy(int src_did, int dst_did) throws HDF5LibraryException; /** * H5Dcreate creates a data set with a name, name, in the file or in the * group specified by the identifier loc_id. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Dcreate(int, String, int, int, int, int, int) } * * @param loc_id * Identifier of the file or group to create the dataset within. * @param name * The name of the dataset to create. * @param type_id * Identifier of the datatype to use when creating the dataset. * @param space_id * Identifier of the dataspace to use when creating the dataset. * @param create_plist_id * Identifier of the set creation property list. * * @return a dataset identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ @Deprecated public static int H5Dcreate(int loc_id, String name, int type_id, int space_id, int create_plist_id) throws HDF5LibraryException, NullPointerException { int id = _H5Dcreate(loc_id, name, type_id, space_id, create_plist_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Dcreate(int loc_id, String name, int type_id, int space_id, int create_plist_id) throws HDF5LibraryException, NullPointerException; /** * H5Dcreate creates a new dataset named name at the * location specified by loc_id. * * @param loc_id IN: Location identifier * @param name IN: Dataset name * @param type_id IN: Datatype identifier * @param space_id IN: Dataspace identifier * @param lcpl_id IN: Identifier of link creation property list. * @param dcpl_id IN: Identifier of dataset creation property list. * @param dapl_id IN: Identifier of dataset access property list. * * @return a dataset identifier * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public static int H5Dcreate(int loc_id, String name, int type_id, int space_id, int lcpl_id, int dcpl_id, int dapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Dcreate2(loc_id, name, type_id, space_id, lcpl_id, dcpl_id, dapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } /** * H5Dcreate2 creates a new dataset named name at the * location specified by loc_id. * * @see public static int H5Dcreate(int loc_id, String name, int type_id, * int space_id, int lcpl_id, int dcpl_id, int dapl_id) **/ private synchronized static native int _H5Dcreate2(int loc_id, String name, int type_id, int space_id, int lcpl_id, int dcpl_id, int dapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Dcreate_anon creates a dataset in the file specified by loc_id. * * @param loc_id IN: Location identifier * @param type_id IN: Datatype identifier * @param space_id IN: Dataspace identifier * @param lcpl_id IN: Identifier of link creation property list. * @param dcpl_id IN: Identifier of dataset creation property list. * @param dapl_id IN: Identifier of dataset access property list. * * @return a dataset identifier * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Dcreate_anon(int loc_id, int type_id, int space_id, int dcpl_id, int dapl_id) throws HDF5LibraryException { int id = _H5Dcreate_anon(loc_id, type_id, space_id, dcpl_id, dapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Dcreate_anon(int loc_id, int type_id, int space_id, int dcpl_id, int dapl_id) throws HDF5LibraryException; /** * H5Dextend verifies that the dataset is at least of size size. * * @param dataset_id IN: Identifier of the dataset. * @param size IN: Array containing the new magnitude of each dimension. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - size array is null. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Dset_extent(int, long[]) } **/ @Deprecated public synchronized static native int H5Dextend(int dataset_id, byte[] size) throws HDF5LibraryException, NullPointerException; /** * H5Dextend verifies that the dataset is at least of size size. * * @param dataset_id IN: Identifier of the dataset. * @param size IN: Array containing the new magnitude of each dimension. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - size array is null. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Dset_extent(int, long[]) } **/ @Deprecated public synchronized static int H5Dextend(int dataset_id, long[] size) throws HDF5Exception, NullPointerException { int rval = -1; HDFArray theArray = new HDFArray(size); byte[] buf = theArray.byteify(); rval = H5Dextend(dataset_id, buf); buf = null; theArray = null; return rval; } /** * H5Dfill explicitly fills the dataspace selection in memory, space_id, * with the fill value specified in fill. * * @param fill IN: Pointer to the fill value to be used. * @param fill_type IN: Fill value datatype identifier. * @param buf IN/OUT: Pointer to the memory buffer containing the selection to be filled. * @param buf_type IN: Datatype of dataspace elements to be filled. * @param space IN: Dataspace describing memory buffer and containing the selection to be filled. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - buf is null. **/ public synchronized static native void H5Dfill(byte[] fill, int fill_type, byte[] buf, int buf_type, int space) throws HDF5LibraryException, NullPointerException; /** * H5Dget_access_plist returns an identifier for a copy of the * dataset access property list for a dataset. * * @param dset_id IN: Identifier of the dataset to query. * * @return a dataset access property list identifier * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Dget_access_plist(int dset_id) throws HDF5LibraryException; /** * H5Dget_create_plist returns an identifier for a copy of the dataset * creation property list for a dataset. * * @param dataset_id * Identifier of the dataset to query. * @return a dataset creation property list identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Dget_create_plist(int dataset_id) throws HDF5LibraryException { int id = _H5Dget_create_plist(dataset_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Dget_create_plist(int dataset_id) throws HDF5LibraryException; /** H5Dget_offset returns the address in the file of the dataset dset_id. * * @param dset_id IN: Identifier of the dataset in question * * @return the offset in bytes. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native long H5Dget_offset(int dset_id) throws HDF5LibraryException; /** * H5Dget_space returns an identifier for a copy of the dataspace for a * dataset. * * @param dataset_id * Identifier of the dataset to query. * * @return a dataspace identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Dget_space(int dataset_id) throws HDF5LibraryException { int id = _H5Dget_space(dataset_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Dget_space(int dataset_id) throws HDF5LibraryException; /** * H5Dget_space_status determines whether space has been * allocated for the dataset dset_id. * * @param dset_id IN: Identifier of the dataset to query. * * @return the space allocation status * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Dget_space_status(int dset_id) throws HDF5LibraryException; /** * H5Dget_space_status determines whether space has been * allocated for the dataset dset_id. * * @param dset_id IN: Identifier of the dataset to query. * * @return the space allocation status * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Dget_space_status(int dset_id, int[] status) throws HDF5LibraryException, NullPointerException { return _H5Dget_space_status(dset_id, status); } private synchronized static native int _H5Dget_space_status(int dset_id, int[] status) throws HDF5LibraryException, NullPointerException; /** * H5Dget_storage_size returns the amount of storage that is required for * the dataset. * * @param dataset_id * Identifier of the dataset in question * * @return he amount of storage space allocated for the dataset. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native long H5Dget_storage_size(int dataset_id) throws HDF5LibraryException, IllegalArgumentException; /** * H5Dget_type returns an identifier for a copy of the datatype for a * dataset. * * @param dataset_id * Identifier of the dataset to query. * * @return a datatype identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Dget_type(int dataset_id) throws HDF5LibraryException { int id = _H5Dget_type(dataset_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Dget_type(int dataset_id) throws HDF5LibraryException; public synchronized static native int H5Dgetdir_ext(String[] dir_name, int size) throws HDF5LibraryException, NullPointerException; //// Define the operator function pointer for H5Diterate() //public interface H5D_operator_t extends Callback { //int callback(Pointer elem, int type_id, int ndim, // LongByReference point, Pointer operator_data); //} /** * H5Diterate iterates over all the data elements in the memory buffer buf, * executing the callback function operator once for each such data element. * * @param buf IN/OUT: Pointer to the memory containing the elements to iterate over. * @param buf_type IN: Buffer datatype identifier. * @param space IN: Dataspace describing memory buffer. * @param op IN: Callback function to operate on each value. * @param op_data IN/OUT: Pointer to any user-efined data for use by operator function. * * @return returns the return value of the first operator that returns a positive value, or zero if all members were * processed with no operator returning non-zero. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - buf is null. **/ public synchronized static native int H5Diterate(byte[] buff, int buf_type, int space, H5D_iterate_cb op, H5D_iterate_t op_data) throws HDF5LibraryException, NullPointerException; /** * H5Dopen opens the existing dataset specified by a location identifier * and name, loc_id and name, respectively. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Dopen(int, String, int) } * * @param loc_id IN: Location identifier * @param name IN: Dataset name * * @return a dataset identifier if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ @Deprecated public static int H5Dopen(int loc_id, String name) throws HDF5LibraryException, NullPointerException { int id = _H5Dopen(loc_id, name); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Dopen(int loc_id, String name) throws HDF5LibraryException, NullPointerException; /** * H5Dopen opens the existing dataset specified by a location identifier * and name, loc_id and name, respectively. * * @param loc_id IN: Location identifier * @param name IN: Dataset name * @param dapl_id IN: Identifier of dataset access property list. * * @return a dataset identifier if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public static int H5Dopen(int loc_id, String name, int dapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Dopen2(loc_id, name, dapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } /** * H5Dopen2 opens the existing dataset specified by a location identifier * and name, loc_id and name, respectively. * * @see public static int H5Dopen(int loc_id, String name, int dapl_id) **/ private synchronized static native int _H5Dopen2(int loc_id, String name, int dapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Dread reads a (partial) dataset, specified by its identifier * dataset_id, from the file into the application memory buffer buf. * * @param dataset_id * Identifier of the dataset read from. * @param mem_type_id * Identifier of the memory datatype. * @param mem_space_id * Identifier of the memory dataspace. * @param file_space_id * Identifier of the dataset's dataspace in the file. * @param xfer_plist_id * Identifier of a transfer property list for this I/O operation. * @param buf * Buffer to store data read from the file. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - data buffer is null. **/ public synchronized static native int H5Dread(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, byte[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dread(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, byte[] buf) throws HDF5LibraryException, NullPointerException { return H5Dread(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static int H5Dread(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, Object obj) throws HDF5Exception, HDF5LibraryException, NullPointerException { return H5Dread(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, obj, true); } /** * H5Dread reads a (partial) dataset, specified by its identifier * dataset_id, from the file into the application data object. * * @param dataset_id * Identifier of the dataset read from. * @param mem_type_id * Identifier of the memory datatype. * @param mem_space_id * Identifier of the memory dataspace. * @param file_space_id * Identifier of the dataset's dataspace in the file. * @param xfer_plist_id * Identifier of a transfer property list for this I/O operation. * @param obj * Object to store data read from the file. * * @return a non-negative value if successful * * @exception HDF5Exception * - Failure in the data conversion. * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - data object is null. **/ public synchronized static int H5Dread(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, Object obj, boolean isCriticalPinning) throws HDF5Exception, HDF5LibraryException, NullPointerException { int status = -1; boolean is1D = false; Class dataClass = obj.getClass(); if (!dataClass.isArray()) { throw (new HDF5JavaException("H5Dread: data is not an array")); } String cname = dataClass.getName(); is1D = (cname.lastIndexOf('[') == cname.indexOf('[')); char dname = cname.charAt(cname.lastIndexOf("[") + 1); if (is1D && (dname == 'B')) { status = H5Dread(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (byte[]) obj, isCriticalPinning); } else if (is1D && (dname == 'S')) { status = H5Dread_short(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (short[]) obj, isCriticalPinning); } else if (is1D && (dname == 'I')) { status = H5Dread_int(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (int[]) obj, isCriticalPinning); } else if (is1D && (dname == 'J')) { status = H5Dread_long(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (long[]) obj); } else if (is1D && (dname == 'F')) { status = H5Dread_float(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (float[]) obj, isCriticalPinning); } else if (is1D && (dname == 'D')) { status = H5Dread_double(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (double[]) obj, isCriticalPinning); } else if (H5.H5Tequal(mem_type_id, HDF5Constants.H5T_STD_REF_DSETREG)) { status = H5Dread_reg_ref(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (String[]) obj); } else if (is1D && (dataClass.getComponentType() == String.class)) { // Rosetta Biosoftware - add support for // Strings (variable length) if (H5.H5Tis_variable_str(mem_type_id)) { status = H5DreadVL(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (Object[]) obj); } else { status = H5Dread_string(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (String[]) obj); } } else { // Create a data buffer to hold the data // into a Java Array HDFArray theArray = new HDFArray(obj); byte[] buf = theArray.emptyBytes(); // will raise exception if read fails status = H5Dread(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, isCriticalPinning); if (status >= 0) { // convert the data into a Java // Array */ obj = theArray.arrayify(buf); } // clean up these: assign 'null' as hint // to gc() */ buf = null; theArray = null; } return status; } public synchronized static native int H5Dread_double(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, double[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dread_double(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, double[] buf) throws HDF5LibraryException, NullPointerException { return H5Dread_double(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static native int H5Dread_float(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, float[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dread_float(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, float[] buf) throws HDF5LibraryException, NullPointerException { return H5Dread_float(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static native int H5Dread_int(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, int[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dread_int(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, int[] buf) throws HDF5LibraryException, NullPointerException { return H5Dread_int(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static native int H5Dread_long(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, long[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dread_long(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, long[] buf) throws HDF5LibraryException, NullPointerException { return H5Dread_long(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static native int H5Dread_reg_ref(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, String[] buf) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Dread_short(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, short[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dread_short(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, short[] buf) throws HDF5LibraryException, NullPointerException { return H5Dread_short(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static native int H5Dread_string(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, String[] buf) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5DreadVL(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, Object[] buf) throws HDF5LibraryException, NullPointerException; /** * H5Dset_extent sets the current dimensions of the chunked dataset dset_id * to the sizes specified in size. * * @param dset_id IN: Chunked dataset identifier. * @param size IN: Array containing the new magnitude of each dimension of the dataset. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - size is null. **/ public synchronized static native void H5Dset_extent(int dset_id, long size[]) throws HDF5LibraryException, NullPointerException; private synchronized static native int _H5Aopen_by_name(int loc_id, String obj_name, String attr_name,int aapl_id, int lapl_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Dvlen_get_buf_size(int dataset_id, int type_id, int space_id, int[] size) throws HDF5LibraryException; /** * H5Dvlen_get_buf_size determines the number of bytes required to store the VL data from * the dataset, using the space_id for the selection in the dataset on disk and the * type_id for the memory representation of the VL data in memory. * * @param dset_id IN: Identifier of the dataset read from. * @param type_id IN: Identifier of the datatype. * @param space_id IN: Identifier of the dataspace. * * @return the size in bytes of the memory buffer required to store the VL data. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - buf is null. **/ public synchronized static native long H5Dvlen_get_buf_size_long(int dset_id, int type_id, int space_id) throws HDF5LibraryException; //int H5Dvlen_get_buf_size(int dset_id, int type_id, int space_id, LongByReference size); /** * * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - buf is null. **/ public synchronized static native int H5Dvlen_reclaim(int type_id, int space_id, int xfer_plist_id, byte[] buf) throws HDF5LibraryException, NullPointerException; /** * H5Dwrite writes a (partial) dataset, specified by its identifier * dataset_id, from the application memory buffer buf into the file. * * @param dataset_id * Identifier of the dataset read from. * @param mem_type_id * Identifier of the memory datatype. * @param mem_space_id * Identifier of the memory dataspace. * @param file_space_id * Identifier of the dataset's dataspace in the file. * @param xfer_plist_id * Identifier of a transfer property list for this I/O operation. * @param buf * Buffer with data to be written to the file. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native int H5Dwrite(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, byte[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dwrite(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, byte[] buf) throws HDF5LibraryException, NullPointerException { return H5Dwrite(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static int H5Dwrite(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, Object obj) throws HDF5Exception, HDF5LibraryException, NullPointerException { return H5Dwrite(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, obj, true); } /** * H5Dwrite writes a (partial) dataset, specified by its identifier * dataset_id, from the application memory data object into the file. * * @param dataset_id * Identifier of the dataset read from. * @param mem_type_id * Identifier of the memory datatype. * @param mem_space_id * Identifier of the memory dataspace. * @param file_space_id * Identifier of the dataset's dataspace in the file. * @param xfer_plist_id * Identifier of a transfer property list for this I/O operation. * @param obj * Object with data to be written to the file. * * @return a non-negative value if successful * * @exception HDF5Exception * - Failure in the data conversion. * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - data object is null. **/ public synchronized static int H5Dwrite(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, Object obj, boolean isCriticalPinning) throws HDF5Exception, HDF5LibraryException, NullPointerException { int status = -1; boolean is1D = false; Class dataClass = obj.getClass(); if (!dataClass.isArray()) { throw (new HDF5JavaException("H5Dread: data is not an array")); } String cname = dataClass.getName(); is1D = (cname.lastIndexOf('[') == cname.indexOf('[')); char dname = cname.charAt(cname.lastIndexOf("[") + 1); if (is1D && (dname == 'B')) { status = H5Dwrite(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (byte[]) obj, isCriticalPinning); } else if (is1D && (dname == 'S')) { status = H5Dwrite_short(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (short[]) obj, isCriticalPinning); } else if (is1D && (dname == 'I')) { status = H5Dwrite_int(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (int[]) obj, isCriticalPinning); } else if (is1D && (dname == 'J')) { status = H5Dwrite_long(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (long[]) obj, isCriticalPinning); } else if (is1D && (dname == 'F')) { status = H5Dwrite_float(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (float[]) obj, isCriticalPinning); } else if (is1D && (dname == 'D')) { status = H5Dwrite_double(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (double[]) obj, isCriticalPinning); } // Rosetta Biosoftware - call into H5DwriteString // for variable length Strings else if ((H5.H5Tget_class(mem_type_id) == HDF5Constants.H5T_STRING) && H5.H5Tis_variable_str(mem_type_id) && dataClass.isArray() && (dataClass.getComponentType() == String.class) && is1D) { status = H5DwriteString(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, (String[]) obj); } else { HDFArray theArray = new HDFArray(obj); byte[] buf = theArray.byteify(); /* will raise exception on error */ status = H5Dwrite(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, isCriticalPinning); // clean up these: assign 'null' as hint to // gc() */ buf = null; theArray = null; } return status; } public synchronized static native int H5Dwrite_double(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, double[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dwrite_double(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, double[] buf) throws HDF5LibraryException, NullPointerException { return H5Dwrite_double(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static native int H5Dwrite_float(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, float[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dwrite_float(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, float[] buf) throws HDF5LibraryException, NullPointerException { return H5Dwrite_float(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static native int H5Dwrite_int(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, int[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dwrite_int(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, int[] buf) throws HDF5LibraryException, NullPointerException { return H5Dwrite_int(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static native int H5Dwrite_long(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, long[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dwrite_long(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, long[] buf) throws HDF5LibraryException, NullPointerException { return H5Dwrite_long(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } public synchronized static native int H5Dwrite_short(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, short[] buf, boolean isCriticalPinning) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Dwrite_short(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, short[] buf) throws HDF5LibraryException, NullPointerException { return H5Dwrite_short(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } /** * H5DwriteString writes a (partial) variable length String dataset, * specified by its identifier dataset_id, from the application memory * buffer buf into the file. * * @param dataset_id * Identifier of the dataset read from. * @param mem_type_id * Identifier of the memory datatype. * @param mem_space_id * Identifier of the memory dataspace. * @param file_space_id * Identifier of the dataset's dataspace in the file. * @param xfer_plist_id * Identifier of a transfer property list for this I/O operation. * @param buf * Buffer with data to be written to the file. * * @return a non-negative value if successful * * @author contributed by Rosetta Biosoftware * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native int H5DwriteString(int dataset_id, int mem_type_id, int mem_space_id, int file_space_id, int xfer_plist_id, String[] buf) throws HDF5LibraryException, NullPointerException; ////////////////////////////////////////////////////////////// //// //H5E: Error Stack // //// ////////////////////////////////////////////////////////////// /** * H5Eauto_is_v2 determines whether the error auto reporting function for an * error stack conforms to the H5E_auto2_t typedef or the H5E_auto1_t * typedef. * * @param stack_id * IN: Error stack identifier. * * @return boolean true if the error stack conforms to H5E_auto2_t and false * if it conforms to H5E_auto1_t. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native boolean H5Eauto_is_v2(int err_stack) throws HDF5LibraryException; /** * H5Eclear clears the error stack for the current thread. H5Eclear can fail * if there are problems initializing the library. *

    * This may be used by exception handlers to assure that the error condition * in the HDF-5 library has been reset. * * @return Returns a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Eclear() throws HDF5LibraryException { H5Eclear2(HDF5Constants.H5E_DEFAULT); return 0; } /** * H5Eclear clears the error stack specified by estack_id, or, if estack_id * is set to H5E_DEFAULT, the error stack for the current thread. * * @param stack_id * IN: Error stack identifier. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static void H5Eclear(int err_stack) throws HDF5LibraryException { H5Eclear2(err_stack); } /** * H5Eclear2 clears the error stack specified by estack_id, or, if estack_id * is set to H5E_DEFAULT, the error stack for the current thread. * * @see public static void H5Eclear(int err_stack) **/ public synchronized static native void H5Eclear2(int err_stack) throws HDF5LibraryException; /** * H5Eclose_msg closes an error message identifier, which can be either a * major or minor message. * * @param err_id * IN: Error message identifier. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native void H5Eclose_msg(int err_id) throws HDF5LibraryException; /** * H5Eclose_stack closes the object handle for an error stack and releases * its resources. * * @param stack_id * IN: Error stack identifier. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native void H5Eclose_stack(int stack_id) throws HDF5LibraryException; /** * H5Ecreate_msg adds an error message to an error class defined by client * library or application program. * * @param cls_id * IN: Error class identifier. * @param msg_type * IN: The type of the error message. * @param msg * IN: The error message. * * @return a message identifier * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - msg is null. **/ public synchronized static native int H5Ecreate_msg(int cls_id, int msg_type, String msg) throws HDF5LibraryException, NullPointerException; /** * H5Ecreate_stack creates a new empty error stack and returns the new * stack's identifier. * * @param none * * @return an error stack identifier * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Ecreate_stack() throws HDF5LibraryException; //int H5Eget_auto(H5E_auto1_t func, PointerByReference client_data); //{ //return H5Eget_auto1(func, client_data); //} //int H5Eget_auto1(H5E_auto1_t func, PointerByReference client_data); //int H5Eset_auto(H5E_auto1_t func, Pointer client_data); //{ //return H5Eset_auto1(func, client_data); //} //int H5Eset_auto1(H5E_auto1_t func, Pointer client_data); /** * H5Eget_class_name retrieves the name of the error class specified by the * class identifier. * * @param class_id * IN: Error class identifier. * * @return the name of the error class * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native String H5Eget_class_name(int class_id) throws HDF5LibraryException, NullPointerException; // long H5Eget_class_name(int class_id, String name, IntegerType size); /** * H5Eget_current_stack copies the current error stack and returns an error * stack identifier for the new copy. * * @param none * * @return an error stack identifier * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Eget_current_stack() throws HDF5LibraryException; /** * H5Eset_current_stack replaces the content of the current error stack with * a copy of the content of the error stack specified by estack_id. * * @param stack_id * IN: Error stack identifier. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native void H5Eset_current_stack(int stack_id) throws HDF5LibraryException; /** * H5Eget_msg retrieves the error message including its length and type. * * @param msg_id * IN: Name of the error class. * @param type * OUT: The type of the error message. Valid values are H5E_MAJOR * and H5E_MINOR. * * @return the error message * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native String H5Eget_msg(int msg_id, int[] type_list) throws HDF5LibraryException; // long H5Eget_msg(int msg_id, H5E_TYPE type, String msg, IntegerType size); // ///** //* H5Eget_major returns a string that describes the error. //* //* @deprecated As of HDF5 1.8 //* //* @param major IN: Major error number. //* //* @return string describing the error //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //**/ //public synchronized static native String H5Eget_major(int major) //throws HDF5LibraryException; // ///** //* H5Eget_minor returns a string that describes the error. //* //* @deprecated As of HDF5 1.8 //* //* @param minor IN: Error stack identifier. //* //* @return string describing the error //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //**/ //public synchronized static native String H5Eget_minor(int minor) //throws HDF5LibraryException; /** * H5Eget_num retrieves the number of error records in the error stack * specified by estack_id (including major, minor messages and description). * * @param stack_id * IN: Error stack identifier. * * @return the number of error messages * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native long H5Eget_num(int stack_id) throws HDF5LibraryException, NullPointerException; /** * H5Eprint1 prints the error stack specified by estack_id on the specified * stream, stream. * * @param stream * IN: File pointer, or stderr if null. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Eprint2(int, Object)} **/ @Deprecated public synchronized static native void H5Eprint1(Object stream) throws HDF5LibraryException; /** * H5Eprint2 prints the error stack specified by estack_id on the specified * stream, stream. * * @param stack_id * IN: Error stack identifier.If the identifier is H5E_DEFAULT, * the current error stack will be printed. * @param stream * IN: File pointer, or stderr if null. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native void H5Eprint2(int err_stack, Object stream) throws HDF5LibraryException; //public static int H5Epush(String file, String func, int line, //int maj_id, int min_id, String msg) //{ //H5Epush1(file, func, line, maj_id, min_id, msg); //} //private synchronized static native int H5Epush1(String file, String func, //int line, //int maj_id, int min_id, String msg); //public static int H5Epush(int err_stack, String file, String func, int //line, //int cls_id, int maj_id, int min_id, String msg, ...) //{ //H5Epush2(err_stack, file, func, line, cls_id, maj_id, min_id, msg, ...); //} //public synchronized static native int H5Epush2(int err_stack, String //file, String func, int line, //int cls_id, int maj_id, int min_id, String msg, ...); /** * H5Epop deletes the number of error records specified in count from the * top of the error stack specified by estack_id (including major, minor * messages and description). * * @param stack_id * IN: Error stack identifier. * @param count * IN: Version of the client library or application to which the * error class belongs. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native void H5Epop(int stack_id, long count) throws HDF5LibraryException; /** * H5Eregister_class registers a client library or application program to * the HDF5 error API so that the client library or application program can * report errors together with HDF5 library. * * @param cls_name * IN: Name of the error class. * @param lib_name * IN: Name of the client library or application to which the * error class belongs. * @param version * IN: Version of the client library or application to which the * error class belongs. * * @return a class identifier * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native int H5Eregister_class(String cls_name, String lib_name, String version) throws HDF5LibraryException, NullPointerException; /** * H5Eunregister_class removes the error class specified by class_id. * * @param class_id * IN: Error class identifier. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native void H5Eunregister_class(int class_id) throws HDF5LibraryException; // //int H5Ewalk(H5E_direction_t direction, H5E_walk1_t func, //Pointer client_data) //{ //return H5Ewalk1(direction, func, client_data); //} //int H5Ewalk1(H5E_direction_t direction, H5E_walk1_t func, //Pointer client_data); ////Error stack traversal callback function pointers //public interface H5E_walk2_t extends Callback //{ //int callback(int n, H5E_error2_t err_desc, Pointer client_data); //} //public interface H5E_auto2_t extends Callback //{ //int callback(int estack, Pointer client_data); //} //int H5Ewalk(int err_stack, H5E_direction_t direction, H5E_walk2_t func, //Pointer client_data) //{ //return H5Ewalk2(err_stack, direction, func, client_data); //} //int H5Ewalk2(int err_stack, H5E_direction_t direction, H5E_walk2_t func, //Pointer client_data); //int H5Eget_auto(int estack_id, H5E_auto2_t func, PointerByReference //client_data); //{ //return H5Eget_auto2(estack_id, func, client_data); //} //int H5Eget_auto2(int estack_id, H5E_auto2_t func, PointerByReference //client_data); //int H5Eset_auto(int estack_id, H5E_auto2_t func, Pointer client_data); //{ //return H5Eset_auto2(estack_id, func, client_data); //} //int H5Eset_auto2(int estack_id, H5E_auto2_t func, Pointer client_data); ////////////////////////////////////////////////////////////// //// //H5F: File Interface Functions // //// ////////////////////////////////////////////////////////////// /** * H5Fclose terminates access to an HDF5 file. * * @param file_id * Identifier of a file to terminate access to. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Fclose(int file_id) throws HDF5LibraryException { if (file_id <0) throw new HDF5LibraryException("Negative ID");; OPEN_IDS.removeElement(file_id); return _H5Fclose(file_id); } private synchronized static native int _H5Fclose(int file_id) throws HDF5LibraryException; /** * H5Fopen opens an existing file and is the primary function for accessing * existing HDF5 files. * * @param name * Name of the file to access. * @param flags * File access flags. * @param access_id * Identifier for the file access properties list. * * @return a file identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public static int H5Fopen(String name, int flags, int access_id) throws HDF5LibraryException, NullPointerException { int id = _H5Fopen(name, flags, access_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Fopen(String name, int flags, int access_id) throws HDF5LibraryException, NullPointerException; /** * H5Freopen reopens an HDF5 file. * * @param file_id * Identifier of a file to terminate and reopen access to. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @return a new file identifier if successful **/ public static int H5Freopen(int file_id) throws HDF5LibraryException { int id = _H5Freopen(file_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Freopen(int file_id) throws HDF5LibraryException; /** * H5Fcreate is the primary function for creating HDF5 files. * * @param name * Name of the file to access. * @param flags * File access flags. Possible values include: *

      *
    • * H5F_ACC_RDWR Allow read and write access to file.
    • *
    • * H5F_ACC_RDONLY Allow read-only access to file.
    • *
    • * H5F_ACC_TRUNC Truncate file, if it already exists, erasing all * data previously stored in the file.
    • *
    • * H5F_ACC_EXCL Fail if file already exists.
    • *
    • * H5F_ACC_DEBUG Print debug information.
    • *
    • * H5P_DEFAULT Apply default file access and creation properties. *
    • *
    * * @param create_id * File creation property list identifier, used when modifying * default file meta-data. Use H5P_DEFAULT for default access * properties. * @param access_id * File access property list identifier. If parallel file access * is desired, this is a collective call according to the * communicator stored in the access_id (not supported in Java). * Use H5P_DEFAULT for default access properties. * * @return a file identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public static int H5Fcreate(String name, int flags, int create_id, int access_id) throws HDF5LibraryException, NullPointerException { int id = _H5Fcreate(name, flags, create_id, access_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Fcreate(String name, int flags, int create_id, int access_id) throws HDF5LibraryException, NullPointerException; /** * H5Fflush causes all buffers associated with a file or object to be * immediately flushed (written) to disk without removing the data from the * (memory) cache. *

    * After this call completes, the file (or object) is in a consistent state * and all data written to date is assured to be permanent. * * @param object_id * Identifier of object used to identify the file. * object_id can be any object associated with the file, * including the file itself, a dataset, a group, an attribute, * or a named data type. * @param scope * specifies the scope of the flushing action, in the case that * the HDF-5 file is not a single physical file. *

    * Valid values are: *

      *
    • * H5F_SCOPE_GLOBAL Flushes the entire virtual file.
    • *
    • * H5F_SCOPE_LOCAL Flushes only the specified file.
    • *
    * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Fflush(int object_id, int scope) throws HDF5LibraryException; /** * H5Fget_access_plist returns the file access property list identifier of * the specified file. * * @param file_id * Identifier of file to get access property list of * * @return a file access property list identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Fget_access_plist(int file_id) throws HDF5LibraryException { int id = _H5Fget_access_plist(file_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Fget_access_plist(int file_id) throws HDF5LibraryException; /** * H5Fget_create_plist returns a file creation property list identifier * identifying the creation properties used to create this file. * * @param file_id * Identifier of the file to get creation property list * * @return a file creation property list identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Fget_create_plist(int file_id) throws HDF5LibraryException { int id = _H5Fget_create_plist(file_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Fget_create_plist(int file_id) throws HDF5LibraryException; public synchronized static native long H5Fget_filesize(int file_id) throws HDF5LibraryException; /** * H5Fget_freespace returns the amount of space that is unused by any * objects in the file. * * @param file_id * IN: File identifier for a currently-open HDF5 file * * @return the amount of free space in the file * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native long H5Fget_freespace(int file_id) throws HDF5LibraryException; ///** //* H5Fget_info returns global information for the file associated with the //* object identifier obj_id. //* //* @param obj_id IN: Object identifier for any object in the file. //* //* @return the structure containing global file information. //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //**/ //public synchronized static native H5F_info_t H5Fget_info(int obj_id) //throws HDF5LibraryException, NullPointerException; //int H5Fget_info(int obj_id, H5F_info_t file_info); /** * H5Fget_intent retrieves the intended access mode flag passed with H5Fopen * when the file was opened. * * @param file_id * IN: File identifier for a currently-open HDF5 file * * @return the intended access mode flag, as originally passed with H5Fopen. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Fget_intent(int file_id) throws HDF5LibraryException; // int H5Fget_intent(int file_id, IntByReference intent); ///** //* H5Fget_mdc_config loads the current metadata cache configuration into //* the instance of H5AC_cache_config_t pointed to by the config_ptr //parameter. //* //* @param file_id IN: Identifier of the target file //* @param config_ptr IN/OUT: Pointer to the instance of //H5AC_cache_config_t in which the current metadata cache configuration is //to be reported. //* //* @return none //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //* @exception NullPointerException - config_ptr is null. //**/ //public synchronized static native void H5Fget_mdc_config(int file_id, //H5AC_cache_config_t config_ptr) //throws HDF5LibraryException, NullPointerException; // ///** //* H5Fset_mdc_config attempts to configure the file's metadata cache //according to the configuration supplied. //* //* @param file_id IN: Identifier of the target file //* @param config_ptr IN: Pointer to the instance of H5AC_cache_config_t //containing the desired configuration. //* //* @return none //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //* @exception NullPointerException - config_ptr is null. //**/ //public synchronized static native int H5Fset_mdc_config(int file_id, //H5AC_cache_config_t config_ptr) //throws HDF5LibraryException, NullPointerException; /** * H5Fget_mdc_hit_rate queries the metadata cache of the target file to * obtain its hit rate (cache hits / (cache hits + cache misses)) since the * last time hit rate statistics were reset. * * @param file_id * IN: Identifier of the target file. * * @return the double in which the hit rate is returned. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native double H5Fget_mdc_hit_rate(int file_id) throws HDF5LibraryException; /** * H5Fget_mdc_size queries the metadata cache of the target file for the * desired size information. * * @param file_id * IN: Identifier of the target file. * @param metadata_cache * OUT: Current metadata cache information *
      *
    • metadata_cache[0] = max_size_ptr // current cache maximum * size
    • *
    • metadata_cache[1] = min_clean_size_ptr // current cache * minimum clean size
    • *
    • metadata_cache[2] = cur_size_ptr // current cache size
    • *
    * * @return current number of entries in the cache * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - metadata_cache is null. **/ public synchronized static native int H5Fget_mdc_size(int file_id, long[] metadata_cache) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Fget_name retrieves the name of the file to which the object obj_id * belongs. * * @param obj_id * IN: Identifier of the object for which the associated filename * is sought. * * @return the filename. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native String H5Fget_name(int obj_id) throws HDF5LibraryException; // long H5Fget_name(int obj_id, Buffer name/*out*/, long size); public synchronized static native String H5Fget_name(int obj_id, int size) throws HDF5LibraryException; /** * H5Fget_obj_count returns the number of open object identifiers for the * file. * * @param file_id * IN: File identifier for a currently-open HDF5 file * @param types * IN: Type of object for which identifiers are to be returned. *
      *
    • H5F_OBJ_FILE Files only
    • *
    • H5F_OBJ_DATASET Datasets only
    • *
    • H5F_OBJ_GROUP Groups only
    • *
    • H5F_OBJ_DATATYPE Named datatypes only
    • *
    • H5F_OBJ_ATTR Attributes only
    • *
    • H5F_OBJ_ALL All of the above
    • *
    • H5F_OBJ_LOCAL Restrict search to objects opened through * current file identifier.
    • *
    * * @return the number of open objects. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Fget_obj_count(int file_id, int types) throws HDF5LibraryException; /** * H5Fget_obj_count returns the number of open object identifiers for the * file. * * @param file_id * IN: File identifier for a currently-open HDF5 file * @param types * IN: Type of object for which identifiers are to be returned. *
      *
    • H5F_OBJ_FILE Files only
    • *
    • H5F_OBJ_DATASET Datasets only
    • *
    • H5F_OBJ_GROUP Groups only
    • *
    • H5F_OBJ_DATATYPE Named datatypes only
    • *
    • H5F_OBJ_ATTR Attributes only
    • *
    • H5F_OBJ_ALL All of the above
    • *
    • H5F_OBJ_LOCAL Restrict search to objects opened through * current file identifier.
    • *
    * * @return the number of open objects. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native long H5Fget_obj_count_long(int file_id, int types) throws HDF5LibraryException; /** * H5Fget_obj_ids returns the list of identifiers for all open HDF5 objects * fitting the specified criteria. * * @param file_id * IN: File identifier for a currently-open HDF5 file * @param types * IN: Type of object for which identifiers are to be returned. * @param max_objs * IN: Maximum number of object identifiers to place into * obj_id_list. * @param obj_id_list * OUT: Pointer to the returned list of open object identifiers. * * @return the number of objects placed into obj_id_list. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - obj_id_list is null. **/ public synchronized static native int H5Fget_obj_ids(int file_id, int types, int max, int[] obj_id_list) throws HDF5LibraryException, NullPointerException; /** * H5Fget_obj_ids returns the list of identifiers for all open HDF5 objects * fitting the specified criteria. * * @param file_id * IN: File identifier for a currently-open HDF5 file * @param types * IN: Type of object for which identifiers are to be returned. * @param max_objs * IN: Maximum number of object identifiers to place into * obj_id_list. * @param obj_id_list * OUT: Pointer to the returned list of open object identifiers. * * @return the number of objects placed into obj_id_list. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - obj_id_list is null. **/ public synchronized static native long H5Fget_obj_ids_long(int file_id, int types, long max_objs, int[] obj_id_list) throws HDF5LibraryException, NullPointerException; ///** //* H5Fget_vfd_handle returns a pointer to the file handle from the //low-level file driver //* currently being used by the HDF5 library for file I/O. //* //* @param file_id IN: Identifier of the file to be queried. //* @param fapl IN: File access property list identifier. //* //* @return a pointer to the file handle being used by the low-level //virtual file driver. //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //**/ //public synchronized static native Pointer file_handle //H5Fget_vfd_handle(int file_id, int fapl) //throws HDF5LibraryException; /** * H5Fis_hdf5 determines whether a file is in the HDF5 format. * * @param name * File name to check format. * * @return true if is HDF-5, false if not. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native boolean H5Fis_hdf5(String name) throws HDF5LibraryException, NullPointerException; /** * H5Fmount mounts the file specified by child_id onto the group specified * by loc_id and name using the mount properties plist_id. * * @param loc_id * The identifier for the group onto which the file specified by * child_id is to be mounted. * @param name * The name of the group onto which the file specified by * child_id is to be mounted. * @param child_id * The identifier of the file to be mounted. * @param plist_id * The identifier of the property list to be used. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native int H5Fmount(int loc_id, String name, int child_id, int plist_id) throws HDF5LibraryException, NullPointerException; /** * Given a mount point, H5Funmount dissassociates the mount point's file * from the file mounted there. * * @param loc_id * The identifier for the location at which the specified file is * to be unmounted. * @param name * The name of the file to be unmounted. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native int H5Funmount(int loc_id, String name) throws HDF5LibraryException, NullPointerException; /** * H5Freset_mdc_hit_rate_stats resets the hit rate statistics counters in * the metadata cache associated with the specified file. * * @param file_id * IN: Identifier of the target file. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native void H5Freset_mdc_hit_rate_stats( int file_id) throws HDF5LibraryException; // //////////////////////////////////////////////////////////// // // // H5G: Group Interface Functions // // // // //////////////////////////////////////////////////////////// /** * H5Gclose releases resources used by a group which was opened by a call to * H5Gcreate() or H5Gopen(). * * @param group_id * Group identifier to release. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Gclose(int group_id) throws HDF5LibraryException { if (group_id < 0) throw new HDF5LibraryException("Negative ID");; OPEN_IDS.removeElement(group_id); return _H5Gclose(group_id); } private synchronized static native int _H5Gclose(int group_id) throws HDF5LibraryException; /** * H5Gcreate creates a new group with the specified name at the specified * location, loc_id. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Gcreate(int, String, int, int, int) } * * @param loc_id * The file or group identifier. * @param name * The absolute or relative name of the new group. * @param size_hint * An optional parameter indicating the number of bytes to * reserve for the names that will appear in the group. * * @return a valid group identifier for the open group if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ @Deprecated public static int H5Gcreate(int loc_id, String name, long size_hint) throws HDF5LibraryException, NullPointerException { int id = _H5Gcreate(loc_id, name, size_hint); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Gcreate(int loc_id, String name, long size_hint) throws HDF5LibraryException, NullPointerException; /** * H5Gcreate creates a new group with the specified name at the specified * location, loc_id. * * @param loc_id * IN: The file or group identifier. * @param name * IN: The absolute or relative name of the new group. * @param lcpl_id * IN: Identifier of link creation property list. * @param gcpl_id * IN: Identifier of group creation property list. * @param gapl_id * IN: Identifier of group access property list. (No group access * properties have been implemented at this time; use * H5P_DEFAULT.) * * @return a valid group identifier * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public static int H5Gcreate(int loc_id, String name, int lcpl_id, int gcpl_id, int gapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Gcreate2(loc_id, name, lcpl_id, gcpl_id, gapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Gcreate2(int loc_id, String name, int lcpl_id, int gcpl_id, int gapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Gcreate_anon creates a new empty group in the file specified by loc_id. * * @param loc_id * IN: File or group identifier specifying the file in which the * new group is to be created. * @param gcpl_id * IN: Identifier of group creation property list. * @param gapl_id * IN: Identifier of group access property list. (No group access * properties have been implemented at this time; use * H5P_DEFAULT.) * * @return a valid group identifier * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Gcreate_anon(int loc_id, int gcpl_id, int gapl_id) throws HDF5LibraryException { int id = _H5Gcreate_anon(loc_id, gcpl_id, gapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Gcreate_anon(int loc_id, int gcpl_id, int gapl_id) throws HDF5LibraryException; /** * H5Gget_comment retrieves the comment for the the object name. The comment * is returned in the buffer comment. * * @param loc_id * IN: Identifier of the file, group, dataset, or datatype. * @param name * IN: Name of the object whose comment is to be set or reset. * @param bufsize * IN: Anticipated size of the buffer required to hold comment. * @param comment * OUT: The comment. * @return the number of characters in the comment, counting the null * terminator, if successful * * @exception ArrayIndexOutOfBoundsException * - JNI error writing back data * @exception ArrayStoreException * - JNI error writing back data * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. * @exception IllegalArgumentException * - size < 1, comment is invalid. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Oget_comment(int)} **/ @Deprecated public synchronized static native int H5Gget_comment(int loc_id, String name, int bufsize, String[] comment) throws ArrayIndexOutOfBoundsException, ArrayStoreException, HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Gset_comment sets the comment for the the object name to comment. Any * previously existing comment is overwritten. * * @param loc_id * IN: Identifier of the file, group, dataset, or datatype. * @param name * IN: Name of the object whose comment is to be set or reset. * @param comment * IN: The new comment. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name or comment is null. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Oset_comment(int, String)} **/ @Deprecated public synchronized static native int H5Gset_comment(int loc_id, String name, String comment) throws HDF5LibraryException, NullPointerException; /** * H5Gget_create_plist returns an identifier for the group creation property * list associated with the group specified by group_id. * * @param group_id * IN: Identifier of the group. * * @return an identifier for the group's creation property list * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Gget_create_plist(int group_id) throws HDF5LibraryException; /** * H5Gget_info retrieves information about the group specified by group_id. * The information is returned in the group_info struct. * * @param group_id * IN: Identifier of the group. * * @return a structure in which group information is returned * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native H5G_info_t H5Gget_info(int group_id) throws HDF5LibraryException; // int H5Gget_info(int loc_id, H5G_info_t ginfo); /** * H5Gget_info_by_idx retrieves information about a group, according to the * group's position within an index. * * @param group_id * IN: File or group identifier. * @param group_name * IN: Name of group for which information is to be retrieved. * @param idx_type * IN: Type of index by which objects are ordered * @param order * IN: Order of iteration within index * @param n * IN: Attribute's position in index * @param lapl_id * IN: Link access property list. * * @return a structure in which group information is returned * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native H5G_info_t H5Gget_info_by_idx( int group_id, String group_name, int idx_type, int order, long n, int lapl_id) throws HDF5LibraryException, NullPointerException; // int H5Gget_info_by_idx(int group_id, String group_name, // H5_index_t idx_type, H5_iter_order_t order, long n, H5G_info_t ginfo, int // lapl_id); /** * H5Gget_info_by_name retrieves information about the group group_name * located in the file or group specified by loc_id. * * @param group_id * IN: File or group identifier. * @param name * IN: Name of group for which information is to be retrieved. * @param lapl_id * IN: Link access property list. * * @return a structure in which group information is returned * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native H5G_info_t H5Gget_info_by_name( int group_id, String name, int lapl_id) throws HDF5LibraryException, NullPointerException; // int H5Gget_info_by_name(int group_id, String name, H5G_info_t ginfo, int // lapl_id); /** * H5Gget_linkval returns size characters of the link value through the * value argument if loc_id (a file or group identifier) and name specify a * symbolic link. * * @param loc_id * IN: Identifier of the file, group, dataset, or datatype. * @param name * IN: Name of the object whose link value is to be checked. * @param size * IN: Maximum number of characters of value to be returned. * @param value * OUT: Link value. * * @return a non-negative value, with the link value in value, if * successful. * * @exception ArrayIndexOutOfBoundsException * Copy back failed * @exception ArrayStoreException * Copy back failed * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. * @exception IllegalArgumentException * - size is invalid * * @deprecated As of HDF5 1.8, replaced by {@link #H5Lget_val(int, String, String[] , int)} **/ @Deprecated public synchronized static native int H5Gget_linkval(int loc_id, String name, int size, String[] value) throws ArrayIndexOutOfBoundsException, ArrayStoreException, HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * Returns number of objects in the group specified by its identifier * * @param loc_id * Identifier of the group or the file * @param num_obj * Number of objects in the group * @return positive value if successful; otherwise returns a negative value. * @throws HDF5LibraryException * @throws NullPointerException * * @deprecated As of HDF5 1.8, replaced by {@link #H5Gget_info(int)} */ @Deprecated public synchronized static native int H5Gget_num_objs(int loc_id, long[] num_obj) throws HDF5LibraryException, NullPointerException; /** * retrieves information of all objects under the group (name) located in * the file or group specified by loc_id. * * @param loc_id * IN: File or group identifier * @param name * IN: Name of group for which information is to be retrieved * @param objNames * OUT: Names of all objects under the group, name. * @param objTypes * OUT: Types of all objects under the group, name. * * @return the number of items found * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. */ public synchronized static int H5Gget_obj_info_all(int loc_id, String name, String[] oname, int[] otype, long[] ref) throws HDF5LibraryException, NullPointerException { if (oname == null) { throw new NullPointerException( "H5Gget_obj_info_all(): name array is null"); } return H5Gget_obj_info_all(loc_id, name, oname, otype, null, null, ref, HDF5Constants.H5_INDEX_NAME); } public synchronized static int H5Gget_obj_info_all(int loc_id, String name, String[] oname, int[] otype, int[] ltype, long[] ref, int indx_type) throws HDF5LibraryException, NullPointerException { return H5Gget_obj_info_full(loc_id, name, oname, otype, ltype, null, ref, indx_type, -1); } public synchronized static int H5Gget_obj_info_all(int loc_id, String name, String[] oname, int[] otype, int[] ltype, long[] fno, long[] ref, int indx_type) throws HDF5LibraryException, NullPointerException { return H5Gget_obj_info_full(loc_id, name, oname, otype, ltype, fno, ref, oname.length, indx_type, -1); } public synchronized static int H5Gget_obj_info_full(int loc_id, String name, String[] oname, int[] otype, int[] ltype, long[] fno, long[] ref, int indx_type, int indx_order) throws HDF5LibraryException, NullPointerException { if (oname == null) { throw new NullPointerException( "H5Gget_obj_info_full(): name array is null"); } if (otype == null) { throw new NullPointerException( "H5Gget_obj_info_full(): object type array is null"); } if (oname.length == 0) { throw new HDF5LibraryException( "H5Gget_obj_info_full(): array size is zero"); } if (oname.length != otype.length) { throw new HDF5LibraryException( "H5Gget_obj_info_full(): name and type array sizes are different"); } if (ltype == null) ltype = new int[otype.length]; if (fno == null) fno = new long[ref.length]; if (indx_type < 0) indx_type = HDF5Constants.H5_INDEX_NAME; if (indx_order < 0) indx_order = HDF5Constants.H5_ITER_INC; return H5Gget_obj_info_full(loc_id, name, oname, otype, ltype, fno, ref, oname.length, indx_type, indx_order); } private synchronized static native int H5Gget_obj_info_full(int loc_id, String name, String[] oname, int[] otype, int[] ltype, long[] fno, long[] ref, int n, int indx_type, int indx_order) throws HDF5LibraryException, NullPointerException; /** * H5Gget_obj_info_idx report the name and type of object with index 'idx' * in a Group. The 'idx' corresponds to the index maintained by H5Giterate. * Each link is returned, so objects with multiple links will be counted * once for each link. * * @param loc_id * IN: file or group ID. * @param name * IN: name of the group to iterate, relative to the loc_id * @param idx * IN: the index of the object to iterate. * @param oname * the name of the object [OUT] * @param type * the type of the object [OUT] * * @return non-negative if successful, -1 if not. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. */ public synchronized static int H5Gget_obj_info_idx(int loc_id, String name, int idx, String[] oname, int[] type) throws HDF5LibraryException, NullPointerException { long default_buf_size = 4096; String n[] = new String[1]; n[0] = new String(""); int grp_id = H5Gopen(loc_id, name); long val = H5Gget_objname_by_idx(grp_id, idx, n, default_buf_size); int type_code = H5Gget_objtype_by_idx(grp_id, idx); oname[0] = new String(n[0]); type[0] = type_code; int ret = (new Long(val)).intValue(); return ret; } /* * ////////////////////////////////////////////////////////////////////////// * /////// // // //Add these methods so that we don't need to call * //in a loop to get information for all the object * in a group, which takes //a lot of time to finish if the number of * objects is more than 10,000 // * /////////////////////////////////////////// * ////////////////////////////////////// */ /** * retrieves information of all objects (recurvisely) under the group (name) * located in the file or group specified by loc_id upto maximum specified * by objMax. * * @param loc_id * IN: File or group identifier * @param name * IN: Name of group for which information is to be retrieved * @param objNames * OUT: Names of all objects under the group, name. * @param objTypes * OUT: Types of all objects under the group, name. * @param objMax * IN: Maximum number of all objects under the group, name. * * @return the number of items found * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. */ public synchronized static int H5Gget_obj_info_max(int loc_id, String[] objNames, int[] objTypes, int[] lnkTypes, long[] ref, int objMax) throws HDF5LibraryException, NullPointerException { if (objNames == null) { throw new NullPointerException( "H5Gget_obj_info_max(): name array is null"); } if (objTypes == null) { throw new NullPointerException( "H5Gget_obj_info_max(): object type array is null"); } if (lnkTypes == null) { throw new NullPointerException( "H5Gget_obj_info_max(): link type array is null"); } if (objNames.length <= 0) { throw new HDF5LibraryException( "H5Gget_obj_info_max(): array size is zero"); } if (objMax <= 0) { throw new HDF5LibraryException( "H5Gget_obj_info_max(): maximum array size is zero"); } if (objNames.length != objTypes.length) { throw new HDF5LibraryException( "H5Gget_obj_info_max(): name and type array sizes are different"); } return H5Gget_obj_info_max(loc_id, objNames, objTypes, lnkTypes, ref, objMax, objNames.length); } private synchronized static native int H5Gget_obj_info_max(int loc_id, String[] oname, int[] otype, int[] ltype, long[] ref, int amax, int n) throws HDF5LibraryException, NullPointerException; /** * H5Gget_objinfo returns information about the specified object. * * @param loc_id * IN: File, group, dataset, or datatype identifier. * @param name * IN: Name of the object for which status is being sought. * @param follow_link * IN: Link flag. * @param fileno * OUT: file id numbers. * @param objno * OUT: object id numbers. * @param link_info * OUT: link information. * *
     *          link_info[0] = nlink
     *          link_info[1] = type
     *          link_info[2] = linklen
     * 
    * @param mtime * OUT: modification time * * @return a non-negative value if successful, with the fields of link_info * and mtime (if non-null) initialized. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name or array is null. * @exception IllegalArgumentException * - bad argument. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Lget_info(int, String, int) and #H5Oget_info(int)} **/ @Deprecated public synchronized static native int H5Gget_objinfo(int loc_id, String name, boolean follow_link, long[] fileno, long[] objno, int[] link_info, long[] mtime) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Gget_objinfo returns information about the specified object in an * HDF5GroupInfo object. * * @param loc_id * IN: File, group, dataset, or datatype identifier. * @param name * IN: Name of the object for which status is being sought. * @param follow_link * IN: Link flag. * @param info * OUT: the HDF5GroupInfo object to store the object infomation * * @return a non-negative value if successful, with the fields of * HDF5GroupInfo object (if non-null) initialized. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. * * @see ncsa.hdf.hdf5lib.HDF5GroupInfo See public synchronized static native * int H5Gget_objinfo(); * * @deprecated As of HDF5 1.8 **/ @Deprecated public synchronized static int H5Gget_objinfo(int loc_id, String name, boolean follow_link, HDF5GroupInfo info) throws HDF5LibraryException, NullPointerException { int status = -1; long[] fileno = new long[2]; long[] objno = new long[2]; int[] link_info = new int[3]; long[] mtime = new long[1]; status = H5Gget_objinfo(loc_id, name, follow_link, fileno, objno, link_info, mtime); if (status >= 0) { info.setGroupInfo(fileno, objno, link_info[0], link_info[1], mtime[0], link_info[2]); } return status; } /** * Returns a name of an object specified by an index. * * @param group_id * Group or file identifier * @param idx * Transient index identifying object * @param name * the object name * @param size * Name length * @return the size of the object name if successful, or 0 if no name is * associated with the group identifier. Otherwise returns a * negative value * @throws HDF5LibraryException * @throws NullPointerException * * @deprecated As of HDF5 1.8, replaced by {@link #H5Lget_name_by_idx(int, String, int, int, long, int)} */ @Deprecated public synchronized static native long H5Gget_objname_by_idx(int group_id, long idx, String[] name, long size) throws HDF5LibraryException, NullPointerException; /** * Returns the type of an object specified by an index. * * @param group_id * Group or file identifier. * @param idx * Transient index identifying object. * @return Returns the type of the object if successful. Otherwise returns a * negative value * @throws HDF5LibraryException * @throws NullPointerException * * @deprecated As of HDF5 1.8, replaced by {@link #H5Oget_info(int)} */ @Deprecated public synchronized static native int H5Gget_objtype_by_idx(int group_id, long idx) throws HDF5LibraryException, NullPointerException; /** * H5Glink creates a new name for an already existing object. * * @param loc_id * File, group, dataset, or datatype identifier. * @param link_type * Link type. Possible values are: *
      *
    • * H5G_LINK_HARD
    • *
    • * H5G_LINK_SOFT.
    • *
    * @param current_name * A name of the existing object if link is a hard link. Can be * anything for the soft link. * @param new_name * New name for the object. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - current_name or name is null. * * @deprecated As of HDF5 1.8, replaced by * {@link #H5Lcreate_hard(int, String, int, String, int, int) * and #H5Lcreate_soft(String, int, String, int, int) } **/ @Deprecated public synchronized static native int H5Glink(int loc_id, int link_type, String current_name, String new_name) throws HDF5LibraryException, NullPointerException; /** * H5Glink creates a new name for an already existing object. * * @deprecated As of HDF5 1.8 **/ @Deprecated public synchronized static native int H5Glink2(int curr_loc_id, String current_name, int link_type, int new_loc_id, String new_name) throws HDF5LibraryException, NullPointerException; /** * H5Gunlink removes an association between a name and an object. * * @param loc_id * Identifier of the file containing the object. * @param name * Name of the object to unlink. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Ldelete(int, String, int)} **/ @Deprecated public synchronized static native int H5Gunlink(int loc_id, String name) throws HDF5LibraryException, NullPointerException; /** * H5Gmove renames an object within an HDF5 file. The original name, src, is * unlinked from the group graph and the new name, dst, is inserted as an * atomic operation. Both names are interpreted relative to loc_id, which is * either a file or a group identifier. * * @param loc_id * File or group identifier. * @param src * Object's original name. * @param dst * Object's new name. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - src or dst is null. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Lmove(int, String, int,String, int, int)} **/ @Deprecated public synchronized static native int H5Gmove(int loc_id, String src, String dst) throws HDF5LibraryException, NullPointerException; // Backward compatibility: // These functions have been replaced by new HDF5 library calls. // The interface is preserved as a convenience to existing code. /** * H5Gn_members report the number of objects in a Group. The 'objects' * include everything that will be visited by H5Giterate. Each link is * returned, so objects with multiple links will be counted once for each * link. * * @param loc_id * file or group ID. * @param name * name of the group to iterate, relative to the loc_id * * @return the number of members in the group or -1 if error. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. */ public synchronized static long H5Gn_members_long(int loc_id, String name) throws HDF5LibraryException, NullPointerException { int grp_id = H5Gopen(loc_id, name); long n = -1; try { H5G_info_t info = H5.H5Gget_info(grp_id); n = info.nlinks; } finally { H5Gclose(grp_id); } return n; } /** * H5Gn_members report the number of objects in a Group. The 'objects' * include everything that will be visited by H5Giterate. Each link is * returned, so objects with multiple links will be counted once for each * link. * * @param loc_id * file or group ID. * @param name * name of the group to iterate, relative to the loc_id * * @return the number of members in the group or -1 if error. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. */ public synchronized static int H5Gn_members(int loc_id, String name) throws HDF5LibraryException, NullPointerException { return (int) H5Gn_members_long(loc_id, name); } /** * H5Gopen opens an existing group with the specified name at the specified * location, loc_id. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Gopen(int, String, int) } * * @param loc_id * File or group identifier within which group is to be open. * @param name * Name of group to open. * * @return a valid group identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ @Deprecated public static int H5Gopen(int loc_id, String name) throws HDF5LibraryException, NullPointerException { int id = _H5Gopen(loc_id, name); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Gopen(int loc_id, String name) throws HDF5LibraryException, NullPointerException; /** * H5Gopen opens an existing group, name, at the location specified by * loc_id. * * @param loc_id * IN: File or group identifier specifying the location of the * group to be opened. * @param name * IN: Name of group to open. * @param gapl_id * IN: Identifier of group access property list. (No group access * properties have been implemented at this time; use * H5P_DEFAULT.) * * @return a valid group identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public static int H5Gopen(int loc_id, String name, int gapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Gopen2(loc_id, name, gapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Gopen2(int loc_id, String name, int gapl_id) throws HDF5LibraryException, NullPointerException; ////////////////////////////////////////////////////////////// //// //H5I: HDF5 1.8 Identifier Interface API Functions // //// ////////////////////////////////////////////////////////////// public synchronized static native int H5Iget_file_id(int obj_id) throws HDF5LibraryException; public synchronized static native long H5Iget_name(int obj_id, String[] name, long size) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Iget_ref(int obj_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Idec_ref(int obj_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Iinc_ref(int obj_id) throws HDF5LibraryException, NullPointerException; /** * H5Iget_type retrieves the type of the object identified by obj_id. * * @param obj_id * IN: Object identifier whose type is to be determined. * * @return the object type if successful; otherwise H5I_BADID. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Iget_type(int obj_id) throws HDF5LibraryException; /** * H5Iget_type_ref retrieves the reference count on an ID type. The reference count is used by the library to indicate when an ID type can be destroyed. * * @param type * IN: The identifier of the type whose reference count is to be retrieved * * @return The current reference count on success, negative on failure. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Iget_type_ref(int type) throws HDF5LibraryException; /** * H5Inmembers returns the number of identifiers of the identifier type specified in type. * * @param type * IN: Identifier for the identifier type whose member count will be retrieved * * @return Number of identifiers of the specified identifier type * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Inmembers(int type) throws HDF5LibraryException; // ////////////////////////////////////////////////////////////////// // // // New APIs for HDF5Index // // October 10, 2005 // // ////////////////////////////////////////////////////////////////// public synchronized static native int H5INcreate(String grp_name, int grp_loc_id, int property_list, int data_loc_id, String data_loc_name, String field_name, long max_mem_size); public synchronized static native int H5INquery(int dset_id, String keys[], Object ubounds, Object lbounds, int nkeys); // ////////////////////////////////////////////////////////////////// // H5L: Link Interface Functions // // ////////////////////////////////////////////////////////////////// /** * H5Lcopy copies a link from one location to another. * * @param src_loc IN: Location identifier of the source link * @param src_name IN: Name of the link to be copied * @param dst_loc IN: Location identifier specifying the destination of the copy * @param dst_name IN: Name to be assigned to the new copy * @param lcpl_id IN: Link creation property list identifier * @param lapl_id IN: Link access property list identifier * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native void H5Lcopy(int src_loc, String src_name, int dst_loc, String dst_name, int lcpl_id, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lcreate_external creates a new soft link to an external object, which is * an object in a different HDF5 file from the location of the link. * * @param file_name IN: Name of the target file containing the target object. * @param obj_name IN: Path within the target file to the target object. * @param link_loc_id IN: The file or group identifier for the new link. * @param link_name IN: The name of the new link. * @param lcpl_id IN: Link creation property list identifier * @param lapl_id IN: Link access property list identifier * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native void H5Lcreate_external(String file_name, String obj_name, int link_loc_id, String link_name, int lcpl_id, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lcreate_hard creates a new hard link to a pre-existing object in an HDF5 file. * * @param cur_loc IN: The file or group identifier for the target object. * @param cur_name IN: Name of the target object, which must already exist. * @param dst_loc IN: The file or group identifier for the new link. * @param dst_name IN: The name of the new link. * @param lcpl_id IN: Link creation property list identifier * @param lapl_id IN: Link access property list identifier * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - cur_name or dst_name is null. **/ public synchronized static native void H5Lcreate_hard(int cur_loc, String cur_name, int dst_loc, String dst_name, int lcpl_id, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lcreate_soft creates a new soft link to an object in an HDF5 file. * * @param link_target IN: Path to the target object, which is not required to exist. * @param link_loc_id IN: The file or group identifier for the new link. * @param link_name IN: The name of the new link. * @param lcpl_id IN: Link creation property list identifier * @param lapl_id IN: Link access property list identifier * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - link_name is null. **/ public synchronized static native void H5Lcreate_soft(String link_target, int link_loc_id, String link_name, int lcpl_id, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Ldelete removes the link specified from a group. * * @param loc_id IN: Identifier of the file or group containing the object. * @param name IN: Name of the link to delete. * @param lapl_id IN: Link access property list identifier * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native void H5Ldelete(int loc_id, String name, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Ldelete_by_idx removes the nth link in a group according to the specified order * and in the specified index. * * @param loc_id IN: File or group identifier specifying location of subject group * @param group_name IN: Name of subject group * @param idx_type IN: Index or field which determines the order * @param order IN: Order within field or index * @param n IN: Link for which to retrieve information * @param lapl_id IN: Link access property list identifier * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - group_name is null. **/ public synchronized static native void H5Ldelete_by_idx(int loc_id, String group_name, int idx_type, int order, long n, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lexists checks if a link with a particular name exists in a group. * * @param loc_id IN: Identifier of the file or group to query. * @param name IN: The name of the link to check. * @param lapl_id IN: Link access property list identifier * * @return a boolean, true if the name exists, otherwise false. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native boolean H5Lexists(int loc_id, String name, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lget_info returns information about the specified link. * * @param loc_id IN: Identifier of the file or group. * @param name IN: Name of the link for which information is being sought. * @param lapl_id IN: Link access property list identifier * * @return a buffer(H5L_info_t) for the link information. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native H5L_info_t H5Lget_info(int loc_id, String name, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lget_info_by_idx opens a named datatype at the location specified * by loc_id and return an identifier for the datatype. * * @param loc_id IN: File or group identifier specifying location of subject group * @param group_name IN: Name of subject group * @param idx_type IN: Type of index * @param order IN: Order within field or index * @param n IN: Link for which to retrieve information * @param lapl_id IN: Link access property list identifier * * @return a buffer(H5L_info_t) for the link information. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - group_name is null. **/ public synchronized static native H5L_info_t H5Lget_info_by_idx(int loc_id, String group_name, int idx_type, int order, long n, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lget_name_by_idx retrieves name of the nth link in a group, according to * the order within a specified field or index. * * @param loc_id IN: File or group identifier specifying location of subject group * @param group_name IN: Name of subject group * @param idx_type IN: Type of index * @param order IN: Order within field or index * @param n IN: Link for which to retrieve information * @param lapl_id IN: Link access property list identifier * * @return a String for the link name. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - group_name is null. **/ public synchronized static native String H5Lget_name_by_idx(int loc_id, String group_name, int idx_type, int order, long n, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lget_val returns the link value of a symbolic link. * * @param loc_id IN: Identifier of the file or group containing the object. * @param name IN: Name of the symbolic link. * @param link_value OUT: Path of the symbolic link, or the file_name and path of an external file. * @param lapl_id IN: Link access property list identifier * * @return the link type * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native int H5Lget_val(int loc_id, String name, String[] link_value, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lget_val_by_idx retrieves value of the nth link in a group, according to the order within an index. * * @param loc_id IN: File or group identifier specifying location of subject group * @param group_name IN: Name of subject group * @param idx_type IN: Type of index * @param order IN: Order within field or index * @param n IN: Link for which to retrieve information * @param link_value OUT: Path of the symbolic link, or the file_name and path of an external file. * @param lapl_id IN: Link access property list identifier * * @return the link type * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - group_name is null. **/ public synchronized static native int H5Lget_val_by_idx(int loc_id, String group_name, int idx_type, int order, long n, String[] link_value, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Literate iterates through links in a group. * * @param grp_id IN: Identifier specifying subject group * @param idx_type IN: Type of index * @param order IN: Order of iteration within index * @param idx IN: Iteration position at which to start * @param op IN: Callback function passing data regarding the link to the calling application * @param op_data IN: User-defined pointer to data required by the application for its processing of the link * * @return returns the return value of the first operator that returns a positive value, or zero if all members were * processed with no operator returning non-zero. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Literate(int grp_id, int idx_type, int order, long idx, H5L_iterate_cb op, H5L_iterate_t op_data) throws HDF5LibraryException; /** * H5Literate_by_name iterates through links in a group. * * @param grp_id IN: Identifier specifying subject group * @param group_name IN: Name of subject group * @param idx_type IN: Type of index * @param order IN: Order of iteration within index * @param idx IN: Iteration position at which to start * @param op IN: Callback function passing data regarding the link to the calling application * @param op_data IN: User-defined pointer to data required by the application for its processing of the link * @param lapl_id IN: Link access property list identifier * * @return returns the return value of the first operator that returns a positive value, or zero if all members were * processed with no operator returning non-zero. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - group_name is null. **/ public synchronized static native int H5Literate_by_name(int loc_id, String group_name, int idx_type, int order, long idx, H5L_iterate_cb op, H5L_iterate_t op_data, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lmove renames a link within an HDF5 file. * * @param src_loc IN: Original file or group identifier. * @param src_name IN: Original link name. * @param dst_loc IN: Destination file or group identifier. * @param dst_name IN: New link name. * @param lcpl_id IN: Link creation property list identifier to be associated with the new link. * @param lapl_id IN: Link access property list identifier to be associated with the new link. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native void H5Lmove(int src_loc, String src_name, int dst_loc, String dst_name, int lcpl_id, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Lvisit recursively visits all links starting from a specified group. * * @param grp_id IN: Identifier specifying subject group * @param idx_type IN: Type of index * @param order IN: Order of iteration within index * @param op IN: Callback function passing data regarding the link to the calling application * @param op_data IN: User-defined pointer to data required by the application for its processing of the link * * @return returns the return value of the first operator that returns a positive value, or zero if all members were * processed with no operator returning non-zero. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Lvisit(int grp_id, int idx_type, int order, H5L_iterate_cb op, H5L_iterate_t op_data) throws HDF5LibraryException; /** * H5Lvisit_by_name recursively visits all links starting from a specified group. * * @param loc_id IN: Identifier specifying subject group * @param group_name IN: Name of subject group * @param idx_type IN: Type of index * @param order IN: Order of iteration within index * @param op IN: Callback function passing data regarding the link to the calling application * @param op_data IN: User-defined pointer to data required by the application for its processing of the link * * @return returns the return value of the first operator that returns a positive value, or zero if all members were * processed with no operator returning non-zero. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - group_name is null. **/ public synchronized static native int H5Lvisit_by_name(int loc_id, String group_name, int idx_type, int order, H5L_iterate_cb op, H5L_iterate_t op_data, int lapl_id) throws HDF5LibraryException, NullPointerException; ////////////////////////////////////////////////////////////// //// //H5O: HDF5 1.8 Object Interface API Functions // //// ////////////////////////////////////////////////////////////// /** * H5Oclose closes the group, dataset, or named datatype specified. * * @param object_id IN: Object identifier * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Oclose(int object_id) throws HDF5LibraryException { if (object_id < 0) throw new HDF5LibraryException("Negative ID");; OPEN_IDS.removeElement(object_id); return _H5Oclose(object_id); } private synchronized static native int _H5Oclose(int object_id) throws HDF5LibraryException; /** * H5Ocopy copies the group, dataset or named datatype specified from the file or * group specified by source location to the destination location. * * @param src_loc_id IN: Object identifier indicating the location of the source object to be copied * @param src_name IN: Name of the source object to be copied * @param dst_loc_id IN: Location identifier specifying the destination * @param dst_name IN: Name to be assigned to the new copy * @param ocpypl_id IN: Object copy property list * @param lcpl_id IN: Link creation property list for the new hard link * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native void H5Ocopy(int src_loc_id, String src_name, int dst_loc_id, String dst_name, int ocpypl_id, int lcpl_id) throws HDF5LibraryException, NullPointerException; /** * H5Oget_comment retrieves the comment for the specified object. * * @param obj_id IN: File or group identifier * * @return the comment * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native String H5Oget_comment(int obj_id) throws HDF5LibraryException; /** * H5Oset_comment sets the comment for the specified object. * * @param obj_id IN: Identifier of the target object * @param comment IN: The new comment. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native void H5Oset_comment(int obj_id, String comment) throws HDF5LibraryException; /** * H5Oget_comment_by_name retrieves the comment for an object. * * @param loc_id IN: Identifier of a file, group, dataset, or named datatype. * @param name IN: Relative name of the object whose comment is to be set or reset. * @param lapl_id IN: Link access property list identifier. * * @return the comment * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native String H5Oget_comment_by_name(int loc_id, String name, int lapl_id) throws HDF5LibraryException, NullPointerException; //long H5Oget_comment_by_name(int loc_id, String name, String comment, long bufsize, int lapl_id); /** * H5Oset_comment_by_name sets the comment for the specified object. * * @param loc_id IN: Identifier of a file, group, dataset, or named datatype. * @param name IN: Relative name of the object whose comment is to be set or reset. * @param comment IN: The new comment. * @param lapl_id IN: Link access property list identifier. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native void H5Oset_comment_by_name(int loc_id, String name, String comment, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Oget_info retrieves the metadata for an object specified by an identifier. * * @param loc_id IN: Identifier for target object * * @return object information * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native H5O_info_t H5Oget_info(int loc_id) throws HDF5LibraryException, NullPointerException; /** * H5Oget_info_by_idx retrieves the metadata for an object, identifying the object by an index position. * * @param loc_id IN: File or group identifier * @param group_name IN: Name of group, relative to loc_id, in which object is located * @param idx_type IN: Type of index by which objects are ordered * @param order IN: Order of iteration within index * @param n IN: Object to open * @param lapl_id IN: Access property list identifier for the link pointing to the object (Not currently used; pass as H5P_DEFAULT.) * * @return object information * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native H5O_info_t H5Oget_info_by_idx(int loc_id, String group_name, int idx_type, int order, long n, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Oget_info_by_name retrieves the metadata for an object, identifying the object by location and relative name. * * @param loc_id IN: File or group identifier specifying location of group in which object is located * @param name IN: Relative name of group * @param lapl_id IN: Access property list identifier for the link pointing to the object (Not currently used; pass as H5P_DEFAULT.) * * @return object information * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native H5O_info_t H5Oget_info_by_name(int loc_id, String name, int lapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Olink creates a new hard link to an object in an HDF5 file. * * @param obj_id IN: Object to be linked. * @param new_loc_id IN: File or group identifier specifying location at which object is to be linked. * @param name IN: Relative name of link to be created. * @param lcpl_id IN: Link creation property list identifier. * @param lapl_id IN: Access property list identifier. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native void H5Olink(int obj_id, int new_loc_id, String new_name, int lcpl_id, int lapl_id) throws HDF5LibraryException, NullPointerException; ///** //* H5Odecr_refcount decrements the hard link reference count for an object. //* //* @param object_id IN: Object identifier //* //* @return none //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //**/ // //public synchronized static native void H5Odecr_refcount(int object_id) // throws HDF5LibraryException; ///** //* H5Oincr_refcount increments the hard link reference count for an object. //* //* @param object_id IN: Object identifier //* //* @return none //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //**/ //public synchronized static native void H5Oincr_refcount(int object_id) // throws HDF5LibraryException; /** * H5Oopen opens a group, dataset, or named datatype specified by a location and a path name. * * @param loc_id IN: File or group identifier * @param name IN: Relative path to the object * @param lapl_id IN: Access property list identifier for the link pointing to the object * * @return an object identifier for the opened object * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public static int H5Oopen(int loc_id, String name, int lapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Oopen(loc_id, name, lapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Oopen(int loc_id, String name, int lapl_id) throws HDF5LibraryException, NullPointerException; // ///** //* H5Oopen_by_addr opens a group, dataset, or named datatype using its address within an HDF5 file. //* //* @param loc_id IN: File or group identifier //* @param addr IN: Object's address in the file //* //* @return an object identifier for the opened object //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //**/ //public synchronized static native int H5Oopen_by_addr(int loc_id, long addr) // throws HDF5LibraryException; // ///** //* H5Oopen_by_idx opens the nth object in the group specified. //* //* @param loc_id IN: File or group identifier //* @param group_name IN: Name of group, relative to loc_id, in which object is located //* @param idx_type IN: Type of index by which objects are ordered //* @param order IN: Order of iteration within index //* @param n IN: Object to open //* @param lapl_id IN: Access property list identifier for the link pointing to the object //* //* @return an object identifier for the opened object //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //* @exception NullPointerException - group_name is null. //**/ //public synchronized static native int H5Oopen_by_idx(int loc_id, String group_name, // H5_INDEX idx_type, H5_ITER order, long n, int lapl_id) // throws HDF5LibraryException, NullPointerException; ////Prototype for H5Ovisit/H5Ovisit_by_name() operator //public interface H5O_iterate_t extends Callback //{ // int callback(int obj, String name, H5O_info_t info, // Pointer op_data); //} /** * H5Ovisit recursively visits all objects accessible from a specified object. * * @param obj_id IN: Identifier of the object at which the recursive iteration begins. * @param idx_type IN: Type of index * @param order IN: Order of iteration within index * @param op IN: Callback function passing data regarding the object to the calling application * @param op_data IN: User-defined pointer to data required by the application for its processing of the object * * @return returns the return value of the first operator that returns a positive value, or zero if all members were processed with no operator returning non-zero. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native int H5Ovisit(int obj_id, int idx_type, int order, H5O_iterate_cb op, H5O_iterate_t op_data) throws HDF5LibraryException, NullPointerException; /** * H5Ovisit_by_name recursively visits all objects starting from a specified object. * * @param loc_id IN: File or group identifier * @param obj_name IN: Relative path to the object * @param idx_type IN: Type of index * @param order IN: Order of iteration within index * @param op IN: Callback function passing data regarding the object to the calling application * @param op_data IN: User-defined pointer to data required by the application for its processing of the object * @param lapl_id IN: Link access property list identifier * * @return returns the return value of the first operator that returns a positive value, or zero if all members were processed with no operator returning non-zero. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native int H5Ovisit_by_name(int loc_id, String obj_name, int idx_type, int order, H5O_iterate_cb op, H5O_iterate_t op_data, int lapl_id) throws HDF5LibraryException, NullPointerException; // //////////////////////////////////////////////////////////// // // // H5P: Property List Interface Functions // // // // //////////////////////////////////////////////////////////// public synchronized static native boolean H5Pall_filters_avail(int dcpl_id) throws HDF5LibraryException, NullPointerException; /** * H5Pclose terminates access to a property list. * * @param plist * IN: Identifier of the property list to terminate access to. * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Pclose(int plist) throws HDF5LibraryException { if (plist < 0) throw new HDF5LibraryException("Negative ID");; OPEN_IDS.removeElement(plist); return _H5Pclose(plist); } private synchronized static native int _H5Pclose(int plist) throws HDF5LibraryException; /** * Closes an existing property list class * * @param plid * IN: Property list class to close * @return a non-negative value if successful; a negative value if failed * @throws HDF5LibraryException */ public synchronized static native int H5Pclose_class(int plid) throws HDF5LibraryException; /** * H5Pcopy copies an existing property list to create a new property list. * * @param plist * IN: Identifier of property list to duplicate. * * @return a property list identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Pcopy(int plist) throws HDF5LibraryException { int id = _H5Pcopy(plist); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Pcopy(int plist) throws HDF5LibraryException; /** * H5Pcopy_prop copies a property from one property list or class to another * * @param dst_id * IN: Identifier of the destination property list or class * @param src_id * IN: Identifier of the source property list or class * @param name * IN: Name of the property to copy * @return a non-negative value if successful; a negative value if failed * @throws HDF5LibraryException */ public synchronized static native int H5Pcopy_prop(int dst_id, int src_id, String name) throws HDF5LibraryException; /** * H5Pcreate creates a new property as an instance of some property list * class. * * @param type * IN: The type of property list to create. * * @return a property list identifier (plist) if successful; otherwise Fail * (-1). * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Pcreate(int type) throws HDF5LibraryException { int id = _H5Pcreate(type); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Pcreate(int type) throws HDF5LibraryException; //hid_t H5Pcreate_class( hid_t parent_class, const char *name, H5P_cls_create_func_t create, void *create_data, H5P_cls_copy_func_t copy, void *copy_data, H5P_cls_close_func_t close, void *close_data ) /** * H5Pequal determines if two property lists or classes are equal * * @param plid1 * IN: First property object to be compared * @param plid2 * IN: Second property object to be compared * @return positive value if equal; zero if unequal, a negative value if * failed * @throws HDF5LibraryException */ public synchronized static native int H5Pequal(int plid1, int plid2) throws HDF5LibraryException; public static boolean H5P_equal(int plid1, int plid2) throws HDF5LibraryException { if(H5Pequal(plid1, plid2)==1) return true; return false; } /** * H5Pexist determines whether a property exists within a property list or * class * * @param plid * IN: Identifier for the property to query * @param name * IN: Name of property to check for * @return a positive value if the property exists in the property object; * zero if the property does not exist; a negative value if failed * @throws HDF5LibraryException */ public synchronized static native int H5Pexist(int plid, String name) throws HDF5LibraryException; public synchronized static native int H5Pfill_value_defined(int plist_id, int[] status) throws HDF5LibraryException, NullPointerException; /** * H5Pget retrieves a copy of the value for a property in a property list * (support integer only) * * @param plid * IN: Identifier of property object to query * @param name * IN: Name of property to query * @return value for a property if successful; a negative value if failed * @throws HDF5LibraryException */ public synchronized static native int H5Pget(int plid, String name) throws HDF5LibraryException; /** * Sets a property list value (support integer only) * * @param plid * IN: Property list identifier to modify * @param name * IN: Name of property to modify * @param value * IN: value to set the property to * @return a non-negative value if successful; a negative value if failed * @throws HDF5LibraryException */ public synchronized static native int H5Pset(int plid, String name, int value) throws HDF5LibraryException; /** * H5Pget_alignment retrieves the current settings for alignment properties * from a file access property list. * * @param plist * IN: Identifier of a file access property list. * @param alignment * OUT: threshold value and alignment value. * *
     *      alignment[0] = threshold // threshold value
     *      alignment[1] = alignment // alignment value
     * 
    * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - aligment array is null. * @exception IllegalArgumentException * - aligment array is invalid. **/ public synchronized static native int H5Pget_alignment(int plist, long[] alignment) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Pset_alignment sets the alignment properties of a file access property * list so that any file object >= THRESHOLD bytes will be aligned on an * address which is a multiple of ALIGNMENT. * * @param plist * IN: Identifier for a file access property list. * @param threshold * IN: Threshold value. * @param alignment * IN: Alignment value. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_alignment(int plist, long threshold, long alignment) throws HDF5LibraryException; public synchronized static native int H5Pget_alloc_time(int plist_id, int[] alloc_time) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_alloc_time(int plist_id, int alloc_time) throws HDF5LibraryException, NullPointerException; /** * H5Pget_attr_creation_order retrieves the settings for tracking and indexing attribute creation order on an object * @param ocpl_id IN: Object (group or dataset) creation property list identifier * * @return Flags specifying whether to track and index attribute creation order * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pget_attr_creation_order(int ocpl_id) throws HDF5LibraryException; /** * H5Pset_attr_creation_order sets flags specifying whether to track and index attribute creation order on an object. * @param ocpl_id IN: Object creation property list identifier * @param crt_order_flags IN: Flags specifying whether to track and index attribute creation order * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pset_attr_creation_order(int ocpl_id, int crt_order_flags) throws HDF5LibraryException; /** * H5Pget_attr_phase_change retrieves attribute storage phase change thresholds. * @param ocpl_id IN: : Object (dataset or group) creation property list identifier * @param attributes * The maximun and minimum no. of attributes * to be stored. * *
    *      attributes[0] =  The maximum number of attributes to be stored in compact storage
    *      attributes[1] =  The minimum number of attributes to be stored in dense storage 
    *      
    * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - size is null. * **/ public synchronized static native int H5Pget_attr_phase_change(int ocpl_id, int []attributes) throws HDF5LibraryException, NullPointerException; //herr_t H5Pset_attr_phase_change( hid_t ocpl_id, unsigned max_compact, unsigned min_dense ) /** * H5Pget_btree_ratio Get the B-tree split ratios for a dataset transfer * property list. * * @param plist_id * IN Dataset transfer property list * @param left * OUT split ratio for leftmost nodes * @param right * OUT split ratio for righttmost nodes * @param middle * OUT split ratio for all other nodes * * @return non-negative if succeed * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - an input array is null. **/ public synchronized static native int H5Pget_btree_ratios(int plist_id, double[] left, double[] middle, double[] right) throws HDF5LibraryException, NullPointerException; /** * H5Pset_btree_ratio Sets B-tree split ratios for a dataset transfer * property list. The split ratios determine what percent of children go in * the first node when a node splits. * * @param plist_id * IN Dataset transfer property list * @param left * IN split ratio for leftmost nodes * @param right * IN split ratio for righttmost nodes * @param middle * IN split ratio for all other nodes * * @return non-negative if succeed * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_btree_ratios(int plist_id, double left, double middle, double right) throws HDF5LibraryException; /** * HH5Pget_buffer gets type conversion and background buffers. Returns * buffer size, in bytes, if successful; otherwise 0 on failure. * * @param plist * Identifier for the dataset transfer property list. * @param tconv * byte array of application-allocated type conversion buffer. * @param bkg * byte array of application-allocated background buffer. * * @return buffer size, in bytes, if successful; otherwise 0 on failure * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception IllegalArgumentException * - plist is invalid. **/ public synchronized static native int H5Pget_buffer(int plist, byte[] tconv, byte[] bkg) throws HDF5LibraryException, IllegalArgumentException; public synchronized static native long H5Pget_buffer_size(int plist) throws HDF5LibraryException, IllegalArgumentException; /** * H5Pset_buffer sets type conversion and background buffers. status to TRUE * or FALSE. * * Given a dataset transfer property list, H5Pset_buffer sets the maximum * size for the type conversion buffer and background buffer and optionally * supplies pointers to application-allocated buffers. If the buffer size is * smaller than the entire amount of data being transferred between the * application and the file, and a type conversion buffer or background * buffer is required, then strip mining will be used. * * Note that there are minimum size requirements for the buffer. Strip * mining can only break the data up along the first dimension, so the * buffer must be large enough to accommodate a complete slice that * encompasses all of the remaining dimensions. For example, when strip * mining a 100x200x300 hyperslab of a simple data space, the buffer must be * large enough to hold 1x200x300 data elements. When strip mining a * 100x200x300x150 hyperslab of a simple data space, the buffer must be * large enough to hold 1x200x300x150 data elements. * * If tconv and/or bkg are null pointers, then buffers will be allocated and * freed during the data transfer. * * @param plist * Identifier for the dataset transfer property list. * @param size * Size, in bytes, of the type conversion and background buffers. * @param tconv * byte array of application-allocated type conversion buffer. * @param bkg * byte array of application-allocated background buffer. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception IllegalArgumentException * - plist is invalid. **/ public synchronized static native void H5Pset_buffer_size(int plist, long size) throws HDF5LibraryException, IllegalArgumentException; /** * Retrieves the maximum possible number of elements in the meta data cache * and the maximum possible number of bytes and the RDCC_W0 value in the raw * data chunk cache. * * @param plist IN: Identifier of the file access property list. * @param mdc_nelmts IN/OUT: No longer used, will be ignored. * @param rdcc_nelmts IN/OUT: Number of elements (objects) in the raw data chunk cache. * @param rdcc_nbytes IN/OUT: Total size of the raw data chunk cache, in bytes. * @param rdcc_w0 IN/OUT: Preemption policy. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - an array is null. **/ public synchronized static native int H5Pget_cache(int plist, int[] mdc_nelmts, long[] rdcc_nelmts, long[] rdcc_nbytes, double[] rdcc_w0) throws HDF5LibraryException, NullPointerException; /** * @deprecated As of HDF5 1.8, replaced by {@link #H5Pget_cache(int, int[], long[], long[], double[]) } * because of possible loss of precision **/ @Deprecated public static int H5Pget_cache(int plist, int[] mdc_nelmts, int[] rdcc_nelmts, int[] rdcc_nbytes, double[] rdcc_w0) throws HDF5LibraryException, NullPointerException { long[] rdcc_nelmts_l = {rdcc_nelmts[0]}; long[] rdcc_nbytes_l = {rdcc_nbytes[0]}; int retval = H5Pget_cache(plist, mdc_nelmts, rdcc_nelmts_l, rdcc_nbytes_l, rdcc_w0); rdcc_nelmts[0] = (int)rdcc_nelmts_l[0]; rdcc_nbytes[0] = (int)rdcc_nbytes_l[0]; return retval; } /** * H5Pset_cache sets the number of elements (objects) in the meta data cache * and the total number of bytes in the raw data chunk cache. * * @param plist IN: Identifier of the file access property list. * @param mdc_nelmts IN: No longer used, will be ignored. * @param rdcc_nelmts IN: Number of elements (objects) in the raw data chunk cache. * @param rdcc_nbytes IN: Total size of the raw data chunk cache, in bytes. * @param rdcc_w0 IN: Preemption policy. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_cache(int plist, int mdc_nelmts, long rdcc_nelmts, long rdcc_nbytes, double rdcc_w0) throws HDF5LibraryException; public synchronized static native int H5Pget_char_encoding(int plist_id) throws HDF5LibraryException; public synchronized static native void H5Pset_char_encoding(int plist_id, int encoding) throws HDF5LibraryException; /** * H5Pget_chunk retrieves the size of chunks for the raw data of a chunked * layout dataset. * * @param plist * IN: Identifier of property list to query. * @param max_ndims * IN: Size of the dims array. * @param dims * OUT: Array to store the chunk dimensions. * * @return chunk dimensionality successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - dims array is null. * @exception IllegalArgumentException * - max_ndims <=0 **/ public synchronized static native int H5Pget_chunk(int plist, int max_ndims, long[] dims) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Pset_chunk sets the size of the chunks used to store a chunked layout * dataset. * * @param plist * IN: Identifier for property list to query. * @param ndims * IN: The number of dimensions of each chunk. * @param dim * IN: An array containing the size of each chunk. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - dims array is null. * @exception IllegalArgumentException * - dims <=0 **/ public synchronized static native int H5Pset_chunk(int plist, int ndims, byte[] dim) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; public synchronized static int H5Pset_chunk(int plist, int ndims, long[] dim) throws HDF5Exception, NullPointerException, IllegalArgumentException { if (dim == null) { return -1; } HDFArray theArray = new HDFArray(dim); byte[] thedims = theArray.byteify(); int retVal = H5Pset_chunk(plist, ndims, thedims); thedims = null; theArray = null; return retVal; } /** * Retrieves the maximum possible number of elements in the meta data cache * and the maximum possible number of bytes and the RDCC_W0 value in the raw * data chunk cache on a per-datset basis. * * @param dapl_id IN: Identifier of the dataset access property list. * @param rdcc_nslots IN/OUT: Number of elements (objects) in the raw data chunk cache. * @param rdcc_nbytes IN/OUT: Total size of the raw data chunk cache, in bytes. * @param rdcc_w0 IN/OUT: Preemption policy. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - an array is null. **/ public synchronized static native void H5Pget_chunk_cache(int dapl_id, long[] rdcc_nslots, long[] rdcc_nbytes, double[] rdcc_w0) throws HDF5LibraryException, NullPointerException; /** * H5Pset_chunk_cache sets the number of elements (objects) in the meta data cache * and the total number of bytes in the raw data chunk cache on a per-datset basis. * * @param dapl_id IN: Identifier of the datset access property list. * @param rdcc_nslots IN: Number of elements (objects) in the raw data chunk cache. * @param rdcc_nbytes IN: Total size of the raw data chunk cache, in bytes. * @param rdcc_w0 IN: Preemption policy. * * @return none * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native void H5Pset_chunk_cache(int dapl_id, long rdcc_nslots, long rdcc_nbytes, double rdcc_w0) throws HDF5LibraryException; /** * H5Pget_class returns the property list class for the property list * identified by the plist parameter. * * @param plist * IN: Identifier of property list to query. * @return a property list class if successful. Otherwise returns * H5P_NO_CLASS (-1). * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pget_class(int plist) throws HDF5LibraryException; /** * H5Pget_class_name retrieves the name of a generic property list class * * @param plid * IN: Identifier of property object to query * @return name of a property list if successful; null if failed * @throws HDF5LibraryException */ public synchronized static native String H5Pget_class_name(int plid) throws HDF5LibraryException; /** * H5Pget_class_parent retrieves an identifier for the parent class of a * property class * * @param plid * IN: Identifier of the property class to query * @return a valid parent class object identifier if successful; a negative * value if failed * @throws HDF5LibraryException */ public synchronized static native int H5Pget_class_parent(int plid) throws HDF5LibraryException; /** * H5Pget_copy_object retrieves the properties to be used when an object is copied. * @param ocp_plist_id IN: Object copy property list identifier * * @return Copy option(s) set in the object copy property list * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pget_copy_object(int ocp_plist_id) throws HDF5LibraryException; /** * H5Pset_copy_object Sets properties to be used when an object is copied. * @param ocp_plist_id IN: Object copy property list identifier * @param copy_options IN: Copy option(s) to be set * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native void H5Pset_copy_object(int ocp_plist_id, int copy_options) throws HDF5LibraryException; /** * H5Pget_create_intermediate_group determines whether property is set to enable creating missing intermediate groups. * @param lcpl_id IN: Link creation property list identifier * * @return Boolean true or false * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native boolean H5Pget_create_intermediate_group(int lcpl_id) throws HDF5LibraryException; /** * H5Pset_create_intermediate_group specifies in property list whether to create missing intermediate groups * @param lcpl_id IN: Link creation property list identifier * @param crt_intermed_group IN: Flag specifying whether to create intermediate groups upon the creation of an object * * @return a non-negative valule if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pset_create_intermediate_group(int lcpl_id, boolean crt_intermed_group) throws HDF5LibraryException; /** * H5Pget_data_transform retrieves the data transform expression previously set in the dataset transfer property list plist_id by H5Pset_data_transform. * @param plist_id IN: Identifier of the property list or class * @param size IN: Number of bytes of the transform expression to copy to * @param expression OUT: A data transform expression * * @return The size of the transform expression if successful; 0(zero) if no transform expression exists. Otherwise returns a negative value. * * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Size is <= 0. * **/ public synchronized static native long H5Pget_data_transform( int plist_id, String[] expression, long size) throws HDF5LibraryException, IllegalArgumentException; /** * H5Pset_data_transform sets a data transform expression * @param plist_id IN: Identifier of the property list or class * @param expression IN: Pointer to the null-terminated data transform expression * * @return a non-negative valule if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - expression is null. * **/ public synchronized static native int H5Pset_data_transform(int plist_id, String expression) throws HDF5LibraryException, NullPointerException; /** * H5Pget_driver returns the identifier of the low-level file driver * associated with the file access property list or data transfer * property list plid. * * @param plid * IN: File access or data transfer property list identifier. * @return a valid low-level driver identifier if successful; a negative value if failed * @throws HDF5LibraryException */ public synchronized static native int H5Pget_driver(int plid) throws HDF5LibraryException; //herr_t H5Pset_driver( hid_t plist_id, hid_t new_driver_id, const void *new_driver_info ) //void *H5Pget_driver_info( hid_t plist_id ) //herr_t H5Pget_dxpl_mpio( hid_t dxpl_id, H5FD_mpio_xfer_t *xfer_mode ) //herr_t H5Pset_dxpl_mpio( hid_t dxpl_id, H5FD_mpio_xfer_t xfer_mode ) //herr_t H5Pset_dxpl_mpio_chunk_opt (hid_t dxpl_id, H5FD_mpio_chunk_opt_t opt_mode) //herr_t H5Pset_dxpl_mpio_chunk_opt_num (hid_t dxpl_id, unsigned num_chunk_per_proc) //herr_t H5Pset_dxpl_mpio_chunk_opt_ratio (hid_t dxpl_id, unsigned percent_proc_per_chunk) //herr_t H5Pset_dxpl_mpio_collective_opt (hid_t dxpl_id, H5FD_mpio_collective_opt_t opt_mode) public synchronized static native void H5Pget_dxpl_multi(int dxpl_id, int[] memb_dxpl) throws HDF5LibraryException, NullPointerException; public synchronized static native void H5Pset_dxpl_multi(int dxpl_id, int[] memb_dxpl) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pget_edc_check(int plist) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_edc_check(int plist, int check) throws HDF5LibraryException, NullPointerException; /** * H5Pget_elink_acc_flags retrieves the external link traversal file access flag from the specified link access property list. * @param lapl_id IN: Link access property list identifier * * @return File access flag for link traversal. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pget_elink_acc_flags(int lapl_id) throws HDF5LibraryException; /** * H5Pset_elink_acc_flags Sets the external link traversal file access flag in a link access property list. * @param lapl_id IN: Link access property list identifier * @param flags IN: The access flag for external link traversal. * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Invalid Flag values. * **/ public synchronized static native int H5Pset_elink_acc_flags(int lapl_id, int flags) throws HDF5LibraryException, IllegalArgumentException; //herr_t H5Pget_elink_cb( hid_t lapl_id, H5L_elink_traverse_t *func, void **op_data ) //herr_t H5Pset_elink_cb( hid_t lapl_id, H5L_elink_traverse_t func, void *op_data ) /** * H5Pget_elink_fapl Retrieves the file access property list identifier associated with * the link access property list. * * @param lapl_id IN: Link access property list identifier * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public static int H5Pget_elink_fapl(int lapl_id) throws HDF5LibraryException { int id = _H5Pget_elink_fapl(lapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Pget_elink_fapl(int lapl_id) throws HDF5LibraryException; /** * H5Pset_elink_fapl sets a file access property list for use in accessing a * file pointed to by an external link. * * @param lapl_id IN: Link access property list identifier * @param fapl_id IN: File access property list identifier * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pset_elink_fapl(int lapl_id, int fapl_id) throws HDF5LibraryException; /** * H5Pget_elink_file_cache_size retrieves the size of the external link open file cache. * @param fapl_id IN: File access property list identifier * * @return External link open file cache size in number of files. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pget_elink_file_cache_size(int fapl_id) throws HDF5LibraryException; /** * H5Pset_elink_file_cache_size sets the number of files that can be held open in an external link open file cache. * @param fapl_id IN: File access property list identifier * @param efc_size IN: External link open file cache size in number of files. * * @return none. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native void H5Pset_elink_file_cache_size(int fapl_id, int efc_size) throws HDF5LibraryException; /** * H5Pget_elink_prefix Retrieves prefix applied to external link paths. * @param lapl_id IN: Link access property list identifier * @param prefix OUT: Prefix applied to external link paths * * @return If successful, returns a non-negative value specifying the size in bytes of the prefix without the NULL terminator; * otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - prefix is null. * **/ public synchronized static native long H5Pget_elink_prefix(int lapl_id, String[] prefix) throws HDF5LibraryException, NullPointerException; /** * H5Pset_elink_prefix Sets prefix to be applied to external link paths. * @param lapl_id IN: Link access property list identifier * @param prefix IN: Prefix to be applied to external link paths * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - prefix is null. * **/ public synchronized static native int H5Pset_elink_prefix(int lapl_id, String prefix) throws HDF5LibraryException, NullPointerException; /** * H5Pget_est_link_info Queries data required to estimate required local heap or object header size. * @param gcpl_id IN: Group creation property list identifier * @param link_info * Estimated number of links to be inserted into group * And the estimated average length of link names * *
    *      link_info[0] =  Estimated number of links to be inserted into group
    *      link_info[1] =  Estimated average length of link names   
    *      
    * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - link_info is null. * **/ public synchronized static native int H5Pget_est_link_info(int gcpl_id, int []link_info) throws HDF5LibraryException, NullPointerException; /** * H5Pset_est_link_info Sets estimated number of links and length of link names in a group. * @param gcpl_id IN: Group creation property list identifier * @param est_num_entries IN: Estimated number of links to be inserted into group * @param est_name_len IN: Estimated average length of link names * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Invalid values to est_num_entries and est_name_len. * **/ public synchronized static native int H5Pset_est_link_info(int gcpl_id, int est_num_entries, int est_name_len) throws HDF5LibraryException, IllegalArgumentException; /** * H5Pget_external returns information about an external file. * * @param plist * IN: Identifier of a dataset creation property list. * @param idx * IN: External file index. * @param name_size * IN: Maximum length of name array. * @param name * OUT: Name of the external file. * @param size * OUT: the offset value and the size of the external file data. * *
     *      size[0] = offset // a location to return an offset value
     *      size[1] = size // a location to return the size of
     *                // the external file data.
     * 
    * * @return a non-negative value if successful * * @exception ArrayIndexOutOfBoundsException * Fatal error on Copyback * @exception ArrayStoreException * Fatal error on Copyback * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name or size is null. * @exception IllegalArgumentException * - name_size <= 0 . * **/ public synchronized static native int H5Pget_external(int plist, int idx, long name_size, String[] name, long[] size) throws ArrayIndexOutOfBoundsException, ArrayStoreException, HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Pset_external adds an external file to the list of external files. * * @param plist * IN: Identifier of a dataset creation property list. * @param name * IN: Name of an external file. * @param offset * IN: Offset, in bytes, from the beginning of the file to the * location in the file where the data starts. * @param size * IN: Number of bytes reserved in the file for the data. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - name is null. **/ public synchronized static native int H5Pset_external(int plist, String name, long offset, long size) throws HDF5LibraryException, NullPointerException; /** * H5Pget_external_count returns the number of external files for the * specified dataset. * * @param plist * IN: Identifier of a dataset creation property list. * * @return the number of external files if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pget_external_count(int plist) throws HDF5LibraryException; public synchronized static native long H5Pget_family_offset(int fapl_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_family_offset(int fapl_id, long offset) throws HDF5LibraryException, NullPointerException; public synchronized static native void H5Pget_fapl_core(int fapl_id, long[] increment, boolean[] backing_store) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_fapl_core(int fapl_id, long increment, boolean backing_store) throws HDF5LibraryException, NullPointerException; /** * H5Pget_fapl_direct Retrieve direct I/O settings. * @param fapl_id IN: File access property list identifier * @param info[0] = alignment OUT: Required memory alignment boundary * @param info[1] = block_size OUT: File system block size * @param info[2] = cbuf_size OUT: Copy buffer size * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pget_fapl_direct(int fapl_id, long[]info) throws HDF5LibraryException; /** * H5Pset_fapl_direct Sets up use of the direct I/O driver. * @param fapl_id IN: File access property list identifier * @param alignment IN: Required memory alignment boundary * @param block_size IN: File system block size * @param cbuf_size IN: Copy buffer size * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pset_fapl_direct(int fapl_id, long alignment, long block_size, long cbuf_size) throws HDF5LibraryException; public synchronized static native int H5Pget_fapl_family(int fapl_id, long[] memb_size, int[] memb_fapl_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_fapl_family(int fapl_id, long memb_size, int memb_fapl_id) throws HDF5LibraryException, NullPointerException; //herr_t H5Pget_fapl_mpio( int fapl_id, MPI_Comm *comm, MPI_Info *info ) //herr_t H5Pset_fapl_mpio( int fapl_id, MPI_Comm comm, MPI_Info info ) //herr_t H5Pget_fapl_mpiposix( int fapl_id, MPI_Comm *comm, hbool_t *use_gpfs_hints ) //herr_t H5Pset_fapl_mpiposix( int fapl_id, MPI_Comm comm, hbool_t use_gpfs_hints ) /** * H5Pget_fapl_multi Sets up use of the multi I/O driver. * @param fapl_id IN: File access property list identifier * @param memb_map IN: Maps memory usage types to other memory usage types. * @param memb_fapl IN: Property list for each memory usage type. * @param memb_name IN: Name generator for names of member files. * @param memb_addr IN: The offsets within the virtual address space, from 0 (zero) to HADDR_MAX, at which each type of data storage begins. * * @return a boolean value; Allows read-only access to incomplete file sets when TRUE. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - an array is null. * **/ public synchronized static native boolean H5Pget_fapl_multi(int fapl_id, int[] memb_map, int[] memb_fapl, String[] memb_name, long[] memb_addr) throws HDF5LibraryException, NullPointerException; /** * H5Pset_fapl_multi Sets up use of the multi I/O driver. * @param fapl_id IN: File access property list identifier * @param memb_map IN: Maps memory usage types to other memory usage types. * @param memb_fapl IN: Property list for each memory usage type. * @param memb_name IN: Name generator for names of member files. * @param memb_addr IN: The offsets within the virtual address space, from 0 (zero) to HADDR_MAX, at which each type of data storage begins. * @param relax IN: Allows read-only access to incomplete file sets when TRUE. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - an array is null. * **/ public synchronized static native void H5Pset_fapl_multi(int fapl_id, int[] memb_map, int[] memb_fapl, String[] memb_name, long[] memb_addr, boolean relax) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pget_fclose_degree(int plist_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_fclose_degree(int plist, int degree) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pget_fill_time(int plist_id, int[] fill_time) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_fill_time(int plist_id, int fill_time) throws HDF5LibraryException, NullPointerException; /** * H5Pget_fill_value queries the fill value property of a dataset creation * property list. * * @param plist_id * IN: Property list identifier. * @param type_id * IN: The datatype identifier of value. * @param value * IN: The fill value. * * @return a non-negative value if successful * **/ public synchronized static native int H5Pget_fill_value(int plist_id, int type_id, byte[] value) throws HDF5Exception; /** * H5Pget_fill_value queries the fill value property of a dataset creation * property list. * * @param plist_id * IN: Property list identifier. * @param type_id * IN: The datatype identifier of value. * @param obj * IN: The fill value. * * @return a non-negative value if successful * **/ public synchronized static int H5Pget_fill_value(int plist_id, int type_id, Object obj) throws HDF5Exception { HDFArray theArray = new HDFArray(obj); byte[] buf = theArray.emptyBytes(); int status = H5Pget_fill_value(plist_id, type_id, buf); if (status >= 0) { obj = theArray.arrayify(buf); } return status; } /** * H5Pset_fill_value sets the fill value for a dataset creation property * list. * * @param plist_id * IN: Property list identifier. * @param type_id * IN: The datatype identifier of value. * @param value * IN: The fill value. * * @return a non-negative value if successful * * @exception HDF5Exception * - Error converting data array **/ public synchronized static native int H5Pset_fill_value(int plist_id, int type_id, byte[] value) throws HDF5Exception; /** * H5Pset_fill_value sets the fill value for a dataset creation property * list. * * @param plist_id * IN: Property list identifier. * @param type_id * IN: The datatype identifier of value. * @param obj * IN: The fill value. * * @return a non-negative value if successful * * @exception HDF5Exception * - Error converting data array **/ public synchronized static int H5Pset_fill_value(int plist_id, int type_id, Object obj) throws HDF5Exception { HDFArray theArray = new HDFArray(obj); byte[] buf = theArray.byteify(); int retVal = H5Pset_fill_value(plist_id, type_id, buf); buf = null; theArray = null; return retVal; } /** * H5Pget_filter returns information about a filter, specified by its filter * number, in a filter pipeline, specified by the property list with which * it is associated. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Pget_filter(int, int, int[], int[], int[], int, String[], int[]) } * * @param plist * IN: Property list identifier. * @param filter_number * IN: Sequence number within the filter pipeline of the filter * for which information is sought. * @param flags * OUT: Bit vector specifying certain general properties of the * filter. * @param cd_nelmts * IN/OUT: Number of elements in cd_values * @param cd_values * OUT: Auxiliary data for the filter. * @param namelen * IN: Anticipated number of characters in name. * @param name * OUT: Name of the filter. * * @return the filter identification number if successful. Otherwise returns * H5Z_FILTER_ERROR (-1). * * @exception ArrayIndexOutOfBoundsException * Fatal error on Copyback * @exception ArrayStoreException * Fatal error on Copyback * @exception NullPointerException * - name or an array is null. * **/ @Deprecated public synchronized static native int H5Pget_filter(int plist, int filter_number, int[] flags, int[] cd_nelmts, int[] cd_values, int namelen, String[] name) throws ArrayIndexOutOfBoundsException, ArrayStoreException, HDF5LibraryException, NullPointerException; /** * H5Pget_filter returns information about a filter, specified by its filter * number, in a filter pipeline, specified by the property list with which * it is associated. * * @param plist IN: Property list identifier. * @param filter_number IN: Sequence number within the filter pipeline of the filter * for which information is sought. * @param flags OUT: Bit vector specifying certain general properties of the * filter. * @param cd_nelmts IN/OUT: Number of elements in cd_values * @param cd_values OUT: Auxiliary data for the filter. * @param namelen IN: Anticipated number of characters in name. * @param name OUT: Name of the filter. * @param filter_config OUT:A bit field encoding the returned filter information * * @return the filter identification number if successful. Otherwise returns * H5Z_FILTER_ERROR (-1). * * @exception ArrayIndexOutOfBoundsException * Fatal error on Copyback * @exception ArrayStoreException * Fatal error on Copyback * @exception NullPointerException * - name or an array is null. * **/ public static int H5Pget_filter(int plist, int filter_number, int[] flags, long[] cd_nelmts, int[] cd_values, long namelen, String[] name, int[] filter_config) throws ArrayIndexOutOfBoundsException, ArrayStoreException, HDF5LibraryException, NullPointerException { return H5Pget_filter2(plist, filter_number, flags, cd_nelmts, cd_values, namelen, name, filter_config); } /** * H5Pget_filter2 returns information about a filter, specified by its filter * number, in a filter pipeline, specified by the property list with which * it is associated. * * @see public static int H5Pget_filter(int plist, int filter_number, int[] flags, * int[] cd_nelmts, int[] cd_values, int namelen, String[] name, int[] filter_config) * **/ private synchronized static native int H5Pget_filter2(int plist, int filter_number, int[] flags, long[] cd_nelmts, int[] cd_values, long namelen, String[] name, int[] filter_config) throws ArrayIndexOutOfBoundsException, ArrayStoreException, HDF5LibraryException, NullPointerException; /** * H5Pset_filter adds the specified filter and corresponding properties to * the end of an output filter pipeline. * * @param plist * IN: Property list identifier. * @param filter * IN: Filter to be added to the pipeline. * @param flags * IN: Bit vector specifying certain general properties of the * filter. * @param cd_nelmts * IN: Number of elements in cd_values * @param cd_values * IN: Auxiliary data for the filter. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_filter(int plist, int filter, int flags, long cd_nelmts, int[] cd_values) throws HDF5LibraryException; //herr_t H5Pset_filter_callback(hid_t plist, H5Z_filter_func_t func, void *op_data) /** * H5Pget_filter_by_id returns information about the filter specified in filter_id, a * filter identifier. plist_id must be a dataset or group creation property list and * filter_id must be in the associated filter pipeline. The filter_id and flags parameters * are used in the same manner as described in the discussion of H5Pset_filter. Aside from * the fact that they are used for output, the parameters cd_nelmts and cd_values[] are * used in the same manner as described in the discussion of H5Pset_filter. On input, the * cd_nelmts parameter indicates the number of entries in the cd_values[] array allocated * by the calling program; on exit it contains the number of values defined by the filter. * On input, the namelen parameter indicates the number of characters allocated for the * filter name by the calling program in the array name[]. On exit name[] contains the name * of the filter with one character of the name in each element of the array. If the filter * specified in filter_id is not set for the property list, an error will be returned and * H5Pget_filter_by_id1 will fail. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Pget_filter_by_id(int, int, int[], int[], int[], int, String[], int[]) } * * @param plist_id IN: Property list identifier. * @param filter_id IN: Filter identifier. * @param flags OUT: Bit vector specifying certain general properties of the * filter. * @param cd_nelmts IN/OUT: Number of elements in cd_values * @param cd_values OUT: Auxiliary data for the filter. * @param namelen IN: Anticipated number of characters in name. * @param name OUT: Name of the filter. * * @return the filter identification number if successful. Otherwise returns * H5Z_FILTER_ERROR (-1). * * @exception ArrayIndexOutOfBoundsException * Fatal error on Copyback * @exception ArrayStoreException * Fatal error on Copyback * @exception NullPointerException * - name or an array is null. * **/ @Deprecated public synchronized static native int H5Pget_filter_by_id(int plist_id, int filter_id, int[] flags, long[] cd_nelmts, int[] cd_values, long namelen, String[] name) throws HDF5LibraryException, NullPointerException; /** * H5Pget_filter_by_id returns information about the filter specified in filter_id, a * filter identifier. plist_id must be a dataset or group creation property list and * filter_id must be in the associated filter pipeline. The filter_id and flags parameters * are used in the same manner as described in the discussion of H5Pset_filter. Aside from * the fact that they are used for output, the parameters cd_nelmts and cd_values[] are * used in the same manner as described in the discussion of H5Pset_filter. On input, the * cd_nelmts parameter indicates the number of entries in the cd_values[] array allocated * by the calling program; on exit it contains the number of values defined by the filter. * On input, the namelen parameter indicates the number of characters allocated for the * filter name by the calling program in the array name[]. On exit name[] contains the name * of the filter with one character of the name in each element of the array. If the filter * specified in filter_id is not set for the property list, an error will be returned and * H5Pget_filter_by_id1 will fail. * * @param plist_id IN: Property list identifier. * @param filter_id IN: Filter identifier. * @param flags OUT: Bit vector specifying certain general properties of the * filter. * @param cd_nelmts IN/OUT: Number of elements in cd_values * @param cd_values OUT: Auxiliary data for the filter. * @param namelen IN: Anticipated number of characters in name. * @param name OUT: Name of the filter. * @param filter_config OUT:A bit field encoding the returned filter information * * @return the filter identification number if successful. Otherwise returns * H5Z_FILTER_ERROR (-1). * * @exception ArrayIndexOutOfBoundsException * Fatal error on Copyback * @exception ArrayStoreException * Fatal error on Copyback * @exception NullPointerException * - name or an array is null. * **/ public static int H5Pget_filter_by_id(int plist_id, int filter_id, int[] flags, long[] cd_nelmts, int[] cd_values, long namelen, String[] name, int[] filter_config) throws ArrayIndexOutOfBoundsException, ArrayStoreException, HDF5LibraryException, NullPointerException { return H5Pget_filter_by_id2(plist_id, filter_id, flags, cd_nelmts, cd_values, namelen, name, filter_config); } /** * H5Pget_filter_by_id2 returns information about a filter, specified by its filter * id, in a filter pipeline, specified by the property list with which * it is associated. * * @see public static int H5Pget_filter_by_id(int plist, int filter_id, int[] flags, int[] cd_nelmts, int[] cd_values, int namelen, String[] name, int[] filter_config) **/ public synchronized static native int H5Pget_filter_by_id2(int plist_id, int filter_id, int[] flags, long[] cd_nelmts, int[] cd_values, long namelen, String[] name, int[] filter_config) throws HDF5LibraryException, NullPointerException; /** * H5Pget_gc_references Returns the current setting for the garbage * collection refernces property from a file access property list. *

    * Note: this routine changed name with HDF5.1.2.2. If using an earlier * version, use 'configure --enable-hdf5_1_2_1' so this routine will link to * the old name. * * @param fapl_id * IN File access property list * @param gc_ref * OUT GC is on (true) or off (false) * * @return non-negative if succeed * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - array is null. **/ public synchronized static native int H5Pget_gc_references(int fapl_id, boolean[] gc_ref) throws HDF5LibraryException, NullPointerException; public synchronized static native boolean H5Pget_gcreferences(int fapl_id) throws HDF5LibraryException; /* * Earlier versions of the HDF5 library had a different name. This is * included as an alias. */ public synchronized static int H5Pget_gc_reference(int fapl_id, boolean[] gc_ref) throws HDF5LibraryException, NullPointerException { return H5Pget_gc_references(fapl_id, gc_ref); } /** * H5Pset_gc_references Sets the flag for garbage collecting references for * the file. Default value for garbage collecting references is off. * * @param fapl_id * IN File access property list * @param gc_ref * IN set GC on (true) or off (false) * * @return non-negative if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_gc_references(int fapl_id, boolean gc_ref) throws HDF5LibraryException; public synchronized static native int H5Pget_hyper_vector_size(int dxpl_id, long[] vector_size) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_hyper_vector_size(int dxpl_id, long vector_size) throws HDF5LibraryException, NullPointerException; /** * H5Pget_istore_k queries the 1/2 rank of an indexed storage B-tree. * * @param plist * IN: Identifier of property list to query. * @param ik * OUT: Pointer to location to return the chunked storage B-tree * 1/2 rank. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - ik array is null. **/ public synchronized static native int H5Pget_istore_k(int plist, int[] ik) throws HDF5LibraryException, NullPointerException; /** * H5Pset_istore_k sets the size of the parameter used to control the * B-trees for indexing chunked datasets. * * @param plist * IN: Identifier of property list to query. * @param ik * IN: 1/2 rank of chunked storage B-tree. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_istore_k(int plist, int ik) throws HDF5LibraryException; /** * H5Pget_layout returns the layout of the raw data for a dataset. * * @param plist * IN: Identifier for property list to query. * * @return the layout type of a dataset creation property list if * successful. Otherwise returns H5D_LAYOUT_ERROR (-1). * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pget_layout(int plist) throws HDF5LibraryException; /** * H5Pset_layout sets the type of storage used store the raw data for a * dataset. * * @param plist * IN: Identifier of property list to query. * @param layout * IN: Type of storage layout for raw data. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_layout(int plist, int layout) throws HDF5LibraryException; /** * H5Pget_libver_bounds retrieves the lower and upper bounds on the HDF5 Library versions that indirectly determine the object formats versions used when creating objects in the file. * @param fapl_id IN: File access property list identifier * @param libver * The earliest/latest version of the library that will be used for writing objects. * *

    *      libver[0] =  The earliest version of the library that will be used for writing objects
    *      libver[1] =  The latest version of the library that will be used for writing objects.
    *      
    * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - size is null. * **/ public synchronized static native int H5Pget_libver_bounds(int fapl_id, int []libver) throws HDF5LibraryException, NullPointerException; /** * H5Pset_libver_bounds Sets bounds on library versions, and indirectly format versions, to be used when creating objects * @param fapl_id IN: File access property list identifier * @param low IN: The earliest version of the library that will be used for writing objects * @param high IN: The latest version of the library that will be used for writing objects. * * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Argument is Illegal * **/ public synchronized static native int H5Pset_libver_bounds(int fapl_id, int low, int high) throws HDF5LibraryException, IllegalArgumentException; /** * H5Pget_link_creation_order queries the group creation property list, gcpl_id, and returns a flag indicating whether link creation order is tracked and/or indexed in a group. * @param gcpl_id IN: Group creation property list identifier * * @return crt_order_flags -Creation order flag(s) * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pget_link_creation_order(int gcpl_id) throws HDF5LibraryException; /** * H5Pset_link_creation_order Sets flags in a group creation property list, gcpl_id, for tracking and/or indexing links on creation order. * @param gcpl_id IN: Group creation property list identifier * @param crt_order_flags IN: Creation order flag(s) * * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pset_link_creation_order(int gcpl_id, int crt_order_flags) throws HDF5LibraryException; /** * H5Pget_link_phase_change Queries the settings for conversion between compact and dense groups. * @param gcpl_id IN: Group creation property list identifier * @param links * The max. no. of compact links & the min. no. of dense * links, which are used for storing groups * *
    *      links[0] =  The maximum number of links for compact storage
    *      links[1] =  The minimum number of links for dense storage
    *      
    * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - size is null. * **/ public synchronized static native int H5Pget_link_phase_change(int gcpl_id, int []links) throws HDF5LibraryException, NullPointerException; /** * H5Pset_link_phase_change Sets the parameters for conversion between compact and dense groups. * @param gcpl_id IN: Group creation property list identifier * @param max_compact IN: Maximum number of links for compact storage(Default: 8) * @param min_dense IN: Minimum number of links for dense storage(Default: 6) * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Invalid values of max_compact and min_dense. * **/ public synchronized static native int H5Pset_link_phase_change(int gcpl_id, int max_compact, int min_dense) throws HDF5LibraryException, IllegalArgumentException; /** * H5Pget_local_heap_size_hint Retrieves the anticipated size of the local heap for original-style groups. * @param gcpl_id IN: Group creation property list identifier * * @return size_hint, the anticipated size of local heap * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native long H5Pget_local_heap_size_hint(int gcpl_id) throws HDF5LibraryException; /** * H5Pset_local_heap_size_hint Specifies the anticipated maximum size of a local heap. * @param gcpl_id IN: Group creation property list identifier * @param size_hint IN: Anticipated maximum size in bytes of local heap * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pset_local_heap_size_hint(int gcpl_id, long size_hint) throws HDF5LibraryException; /** * H5Pget_mdc_config gets the initial metadata cache configuration contained in a * file access property list and loads it into the instance of H5AC_cache_config_t * pointed to by the config_ptr parameter. This configuration is used when the file is opened. * * @param plist_id IN: Identifier of the file access property list. * * @return A buffer(H5AC_cache_config_t) for the current metadata cache configuration information * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native H5AC_cache_config_t H5Pget_mdc_config(int plist_id) throws HDF5LibraryException; public synchronized static native void H5Pset_mdc_config(int plist_id, H5AC_cache_config_t config_ptr) throws HDF5LibraryException; /** * H5Pget_meta_block_size the current metadata block size setting. * @param fapl_id IN: File access property list identifier * * @return the minimum size, in bytes, of metadata block allocations. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native long H5Pget_meta_block_size(int fapl_id) throws HDF5LibraryException; /** * H5Pset_meta_block_size sets the minimum metadata block size. * @param fapl_id IN: File access property list identifier * @param size IN: Minimum size, in bytes, of metadata block allocations. * * @return none. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native void H5Pset_meta_block_size(int fapl_id, long size) throws HDF5LibraryException; //herr_t H5Pget_multi_type ( hid_t fapl_id, H5FD_mem_t *type ) //herr_t H5Pset_multi_type ( hid_t fapl_id, H5FD_mem_t type ) /** * H5Pget_nfilters returns the number of filters defined in the filter * pipeline associated with the property list plist. * * @param plist * IN: Property list identifier. * * @return the number of filters in the pipeline if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pget_nfilters(int plist) throws HDF5LibraryException; /** * H5Pget_nlinks retrieves the maximum number of soft or user-defined link traversals allowed, nlinks, before the library assumes it has found a cycle and aborts the traversal. This value is retrieved from the link access property list lapl_id. * @param lapl_id IN: File access property list identifier * * @return Returns a Maximum number of links to traverse. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native long H5Pget_nlinks(int lapl_id) throws HDF5LibraryException; /** * H5Pset_nlinks sets the maximum number of soft or user-defined link traversals allowed, nlinks, before the library assumes it has found a cycle and aborts the traversal. This value is set in the link access property list lapl_id. * @param fapl_id IN: File access property list identifier * @param nlinks IN: Maximum number of links to traverse * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Argument is Illegal * **/ public synchronized static native int H5Pset_nlinks(int lapl_id, long nlinks) throws HDF5LibraryException, IllegalArgumentException; /** * H5Pget_nprops retrieves the number of properties in a property list or * class * * @param plid * IN: Identifier of property object to query * @return number of properties if successful; a negative value if failed * @throws HDF5LibraryException */ public synchronized static native long H5Pget_nprops(int plid) throws HDF5LibraryException; /** * H5Pget_preserve checks the status of the dataset transfer property list. * * @deprecated As of HDF5 1.8, compound datatype field preservation is now core functionality in the HDF5 Library. * * @param plist * IN: Identifier for the dataset transfer property list. * * @return TRUE or FALSE if successful; otherwise returns a negative value * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ @Deprecated public synchronized static native int H5Pget_preserve(int plist) throws HDF5LibraryException; /** * H5Pset_preserve sets the dataset transfer property list status to TRUE or * FALSE. * * @deprecated As of HDF5 1.8, compound datatype field preservation is now core functionality in the HDF5 Library. * * @param plist * IN: Identifier for the dataset transfer property list. * @param status * IN: Status of for the dataset transfer property list. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception IllegalArgumentException * - plist is invalid. **/ @Deprecated public synchronized static native int H5Pset_preserve(int plist, boolean status) throws HDF5LibraryException, IllegalArgumentException; /** * H5Pget_obj_track_times queries the object creation property list, ocpl_id, * to determine whether object times are being recorded. * * @param ocpl_id IN: Object creation property list identifier * * @return TRUE or FALSE, specifying whether object times are being recorded * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native boolean H5Pget_obj_track_times(int ocpl_id) throws HDF5LibraryException; /** * H5Pset_obj_track_times sets a property in the object creation property list, ocpl_id, * that governs the recording of times associated with an object. * * @param ocpl_id IN: Object creation property list identifier * * @param track_times IN: TRUE or FALSE, specifying whether object times are to be tracked * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native void H5Pset_obj_track_times(int ocpl_id, boolean track_times) throws HDF5LibraryException; /** * H5Pget_shared_mesg_index Retrieves the configuration settings for a shared message index. * @param fcpl_id IN: File creation property list identifier * @param index_num IN: Index being configured. * @param mesg_info * The message type and minimum message size * *
    *      mesg_info[0] =  Types of messages that may be stored in this index.
    *      mesg_info[1] =  Minimum message size.  
    *      
    * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - mesg_info is null. * @exception IllegalArgumentException - Invalid value of nindexes * **/ public synchronized static native int H5Pget_shared_mesg_index(int fcpl_id, int index_num, int []mesg_info) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Pset_shared_mesg_index Configures the specified shared object header message index * @param fcpl_id IN: File creation property list identifier. * @param index_num IN: Index being configured. * @param mesg_type_flags IN: Types of messages that should be stored in this index. * @param min_mesg_size IN: Minimum message size. * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Invalid value of nindexes * **/ public synchronized static native int H5Pset_shared_mesg_index(int fcpl_id, int index_num, int mesg_type_flags, int min_mesg_size) throws HDF5LibraryException, IllegalArgumentException; /** * H5Pget_shared_mesg_nindexes retrieves number of shared object header message indexes in file creation property list. * @param fcpl_id IN: : File creation property list identifier * * @return nindexes, the number of shared object header message indexes available in files created with this property list * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pget_shared_mesg_nindexes(int fcpl_id) throws HDF5LibraryException; /** * H5Pset_shared_mesg_nindexes sets the number of shared object header message indexes in the specified file creation property list. * @param plist_id IN: File creation property list * @param nindexes IN: Number of shared object header message indexes to be available in files created with this property list * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Invalid value of nindexes * **/ public synchronized static native int H5Pset_shared_mesg_nindexes(int plist_id, int nindexes) throws HDF5LibraryException, IllegalArgumentException; /** * H5Pget_shared_mesg_phase_change retrieves shared object header message phase change information. * @param fcpl_id IN: : File creation property list identifier * @param size * The threshold values for storage of shared object header * message indexes in a file. * *
    *      size[0] =  Threshold above which storage of a shared object header message index shifts from list to B-tree 
    *      size[1] =  Threshold below which storage of a shared object header message index reverts to list format  
    *      
    * * @return Returns a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - size is null. * **/ public synchronized static native int H5Pget_shared_mesg_phase_change(int fcpl_id, int []size) throws HDF5LibraryException, NullPointerException; /** * H5Pset_shared_mesg_phase_change sets shared object header message storage phase change thresholds. * @param fcpl_id IN: File creation property list identifier * @param max_list IN: Threshold above which storage of a shared object header message index shifts from list to B-tree * @param min_btree IN: Threshold below which storage of a shared object header message index reverts to list format * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Invalid values of max_list and min_btree. * **/ public synchronized static native int H5Pset_shared_mesg_phase_change(int fcpl_id, int max_list, int min_btree) throws HDF5LibraryException, IllegalArgumentException; public synchronized static native long H5Pget_sieve_buf_size(int fapl_id) throws HDF5LibraryException; public synchronized static native void H5Pset_sieve_buf_size(int fapl_id, long size) throws HDF5LibraryException; /** * H5Pget_size retrieves the size of a property's value in bytes * * @param plid * IN: Identifier of property object to query * @param name * IN: Name of property to query * @return size of a property's value if successful; a negative value if * failed * @throws HDF5LibraryException */ public synchronized static native long H5Pget_size(int plid, String name) throws HDF5LibraryException; /** * H5Pget_sizes retrieves the size of the offsets and lengths used in an * HDF5 file. This function is only valid for file creation property lists. * * @param plist * IN: Identifier of property list to query. * @param size * OUT: the size of the offsets and length. * *
     *      size[0] = sizeof_addr // offset size in bytes
     *      size[1] = sizeof_size // length size in bytes
     * 
    * @return a non-negative value with the sizes initialized; if successful; * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - size is null. * @exception IllegalArgumentException * - size is invalid. **/ public synchronized static native int H5Pget_sizes(int plist, long[] size) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Pset_sizes sets the byte size of the offsets and lengths used to * address objects in an HDF5 file. * * @param plist * IN: Identifier of property list to modify. * @param sizeof_addr * IN: Size of an object offset in bytes. * @param sizeof_size * IN: Size of an object length in bytes. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_sizes(int plist, int sizeof_addr, int sizeof_size) throws HDF5LibraryException; /** * H5Pget_small_data_block_size retrieves the size of a block of small data * in a file creation property list. * * @param plist * IN: Identifier for property list to query. * @param size * OUT: Pointer to location to return block size. * * @return a non-negative value and the size of the user block; if * successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - size is null. **/ public synchronized static native int H5Pget_small_data_block_size( int plist, long[] size) throws HDF5LibraryException, NullPointerException; public synchronized static native long H5Pget_small_data_block_size_long( int plist) throws HDF5LibraryException; /** * H5Pset_small_data_block_size reserves blocks of size bytes for the * contiguous storage of the raw data portion of small datasets. * * @param plist * IN: Identifier of property list to modify. * @param size * IN: Size of the blocks in bytes. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_small_data_block_size( int plist, long size) throws HDF5LibraryException; /** * H5Pget_sym_k retrieves the size of the symbol table B-tree 1/2 rank and * the symbol table leaf node 1/2 size. * * @param plist * IN: Property list to query. * @param size * OUT: the symbol table's B-tree 1/2 rank and leaf node 1/2 * size. * *
     *      size[0] = ik // the symbol table's B-tree 1/2 rank
     *      size[1] = lk // leaf node 1/2 size
     * 
    * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - size is null. * @exception IllegalArgumentException * - size is invalid. **/ public synchronized static native int H5Pget_sym_k(int plist, int[] size) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Pset_sym_k sets the size of parameters used to control the symbol table * nodes. * * @param plist * IN: Identifier for property list to query. * @param ik * IN: Symbol table tree rank. * @param lk * IN: Symbol table node size. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_sym_k(int plist, int ik, int lk) throws HDF5LibraryException; //herr_t H5Pget_type_conv_cb(hid_t plist, H5T_conv_except_func_t *func, void **op_data) //herr_t H5Pset_type_conv_cb( hid_t plist, H5T_conv_except_func_t func, void *op_data) /** * H5Pget_userblock retrieves the size of a user block in a file creation * property list. * * @param plist * IN: Identifier for property list to query. * @param size * OUT: Pointer to location to return user-block size. * * @return a non-negative value and the size of the user block; if * successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - size is null. **/ public synchronized static native int H5Pget_userblock(int plist, long[] size) throws HDF5LibraryException, NullPointerException; /** * H5Pset_userblock sets the user block size of a file creation property * list. * * @param plist * IN: Identifier of property list to modify. * @param size * IN: Size of the user-block in bytes. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_userblock(int plist, long size) throws HDF5LibraryException; /** * H5Pget_version retrieves the version information of various objects for a * file creation property list. * * @param plist * IN: Identifier of the file creation property list. * @param version_info * OUT: version information. * *
     *      version_info[0] = boot  // boot block version number
     *      version_info[1] = freelist  // global freelist version
     *      version_info[2] = stab  // symbol tabl version number
     *      version_info[3] = shhdr  // hared object header version
     * 
    * @return a non-negative value, with the values of version_info * initialized, if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - version_info is null. * @exception IllegalArgumentException * - version_info is illegal. **/ public synchronized static native int H5Pget_version(int plist, int[] version_info) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; //herr_t H5Pget_vlen_mem_manager(hid_t plist, H5MM_allocate_t *alloc, void **alloc_info, H5MM_free_t *free, void **free_info ) //herr_t H5Pset_vlen_mem_manager(hid_t plist, H5MM_allocate_t alloc, void *alloc_info, H5MM_free_t free, void *free_info ) //herr_t H5Pinsert( hid_t plid, const char *name, size_t size, void *value, H5P_prp_set_func_t set, H5P_prp_get_func_t get, H5P_prp_delete_func_t delete, H5P_prp_copy_func_t copy, H5P_prp_close_func_t close ) //herr_t H5Pinsert( hid_t plid, const char *name, size_t size, void *value, H5P_prp_set_func_t set, H5P_prp_get_func_t get, H5P_prp_delete_func_t delete, H5P_prp_copy_func_t copy, H5P_prp_compare_func_t compare, H5P_prp_close_func_t close ) [2] //herr_t H5Pinsert1( hid_t plid, const char *name, size_t size, void *value, H5P_prp_set_func_t set, H5P_prp_get_func_t get, H5P_prp_delete_func_t delete, H5P_prp_copy_func_t copy, H5P_prp_close_func_t close ) //herr_t H5Pinsert2( hid_t plid, const char *name, size_t size, void *value, H5P_prp_set_func_t set, H5P_prp_get_func_t get, H5P_prp_delete_func_t delete, H5P_prp_copy_func_t copy, H5P_prp_compare_func_t compare, H5P_prp_close_func_t close ) /** * H5Pisa_class checks to determine whether a property list is a member of * the specified class * * @param plist * IN: Identifier of the property list * @param pclass * IN: Identifier of the property class * @return a positive value if equal; zero if unequal; a negative value if * failed * @throws HDF5LibraryException */ public synchronized static native int H5Pisa_class(int plist, int pclass) throws HDF5LibraryException; //int H5Piterate( hid_t id, int * idx, H5P_iterate_t iter_func, void * iter_data ) public synchronized static native int H5Pmodify_filter(int plist, int filter, int flags, long cd_nelmts, int[] cd_values) throws HDF5LibraryException, NullPointerException; // herr_t H5Pregister( hid_t class, const char * name, size_t size, void * default, H5P_prp_create_func_t create, H5P_prp_set_func_t set, H5P_prp_get_func_t get, H5P_prp_delete_func_t delete, H5P_prp_copy_func_t copy, H5P_prp_close_func_t close ) [1] // herr_t H5Pregister( hid_t class, const char * name, size_t size, void * default, H5P_prp_create_func_t create, H5P_prp_set_func_t set, H5P_prp_get_func_t get, H5P_prp_delete_func_t delete, H5P_prp_copy_func_t copy, H5P_prp_compare_func_t compare, H5P_prp_close_func_t close ) [2] //herr_t H5Pregister1( hid_t class, const char * name, size_t size, void * default, H5P_prp_create_func_t create, H5P_prp_set_func_t set, H5P_prp_get_func_t get, H5P_prp_delete_func_t delete, H5P_prp_copy_func_t copy, H5P_prp_close_func_t close ) //herr_t H5Pregister2( hid_t class, const char * name, size_t size, void * default, H5P_prp_create_func_t create, H5P_prp_set_func_t set, H5P_prp_get_func_t get, H5P_prp_delete_func_t delete, H5P_prp_copy_func_t copy, H5P_prp_compare_func_t compare, H5P_prp_close_func_t close ) /** * H5Punregister removes a property from a property list class * * @param plid * IN: Property list class from which to remove permanent * property * @param name * IN: Name of property to remove * @return a non-negative value if successful; a negative value if failed * @throws HDF5LibraryException */ public synchronized static native int H5Punregister(int plid, String name) throws HDF5LibraryException; /** * H5Premove removes a property from a property list * * @param plid * IN: Identifier of the property list to modify * @param name * IN: Name of property to remove * @return a non-negative value if successful; a negative value if failed * @throws HDF5LibraryException */ public synchronized static native int H5Premove(int plid, String name) throws HDF5LibraryException; public synchronized static native int H5Premove_filter(int obj_id, int filter) throws HDF5LibraryException; /** * H5Pset_deflate sets the compression method for a dataset. * * @param plist * IN: Identifier for the dataset creation property list. * @param level * IN: Compression level. * * @return non-negative if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Pset_deflate(int plist, int level) throws HDF5LibraryException; /** * H5Pset_fapl_log Sets up the logging virtual file driver (H5FD_LOG) for use. * H5Pset_fapl_log modifies the file access property list to use the logging driver, H5FD_LOG. * The logging virtual file driver (VFD) is a clone of the standard SEC2 (H5FD_SEC2) driver * with additional facilities for logging VFD metrics and activity to a file. * * @deprecated As of HDF5 1.8.7, replaced by {@link #H5Pset_fapl_log(int, String, long, int)} * * @param fapl_id IN: File access property list identifier. * @param logfile IN: logfile is the name of the file in which the logging entries are to be recorded. * @param flags IN: Flags specifying the types of logging activity. * @param buf_size IN: The size of the logging buffers, in bytes. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - logfile is null. **/ @Deprecated public static int H5Pset_fapl_log(int fapl_id, String logfile, int flags, int buf_size) throws HDF5LibraryException, NullPointerException { H5Pset_fapl_log(fapl_id, logfile, (long)flags, (long)buf_size); return 1; } /** * H5Pset_fapl_log Sets up the logging virtual file driver (H5FD_LOG) for use. * H5Pset_fapl_log modifies the file access property list to use the logging driver, H5FD_LOG. * The logging virtual file driver (VFD) is a clone of the standard SEC2 (H5FD_SEC2) driver * with additional facilities for logging VFD metrics and activity to a file. * * @param fapl_id IN: File access property list identifier. * @param logfile IN: logfile is the name of the file in which the logging entries are to be recorded. * @param flags IN: Flags specifying the types of logging activity. * @param buf_size IN: The size of the logging buffers, in bytes. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - logfile is null. **/ public synchronized static native void H5Pset_fapl_log(int fapl_id, String logfile, long flags, long buf_size) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_fapl_sec2(int fapl_id) throws HDF5LibraryException, NullPointerException; public synchronized static native void H5Pset_fapl_split(int fapl_id, String meta_ext, int meta_plist_id, String raw_ext, int raw_plist_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_fapl_stdio(int fapl_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_fapl_windows(int fapl_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_fletcher32(int plist) throws HDF5LibraryException, NullPointerException; /** * H5Pset_nbit Sets up the use of the N-Bit filter. * @param plist_id IN: Dataset creation property list identifier. * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * **/ public synchronized static native int H5Pset_nbit(int plist_id) throws HDF5LibraryException; /** * H5Pset_scaleoffset sets the Scale-Offset filter for a dataset. * @param plist_id IN: Dataset creation property list identifier. * @param scale_type IN: Flag indicating compression method. * @param scale_factor IN: Parameter related to scale. * * @return a non-negative value if successful; otherwise returns a negative value. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception IllegalArgumentException - Invalid arguments * **/ public synchronized static native int H5Pset_scaleoffset(int plist_id, int scale_type, int scale_factor) throws HDF5LibraryException, IllegalArgumentException; public synchronized static native int H5Pset_shuffle(int plist_id) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Pset_szip(int plist, int options_mask, int pixels_per_block) throws HDF5LibraryException, NullPointerException; ////////////////////////////////////////////////////////////// //// //H5R: HDF5 1.8 Reference API Functions // //// ////////////////////////////////////////////////////////////// private synchronized static native int H5Rcreate(byte[] ref, int loc_id, String name, int ref_type, int space_id) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Rcreate creates the reference, ref, of the type specified in ref_type, * pointing to the object name located at loc_id. * * @param loc_id * IN: Location identifier used to locate the object being * pointed to. * @param name * IN: Name of object at location loc_id. * @param ref_type * IN: Type of reference. * @param space_id * IN: Dataspace identifier with selection. * * @return the reference (byte[]) if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - an input array is null. * @exception IllegalArgumentException * - an input array is invalid. **/ public synchronized static byte[] H5Rcreate(int loc_id, String name, int ref_type, int space_id) throws HDF5LibraryException, NullPointerException, IllegalArgumentException { /* These sizes are correct for HDF5.1.2 */ int ref_size = 8; if (ref_type == HDF5Constants.H5R_DATASET_REGION) { ref_size = 12; } byte rbuf[] = new byte[ref_size]; /* will raise an exception if fails */ H5Rcreate(rbuf, loc_id, name, ref_type, space_id); return rbuf; } /** * Given a reference to some object, H5Rdereference opens that object and * return an identifier. * * @param dataset * IN: Dataset containing reference object. * @param ref_type * IN: The reference type of ref. * @param ref * IN: reference to an object * * @return valid identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - output array is null. * @exception IllegalArgumentException * - output array is invalid. **/ public static int H5Rdereference(int dataset, int ref_type, byte[] ref) throws HDF5LibraryException, NullPointerException, IllegalArgumentException { int id = _H5Rdereference(dataset, ref_type, ref); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Rdereference(int dataset, int ref_type, byte[] ref) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Rget_name retrieves a name for the object identified by ref. * @param loc_id IN: Identifier for the dataset containing the reference or for the group that dataset is in. * @param ref_type IN: Type of reference. * @param ref IN: An object or dataset region reference. * @param name OUT: A name associated with the referenced object or dataset region. * @param size IN: The size of the name buffer. * * @return Returns the length of the name if successful, returning 0 (zero) if no name is associated with the identifier. Otherwise returns a negative value. * * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - size is null. * @exception IllegalArgumentException - Argument is illegal. * **/ public synchronized static native long H5Rget_name( int loc_id, int ref_type, byte[] ref, String[] name, long size) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /* * [NOTE: This function is only supported in HDF5 Releases 1.4.x. It has * been replaced in Release 1.6 by the function H5Rget_obj_type public * synchronized static native int H5Rget_object_type(int loc_id, byte ref[]) * throws HDF5LibraryException, NullPointerException, * IllegalArgumentException; */ /** * Given a reference to an object ref, H5Rget_obj_type returns the type of * the object pointed to. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Rget_obj_type(int, int, byte[], int[]) } * * @param loc_id * IN: loc_id of the reference object. * @param ref_type * IN: Type of reference to query. * * @param ref * IN: the reference * * @return a valid object type if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - array is null. * @exception IllegalArgumentException * - array is invalid. **/ @Deprecated public synchronized static native int H5Rget_obj_type(int loc_id, int ref_type, byte ref[]) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Rget_obj_type Given a reference to an object ref, H5Rget_obj_type returns the type of * the object pointed to. * * @param loc_id IN: loc_id of the reference object. * @param ref_type IN: Type of reference to query. * @param ref IN: the reference * @param obj_type OUT:Type of referenced object * * @return Returns the object type, which is the same as obj_type[0]. The return value is * the same as the HDF5 1.6 version. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - array is null. * @exception IllegalArgumentException * - array is invalid. **/ public static int H5Rget_obj_type(int loc_id, int ref_type, byte ref[], int [] obj_type) throws HDF5LibraryException, NullPointerException, IllegalArgumentException { return H5Rget_obj_type2(loc_id, ref_type, ref, obj_type); } /** * H5Rget_obj_type2 Retrieves the type of object that an object reference points to. * * @see public static int H5Rget_obj_type(int loc_id, int ref_type, byte ref[], int [] obj_type) **/ private synchronized static native int H5Rget_obj_type2(int loc_id, int ref_type, byte ref[], int [] obj_type) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * Given a reference to an object ref, H5Rget_region creates a copy of the * dataspace of the dataset pointed to and defines a selection in the copy * which is the region pointed to. * * @param loc_id * IN: loc_id of the reference object. * @param ref_type * IN: The reference type of ref. * @param ref * OUT: the reference to the object and region * * @return a valid identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - output array is null. * @exception IllegalArgumentException * - output array is invalid. **/ public static int H5Rget_region(int loc_id, int ref_type, byte[] ref) throws HDF5LibraryException, NullPointerException, IllegalArgumentException { int id = _H5Rget_region(loc_id, ref_type, ref); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Rget_region(int loc_id, int ref_type, byte[] ref) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; ////////////////////////////////////////////////////////////// // // //H5S: Dataspace Interface Functions // // // ////////////////////////////////////////////////////////////// /** * H5Sclose releases a dataspace. * * @param space_id * Identifier of dataspace to release. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Sclose(int space_id) throws HDF5LibraryException { if (space_id < 0) throw new HDF5LibraryException("Negative ID");; OPEN_IDS.removeElement(space_id); return _H5Sclose(space_id); } private synchronized static native int _H5Sclose(int space_id) throws HDF5LibraryException; /** * H5Scopy creates a new dataspace which is an exact copy of the dataspace * identified by space_id. * * @param space_id * Identifier of dataspace to copy. * @return a dataspace identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Scopy(int space_id) throws HDF5LibraryException { int id = _H5Scopy(space_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Scopy(int space_id) throws HDF5LibraryException; /** * H5Screate creates a new dataspace of a particular type. * * @param type IN: The type of dataspace to be created. * @return a dataspace identifier * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Screate(int type) throws HDF5LibraryException { int id = _H5Screate(type); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Screate(int type) throws HDF5LibraryException; /** * H5Screate_simple creates a new simple data space and opens * it for access. * * @param rank IN: Number of dimensions of dataspace. * @param dims IN: An array of the size of each dimension. * @param maxdims IN: An array of the maximum size of each dimension. * * @return a dataspace identifier * * @exception HDF5Exception - Error from the HDF-5 Library. * @exception NullPointerException - dims or maxdims is null. **/ public static int H5Screate_simple(int rank, long[] dims, long[] maxdims) throws HDF5Exception, NullPointerException { int id = _H5Screate_simple(rank, dims, maxdims); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Screate_simple(int rank, long[] dims, long[] maxdims) throws HDF5Exception, NullPointerException; /** * @deprecated use H5Screate_simple(int rank, long[] dims, long[] maxdims) **/ @Deprecated public static int H5Screate_simple(int rank, byte[] dims, byte[] maxdims) throws HDF5Exception, NullPointerException { ByteBuffer dimsbb = ByteBuffer.wrap(dims); long[] ladims = (dimsbb.asLongBuffer()).array(); ByteBuffer maxdimsbb = ByteBuffer.wrap(maxdims); long[] lamaxdims = (maxdimsbb.asLongBuffer()).array(); int id = _H5Screate_simple(rank, ladims, lamaxdims); if (id > 0) OPEN_IDS.addElement(id); return id; } /** * H5Sdecode reconstructs the HDF5 data space object and returns a * new object handle for it. * * @param buf IN: Buffer for the data space object to be decoded. * * @return a new object handle * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - buf is null. **/ public synchronized static native int H5Sdecode(byte[] buf) throws HDF5LibraryException, NullPointerException; /** * H5Sencode converts a data space description into binary form in a buffer. * * @param obj_id IN: Identifier of the object to be encoded. * * @return the buffer for the object to be encoded into. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native byte[] H5Sencode(int obj_id) throws HDF5LibraryException, NullPointerException; /** * H5Sextent_copy copies the extent from source_space_id to dest_space_id. * This action may change the type of the dataspace. * * @param dest_space_id * IN: The identifier for the dataspace from which the extent is * copied. * @param source_space_id * IN: The identifier for the dataspace to which the extent is * copied. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Sextent_copy(int dest_space_id, int source_space_id) throws HDF5LibraryException; /** * H5Sextent_equal determines whether the dataspace extents of two dataspaces, * space1_id and space2_id, are equal. * * @param first_space_id * IN: The identifier for the first dataspace. * @param second_space_id * IN: The identifier for the seconddataspace. * * @return true if successful, else false * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native boolean H5Sextent_equal(int first_space_id, int second_space_id) throws HDF5LibraryException; /** * H5Sget_select_bounds retrieves the coordinates of the bounding box * containing the current selection and places them into user-supplied * buffers. *

    * The start and end buffers must be large enough to hold the dataspace rank * number of coordinates. * * @param spaceid * Identifier of dataspace to release. * @param start * coordinates of lowest corner of bounding box. * @param end * coordinates of highest corner of bounding box. * * @return a non-negative value if successful,with start and end * initialized. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - start or end is null. **/ public synchronized static native int H5Sget_select_bounds(int spaceid, long[] start, long[] end) throws HDF5LibraryException, NullPointerException; /** * H5Sget_select_elem_npoints returns the number of element points in the * current dataspace selection. * * @param spaceid * Identifier of dataspace to release. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native long H5Sget_select_elem_npoints( int spaceid) throws HDF5LibraryException; /** * H5Sget_select_elem_pointlist returns an array of of element points in the * current dataspace selection. The point coordinates have the same * dimensionality (rank) as the dataspace they are located within, one * coordinate per point. * * @param spaceid * Identifier of dataspace to release. * @param startpoint * first point to retrieve * @param numpoints * number of points to retrieve * @param buf * returns points startblock to startblock+num-1, each points is * rank longs. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - buf is null. **/ public synchronized static native int H5Sget_select_elem_pointlist( int spaceid, long startpoint, long numpoints, long[] buf) throws HDF5LibraryException, NullPointerException; /** * H5Sget_select_hyper_blocklist returns an array of hyperslab blocks. The * block coordinates have the same dimensionality (rank) as the dataspace * they are located within. The list of blocks is formatted as follows: * *

     *    <"start" coordinate>, immediately followed by
     *    <"opposite" corner coordinate>, followed by
     *   the next "start" and "opposite" coordinates,
     *   etc.
     *   until all of the selected blocks have been listed.
     * 
    * * @param spaceid * Identifier of dataspace to release. * @param startblock * first block to retrieve * @param numblocks * number of blocks to retrieve * @param buf * returns blocks startblock to startblock+num-1, each block is * rank * 2 (corners) longs. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - buf is null. **/ public synchronized static native int H5Sget_select_hyper_blocklist( int spaceid, long startblock, long numblocks, long[] buf) throws HDF5LibraryException, NullPointerException; /** * H5Sget_select_hyper_nblocks returns the number of hyperslab blocks in the * current dataspace selection. * * @param spaceid * Identifier of dataspace to release. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native long H5Sget_select_hyper_nblocks( int spaceid) throws HDF5LibraryException; /** * H5Sget_select_npoints determines the number of elements in the current * selection of a dataspace. * * @param space_id IN: Identifier of the dataspace object to query * * @return the number of elements in the selection if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native long H5Sget_select_npoints(int space_id) throws HDF5LibraryException; /** * H5Sget_select_type retrieves the type of selection currently defined for the dataspace space_id. * * @param space_id IN: Identifier of the dataspace object to query * * @return the dataspace selection type if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Sget_select_type(int space_id) throws HDF5LibraryException; /** * H5Sget_simple_extent_dims returns the size and maximum sizes of each * dimension of a dataspace through the dims and maxdims parameters. * * @param space_id IN: Identifier of the dataspace object to query * @param dims OUT: Pointer to array to store the size of each dimension. * @param maxdims OUT: Pointer to array to store the maximum size of each * dimension. * * @return the number of dimensions in the dataspace if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - dims or maxdims is null. **/ public synchronized static native int H5Sget_simple_extent_dims( int space_id, long[] dims, long[] maxdims) throws HDF5LibraryException, NullPointerException; /** * H5Sget_simple_extent_ndims determines the dimensionality (or rank) of a * dataspace. * * @param space_id IN: Identifier of the dataspace * * @return the number of dimensions in the dataspace if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Sget_simple_extent_ndims( int space_id) throws HDF5LibraryException; /** * H5Sget_simple_extent_npoints determines the number of elements in a * dataspace. * * @param space_id * ID of the dataspace object to query * @return the number of elements in the dataspace if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native long H5Sget_simple_extent_npoints( int space_id) throws HDF5LibraryException; /** * H5Sget_simple_extent_type queries a dataspace to determine the current * class of a dataspace. * * @param space_id * Dataspace identifier. * * @return a dataspace class name if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Sget_simple_extent_type(int space_id) throws HDF5LibraryException; /** * H5Sis_simple determines whether a dataspace is a simple dataspace. * * @param space_id * Identifier of the dataspace to query * * @return true if is a simple dataspace * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native boolean H5Sis_simple(int space_id) throws HDF5LibraryException; /** * H5Soffset_simple sets the offset of a simple dataspace space_id. * * @param space_id * IN: The identifier for the dataspace object to reset. * @param offset * IN: The offset at which to position the selection. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - offset array is null. **/ public synchronized static native int H5Soffset_simple(int space_id, byte[] offset) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Soffset_simple(int space_id, long[] offset) throws HDF5Exception, NullPointerException { if (offset == null) { return -1; } HDFArray theArray = new HDFArray(offset); byte[] theArr = theArray.byteify(); int retVal = H5Soffset_simple(space_id, theArr); theArr = null; theArray = null; return retVal; } /** * H5Sselect_all selects the entire extent of the dataspace space_id. * * @param space_id * IN: The identifier of the dataspace to be selected. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Sselect_all(int space_id) throws HDF5LibraryException; /** * H5Sselect_elements selects array elements to be included in the selection * for the space_id dataspace. * * @param space_id * Identifier of the dataspace. * @param op * operator specifying how the new selection is combined. * @param num_elements * Number of elements to be selected. * @param coord * A 2-dimensional array specifying the coordinates of the * elements. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ private synchronized static native int H5Sselect_elements(int space_id, int op, int num_elements, byte[] coord) throws HDF5LibraryException, NullPointerException; /** * H5Sselect_elements selects array elements to be included in the selection * for the space_id dataspace. * * @param space_id * Identifier of the dataspace. * @param op * operator specifying how the new selection is combined. * @param num_elements * Number of elements to be selected. * @param coord2D * A 2-dimensional array specifying the coordinates of the * elements. * * @return a non-negative value if successful * * @exception HDF5Exception * - Error in the data conversion * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - cord array is **/ public synchronized static int H5Sselect_elements(int space_id, int op, int num_elements, long[][] coord2D) throws HDF5Exception, HDF5LibraryException, NullPointerException { if (coord2D == null) { return -1; } HDFArray theArray = new HDFArray(coord2D); byte[] coord = theArray.byteify(); int retVal = H5Sselect_elements(space_id, op, num_elements, coord); coord = null; theArray = null; return retVal; } ///** //* H5Sselect_hyperslab selects a hyperslab region to add to //* the current selected region for the dataspace specified //* by space_id. The start, stride, count, and block arrays //* must be the same size as the rank of the dataspace. //* //* @param space_id IN: Identifier of dataspace selection to modify //* @param op IN: Operation to perform on current selection. //* @param start IN: Offset of start of hyperslab //* @param count IN: Number of blocks included in hyperslab. //* @param stride IN: Hyperslab stride. //* @param block IN: Size of block in hyperslab. //* //* @return none //* //* @exception HDF5LibraryException - Error from the HDF-5 Library. //* @exception NullPointerException - an input array is null. //* @exception IllegalArgumentException - an input array is invalid. //**/ //public synchronized static native void H5Sselect_hyperslab(int space_id, H5S_SELECT_OPER op, // long start[], long _stride[], long count[], long _block[]) // throws HDF5LibraryException, NullPointerException, IllegalArgumentException; //public synchronized static native int H5Scombine_hyperslab(int space_id, H5S_SELECT_OPER op, // const long start[], const long _stride[], // const long count[], const long _block[]) // throws HDF5LibraryException, NullPointerException; //public synchronized static native int H5Sselect_select(int space1_id, H5S_SELECT_OPER op, // int space2_id) // throws HDF5LibraryException, NullPointerException; //public synchronized static native int H5Scombine_select(int space1_id, H5S_SELECT_OPER op, // int space2_id) // throws HDF5LibraryException, NullPointerException; /** * H5Sselect_hyperslab selects a hyperslab region to add to the current * selected region for the dataspace specified by space_id. The start, * stride, count, and block arrays must be the same size as the rank of the * dataspace. * * @param space_id * IN: Identifier of dataspace selection to modify * @param op * IN: Operation to perform on current selection. * @param start * IN: Offset of start of hyperslab * @param stride * IN: Hyperslab stride. * @param count * IN: Number of blocks included in hyperslab. * @param block * IN: Size of block in hyperslab. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. * @exception NullPointerException * - an input array is null. * @exception NullPointerException * - an input array is invalid. **/ public synchronized static int H5Sselect_hyperslab(int space_id, int op, byte[] start, byte[] stride, byte[] count, byte[] block) throws HDF5LibraryException, NullPointerException, IllegalArgumentException { ByteBuffer startbb = ByteBuffer.wrap(start); long[] lastart = (startbb.asLongBuffer()).array(); ByteBuffer stridebb = ByteBuffer.wrap(stride); long[] lastride = (stridebb.asLongBuffer()).array(); ByteBuffer countbb = ByteBuffer.wrap(count); long[] lacount = (countbb.asLongBuffer()).array(); ByteBuffer blockbb = ByteBuffer.wrap(block); long[] lablock = (blockbb.asLongBuffer()).array(); return H5Sselect_hyperslab(space_id, op, lastart, lastride, lacount, lablock); } public synchronized static native int H5Sselect_hyperslab(int space_id, int op, long[] start, long[] stride, long[] count, long[] block) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Sselect_none resets the selection region for the dataspace space_id to * include no elements. * * @param space_id * IN: The identifier of the dataspace to be reset. * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Sselect_none(int space_id) throws HDF5LibraryException; /** * H5Sselect_valid verifies that the selection for the dataspace. * * @param space_id * The identifier for the dataspace in which the selection is * being reset. * * @return true if the selection is contained within the extent and FALSE if * it is not or is an error. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native boolean H5Sselect_valid(int space_id) throws HDF5LibraryException; /** * H5Sset_extent_none removes the extent from a dataspace and sets the type * to H5S_NONE. * * @param space_id * The identifier for the dataspace from which the extent is to * be removed. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Sset_extent_none(int space_id) throws HDF5LibraryException; /** * H5Sset_extent_simple sets or resets the size of an existing dataspace. * * @param space_id * Dataspace identifier. * @param rank * Rank, or dimensionality, of the dataspace. * @param current_size * Array containing current size of dataspace. * @param maximum_size * Array containing maximum size of dataspace. * * @return a dataspace identifier if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Sset_extent_simple(int space_id, int rank, long[] current_size, long[] maximum_size) throws HDF5LibraryException, NullPointerException; public synchronized static int H5Sset_extent_simple(int space_id, int rank, byte[] current_size, byte[] maximum_size) throws HDF5LibraryException, NullPointerException { ByteBuffer csbb = ByteBuffer.wrap(current_size); long[] lacs = (csbb.asLongBuffer()).array(); ByteBuffer maxsbb = ByteBuffer.wrap(maximum_size); long[] lamaxs = (maxsbb.asLongBuffer()).array(); return H5Sset_extent_simple(space_id, rank, lacs, lamaxs); } ////////////////////////////////////////////////////////////// //// //H5T: Datatype Interface Functions // //// ////////////////////////////////////////////////////////////// /** * H5Tarray_create creates a new array datatype object. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Tarray_create(int, int, long[])} * * @param base IN: Datatype identifier for the array base datatype. * @param rank IN: Rank of the array. * @param dims IN: Size of each array dimension. * @param perms IN: Dimension permutation. (Currently not implemented.) * * @return a valid datatype identifier * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - dims is null. **/ @Deprecated public static int H5Tarray_create(int base, int rank, int[] dims, int[] perms) throws HDF5LibraryException, NullPointerException { int id = _H5Tarray_create(base, rank, dims, perms); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Tarray_create(int base, int rank, int[] dims, int[] perms) throws HDF5LibraryException, NullPointerException; /** * H5Tarray_create creates a new array datatype object. * * @param base_id IN: Datatype identifier for the array base datatype. * @param ndims IN: Rank of the array. * @param dim IN: Size of each array dimension. * * @return a valid datatype identifier * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - dim is null. **/ public static int H5Tarray_create(int base_id, int ndims, long[] dim) throws HDF5LibraryException, NullPointerException { int id = _H5Tarray_create2(base_id, ndims, dim); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Tarray_create2(int base_id, int ndims, long[] dim) throws HDF5LibraryException, NullPointerException; /** * H5Tclose releases a datatype. * * @param type_id IN: Identifier of datatype to release. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Tclose(int type_id) throws HDF5LibraryException { if (type_id < 0) throw new HDF5LibraryException("Negative ID");; OPEN_IDS.removeElement(type_id); return _H5Tclose(type_id); } private synchronized static native int _H5Tclose(int type_id) throws HDF5LibraryException; /** * H5Tcommit commits a transient datatype (not immutable) to a file, turned * it into a named datatype. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Tcommit(int, String, int, int, int, int)} * * @param loc_id IN: Location identifier. * @param name IN: Name given to committed datatype. * @param type_id IN: Identifier of datatype to be committed. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ @Deprecated public static int H5Tcommit(int loc_id, String name, int type) throws HDF5LibraryException, NullPointerException { return H5Tcommit1(loc_id, name, type); } public synchronized static native int H5Tcommit1(int loc_id, String name, int type) throws HDF5LibraryException, NullPointerException; /** * H5Tcommit saves a transient datatype as an immutable named datatype in a file. * * @param loc_id IN: Location identifier. * @param name IN: Name given to committed datatype. * @param type_id IN: Identifier of datatype to be committed. * @param lcpl_id IN: Link creation property list. * @param tcpl_id IN: Datatype creation property list. * @param tapl_id IN: Datatype access property list. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native void H5Tcommit(int loc_id, String name, int type_id, int lcpl_id, int tcpl_id, int tapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Tcommit_anon commits a transient datatype (not immutable) to a file, * turning it into a named datatype with the specified creation and property lists. * * @param loc_id IN: Location identifier. * @param type_id IN: Identifier of datatype to be committed. * @param tcpl_id IN: Datatype creation property list. * @param tapl_id IN: Datatype access property list. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native void H5Tcommit_anon(int loc_id, int type_id, int tcpl_id, int tapl_id) throws HDF5LibraryException; /** * H5Tcommitted queries a type to determine whether the type specified by * the type identifier is a named type or a transient type. * * @param type_id IN: Identifier of datatype. * * @return true the datatype has been committed * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native boolean H5Tcommitted(int type) throws HDF5LibraryException; /** * H5Tcompiler_conv finds out whether the library's conversion function from * type src_id to type dst_id is a compiler (hard) conversion. * * @param src_id IN: Identifier of source datatype. * @param dst_id IN: Identifier of destination datatype. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native void H5Tcompiler_conv(int src_id, int dst_id) throws HDF5LibraryException; /** ** H5Tconvert converts nelmts elements from the type specified by the src_id identifier to type dst_id. * * @param src_id IN: Identifier of source datatype. * @param dst_id IN: Identifier of destination datatype. * @param nelmts IN: Size of array buf. * @param buf IN: Array containing pre- and post-conversion values. * @param background IN: Optional background buffer. * @param plist_id IN: Dataset transfer property list identifier. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - buf is null. **/ public synchronized static native void H5Tconvert(int src_id, int dst_id, long nelmts, byte[] buf, byte[] background, int plist_id) throws HDF5LibraryException, NullPointerException; // int H5Tconvert(int src_id, int dst_id, long nelmts, Pointer buf, Pointer background, int plist_id); /** * H5Tcopy copies an existing datatype. The returned type is * always transient and unlocked. * * @param type_id IN: Identifier of datatype to copy. Can be a datatype * identifier, a predefined datatype (defined in * H5Tpublic.h), or a dataset Identifier. * * @return a datatype identifier if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Tcopy(int type_id) throws HDF5LibraryException { int id = _H5Tcopy(type_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Tcopy(int type_id) throws HDF5LibraryException; /** * H5Tcreate creates a new dataype of the specified class with the specified * number of bytes. * * @param type IN: Class of datatype to create. * @param size IN: The number of bytes in the datatype to create. * * @return datatype identifier if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Tcreate(int dclass, int size) throws HDF5LibraryException { return H5Tcreate(dclass, (long)size); } /** * H5Tcreate creates a new dataype of the specified class with * the specified number of bytes. * * @param type IN: Class of datatype to create. * @param size IN: The number of bytes in the datatype to create. * * @return datatype identifier * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Tcreate(int type, long size) throws HDF5LibraryException { int id = _H5Tcreate(type, size); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Tcreate(int type, long size) throws HDF5LibraryException; /** * H5Tdecode reconstructs the HDF5 data type object and * returns a new object handle for it. * * @param buf IN: Buffer for the data type object to be decoded. * * @return a new object handle * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - buf is null. **/ public synchronized static native int H5Tdecode(byte[] buf) throws HDF5LibraryException, NullPointerException; /** * H5Tdetect_class determines whether the datatype specified in dtype_id contains * any datatypes of the datatype class specified in dtype_class. * * @param type_id IN: Identifier of datatype to query. * @param cls IN: Identifier of datatype cls. * * @return true if the datatype specified in dtype_id contains any datatypes of the datatype class * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native boolean H5Tdetect_class(int type_id, int cls) throws HDF5LibraryException; /** * H5Tencode converts a data type description into binary form in a buffer. * * @param obj_id IN: Identifier of the object to be encoded. * @param buf OUT: Buffer for the object to be encoded into. * If the provided buffer is NULL, only the * size of buffer needed is returned. * @param nalloc IN: The size of the allocated buffer. * * @return the size needed for the allocated buffer. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - buf is null. **/ public synchronized static native int H5Tencode(int obj_id, byte[] buf, long nalloc) throws HDF5LibraryException, NullPointerException; ///** // * H5Tencode converts a data type description into binary form in a buffer. // * // * @param obj_id IN: Identifier of the object to be encoded. // * // * @return the buffer for the object to be encoded into. // * // * @exception HDF5LibraryException - Error from the HDF-5 Library. // **/ //public synchronized static native byte[] H5Tencode(int obj_id) //throws HDF5LibraryException; /** * H5Tenum_create creates a new enumeration datatype based on the specified * base datatype, parent_id, which must be an integer type. * * @param base_id IN: Identifier of the parent datatype to release. * * @return the datatype identifier for the new enumeration datatype * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Tenum_create(int base_id) throws HDF5LibraryException { int id = _H5Tenum_create(base_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Tenum_create(int base_id) throws HDF5LibraryException; /** * H5Tenum_insert inserts a new enumeration datatype member * into an enumeration datatype. * * @param type IN: Identifier of datatype. * @param name IN: The name of the member * @param value IN: The value of the member, data of the correct type * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native void H5Tenum_insert(int type, String name, byte[] value) throws HDF5LibraryException, NullPointerException; /** * H5Tenum_insert inserts a new enumeration datatype member into an * enumeration datatype. * * @param type IN: Identifier of datatype. * @param name IN: The name of the member * @param value IN: The value of the member, data of the correct type * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public static int H5Tenum_insert(int type, String name, int[] value) throws HDF5LibraryException, NullPointerException { return H5Tenum_insert_int(type, name, value); } public static int H5Tenum_insert(int type, String name, int value) throws HDF5LibraryException, NullPointerException { int[] val = { value }; return H5Tenum_insert_int(type, name, val); } private synchronized static native int H5Tenum_insert_int(int type, String name, int[] value) throws HDF5LibraryException, NullPointerException; /** * H5Tenum_nameof finds the symbol name that corresponds * to the specified value of the enumeration datatype type. * * @param type IN: Identifier of datatype. * @param value IN: The value of the member, data of the correct * @param size IN: The probable length of the name * * @return the symbol name. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - value is null. **/ public synchronized static native String H5Tenum_nameof(int type, byte[] value, long size) throws HDF5LibraryException, NullPointerException; //int H5Tenum_nameof(int type, Pointer value, Buffer name/* out */, long size); /** * H5Tenum_nameof finds the symbol name that corresponds to the specified * value of the enumeration datatype type. * * @param type IN: Identifier of datatype. * @param value IN: The value of the member, data of the correct * @param name OUT: The name of the member * @param size IN: The max length of the name * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public static int H5Tenum_nameof(int type, int[] value, String[] name, int size) throws HDF5LibraryException, NullPointerException { return H5Tenum_nameof_int(type, value, name, size); } private synchronized static native int H5Tenum_nameof_int(int type, int[] value, String[] name, int size) throws HDF5LibraryException, NullPointerException; /** * H5Tenum_valueof finds the value that corresponds to * the specified name of the enumeration datatype type. * * @param type IN: Identifier of datatype. * @param name IN: The name of the member * @param value OUT: The value of the member * * @return the value of the enumeration datatype. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native void H5Tenum_valueof(int type, String name, byte[] value) throws HDF5LibraryException, NullPointerException; /** * H5Tenum_valueof finds the value that corresponds to the specified name of * the enumeration datatype type. * * @param type IN: Identifier of datatype. * @param name IN: The name of the member * @param value OUT: The value of the member * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public static int H5Tenum_valueof(int type, String name, int[] value) throws HDF5LibraryException, NullPointerException { return H5Tenum_valueof_int(type, name, value); } private synchronized static native int H5Tenum_valueof_int(int type, String name, int[] value) throws HDF5LibraryException, NullPointerException; /** * H5Tequal determines whether two datatype identifiers refer * to the same datatype. * * @param type_id1 IN: Identifier of datatype to compare. * @param type_id2 IN: Identifier of datatype to compare. * * @return true if the datatype identifiers refer to the * same datatype, else false. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native boolean H5Tequal(int type_id1, int type_id2) throws HDF5LibraryException; //public interface H5T_conv_t extends Callback { //int callback(int src_id, int dst_id, H5T_cdata_t cdata, long nelmts, //long buf_stride, long bkg_stride, Pointer buf, Pointer bkg, //int dset_xfer_plist); //} // ////Exception handler. If an exception like overflow happenes during ////conversion, ////this function is called if it's registered through H5Pset_type_conv_cb. //public interface H5T_conv_except_func_t extends Callback { //int callback(H5T_conv_except_t except_type, int src_id, int dst_id, //Pointer src_buf, Pointer dst_buf, Pointer user_data); //} //H5T_conv_t H5Tfind(int src_id, int dst_id, H5T_cdata_t *pcdata); /** * H5Tget_array_dims returns the sizes of the dimensions of the specified array datatype object. * * @deprecated As of HDF5 1.8 * * @param type_id IN: Datatype identifier of array object. * @param dims OUT: Sizes of array dimensions. * @param perm[] OUT: Dimension permutations. (This parameter is not used.) * * @return the non-negative number of dimensions of the array type * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - dims is null. **/ @Deprecated public synchronized static native int H5Tget_array_dims(int dt, int[] dims, int[] perms) throws HDF5LibraryException, NullPointerException; /** * H5Tget_array_dims returns the sizes of the dimensions of the specified array datatype object. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Tget_array_dims(int, long[])} * * @param type_id IN: Datatype identifier of array object. * @param dims OUT: Sizes of array dimensions. * @param perm OUT: Dimension permutation. (Currently not implemented.) * * @return the non-negative number of dimensions of the array type * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ @Deprecated public static int H5Tget_array_dims(int type_id, long[] dims, int[] perm) throws HDF5LibraryException, NullPointerException { return H5Tget_array_dims1(type_id, dims, perm); } /** * H5Tget_array_dims1 returns the sizes of the dimensions of the specified array datatype object. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Tget_array_dims2(int, long[])} * * @see public static int H5Tget_array_dims(int type_id, long[] dims, int[] perm) **/ @Deprecated private synchronized static native int H5Tget_array_dims1(int type_id, long[] dims, int[] perm) throws HDF5LibraryException, NullPointerException; /** * H5Tget_array_dims returns the sizes of the dimensions of the specified array datatype object. * * @param type_id IN: Datatype identifier of array object. * @param dims OUT: Sizes of array dimensions. * * @return the non-negative number of dimensions of the array type * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - dims is null. **/ public static int H5Tget_array_dims(int type_id, long[] dims) throws HDF5LibraryException, NullPointerException { return H5Tget_array_dims2(type_id, dims); } /** * H5Tget_array_dims2 returns the sizes of the dimensions of the specified array datatype object. * * @see public static int H5Tget_array_dims(int type_id, long[] dims) **/ public synchronized static native int H5Tget_array_dims2(int type_id, long[] dims) throws HDF5LibraryException, NullPointerException; /** * H5Tget_array_ndims returns the rank, the number of dimensions, of an array datatype object. * * @param type_id IN: Datatype identifier of array object. * * @return the rank of the array * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_array_ndims(int type_id) throws HDF5LibraryException; /** * H5Tget_class returns the datatype class identifier. * * @param type_id IN: Identifier of datatype to query. * * @return datatype class identifier if successful; otherwise H5T_NO_CLASS(-1). * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_class(int type_id) throws HDF5LibraryException; /** * H5Tget_class_name returns the datatype class identifier. * * @param class_id IN: Identifier of class from H5Tget_class. * * @return class name if successful; otherwise H5T_NO_CLASS. * **/ public static String H5Tget_class_name(int class_id) { String retValue = null; if(HDF5Constants.H5T_INTEGER==class_id) /*integer types */ retValue = "H5T_INTEGER"; else if(HDF5Constants.H5T_FLOAT==class_id) /*floating-point types */ retValue = "H5T_FLOAT"; else if(HDF5Constants.H5T_TIME==class_id) /*date and time types */ retValue = "H5T_TIME"; else if(HDF5Constants.H5T_STRING==class_id) /*character string types */ retValue = "H5T_STRING"; else if(HDF5Constants.H5T_BITFIELD==class_id) /*bit field types */ retValue = "H5T_BITFIELD"; else if(HDF5Constants.H5T_OPAQUE==class_id) /*opaque types */ retValue = "H5T_OPAQUE"; else if(HDF5Constants.H5T_COMPOUND==class_id) /*compound types */ retValue = "H5T_COMPOUND"; else if(HDF5Constants.H5T_REFERENCE==class_id)/*reference types */ retValue = "H5T_REFERENCE"; else if(HDF5Constants.H5T_ENUM==class_id) /*enumeration types */ retValue = "H5T_ENUM"; else if(HDF5Constants.H5T_VLEN==class_id) /*Variable-Length types */ retValue = "H5T_VLEN"; else if(HDF5Constants.H5T_ARRAY==class_id) /*Array types */ retValue = "H5T_ARRAY"; else retValue = "H5T_NO_CLASS"; return retValue; } /** * H5Tget_create_plist returns a property list identifier for the datatype * creation property list associated with the datatype specified by type_id. * * @param type_id IN: Identifier of datatype. * * @return a datatype property list identifier. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_create_plist(int type_id) throws HDF5LibraryException; /** * H5Tget_cset retrieves the character set type of a string datatype. * * @param type_id IN: Identifier of datatype to query. * * @return a valid character set type if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_cset(int type_id) throws HDF5LibraryException; /** * H5Tset_cset the character set to be used. * * @param type_id IN: Identifier of datatype to modify. * @param cset IN: Character set type. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tset_cset(int type_id, int cset) throws HDF5LibraryException; /** * H5Tget_ebias retrieves the exponent bias of a floating-point type. * * @param type_id * Identifier of datatype to query. * * @return the bias if successful; otherwise 0. * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_ebias(int type_id) throws HDF5LibraryException; /** * H5Tset_ebias sets the exponent bias of a floating-point type. * * @param type_id * Identifier of datatype to set. * @param ebias * Exponent bias value. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Tset_ebias(int type_id, int ebias) throws HDF5LibraryException { H5Tset_ebias(type_id, (long)ebias); return 0; } /** * H5Tget_ebias retrieves the exponent bias of a * floating-point type. * * @param type_id IN: Identifier of datatype to query. * * @return the bias * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native long H5Tget_ebias_long(int type_id) throws HDF5LibraryException; /** * H5Tset_ebias sets the exponent bias of a floating-point type. * * @param type_id IN: Identifier of datatype to set. * @param ebias IN: Exponent bias value. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native void H5Tset_ebias(int type_id, long ebias) throws HDF5LibraryException; /** * H5Tget_fields retrieves information about the locations of * the various bit fields of a floating point datatype. * * @param type_id IN: Identifier of datatype to query. * @param fields OUT: location of size and bit-position. *
      *
    • fields[0] = spos OUT: location to return size of in bits.
    • *
    • fields[1] = epos OUT: location to return exponent bit-position.
    • *
    • fields[2] = esize OUT: location to return size of exponent in bits.
    • *
    • fields[3] = mpos OUT: location to return mantissa bit-position.
    • *
    • fields[4] = msize OUT: location to return size of mantissa in bits.
    • *
    * * @return none. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - fields is null. * @exception IllegalArgumentException - fields array is invalid. **/ public synchronized static native void H5Tget_fields(int type_id, long[] fields) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Tget_fields retrieves information about the locations of the various * bit fields of a floating point datatype. * * @param type_id IN: Identifier of datatype to query. * @param fields OUT: location of size and bit-position. * *
     *      fields[0] = spos  OUT: location to return size of in bits.
     *      fields[1] = epos  OUT: location to return exponent bit-position.
     *      fields[2] = esize OUT: location to return size of exponent in bits.
     *      fields[3] = mpos  OUT: location to return mantissa bit-position.
     *      fields[4] = msize OUT: location to return size of mantissa in bits.
     * 
    * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - fields is null. * @exception IllegalArgumentException - fields array is invalid. **/ public static int H5Tget_fields(int type_id, int[] fields) throws HDF5LibraryException, NullPointerException, IllegalArgumentException { return H5Tget_fields_int(type_id, fields); } private synchronized static native int H5Tget_fields_int(int type_id, int[] fields) throws HDF5LibraryException, NullPointerException, IllegalArgumentException; /** * H5Tset_fields sets the locations and sizes of the various * floating point bit fields. * * @param type_id IN: Identifier of datatype to set. * @param spos IN: Size position. * @param epos IN: Exponent bit position. * @param esize IN: Size of exponent in bits. * @param mpos IN: Mantissa bit position. * @param msize IN: Size of mantissa in bits. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native void H5Tset_fields(int type_id, long spos, long epos, long esize, long mpos, long msize) throws HDF5LibraryException; /** * H5Tset_fields sets the locations and sizes of the various floating point * bit fields. * * @param type_id * Identifier of datatype to set. * @param spos * Size position. * @param epos * Exponent bit position. * @param esize * Size of exponent in bits. * @param mpos * Mantissa bit position. * @param msize * Size of mantissa in bits. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Tset_fields(int type_id, int spos, int epos, int esize, int mpos, int msize) throws HDF5LibraryException { H5Tset_fields(type_id, (long)spos, (long)epos, (long)esize, (long)mpos, (long)msize); return 0; } /** * H5Tget_inpad retrieves the internal padding type for unused bits in * floating-point datatypes. * * @param type_id IN: Identifier of datatype to query. * * @return a valid padding type if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_inpad(int type_id) throws HDF5LibraryException; /** * If any internal bits of a floating point type are unused (that is, those * significant bits which are not part of the sign, exponent, or mantissa), * then H5Tset_inpad will be filled according to the value of the padding * value property inpad. * * @param type_id IN: Identifier of datatype to modify. * @param inpad IN: Padding type. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tset_inpad(int type_id, int inpad) throws HDF5LibraryException; /** * H5Tget_member_class returns the datatype of the specified member. * * @param type_id IN: Datatype identifier of compound object. * @param membno IN: Compound object member number. * * @return the identifier of a copy of the datatype of the field if successful; * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_member_class(int type_id, int membno) throws HDF5LibraryException; /** * H5Tget_member_index retrieves the index of a field of a compound * datatype. * * @param type_id IN: Identifier of datatype to query. * @param field_name IN: Field name of the field index to retrieve. * * @return if field is defined, the index; else negative. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_member_index(int type_id, String field_name); /** * H5Tget_member_name retrieves the name of a field of a compound datatype or * an element of an enumeration datatype. * * @param type_id IN: Identifier of datatype to query. * @param field_idx IN: Field index (0-based) of the field name to retrieve. * * @return a valid pointer to the name if successful; otherwise null. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native String H5Tget_member_name(int type_id, int field_idx); /** * H5Tget_member_offset returns the byte offset of the specified member of * the compound datatype. This is the byte offset in the HDF-5 file/library, * NOT the offset of any Java object which might be mapped to this data * item. * * @param type_id IN: Identifier of datatype to query. * @param membno IN: Field index (0-based) of the field type to retrieve. * * @return the offset of the member. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native long H5Tget_member_offset(int type_id, int membno) throws HDF5LibraryException; /** * H5Tget_member_type returns the datatype of the specified member. * * @param type_id IN: Identifier of datatype to query. * @param field_idx IN: Field index (0-based) of the field type to retrieve. * * @return the identifier of a copy of the datatype of the field if * successful; * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Tget_member_type(int type_id, int field_idx) throws HDF5LibraryException { int id = _H5Tget_member_type(type_id, field_idx); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Tget_member_type(int type_id, int field_idx) throws HDF5LibraryException; /** * H5Tget_member_value returns the value of the enumeration datatype member memb_no. * * @param type_id IN: Datatype identifier for the enumeration datatype. * @param membno IN: Number of the enumeration datatype member. * @param value OUT: The value of the member * * @return none. * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - value is null. **/ public synchronized static native void H5Tget_member_value(int type_id, int membno, byte[] value) throws HDF5LibraryException, NullPointerException; /** * H5Tget_member_value returns the value of the enumeration datatype member * memb_no. * * @param type_id IN: Identifier of datatype. * @param membno IN: The name of the member * @param value OUT: The value of the member * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - value is null. **/ public static int H5Tget_member_value(int type_id, int membno, int[] value) throws HDF5LibraryException, NullPointerException { return H5Tget_member_value_int(type_id, membno, value); } private synchronized static native int H5Tget_member_value_int(int type_id, int membno, int[] value) throws HDF5LibraryException, NullPointerException; /** * H5Tget_native_type returns the equivalent native datatype for the datatype specified in type_id. * * @param type_id IN: Identifier of datatype to query. * Direction of search is assumed to be in ascending order. * * @return the native datatype identifier for the specified dataset datatype. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static int H5Tget_native_type(int tid) throws HDF5LibraryException { return H5Tget_native_type(tid, HDF5Constants.H5T_DIR_ASCEND); } /** * H5Tget_native_type returns the equivalent native datatype for the datatype specified in type_id. * * @param type_id IN: Identifier of datatype to query. * @param direction IN: Direction of search. * * @return the native datatype identifier for the specified dataset datatype. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Tget_native_type(int tid, int direction) throws HDF5LibraryException { int id = _H5Tget_native_type(tid, direction); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Tget_native_type(int tid, int direction) throws HDF5LibraryException; /** * H5Tget_nmembers retrieves the number of fields a compound datatype has. * * @param type_id IN: Identifier of datatype to query. * * @return number of members datatype has if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_nmembers(int type_id) throws HDF5LibraryException; /** * H5Tget_norm retrieves the mantissa normalization of a floating-point * datatype. * * @param type_id IN: Identifier of datatype to query. * * @return a valid normalization type if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_norm(int type_id) throws HDF5LibraryException; /** * H5Tset_norm sets the mantissa normalization of a floating-point datatype. * * @param type_id IN: Identifier of datatype to set. * @param norm IN: Mantissa normalization type. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tset_norm(int type_id, int norm) throws HDF5LibraryException; /** * H5Tget_offset retrieves the bit offset of the first significant bit. * * @param type_id IN: Identifier of datatype to query. * * @return a positive offset value if successful; otherwise 0. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_offset(int type_id) throws HDF5LibraryException; /** * H5Tset_offset sets the bit offset of the first significant bit. * * @param type_id * Identifier of datatype to set. * @param offset * Offset of first significant bit. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Tset_offset(int type_id, int offset) throws HDF5LibraryException { H5Tset_offset(type_id, (long)offset); return 0; } /** * H5Tset_offset sets the bit offset of the first significant bit. * * @param type_id IN: Identifier of datatype to set. * @param offset IN: Offset of first significant bit. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native void H5Tset_offset(int type_id, long offset) throws HDF5LibraryException; /** * H5Tget_order returns the byte order of an atomic datatype. * * @param type_id IN: Identifier of datatype to query. * * @return a byte order constant if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_order(int type_id) throws HDF5LibraryException; /** * H5Tset_order sets the byte ordering of an atomic datatype. * * @param type_id IN: Identifier of datatype to set. * @param order IN: Byte ordering constant. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tset_order(int type_id, int order) throws HDF5LibraryException; /** * H5Tget_pad retrieves the padding type of the least and most-significant * bit padding. * * @param type_id IN: Identifier of datatype to query. * @param pad OUT: locations to return least-significant and * most-significant bit padding type. * *
     *      pad[0] = lsb // least-significant bit padding type
     *      pad[1] = msb // most-significant bit padding type
     * 
    * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - pad is null. **/ public synchronized static native int H5Tget_pad(int type_id, int[] pad) throws HDF5LibraryException, NullPointerException; /** * H5Tset_pad sets the least and most-significant bits padding types. * * @param type_id IN: Identifier of datatype to set. * @param lsb IN: Padding type for least-significant bits. * @param msb IN: Padding type for most-significant bits. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Tset_pad(int type_id, int lsb, int msb) throws HDF5LibraryException; /** * H5Tget_precision returns the precision of an atomic datatype. * * @param type_id * Identifier of datatype to query. * * @return the number of significant bits if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_precision(int type_id) throws HDF5LibraryException; /** * H5Tset_precision sets the precision of an atomic datatype. * * @param type_id * Identifier of datatype to set. * @param precision * Number of bits of precision for datatype. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Tset_precision(int type_id, int precision) throws HDF5LibraryException { H5Tset_precision(type_id, (long)precision); return 0; } /** * H5Tget_precision returns the precision of an atomic datatype. * * @param type_id IN: Identifier of datatype to query. * * @return the number of significant bits if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native long H5Tget_precision_long(int type_id) throws HDF5LibraryException; /** * H5Tset_precision sets the precision of an atomic datatype. * * @param type_id IN: Identifier of datatype to set. * @param precision IN: Number of bits of precision for datatype. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native void H5Tset_precision(int type_id, long precision) throws HDF5LibraryException; /** * H5Tget_sign retrieves the sign type for an integer type. * * @param type_id IN: Identifier of datatype to query. * * @return a valid sign type if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_sign(int type_id) throws HDF5LibraryException; /** * H5Tset_sign sets the sign proprety for an integer type. * * @param type_id IN: Identifier of datatype to set. * @param sign IN: Sign type. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tset_sign(int type_id, int sign) throws HDF5LibraryException; /** * H5Tget_size returns the size of a datatype in bytes. * * @param type_id * Identifier of datatype to query. * * @return the size of the datatype in bytes if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_size(int type_id) throws HDF5LibraryException; /** * H5Tset_size sets the total size in bytes, size, for an atomic datatype * (this operation is not permitted on compound datatypes). * * @param type_id * Identifier of datatype to change size. * @param size * Size in bytes to modify datatype. * * @return a non-negative value if successful * * @exception HDF5LibraryException * - Error from the HDF-5 Library. **/ public static int H5Tset_size(int type_id, int size) throws HDF5LibraryException { H5Tset_size(type_id, (long)size); return 0; } /** * H5Tget_size returns the size of a datatype in bytes. * * @param type_id IN: Identifier of datatype to query. * * @return the size of the datatype in bytes * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native long H5Tget_size_long(int type_id) throws HDF5LibraryException; /** * H5Tset_size sets the total size in bytes, size, for an * atomic datatype (this operation is not permitted on * compound datatypes). * * @param type_id IN: Identifier of datatype to change size. * @param size IN: Size in bytes to modify datatype. * * @return none * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native void H5Tset_size(int type_id, long size) throws HDF5LibraryException; /** * H5Tget_strpad retrieves the string padding method for a string datatype. * * @param type_id IN: Identifier of datatype to query. * * @return a valid string padding type if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tget_strpad(int type_id) throws HDF5LibraryException; /** * H5Tset_strpad defines the storage mechanism for the string. * * @param type_id IN: Identifier of datatype to modify. * @param strpad IN: String padding type. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tset_strpad(int type_id, int strpad) throws HDF5LibraryException; /** * H5Tget_super returns the type from which TYPE is derived. * * @param type IN: Identifier of datatype. * * @return the parent type * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Tget_super(int type) throws HDF5LibraryException { int id = _H5Tget_super(type); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Tget_super(int type) throws HDF5LibraryException; /** * H5Tget_tag returns the tag associated with datatype type_id. * * @param type IN: Identifier of datatype. * * @return the tag * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native String H5Tget_tag(int type) throws HDF5LibraryException; /** * H5Tset_tag tags an opaque datatype type_id with a unique ASCII identifier * tag. * * @param type IN: Datatype identifier for the opaque datatype to be tagged. * @param tag IN: Descriptive ASCII string with which the opaque datatype is to be tagged. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tset_tag(int type, String tag) throws HDF5LibraryException; /** * H5Tinsert adds another member to the compound datatype type_id. * * @param type_id IN: Identifier of compound datatype to modify. * @param name IN: Name of the field to insert. * @param offset IN: Offset in memory structure of the field to insert. * @param field_id IN: Datatype identifier of the field to insert. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public synchronized static native int H5Tinsert(int type_id, String name, long offset, int field_id) throws HDF5LibraryException, NullPointerException; /** * H5Tis_variable_str determines whether the datatype identified in type_id is a variable-length string. * * @param type_id IN: Identifier of datatype to query. * * @return true if type_id is a variable-length string. * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native boolean H5Tis_variable_str(int type_id) throws HDF5LibraryException; /** * H5Tlock locks the datatype specified by the type_id identifier, making it * read-only and non-destrucible. * * @param type_id IN: Identifier of datatype to lock. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tlock(int type_id) throws HDF5LibraryException; /** * H5Topen opens a named datatype at the location specified * by loc_id and return an identifier for the datatype. * * @deprecated As of HDF5 1.8, replaced by {@link #H5Topen(int, String, int)} * * @param loc_id IN: A file, group, or datatype identifier. * @param name IN: A datatype name, defined within the file or group identified by loc_id. * * @return a named datatype identifier if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ @Deprecated public static int H5Topen(int loc_id, String name) throws HDF5LibraryException, NullPointerException { int id = _H5Topen(loc_id, name); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Topen(int loc_id, String name) throws HDF5LibraryException, NullPointerException; /** * H5Topen opens a named datatype at the location specified * by loc_id and return an identifier for the datatype. * * @param loc_id IN: A file, group, or datatype identifier. * @param name IN: A datatype name, defined within the file or group identified by loc_id. * @param tapl_id IN: Datatype access property list. * * @return a named datatype identifier if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. * @exception NullPointerException - name is null. **/ public static int H5Topen(int loc_id, String name, int tapl_id) throws HDF5LibraryException, NullPointerException { int id = _H5Topen2(loc_id, name, tapl_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Topen2(int loc_id, String name, int tapl_id) throws HDF5LibraryException, NullPointerException; /** * H5Tpack recursively removes padding from within a compound datatype to * make it more efficient (space-wise) to store that data. *

    * WARNING: This call only affects the C-data, even if it succeeds, * there may be no visible effect on Java objects. * * @param type_id IN: Identifier of datatype to modify. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public synchronized static native int H5Tpack(int type_id) throws HDF5LibraryException; //public synchronized static native int H5Tregister(H5T_pers_t pers, String name, int src_id, int dst_id, //H5T_conv_t func) //throws HDF5LibraryException, NullPointerException; // //public synchronized static native int H5Tunregister(H5T_pers_t pers, String name, int src_id, int dst_id, //H5T_conv_t func) //throws HDF5LibraryException, NullPointerException; /** * H5Tvlen_create creates a new variable-length (VL) dataype. * * @param base_id IN: Identifier of parent datatype. * * @return a non-negative value if successful * * @exception HDF5LibraryException - Error from the HDF-5 Library. **/ public static int H5Tvlen_create(int base_id) throws HDF5LibraryException { int id = _H5Tvlen_create(base_id); if (id > 0) OPEN_IDS.addElement(id); return id; } private synchronized static native int _H5Tvlen_create(int base_id) throws HDF5LibraryException; ////////////////////////////////////////////////////////////// //// //H5Z: Filter Interface Functions // //// ////////////////////////////////////////////////////////////// public synchronized static native int H5Zfilter_avail(int filter) throws HDF5LibraryException, NullPointerException; public synchronized static native int H5Zget_filter_info(int filter) throws HDF5LibraryException; public synchronized static native int H5Zunregister(int filter) throws HDF5LibraryException, NullPointerException; } jhdf-2.9/ncsa/hdf/hdf5lib/callbacks/0000755000175000017500000000000012051203651020075 5ustar sylvestresylvestrejhdf-2.9/ncsa/hdf/hdf5lib/callbacks/H5L_iterate_cb.java0000644000175000017500000000232512050301063023506 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.callbacks; import ncsa.hdf.hdf5lib.structs.H5L_info_t; //Information class for link callback(for H5Lvisit/H5Lvisit_by_name) public interface H5L_iterate_cb extends Callbacks { int callback(int group, String name, H5L_info_t info, H5L_iterate_t op_data); } jhdf-2.9/ncsa/hdf/hdf5lib/callbacks/H5D_iterate_cb.java0000644000175000017500000000224412050301063023476 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.callbacks; //Information class for link callback(for H5Diterate) public interface H5D_iterate_cb extends Callbacks { int callback(byte[] elem, int elem_type, int ndim, long[] point, H5D_iterate_t op_data); } jhdf-2.9/ncsa/hdf/hdf5lib/callbacks/Callbacks.java0000644000175000017500000000151112050301063022610 0ustar sylvestresylvestrepackage ncsa.hdf.hdf5lib.callbacks; /** All callback definitions must derive from this interface. Any * derived interfaces must define a single public method named "callback". * You are responsible for deregistering your callback (if necessary) * in its {@link Object#finalize} method. If native code attempts to call * a callback which has been GC'd, you will likely crash the VM. If * there is no method to deregister the callback (e.g. atexit * in the C library), you must ensure that you always keep a live reference * to the callback object.

    * A callback should generally never throw an exception, since it doesn't * necessarily have an encompassing Java environment to catch it. Any * exceptions thrown will be passed to the default callback exception * handler. */ public interface Callbacks { } jhdf-2.9/ncsa/hdf/hdf5lib/callbacks/H5L_iterate_t.java0000644000175000017500000000031512050301063023362 0ustar sylvestresylvestrepackage ncsa.hdf.hdf5lib.callbacks; public interface H5L_iterate_t { /** public ArrayList iterdata = new ArrayList(); * Any derived interfaces must define the single public varaible as above. */ } jhdf-2.9/ncsa/hdf/hdf5lib/callbacks/Makefile.in0000644000175000017500000000267512050301063022147 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = ../../../.. DIR = ncsa/hdf/hdf5lib/callbacks SUBDIRS = NULL JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ JAVA_SRCS = \ Callbacks.java \ H5L_iterate_cb.java \ H5L_iterate_t.java \ H5O_iterate_cb.java \ H5O_iterate_t.java \ H5D_iterate_cb.java \ H5D_iterate_t.java include $(TOP)/config/Rules.mk jhdf-2.9/ncsa/hdf/hdf5lib/callbacks/H5O_iterate_cb.java0000644000175000017500000000232512050301063023511 0ustar sylvestresylvestre/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF Java Products. The full HDF Java copyright * * notice, including terms governing use, modification, and redistribution, * * is contained in the file, COPYING. COPYING can be found at the root of * * the source code distribution tree. You can also access it online at * * http://www.hdfgroup.org/products/licenses.html. If you do not have * * access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package ncsa.hdf.hdf5lib.callbacks; import ncsa.hdf.hdf5lib.structs.H5O_info_t; //Information class for link callback(for H5Ovisit/H5Ovisit_by_name) public interface H5O_iterate_cb extends Callbacks { int callback(int group, String name, H5O_info_t info, H5O_iterate_t op_data); } jhdf-2.9/ncsa/hdf/hdf5lib/callbacks/H5O_iterate_t.java0000644000175000017500000000031512050301063023365 0ustar sylvestresylvestrepackage ncsa.hdf.hdf5lib.callbacks; public interface H5O_iterate_t { /** public ArrayList iterdata = new ArrayList(); * Any derived interfaces must define the single public varaible as above. */ } jhdf-2.9/ncsa/hdf/hdf5lib/callbacks/H5D_iterate_t.java0000644000175000017500000000031512050301063023352 0ustar sylvestresylvestrepackage ncsa.hdf.hdf5lib.callbacks; public interface H5D_iterate_t { /** public ArrayList iterdata = new ArrayList(); * Any derived interfaces must define the single public varaible as above. */ } jhdf-2.9/ncsa/hdf/hdflib/0000755000175000017500000000000012051203651016071 5ustar sylvestresylvestrejhdf-2.9/ncsa/hdf/hdflib/HDFNBITCompInfo.java0000644000175000017500000000357212050301061021445 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a container for the parameters to the HDF * ``NBIT'' compression class. *

    * In this case, the information needed is the number type, * the sign extension, the fill bit, the start bit, and the * number of bits to store. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFNBITCompInfo extends HDFNewCompInfo { public int nt; /* number type of the data to encode */ public int sign_ext; /* whether to sign extend or not */ public int fill_one; /* whether to fill with 1's or 0's */ public int start_bit; /* offset of the start bit in the data */ public int bit_len; /* number of bits to store */ public HDFNBITCompInfo() { ctype = HDFConstants.COMP_CODE_NBIT; } public HDFNBITCompInfo( int Nt, int Sign_ext, int Fill_one, int Start_bit, int Bit_len) { ctype = HDFConstants.COMP_CODE_NBIT; } } jhdf-2.9/ncsa/hdf/hdflib/HDFRLECompInfo.java0000644000175000017500000000242012050301061021322 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a generic container for the parameters to the HDF * RLE compressed classes, with the ``new'' type encoding. *

    * In this case, there is no auxilliary information. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFRLECompInfo extends HDFNewCompInfo { public HDFRLECompInfo () { ctype = HDFConstants.COMP_CODE_RLE; } } jhdf-2.9/ncsa/hdf/hdflib/HDFLibraryException.java0000644000175000017500000000364512050301061022542 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * The class HDFException returns errors raised by the HDF * library. *

    * In principle, this includes any and all errors possible * from the HDF library. However, most error conditions * are not yet detected in this version of the Java * interface. This will be added in future releases. * * The only HDF library error currently raised are errors * in Hopen, such as ``file not found''. */ public class HDFLibraryException extends HDFException { int HDFerror; String msg; public HDFLibraryException() { HDFerror = 0; msg = null; } public HDFLibraryException(String s) { msg = "HDFLibraryException: "+s; } public HDFLibraryException(int err) { HDFerror = err; } @Override public String getMessage() { if (msg != null) { return msg; } String s; try { s = HDFLibrary.HEstring(HDFerror); } catch (HDFException e) { s = new String("HDF error number: "+HDFerror+", HEstring failed"); } msg = "HDFLibraryException: "+s; return msg; } } jhdf-2.9/ncsa/hdf/hdflib/HDFOldCompInfo.java0000644000175000017500000000252712050301061021426 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a generic container for the parameters to the HDF * compressed classes, with the ``ole'' encoding. *

    * Compression parameters are expressed as instances of sub-classes * of this type. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFOldCompInfo extends HDFCompInfo { public int ctype; /* from COMP_NONE defines */ public HDFOldCompInfo() { ctype = HDFConstants.COMP_NONE; } ; } jhdf-2.9/ncsa/hdf/hdflib/HDFConstants.java0000644000175000017500000004262112050301061021230 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This interface defines the values of constants defined * by the HDF 4.1 API. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFConstants { /** FAIL */ public static final int FAIL = -1; // file access code definitions public static final int DFACC_READ = 1; public static final int DFACC_WRITE= 2; public static final int DFACC_RDWR = 3; public static final int DFACC_CREATE=4; public static final int DFACC_RDONLY=DFACC_READ; public static final int DFACC_DEFAULT=000; public static final int DFACC_SERIAL=001; public static final int DFACC_PARALLEL=011; // annotation type in HDF public static final int AN_DATA_LABEL = 0; public static final int AN_DATA_DESC = AN_DATA_LABEL + 1; public static final int AN_FILE_LABEL = AN_DATA_LABEL + 2; public static final int AN_FILE_DESC = AN_DATA_LABEL + 3; // HDF Tag Definations public static final int DFREF_WILDCARD = 0; public static final int DFTAG_WILDCARD = 0; public static final int DFREF_NONE = 0; // used by mfhdf/libsrc/putget.c // tags and refs public static final int DFTAG_NULL = 1; public static final int DFTAG_LINKED = 20; // linked-block special element public static final int DFTAG_VERSION = 30; public static final int DFTAG_COMPRESSED = 40; // compressed special element public static final int DFTAG_VLINKED = 50; // variable-len linked-block header public static final int DFTAG_VLINKED_DATA = 51; // variable-len linked-block data public static final int DFTAG_CHUNKED = 60; // chunked special element header public static final int DFTAG_CHUNK = 61; // chunk element // utility set public static final int DFTAG_FID = 100; // File identifier public static final int DFTAG_FD = 101; // File description public static final int DFTAG_TID = 102; // Tag identifier public static final int DFTAG_TD = 103; // Tag descriptor public static final int DFTAG_DIL = 104; // data identifier label public static final int DFTAG_DIA = 105; // data identifier annotation public static final int DFTAG_NT = 106; // number type public static final int DFTAG_MT = 107; // machine type public static final int DFTAG_FREE = 108; // free space in the file // raster-8 set public static final int DFTAG_ID8 = 200; // 8-bit Image dimension public static final int DFTAG_IP8 = 201; // 8-bit Image palette public static final int DFTAG_RI8 = 202; // Raster-8 image public static final int DFTAG_CI8 = 203; // RLE compressed 8-bit image public static final int DFTAG_II8 = 204; // IMCOMP compressed 8-bit image // Raster Image set public static final int DFTAG_ID = 300; // Image DimRec public static final int DFTAG_LUT = 301; // Image Palette public static final int DFTAG_RI = 302; // Raster Image public static final int DFTAG_CI = 303; // Compressed Image public static final int DFTAG_NRI = 304; // New-format Raster Image public static final int DFTAG_RIG = 306; // Raster Image Group public static final int DFTAG_LD = 307; // Palette DimRec public static final int DFTAG_MD = 308; // Matte DimRec public static final int DFTAG_MA = 309; // Matte Data public static final int DFTAG_CCN = 310; // color correction public static final int DFTAG_CFM = 311; // color format public static final int DFTAG_AR = 312; // aspect ratio public static final int DFTAG_DRAW = 400; // Draw these images in sequence public static final int DFTAG_RUN = 401; // run this as a program/script public static final int DFTAG_XYP = 500; // x-y position public static final int DFTAG_MTO = 501; // machine-type override // Tektronix public static final int DFTAG_T14 = 602; // TEK 4014 data public static final int DFTAG_T105 = 603; // TEK 4105 data // Scientific Data set // Objects of tag 721 are never actually written to the file. The tag is // needed to make things easier mixing DFSD and SD style objects in the // same file public static final int DFTAG_SDG = 700; // Scientific Data Group public static final int DFTAG_SDD = 701; // Scientific Data DimRec public static final int DFTAG_SD = 702; // Scientific Data public static final int DFTAG_SDS = 703; // Scales public static final int DFTAG_SDL = 704; // Labels public static final int DFTAG_SDU = 705; // Units public static final int DFTAG_SDF = 706; // Formats public static final int DFTAG_SDM = 707; // Max/Min public static final int DFTAG_SDC = 708; // Coord sys public static final int DFTAG_SDT = 709; // Transpose public static final int DFTAG_SDLNK = 710; // Links related to the dataset public static final int DFTAG_NDG = 720; // Numeric Data Group public static final int DFTAG_CAL = 731; // Calibration information public static final int DFTAG_FV = 732; // Fill Value information public static final int DFTAG_BREQ = 799; // Beginning of required tags public static final int DFTAG_SDRAG = 781; // List of ragged array line lengths public static final int DFTAG_EREQ = 780; // Current end of the range // VSets public static final int DFTAG_VG = 1965; // Vgroup public static final int DFTAG_VH = 1962; // Vdata Header public static final int DFTAG_VS = 1963; // Vdata Storage // compression schemes public static final int DFTAG_RLE = 11; // run length encoding public static final int DFTAG_IMC = 12; // IMCOMP compression alias public static final int DFTAG_IMCOMP = 12; // IMCOMP compression public static final int DFTAG_JPEG = 13; // JPEG compression (24-bit data) public static final int DFTAG_GREYJPEG = 14; // JPEG compression (8-bit data) public static final int DFTAG_JPEG5 = 15; // JPEG compression (24-bit data) public static final int DFTAG_GREYJPEG5 = 16; // JPEG compression (8-bit data) /** pixel interlacing scheme */ public static final int MFGR_INTERLACE_PIXEL = 0; /** line interlacing scheme */ public static final int MFGR_INTERLACE_LINE = MFGR_INTERLACE_PIXEL +1; /** component interlacing scheme */ public static final int MFGR_INTERLACE_COMPONENT = MFGR_INTERLACE_PIXEL +2; /** interlacing supported by the vset.*/ public static final int FULL_INTERLACE = 0; public static final int NO_INTERLACE = 1; /** unsigned char */ public static final int DFNT_UCHAR8 = 3; public static final int DFNT_UCHAR = 3; /** char */ public static final int DFNT_CHAR8 = 4; public static final int DFNT_CHAR = 4; /** No supported by HDF */ public static final int DFNT_CHAR16 = 42; public static final int DFNT_UCHAR16= 43; /** float */ public static final int DFNT_FLOAT32 = 5; public static final int DFNT_FLOAT = 5 ; //** double */ public static final int DFNT_FLOAT64 = 6; public static final int DFNT_FLOAT128 = 7 ; public static final int DFNT_DOUBLE = 6 ; /** 8-bit integer */ public static final int DFNT_INT8 = 20; /** unsigned 8-bit interger */ public static final int DFNT_UINT8 = 21; /** short */ public static final int DFNT_INT16 = 22; /** unsigned interger */ public static final int DFNT_UINT16 = 23; /** interger */ public static final int DFNT_INT32 = 24; /** unsigned interger */ public static final int DFNT_UINT32 = 25; /** No supported */ public static final int DFNT_INT64 = 26; public static final int DFNT_UINT64 = 27; public static final int DFNT_INT128 = 28; public static final int DFNT_UINT128 = 30; public static final int DFNT_LITEND = 0x00004000; public static final int DF_FORWARD = 1; public static final int DFS_MAXLEN = 255; public static final int COMP_NONE = 0; public static final int COMP_JPEG = 2; public static final int COMP_RLE = 11; public static final int COMP_IMCOMP = 12; public static final int COMP_CODE_NONE = 0; public static final int COMP_CODE_RLE = 1; public static final int COMP_CODE_NBIT = 2; public static final int COMP_CODE_SKPHUFF = 3; public static final int COMP_CODE_DEFLATE = 4; public static final int COMP_CODE_SZIP = 5; public static final int COMP_CODE_INVALID = 6; public static final int COMP_CODE_JPEG = 7; // Interlace schemes public static final int DFIL_PIXEL = 0; /* Pixel Interlacing */ public static final int DFIL_LINE = 1; /* Scan Line Interlacing */ public static final int DFIL_PLANE = 2; /* Scan Plane Interlacing */ public static final int SD_UNLIMITED = 0; public static final int SD_FILL = 0; public static final int SD_NOFILL = 0x100; public static final int SD_DIMVAL_BW_COMP = 1; public static final int SD_DIMVAL_BW_INCOMP = 0; public static final int HDF_NONE = 0x0; public static final int HDF_CHUNK = 0x1; public static final int HDF_COMP = 0x3; public static final int HDF_NBIT = 0x5; public static final int MAX_VAR_DIMS =32; //the names of the Vgroups created by the GR interface public static final String GR_NAME = "RIG0.0"; public static final String RI_NAME = "RI0.0"; public static final String RIGATTRNAME = "RIATTR0.0N"; public static final String RIGATTRCLASS = "RIATTR0.0C"; // names of classes of the Vdatas/Vgroups created by the SD interface public static final String HDF_ATTRIBUTE = "Attr0.0"; public static final String HDF_VARIABLE = "Var0.0"; public static final String HDF_DIMENSION = "Dim0.0"; public static final String HDF_UDIMENSION = "UDim0.0"; public static final String DIM_VALS = "DimVal0.0"; public static final String DIM_VALS01 = "DimVal0.1"; public static final String HDF_CHK_TBL = "_HDF_CHK_TBL_"; public static final String HDF_CDF = "CDF0.0"; // names of data object types public static final String ANNOTATION = "HDF_ANNOTATION"; public static final String RI8 = "HDF_RI8"; public static final String RI24 = "HDF_RI24"; public static final String GR = "HDF_GR"; public static final String SDS = "HDF_SDS"; public static final String VDATA = "HDF_VDATA"; public static final String VGROUP = "HDF_GROUP"; // data types represented by Strings public static final String UCHAR8 = "UCHAR8"; public static final String CHAR8 = "CHAR8"; public static final String UCHAR16 = "UCHAR16"; public static final String CHAR16 = "CHAR16"; public static final String FLOAT32 = "FLOAT32"; public static final String FLOAT64 = "FLOAT64"; public static final String FLOAT128 = "FLOAT128"; public static final String INT8 = "INT8"; public static final String UINT8 = "UINT8"; public static final String INT16 = "INT16"; public static final String UINT16 = "UINT16"; public static final String INT32 = "INT32"; public static final String UINT32 = "UINT32"; public static final String INT64 = "INT64"; public static final String UINT64 = "UINT64"; public static final String INT128 = "INT128"; public static final String UINT128 = "UINT128"; /** * convert number type to string type * params type the number representing the data type * return the string representing the data type */ public static String getType(int type) { if (type == HDFConstants.DFNT_UCHAR8) { return HDFConstants.UCHAR8; } else if (type == HDFConstants.DFNT_CHAR8) { return HDFConstants.CHAR8; } else if (type == HDFConstants.DFNT_UCHAR16) { return HDFConstants.UCHAR16; } else if (type == HDFConstants.DFNT_CHAR16) { return HDFConstants.CHAR16; } else if (type == HDFConstants.DFNT_FLOAT32) { return HDFConstants.FLOAT32; } else if (type == HDFConstants.DFNT_FLOAT64) { return HDFConstants.FLOAT64; } else if (type == HDFConstants.DFNT_FLOAT128) { return HDFConstants.FLOAT128; } else if (type == HDFConstants.DFNT_INT8) { return HDFConstants.INT8; } else if (type == HDFConstants. DFNT_UINT8) { return HDFConstants.UINT8; } else if (type == HDFConstants.DFNT_INT16) { return HDFConstants.INT16; } else if (type == HDFConstants.DFNT_UINT16) { return HDFConstants.UINT16; } else if (type == HDFConstants.DFNT_INT32) { return HDFConstants.INT32; } else if (type == HDFConstants.DFNT_UINT32) { return HDFConstants.UINT32; } else if (type == HDFConstants.DFNT_INT64) { return HDFConstants.INT64; } else if (type == HDFConstants.DFNT_UINT64) { return HDFConstants.UINT64; } else if (type == HDFConstants.DFNT_INT128) { return HDFConstants.INT128; } else if (type == HDFConstants.DFNT_UINT128) { return HDFConstants.UINT128; } else { return "Undefined Data Type"; } } /** * convert string type to number type * params type the string representing the data type * return the integer representing the data type */ public static int getType(String type) { if (type.equalsIgnoreCase(HDFConstants.UCHAR8)) { return HDFConstants.DFNT_UCHAR8; } else if (type.equalsIgnoreCase(HDFConstants.CHAR8)) { return HDFConstants.DFNT_CHAR8; } else if (type.equalsIgnoreCase(HDFConstants.UCHAR16)) { return HDFConstants.DFNT_UCHAR16; } else if (type.equalsIgnoreCase(HDFConstants.CHAR16)) { return HDFConstants.DFNT_CHAR16; } else if (type.equalsIgnoreCase(HDFConstants.FLOAT32)) { return HDFConstants.DFNT_FLOAT32; } else if (type.equalsIgnoreCase(HDFConstants.FLOAT64)) { return HDFConstants.DFNT_FLOAT64; } else if (type.equalsIgnoreCase(HDFConstants.FLOAT128)) { return HDFConstants.DFNT_FLOAT128; } else if (type.equalsIgnoreCase(HDFConstants.INT8)) { return HDFConstants.DFNT_INT8; } else if (type.equalsIgnoreCase(HDFConstants. UINT8)) { return HDFConstants.DFNT_UINT8; } else if (type.equalsIgnoreCase(HDFConstants.INT16)) { return HDFConstants.DFNT_INT16; } else if (type.equalsIgnoreCase(HDFConstants.UINT16)) { return HDFConstants.DFNT_UINT16; } else if (type.equalsIgnoreCase(HDFConstants.INT32)) { return HDFConstants.DFNT_INT32; } else if (type.equalsIgnoreCase(HDFConstants.UINT32)) { return HDFConstants.DFNT_UINT32; } else if (type.equalsIgnoreCase(HDFConstants.INT64)) { return HDFConstants.DFNT_INT64; } else if (type.equalsIgnoreCase(HDFConstants.UINT64)) { return HDFConstants.DFNT_UINT64; } else if (type.equalsIgnoreCase(HDFConstants.INT128)) { return HDFConstants.DFNT_INT128; } else if (type.equalsIgnoreCase(HDFConstants.UINT128)) { return HDFConstants.DFNT_UINT128; } else { return -1; } } /** * gets the size of the data type in bytes, * e.g size of DFNT_FLOAT32 = 4 * * the size of the data type */ public static int getTypeSize(int type) { int size = 0; switch(type) { case HDFConstants.DFNT_UCHAR16: case HDFConstants.DFNT_CHAR16: case HDFConstants.DFNT_INT16: case HDFConstants.DFNT_UINT16: size = 2; break; case HDFConstants.DFNT_FLOAT32: case HDFConstants.DFNT_INT32: case HDFConstants.DFNT_UINT32: size = 4; break; case HDFConstants.DFNT_FLOAT64: case HDFConstants.DFNT_INT64: case HDFConstants.DFNT_UINT64: size = 8; break; case HDFConstants.DFNT_FLOAT128: case HDFConstants.DFNT_INT128: case HDFConstants.DFNT_UINT128: size = 16; break; default: size = 1; break; } return size; } } jhdf-2.9/ncsa/hdf/hdflib/Makefile.in0000644000175000017500000000347012050301061020133 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = ../../.. DIR = ncsa/hdf/hdflib SUBDIRS = NULL JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ JAVA_SRCS = \ HDFArray.java \ HDFChunkInfo.java \ HDFCompInfo.java \ HDFConstants.java \ HDFDeflateCompInfo.java \ HDFDeprecated.java \ HDFException.java \ HDFIMCOMPCompInfo.java \ HDFJPEGCompInfo.java \ HDFSZIPCompInfo.java \ HDFJavaException.java \ HDFLibrary.java \ HDFLibraryException.java \ HDFNBITChunkInfo.java \ HDFNBITCompInfo.java \ HDFNativeData.java \ HDFNewCompInfo.java \ HDFNotImplementedException.java \ HDFOldCompInfo.java \ HDFOldRLECompInfo.java \ HDFRLECompInfo.java \ HDFSKPHUFFCompInfo.java \ HDFTable.java include $(TOP)/config/Rules.mk jhdf-2.9/ncsa/hdf/hdflib/CMakeLists.txt0000644000175000017500000000315512050301061020626 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_NCSA_HDF_HDF4 Java) SET (CMAKE_VERBOSE_MAKEFILE 1) INCLUDE_DIRECTORIES ( ${HDFJAVA_NCSA_HDF_HDF4_SOURCE_DIR} ${HDFJAVA_NCSA_HDF_HDF4_BINARY_DIR} ) SET (HDFJAVA_NCSA_HDF_HDF4_SRCS HDFException.java HDFJavaException.java HDFArray.java HDFChunkInfo.java HDFCompInfo.java HDFConstants.java HDFDeflateCompInfo.java HDFDeprecated.java HDFIMCOMPCompInfo.java HDFJPEGCompInfo.java HDFLibrary.java HDFLibraryException.java HDFNativeData.java HDFNewCompInfo.java HDFNBITChunkInfo.java HDFNBITCompInfo.java HDFNotImplementedException.java HDFOldCompInfo.java HDFOldRLECompInfo.java HDFRLECompInfo.java HDFSKPHUFFCompInfo.java HDFSZIPCompInfo.java HDFTable.java ) SET (CMAKE_JNI_TARGET TRUE) SET (CMAKE_JAVA_TARGET_VERSION ${HDFJAVA_PACKAGE_VERSION}) FILE (WRITE ${PROJECT_BINARY_DIR}/Manifest.txt " " ) ADD_JAR (${HDFJAVA_NCSA_HDF_LIB_TARGET} ${PROJECT_BINARY_DIR}/Manifest.txt ${HDFJAVA_NCSA_HDF_HDF4_SRCS}) INSTALL_JAR (${HDFJAVA_NCSA_HDF_LIB_TARGET} ${HJAVA_INSTALL_LIB_DIR} libraries) IF (NOT WIN32) INSTALL_JNI_SYMLINK (${HDFJAVA_NCSA_HDF_LIB_TARGET} ${HJAVA_INSTALL_LIB_DIR} libraries) ENDIF (NOT WIN32) GET_TARGET_PROPERTY(${HDFJAVA_NCSA_HDF_LIB_TARGET}_JAR_FILE ${HDFJAVA_NCSA_HDF_LIB_TARGET} JAR_FILE) SET_GLOBAL_VARIABLE (HDFJAVA_JARS_TO_EXPORT "${HDFJAVA_JARS_TO_EXPORT};${${HDFJAVA_NCSA_HDF_LIB_TARGET}_JAR_FILE}") SET_GLOBAL_VARIABLE (HDFJAVA_HDF4_JARS ${${HDFJAVA_NCSA_HDF_LIB_TARGET}_JAR_FILE}) ADD_DEPENDENCIES (${HDFJAVA_NCSA_HDF_LIB_TARGET} ${HDFJAVA_JNI_HDF_LIB_TARGET}) jhdf-2.9/ncsa/hdf/hdflib/HDFIMCOMPCompInfo.java0000644000175000017500000000237512050301061021675 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a container for the parameters to the HDF * ``Image compression'' compression class. *

    * In this case, no auxilliary information is needed. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFIMCOMPCompInfo extends HDFOldCompInfo { public HDFIMCOMPCompInfo () { ctype = HDFConstants.COMP_IMCOMP; } } jhdf-2.9/ncsa/hdf/hdflib/HDFJPEGCompInfo.java0000644000175000017500000000356112050301061021434 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a container for the parameters to the HDF * JPEG compression class. *

    * In this case, the parameters are the quality and baseline. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFJPEGCompInfo extends HDFOldCompInfo { /* Struct to contain information about how to compress */ /* or decompress a JPEG encoded 24-bit image */ public int quality; /* Quality factor for JPEG compression, should be from */ /* 0 (terrible) to 100 (very good) */ public int force_baseline; /* If force_baseline is set to TRUE then */ /* quantization tables are limited to */ /* 0..255 for JPEG baseline compability */ /* This is only an issue for quality */ /* settings below 24 */ public HDFJPEGCompInfo() { ctype = HDFConstants.COMP_JPEG; } public HDFJPEGCompInfo(int qual, int fb) { ctype = HDFConstants.COMP_JPEG; quality = qual; force_baseline = fb; } } jhdf-2.9/ncsa/hdf/hdflib/HDFNBITChunkInfo.java0000644000175000017500000000326512050301061021616 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a container for the parameters to the HDF * NBIT compressed chunked class. *

    * In this case, the information is the start bit, len, sign extension * and fill. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFNBITChunkInfo extends HDFChunkInfo { public int[] chunk_lengths = new int[HDFConstants.MAX_VAR_DIMS]; public int start_bit = 0; public int bit_len = 0; public int sign_ext = 0; public int fill_one = 0; public HDFNBITChunkInfo() { ctype = HDFConstants.HDF_NBIT; }; public HDFNBITChunkInfo( int[] cl, int sb, int bl, int se, int fo) { ctype = HDFConstants.HDF_NBIT; chunk_lengths = cl; start_bit = sb; bit_len = bl; sign_ext = se; fill_one = fo; } } jhdf-2.9/ncsa/hdf/hdflib/HDFArray.java0000644000175000017500000010331112050301061020324 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** * This is a class for handling multidimensional arrays for * HDF. *

    * The purpose is to allow the storage and retrieval of * arbitrary array types containing scientific data. *

    * The methods support the conversion of an array to and * from Java to a one-dimensional array of bytes suitable * for I/O by the C library. *

    * This class heavily uses the HDFNativeData * class to convert between Java and C representations. */ public class HDFArray { private Object _theArray = null; private ArrayDescriptor _desc = null; private byte [] _barray = null; public HDFArray(Object anArray) throws HDFException { if (anArray == null) { HDFException ex = new HDFJavaException("HDFArray: array is null?: "); ex.printStackTrace(); } Class tc = anArray.getClass(); if (tc.isArray() == false) { /* exception: not an array */ HDFException ex = new HDFJavaException("HDFArray: not an array?: "); ex.printStackTrace(); throw(ex); } _theArray = anArray; _desc = new ArrayDescriptor( _theArray ); /* extra error checking -- probably not needed */ if (_desc == null ) { HDFException ex = new HDFJavaException("HDFArray: internal error: array description failed?: "); throw(ex); } } /** * allocate a one-dimensional array of bytes sufficient to store * the array. * @exception HDFException . */ public byte[] emptyBytes() throws HDFException { byte[] b = null; if ((ArrayDescriptor.dims == 1) && (ArrayDescriptor.NT == 'B')) { b = (byte [])_theArray; } else { b = new byte[ArrayDescriptor.totalSize]; } if (b == null) { System.out.println("Error: HDFArray can't allocate bytes for array"); HDFException ex = new HDFJavaException("HDFArray: emptyBytes: allocation failed"); throw(ex); } return (b); //return (new byte[ArrayDescriptor.totalSize]); } /** * Given a Java array of numbers, convert it to a one-dimensional * array of bytes in correct native order. * * @exception ncsa.hdf.hdflib.HDFException * thrown for errors: * object is not array: HDFJavaException */ public byte[] byteify() throws HDFException{ if (_barray != null) { return _barray; } if (_theArray == null) { /* exception: not an array */ HDFException ex = new HDFJavaException("HDFArray: byteify not an array?: "); throw(ex); } if (ArrayDescriptor.dims == 1) { /* special case */ if (ArrayDescriptor.NT == 'B') { /* really special case! */ _barray = (byte [])_theArray; return _barray; } else { try { _barray = new byte[ArrayDescriptor.totalSize]; byte [] therow; if (ArrayDescriptor.NT == 'I') { therow = ncsa.hdf.hdflib.HDFNativeData.intToByte(0,ArrayDescriptor.dimlen[1],(int [])_theArray); } else if (ArrayDescriptor.NT == 'S') { therow = ncsa.hdf.hdflib.HDFNativeData.shortToByte(0,ArrayDescriptor.dimlen[1],(short [])_theArray); } else if (ArrayDescriptor.NT == 'F') { therow = ncsa.hdf.hdflib.HDFNativeData.floatToByte(0,ArrayDescriptor.dimlen[1],(float [])_theArray); } else if (ArrayDescriptor.NT == 'J') { therow = ncsa.hdf.hdflib.HDFNativeData.longToByte(0,ArrayDescriptor.dimlen[1],(long [])_theArray); } else if (ArrayDescriptor.NT == 'D') { therow = ncsa.hdf.hdflib.HDFNativeData.doubleToByte(0,ArrayDescriptor.dimlen[1],(double [])_theArray); } else if (ArrayDescriptor.NT == 'L') { if (ArrayDescriptor.className.equals("java.lang.Byte")) { therow = ByteObjToByte((Byte[])_theArray); } else if (ArrayDescriptor.className.equals("java.lang.Integer")) { therow = IntegerToByte((Integer[])_theArray); } else if (ArrayDescriptor.className.equals("java.lang.Short")) { therow = ShortToByte((Short[])_theArray); } else if (ArrayDescriptor.className.equals("java.lang.Float")) { therow = FloatObjToByte((Float[])_theArray); } else if (ArrayDescriptor.className.equals("java.lang.Double")) { therow = DoubleObjToByte((Double[])_theArray); } else if (ArrayDescriptor.className.equals("java.lang.Long")) { therow = LongObjToByte((Long[])_theArray); } else { HDFJavaException ex = new HDFJavaException("HDFArray: unknown type of Object?"); throw(ex); } } else { HDFJavaException ex = new HDFJavaException("HDFArray: unknown type of Object?"); throw(ex); } System.arraycopy(therow,0,_barray,0,(ArrayDescriptor.dimlen[1] * ArrayDescriptor.NTsize)); return _barray; } catch (OutOfMemoryError err) { HDFException ex = new HDFJavaException("HDFArray: byteify array too big?"); ex.printStackTrace(); throw(ex); } } } try { _barray = new byte[ArrayDescriptor.totalSize]; } catch (OutOfMemoryError err) { HDFException ex = new HDFJavaException("HDFArray: byteify array too big?"); ex.printStackTrace(); throw(ex); } Object oo = _theArray; int n = 0; /* the current byte */ int index = 0; int i; while ( n < ArrayDescriptor.totalSize ) { oo = ArrayDescriptor.objs[0]; index = n / ArrayDescriptor.bytetoindex[0]; index %= ArrayDescriptor.dimlen[0]; for (i = 0 ; i < (ArrayDescriptor.dims); i++) { index = n / ArrayDescriptor.bytetoindex[i]; index %= ArrayDescriptor.dimlen[i]; if (index == ArrayDescriptor.currentindex[i]) { /* then use cached copy */ oo = ArrayDescriptor.objs[i]; } else { /* check range of index */ if (index > (ArrayDescriptor.dimlen[i] - 1)) { System.out.println("out of bounds?"); return null; } oo = java.lang.reflect.Array.get(oo,index); ArrayDescriptor.currentindex[i] = index; ArrayDescriptor.objs[i] = oo; } } /* byte-ify */ byte arow[]; try { if (ArrayDescriptor.NT == 'J') { arow = ncsa.hdf.hdflib.HDFNativeData.longToByte(0,ArrayDescriptor.dimlen[ArrayDescriptor.dims],(long [])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); arow = ncsa.hdf.hdflib.HDFNativeData.longToByte(0,ArrayDescriptor.dimlen[ArrayDescriptor.dims],(long [])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'I') { arow = ncsa.hdf.hdflib.HDFNativeData.intToByte(0,ArrayDescriptor.dimlen[ArrayDescriptor.dims],(int [])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'S') { arow = ncsa.hdf.hdflib.HDFNativeData.shortToByte(0,ArrayDescriptor.dimlen[ArrayDescriptor.dims],(short [])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'B') { arow = (byte [])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]; } else if (ArrayDescriptor.NT == 'F') { /* 32 bit float */ arow = ncsa.hdf.hdflib.HDFNativeData.floatToByte(0,ArrayDescriptor.dimlen[ArrayDescriptor.dims],(float [])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'D') { /* 64 bit float */ arow = ncsa.hdf.hdflib.HDFNativeData.doubleToByte(0,ArrayDescriptor.dimlen[ArrayDescriptor.dims],(double [])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.NT == 'L') { if (ArrayDescriptor.className.equals("java.lang.Byte")) { arow = ByteObjToByte((Byte[])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className.equals("java.lang.Integer")) { arow = IntegerToByte((Integer[])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className.equals("java.lang.Short")) { arow = ShortToByte((Short[])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className.equals("java.lang.Float")) { arow = FloatObjToByte((Float[])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className.equals("java.lang.Double")) { arow = DoubleObjToByte((Double[])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else if (ArrayDescriptor.className.equals("java.lang.Long")) { arow = LongObjToByte((Long[])ArrayDescriptor.objs[ArrayDescriptor.dims - 1]); } else { HDFJavaException ex = new HDFJavaException("HDFArray: byteify Object type not implemented?"); throw(ex); } } else { HDFJavaException ex = new HDFJavaException("HDFArray: byteify Object type not implemented?"); throw(ex); } System.arraycopy(arow,0,_barray,n,(ArrayDescriptor.dimlen[ArrayDescriptor.dims] * ArrayDescriptor.NTsize)); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; } catch (OutOfMemoryError err) { HDFException ex = new HDFJavaException("HDFArray: byteify array too big?"); ex.printStackTrace(); throw(ex); } } /* assert: the whole array is completed--currentindex should == len - 1 */ /* error checks */ if (n < ArrayDescriptor.totalSize) { throw new java.lang.InternalError( new String("HDFArray:::byteify: Panic didn't complete all input data: n= "+n+" size = "+ArrayDescriptor.totalSize)); } for (i = 0;i < ArrayDescriptor.dims; i++) { if (ArrayDescriptor.currentindex[i] != ArrayDescriptor.dimlen[i] - 1) { throw new java.lang.InternalError( new String("Panic didn't complete all data: currentindex["+i+"] = "+ArrayDescriptor.currentindex[i]+" (should be "+(ArrayDescriptor.dimlen[i] - 1)+" ?)")); } } return _barray; } /** * Given a one-dimensional array of numbers, convert it to a java * array of the shape and size passed to the constructor. * * @exception ncsa.hdf.hdflib.HDFException * thrown for errors: * object not an array: HDFJavaException */ public Object arrayify(byte[] bytes) throws HDFException { if (_theArray == null) { /* exception: not an array */ HDFException ex = new HDFJavaException("arrayify: not an array?: "); throw(ex); } if (java.lang.reflect.Array.getLength(bytes) != ArrayDescriptor.totalSize) { /* exception: array not right size */ HDFException ex = new HDFJavaException("arrayify: array is wrong size?: "); } _barray = bytes; /* hope that the bytes are correct.... */ if (ArrayDescriptor.dims == 1) { /* special case */ /* 2 data copies here! */ try { if (ArrayDescriptor.NT == 'I') { int [] x = ncsa.hdf.hdflib.HDFNativeData.byteToInt(_barray); System.arraycopy(x,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'S') { short [] x = ncsa.hdf.hdflib.HDFNativeData.byteToShort(_barray); System.arraycopy(x,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'F') { float x[] = ncsa.hdf.hdflib.HDFNativeData.byteToFloat(_barray); System.arraycopy(x,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'J') { long x[] = ncsa.hdf.hdflib.HDFNativeData.byteToLong(_barray); System.arraycopy(x,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'D') { double x[] = ncsa.hdf.hdflib.HDFNativeData.byteToDouble(_barray); System.arraycopy(x,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'B') { System.arraycopy(_barray,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.NT == 'L') { if (ArrayDescriptor.className.equals("java.lang.Byte")) { Byte I[] = ByteToByteObj(_barray); System.arraycopy(I,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className.equals("java.lang.Integer")) { Integer I[] = ByteToInteger(_barray); System.arraycopy(I,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className.equals("java.lang.Short")) { Short I[] = ByteToShort(_barray); System.arraycopy(I,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className.equals("java.lang.Float")) { Float I[] = ByteToFloatObj(_barray); System.arraycopy(I,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className.equals("java.lang.Double")) { Double I[] = ByteToDoubleObj(_barray); System.arraycopy(I,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else if (ArrayDescriptor.className.equals("java.lang.Long")) { Long I[] = ByteToLongObj(_barray); System.arraycopy(I,0,_theArray,0,ArrayDescriptor.dimlen[1]); return _theArray; } else { HDFJavaException ex = new HDFJavaException("arrayify: Object type not implemented yet..."); throw(ex); } } else { HDFJavaException ex = new HDFJavaException("arrayify: Object type not implemented yet..."); throw(ex); } } catch (OutOfMemoryError err) { HDFException ex = new HDFJavaException("HDFArray: arrayify array too big?"); ex.printStackTrace(); throw(ex); } } /* Assert dims >= 2 */ Object oo = _theArray; int n = 0; /* the current byte */ int index = 0; int i; while ( n < ArrayDescriptor.totalSize ) { oo = ArrayDescriptor.objs[0]; index = n / ArrayDescriptor.bytetoindex[0]; index %= ArrayDescriptor.dimlen[0]; for (i = 0 ; i < (ArrayDescriptor.dims); i++) { index = n / ArrayDescriptor.bytetoindex[i]; index %= ArrayDescriptor.dimlen[i]; if (index == ArrayDescriptor.currentindex[i]) { /* then use cached copy */ oo = ArrayDescriptor.objs[i]; } else { /* check range of index */ if (index > (ArrayDescriptor.dimlen[i] - 1)) { System.out.println("out of bounds?"); return null; } oo = java.lang.reflect.Array.get((Object) oo,index); ArrayDescriptor.currentindex[i] = index; ArrayDescriptor.objs[i] = oo; } } /* array-ify */ try { if (ArrayDescriptor.NT == 'J') { long [] arow = ncsa.hdf.hdflib.HDFNativeData.byteToLong(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'I') { int [] arow = ncsa.hdf.hdflib.HDFNativeData.byteToInt(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'S') { short [] arow = ncsa.hdf.hdflib.HDFNativeData.byteToShort(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'B') { System.arraycopy( _barray, n, ArrayDescriptor.objs[ArrayDescriptor.dims - 1], 0, ArrayDescriptor.dimlen[ArrayDescriptor.dims]); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; } else if (ArrayDescriptor.NT == 'F') { float arow[] = ncsa.hdf.hdflib.HDFNativeData.byteToFloat(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'D') { double [] arow = ncsa.hdf.hdflib.HDFNativeData.byteToDouble(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)arow); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.NT == 'L') { if (ArrayDescriptor.className.equals("java.lang.Byte")) { Byte I[] = ByteToByteObj(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className.equals("java.lang.Integer")) { Integer I[] = ByteToInteger(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className.equals("java.lang.Short")) { Short I[] = ByteToShort(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className.equals("java.lang.Float")) { Float I[] = ByteToFloatObj(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className.equals("java.lang.Double")) { Double I[] = ByteToDoubleObj(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else if (ArrayDescriptor.className.equals("java.lang.Long")) { Long I[] = ByteToLongObj(n,ArrayDescriptor.dimlen[ArrayDescriptor.dims],_barray); java.lang.reflect.Array.set(ArrayDescriptor.objs[ArrayDescriptor.dims - 2] , (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]), (Object)I); n += ArrayDescriptor.bytetoindex[ArrayDescriptor.dims - 1]; ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1]++; } else { HDFJavaException ex = new HDFJavaException("HDFArray: unsupported Object type: "+ArrayDescriptor.NT); throw(ex); } } else { HDFJavaException ex = new HDFJavaException("HDFArray: unsupported Object type: "+ArrayDescriptor.NT); throw(ex); } } catch (OutOfMemoryError err) { HDFException ex = (HDFException)new HDFJavaException("HDFArray: arrayify array too big?"); ex.printStackTrace(); throw(ex); } } /* assert: the whole array is completed--currentindex should == len - 1 */ /* error checks */ if (n < ArrayDescriptor.totalSize) { throw new java.lang.InternalError( new String("HDFArray::arrayify Panic didn't complete all input data: n= "+n+" size = "+ArrayDescriptor.totalSize)); } for (i = 0;i <= ArrayDescriptor.dims-2; i++) { if (ArrayDescriptor.currentindex[i] != ArrayDescriptor.dimlen[i] - 1) { throw new java.lang.InternalError( new String("HDFArray::arrayify Panic didn't complete all data: currentindex["+i+"] = "+ArrayDescriptor.currentindex[i]+" (should be "+(ArrayDescriptor.dimlen[i] - 1)+"?")); } } if (ArrayDescriptor.NT != 'B') { if (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1] != ArrayDescriptor.dimlen[ArrayDescriptor.dims - 1]) { throw new java.lang.InternalError( new String("HDFArray::arrayify Panic didn't complete all data: currentindex["+i+"] = "+ArrayDescriptor.currentindex[i]+" (should be "+(ArrayDescriptor.dimlen[i])+"?")); } } else { if (ArrayDescriptor.currentindex[ArrayDescriptor.dims - 1] != (ArrayDescriptor.dimlen[ArrayDescriptor.dims - 1] - 1)) { throw new java.lang.InternalError( new String("HDFArray::arrayify Panic didn't complete all data: currentindex["+i+"] = "+ArrayDescriptor.currentindex[i]+" (should be "+(ArrayDescriptor.dimlen[i] - 1)+"?")); } } return _theArray; } private byte[] IntegerToByte( Integer in[] ) { int nelems = java.lang.reflect.Array.getLength((Object)in); int[] out = new int[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].intValue(); } return HDFNativeData.intToByte(0,nelems,out); } private Integer[] ByteToInteger( byte[] bin ) { int in[] = (int [])HDFNativeData.byteToInt(bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Integer[] out = new Integer[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Integer(in[i]); } return out; } private Integer[] ByteToInteger( int start, int len, byte[] bin ) { int in[] = (int [])HDFNativeData.byteToInt(start,len,bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Integer[] out = new Integer[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Integer(in[i]); } return out; } private byte[] ShortToByte( Short in[] ) { int nelems = java.lang.reflect.Array.getLength((Object)in); short[] out = new short[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].shortValue(); } return HDFNativeData.shortToByte(0,nelems,out); } private Short[] ByteToShort( byte[] bin ) { short in[] = (short [])HDFNativeData.byteToShort(bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Short[] out = new Short[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Short(in[i]); } return out; } private Short[] ByteToShort( int start, int len, byte[] bin ) { short in[] = (short [])HDFNativeData.byteToShort(start,len,bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Short[] out = new Short[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Short(in[i]); } return out; } private byte[] ByteObjToByte( Byte in[] ) { int nelems = java.lang.reflect.Array.getLength((Object)in); byte[] out = new byte[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].byteValue(); } return out; } private Byte[] ByteToByteObj( byte[] bin ) { int nelems = java.lang.reflect.Array.getLength((Object)bin); Byte[] out = new Byte[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Byte(bin[i]); } return out; } private Byte[] ByteToByteObj( int start, int len, byte[] bin ) { Byte[] out = new Byte[len]; for (int i = 0; i < len; i++) { out[i] = new Byte(bin[i]); } return out; } private byte[] FloatObjToByte( Float in[] ) { int nelems = java.lang.reflect.Array.getLength((Object)in); float[] out = new float[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].floatValue(); } return HDFNativeData.floatToByte(0,nelems,out); } private Float[] ByteToFloatObj( byte[] bin ) { float in[] = (float [])HDFNativeData.byteToFloat(bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Float[] out = new Float[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Float(in[i]); } return out; } private Float[] ByteToFloatObj( int start, int len, byte[] bin ) { float in[] = (float [])HDFNativeData.byteToFloat(start,len,bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Float[] out = new Float[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Float(in[i]); } return out; } private byte[] DoubleObjToByte( Double in[] ) { int nelems = java.lang.reflect.Array.getLength((Object)in); double[] out = new double[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].doubleValue(); } return HDFNativeData.doubleToByte(0,nelems,out); } private Double[] ByteToDoubleObj( byte[] bin ) { double in[] = (double [])HDFNativeData.byteToDouble(bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Double[] out = new Double[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Double(in[i]); } return out; } private Double[] ByteToDoubleObj( int start, int len, byte[] bin ) { double in[] = (double [])HDFNativeData.byteToDouble(start,len,bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Double[] out = new Double[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Double(in[i]); } return out; } private byte[] LongObjToByte( Long in[] ) { int nelems = java.lang.reflect.Array.getLength((Object)in); long[] out = new long[nelems]; for (int i = 0; i < nelems; i++) { out[i] = in[i].longValue(); } return HDFNativeData.longToByte(0,nelems,out); } private Long[] ByteToLongObj( byte[] bin ) { long in[] = (long [])HDFNativeData.byteToLong(bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Long[] out = new Long[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Long(in[i]); } return out; } private Long[] ByteToLongObj( int start, int len, byte[] bin ) { long in[] = (long [])HDFNativeData.byteToLong(start,len,bin); int nelems = java.lang.reflect.Array.getLength((Object)in); Long[] out = new Long[nelems]; for (int i = 0; i < nelems; i++) { out[i] = new Long(in[i]); } return out; } } /** * This class is used by HDFArray to discover the shape and type of an * arbitrary array. */ class ArrayDescriptor { static String theType = ""; static Class theClass = null; static int [] dimlen = null; static int [] dimstart = null; static int [] currentindex = null; static int [] bytetoindex = null; static int totalSize = 0; static Object [] objs = null; static char NT = ' '; /* must be B,S,I,L,F,D, else error */ static int NTsize = 0; static int dims = 0; static String className; public ArrayDescriptor ( Object anArray ) throws HDFException { Class tc = anArray.getClass(); if (tc.isArray() == false) { /* exception: not an array */ HDFException ex = (HDFException)new HDFJavaException("ArrayDescriptor: not an array?: "); throw(ex); } theClass = tc; /* parse the type descriptor to discover the shape of the array */ String ss = tc.toString(); theType = ss; int n = 6; dims = 0; char c = ' '; while (n < ss.length()) { c = ss.charAt(n); n++; if (c == '[') { dims++; } } String css = ss.substring(ss.lastIndexOf('[')+1); Class compC = tc.getComponentType(); String cs = compC.toString(); NT = c; if (NT == 'B') { NTsize = 1; } else if (NT == 'S') { NTsize = 2; } else if ((NT == 'I') || (NT == 'F')) { NTsize = 4; } else if ((NT == 'J') || (NT == 'D')){ NTsize = 8; } else if (css.startsWith("Ljava.lang.Byte")) { NT='L'; className = "java.lang.Byte"; NTsize = 1; } else if (css.startsWith("Ljava.lang.Short")) { NT='L'; className = "java.lang.Short"; NTsize = 2; } else if (css.startsWith("Ljava.lang.Integer")) { NT='L'; className = "java.lang.Integer"; NTsize = 4; } else if (css.startsWith("Ljava.lang.Float")) { NT='L'; className = "java.lang.Float"; NTsize = 4; } else if (css.startsWith("Ljava.lang.Double")) { NT='L'; className = "java.lang.Double"; NTsize = 8; } else if (css.startsWith("Ljava.lang.Long")) { NT='L'; className = "java.lang.Long"; NTsize = 8; } else if (css.startsWith("Ljava.lang.String")) { throw new HDFJavaException(new String("ArrayDesciptor: Error: String array not supported yet")); } else { /* exception: not a numeric type */ throw new HDFJavaException(new String("Error: array is not numeric? (type is "+css+")")); } /* fill in the table */ dimlen = new int [dims+1]; dimstart = new int [dims+1]; currentindex = new int [dims+1]; bytetoindex = new int [dims+1]; objs = new Object [dims+1]; Object o = anArray; objs[0] = o; dimlen[0]= 1; dimstart[0] = 0; currentindex[0] = 0; int i; for ( i = 1; i <= dims; i++) { dimlen[i]= java.lang.reflect.Array.getLength((Object) o); o = java.lang.reflect.Array.get((Object) o,0); objs [i] = o; dimstart[i] = 0; currentindex[i] = 0; } int j; int dd; bytetoindex[dims] = NTsize; for ( i = dims; i >= 0; i--) { dd = NTsize; for (j = i; j < dims; j++) { dd *= dimlen[j + 1]; } bytetoindex[i] = dd; } totalSize = bytetoindex[0]; } public void dumpInfo() { System.out.println("Type: "+theType); System.out.println("Class: "+theClass); System.out.println("NT: "+NT+" NTsize: "+NTsize); System.out.println("Array has "+dims+" dimensions ("+totalSize+" bytes)"); int i; for (i = 0; i <= dims; i++) { Class tc = objs[i].getClass(); String ss = tc.toString(); System.out.println(i+": start "+dimstart[i]+": len "+dimlen[i]+" current "+currentindex[i]+" bytetoindex "+bytetoindex[i]+" object "+objs[i]+" otype "+ss); } } } jhdf-2.9/ncsa/hdf/hdflib/HDFOldRLECompInfo.java0000644000175000017500000000242212050301061021763 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a generic container for the parameters to the HDF * RLE compressed classes, with the ``old'' type encoding. *

    * In this case, there is no auxilliary information. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFOldRLECompInfo extends HDFOldCompInfo { public HDFOldRLECompInfo () { ctype = HDFConstants.COMP_RLE; } } jhdf-2.9/ncsa/hdf/hdflib/HDFDeprecated.java0000644000175000017500000005536612050301061021326 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; import java.io.OutputStream; public class HDFDeprecated extends HDFLibrary { static { String v = HDFLibrary.getJHIVersion(); } public final static String H45PATH_PROPERTY_KEY = "ncsa.hdf.libh4toh5.h4toh5.h45lib"; public final static String HDFPATH_PROPERTY_KEY = "ncsa.hdf.hdflib.HDFLibrary.hdflib"; static { // force load of native methods. HDFLibrary.getJHIVersion(); } public HDFDeprecated() { } public static native boolean DFANaddfds(int file_id, String description, int desc_len) throws HDFException; public static native boolean DFANaddfid(int file_id, String label) throws HDFException; public static native boolean DFANclear( ) throws HDFException; public static native boolean DFANgetdesc(String filename, short tag, short ref, String[] desc_buf, int buf_len) throws HDFException; public static native int DFANgetdesclen(String filename, short tag, short ref) throws HDFException; public static native int DFANgetfds(int file_id, String[] desc_buf, int buf_len, int isfirst) throws HDFException; public int DFANgetfds(int file_id, String[] desc_buf, int buf_len, boolean isfirst) throws HDFException{ if (isfirst) { return DFANgetfds(file_id, desc_buf, buf_len, 1); } else { return DFANgetfds(file_id, desc_buf, buf_len, 0); } } public static native int DFANgetfdslen(int file_id, int isfirst) throws HDFException; public int DFANgetfdslen(int file_id, boolean isfirst) throws HDFException{ if (isfirst) { return DFANgetfdslen(file_id, 1); } else { return DFANgetfdslen(file_id, 0); } } public static native int DFANgetfid(int file_id, String[] desc_buf, int buf_len, int isfirst) throws HDFException; public int DFANgetfid(int file_id, String[] desc_buf, int buf_len, boolean isfirst) throws HDFException{ if (isfirst) { return DFANgetfid(file_id, desc_buf, buf_len, 1); } else { return DFANgetfid(file_id, desc_buf, buf_len, 0); } } public static native int DFANgetfidlen(int file_id, int isfirst) throws HDFException; public int DFANgetfidlen(int file_id, boolean isfirst) throws HDFException { if (isfirst) { return DFANgetfidlen(file_id, 1); } else { return DFANgetfidlen(file_id, 0); } } public static native boolean DFANgetlabel(String filename, short tag, short ref, String[] label_buf, int buf_len) throws HDFException; public static native int DFANgetlablen(String filename, short tag, short ref) throws HDFException; public static native int DFANlablist(String filename, short tag, short[] ref_list, String[] label_list, int list_len, int label_len, int start_pos) throws HDFException; public static native short DFANlastref( ) throws HDFException; public static native boolean DFANputdesc(String filename, short tag, short ref, String description, int desc_len) throws HDFException; public static native boolean DFANputlabel(String filename, short tag, short ref, String label) throws HDFException; public static native boolean DFSDadddata(String filename, int rank, int[] dimsizes, byte[] data) throws HDFException; public boolean DFSDadddata(String filename, int rank, int[] dimsizes, Object theData) throws HDFException{ byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return DFSDadddata(filename, rank, dimsizes, data); } public static native boolean DFSDclear( ) throws HDFException; public static native boolean DFSDendslab( ) throws HDFException; public static native boolean DFSDendslice( ) throws HDFException; public static native boolean DFSDgetcal(double[] calInfo) throws HDFException; public static native boolean DFSDgetdata(String filename, int[] rank, int[] dimsizes, byte[] data) throws HDFException; public boolean DFSDgetdata(String filename, int[] rank, int[] dimsizes, Object theData) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = DFSDgetdata(filename, rank, dimsizes, data); theData = theArray.arrayify( data ); return rval; } public static native boolean DFSDgetdatalen(int[] info) throws HDFException; public static native boolean DFSDgetdatastrs(String[] datastrs) throws HDFException; public static native boolean DFSDgetdimlen(int dim, int[] label_len) throws HDFException; public static native boolean DFSDgetdims(String filename, int[] rank, int[] dimsizes, int maxrank) throws HDFException; public static native boolean DFSDgetdimscale(int dim, int size, byte[] scale) throws HDFException; public boolean DFSDgetdimscale(int dim, int size, Object theScale) throws HDFException{ byte[] scale; boolean rval; HDFArray theArray = new HDFArray(theScale); scale = theArray.emptyBytes(); rval = DFSDgetdimscale(dim, size, scale); theScale = theArray.arrayify( scale ); return rval; } public static native boolean DFSDgetdimstrs(int dim, String[] dimstrs) throws HDFException; public static native boolean DFSDgetfillvalue(byte[] fill_value) throws HDFException; public boolean DFSDgetfillvalue( Object [] theFillValue) throws HDFException { int NT; int[] nt = new int[1]; DFSDgetNT(nt); NT = nt[0]; if ((NT & HDFConstants.DFNT_LITEND) != 0) { NT -= HDFConstants.DFNT_LITEND; } byte[] d1 = new byte[8]; boolean rval; rval = DFSDgetfillvalue( d1 ); if (rval == false) { return (rval); } if ((NT == HDFConstants.DFNT_INT8 ) || (NT == HDFConstants.DFNT_CHAR8 ) || (NT == HDFConstants.DFNT_CHAR ) ) { theFillValue[0] = new Byte(d1[0]); } else if ((NT == HDFConstants.DFNT_UINT8 ) || (NT == HDFConstants.DFNT_UCHAR8 ) || (NT == HDFConstants.DFNT_UCHAR8 ) ) { Byte f = new Byte(d1[0]); if (f.shortValue() < 0) { theFillValue[0] = new Short((short)(f.intValue() + 256)); } else { theFillValue[0] = new Short(f.shortValue()); } } else if ((NT == HDFConstants.DFNT_INT16 ) || (NT == HDFConstants.DFNT_CHAR16 ) ) { short [] fx = HDFNativeData.byteToShort(0,1,d1); theFillValue[0] = new Short(fx[0]); } else if ( (NT == HDFConstants.DFNT_UINT16 ) || (NT == HDFConstants.DFNT_UCHAR16 ) ) { short[] fmx = HDFNativeData.byteToShort(0,1,d1); Short f = new Short(fmx[0]); if (f.intValue() < 0) { theFillValue[0] = new Integer(f.intValue() + 65536); } else { theFillValue[0] = new Integer(f.intValue()); } } else if ((NT == HDFConstants.DFNT_INT32 ) ) { int [] fx = HDFNativeData.byteToInt(0,1,d1); theFillValue[0] = new Integer(fx[0]); } else if ((NT == HDFConstants.DFNT_UINT32 ) ) { int[] fmx = HDFNativeData.byteToInt(0,1,d1); Integer i = new Integer(fmx[0]); if (i.floatValue() < 0) { theFillValue[0] = new Float((float)(i.floatValue() + 4294967296.0)); } else { theFillValue[0] = new Float(i.floatValue()); } } else if (NT == HDFConstants.DFNT_FLOAT32 ) { float [] fx = HDFNativeData.byteToFloat(0,1,d1); theFillValue[0] = new Float(fx[0]); } else if (NT == HDFConstants.DFNT_FLOAT64 ) { double [] fx = HDFNativeData.byteToDouble(0,1,d1); theFillValue[0] = new Double(fx[0]); } else { System.out.println("Error: DFSDgetfillvalue not converting, type "+NT); } return rval; } public static native boolean DFSDgetNT(int[] data_type) throws HDFException; public static native boolean DFSDgetrange(byte[] max, byte[] min) throws HDFException; public boolean DFSDgetrange( double maxmin[]) throws HDFException { int NT; int[] nt = new int[1]; DFSDgetNT(nt); NT = nt[0]; if ((NT & HDFConstants.DFNT_LITEND) != 0) { NT -= HDFConstants.DFNT_LITEND; } byte[] d1 = new byte[8]; byte[] d2 = new byte[8]; boolean rval; rval = DFSDgetrange( d1, d2); if (rval == false) { return(rval); } if ((NT == HDFConstants.DFNT_INT8 ) || (NT == HDFConstants.DFNT_CHAR8 ) || (NT == HDFConstants.DFNT_CHAR ) ) { Byte f = new Byte(d1[0]); maxmin[0] = (f.doubleValue()); f = new Byte(d2[0]); maxmin[1] = (f.doubleValue()); } else if ((NT == HDFConstants.DFNT_UINT8 ) || (NT == HDFConstants.DFNT_UCHAR8 ) || (NT == HDFConstants.DFNT_UCHAR8 ) ) { Byte f = new Byte(d1[0]); Short fmx; if (f.shortValue() < 0) { fmx = new Short((short)(f.intValue() + 256)); } else { fmx = new Short(f.shortValue()); } maxmin[0] = (fmx.doubleValue()); f = new Byte(d2[0]); fmx = new Short(f.shortValue()); maxmin[1] = (fmx.doubleValue()); } else if ((NT == HDFConstants.DFNT_INT16 ) || (NT == HDFConstants.DFNT_CHAR16 ) ) { short [] fmx = HDFNativeData.byteToShort(0,1,d1); short [] fmn = HDFNativeData.byteToShort(0,1,d2); Short f = new Short(fmx[0]); maxmin[0] = (f.doubleValue()); f = new Short(fmn[0]); maxmin[1] = (f.doubleValue()); } else if ((NT == HDFConstants.DFNT_UINT16 ) || (NT == HDFConstants.DFNT_UINT16 ) ) { short[] fmx = HDFNativeData.byteToShort(0,1,d1); Short f = new Short(fmx[0]); Integer i; if (f.intValue() < 0) { i = new Integer(f.intValue() + 65536); } else { i = new Integer(f.intValue()); } maxmin[0] = (i.doubleValue()); fmx = HDFNativeData.byteToShort(0,1,d2); f = new Short(fmx[0]); if (f.intValue() < 0) { i = new Integer(f.intValue() + 65536); } else { i = new Integer(f.intValue()); } maxmin[0] = (i.doubleValue()); fmx = HDFNativeData.byteToShort(0,1,d2); f = new Short(fmx[0]); if (f.intValue() < 0) { i = new Integer(f.intValue() + 65536); } else { i = new Integer(f.intValue()); } maxmin[1] = (i.doubleValue()); } else if ((NT == HDFConstants.DFNT_INT32 ) ) { int [] fmx = HDFNativeData.byteToInt(0,1,d1); int [] fmn = HDFNativeData.byteToInt(0,1,d2); Integer f = new Integer(fmx[0]); maxmin[0] = (f.doubleValue()); f = new Integer(fmn[0]); maxmin[1] = (f.doubleValue()); } else if ( (NT == HDFConstants.DFNT_UINT32 )) { int[] fmx = HDFNativeData.byteToInt(0,1,d1); Integer i = new Integer(fmx[0]); Float f; if (i.floatValue() < 0) { f = new Float((float)(i.floatValue() + 4294967296.0)); } else { f = new Float(i.floatValue()); } maxmin[0] = (f.doubleValue()); fmx = HDFNativeData.byteToInt(0,1,d1); i = new Integer(fmx[0]); if (i.floatValue() < 0) { f = new Float((float)(i.floatValue() + 4294967296.0)); } else { f = new Float(i.floatValue()); } maxmin[1] = (f.doubleValue()); } else if (NT == HDFConstants.DFNT_FLOAT32 ) { float [] fmx = HDFNativeData.byteToFloat(0,1,d1); float [] fmn = HDFNativeData.byteToFloat(0,1,d2); Float f = new Float(fmx[0]); maxmin[0] = (f.doubleValue()); f = new Float(fmn[0]); maxmin[1] = (f.doubleValue()); } else if (NT == HDFConstants.DFNT_FLOAT64 ) { double [] fmx = HDFNativeData.byteToDouble(0,1,d1); double [] fmn = HDFNativeData.byteToDouble(0,1,d2); Double f = new Double(fmx[0]); maxmin[0] = (f.doubleValue()); f = new Double(fmn[0]); maxmin[1] = (f.doubleValue()); } else { System.out.println("Error: DFSDgetrange not converting, type "+NT); } return rval; } public static native boolean DFSDgetslice(String filename, int [] winst, int [] windims, byte [] data, int [] dims) throws HDFException; public boolean DFSDgetslice(String filename, int [] winst, int [] windims, Object theData, int [] dims) throws HDFException{ byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = DFSDgetslice(filename, winst, windims, data, dims); theData = theArray.arrayify( data ); return rval; } public static native int DFSDlastref( ) throws HDFException; public static native int DFSDndatasets(String filename) throws HDFException; public boolean DFSDpre32sdg(String filename, short ref, boolean ispre32) throws HDFException { int []iv = new int[1]; boolean rval; rval = DFSDpre32sdg(filename, ref, iv); if (iv[0] == 0) { ispre32 = false; } else { ispre32 = true; } return rval; } public static native boolean DFSDpre32sdg(String filename, short ref, int[] ispre32) throws HDFException; public static native boolean DFSDputdata(String filename, int rank, int [] dimsizes, byte [] data) throws HDFException; public boolean DFSDputdata(String filename, int rank, int [] dimsizes, Object theData) throws HDFException{ byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return DFSDputdata(filename, rank, dimsizes, data); } public static native boolean DFSDputslice(int [] windims, byte [] source, int [] dims) throws HDFException; public boolean DFSDputslice(int [] windims, Object source, int [] dims) throws HDFException{ byte[] data; HDFArray theArray = new HDFArray(source); data = theArray.byteify(); return DFSDputslice(windims, data, dims); } public static native boolean DFSDreadref(String filename, short ref) throws HDFException; public static native boolean DFSDreadslab(String filename, int [] start, int [] slab_size, int [] stride, byte [] buffer, int [] buffer_size) throws HDFException; public boolean DFSDreadslab(String filename, int [] start, int [] slab_size, int [] stride, Object theData, int [] buffer_size) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return DFSDreadslab(filename, start, slab_size, stride, data, buffer_size); } public static native boolean DFSDrestart( ) throws HDFException; public static native boolean DFSDsetcal(double cal, double cal_err, double offset, double offset_err, int data_type) throws HDFException ; public static native boolean DFSDsetdatastrs(String label, String unit, String format, String coordsys) throws HDFException; public static native boolean DFSDsetdims (int rank, int [] dimsizes) throws HDFException; public static native boolean DFSDsetdimscale (int dim, int dimsize, byte[] scale) throws HDFException; public boolean DFSDsetdimscale (int dim, int dimsize, Object theScale) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theScale); data = theArray.byteify(); return DFSDsetdimscale (dim, dimsize, data); } public static native boolean DFSDsetdimstrs(int dim, String label, String unit, String format) throws HDFException; public static native boolean DFSDsetfillvalue(Object fill_value) throws HDFException; public static native boolean DFSDsetlengths(int label_len, int unit_len, int format_len, int coords_len) throws HDFException ; public static native boolean DFSDsetNT(int data_type) throws HDFException; public static native boolean DFSDsetrange( byte[] max, byte[] min) throws HDFException; public boolean DFSDsetrange( Object max, Object min) throws HDFException { byte[] d1 = null; byte[] d2 = null; Class mincl = min.getClass(); String mncn = mincl.getName(); Class nc = mincl.getSuperclass(); String s = nc.getName(); if ( s.equals("java.lang.Number") == false) { /* exception: bad argument */ return(false); } Class maxcl = max.getClass(); String mxcn = maxcl.getName(); nc = maxcl.getSuperclass(); s = nc.getName(); if ( s.equals("java.lang.Number") == false) { /* exception: bad argument */ return(false); } if (mncn.equals(mxcn) == false) { /* exception: argument don't agree */ return(false); } System.out.println("DFSDsetrange: min,max are sub-class of Number "); if (mncn.equals("java.lang.Integer")) { Integer fmx = (Integer)max; Integer fmn = (Integer)min; d1 = ncsa.hdf.hdflib.HDFNativeData.intToByte(fmx.intValue()); d2 = ncsa.hdf.hdflib.HDFNativeData.intToByte(fmn.intValue()); } else if (mncn.equals("java.lang.Float")) { Float fmx = (Float)max; Float fmn = (Float)min; d1 = ncsa.hdf.hdflib.HDFNativeData.floatToByte(fmx.floatValue()); d2 = ncsa.hdf.hdflib.HDFNativeData.floatToByte(fmn.floatValue()); } else if (mncn.equals("java.lang.Double")) { Double fmx = (Double)max; Double fmn = (Double)min; d1 = ncsa.hdf.hdflib.HDFNativeData.doubleToByte(fmx.doubleValue()); d2 = ncsa.hdf.hdflib.HDFNativeData.doubleToByte(fmn.doubleValue()); } else if (mncn.equals("java.lang.Short")) { Short fmx = (Short)max; Short fmn = (Short)min; d1 = ncsa.hdf.hdflib.HDFNativeData.shortToByte(fmx.shortValue()); d2 = ncsa.hdf.hdflib.HDFNativeData.shortToByte(fmn.shortValue()); } else if (mncn.equals("java.lang.Byte")) { Byte fmx = (Byte)max; Byte fmn = (Byte)min; d1 = ncsa.hdf.hdflib.HDFNativeData.byteToByte(fmx.byteValue()); d2 = ncsa.hdf.hdflib.HDFNativeData.byteToByte(fmn.byteValue()); } else { /* exception: unsupported type */ return(false); } return DFSDsetrange( d1, d2); } public static native boolean DFSDstartslab(String filename) throws HDFException; public static native boolean DFSDstartslice(String filename) throws HDFException; public static native boolean DFSDwriteref(String filename, short ref) throws HDFException; public static native boolean DFSDwriteslab(int [] start, int [] stride, int[] count, byte[] data) throws HDFException; public boolean DFSDwriteslab(int [] start, int [] stride, int[] count, Object theData) throws HDFException{ byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return DFSDwriteslab(start, stride, count, data); } public static native boolean DFUfptoimage(int hdim, int vdim, float max, float min, float[] hscale, float[] vscale, float[] data, byte[] palette, String outfile, int ct_method, int hres, int vres, int compress) throws HDFException; public static native boolean Vclose(int file_id) throws HDFException; public static native int Vopen(String filename, int access, short ndds) throws HDFException; public static native void VSdump(int vkey) throws HDFException; /* not implemented */ //VOID VSfpack(int32 vdata_id, intn action, char //*fields_in_buf, VOIDP buf, intn buf_size, intn //n_records, char *fields, VOIDP bufptrs[]) public static native void HEprint(OutputStream stream, int level) throws HDFException; /* not implemented */ } jhdf-2.9/ncsa/hdf/hdflib/HDFSZIPCompInfo.java0000644000175000017500000000354012050301061021471 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a container for the parameters to the HDF * SZIP compression algorithm. *

    * In this case, the only parameter is the ``level'' of deflation. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFSZIPCompInfo extends HDFNewCompInfo { public int bits_per_pixel; public int options_mask; public int pixels; public int pixels_per_block; public int pixels_per_scanline; public HDFSZIPCompInfo() { ctype = HDFConstants.COMP_CODE_SZIP; } public HDFSZIPCompInfo( int bits_per_pixel_in, int options_mask_in, int pixels_in, int pixels_per_block_in, int pixels_per_scanline_in) { ctype = HDFConstants.COMP_CODE_SZIP; bits_per_pixel = bits_per_pixel_in; options_mask = options_mask_in; pixels = pixels_in; pixels_per_block = pixels_per_block_in; pixels_per_scanline = pixels_per_scanline_in; } } jhdf-2.9/ncsa/hdf/hdflib/HDFChunkInfo.java0000644000175000017500000000343412050301061021137 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This is a generic class to represent the HDF chunk_info * union, which contains parameters for the different * chunking schemes. *

    * The variant parameters are expressed as sub-classes of this * class. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu * */ public class HDFChunkInfo { public int ctype; public int[] chunk_lengths = new int[HDFConstants.MAX_VAR_DIMS]; public int comp_type = HDFConstants.COMP_CODE_NONE; public HDFCompInfo cinfo = null; public HDFChunkInfo() { ctype = HDFConstants.HDF_NONE; } public HDFChunkInfo( int[] cl, int ct, HDFCompInfo ci ) { if (ct == HDFConstants.COMP_CODE_NONE) { ctype = HDFConstants.HDF_CHUNK; } else { ctype = HDFConstants.HDF_COMP | HDFConstants.HDF_CHUNK; } chunk_lengths = cl; comp_type = ct; cinfo = ci; } public HDFChunkInfo(int[] cl) { ctype = HDFConstants.HDF_CHUNK; chunk_lengths = cl; } } jhdf-2.9/ncsa/hdf/hdflib/HDFNativeData.java0000644000175000017500000001513512050301061021274 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; public class HDFNativeData { public HDFNativeData() {} public static native int[] byteToInt( byte[] data ); public static native float[] byteToFloat( byte[] data ); public static native short[] byteToShort( byte[] data ); public static native long[] byteToLong( byte[] data ); public static native double[] byteToDouble( byte[] data ); public static native int[] byteToInt( int start, int len, byte[] data ); public static int byteToInt( byte[] data, int start) { int []ival = new int[1]; ival = byteToInt(start,1,data); return(ival[0]); } public static native short[] byteToShort( int start, int len, byte[] data ); public static short byteToShort( byte[] data, int start) { short []sval = new short[1]; sval = byteToShort(start,1,data); return(sval[0]); } public static native float[] byteToFloat( int start, int len, byte[] data ); public static float byteToFloat( byte[] data, int start) { float []fval = new float[1]; fval = byteToFloat(start,1,data); return(fval[0]); } public static native long[] byteToLong( int start, int len, byte[] data ); public static long byteToLong( byte[] data, int start) { long []lval = new long[1]; lval = byteToLong(start,1,data); return(lval[0]); } public static native double[] byteToDouble( int start, int len, byte[] data ); public static double byteToDouble( byte[] data, int start) { double []dval = new double[1]; dval = byteToDouble(start,1,data); return(dval[0]); } public static native byte[] intToByte( int start, int len, int[] data); public static native byte[] shortToByte( int start, int len, short[] data); public static native byte[] floatToByte( int start, int len, float[] data); public static native byte[] longToByte( int start, int len, long[] data); public static native byte[] doubleToByte( int start, int len, double[] data); public static native byte[] byteToByte( byte data); static byte[] byteToByte( Byte data){return byteToByte(data.byteValue());} public static native byte[] intToByte( int data); static byte[] intToByte( Integer data){return intToByte(data.intValue());} public static native byte[] shortToByte(short data); static byte[] shortToByte( Short data){return shortToByte(data.shortValue());} public static native byte[] floatToByte( float data); static byte[] floatToByte( Float data){return floatToByte(data.floatValue());}; public static native byte[] longToByte( long data); static byte[] longToByte(Long data){ return longToByte(data.longValue());} public static native byte[] doubleToByte( double data); static byte[] doubleToByte( Double data){return doubleToByte(data.doubleValue());} public Object byteToNumber( byte[] barray, Object obj) throws HDFException { Class theClass = obj.getClass(); String type = theClass.getName(); Object retobj = null; if (type.equals("java.lang.Integer")) { int[] i = ncsa.hdf.hdflib.HDFNativeData.byteToInt(0,1,barray); retobj = new Integer(i[0]); } else if (type.equals("java.lang.Byte")) { retobj = new Byte(barray[0]); } else if (type.equals("java.lang.Short")) { short[] f = ncsa.hdf.hdflib.HDFNativeData.byteToShort(0,1,barray); retobj = new Short(f[0]) ; } else if (type.equals("java.lang.Float")) { float[] f = ncsa.hdf.hdflib.HDFNativeData.byteToFloat(0,1,barray); retobj = new Float(f[0]) ; } else if (type.equals("java.lang.Long")) { long[] f = ncsa.hdf.hdflib.HDFNativeData.byteToLong(0,1,barray); retobj = new Long(f[0]) ; } else if (type.equals("java.lang.Double")) { double[] f = ncsa.hdf.hdflib.HDFNativeData.byteToDouble(0,1,barray); retobj = new Double(f[0] ); } else { /* exception: unsupprted type */ HDFException ex = new HDFJavaException("byteToNumber: setfield bad type: "+obj+" "+type); throw(ex); } return(retobj); } /** * Allocate a 1D array large enough to hold a multidimensional * array of 'datasize' elements of 'dataType' numbers. * This is called from ncsa.hdf.hdfobject.HDFGR and * ncsa.hdf.hdfobject.HDFSDS, and hdf.ncsa.io.ASCII2HDF * * @param dataType the type of the iamge data * @param datasize the size of the image data array * @return an array of 'datasize' numbers of 'dataType * */ public static Object defineDataObject(int dataType, int datasize) { Object data = null; if ((dataType & HDFConstants.DFNT_LITEND) != 0) { dataType -= HDFConstants.DFNT_LITEND; } switch(dataType) { case HDFConstants.DFNT_INT16: case HDFConstants.DFNT_UINT16: data = new short[datasize]; break; case HDFConstants.DFNT_INT32: case HDFConstants.DFNT_UINT32: data = new int[datasize]; break; case HDFConstants.DFNT_INT64: case HDFConstants.DFNT_UINT64: data = new long[datasize]; break; case HDFConstants.DFNT_FLOAT32: data = new float[datasize]; break; case HDFConstants.DFNT_FLOAT64: data = new double[datasize]; break; default: case HDFConstants.DFNT_CHAR: case HDFConstants.DFNT_UCHAR8: case HDFConstants.DFNT_UINT8: case HDFConstants.DFNT_INT8: data = new byte[datasize]; break; } return data; } } jhdf-2.9/ncsa/hdf/hdflib/HDFException.java0000644000175000017500000000372612050301061021215 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * The class HDFException returns errors from the HDF * library. *

    * Two sub-classes of HDFException are defined: *

    *

      *
    1. * HDFLibraryException -- errors raised the HDF library code *
    2. * HDFJavaException -- errors raised the HDF Java wrapper code *
    *

    * These exceptions will be sub-classed to represent specific * error conditions, as needed. *

    * The only specific exception currently defined is * HDFNotImplementedException, indicating a function that is part * of the HDF API, but which cannot or will not be implemented * for Java. */ public class HDFException extends Exception { static public final String OutOfMemoryMessage="ERROR: HDF Library: Out of memory"; static public final String HDFExceptionMessage="ERROR: HDF Library Error"; static public final String HDFMessage="ERROR: Unknown HDF Error"; int HDFerror; String msg; public HDFException() { HDFerror = 0; } public HDFException(String s) { msg = s; } public HDFException(int err) { HDFerror = err; } @Override public String getMessage() { return msg; } } jhdf-2.9/ncsa/hdf/hdflib/HDFSKPHUFFCompInfo.java0000644000175000017500000000244712050301061022017 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a generic container for the parameters to the HDF * ``Skipping Huffman'' compression classes. *

    * In this case, the information is the skip size *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFSKPHUFFCompInfo extends HDFNewCompInfo { public int skp_size; public HDFSKPHUFFCompInfo() { ctype = HDFConstants.COMP_CODE_SKPHUFF; } ; } jhdf-2.9/ncsa/hdf/hdflib/HDFNotImplementedException.java0000644000175000017500000000301512050301061024051 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * HDFNotImplementedException indicates a function that is part * of the HDF API, but which cannot or will not be implemented * for Java. *

    * For instance, C routines which take Unix FILE objects * as parameters are not appropriate for the Java interface * and will not be implemented. These routines will raise * an HDFNotImplementedException. */ public class HDFNotImplementedException extends HDFJavaException { String msg; public HDFNotImplementedException() { HDFerror = 0; } public HDFNotImplementedException(String s) { msg = "HDFJavaException: HDF function not implmented (yet): "+s; } @Override public String getMessage() { return msg; } } jhdf-2.9/ncsa/hdf/hdflib/HDFJavaException.java0000644000175000017500000000244512050301061022014 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * The class HDFJavaException returns errors from the Java * wrapper of theHDF library. *

    * These errors include Java configuration errors, security * violations, and resource exhaustion. */ public class HDFJavaException extends HDFException { String msg; public HDFJavaException() { HDFerror = 0; } public HDFJavaException(String s) { msg = "HDFLibraryException: "+s; } @Override public String getMessage() { return msg; } } jhdf-2.9/ncsa/hdf/hdflib/HDFTable.java0000644000175000017500000002336112050301061020303 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; import java.lang.reflect.Field; public class HDFTable { static { String v = HDFLibrary.getJHIVersion(); } TabDescriptor _desc = null; public HDFTable() throws java.lang.IllegalAccessException, HDFException { } void init() throws java.lang.IllegalAccessException, HDFException { _desc = new TabDescriptor( this ); } public int size() throws HDFException, java.lang.IllegalAccessException { if (_desc == null ) { init(); } return(_desc.totalsize); } public byte[] byteify() throws java.lang.IllegalAccessException, HDFException { int i; if (_desc == null ) { init(); } byte [] array = new byte[_desc.totalsize]; int pos = 0; for (i = 0; i < _desc.nfields; i++) { getfield( _desc.fldType[i], _desc.flds[i].get(this), array, pos); pos += _desc.fldLen[i]; } return array; } void getfield( Class theType, Object obj, byte[] barray, int offset ) throws HDFException { String type = theType.getName(); byte arow[]; if (type.equals("int")) { arow = ncsa.hdf.hdflib.HDFNativeData.intToByte((Integer)obj); System.arraycopy(arow,0,barray,offset,4); return ; } else if (type.equals("byte")) { byte f = ((Byte)obj).byteValue(); barray[offset] = f; return ; } else if (type.equals("short")) { arow = ncsa.hdf.hdflib.HDFNativeData.shortToByte((Short)obj); System.arraycopy(arow,0,barray,offset,2); return ; } else if (type.equals("float")) { /* 32 bit float */ arow = ncsa.hdf.hdflib.HDFNativeData.floatToByte((Float)obj); System.arraycopy(arow,0,barray,offset,4); return ; } else if (type.equals("long")) { arow = ncsa.hdf.hdflib.HDFNativeData.longToByte((Long)obj); System.arraycopy(arow,0,barray,offset,8); return ; } else if (type.equals("double")) { arow = ncsa.hdf.hdflib.HDFNativeData.doubleToByte((Double)obj); System.arraycopy(arow,0,barray,offset,8); return ; } else if (type.equals("java.lang.String")) { arow = ((String)obj).getBytes(); System.arraycopy(arow,0,barray,offset, java.lang.reflect.Array.getLength(arow)); return ; } else if (type.startsWith("[")) { if ((obj.getClass().isArray()) == false) { HDFException ex = new HDFJavaException("HDFTable: getfield not an array?: "+theType+" "+type); throw(ex); } HDFArray aa = new HDFArray(obj); arow = aa.byteify(); System.arraycopy(arow,0,barray,offset, java.lang.reflect.Array.getLength(arow)); return; } else { HDFException ex = new HDFJavaException("HDFTable: getfield unsupported type?: "+theType+" "+type); throw(ex); } } public void structify( byte [] theBytes) throws HDFException, java.lang.IllegalAccessException { int i; if (_desc == null ) { init(); } int pos = 0; for (i = 0; i < _desc.nfields; i++) { Object v = setfield( _desc.fldTypeName[i], _desc.flds[i].get(this), theBytes, pos, _desc.fldLen[i]); _desc.flds[i].set(this,v); pos += _desc.fldLen[i]; } } Object setfield( String type, Object obj, byte[] barray, int offset, int maxlen ) throws HDFException { if (type.equals("int")) { int[] f = ncsa.hdf.hdflib.HDFNativeData.byteToInt(offset,1,barray); return new Integer(f[0]); } else if (type.equals("byte")) { byte f[] = new byte[1]; f[0] = ((Byte)obj).byteValue(); return new Byte(f[0]) ; } else if (type.equals("short")) { short[] f = ncsa.hdf.hdflib.HDFNativeData.byteToShort(offset,1,barray); return new Short(f[0]) ; } else if (type.equals("float")) { /* 32 bit float */ float[] f = ncsa.hdf.hdflib.HDFNativeData.byteToFloat(offset,1,barray); return new Float(f[0]) ; } else if (type.equals("long")) { long[] f = ncsa.hdf.hdflib.HDFNativeData.byteToLong(offset,1,barray); return new Long(f[0]) ; } else if (type.equals("double")) { double[] f = ncsa.hdf.hdflib.HDFNativeData.byteToDouble(offset,1,barray); return new Double(f[0] ); } else if (type.equals("java.lang.String")) { if ((((String)obj).length()) > maxlen) { HDFException ex = new HDFJavaException("HDFTable: setfield string is too big?: "+obj+" "+type); throw(ex); } String ss = new String( barray, offset, ((String)obj).length()); return ss; } else if (type.startsWith("[")) { if ((obj.getClass().isArray()) == false) { HDFException ex = new HDFJavaException("HDFTable: setfield type is not array?: "+obj+" "+type); throw(ex); } HDFArray aa = new HDFArray(obj); if (java.lang.reflect.Array.getLength(obj) > maxlen) { HDFException ex = new HDFJavaException("HDFTable: setfield array too big?: "+obj+" "+type); throw(ex); } byte b[] = new byte[maxlen]; System.arraycopy(barray,offset,b,0,maxlen); Object o = aa.arrayify(b); return o; } else { /* exception: unsupprted type */ HDFException ex = new HDFJavaException("HDFTable: setfield bad type: "+obj+" "+type); throw(ex); } } } class TabDescriptor { String theType = ""; Class theClass = null; int nfields; int totalsize = 0; Field [] flds; String [] fldTypeName; Class [] fldType; int [] fldLen; Object [] theFields; /*public*/ TabDescriptor(Object theStruct) throws HDFException,java.lang.IllegalAccessException { theClass = theStruct.getClass(); theType = theClass.toString(); int i = 0; flds = theClass.getFields(); nfields = java.lang.reflect.Array.getLength(flds); fldType = new Class[nfields]; fldTypeName = new String[nfields]; fldLen = new int[nfields]; theFields = new Object[nfields]; for (i = 0; i < nfields; i++) { fldType[i] = flds[i].getType(); fldTypeName[i] = fldType[i].getName(); theFields[i] = flds[i].get(theStruct); if (theFields[i] == null) { HDFException ex = new HDFJavaException("HDFTable: Field not defined: "+flds[i].getName()); throw(ex); } fldLen[i] = calcsize(fldType[i], flds[i].get(theStruct)); totalsize += fldLen[i]; } } int calcsize( Class type, Object obj ) throws HDFException { String s = type.toString(); if (s.equals("int")) { return 4; } else if (s.equals("byte")) { return 1; } else if (s.equals("short")) { return 2; } else if (s.equals("float")) { return 4; } else if (s.equals("long")) { return 8; } else if (s.equals("double")) { return 16; } else if (s.equals("class java.lang.String")) { return (((String)obj).length()); } else if (s.startsWith("class [")) { if ((obj.getClass().isArray()) == false) { /* exception: not an array */ System.out.println("Error: byteify requires array"); return -1; } int n = 6; int dims = 0; char c = ' '; while (n < s.length()) { c = s.charAt(n); n++; if (c == '[') { dims++; } } /* To do: extend to deal with Integer, Short, etc. */ int NT = c; /* must be B,S,I,L,F,D, else error */ int NTsize = 0; if (NT == 'B') { NTsize = 1; } else if (NT == 'S') { NTsize = 2; } else if ((NT == 'I') || (NT == 'F')) { NTsize = 4; } else if ((NT == 'J') || (NT == 'D')){ NTsize = 8; } else { /* exception: not a numeric type */ System.out.println("Error: array is not numeric?"); HDFException ex = new HDFJavaException("HDFTable: Array is not numeric?: "+ s); throw(ex); } /* fill in the table */ Object o = obj; int dimlen = 1; int size = NTsize; int i; for ( i = 1; i <= dims; i++) { dimlen= java.lang.reflect.Array.getLength(o); size *= dimlen; o = java.lang.reflect.Array.get(o,0); } return(size); } else { HDFException ex = new HDFJavaException("HDFTable: Unsupported data type: "+ s); throw(ex); } } } jhdf-2.9/ncsa/hdf/hdflib/HDFCompInfo.java0000644000175000017500000000241512050301061020763 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a container for the parameters to the HDF * comp_info union. *

    * The parameters for different compression schemes are * represented as sub-classes of this class *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFCompInfo { public int ctype; public HDFCompInfo() { ctype = HDFConstants.COMP_CODE_NONE; } ; } jhdf-2.9/ncsa/hdf/hdflib/HDFLibrary.java0000644000175000017500000035620612050301061020667 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; import java.io.File; /** * This is the Java interface for the HDF 4.1 library. *

    * This code is the called by Java programs to access the * entry points of the HDF 4.2 library. * Each routine wraps a single HDF entry point, generally with the * arguments and return codes analogous to the C interface. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu *

    *


    *

    * These routines use the class HDFArray * to handle arrays of arbitrary type and shape. *

    *


    *

    * Mapping of arguments for Java * *

    * In general, arguments to the HDF Java API are straightforward * translations from the 'C' API described in the HDF Reference * Manual. *

    * *

    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    * C types to Java types *
    * C * * Java *
    * int, intn, int32, uint32 * * int *
    * short, uint16, int16 * * short *
    * float, float32 * * float *
    * double, float64 * * double *
    * char, uchar, int8, uint8 * * byte *
    * char * (i.e., string) * * java.lang.String *
    * void * * void *
    * void *, VOIDP, char * (meaning ``any'') * * Special -- see HDFArray *
    *
    *

    *

    * General Rules for Passing Arguments and Results *
    *

    * In general, arguments passed IN to Java are the analogous * basic types, as above. * The exception is for arrays, which are discussed below. *

    * The return value of Java methods is also the analogous * type, as above. * A major exception to that rule is that all HDF functions that * return SUCCEED/FAIL are declared boolean in the * Java version, rather than * intn or whatever. * (Functions that return a value or else FAIL are declared * the equivalent to the C function.) *

    * Java does not support pass by reference of arguments, so * arguments that are returned through OUT parameters * must be wrapped in an object or array. * The Java API for HDF consistently wraps arguments in * arrays. *

    * For instance, a function that returns two integers is * declared: *

    *

     *       void HDFdummy( int32* a1, int32* a2)
     *  
    * For the Java interface, this would be declared: *

    *

     *       public static native void HDFdummy( int args[] );
     *  
    * where a1 is args[0] * and a2 is args[1]. *

    * All the routines where this convention is used will have * specific documentation of the details, given below. *

    * Arrays *

    * HDF needs to read and write multi-dimensional arrays * of many types. * The HDF API is self-describing, with the data for the * array passed as a block of bytes, for instance, *

    *

     *      int SDreaddata(int sdsid, int32 *start, int32 * stride,
     *             int32 *count, VOIDP data);
     *  
    *

    * where ``VOIDP'' means that the data may be any valid numeric * type, and is a contiguous block of bytes that is the data * for a multi-dimensional array. *

    * For Java, this is a problem, as the type of data must * be declared. Furthermore, multidimensional arrays * are definitely not layed out contiguously * in memory. * It would be infeasible to declare a separate routine for * every combination of number type and dimensionality. * For that reason, the HDFArray class is used to * discover the type, shape, and size of the data array * at run time, and to convert to and from contigous * bytes. * The upshot is that the data can be passed as an ``Object'', * and the Java API will translate to and from the appropriate * bytes. * So the function above would be declared: *

    *

     *      int SDreaddata(int sdsid, int[] start, int[] stride,
     *             int[] count, Object data);
     *  
    * and the parameter data can be any multi-dimensional * array of numbers, such as float[][], or int[][][]. *

    *

    * Compression and Chunk Information *
    *

    * The HDF library passes the parameters needed by compression * and chunking through C structures (actually, unions). * The Java interface passes these as instances of subclasses * of class HDFCompInfo and HDFChunkInfo respectively. * *

    See: * ncsa.hdf.hdflib.HDFChunkInfo, * and *

    * ncsa.hdf.hdflib.HDFCompInfo. *

    *


    */ public class HDFLibrary implements java.io.Serializable { /** * */ private static final long serialVersionUID = -1695429510319126910L; public final static String HDFPATH_PROPERTY_KEY = "ncsa.hdf.hdflib.HDFLibrary.hdflib"; private final static String JHI_VERSION= "2.6"; private static boolean isLibraryLoaded = false; static { loadH4Lib(); } public static void loadH4Lib() { if (isLibraryLoaded) // load only once return; String filename = System.getProperty(HDFPATH_PROPERTY_KEY, null); if ((filename != null) && (filename.length() > 0)) { File h5dll = new File(filename); if (h5dll.exists() && h5dll.canRead() && h5dll.isFile()) { try { System.load(filename); isLibraryLoaded = true; } catch (Throwable err) { isLibraryLoaded = false; } } else { isLibraryLoaded = false; throw (new UnsatisfiedLinkError("Invalid HDF4 library, "+filename)); } } if (!isLibraryLoaded) { try { System.loadLibrary("jhdf"); isLibraryLoaded = true; } catch (Throwable err) { isLibraryLoaded = false; } } try { HDFLibrary.HDdont_atexit(); } catch (HDFException e) { System.exit(1); } /* Important! Exit quietly */ } public static final String getJHIVersion() { return JHI_VERSION; } public static int Hopen(String filename) throws HDFException { return Hopen(filename, HDFConstants.DFACC_RDONLY); } public static native int Hopen(String filename, int access) throws HDFException; public static native boolean Hclose(int fid) throws HDFException; public static native int HDdont_atexit() throws HDFException; public static native boolean Hishdf(String fileName) throws HDFException; public static native int Hnumber(int fid) throws HDFException; public static native int DFKNTsize(int numbertype) throws HDFException; public static native String HDgetNTdesc(int nt) throws HDFException; public static native boolean Hcache(int file_id, int cache_switch) throws HDFException; /* not yet implemented public static native boolean Hflushdd(int file_id) throws HDFException; */ /** * * Note: the version of an HDF file is not well defined, * it is not recommended that programs rely on these numbers. *

    * @param file_id IN: int, the file descriptor returned by Hopen * @param vers OUT: int[3], the major version, minor version, * and release number of the file. * @param string OUT: String[1], the version string * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * @return the major, minor, and release number are returned * in the array of ints, and a string is returned in the string. */ public static native boolean Hgetfileversion(int file_id, int[] vers, String []string) throws HDFException; /** * @param vers OUT: int[3], the major version, minor version, * and release number of the HDF library. * @param string OUT: String[1], the version string * * @return the major, minor, and release number are returned * in the array of ints, and a string is returned in the string. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. */ public static native boolean Hgetlibversion(int[] vers,String []string) throws HDFException; public static native boolean Hsetaccesstype(int h_id, int access_type) throws HDFException; public static native boolean Hsync(int file_id) throws HDFException; public static native int ANstart(int fid) throws HDFException; public static native boolean ANend(int an_id) throws HDFException; public static native boolean ANendaccess( int an_id) throws HDFException; /** * @param an_id IN: the AN interface id, returned by ANstart * @param info OUT: int[4], n_file_label, n_file_desc, * n_data_label, n_data_desc * * @return four integer parameters: * info[0] = n_file_label, info[1] = n_file_desc, * info[2] = n_data_label, info[3] = n_data_desc * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * */ public static native boolean ANfileinfo(int an_id, int [] info) throws HDFException; public static native int ANselect(int an_id, int index, int anntype) throws HDFException; public static native int ANnumann(int an_id, int anntype, short tag, short ref) throws HDFException; public static native short ANatype2tag(int antag) throws HDFException; public static native int ANtag2atype(short anttype) throws HDFException; /** * @param an_id IN: the AN interface id, returned by ANstart * @param anntype IN: the number type, as defined in HDFConstants * @param tag IN: the HDF tag * @param ref IN: the HDF ref * @param ann_list OUT: int[], an array of annotation identifiers. * The array must be long enough to hold the number of annotations * returned by ANnumann * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return an array of integers, which are the identifiers of * the annotations */ public static native int ANannlist(int an_id, int anntype, int tag, int ref, int[] ann_list) throws HDFException; public static native int ANannlen( int ann_id) throws HDFException; /** * @param ann_id IN: the AN interface id, returned by ANstart * @param annbuf OUT: String[1], the annotation is returned as annbuf[0]. * @param maxlen IN: int, the maximum length of the string. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return an annotation string: annbuf[0] = the annotation */ public static native boolean ANreadann( int ann_id, String[] annbuf, int maxlen) throws HDFException; public static native int ANcreate(int an_id, short tag, short ref, int type) throws HDFException; public static native int ANcreatef(int an_id, int type) throws HDFException; /** * @param an_id IN: the AN interface id, returned by ANstart * @param index IN: the index of the annotation * @param type IN: the type of the annotation * @param tagref OUT: short[2], the tag and ref of the annotation * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the tag and ref: tagref[0] = tag, tagref[1] = ref */ public static native int ANget_tagref(int an_id, int index, int type, short[] tagref) throws HDFException; /** * @param an_id IN: the AN interface id, returned by ANstart * @param tagref OUT: short[2], the tag and ref of the annotation * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the tag and ref: tagref[0] = tag, tagref[1] = ref */ public static native boolean ANid2tagref(int an_id, short [] tagref) throws HDFException; public static native int ANtagref2id(int an_id, short tag, short ref) throws HDFException; public static native boolean ANwriteann(int ann_id, String label, int ann_length) throws HDFException; public static native boolean DFPaddpal(String filename, byte[] palette) throws HDFException; public static native boolean DFPgetpal(String filename, byte[] palette) throws HDFException; public static native short DFPlastref( ) throws HDFException; public static native int DFPnpals(String filename) throws HDFException; public static native boolean DFPputpal (String filename, byte[] palette, int overwrite, String filemode) throws HDFException; /** * @param filename IN: String, the name of the HDF file * @param palette IN: byte[] the palette * @param overwrite IN: boolean, converted to 1 == true, 0 == false * to call the HDF library * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * */ public static boolean DFPputpal (String filename, byte[] palette, boolean overwrite, String filemode) throws HDFException{ if (overwrite) { return DFPputpal (filename, palette, 1, filemode); } else { return DFPputpal (filename, palette, 0, filemode); } } public static native boolean DFPreadref(String filename, short ref) throws HDFException; public static native short DFPrestart( ) throws HDFException; public static native boolean DFPwriteref(String filename, short ref) throws HDFException; public static native int GRstart(int fid) throws HDFException; public static native boolean GRend(int grid) throws HDFException; /** * @param grid IN: the GR interface id, returned by GRstart * @param args OUT: int[2], n_datasets and n_file_attrs * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the file info: args[0] = n_datasets, args[1] = n_file_attrs */ public static native boolean GRfileinfo(int grid, int [] args) throws HDFException; /** * @param sdsid IN: the SD identifier returned by SDselect * @param chunk_def OUT: HDFChunkInfo, the chunking info * @param flag OUT: int[1], the type of chunking * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return c_info contains information about the chunking method, * flags[0] == the chunking flags * *

    NOTE:The chunking algorithm-specific information is * passed in an appropriate sub-class of HDFChunkInfo. */ public static native boolean GRgetchunkinfo( int sdsid, HDFChunkInfo chunk_def, int[] flag) throws HDFException; public static native int GRselect( int grid, int index) throws HDFException; public static native int GRnametoindex( int grid, String name) throws HDFException; /** * @param grid IN: the GR interface id, returned by GRstart * @param args OUT: int[5], image info: * number of components in the image, * data type of the image data, * interlace mode of the stored image data, * sizes of each image dimension , * number of attributes assigned to the image * @param dim_sizes OUT: int[2], dim_sizes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the file info: String[0] = gr_name, args[0] = ncomp, * args[1] = data_type, args[2] = interlace, args[3] = num_attrs * *

    NOTE: the parameters for the Java interface are not in * the same order as the C interface. */ public static native boolean GRgetiminfo( int grid, String[] gr_name, int[] args, int[] dim_sizes) throws HDFException; /** * @param grid IN: the GR interface id, returned by GRstart * @param start IN: int[], start * @param stride IN: int[], stride * @param count IN: int[], count * @param data OUT: byte[], data * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the form of a continous array of * bytes. * *

    NOTE: to read into a Java 2D array use the alternative * routine below. */ public static native boolean GRreadimage( int grid, int[] start, int[] stride, int[] count, byte[] data) throws HDFException; /** * @param grid IN: the GR interface id, returned by GRstart * @param start IN: int[], start * @param stride IN: int[], stride * @param count IN: int[], count * @param theData OUT: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the Java array. * *

    Note: reads the data as bytes and converts to * the Java array. */ public static boolean GRreadimage( int grid, int[] start, int[] stride, int[] count, Object theData) throws HDFException{ byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = GRreadimage( grid, start, stride, count, data); theData = theArray.arrayify( data ); return rval; } public static native boolean GRendaccess( int riid) throws HDFException; /* "[Later]" public static native int GRgetdimid( int riid, int index) throws HDFException; */ /* "[Later]" public static native boolean GRdiminfo( int dimid, char[] name, int[] diminfo[]) throws HDFException; */ public static native short GRidtoref( int riid) throws HDFException; public static native int GRreftoindex( int grid, short ref) throws HDFException; public static native boolean GRreqlutil( int riid, int interlace) throws HDFException; public static native boolean GRreqimageil( int rrid, int interlace) throws HDFException; public static native int GRgetlutid( int rrid, int index) throws HDFException; public static native int GRgetnluts( int rrid) throws HDFException; /** * @param lutid IN: the palette identifier returned by GRgetlutid * @param args OUT: int[4], palette info: * Number of components in the palette, * Data type of the palette data, * Interlace mode of the stored palette data, * Number of color lookup table entries in the palette. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the palette info: args[0] = ncomp, args[1] = data_type, * args[2] = interlace, args[3] = num_entries * */ public static native boolean GRgetlutinfo( int lutid, int[] args) throws HDFException; /** * @param lutid IN: the palette identifier returned by GRgetlutid * @param data OUT: byte[], palette data, in bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the palette data: as bytes * *

    NOTE: to read into a Java 1D array use the alternative * routine below. */ public static native boolean GRreadlut( int lutid, byte[] data) throws HDFException; /** * @param lutid IN: the palette identifier returned by GRgetlutid * @param theData OUT: Object, palette data, an Java array * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the palette data: as a Java array * *

    Note: reads the data as bytes and converts to * the Java array. */ public static boolean GRreadlut( int lutid, Object theData) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = GRreadlut( lutid, data); theData = theArray.arrayify( data ); return rval; } /** * @param id IN: the GR identifier returned by GRstart * @param index IN: the index of the attribute * @param name OUT: String[1], the name of the attribute * @param argv OUT: int[2], the type and length of the * attribute * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the name, type, and lenght of the attribute: * name[0] = name, argv[0] = data_type, argv[1] = length */ public static native boolean GRattrinfo( int id, int index, String []name, int[] argv) throws HDFException; /** * @param id IN: the GR identifier returned by GRstart * @param data OUT: byte[], attribute data, in bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the attribute data: as bytes * *

    NOTE: to read into a Java 1D array use the alternative * routine below. */ public static native boolean GRgetattr( int id, int index, byte[] data) throws HDFException; /** * @param id IN: the GR identifier returned by GRstart * @param theData OUT: Object, attribute data, an Java array * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the attribute data: as a Java array * *

    Note: reads the data as bytes and converts to * the Java array. */ public static boolean GRgetattr( int id, int index, Object theData) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = GRgetattr( id, index, data); theData = theArray.arrayify( data ); return rval; } public static native int GRfindattr( int id, String name) throws HDFException; public static native int GRcreate(int gr_id, String name, int ncomp, int data_type, int interlace_mode, int[] dim_sizes) throws HDFException; public static native short GRluttoref( int pal_id) throws HDFException; /** * @param gr_id IN: the GR identifier returned by GRstart * @param attr_name IN: the name of the attribute * @param data_type IN: the number type of the data (should * be DFNT_CHAR) * @param count IN: the length the data (lenght of 'values') * @param values IN: the the attribute to write -- A String * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE:This routine writes a attribute that is * a String. Alternative methods write data of other types. */ public static native boolean GRsetattr(int gr_id, String attr_name, int data_type, int count, String values) throws HDFException; /** * @param gr_id IN: the GR identifier returned by GRstart * @param attr_name IN: the name of the attribute * @param data_type IN: the number type of the data * @param count IN: the length the data (lenght of 'values') * @param values IN: the the attribute to write -- in an * array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE:This routine writes the attribute as an array * of bytes. DO NOT USE THIS TO WRITE A STRING. This * is intended for numeric data that has been flattened into * bytes. */ public static native boolean GRsetattr(int gr_id, String attr_name, int data_type, int count, byte[] values) throws HDFException; /** * @param gr_id IN: the GR identifier returned by GRstart * @param attr_name IN: the name of the attribute * @param data_type IN: the number type of the data * @param count IN: the length the data (lenght of 'values') * @param theData IN: Object -- the value to be written, * a Java array of numbers. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE:This routine converts the Java array to bytes * then writes it. * DO NOT USE THIS TO WRITE A STRING. */ public static boolean GRsetattr(int gr_id, String attr_name, int data_type, int count, Object theData) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return GRsetattr(gr_id, attr_name, data_type, count, data); } /** * @param sdsid IN: the SD identifier returned by SDselect * @param chunk_def IN: HDFChunkInfo, the chunking info * @param flags IN: the type of chunking * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE:The chunking algorithm-specific information is * passed in an appropriate sub-class of HDFChunkInfo. */ public static native boolean GRsetchunk( int sdsid, HDFChunkInfo chunk_def, int flags) throws HDFException; public static native int GRsetchunkcache( int sdsid, int maxcache, int flags) throws HDFException; /** * @param ri_id IN: the GR identifier returned by GRstart * @param comp_type IN: the type of compression * @param c_info IN: HDFCompInfo, the compression info * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE:The compression algorithm specific information is * passed in an appropriate sub-class of HDFCompInfo. */ public static native boolean GRsetcompress(int ri_id, int comp_type, HDFCompInfo c_info) throws HDFException; public static native boolean GRgetcompress(int ri_id, HDFCompInfo c_info) throws HDFException; public static native boolean GRsetexternalfile(int ri_id, String filename, int offset) throws HDFException; /** * @param grid IN: the GR interface id, returned by GRstart * @param start IN: int[], start * @param stride IN: int[], stride * @param edge IN: int[], count * @param data IN: byte[], data to be written * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java 2D array use the alternative * routine below. */ public static native boolean GRwriteimage(int grid, int [] start, int[] stride, int[] edge, byte[] data) throws HDFException; /** * @param grid IN: the GR interface id, returned by GRstart * @param start IN: int[], start * @param stride IN: int[], stride * @param edge IN: int[], count * @param theData IN: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the Java array to a contiguous * block of bytes appropriate for C, and then writes the bytes. */ public static boolean GRwriteimage(int grid, int [] start, int[] stride, int[] edge, Object theData) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return GRwriteimage(grid, start, stride, edge, data); } /** * @param pal_id IN: the palette identifier returned by GRgetlutid * @param ncomp IN: int, number of components * @param data_type IN: int, number type * @param interlace IN: int, interlace * @param num_entries IN: int, number of entries * @param pal_data IN: byte[], palette data to be written--as bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array of numbers use * the alternative routine below. */ public static native boolean GRwritelut(int pal_id, int ncomp, int data_type, int interlace, int num_entries, byte[] pal_data) throws HDFException; /** * @param pal_id IN: the palette identifier returned by GRgetlutid * @param ncomp IN: int, number of components * @param data_type IN: int, number type * @param interlace IN: int, interlace * @param num_entries IN: int, number of entries * @param theData IN: Object, palette data to be written, any * number type. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the Java array to a contiguous * block of bytes appropriate for C, and then writes the bytes. */ public static boolean GRwritelut(int pal_id, int ncomp, int data_type, int interlace, int num_entries, Object theData) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return GRwritelut(pal_id, ncomp, data_type, interlace, num_entries, data); } /** * @param sdsid IN: the GR interface id, returned by SDselect * @param origin IN: int[], origin * @param theData OUT: byte[], the data in an array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to read into a Java array use the alternative * routine below. */ public static native boolean GRreadchunk( int sdsid, int[] origin, byte[] theData) throws HDFException; /** * @param grid IN: the GR interface id, returned by SDselect * @param origin IN: int[], origin * @param theData IN: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: reads the data as a contiguous * array of bytes and then converts it to an appropriate Java object. */ public static boolean GRreadchunk( int grid, int[] origin, Object theData) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = GRreadchunk( grid, origin, data); theData = theArray.arrayify( data ); return rval; } public static native boolean HDFclose(int file_id) throws HDFException; public static native int HDFopen(String filename, int access, short n_dds) throws HDFException; public static native short HEvalue(int level) throws HDFException; public static native String HEstring(int error_code) throws HDFException; public static native boolean HXsetcreatedir(String dir) throws HDFException; public static native boolean HXsetdir(String dir) throws HDFException ; public static native int SDstart(String filename, int accessmode) throws HDFException; public static native boolean SDend(int sdid) throws HDFException; /** * @param sdid IN: the SD interface id, returned by SDstart * @param argv OUT: int[2], * Number of datasets in the file, * Number of global attributes in the file * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the file info: argv[0] = n_datasets, argv[1] = n_file_attrs */ public static native boolean SDfileinfo(int sdid, int[] argv) throws HDFException; public static native int SDselect( int sdid, int index) throws HDFException; public static native int SDnametoindex( int sdid, String name) throws HDFException; /** * @param sdsid IN: the SD interface id, returned by SDselect * @param name OUT: String[1], the name of the dataset * @param args OUT: int[3], dataset info: * number of dimensions (rank), * data type for the data stored in the dataset, * number of "netCDF-style" attributes for this dataset * @param dimsizes OUT: int[(rank)], sizes of dimensions * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the file info: name[0] = gr_name, args[0] = rank, * args[1] = data_type, args[2] = nattrs, dim_sizes[] = dimensions * *

    NOTE: the parameters for the Java interface are not in * the same order as the C interface. */ public static native boolean SDgetinfo( int sdsid, String []name, int [] dimsizes, int[] args) throws HDFException; /** * @param sdsid IN: the SD interface id, returned by SDselect * @param emptySDS OUT: int[1], 1 if the SDS is empty, 0 if has data * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. */ public static native boolean SDcheckempty( int sdsid, int[] emptySDS) throws HDFException; /** * @param sdsid IN: the SD interface id, returned by SDselect * @param start IN: int[], start * @param stride IN: int[], stride * @param count IN: int[], count * @param data OUT: byte[], data * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the form of a continous array of * bytes. * *

    NOTE: to read into a Java array use the alternative * routine below. */ public static native boolean SDreaddata( int sdsid, int[] start, int[] stride, int[] count, byte[] data) throws HDFException; /** * @param sdsid IN: the SD interface id, returned by SDselect * @param start IN: int[], start * @param stride IN: int[], stride * @param count IN: int[], count * @param theData OUT: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the Java array. * *

    Note: reads the data as bytes and converts to * the Java array. */ public static boolean SDreaddata( int sdsid, int[] start, int[] stride, int[] count, Object theData ) throws HDFException { boolean status = false; boolean is1D = false; Class dataClass = theData.getClass(); if (!dataClass.isArray()) { throw (new HDFJavaException("SDreaddata: data is not an array")); } String cname = dataClass.getName(); is1D = (cname.lastIndexOf('[') ==cname.indexOf('[')); char dname = cname.charAt(cname.lastIndexOf("[")+1); if (is1D && (dname == 'B')) { status = SDreaddata(sdsid, start, stride, count, (byte[])theData); } else if (is1D && (dname == 'S')) { status = SDreaddata_short(sdsid, start, stride, count, (short[])theData); } else if (is1D && (dname == 'I')) { status = SDreaddata_int(sdsid, start, stride, count, (int[])theData); } else if (is1D && (dname == 'J')) { status = SDreaddata_long(sdsid, start, stride, count, (long[])theData); } else if (is1D && (dname == 'F')) { status = SDreaddata_float(sdsid, start, stride, count, (float[])theData); } else if (is1D && (dname == 'D')) { status = SDreaddata_double(sdsid, start, stride, count, (double[])theData); } else { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); status = SDreaddata( sdsid, start, stride, count, data); theData = theArray.arrayify( data ); } return status; } public static native boolean SDendaccess( int sdsid) throws HDFException; public static native int SDgetdimid( int sdsid, int index) throws HDFException; /** * @param dimid IN: the dimension id, returned by SDgetdimid * @param name OUT: String[1], the dimension name * @param argv OUT: int[3], size of the name string, * number type of data in the array, # attributes for the dimension * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return name[0] = name, argv[0] = count, argv[1] = data_type, * argv[2] = nattr */ public static native boolean SDdiminfo( int dimid, String [] name, int[] argv) throws HDFException; public static native int SDidtoref( int sdsid) throws HDFException; public static native int SDreftoindex( int sdid, int ref) throws HDFException; /** * @param id IN: id of a file, SDS, or dimension * @param index IN: index of the attribute * @param name OUT: String[1], the name of the attribute * @param argv OUT: int[2], number type of the attribute, * number of values in the attribute * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return name[0] = attr_name, argv[0] = data_type, * argv[1] = count */ public static native boolean SDattrinfo( int id, int index, String[] name, int[] argv) throws HDFException; /** * @param id IN: id of a file, SDS, or dimension * @param index IN: index of the attribute * @param data OUT: byte[], data * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the form of a continous array of * bytes. * *

    NOTE: to read into a Java array use the alternative * routine below. */ public static native boolean SDreadattr( int id, int index, byte[] data) throws HDFException; /** * @param id IN: id of a file, SDS, or dimension * @param index IN: index of the attribute * @param theData OUT: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the Java array. * *

    Note: reads the data as bytes and converts to * the Java array. */ public static boolean SDreadattr( int id, int index, Object theData) throws HDFException { byte[] data; boolean rval; Class theClass = theData.getClass(); String name = theClass.getName(); if (name.equals("java.lang.String")) { data = ((String)theData).getBytes(); rval = SDreadattr( id, index, data); theData = new String(data); } else { HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = SDreadattr( id, index, data); theData = theArray.arrayify( data ); } return rval; } public static native int SDfindattr( int id, String name) throws HDFException; public static native boolean SDiscoordvar( int sdsid) throws HDFException; /** * @param sdsid IN: id of the SDS as returned by SDselect * @param argv OUT: double[4], calibration information: * calibration factor * calibration error * offset * offset error * @param NT OUT: int[1], number type of uncalibrated data * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return argv[0] = cal, argv[1] = cal_err, * argv[2] = offset, argv[3] = offset_err, * NT[0] = data_type */ public static native boolean SDgetcal( int sdsid, double[] argv, int[] NT) throws HDFException; /** * @param sdsid IN: id of the SDS as returned by SDselect * @param strings OUT: String[4], data information strings: * label * unit * print format * coordinate system * @param len IN: int, max len of string (not needed by * Java -- the HDFLibrary interface will handle this) * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return strings[0] = label, strings[1] = unit, * strings[2] = format, strings[3] = coordsys, */ public static native boolean SDgetdatastrs( int sdsid, String []strings, int len) throws HDFException; /** * @param dimid IN: id of the SDS as returned by SDselect * @param args OUT: String[4], data information strings: * label * unit * print format * @param len IN: int, max len of string (not needed by * Java -- the HDFLibrary interface will handle this) * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return strings[0] = label, strings[1] = unit, * strings[2] = format */ public static native boolean SDgetdimstrs( int dimid, String[] args, int len) throws HDFException; /** * @param dimid IN: id of a dimension as returned by SDgetdimid * @param data OUT: byte[], data * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the form of a continous array of * bytes. * *

    NOTE: to read into a Java array use the alternative * routine below. */ public static native boolean SDgetdimscale( int dimid, byte[] data) throws HDFException; /** * @param dimid IN: id of a dimension as returned by SDgetdimid * @param theData OUT: Object, a Java array of appropriate * type and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the Java array. * *

    Note: reads the data as bytes and converts to * the Java array. */ public static boolean SDgetdimscale( int dimid, Object theData) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = SDgetdimscale( dimid, data); theData = theArray.arrayify( data ); return rval; } /** * @param sdsid IN: id of the SDS as returned by SDselect * @param fillValue OUT: byte[], data * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the fill value in the form of a continous array of * bytes. * *

    NOTE: to read into a Java variable use the alternative * routine below. */ public static native boolean SDgetfillvalue( int sdsid, byte[] fillValue) throws HDFException; /** * @param sdsid IN: id of the SDS as returned by SDselect * @param theFillValue OUT: Object[1], one object of * appropriate type * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the Java array: theFillValue[0] = fillValue * *

    Note: the routine calls SDgetinfo to determine the * correct type, reads the data as bytes, and converts to the * appropriate Java object. */ public static boolean SDgetfillvalue( int sdsid, Object [] theFillValue) throws HDFException { int [] SDInfo = new int[3]; int NT; String datasetname = new String(" "); String ss[] = new String[1]; ss[0] = datasetname; int dimsize[] = new int[16]; SDgetinfo(sdsid, ss, dimsize, SDInfo ); datasetname = ss[0]; byte[] d1 = new byte[8]; boolean rval; rval = SDgetfillvalue( sdsid, d1 ); if (rval == false) { return(rval); } NT = SDInfo[1]; if ((NT & HDFConstants.DFNT_LITEND) != 0) { NT -= HDFConstants.DFNT_LITEND; } if ((NT == HDFConstants.DFNT_INT8 ) || (NT == HDFConstants.DFNT_CHAR8 ) || (NT == HDFConstants.DFNT_CHAR ) ) { theFillValue[0] = new Byte(d1[0]); } else if ((NT == HDFConstants.DFNT_UINT8 ) || (NT == HDFConstants.DFNT_UCHAR8 ) || (NT == HDFConstants.DFNT_UCHAR8 ) ) { Byte f = new Byte(d1[0]); if (f.shortValue() < 0) { theFillValue[0] = new Short((short)(f.intValue() + 256)); } else { theFillValue[0] = new Short(f.shortValue()); } } else if ((NT == HDFConstants.DFNT_INT16 ) || (NT == HDFConstants.DFNT_CHAR16 ) ) { short [] fx = HDFNativeData.byteToShort(0,1,d1); theFillValue[0] = new Short(fx[0]); } else if ( (NT == HDFConstants.DFNT_UINT16 ) || (NT == HDFConstants.DFNT_UCHAR16 ) ) { short[] fmx = HDFNativeData.byteToShort(0,1,d1); Short f = new Short(fmx[0]); if (f.intValue() < 0) { theFillValue[0] = new Integer(f.intValue() + 65536); } else { theFillValue[0] = new Integer(f.intValue()); } } else if ((NT == HDFConstants.DFNT_INT32 ) ) { int [] fx = HDFNativeData.byteToInt(0,1,d1); theFillValue[0] = new Integer(fx[0]); } else if ((NT == HDFConstants.DFNT_UINT32 ) ) { int[] fmx = HDFNativeData.byteToInt(0,1,d1); Integer i = new Integer(fmx[0]); if (i.floatValue() < 0) { theFillValue[0] = new Float((float)(i.floatValue() + 4294967296.0)); } else { theFillValue[0] = new Float(i.floatValue()); } } else if (NT == HDFConstants.DFNT_FLOAT32 ) { float [] fx = HDFNativeData.byteToFloat(0,1,d1); theFillValue[0] = new Float(fx[0]); } else if (NT == HDFConstants.DFNT_FLOAT64 ) { double [] fx = HDFNativeData.byteToDouble(0,1,d1); theFillValue[0] = new Double(fx[0]); } else { System.out.println("Error: SDgetfillvalue not converting, type "+NT); } return rval; } /** * @param sdsid IN: id of the SDS as returned by SDselect * @param max OUT: byte[], max value, as bytes * @param min OUT: byte[], min value, as bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the max and min values in the form of a continous array of * bytes. * *

    NOTE: to read into Java doubles, use the alternative * routine below. */ public static native boolean SDgetrange( int sdsid, byte[] max, byte[] min) throws HDFException; /** * @param sdsid IN: id of the SDS as returned by SDselect * @param maxmin OUT: double[2], the max and min values * converted to doubles * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return the the data in the Java array: maxmin[0] = max, * maxmin[1] = min * *

    Note: the routine calls SDgetinfo to determine the * correct type, reads the data as bytes, and converts to the * double. */ public static boolean SDgetrange( int sdsid, double maxmin[]) throws HDFException { int [] SDInfo = new int[3]; int NT; String datasetname = new String(" "); String ss[] = new String[1]; ss[0] = datasetname; int dimsize[] = new int[16]; SDgetinfo(sdsid, ss, dimsize, SDInfo); datasetname = ss[0]; byte[] max = new byte[8]; byte[] min = new byte[8]; boolean rval; rval = SDgetrange( sdsid, max, min); if (rval == false) { return(rval); } NT = SDInfo[1]; if ((NT & HDFConstants.DFNT_LITEND) != 0) { NT -= HDFConstants.DFNT_LITEND; } if ((NT == HDFConstants.DFNT_INT8 ) || (NT == HDFConstants.DFNT_CHAR8 ) || (NT == HDFConstants.DFNT_CHAR ) ) { Byte f = new Byte(max[0]); maxmin[0] = (f.doubleValue()); f = new Byte(min[0]); maxmin[1] = (f.doubleValue()); } else if ((NT == HDFConstants.DFNT_UINT8 ) || (NT == HDFConstants.DFNT_UCHAR8 ) || (NT == HDFConstants.DFNT_UCHAR8 ) ) { Byte f = new Byte(max[0]); Short fmx; if (f.shortValue() < 0) { fmx = new Short((short)(f.intValue() + 256)); } else { fmx = new Short(f.shortValue()); } maxmin[0] = (fmx.doubleValue()); f = new Byte(min[0]); fmx = new Short(f.shortValue()); maxmin[1] = (fmx.doubleValue()); } else if ((NT == HDFConstants.DFNT_INT16 ) || (NT == HDFConstants.DFNT_CHAR16 ) ) { short [] fmx = HDFNativeData.byteToShort(0,1,max); short [] fmn = HDFNativeData.byteToShort(0,1,min); Short f = new Short(fmx[0]); maxmin[0] = (f.doubleValue()); f = new Short(fmn[0]); maxmin[1] = (f.doubleValue()); } else if ((NT == HDFConstants.DFNT_UINT16 ) || (NT == HDFConstants.DFNT_UINT16 ) ) { short[] fmx = HDFNativeData.byteToShort(0,1,max); Short f = new Short(fmx[0]); Integer i; if (f.intValue() < 0) { i = new Integer(f.intValue() + 65536); } else { i = new Integer(f.intValue()); } maxmin[0] = (i.doubleValue()); fmx = HDFNativeData.byteToShort(0,1,min); f = new Short(fmx[0]); if (f.intValue() < 0) { i = new Integer(f.intValue() + 65536); } else { i = new Integer(f.intValue()); } maxmin[1] = (i.doubleValue()); } else if ((NT == HDFConstants.DFNT_INT32 ) ) { int [] fmx = HDFNativeData.byteToInt(0,1,max); int [] fmn = HDFNativeData.byteToInt(0,1,min); Integer f = new Integer(fmx[0]); maxmin[0] = (f.doubleValue()); f = new Integer(fmn[0]); maxmin[1] = (f.doubleValue()); } else if ( (NT == HDFConstants.DFNT_UINT32 )) { int[] fmx = HDFNativeData.byteToInt(0,1,max); Integer i = new Integer(fmx[0]); Float f; if (i.floatValue() < 0) { f = new Float((float)(i.floatValue() + 4294967296.0)); } else { f = new Float(i.floatValue()); } maxmin[0] = (f.doubleValue()); fmx = HDFNativeData.byteToInt(0,1,max); i = new Integer(fmx[0]); if (i.floatValue() < 0) { f = new Float((float)(i.floatValue() + 4294967296.0)); } else { f = new Float(i.floatValue()); } maxmin[1] = (f.doubleValue()); } else if (NT == HDFConstants.DFNT_FLOAT32 ) { float [] fmx = HDFNativeData.byteToFloat(0,1,max); float [] fmn = HDFNativeData.byteToFloat(0,1,min); Float f = new Float(fmx[0]); maxmin[0] = (f.doubleValue()); f = new Float(fmn[0]); maxmin[1] = (f.doubleValue()); } else if (NT == HDFConstants.DFNT_FLOAT64 ) { double [] fmx = HDFNativeData.byteToDouble(0,1,max); double [] fmn = HDFNativeData.byteToDouble(0,1,min); Double f = new Double(fmx[0]); maxmin[0] = (f.doubleValue()); f = new Double(fmn[0]); maxmin[1] = (f.doubleValue()); } else { System.out.println("Error: SDgetrange not converting, type "+NT); } return rval; } public static native int SDcreate(int sd_id, String name, int number_type, int rank, int[] dimsizes) throws HDFException; public static native boolean SDisrecord(int sdsid) throws HDFException; public static native boolean SDsetattr(int s_id, String attr_name, int num_type, int count, byte[] values) throws HDFException; public static boolean SDsetattr(int s_id, String attr_name, int num_type, int count, Object theValues) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theValues); data = theArray.byteify(); return SDsetattr(s_id, attr_name, num_type, count, data); } public static native boolean SDsetcal(int sds_id, double cal, double cal_err, double offset, double offset_err, int number_type) throws HDFException; public static native boolean SDsetdatastrs(int sds_id, String label, String unit, String format, String coordsys) throws HDFException; public static native boolean SDsetdimname(int dim_id, String dim_name) throws HDFException; /** * @param dim_id IN: id of a dimension * @param count IN: number of values * @param number_type IN: number type of the values * @param data IN: byte[], the values, in an array of * bytes. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: the calling program must assure that the * data is correctly formatted for C. To write an array * of Java objects, use the alternative routine below. */ public static native boolean SDsetdimscale(int dim_id, int count, int number_type, byte[] data) throws HDFException; /** * @param dim_id IN: id of a dimension * @param count IN: number of values * @param number_type IN: number type of the values * @param theData OUT: Object, a Java array of appropriate * type and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the Java array to an array of * bytes, and writes the bytes. */ public static boolean SDsetdimscale(int dim_id, int count, int number_type, Object theData) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return SDsetdimscale(dim_id, count, number_type, data) ; } public static native boolean SDsetdimstrs(int dim_id, String label, String unit, String format) throws HDFException; public static native boolean SDsetexternalfile(int sds_id, String filename, int offset) throws HDFException; /** * @param sds_id IN: id of a dataset * @param fill_val IN: byte[], the fill values in an array of * bytes. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: the calling program must assure that the * data is correctly formatted for C. To set the fill value * with a Java object, use the alternative routine below. */ public static native boolean SDsetfillvalue(int sds_id, byte[] fill_val) throws HDFException; /** * @param sds_id IN: id of a dataset * @param the_fill_val IN: Object, a Java object of appropriate * type * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the Java array to an array of * bytes, and writes the bytes. */ public static boolean SDsetfillvalue(int sds_id, Object the_fill_val) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(the_fill_val); data = theArray.byteify(); return SDsetfillvalue(sds_id, data) ; } /** * @param sdsid IN: id of a dataset * @param max IN: byte[], the max value in an array of bytes * @param min IN: byte[], the min value in an array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: the calling program must assure that the * data is correctly formatted for C. To set the max and min value * with Java objects, use the alternative routine below. */ public static native boolean SDsetrange( int sdsid, byte[] max, byte[] min) throws HDFException; /** * @param sdsid IN: id of a dataset * @param max IN: Object, a Java object of appropriate type * @param min IN: Object, a Java object of appropriate type * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the Java array to an array of * bytes, and writes the bytes. */ public static boolean SDsetrange( int sdsid, Object max, Object min) throws HDFException { byte[] d1; byte[] d2; HDFArray theArray1 = new HDFArray(max); d1 = theArray1.byteify(); HDFArray theArray2 = new HDFArray(min); d2 = theArray2.byteify(); return SDgetrange( sdsid, d1, d2); } /** * @param sdsid IN: the SD interface id, returned by SDselect * @param start IN: int[], start * @param stride IN: int[], stride * @param count IN: int[], count * @param data IN: byte[], data in an array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array use the alternative * routine below. */ public static native boolean SDwritedata( int sdsid, int[] start, int[] stride, int[] count, byte[] data) throws HDFException; /** * @param sdsid IN: the SD interface id, returned by SDselect * @param start IN: int[], start * @param stride IN: int[], stride * @param count IN: int[], count * @param theData IN: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts to the Java array to a contiguous * array of bytes and then writes to the file. */ public static boolean SDwritedata( int sdsid, int[] start, int[] stride, int[] count, Object theData ) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return SDwritedata( sdsid, start, stride, count, data); } public static native boolean SDsetnbitdataset(int id, int start_bit, int bit_len, int sign_ext, int fill_one) throws HDFException; /** * @param id IN: the SD identifier returned by SDselect * @param type IN: the type of compression * @param cinfo IN: HDFCompInfo, the compression info * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE:The compression algorithm specific information is * passed in an appropriate sub-class of HDFCompInfo. */ public static native boolean SDsetcompress( int id, int type, HDFCompInfo cinfo) throws HDFException; public static native boolean SDgetcompress( int id, HDFCompInfo cinfo) throws HDFException; public static native boolean SDsetaccesstype( int id, int accesstype ) throws HDFException; public static native boolean SDsetblocksize( int sdsid, int block_size ) throws HDFException; /** * @param sdsid IN: the SD id * @param fill_enable IN: boolean, true calls library with * SD_FILL, false calls library with SD_NOFILL * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * */ public static boolean SDsetfillmode( int sdsid, boolean fill_enable ) throws HDFException { int fm; if (fill_enable) { fm = HDFConstants.SD_FILL; } else { fm = HDFConstants.SD_NOFILL; } return SDsetfillmode( sdsid, fm ); } public static native boolean SDsetfillmode( int sdsid, int fillmode ) throws HDFException; public static native boolean SDsetdimval_comp( int dimid, int comp_mode ) throws HDFException; public static native boolean SDisdimval_bwcomp( int dimid ) throws HDFException; /** * @param sdsid IN: the SD identifier returned by SDselect * @param chunk_def IN: HDFChunkInfo, the chunking info * @param flags IN: the type of chunking * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE:The chunking algorithm-specific information is * passed in an appropriate sub-class of HDFChunkInfo. */ public static native boolean SDsetchunk( int sdsid, HDFChunkInfo chunk_def, int flags) throws HDFException; /** * @param sdsid IN: the SD identifier returned by SDselect * @param chunk_def OUT: HDFChunkInfo, the chunking info * @param clflags OUT: int[1], the type of chunking * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return c_info contains information about the chunking method, * clflags[0] == the chunking flags * *

    NOTE:The chunking algorithm-specific information is * passed in an appropriate sub-class of HDFChunkInfo. */ public static native boolean SDgetchunkinfo( int sdsid, HDFChunkInfo chunk_def, int[] clflags) throws HDFException; /** * @param sdsid IN: the SD interface id, returned by SDselect * @param origin IN: int[], origin * @param theData OUT: byte[], the data in an array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to read into a Java array use the alternative * routine below. */ public static native boolean SDreadchunk( int sdsid, int[] origin, byte[] theData) throws HDFException; /** * @param sdsid IN: the SD interface id, returned by SDselect * @param origin IN: int[], origin * @param theData IN: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: reads the data as a contiguous * array of bytes and then converts it to an appropriate Java object. */ public static boolean SDreadchunk( int sdsid, int[] origin, Object theData) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = SDreadchunk( sdsid, origin, data); theData = theArray.arrayify( data ); return rval; } public static native int SDsetchunkcache( int sdsid, int maxcache, int flags) throws HDFException; /** * @param sdsid IN: the SD interface id, returned by SDselect * @param origin IN: int[], origin * @param data IN: byte[], data to be written, in an array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array use the alternative * routine below. */ public static native boolean SDwritechunk( int sdsid, int[] origin, byte[] data) throws HDFException; /** * @param sdsid IN: the SD interface id, returned by SDselect * @param origin IN: int[], origin * @param theData IN: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts to the Java array to a contiguous * array of bytes and then writes to the file. */ public static boolean SDwritechunk( int sdsid, int[] origin, Object theData) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return SDwritechunk( sdsid, origin, data); } public static native int VFfieldesize(int vdata_id, int field_index) throws HDFException; public static native int VFfieldisize(int vdata_id, int field_index) throws HDFException; public static native String VFfieldname(int vdata_id, int field_index) throws HDFException; public static native int VFfieldorder(int vdata_id, int field_index) throws HDFException; public static native int VFfieldtype(int vdata_id, int field_index) throws HDFException; public static native int VFnfields(int vkey) throws HDFException; public static native int VHmakegroup(int file_id, int[] tag_array, int[] ref_array, int n_objects, String vgroup_name, String vgroup_class) throws HDFException; /** * @param file_id IN: the SD interface id, returned by SDselect * @param fieldname IN: String, the name of the field to be filled * @param buf IN: byte[], data to be written, in an array of bytes * @param n_records IN: int, the number of records being written * @param data_type IN: int, the number type of the data * @param vdata_name IN: String, the name of the Vdata * @param vdata_class IN: String, the class of the Vdata * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array use the alternative * routine below. */ public static native int VHstoredata(int file_id, String fieldname, byte[] buf, int n_records, int data_type, String vdata_name, String vdata_class) throws HDFException; /** * @param file_id IN: the SD interface id, returned by SDselect * @param fieldname IN: String, the name of the field to be filled * @param thebuf IN: Object, data to be written, in a Java array * of appropriate type and size * @param n_records IN: int, the number of records being written * @param data_type IN: int, the number type of the data * @param vdata_name IN: String, the name of the Vdata * @param vdata_class IN: String, the class of the Vdata * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts to the Java array to a contiguous * array of bytes and then writes to the file. */ public static int VHstoredata(int file_id, String fieldname, Object thebuf, int n_records, int data_type, String vdata_name, String vdata_class) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(thebuf); data = theArray.byteify(); return VHstoredata(file_id, fieldname, data, n_records, data_type, vdata_name, vdata_class); } /** * @param file_id IN: the SD interface id, returned by SDselect * @param fieldname IN: String, the name of the field to be filled * @param buf IN: byte[], data to be written, in an array of bytes * @param n_records IN: int, the number of records being written * @param data_type IN: int, the number type of the data * @param vdata_name IN: String, the name of the Vdata * @param vdata_class IN: String, the class of the Vdata * @param order IN: int, the number of components per field * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array use the alternative * routine below. */ public static native int VHstoredatam(int file_id, String fieldname, byte[] buf, int n_records, int data_type, String vdata_name, String vdata_class, int order) throws HDFException; /** * @param file_id IN: the SD interface id, returned by SDselect * @param fieldname IN: String, the name of the field to be filled * @param buf IN: Object, data to be written, in a Java array * of appropriate type, dimension, and size * @param n_records IN: int, the number of records being written * @param data_type IN: int, the number type of the data * @param vdata_name IN: String, the name of the Vdata * @param vdata_class IN: String, the class of the Vdata * @param order IN: int, the number of components per field * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts to the Java array to a contiguous * array of bytes and then writes to the file. */ public static int VHstoredatam(int file_id, String fieldname, Object buf, int n_records, int data_type, String vdata_name, String vdata_class, int order) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(buf); data = theArray.byteify(); return VHstoredatam(file_id, fieldname, data, n_records, data_type, vdata_name, vdata_class, order); } public static native int VQueryref(int vkey) throws HDFException; public static native int VQuerytag(int vkey) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param n_records OUT, int[1], the number of records in the vdata * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return n_records[0] == the number of records */ public static native boolean VSQuerycount(int vdata_id, int[] n_records) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param fields OUT, String[1], the names of the fields * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return fields[0] == a comma delimited string with the names * of the fields. */ public static native boolean VSQueryfields(int vdata_id, String[] fields) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param interlace OUT, int[1], the interlace mode, * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return interlace[0] == the number of records, * HDFConstants.FULL_INTERLACE or HDFConstants.NO_INTERLACE */ public static native boolean VSQueryinterlace(int vdata_id, int[] interlace) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param vdata_name OUT, String[1], the name of the vdata * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return vdata_name[0] == the name */ public static native boolean VSQueryname(int vdata_id, String[] vdata_name) throws HDFException; public static native int VSQueryref(int vdata_id) throws HDFException; public static native int VSQuerytag(int vdata_id) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param vdata_size OUT, int[1], the size of the vdata * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return vdata_size[0] == Native size, in bytes, of a record in the vdata */ public static native boolean VSQueryvsize(int vdata_id, int[] vdata_size) throws HDFException; public static native int VSattach(int fid, int vdata_ref, String access) throws HDFException; public static native void VSdetach(int vdata_id) throws HDFException; public static native int VSgetid(int file_id, int vdata_ref) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param hdfclassname OUT, String[1], the class name of the vdata * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. */ public static native void VSgetclass(int vdata_id, String[] hdfclassname) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param hdfname OUT, String[1], the name of the vdata * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. */ public static native void VSgetname(int vdata_id, String[] hdfname) throws HDFException; public static native int VSelts(int vdata_id) throws HDFException; public static native boolean VSfdefine(int vdata_id, String fieldname, int numbertype, int order) throws HDFException; public static native boolean VSfexist(int vdata_id, String fields) throws HDFException; public static native int VSfind(int file_id, String vdataname) throws HDFException; public static native int VSsetblocksize(int vdata_id, int blocksize) throws HDFException; public static native int VSsetnumblocks(int vdata_id, int numblocks) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param fieldname OUT, String[1], the names of the fields * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return fieldname[0] == a comma delimited string with the names * of the fields. */ public static native int VSgetfields(int vdata_id, String[] fieldname) throws HDFException; public static native int VSgetinterlace(int vdata_id) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param iargs OUT, int[3], n_records, interlace, vdata_size * @param sargs OUT, String[2], names the dataset, fields * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return iargs[0] = n_records, iargs[1] = interlace, iargs[2] = vdata_size, * sargs[0] = vdata_name, sargs[1] = comma delimited list of fields * *

    NOTE: the parameters for the Java interface are not in * the same order as the C interface. */ public static native boolean VSinquire(int vdata_id, int[] iargs, String[] sargs) throws HDFException; /** * @param vdata_id IN, vdata id as returned by VSattach * @param iargs OUT, int[2], block_size, num_blocks * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return iargs[0] = blocksize, iargs[1] = num_blocks * *

    NOTE: the parameters for the Java interface are not in * the same order as the C interface. */ public static native boolean VSinquire(int vdata_id, int[] iargs ) throws HDFException; /** * @param fid IN, File identifier returned by Hopen * @param ref_array OUT, int[?], the refs * @param buffersize IN, int, the max number of refs to * return. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return ref_array contains refs. The Java API ignores the buffersize * argument, returns as many as possible. */ public static native int VSlone(int fid, int[] ref_array, int buffersize) throws HDFException; /** * @param vdata_id IN: the Vdata id * @param databuf OUT: byte[], the data in an array of bytes * @param nrecord IN: int, number of records * @param interlace IN: int, interlace * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to read into a Java array use the alternative * routine below. */ public static native int VSread(int vdata_id, byte[] databuf, int nrecord, int interlace) throws HDFException; /** * @param vdata_id IN: the Vdata id * @param theData OUT: Object, a Java array of appropriate * type, dimensions, and size. * @param nrecord IN: int, number of records * @param interlace IN: int, interlace * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: reads the data as a contiguous * array of bytes and then converts it to an appropriate Java object. */ public static int VSread(int vdata_id, Object theData, int nrecord, int interlace) throws HDFException { byte[] data; int rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = VSread(vdata_id, data, nrecord, interlace); theData = theArray.arrayify( data ); return rval; } public static native int VSseek(int vdata_id, int record) throws HDFException; public static native boolean VSsetfields(int vdata_id, String fields) throws HDFException; public static native boolean VSsetinterlace(int vdata_id, int interlace) throws HDFException; public static native int VSsizeof(int vdata_id, String fields) throws HDFException; public static native boolean VSappendable(int vkey, int block_size) throws HDFException; public static native int VSfindclass(int file_id, String vgclass) throws HDFException; public static native int VSgetversion(int vkey) throws HDFException; public static native void VSsetclass(int vdata_id, String vdata_class) throws HDFException; public static native boolean VSsetexternalfile(int vkey, String filename, int offset) throws HDFException; public static native void VSsetname(int vdata_id, String vdata_name) throws HDFException; /** * @param vdata_id IN: the Vdata id * @param databuf IN: byte[], the data in an array of bytes * @param n_records IN: int, number of records * @param interlace IN: int, interlace * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write a Java array use the alternative * routine below. */ public static native int VSwrite(int vdata_id, byte [] databuf, int n_records, int interlace) throws HDFException; /** * @param vdata_id IN: the Vdata id * @param databuf IN: Object, a Java array of appropriate * type, dimensions, and size. * @param n_records IN: int, number of records * @param interlace IN: int, interlace * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Important Note: This interface only supports * records which are all of the same numeric type, with * no character fields. Heterogeneous fields can be * written as bytes (see above), but the calling program * must make sure the data is in proper order to * write to the HDF library. * *

    Note: converts the data into a contiguous * array of bytes and then writes it */ public static int VSwrite(int vdata_id, Object databuf, int n_records, int interlace) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(databuf); data = theArray.byteify(); return VSwrite( vdata_id, data, n_records, interlace); } public static native boolean Vstart(int fid) throws HDFException; public static native int Vattach(int fid, int vgroup_ref, String access) throws HDFException; public static native void Vdetach(int vgroup_id) throws HDFException; public static native void Vend(int file_id) throws HDFException; public static native int Vgetid(int file_id, int vgroup_ref) throws HDFException; /** * @param vgroup_id IN: the Vgroup id * @param hdfclassname OUT: String[1], the HDF class of * the vgroup. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. */ public static native void Vgetclass(int vgroup_id, String[] hdfclassname) throws HDFException; /** * @param vgroup_id IN: the Vgroup id * @param hdfname OUT: String[1], the name of * the vgroup. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. */ public static native void Vgetname(int vgroup_id, String[] hdfname) throws HDFException; public static native boolean Visvg(int vgroup_id, int vgroup_ref) throws HDFException; public static native boolean Visvs(int vgroup_id, int vdata_ref) throws HDFException; /** * @param vgroup_id IN: the Vgroup id * @param tags OUT: int[arraysize], the tags * @param refs OUT: int[arraysize], the refs * @param arraysize IN: int, the number of tags/refs to * return * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return tags[] = tags for objects 0 - n, refs[] = refs for * objects 0 - n */ public static native int Vgettagrefs(int vgroup_id, int[] tags, int[] refs, int arraysize) throws HDFException; /** * @param vgroup_id - IN: the Vgroup id * @param index - IN: the index of the object * @param tagref - OUT: tagref[0]=tag, tagref[1]=ref * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return tags[0] = tag for object #index, refs[0] = ref for * objects #index */ public static native boolean Vgettagref(int vgroup_id, int index, int[] tagref) throws HDFException; public static native int Vntagrefs(int vgroup_id) throws HDFException; public static native boolean Vinqtagref(int vgroup_id, int tag, int ref) throws HDFException; /** * @param fid IN: the file identifier returned by Hopen * @param ref_array OUT: int[], the refs for Vdata not part * of Vgroups * @param buffersize IN: the max size of the ref_array * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return ref_array[] = refs 0 - ... */ public static native int Vlone(int fid, int[] ref_array, int buffersize) throws HDFException; public static native int Vaddtagref(int vgroup_id, int tag, int ref) throws HDFException; public static native int Vdeletetagref(int vgroup_id, int tag, int ref) throws HDFException; public static native int Vfind(int file_id, String vgroup_name) throws HDFException; public static native int Vfindclass(int file_id, String vgclassname) throws HDFException; public static native int Vflocate(int key, String vgclassname) throws HDFException; public static native int Vgetnext(int key, int ref) throws HDFException; /** * @param vgroup_id IN: the Vgroup id * @param n_entries OUT: int[1], the number of objects in the Vgroup * @param vgroup_name OUT: String[1], the name of the Vgroup * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return n_entries[0] = number of entries, vgroup_name[0] = the name */ public static native boolean Vinquire(int vgroup_id, int[] n_entries, String[] vgroup_name) throws HDFException; public static native int Vinsert(int vgroup_id, int v_id) throws HDFException; public static native int Vnrefs(int key, int ref) throws HDFException; public static native boolean Vsetclass(int vgroup_id, String vgclassname) throws HDFException; public static native boolean Vsetname(int vgroup_id, String vgname) throws HDFException; /** * @param id IN: Vgroup identifier returned by Vattach * @param index IN: the index of the attribute * @param name OUT: String[1], the name of the attribute * @param argv OUT: int[3], * Data type of the target attribute, * Number of values in the target attribute, * Size, in bytes, of the values of the target attribute, * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return name[0] = name, argv[0] = data_type, argv[1] = count, * argv[2] = size */ public static native boolean Vattrinfo( int id, int index, String[] name, int[] argv) throws HDFException; public static native int Vfindattr(int id, String name) throws HDFException; /** * @param id IN: the Vdata id * @param index IN: the index of the attribute * @param data OUT: byte[], the data in an array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to read into a Java array use the alternative * routine below. * * @return data = the value of the attribute, in an array of bytes */ public static native boolean Vgetattr(int id, int index, byte[] data) throws HDFException; /** * @param id IN: the Vdata id * @param index IN: the index of the attribute * @param theData OUT: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: reads the data as a contiguous * array of bytes and then converts it to an appropriate Java object. * * @return data = the value of the attribute, in an array of Java * objects */ public static boolean Vgetattr(int id, int index, Object theData) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = Vgetattr( id, index, data); theData = theArray.arrayify( data ); return rval; } public static native int Vgetversion(int id) throws HDFException; public static native int Vnattrs(int id) throws HDFException; public static native boolean Vsetattr(int id, String attr_name, int data_type, int count, String values) throws HDFException; /** * @param id IN: the Vdata id * @param attr_name IN: String, the name of the attribute * @param data_type IN: int, the number_type of the attribute * @param count IN: the number of values * @param data IN: byte[], the data in an array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write into a Java array use the alternative * routine below. */ public static native boolean Vsetattr(int id, String attr_name, int data_type, int count, byte[] data) throws HDFException; /** * @param id IN: the Vdata id * @param attr_name IN: String, the name of the attribute * @param data_type IN: int, the number_type of the attribute * @param count IN: the number of values * @param theData IN: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the data to a contiguous * array of bytes and then converts writes it. */ public static boolean Vsetattr(int id, String attr_name, int data_type, int count, Object theData) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return Vsetattr(id, attr_name, data_type, count, data); } /** * @param id IN: the Vdata id * @param index IN: int, the index of the attribute * @param attr_index IN: int, the index of the attribute * @param name OUT: String[1], the name of the attribute * @param argv OUT: int[3], * Data type of the target attribute, * Number of values in the target attribute, * Size, in bytes, of the values of the target attribute, * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return name[0] = name, argv[0] = data_type, argv[1] = count, * argv[2] = size */ public static native boolean VSattrinfo( int id, int index, int attr_index, String[] name, int[] argv) throws HDFException; /** * @param id IN: the Vdata id * @param name IN: the name of the attribute * @param findex IN: int[1], the index of the attribute * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return findex[0] = the index */ public static native int VSfindex( int id, String name, int[] findex) throws HDFException; public static native int VSfindattr( int id, int index, String name) throws HDFException; public static native int VSfnattrs( int id, int fnattrs) throws HDFException; /** * @param id IN: the Vdata id * @param index IN: the index of the vdata * @param attr_index IN: the index of the attribute * @param data OUT: byte[], the data in an array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to read into a Java array use the alternative * routine below. * * @return data = the value of the attribute, in an array of bytes */ public static native boolean VSgetattr( int id, int index, int attr_index, byte[] data) throws HDFException; /** * @param id IN: the Vdata id * @param index IN: the index of the vdata * @param attr_index IN: the index of the attribute * @param theData OUT: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: reads the data as a contiguous * array of bytes and then converts it to an appropriate Java object. * * @return data = the value of the attribute, in an array of Java * objects */ public static boolean VSgetattr( int id, int index, int attr_index, Object theData) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theData); data = theArray.emptyBytes(); rval = VSgetattr( id, index, attr_index, data); theData = theArray.arrayify( data ); return rval; } public static native boolean VSisattr( int id ) throws HDFException; public static native int VSnattrs( int id ) throws HDFException; /** * @param id IN: the Vdata id * @param index IN: the index of the vdata * @param attr_name IN: String, the name of the attribute * @param data_type IN: int, the number_type of the attribute * @param count IN: the number of values * @param values IN: Strin, the data in an String * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array use the alternative * routine below. */ public static native boolean VSsetattr(int id, int index, String attr_name, int data_type, int count, String values) throws HDFException; /** * @param id IN: the Vdata id * @param index IN: the index of the vdata * @param attr_name IN: String, the name of the attribute * @param data_type IN: int, the number_type of the attribute * @param count IN: the number of values * @param values IN: byte[], the data in an array of bytes * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write into a Java array use the alternative * routine below. */ public static native boolean VSsetattr(int id, int index, String attr_name, int data_type, int count, byte[] values) throws HDFException; /** * @param id IN: the Vdata id * @param index IN: the index of the vdata * @param attr_name IN: String, the name of the attribute * @param data_type IN: int, the number_type of the attribute * @param count IN: the number of values * @param theData IN: Object, a Java array of appropriate * type, dimensions, and size. * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the data to a contiguous * array of bytes and then converts writes it. */ public static boolean VSsetattr(int id, int index, String attr_name, int data_type, int count, Object theData) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theData); data = theArray.byteify(); return VSsetattr(id, index, attr_name, data_type, count, data); } /* * @param filename IN: String, the file * @param argv OUT: int[3], the width, height, and interlace mode * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return argv[0] = width, argv[1] = height, argv[2] = interlace */ public static native boolean DF24getdims(String fileName, int[] argv) throws HDFException; public static native boolean DF24reqil(int il) throws HDFException; /** * @param fileName IN: String, the file * @param imagedata OUT: byte[], the image, in an array of * bytes * @param width IN: int, the width of the image * @param height IN: int, the height of the image * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to read into a Java array use the alternative * routine below. * * @return data = the image in an array of bytes */ public static native boolean DF24getimage(String fileName, byte[] imagedata, int width, int height) throws HDFException; /** * @param fileName IN: String, the file * @param theImagedata OUT: Object, the image, in a java * array of appropriate size and type * @param width IN: int, the width of the image * @param height IN: int, the height of the image * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: reads the data as a contiguous * array of bytes and then converts it to an appropriate Java object. * * @return data = the value of the attribute, in an array of Java * objects */ public static boolean DF24getimage(String fileName, Object theImagedata,int width, int height) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theImagedata); data = theArray.emptyBytes(); rval = DF24getimage(fileName, data, width, height); theImagedata = theArray.arrayify( data ); return rval; } public static native short DF24lastref() throws HDFException; public static native boolean DF24restart() throws HDFException; public static native boolean DF24readref(String filename, int ref) throws HDFException; public static native int DF24nimages(String fileName) throws HDFException; /** * @param filename IN: String, the file * @param image IN: byte[], the image, in an array of * bytes * @param width IN: int, the width of the image * @param height IN: int, the height of the image * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array use the alternative * routine below. */ public static native boolean DF24addimage(String filename, byte[] image, int width, int height) throws HDFException; /** * @param filename IN: String, the file * @param theImage IN: Object, the image, in a java * array of appropriate size and type * @param width IN: int, the width of the image * @param height IN: int, the height of the image * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the data into a contiguous * array of bytes and then writes it to the file */ public static boolean DF24addimage(String filename, Object theImage, int width, int height) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theImage); data = theArray.byteify(); return DF24addimage(filename, data, width, height); } /** * @param filename IN: String, the file * @param image IN: byte[], the image, in an array of * bytes * @param width IN: int, the width of the image * @param height IN: int, the height of the image * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array use the alternative * routine below. */ public static native boolean DF24putimage(String filename, byte[] image, int width, int height) throws HDFException; /** * @param filename IN: String, the file * @param theImage IN: Object, the image, in a java * array of appropriate size and type * @param width IN: int, the width of the image * @param height IN: int, the height of the image * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the data into a contiguous * array of bytes and then writes it to the file * */ public static boolean DF24putimage(String filename, Object theImage, int width, int height) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theImage); data = theArray.byteify(); return DF24putimage(filename, data, width, height); } /** * @param type IN: int, the type of compression * @param cinfo IN: HDFCompInfo, the compression parameters * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * */ public static native boolean DF24setcompress(int type, HDFCompInfo cinfo) throws HDFException; public static native boolean DF24setdims(int width, int height) throws HDFException; public static native boolean DF24setil(int il) throws HDFException; /* * @param filename IN: String, the file * @param argv OUT: int[2], the width and height * @param haspalette OUT: boolean[1], has a palette * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return argv[0] = width, argv[1] = height, haspalette[0] = palette */ public static native boolean DFR8getdims(String fileName, int[] argv, boolean[] haspalette) throws HDFException; /** * @param fileName IN: String, the file * @param imagedata OUT: byte[], the image, in an array of * bytes * @param width IN: int, the width of the image * @param height IN: int, the height of the image * @param palette OUT: byte[], the color look up table * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to read into a Java array use the alternative * routine below. * * @return data = imagedata: the image in an array of bytes, * palette: the look up table, in an array of bytes */ public static native boolean DFR8getimage(String fileName, byte[] imagedata, int width, int height, byte[] palette) throws HDFException; /** * @param fileName IN: String, the file * @param theImagedata OUT: Object, the image, in a java * array of appropriate size and type * @param width IN: int, the width of the image * @param height IN: int, the height of the image * @param palette OUT: byte[], the color look up table * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: reads the data as a contiguous * array of bytes and then converts it to an appropriate Java object. * * @return data = theImagedata: the value of the attribute, * in an array of Java objects * palette: the look up table, in an array of bytes */ public static boolean DFR8getimage(String fileName, Object theImagedata,int width, int height, byte[] palette) throws HDFException { byte[] data; boolean rval; HDFArray theArray = new HDFArray(theImagedata); data = theArray.emptyBytes(); rval = DFR8getimage(fileName, data, width, height, palette); theImagedata = theArray.arrayify( data ); return rval; } public static native short DFR8lastref() throws HDFException; public static native boolean DFR8restart() throws HDFException; public static native boolean DFR8readref(String filename, int ref) throws HDFException; public static native int DFR8nimages(String fileName) throws HDFException; /** * @param filename IN: String, the file * @param image IN: byte[], the image, in an array of * bytes * @param width IN: int, the width of the image * @param height IN: int, the height of the image * @param compress IN: short, the type of compression * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array use the alternative * routine below. */ public static native boolean DFR8addimage(String filename, byte[] image, int width, int height, short compress) throws HDFException; /** * @param filename IN: String, the file * @param theImage IN: Object, the image, in a java * array of appropriate size and type * @param width IN: int, the width of the image * @param height IN: int, the height of the image * @param compress IN: short, the type of compression * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the data into a contiguous * array of bytes and then writes it to the file */ public static boolean DFR8addimage(String filename, Object theImage, int width, int height, short compress) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theImage); data = theArray.byteify(); return DFR8addimage(filename, data, width, height, compress); } /** * @param filename IN: String, the file * @param image IN: byte[], the image, in an array of * bytes * @param width IN: int, the width of the image * @param height IN: int, the height of the image * @param compress IN: short, the type of compression * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    NOTE: to write from a Java array use the alternative * routine below. */ public static native boolean DFR8putimage(String filename, byte[] image, int width, int height, short compress) throws HDFException; /** * @param filename IN: String, the file * @param theImage IN: Object, the image, in a java * array of appropriate size and type * @param width IN: int, the width of the image * @param height IN: int, the height of the image * @param compress IN: short, the type of compression * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * *

    Note: converts the data into a contiguous * array of bytes and then writes it to the file */ public static boolean DFR8putimage(String filename, Object theImage, int width, int height, short compress) throws HDFException { byte[] data; HDFArray theArray = new HDFArray(theImage); data = theArray.byteify(); return DFR8putimage(filename, data, width, height, compress); } /** * @param type IN: int, the type of compression * @param cinfo IN: HDFCompInfo, the compression parameters * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * */ public static native boolean DFR8setcompress(int type, HDFCompInfo cinfo) throws HDFException; /** * @param palref OUT: short[1], the HDF ref of the palette * * @exception ncsa.hdf.hdflib.HDFException * should be thrown for errors in the * HDF library call, but is not yet implemented. * * * @return palref[0] = the ref of the palette */ public static native boolean DFR8getpalref(short[] palref) throws HDFException; public static native boolean DFR8setpalette(byte[] palette) throws HDFException; public static native boolean DFR8writeref(String filename, short ref) throws HDFException; //////////////////////////////////////////////////////////////////// // // // New APIs for read data from library // // Using SDreaddata(..., Object buf) requires function calls // // theArray.emptyBytes() and theArray.arrayify( buf), which // // triples the actual memory needed by the data set. // // Using the following APIs solves the problem. // // // //////////////////////////////////////////////////////////////////// public static native boolean SDreaddata_short( int sdsid, int[] start, int[] stride, int[] count, short[] theData ) throws HDFException; public static native boolean SDreaddata_int( int sdsid, int[] start, int[] stride, int[] count, int[] theData ) throws HDFException; public static native boolean SDreaddata_long( int sdsid, int[] start, int[] stride, int[] count, long[] theData ) throws HDFException; public static native boolean SDreaddata_float( int sdsid, int[] start, int[] stride, int[] count, float[] theData ) throws HDFException; public static native boolean SDreaddata_double( int sdsid, int[] start, int[] stride, int[] count, double[] theData ) throws HDFException; /** * New API for hdf-42r1 */ public static native int HCget_config_info(int coder_type) throws HDFException; } jhdf-2.9/ncsa/hdf/hdflib/HDFDeflateCompInfo.java0000644000175000017500000000263212050301061022251 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a container for the parameters to the HDF * DEFLATION compression algorithm. *

    * In this case, the only parameter is the ``level'' of deflation. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFDeflateCompInfo extends HDFNewCompInfo { public int level; public HDFDeflateCompInfo() { ctype = HDFConstants.COMP_CODE_DEFLATE; } public HDFDeflateCompInfo(int l) { ctype = HDFConstants.COMP_CODE_DEFLATE; level = l; } } jhdf-2.9/ncsa/hdf/hdflib/HDFNewCompInfo.java0000644000175000017500000000253312050301061021436 0ustar sylvestresylvestre/**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package ncsa.hdf.hdflib; /** *

    * This class is a generic container for the parameters to the HDF * compressed classes, with the ``new'' encoding. *

    * Compression parameters are expressed as instances of sub-classes * of this type. *

    * For details of the HDF libraries, see the HDF Documentation at: * http://hdf.ncsa.uiuc.edu */ public class HDFNewCompInfo extends HDFCompInfo { public int ctype; /* from COMP_CODE_ENUM */ public HDFNewCompInfo() { ctype = HDFConstants.COMP_CODE_NONE; } ; } jhdf-2.9/ncsa/hdf/view/0000755000175000017500000000000012051203651015613 5ustar sylvestresylvestrejhdf-2.9/ncsa/hdf/view/icons/0000755000175000017500000000000012051203651016726 5ustar sylvestresylvestrejhdf-2.9/ncsa/hdf/view/icons/video.gif0000644000175000017500000000337512050301063020526 0ustar sylvestresylvestreGIF89a \\^ssullnjjleegŽzz{iij÷­ՖiuɨݥۘȪӵwvՖ{ŏzЭ8=DPQG\X[Zhoݢ:tՓ׹ۿܭµ¤}}}vvvsss!, T)SR:UQJR@f3j pزwZ0@\ *1 .ZOlrchG@f   *@A)-@!>B<&@QB F:9pР$xGΖB(}, ~+FqŇt}&+'* vPAAY ,4]A  Zp…">(hoGgLd^K@Ň<A! vߒ0HM|*pEM,\KFOMh K<09L:O(5 \7?8 l9`D 3pM5]3H(aOXpAFD@8s9Dt%ЕK܃M .0 * C - ,Ў;H@ l\hB, )`BnFB t@Z9c@s5/ C1p 50 8PC qO07@ c%ءI&p *M d$M:-Ǣ|,2/ 1ÐK dBh&L0袋-R-ҋ06Te4[ Hq)!EQY@޶8 I#!`QL#GQ@3ё"J9@ $ ;jhdf-2.9/ncsa/hdf/view/icons/blank.gif0000644000175000017500000000010012050301062020465 0ustar sylvestresylvestreGIF89a!,@ڋ޼;jhdf-2.9/ncsa/hdf/view/icons/filenew.gif0000644000175000017500000000022612050301062021040 0ustar sylvestresylvestreGIF89aȖ@,@KIE͹Y'jvAjQJcJo(n\^UJa3gBκ^R6| G^v͍;jhdf-2.9/ncsa/hdf/view/icons/folderclose.gif0000644000175000017500000000016412050301062021711 0ustar sylvestresylvestreGIF89a̙f3333!,@9X0 y"I"C(`DO\T]4s]g. +fRnˠ;jhdf-2.9/ncsa/hdf/view/icons/image.gif0000644000175000017500000000201012050301062020462 0ustar sylvestresylvestreGIF89a{ssZRR911cBBkJcJ){kR{{kJZJ){9{JR޽R91)RZ9ƽsskZJkJ9)ƵRƵJZ!csk)Z9ZJ!!)kkRZZBccBkkBB1!!!B9)!J!kZRc!991)Z!k)kBc)scZ1kJskR99)kB1!kZBcRkJ9)!sssRRZ{c!!Z)ks1kJk{Zsc{sBRR9ZcJ{Zksc9c{!Z{Z{ZckJc{ks{BRcRZcc9ZZs)Bk1RRcJZ{BRsJc)Bs19J9R)JJZ9Js11B{1J!9)c!s{Zc9J)9{)9!)Z)1k!c19{)1s!)s!){!kZ!){{RRcsskkcc{99Jkk11BZZBBcJJ{BBs))c!!R))k!!Z))s!!c)){JR!!s9BckJ)!{!scB91)s)!c)!k!c!k!ZZRRJ{JBs1)Z)!Rkc)!J!J1!s91!B)c9)k1!RcZ{)R!JJBZ)!9)!)JB9R!9!,@ (@ ѢUy3`S" %6d%K&J=-Kxa_GNR;Q7ȋor۸pM0:MQhV$ hI )Ӫ!˹05>|xb|Eg d O`(9³ps 1 cdhlp)'D>Cn'Ypg蠂gJ袇~pl \ HWnE/i(dSvJv6Ҫ HwjتF 0!q/je$˫zkE5@ЁCcBʸưBcȸKK=ca xPbko'xDؐQI;VL<,1OCL !oG#cɨ #rԨL!40|l39s:qCR 4F7(a:fCIC4"C@IfuCHg r V~ t7qwC ;]܀ l1A[)sCLy$ަM ?-ٍ7P1,K:{I꩝9.n;K&10Q

    Zb]uZriC\qu(T%EP)*UЂ‰X@E66 v ;r B/T^p+,"PZB6QCrT 9A Hʀ &:qHP*wֵ2^`qZz8AP ‹у 1n'?a+l:~a_P B>'[HQG[|"K" e! $Mr!c8$HF2dEэK8P%CAVڲd [lF(RNX\@ Vf23yGP@'9"!0x4/ g, AĐገ9Ntsh52L |ajEEB Ѝ!ԠF 04 (5zH(5"ѐF..1 À)Lc:ʔ.4B!Sf-Ỳ:QyRG(PT/<a`V\ࢫ^WqPj1z4>/:f<&@x]j(㰋 l0t(F .X3\C 037ptY!Mf@ iK@b16I np>R\m76AHDKZmn 9p97Z MǨAa "Vw܆LcíiiCp'P^$y`vR n0 `p.BNap#'L [p;jhdf-2.9/ncsa/hdf/view/icons/link.gif0000755000175000017500000000040112050301063020343 0ustar sylvestresylvestreGIF89aνkBƵsk{c1Z,,@pbbH¡C(`80 6`?  1EȀ6u(L0U ΋F'hCgCF`3 +HA"+HQ'X"8: iV 01 -/ !;jhdf-2.9/ncsa/hdf/view/icons/zoomin.gif0000644000175000017500000000032512050301063020723 0ustar sylvestresylvestreGIF89a!,@I4cjt A(TmSuY@p1MFHdWt&9ŖBRE528Y6TwjMWi>A"[UeYZ&V9)e^o7t&b+.0ggiE;jhdf-2.9/ncsa/hdf/view/icons/fileopen.gif0000644000175000017500000000021212050301062021203 0ustar sylvestresylvestreGIF89a!,@OXMDBkUbAN@d+lhsEFM<&oīD EHK;jhdf-2.9/ncsa/hdf/view/icons/chart.gif0000644000175000017500000000165412050301062020516 0ustar sylvestresylvestreGIF89a! ,@,H$H0PA .Lqb\qbÃ*L@1F'%rCD)s$ESxaG= ^Ζ,&D̚!UӑMEZ֕7vO3^D vɑ&'"Kݺ;jhdf-2.9/ncsa/hdf/view/icons/brightness.gif0000644000175000017500000000175712050301063021572 0ustar sylvestresylvestreGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~, 894M!z HCC#Bt\0Å"\!҂.UոīR.Vs(o's#ޤL <#(ɑ\p\4i0U?/ϡ2$u f;L5SG 1{,ґR&jO1g#O[ @w[Yb[l7q&_+.0ddfE;jhdf-2.9/ncsa/hdf/view/icons/dataset.gif0000644000175000017500000000015212050301062021032 0ustar sylvestresylvestreGIF89awN!,@/(F JyLuա$N1(~9¸|;jhdf-2.9/ncsa/hdf/view/icons/imageA.gif0000755000175000017500000000174612050301063020606 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f37B|xju{f-;Pd;jhdf-2.9/ncsa/hdf/view/icons/fileclose.gif0000644000175000017500000000017512050301063021360 0ustar sylvestresylvestreGIF89a!,@BhM!Iɂ4K`Zy](@ H9ӑWh易aS ärɑj&* WM.;jhdf-2.9/ncsa/hdf/view/icons/hdf4.gif0000644000175000017500000000156612050301063020245 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3!,@SFPeˆ † #"ʼnj8Ǐ):(Q!CK~\Yp`B )V"Ʌ5!̆eJ&E:O;jhdf-2.9/ncsa/hdf/view/icons/datasetA.gif0000755000175000017500000000155712050301062021150 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3wN,T HP * C#>l!ĉ#JbƄ=r$EGDpˋ-"A\`N }tXg#;jhdf-2.9/ncsa/hdf/view/icons/first.gif0000644000175000017500000000041112050301063020533 0ustar sylvestresylvestreGIF89azzZ[&' !,@#:PiBNsAL0Kjz (w{`ahXEzt< hXmO?z,W>t vJ"s`PQTgilk927?7 cbe%]HB|{I!;jhdf-2.9/ncsa/hdf/view/icons/hdf.gif0000644000175000017500000000177012050301063020156 0ustar sylvestresylvestreGIF89a |,l$DDD$D܌Ĵ\l,$dt$<ܤ$dDt,ld,||Ԕ,|\\,T̜̤,D $$4lT|ܜԔ<$|TD\$4<4l|,d Tܤ$$ܜ $tDL$DĴl|$ܬ||4t4|ddD\Ԥ , $,|ܜԜ <$\D<l|,d T$$\ь\TL4$T$;T| D̤q=L$QK*#,Ґr0FJZ=Z ua, (10DQ^x1sϥ#Ho%&L aG^F*kb!T٢xaAN! b)! r!~a;&++=#E[ #D`B + L/d>,<!ƢȂB L/L;hGqO=,a!5;* !-mt=/ϳbrǿ3r'(r]S4JCF )E **#/u p!x"=ܠ2.0;V< }!E;CJ0M *BHrsg0M12*A@!ESo=TD@ HW$+vQzX>a.X- H Ns`!0 v 1HA>R'p Lᆊ;tQw,=CSX1A E{@.~t#x;|@8|ьgvH@G@;jhdf-2.9/ncsa/hdf/view/icons/cut.gif0000644000175000017500000000024212050301063020201 0ustar sylvestresylvestreGIF89a!,@Ex0{Iܜbe}y2BkZiWyl7]]KEeABE#+ M:4}nXn]; 3 ;'ٜB9oC {RF=n ;jhdf-2.9/ncsa/hdf/view/icons/folderopen.gif0000644000175000017500000000015512050301062021545 0ustar sylvestresylvestreGIF89a̙f3333!,@2X%08 8kL`(vF9PP=: I%HYA;jhdf-2.9/ncsa/hdf/view/icons/tableA.gif0000755000175000017500000000157512050301063020613 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3?wNvMuL,b H6l  Æ*t@3|ȑamAm$I;ZXѤɒ =2>VF>9ɗ| ,Hl͛8mF۩ೝ 鶳[8T:vs6FeիXo€A&W8] λH Nnr$H8!dȜ}B]49 >oy(WOz1R\YCMi>0`b֭Mc vl2 pn. xqⱾ(R(QKhӒ\aҫ_^e{JP+Qޮ{ |f$)c`9!*B*(EAwf ƄY4MY ͈0;jhdf-2.9/ncsa/hdf/view/icons/question.gif0000644000175000017500000000163012050301063021257 0ustar sylvestresylvestreGIF89a<<ĴLLDD\\,,,4Ԥ44̌DD \\ԼĄ̔Լll$$$,Ԭ44LL<<̼DDttllĔԤ<;p=Tt)p :ATU`@;jhdf-2.9/ncsa/hdf/view/icons/txt.gif0000644000175000017500000000474312050301063020237 0ustar sylvestresylvestreGIF89a00VYiZ^k7;G9Hm8Fi\dx7Fi8Gj`m[^e8Hh;Kl8Gf;Kk1Rh6FX?Pc?OaSf{i~Vam,Lm-Ga4H]/@Q>LZESadw\mZk|[l}MZg`lxrW`inyu}"Gj.D-Lj$PE; ?x(.T$>Ä(yT |x$bibhf<J &=$Q*?Gz)6M; d#!W&sO;^fH"pH& g2D5s  O=z00R K7#g2 0L Oňf͡#*jV 'Oyp r?'H5XS)?&dc+\:B RDuhc.ڤ[OđoYSp!ʘǏJM2 /_0 |D$3 H07r <`C9cH@n؃PI CQ5 W-"qL4Qz >}(Cp#qABp"icS6(5B, @a0Rp>NbxD3F# F@@) @GpY!DL ,D` qX6J1hg>S$$C@yCS3H%&JQ&bFP4Pu0t?X8\\skVLNPPjV"CGo;=J7:)!;jhdf-2.9/ncsa/hdf/view/icons/folderopenA.gif0000755000175000017500000000156412050301062021656 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3,@YH /*k"Jk2fŇ)RI<饣9)s"dDV=O: Ia>ٱi@;jhdf-2.9/ncsa/hdf/view/icons/animation.gif0000755000175000017500000000120512050301062021367 0ustar sylvestresylvestreGIF89aKLVWYZ`anoS1a3cEpHsLvZ]`dnqtx{'(5BQ^myC_lz  --104477AAEEHHOO]]dcggrquuxw{{~~fff333!w,v44ttv5Gu66uRTW[_bgv78uSVZafjv:9UY^env;;X]`dmqvJ?K@AA@hE"ĕ.R!&dPQC c*DPhHW,L`AƒtF:!Å s2# ?40Z\DdemA@%,mtp εЀeDY A ЀX@F!% 8H@i QT,P_*@AMU'tE G|@;Tb`6(,/&(EFN8  D A /23-ĽMDЂGp @ Ppj;ݶ!k G@ [U6T X@^0P*p /G8;/L`L9lK"y(R-P +3xJ,P@8a )(^]Ct a Ȫf@;jhdf-2.9/ncsa/hdf/view/icons/previous.gif0000644000175000017500000000040312050301063021261 0ustar sylvestresylvestreGIF89azzzzzzzzzzzz LL&'zzZ[55!, #h*" ˸0*;t6 ;ƅx<d.ƃ\Ptjy x h)2g dH" C9Kg!nC|nC,odu=kjlCcdB]_`b%<OSUWBDJ)2>K:7<!;jhdf-2.9/ncsa/hdf/view/icons/copy.gif0000644000175000017500000000022212050301063020356 0ustar sylvestresylvestreGIF89a!,WH+2Akr[&wyR( ̀EO먫& sMjy۳7(vS)QׂEk4 jw\"- 셫16X_;jhdf-2.9/ncsa/hdf/view/icons/paste.gif0000644000175000017500000000022112050301062020516 0ustar sylvestresylvestreGIF89a!,@Vx|"-*2,^IdQVWl b,Qe@Ȁ01 Ii؃q-VBpe] wqH;jhdf-2.9/ncsa/hdf/view/icons/foldercloseA.gif0000755000175000017500000000157112050301062022020 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3,@^H5*յ^"zQ˵Xi8cGV&DУÒ;E!'&9$˔OT)ˋ$*fM;jhdf-2.9/ncsa/hdf/view/icons/hdf5.gif0000644000175000017500000000156712050301063020247 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3!,@TFPe[Å Bl(!D:1 C~XcG&3b(% &q%K)#*d$lyp(Ϣ';jhdf-2.9/ncsa/hdf/view/icons/text.gif0000644000175000017500000000157112050301062020377 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3ݛЃHx=ϻ!,@V 8P[XȰ!m >l1B#:͠F +^0!?2ƭ#B K2<1ϕ=} T(P$Kf ;jhdf-2.9/ncsa/hdf/view/icons/datatypeA.gif0000755000175000017500000000167512050301063021340 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3 u*_omvˆwi%b#NmY'9,6Vp~EY̽,KOӉ6!Du˖[vΛg{`=}$msE⾽tn;rC7#8uVNz$LIO^?>>;;:A:996563 300.A...++++)6)''$-$$$##""""!!!!!!*     !,@ 8I"Xag=za1@H.U(\ 2AֲٓR`cخZC4 #!QS.g̓T8LÆzhB++5L.kC() U7qb"C'r*A_<%5Lp!R^1!fQU0&+:#B%V X!=\,a"_MC>6@(uF%PċeT1"'040ڃ F:!%EzQ.Sʊ:Ax2'^YAjRM;Te T@;$5;jhdf-2.9/ncsa/hdf/view/icons/last.gif0000644000175000017500000000041212050301063020350 0ustar sylvestresylvestreGIF89azzZ[&' !, $P㐣(0,2s6ZfF UAEm ah¸`@hf4A hnǯjLp=^`a tmgRUT l[F3+Kq"?8BNO4)<7E*:F@28*!;jhdf-2.9/ncsa/hdf/view/icons/textA.gif0000755000175000017500000000157512050301063020510 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3ݛЃHx=ϻ,b 8P[Xp7m*dp"Dil)-aƍ$ IeEc$i%+ʌ `Ϛ6}n?GR4(S*tD@;jhdf-2.9/ncsa/hdf/view/icons/apps.gif0000644000175000017500000000242312050301063020354 0ustar sylvestresylvestreGIF89a 󿿿ƺȶ-'⣣쑒׍茌񇎔煆脊ꂉڀꀿ~~~}||~~{{zzxx|~wwvvvz{utFtt{~sstuqqvzpqpoootunmqrlopjimohhiigggcafcdd```hl^__\[\\Z`bWW_cV]aU]aTT[`TUUPV[LIQVIQUGOTFLOA?HM>??;DJ99:7788557756655544654443553453332233133022..}**+){&x#u"## heeca _ , @H VX'ÇqH[N{G\bI $M&&\ɲ˗t"%ps$0!1*ht*Ie ɵׯ`@!u1cf˖'@L0aAQQexJ*#%/UH ^`Ly9s~e>wcl&V0hQ+uKeװc˞M۸sf?ln1ƒ\ v#a#"g!zB#@XH0AWq¼GŸ [;ebĆ)n&w%dIgćdctHp1r$.s]Aiܚݗ'gY'pntu5ev?uw4U\:p[0"+dMmلi"K,>8'OD*vjP@;jhdf-2.9/ncsa/hdf/view/icons/table.gif0000644000175000017500000000155712050301063020507 0ustar sylvestresylvestreGIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3?wNvMuL,@T H`6m!CJ(P‡  [E#NC G%\R6~4SF$(4Ţ ;jhdf-2.9/ncsa/hdf/view/icons/url.gif0000644000175000017500000000261212050301062020212 0ustar sylvestresylvestreGIF89a JJJZZZccckkksss{{{޽֭JJ99){1JR֭޽έ){9)s91sB)sB!k9!c9ƥ!Z9!kB{ε!kJR9!ZBΌZB!RBֵΜZJJsksZ!ZRRJZRJB絽Ɣ{Z)ZZJJޜBJ֥ΔkBR{{9cs!JZk{ֵΔޥkkc{{RJ9RBεޭkkcޥΜƄ1!9Z9Zs1RkZ1ss1R9c1Zcޭ祵Ƅ{sRkR{BsJ9cZB{9k)kZZJRsZ{1R{1c)ZBJc9c)R)ZB{9s1s{s9Z1RJ)Z1{9ZsRk!JB9{)k99s!Z)sssZsJcBZ1J{9{!c){ƌJc1J9)s!kJZc祥, @H   ,H` (PQ Vxb7gH)GQEҏ$, eÚaE#-@ 9%DQՒ2:HA `lYC gU$ӆӏXk)>|-<,vc,ؘ*F `֋!f v+  ph .^U=ak 8@"|AĆB;X>[5 }1SE罢wZU\`ؐ)anG"]o Ox5lXQN% ,1(, ,žgiFAH@SY7xՙfiTUMD9`mU8`@ @bj&bPTDl,ьIS`A`f܁  C a442:WPT!xpA48#|!Zd(h!,"I%Xau{\bJ)܀tL+őTqD|p" Bo-2 (Q^dj}20IP0NH,$` G0x(><{S]aR b UD2R,Cea objList) { super(owner, "New Attribute...", true); hObject = obj; newAttribute = null; isH5 = obj.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); helpDialog = null; fileFormat = obj.getFileFormat(); typeChoice = new JComboBox(); typeChoice.addItem("string"); typeChoice.addItem("byte (8-bit)"); typeChoice.addItem("short (16-bit)"); typeChoice.addItem("int (32-bit)"); typeChoice.addItem("unsigned byte (8-bit)"); typeChoice.addItem("unsigned short (16-bit)"); typeChoice.addItem("unsigned int (32-bit)"); typeChoice.addItem("long (64-bit)"); typeChoice.addItem("float"); typeChoice.addItem("double"); if (isH5) { typeChoice.addItem("object reference"); } JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(20, 10, 0, 10)); int w = 400 + (ViewProperties.getFontSize() - 12) * 15; int h = 180 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton okButton = new JButton(" Ok "); okButton.setActionCommand("Ok"); okButton.setMnemonic(KeyEvent.VK_O); JButton cancelButton = new JButton("Cancel"); cancelButton.setActionCommand("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); JButton helpButton = new JButton(" Help "); helpButton.setActionCommand("Show help"); helpButton.setMnemonic(KeyEvent.VK_H); JPanel p = new JPanel(); p.setLayout(new BorderLayout(5, 5)); JPanel p2 = new JPanel(); p2.setLayout(new GridLayout(5, 1, 3, 3)); p2.add(new JLabel("Name: ")); p2.add(new JLabel("Type: ")); p2.add(arrayLengthLabel = new JLabel("Max String Length: ")); p2.add(new JLabel("Value: ")); p2.add(new JLabel("Object List: ")); p.add("West", p2); JPanel typePane = new JPanel(); typePane.setLayout(new BorderLayout()); JPanel h4GattrPane = new JPanel(); h4GattrPane.setLayout(new GridLayout(1, 2, 3, 3)); ButtonGroup bg = new ButtonGroup(); JRadioButton grAttr = new JRadioButton("GR"); JRadioButton sdAttr = new JRadioButton("SD"); bg.add(sdAttr); bg.add(grAttr); sdAttr.setSelected(true); h4GattrPane.add(sdAttr); h4GattrPane.add(grAttr); typePane.add(typeChoice, BorderLayout.CENTER); typePane.add(h4GattrPane, BorderLayout.EAST); h4GrAttrRadioButton = grAttr; p2 = new JPanel(); p2.setLayout(new GridLayout(5, 1, 3, 3)); p2.add(nameField = new JTextField("", 30)); if (!isH5 && (obj instanceof Group) && ((Group) obj).isRoot()) { p2.add(typePane); } else { p2.add(typeChoice); } p2.add(lengthField = new JTextField("1")); p2.add(valueField = new JTextField("0")); p2.add(objChoice = new JComboBox()); p.add("Center", p2); contentPane.add("Center", p); p = new JPanel(); p.add(okButton); p.add(cancelButton); p.add(helpButton); contentPane.add("South", p); typeChoice.addItemListener(this); okButton.addActionListener(this); cancelButton.addActionListener(this); helpButton.addActionListener(this); objChoice.addItemListener(this); objChoice.setEnabled(false); String str; HObject hobj; DefaultMutableTreeNode theNode; while (objList.hasMoreElements()) { theNode = (DefaultMutableTreeNode) objList.nextElement(); hobj = (HObject) theNode.getUserObject(); if (hobj instanceof Group) { if (((Group) hobj).isRoot()) continue; } str = hobj.getFullName(); objChoice.addItem(str); } Point l = owner.getLocation(); l.x += 50; l.y += 80; setLocation(l); pack(); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Ok")) { if (createAttribute()) { dispose(); } } else if (cmd.equals("Cancel")) { newAttribute = null; dispose(); } else if (cmd.equals("Show help")) { if (helpDialog == null) { createHelpDialog(); } helpDialog.setVisible(true); } else if (cmd.equals("Hide help")) { if (helpDialog != null) { helpDialog.setVisible(false); } } } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source.equals(typeChoice)) { int idx = typeChoice.getSelectedIndex(); objChoice.setEnabled(false); lengthField.setEnabled(true); if (idx == 0) { arrayLengthLabel.setText("Max String Length: "); } else if (typeChoice.getSelectedItem().equals("object reference")) { lengthField.setText("1"); lengthField.setEnabled(false); arrayLengthLabel.setText("Array Size: "); objChoice.setEnabled(true); valueField.setText(""); } else { arrayLengthLabel.setText("Array Size: "); } } else if (source.equals(objChoice)) { String objName = (String) objChoice.getSelectedItem(); if (e.getStateChange() != ItemEvent.SELECTED) return; long ref = -1; try { HObject obj = fileFormat.get(objName); ref = obj.getOID()[0]; } catch (Exception ex) {} if (ref > 0) { if (valueField.getText().length() > 1) { valueField.setText(valueField.getText() + "," + ref); StringTokenizer st = new StringTokenizer(valueField.getText(), ","); lengthField.setText(String.valueOf(st.countTokens())); } else { valueField.setText(String.valueOf(ref)); lengthField.setText("1"); } } } } private boolean createAttribute() { int string_length = 0; int tclass = -1, tsize = -1, torder = -1, tsign = -1; Object value = null; String dt = (String) typeChoice.getSelectedItem(); String strValue = valueField.getText(); String attrName = nameField.getText(); if (attrName != null) { attrName = attrName.trim(); } if ((attrName == null) || (attrName.length() < 1)) { JOptionPane.showMessageDialog(this, "No attribute name.", getTitle(), JOptionPane.ERROR_MESSAGE); return false; } String lengthStr = lengthField.getText(); int arraySize = 0; if ((lengthStr == null) || (lengthStr.length() <= 0)) { arraySize = 1; } else { try { arraySize = Integer.parseInt(lengthStr); } catch (Exception e) { arraySize = -1; } } if (arraySize <= 0) { JOptionPane.showMessageDialog(this, "Invalid attribute length.", getTitle(), JOptionPane.ERROR_MESSAGE); return false; } StringTokenizer st = new StringTokenizer(strValue, ","); int count = Math.min(arraySize, st.countTokens()); String theToken; if (dt.startsWith("byte")) { byte[] b = new byte[arraySize]; for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { b[j] = Byte.parseByte(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } } value = b; tclass = Datatype.CLASS_INTEGER; tsize = 1; torder = Datatype.NATIVE; } else if (dt.startsWith("short")) { short[] s = new short[arraySize]; for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { s[j] = Short.parseShort(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } } value = s; tclass = Datatype.CLASS_INTEGER; tsize = 2; torder = Datatype.NATIVE; } else if (dt.startsWith("int")) { int[] i = new int[arraySize]; for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { i[j] = Integer.parseInt(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } } value = i; tclass = Datatype.CLASS_INTEGER; tsize = 4; torder = Datatype.NATIVE; } else if (dt.startsWith("unsigned byte")) { byte[] b = new byte[arraySize]; short sv = 0; for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { sv = Short.parseShort(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } if (sv < 0) { sv = 0; } else if (sv > 255) { sv = 255; } b[j] = (byte) sv; } value = b; tclass = Datatype.CLASS_INTEGER; tsize = 1; torder = Datatype.NATIVE; tsign = Datatype.SIGN_NONE; } else if (dt.startsWith("unsigned short")) { short[] s = new short[arraySize]; int iv = 0; for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { iv = Integer.parseInt(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } if (iv < 0) { iv = 0; } else if (iv > 65535) { iv = 65535; } s[j] = (short) iv; } value = s; tclass = Datatype.CLASS_INTEGER; tsize = 2; torder = Datatype.NATIVE; tsign = Datatype.SIGN_NONE; } else if (dt.startsWith("unsigned int")) { int[] i = new int[arraySize]; long lv = 0; for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { lv = Long.parseLong(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } if (lv < 0) { lv = 0; } if (lv > 4294967295L) { lv = 4294967295L; } i[j] = (int) lv; } value = i; tclass = Datatype.CLASS_INTEGER; tsize = 4; torder = Datatype.NATIVE; tsign = Datatype.SIGN_NONE; } else if (dt.startsWith("long")) { long[] l = new long[arraySize]; for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { l[j] = Long.parseLong(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } } value = l; tclass = Datatype.CLASS_INTEGER; tsize = 8; torder = Datatype.NATIVE; } else if (dt.startsWith("unsigned long")) { long[] i = new long[arraySize]; BigInteger lv = BigInteger.valueOf(0); for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { lv = new BigInteger(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } i[j] = (long) lv.longValue(); } value = i; tclass = Datatype.CLASS_INTEGER; tsize = 8; torder = Datatype.NATIVE; tsign = Datatype.SIGN_NONE; } else if (dt.startsWith("float")) { float[] f = new float[arraySize]; for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { f[j] = Float.parseFloat(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } if (Float.isInfinite(f[j]) || Float.isNaN(f[j])) { f[j] = 0; } } value = f; tclass = Datatype.CLASS_FLOAT; tsize = 4; torder = Datatype.NATIVE; } else if (dt.startsWith("double")) { double[] d = new double[arraySize]; for (int j = 0; j < count; j++) { theToken = st.nextToken().trim(); try { d[j] = Double.parseDouble(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } if (Double.isInfinite(d[j]) || Double.isNaN(d[j])) { d[j] = 0; } } value = d; tclass = Datatype.CLASS_FLOAT; tsize = 8; torder = Datatype.NATIVE; } else if (dt.startsWith("object reference")) { arraySize = st.countTokens(); long[] ref = new long[arraySize]; for (int j = 0; j < arraySize; j++) { theToken = st.nextToken().trim(); try { ref[j] = Long.parseLong(theToken); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } } value = ref; tclass = Datatype.CLASS_REFERENCE; tsize = 8; torder = Datatype.NATIVE; } else if (dt.equals("string")) { try { string_length = Integer.parseInt(lengthField.getText()); } catch (Exception e) { string_length = 0; } // string_length = Math.max(string_length, strValue.length()); if (string_length <= 0) { string_length = DEFAULT_STRING_ATTRIBUTE_LENGTH; } if (strValue.length() > string_length) { strValue = strValue.substring(0, string_length); } tclass = Datatype.CLASS_STRING; tsize = string_length; String[] strArray = { strValue }; value = strArray; if (isH5) { arraySize = 1; // support string type } else { arraySize = string_length; // array of characters } } Datatype datatype = null; try { datatype = fileFormat.createDatatype(tclass, tsize, torder, tsign); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } long[] dims = { arraySize }; Attribute attr = new Attribute(attrName, datatype, dims); attr.setValue(value); try { if (!isH5 && (hObject instanceof Group) && ((Group) hObject).isRoot() && h4GrAttrRadioButton.isSelected()) { // don't find a good way to write HDF4 global // attribute. Use the isExisted to separate the // global attribute is GR or SD hObject.getFileFormat().writeAttribute(hObject, attr, false); if (hObject.getMetadata() == null) { hObject.getMetadata().add(attr); } } else { hObject.writeMetadata(attr); } } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } newAttribute = attr; return true; } /** Creates a dialog to show the help information. */ private void createHelpDialog() { helpDialog = new JDialog(this, "Creation New Attribute"); JPanel contentPane = (JPanel) helpDialog.getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 500 + (ViewProperties.getFontSize() - 12) * 15; int h = 400 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton b = new JButton(" Ok "); b.addActionListener(this); b.setActionCommand("Hide help"); JPanel tmpP = new JPanel(); tmpP.add(b); contentPane.add(tmpP, BorderLayout.SOUTH); JEditorPane infoPane = new JEditorPane(); infoPane.setEditable(false); JScrollPane editorScrollPane = new JScrollPane(infoPane); contentPane.add(editorScrollPane, BorderLayout.CENTER); try { URL url = null, url2 = null, url3 = null; String rootPath = ViewProperties.getViewRoot(); try { url = new URL("file:" + rootPath + "/lib/jhdfview.jar"); } catch (java.net.MalformedURLException mfu) {} try { url2 = new URL("file:" + rootPath + "/"); } catch (java.net.MalformedURLException mfu) {} try { url3 = new URL("file:" + rootPath + "/src/"); } catch (java.net.MalformedURLException mfu) {} URL uu[] = { url, url2, url3 }; URLClassLoader cl = new URLClassLoader(uu); URL u = cl.findResource("ncsa/hdf/view/NewAttrHelp.html"); infoPane.setPage(u); infoPane.addHyperlinkListener(this); } catch (Exception e) { infoPane.setContentType("text/html"); StringBuffer buff = new StringBuffer(); buff.append(""); buff.append(""); buff.append("ERROR: cannot load help information."); buff.append(""); buff.append(""); infoPane.setText(buff.toString()); } Point l = helpDialog.getOwner().getLocation(); l.x += 50; l.y += 80; helpDialog.setLocation(l); helpDialog.validate(); helpDialog.pack(); } public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { JEditorPane pane = (JEditorPane) e.getSource(); if (e instanceof HTMLFrameHyperlinkEvent) { HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent) e; HTMLDocument doc = (HTMLDocument) pane.getDocument(); doc.processHTMLFrameHyperlinkEvent(evt); } else { try { pane.setPage(e.getURL()); } catch (Throwable t) {} } } } /** return the new attribute created. */ public Attribute getAttribute() { return newAttribute; } } jhdf-2.9/ncsa/hdf/view/PaletteView.java0000755000175000017500000000232312050301063020705 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; /** * * The palette view interface for displaying image palette * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public abstract interface PaletteView extends DataView { } jhdf-2.9/ncsa/hdf/view/Chart.java0000755000175000017500000003247512050301063017530 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.Point; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.Array; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.WindowConstants; /** * ChartView displays histogram/line chart of selected row/column of table data * or image. There are two types of chart, histogram and line plot. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class Chart extends JDialog implements ActionListener { /** * */ private static final long serialVersionUID = 6306479533747330357L; /** histogram style chart */ public static final int HISTOGRAM = 0; /** line style chart */ public static final int LINEPLOT = 1; /** The default colors of lines for selected columns */ public static final Color[] LINE_COLORS = { Color.black, Color.red, Color.green.darker(), Color.blue, Color.magenta, Color.pink, Color.yellow, Color.orange, Color.gray, Color.cyan }; /** the data values of line points or histogram */ protected double data[][]; /** Panel that draws plot of data values. */ protected ChartPanel chartP; /** number of data points */ protected int numberOfPoints; /** the style of chart: histogram or line */ private int chartStyle; /** the maximum value of the Y axis */ private double ymax; /** the minimum value of the Y axis */ private double ymin; /** the maximum value of the X axis */ private double xmax; /** the minimum value of the X axis */ private double xmin; /** line labels */ private String lineLabels[]; /** line colors */ private Color lineColors[]; /** number of lines */ private int numberOfLines; /* the data to plot against */ private double[] xData = null; /** * True if the original data is integer (byte, short, integer, long). */ private boolean isInteger; private java.text.DecimalFormat format; /** * Constructs a new ChartView given data and data ranges. *

    * * @param owner * the owner frame of this dialog. * @param title * the title of this dialog. * @param style * the style of the chart. Valid values are: HISTOGRAM and LINE * @param data * the two dimensional data array: data[linenumber][datapoints] * @param xData * the range of the X values, xRange[0]=xmin, xRange[1]=xmax. * @param yRange * the range of the Y values, yRange[0]=ymin, yRange[1]=ymax. */ public Chart(Frame owner, String title, int style, double[][] data, double[] xData, double[] yRange) { super(owner, title, false); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); format = new java.text.DecimalFormat("0.00E0"); if (data == null) { return; } this.chartStyle = style; this.data = data; if (style == HISTOGRAM) { isInteger = true; } else { isInteger = false; } if (xData != null) { int len = xData.length; if (len == 2) { this.xmin = xData[0]; this.xmax = xData[1]; } else { this.xData = xData; xmin = xmax = xData[0]; for (int i = 0; i < len; i++) { if (xData[i] < xmin) { xmin = xData[i]; } if (xData[i] > xmax) { xmax = xData[i]; } } } } else { this.xmin = 1; this.xmax = data[0].length; } this.numberOfLines = Array.getLength(data); this.numberOfPoints = Array.getLength(data[0]); this.lineColors = LINE_COLORS; if (yRange != null) { // data range is given this.ymin = yRange[0]; this.ymax = yRange[1]; } else { // search data range from the data findDataRange(); } if ((ymax < 0.0001) || (ymax > 100000)) { format = new java.text.DecimalFormat("###.####E0#"); } chartP = new ChartPanel(); chartP.setBackground(Color.white); createUI(); } /** * Creates and layouts GUI components. */ protected void createUI() { Window owner = getOwner(); JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); int w = 640 + (ViewProperties.getFontSize() - 12) * 15; int h = 400 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); contentPane.add(chartP, BorderLayout.CENTER); JButton button = new JButton("Close"); button.addActionListener(this); button.setActionCommand("Close"); JPanel tmp = new JPanel(); tmp.add(button); contentPane.add(tmp, BorderLayout.SOUTH); Point l = owner.getLocation(); l.x += 220; l.y += 100; setLocation(l); pack(); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Close")) { dispose(); } } /** Sets the color of each line of a line plot */ public void setLineColors(Color c[]) { lineColors = c; } /** Sets the labels of each line. */ public void setLineLabels(String l[]) { lineLabels = l; } /** Set the data type of the plot data to be integer. */ public void setTypeToInteger() { isInteger = true; } /** find and set the minimum and maximum values of the data */ private void findDataRange() { if (data == null) { return; } ymin = ymax = data[0][0]; for (int i = 0; i < numberOfLines; i++) { for (int j = 0; j < numberOfPoints; j++) { if (data[i][j] < ymin) { ymin = data[i][j]; } if (data[i][j] > ymax) { ymax = data[i][j]; } } } } /** The canvas that paints the data lines. */ private class ChartPanel extends JComponent { private static final long serialVersionUID = -3701826094727309097L; /** * Paints the plot components. */ @Override public void paint(Graphics g) { if (numberOfLines <= 0) { return; // no data } Dimension d = getSize(); int gap = 20; int xgap = 2 * gap; int ygap = 2 * gap; int legendSpace = 0; if ((chartStyle == LINEPLOT) && (lineLabels != null)) { legendSpace = 60; } int h = d.height - gap; int w = d.width - (3 * gap + legendSpace); int xnpoints = Math.min(10, numberOfPoints - 1); int ynpoints = 10; // draw the X axis g.drawLine(xgap, h, w + xgap, h); // draw the Y axis g.drawLine(ygap, h, ygap, 0); // draw x labels double xp = 0, x = xmin; double dw = (double) w / (double) xnpoints; double dx = (xmax - xmin) / xnpoints; boolean gtOne = (dx >= 1); for (int i = 0; i <= xnpoints; i++) { x = xmin + i * dx; xp = xgap + i * dw; g.drawLine((int) xp, h, (int) xp, h - 5); if (gtOne) { g .drawString(String.valueOf((int) x), (int) xp - 5, h + gap); } else { g.drawString(String.valueOf(x), (int) xp - 5, h + gap); } } // draw y labels double yp = 0, y = ymin; double dh = (double) h / (double) ynpoints; double dy = (ymax - ymin) / (ynpoints); if (dy > 1) { dy = Math.round(dy * 10.0) / 10.0; } for (int i = 0; i <= ynpoints; i++) { yp = i * dh; y = i * dy + ymin; g.drawLine(ygap, h - (int) yp, ygap + 5, h - (int) yp); if (isInteger) { g.drawString(String.valueOf((int) y), 0, h - (int) yp + 8); } else { g.drawString(format.format(y), 0, h - (int) yp + 8); } } Color c = g.getColor(); double x0, y0, x1, y1; if (chartStyle == LINEPLOT) { dw = (double) w / (double) (numberOfPoints - 1); // use y = a + b* x to calculate pixel positions double b = h / (ymin - ymax); double a = -b * ymax; boolean hasXdata = ((xData != null) && (xData.length >= numberOfPoints)); double xRatio = (1 / (xmax - xmin)) * w; double xD = (xmin / (xmax - xmin)) * w; // draw lines for selected spreadsheet columns for (int i = 0; i < numberOfLines; i++) { if ((lineColors != null) && (lineColors.length >= numberOfLines)) { g.setColor(lineColors[i]); } // set up the line data for drawing one line a time if (hasXdata) { x0 = xgap + xData[0] * xRatio - xD; } else { x0 = xgap; } y0 = a + b * data[i][0]; for (int j = 1; j < numberOfPoints; j++) { if (hasXdata) { x1 = xgap + xData[j] * xRatio - xD; } else { x1 = xgap + j * dw; } y1 = a + b * data[i][j]; g.drawLine((int) x0, (int) y0, (int) x1, (int) y1); x0 = x1; y0 = y1; } // draw line legend if ((lineLabels != null) && (lineLabels.length >= numberOfLines)) { x0 = w + legendSpace; y0 = gap + gap * i; g.drawLine((int) x0, (int) y0, (int) x0 + 7, (int) y0); g .drawString(lineLabels[i], (int) x0 + 10, (int) y0 + 3); } } g.setColor(c); // set the color back to its default // draw a box on the legend if ((lineLabels != null) && (lineLabels.length >= numberOfLines)) { g.drawRect(w + legendSpace - 10, 10, legendSpace, 10 * gap); } } // if (chartStyle == LINEPLOT) else if (chartStyle == HISTOGRAM) { // draw histogram for selected image area xp = xgap; yp = 0; g.setColor(Color.blue); int barWidth = w / numberOfPoints; if (barWidth <= 0) { barWidth = 1; } dw = (double) w / (double) numberOfPoints; for (int j = 0; j < numberOfPoints; j++) { xp = xgap + j * dw; yp = (int) (h * (data[0][j] - ymin) / (ymax - ymin)); g.fillRect((int) xp, (int) (h - yp), barWidth, (int) yp); } g.setColor(c); // set the color back to its default } // else if (chartStyle == HISTOGRAM) } // public void paint(Graphics g) } // private class ChartPanel extends Canvas } jhdf-2.9/ncsa/hdf/view/NewGroupDialog.java0000644000175000017500000004624012050301063021345 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; import ncsa.hdf.object.DataFormat; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; /** * NewGroupDialog shows a message dialog requesting user input for creating a * new HDF4/5 group. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class NewGroupDialog extends JDialog implements ActionListener, ItemListener, KeyListener { private static final long serialVersionUID = 7340860373483987075L; private JTextField nameField; private JTextField compactField; private JTextField indexedField; private JComboBox parentChoice; private JCheckBox useCreationOrder; private JCheckBox setLinkStorage; private JComboBox orderFlags; /** a list of current groups */ private List groupList; private HObject newObject; private FileFormat fileFormat; private final Toolkit toolkit; private int creationOrder; private JPanel useCreationOrderJPanel; private JPanel setLinkStorageJPanel; private JButton moreButton; private JPanel labelPanel; private JPanel textPanel; private JPanel contentPane; private JButton creationOrderHelpButton; private JButton storageTypeHelpButton; private boolean isH5; /** * Constructs NewGroupDialog with specified list of possible parent groups. * * @param owner * the owner of the input * @param pGroup * the parent group which the new group is added to. * @param objs * the list of all objects. */ public NewGroupDialog(Frame owner, Group pGroup, List objs) { super(owner, "New Group...", true); newObject = null; fileFormat = pGroup.getFileFormat(); isH5 = pGroup.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); toolkit = Toolkit.getDefaultToolkit(); parentChoice = new JComboBox(); groupList = new Vector(); Object obj = null; Iterator iterator = objs.iterator(); while (iterator.hasNext()) { obj = iterator.next(); if (obj instanceof Group) { groupList.add((Group)obj); Group g = (Group) obj; if (g.isRoot()) { parentChoice.addItem(HObject.separator); } else { parentChoice.addItem(g.getPath() + g.getName() + HObject.separator); } } } if (pGroup.isRoot()) { parentChoice.setSelectedItem(HObject.separator); } else { parentChoice.setSelectedItem(pGroup.getPath() + pGroup.getName() + HObject.separator); } orderFlags = new JComboBox(); orderFlags.addItem("Tracked"); orderFlags.addItem("Tracked+Indexed"); contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 400 + (ViewProperties.getFontSize() - 12) * 15; int h = 150 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton okButton = new JButton(" Ok "); okButton.setName("OK"); okButton.setActionCommand("Ok"); okButton.setMnemonic(KeyEvent.VK_O); okButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setName("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.setActionCommand("Cancel"); cancelButton.addActionListener(this); moreButton = new JButton("More"); moreButton.setName("More"); moreButton.addActionListener(this); // set OK and CANCEL buttons JPanel buttonPanel = new JPanel(); buttonPanel.add(okButton); buttonPanel.add(cancelButton); contentPane.add(buttonPanel, BorderLayout.SOUTH); // set NAME and PARENT GROUP panel JPanel namePanel = new JPanel(); namePanel.setLayout(new BorderLayout(5, 5)); labelPanel = new JPanel(); textPanel = new JPanel(); if(!isH5){ labelPanel.setLayout(new GridLayout(2, 1)); labelPanel.add(new JLabel("Group name: ")); labelPanel.add(new JLabel("Parent group: ")); textPanel.setLayout(new GridLayout(2, 1)); textPanel.add(nameField = new JTextField()); textPanel.add(parentChoice); } else{ labelPanel.setLayout(new GridLayout(3, 1)); labelPanel.add(new JLabel("Group name: ")); labelPanel.add(new JLabel("Parent group: ")); labelPanel.add(moreButton); //if h5 format then add more button textPanel.setLayout(new GridLayout(3, 1)); textPanel.add(nameField = new JTextField()); textPanel.add(parentChoice); textPanel.add(new JLabel("")); //for more button } nameField.setName("groupname"); creationOrderHelpButton = new JButton(ViewProperties.getHelpIcon()); creationOrderHelpButton.setToolTipText("Help on Creation Order"); creationOrderHelpButton.setMargin(new Insets(0, 0, 0, 0)); creationOrderHelpButton.addActionListener(this); creationOrderHelpButton.setActionCommand("Help on Creation Order"); storageTypeHelpButton = new JButton(ViewProperties.getHelpIcon()); storageTypeHelpButton.setToolTipText("Help on set Link Storage"); storageTypeHelpButton.setMargin(new Insets(0, 0, 0, 0)); storageTypeHelpButton.addActionListener(this); storageTypeHelpButton.setActionCommand("Help on set Link Storage"); namePanel.add(labelPanel, BorderLayout.WEST); useCreationOrderJPanel = new JPanel(); useCreationOrderJPanel.setLayout(new GridLayout(1, 2)); useCreationOrderJPanel.setBorder(new TitledBorder("")); useCreationOrderJPanel.add(useCreationOrder = new JCheckBox("Use Creation Order")); useCreationOrder.addItemListener(this); JPanel orderFlagsJPanel = new JPanel(); orderFlagsJPanel.setLayout(new GridLayout(1, 2)); orderFlagsJPanel.add(new JLabel("Order Flags: ")); orderFlagsJPanel.add(orderFlags); orderFlags.setEnabled(false); useCreationOrderJPanel.add(orderFlagsJPanel); setLinkStorageJPanel = new JPanel(); setLinkStorageJPanel.setLayout(new GridLayout(1, 2)); setLinkStorageJPanel.setBorder(new TitledBorder("")); setLinkStorageJPanel.add(setLinkStorage = new JCheckBox("Set Link Storage")); setLinkStorage.addItemListener(this); JPanel storageTypeJPanel = new JPanel(); storageTypeJPanel.setLayout(new GridLayout(2, 2)); storageTypeJPanel.add(new JLabel("Min Indexed: ")); storageTypeJPanel.add(new JLabel("Max Compact: ")); indexedField = new JTextField(); indexedField.addKeyListener(this); storageTypeJPanel.add(indexedField); indexedField.setDocument(new JTextFieldLimit(5)); indexedField.setText("6"); indexedField.setEnabled(false); compactField = new JTextField(); storageTypeJPanel.add(compactField); compactField.addKeyListener(this); compactField.setDocument(new JTextFieldLimit(5)); compactField.setText("8"); compactField.setEnabled(false); setLinkStorageJPanel.add(storageTypeJPanel); namePanel.add(textPanel, BorderLayout.CENTER); contentPane.add(namePanel, BorderLayout.CENTER); // locate the H5Property dialog Point l = owner.getLocation(); l.x += 250; l.y += 80; setLocation(l); validate(); pack(); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("More")) { moreButton.setText("Less"); int w = 500 + (ViewProperties.getFontSize() - 12) * 15; int h = 280 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); labelPanel.setLayout(new GridLayout(5, 1)); labelPanel.add(creationOrderHelpButton); labelPanel.add(storageTypeHelpButton); textPanel.setLayout(new GridLayout(5, 1)); textPanel.add(useCreationOrderJPanel); textPanel.add(setLinkStorageJPanel); validate(); pack(); } if (cmd.equals("Less")) { moreButton.setText("More"); int w = 400 + (ViewProperties.getFontSize() - 12) * 15; int h = 150 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); labelPanel.setLayout(new GridLayout(3, 1)); labelPanel.remove(creationOrderHelpButton); labelPanel.remove(storageTypeHelpButton); textPanel.setLayout(new GridLayout(3, 1)); textPanel.remove(useCreationOrderJPanel); textPanel.remove(setLinkStorageJPanel); useCreationOrder.setSelected(false); setLinkStorage.setSelected(false); validate(); pack(); } if (cmd.equals("Help on Creation Order")) { final String msg = "Use Creation Order allows the user to set the creation order \n" + "of links in a group, so that tracking, indexing, and iterating over links\n" + "in groups can be possible. \n\n" + "If the order flag Tracked is selected, links in a group can now \n" + "be explicitly tracked by the order that they were created. \n\n" + "If the order flag Tracked+Indexed is selected, links in a group can \n" + "now be explicitly tracked and indexed in the order that they were created. \n\n" + "The default order in which links in a group are listed is alphanumeric-by-name. \n\n\n"; JOptionPane.showMessageDialog(this, msg); } if (cmd.equals("Help on set Link Storage")) { final String msg = "Set Link Storage allows the users to explicitly set the storage \n" + "type of a group to be Compact or Indexed. \n\n" + "Compact Storage: For groups with only a few links, compact link storage\n" + "allows groups containing only a few links to take up much less space \n" + "in the file. \n\n" + "Indexed Storage: For groups with large number of links, indexed link storage \n" + "provides a faster and more scalable method for storing and working with \n" + "large groups containing many links. \n\n" + "The threshold for switching between the compact and indexed storage \n" + "formats is either set to default values or can be set by the user. \n\n" + "Max Compact \n" + "Max Compact is the maximum number of links to store in the group in a \n" + "compact format, before converting the group to the Indexed format. Groups \n" + "that are in compact format and in which the number of links rises above \n" + " this threshold are automatically converted to indexed format. \n\n" + "Min Indexed \n" + "Min Indexed is the minimum number of links to store in the Indexed format. \n" + "Groups which are in indexed format and in which the number of links falls \n" + "below this threshold are automatically converted to compact format. \n\n\n"; JOptionPane.showMessageDialog(this, msg); } if (cmd.equals("Ok")) { newObject = create(); if (newObject != null) { dispose(); } } if (cmd.equals("Cancel")) { newObject = null; dispose(); } } private HObject create() { String name = null; Group pgroup = null; int gcpl = 0; name = nameField.getText(); if (name == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Group name is not specified.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (name.indexOf(HObject.separator) >= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Group name cannot contain path.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } pgroup = groupList.get(parentChoice.getSelectedIndex()); if (pgroup == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Parent group is null.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } Group obj = null; if(orderFlags.isEnabled()){ String order = (String) orderFlags.getSelectedItem(); if(order.equals("Tracked")) creationOrder = Group.CRT_ORDER_TRACKED; else if(order.equals("Tracked+Indexed")) creationOrder = Group.CRT_ORDER_INDEXED; } else creationOrder = 0; if((orderFlags.isEnabled())||(setLinkStorage.isSelected())){ int maxCompact = Integer.parseInt(compactField.getText()); int minDense = Integer.parseInt(indexedField.getText()); if((maxCompact<=0)||(maxCompact>65536)||(minDense>65536)){ toolkit.beep(); JOptionPane.showMessageDialog(this, "Max Compact and Min Indexed should be > 0 and < 65536.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if(maxCompact NewAttr

    How to Create a New Attribute

    The following instructions explain how to create a new attribute. This dialog allows the creation of attributes that are numbers or strings, and 1D arrays of numbers.

    To create an attribute, it is necessary to define the name, type, and number of values or length of string. Then the value(s) can be entered.

    At each step, be sure to type , to make sure the value is accepted by the dialog.

    1) Attribute name

    The name of the attribute is a string. HDF accepts almost any characters in an attribute name. The name can be up to ?? characters long. 

    2) Datatype

    A list of predefined datatypes are given. These are the data types that can be created with this tool, you can only select a datatype from the list.

    The size specifies the size of a single data point in bits. 

    3) Array length

    The length field is used to specify the length of array or string. For numeric data, you can create an attribute with a single value or a one-dimension array of length values.

    For a string attribute, the length is the maximum length of the String.

    As a practical matter, attributes must be relatively small, perhaps a few kilobytes. 

    4) Attribute value

    The value field is used to enter the initial value of the attribute. Be sure to type after entering the value(s).

    Numeric data is interpreted according to the Datatype , using the number formats supported by Java. If the attribute is an array, values of the array must be separated by a comma, for example, 12, 3, 4, 5.

    In the case of a string attribute, the entered text is stored as the string.

    Note that the dialog will accept more values than will fit. In this case, the excess values will not be written to the file, although they may remain visible in the dialog.

    jhdf-2.9/ncsa/hdf/view/NewTableDataDialog.java0000755000175000017500000010427612050301063022101 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.DataFormat; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; /** * NewTableDataDialog shows a message dialog requesting user input for creating * a new HDF4/5 dataset. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class NewTableDataDialog extends JDialog implements ActionListener, ItemListener { private static final long serialVersionUID = -6786877503226330821L; private static final String[] DATATYPE_NAMES = { "byte (8-bit)", // 0 "short (16-bit)", // 1 "int (32-bit)", // 2 "unsigned byte (8-bit)", // 3 "unsigned short (16-bit)", // 4 "unsigned int (32-bit)", // 5 "long (64-bit)", // 6 "float", // 7 "double", // 8 "string", // 9 "enum", // 10 "unsigned long (64-bit)" // 11 }; private FileFormat fileformat; private JComboBox parentChoice, nFieldBox, templateChoice; /** a list of current groups */ private Vector groupList, compoundDSList; private HObject newObject; private final Toolkit toolkit; private int numberOfMembers; private JTable table; private DefaultTableModel tableModel; private RowEditorModel rowEditorModel; private DefaultCellEditor cellEditor; private JTextField nameField, currentSizeField, maxSizeField, chunkSizeField; private JComboBox compressionLevel, rankChoice, memberTypeChoice; private JCheckBox checkCompression; private JRadioButton checkContinguous, checkChunked; /** * Constructs NewTableDataDialog with specified list of possible parent * groups. * * @param owner * the owner of the input * @param pGroup * the parent group which the new group is added to. * @param objs * the list of all objects. */ public NewTableDataDialog(JFrame owner, Group pGroup, List objs) { super(owner, "New Compound Dataset...", true); newObject = null; numberOfMembers = 2; fileformat = pGroup.getFileFormat(); memberTypeChoice = new JComboBox(DATATYPE_NAMES); cellEditor = new DefaultCellEditor(memberTypeChoice); rowEditorModel = new RowEditorModel(numberOfMembers, cellEditor); String[] colNames = { "Name", "Datatype", "Array size / String length / Enum names" }; tableModel = new DefaultTableModel(colNames, numberOfMembers); table = new JTable(tableModel) { private static final long serialVersionUID = 7141605060652738476L; RowEditorModel rm = rowEditorModel; @Override public TableCellEditor getCellEditor(int row, int col) { TableCellEditor cellEditor = rm.getEditor(row); if ((cellEditor == null) || !(col == 1)) { cellEditor = super.getCellEditor(row, col); } return cellEditor; } }; table.setName("CompoundDataset"); table.setRowSelectionAllowed(false); table.setColumnSelectionAllowed(false); // set cell height for large fonts int cellRowHeight = Math.max(16, table.getFontMetrics(table.getFont()).getHeight()); table.setRowHeight(cellRowHeight); toolkit = Toolkit.getDefaultToolkit(); parentChoice = new JComboBox(); String[] memberSizes = new String[100]; for (int i = 0; i < 100; i++) { memberSizes[i] = String.valueOf(i + 1); } nFieldBox = new JComboBox(memberSizes); nFieldBox.setName("numbermembers"); nFieldBox.setEditable(true); nFieldBox.addActionListener(this); nFieldBox.setActionCommand("Change number of members"); nFieldBox.setSelectedItem(String.valueOf(numberOfMembers)); groupList = new Vector(objs.size()); Object obj = null; Iterator iterator = objs.iterator(); compoundDSList = new Vector(objs.size()); while (iterator.hasNext()) { obj = iterator.next(); if (obj instanceof Group) { Group g = (Group) obj; groupList.add(obj); if (g.isRoot()) { parentChoice.addItem(HObject.separator); } else { parentChoice.addItem(g.getPath() + g.getName() + HObject.separator); } } else if (obj instanceof CompoundDS) { compoundDSList.add(obj); } } templateChoice = new JComboBox(compoundDSList); templateChoice.setName("templateChoice"); templateChoice.setSelectedIndex(-1); templateChoice.addItemListener(this); if (pGroup.isRoot()) { parentChoice.setSelectedItem(HObject.separator); } else { parentChoice.setSelectedItem(pGroup.getPath() + pGroup.getName() + HObject.separator); } JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 700 + (ViewProperties.getFontSize() - 12) * 15; int h = 500 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton okButton = new JButton(" Ok "); okButton.setName("OK"); okButton.setActionCommand("Ok"); okButton.setMnemonic(KeyEvent.VK_O); okButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setName("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.setActionCommand("Cancel"); cancelButton.addActionListener(this); // set NAME and PARENT GROUP panel JPanel namePanel = new JPanel(); namePanel.setLayout(new BorderLayout(5, 5)); JPanel tmpP = new JPanel(); tmpP.setLayout(new GridLayout(3, 1)); tmpP.add(new JLabel(" Dataset name: ")); tmpP.add(new JLabel(" Parent group: ")); tmpP.add(new JLabel("Import template: ")); namePanel.add(tmpP, BorderLayout.WEST); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(3, 1)); tmpP.add(nameField = new JTextField()); nameField.setName("datasetname"); tmpP.add(parentChoice); tmpP.add(templateChoice); namePanel.add(tmpP, BorderLayout.CENTER); // set DATATSPACE JPanel spacePanel = new JPanel(); spacePanel.setLayout(new GridLayout(2, 3, 15, 3)); TitledBorder border = new TitledBorder("Dataspace"); border.setTitleColor(Color.blue); spacePanel.setBorder(border); rankChoice = new JComboBox(); for (int i = 1; i < 33; i++) { rankChoice.addItem(String.valueOf(i)); } rankChoice.setSelectedIndex(0); currentSizeField = new JTextField("1"); maxSizeField = new JTextField("0"); spacePanel.add(new JLabel("No. of dimensions")); spacePanel.add(new JLabel("Current size")); spacePanel.add(new JLabel("Max size (-1 for unlimited)")); spacePanel.add(rankChoice); spacePanel.add(currentSizeField); spacePanel.add(maxSizeField); // set storage layout and data compression JPanel layoutPanel = new JPanel(); layoutPanel.setLayout(new BorderLayout()); border = new TitledBorder("Data Layout and Compression"); border.setTitleColor(Color.BLUE); layoutPanel.setBorder(border); checkContinguous = new JRadioButton("Contiguous"); checkContinguous.setSelected(true); checkChunked = new JRadioButton("Chunked"); ButtonGroup bgroup = new ButtonGroup(); bgroup.add(checkChunked); bgroup.add(checkContinguous); chunkSizeField = new JTextField("1"); chunkSizeField.setEnabled(false); checkCompression = new JCheckBox("gzip"); compressionLevel = new JComboBox(); for (int i = 0; i < 10; i++) { compressionLevel.addItem(String.valueOf(i)); } compressionLevel.setSelectedIndex(6); compressionLevel.setEnabled(false); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); tmpP.add(new JLabel("Storage layout: ")); tmpP.add(new JLabel("Compression: ")); layoutPanel.add(tmpP, BorderLayout.WEST); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); JPanel tmpP0 = new JPanel(); tmpP0.setLayout(new GridLayout(1, 2)); tmpP0.add(checkContinguous); JPanel tmpP00 = new JPanel(); tmpP00.setLayout(new GridLayout(1, 3)); tmpP00.add(checkChunked); tmpP00.add(new JLabel(" Size: ")); tmpP00.add(chunkSizeField); tmpP0.add(tmpP00); tmpP.add(tmpP0); tmpP0 = new JPanel(); tmpP0.setLayout(new GridLayout(1, 7)); tmpP0.add(checkCompression); tmpP0.add(new JLabel(" Level: ")); tmpP0.add(compressionLevel); tmpP0.add(new JLabel("")); tmpP0.add(new JLabel("")); tmpP0.add(new JLabel("")); tmpP0.add(new JLabel("")); tmpP.add(tmpP0); layoutPanel.add(tmpP, BorderLayout.CENTER); // add name, space and layout panels tmpP = new JPanel(); tmpP.setLayout(new BorderLayout(5, 5)); tmpP.add(namePanel, BorderLayout.NORTH); tmpP.add(spacePanel, BorderLayout.CENTER); tmpP.add(layoutPanel, BorderLayout.SOUTH); contentPane.add(tmpP, BorderLayout.NORTH); // add field table tmpP = new JPanel(); tmpP.setLayout(new BorderLayout(5, 5)); tmpP0 = new JPanel(); tmpP0.setLayout(new BorderLayout(5, 5)); tmpP0.add(new JLabel(" Number of Members:"), BorderLayout.WEST); tmpP0.add(nFieldBox, BorderLayout.CENTER); tmpP.add(tmpP0, BorderLayout.NORTH); JScrollPane scroller = new JScrollPane(table); border = new TitledBorder("Compound Datatype Properties"); border.setTitleColor(Color.BLUE); tmpP.setBorder(border); tmpP.add(scroller, BorderLayout.CENTER); contentPane.add(tmpP, BorderLayout.CENTER); // set OK and CANCEL buttons JPanel buttonPanel = new JPanel(); buttonPanel.add(okButton); buttonPanel.add(cancelButton); contentPane.add(buttonPanel, BorderLayout.SOUTH); rankChoice.addItemListener(this); checkCompression.addItemListener(this); checkContinguous.addItemListener(this); checkChunked.addItemListener(this); memberTypeChoice.addItemListener(this); // locate the H5Property dialog Point l = owner.getLocation(); l.x += 250; l.y += 120; setLocation(l); validate(); pack(); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Ok")) { try { newObject = createCompoundDS(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } if (newObject != null) { dispose(); } } else if (cmd.equals("Cancel")) { newObject = null; dispose(); (groupList).setSize(0); } else if (cmd.equals("Change number of members")) { int n = 0; try { n = Integer.valueOf((String) nFieldBox.getSelectedItem()).intValue(); } catch (Exception ex) { } if (n == numberOfMembers) { return; } tableModel.setRowCount(n); for (int i = numberOfMembers; i < n; i++) { rowEditorModel.addEditorForRow(i, cellEditor); } numberOfMembers = n; } } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source.equals(rankChoice)) { int rank = rankChoice.getSelectedIndex() + 1; String currentSizeStr = "1"; String maxSizeStr = "0"; for (int i = 1; i < rank; i++) { currentSizeStr += " x 1"; maxSizeStr += " x 0"; } currentSizeField.setText(currentSizeStr); maxSizeField.setText(maxSizeStr); String currentStr = currentSizeField.getText(); int idx = currentStr.lastIndexOf("x"); String chunkStr = "1"; if (rank <= 1) { chunkStr = currentStr; } else { for (int i = 1; i < rank - 1; i++) { chunkStr += " x 1"; } if (idx > 0) { chunkStr += " x " + currentStr.substring(idx + 1); } } chunkSizeField.setText(chunkStr); } else if (source.equals(checkContinguous)) { chunkSizeField.setEnabled(false); } else if (source.equals(checkChunked)) { chunkSizeField.setEnabled(true); String currentStr = currentSizeField.getText(); int idx = currentStr.lastIndexOf("x"); String chunkStr = "1"; int rank = rankChoice.getSelectedIndex() + 1; if (rank <= 1) { chunkStr = currentStr; } else { for (int i = 1; i < rank - 1; i++) { chunkStr += " x 1"; } if (idx > 0) { chunkStr += " x " + currentStr.substring(idx + 1); } } chunkSizeField.setText(chunkStr); } else if (source.equals(checkCompression)) { boolean isCompressed = checkCompression.isSelected(); if (isCompressed) { if (!checkChunked.isSelected()) { String currentStr = currentSizeField.getText(); int idx = currentStr.lastIndexOf("x"); String chunkStr = "1"; int rank = rankChoice.getSelectedIndex() + 1; if (rank <= 1) { chunkStr = currentStr; } else { for (int i = 1; i < rank - 1; i++) { chunkStr += " x 1"; } if (idx > 0) { chunkStr += " x " + currentStr.substring(idx + 1); } } chunkSizeField.setText(chunkStr); } compressionLevel.setEnabled(true); checkContinguous.setEnabled(false); checkChunked.setSelected(true); chunkSizeField.setEnabled(true); } else { compressionLevel.setEnabled(false); checkContinguous.setEnabled(true); } } else if (source.equals(memberTypeChoice)) { String item = (String) memberTypeChoice.getSelectedItem(); if ((item == null) || !item.equals("enum")) { return; } int row = table.getSelectedRow(); table.setValueAt("mb1=0,mb=1,...", row, 2); } else if (source.equals(templateChoice)) { Object obj = templateChoice.getSelectedItem(); if (!(obj instanceof CompoundDS)) { return; } CompoundDS dset = (CompoundDS) obj; int rank = dset.getRank(); if (rank < 1) { dset.init(); } rank = dset.getRank(); rankChoice.setSelectedIndex(rank - 1); long[] dims = dset.getDims(); String[] mNames = dset.getMemberNames(); int[] mOrders = dset.getMemberOrders(); Datatype[] mTypes = dset.getMemberTypes(); String sizeStr = String.valueOf(dims[0]); for (int i = 1; i < rank; i++) { sizeStr += "x" + dims[i]; } currentSizeField.setText(sizeStr); try { dset.getMetadata(); } // get chunking and compression info catch (Exception ex) { } long[] chunks = dset.getChunkSize(); if (chunks != null) { checkChunked.setSelected(true); sizeStr = String.valueOf(chunks[0]); for (int i = 1; i < rank; i++) { sizeStr += "x" + chunks[i]; } chunkSizeField.setText(sizeStr); } String compression = dset.getCompression(); if (compression != null) { int idx = compression.indexOf("GZIP: level = "); int clevel = -1; try { clevel = Integer.parseInt(compression.substring(idx + 14, idx + 15)); } catch (NumberFormatException ex) { clevel = -1; } if (clevel > 0) { checkCompression.setSelected(true); compressionLevel.setSelectedIndex(clevel); } } numberOfMembers = dset.getMemberCount(); nFieldBox.setSelectedIndex(numberOfMembers - 1); tableModel.setRowCount(numberOfMembers); for (int i = 0; i < numberOfMembers; i++) { rowEditorModel.addEditorForRow(i, cellEditor); tableModel.setValueAt(mNames[i], i, 0); int typeIdx = -1; int tclass = mTypes[i].getDatatypeClass(); int tsize = mTypes[i].getDatatypeSize(); int tsigned = mTypes[i].getDatatypeSign(); if (tclass == Datatype.CLASS_ARRAY) { tclass = mTypes[i].getBasetype().getDatatypeClass(); tsize = mTypes[i].getBasetype().getDatatypeSize(); tsigned = mTypes[i].getBasetype().getDatatypeSign(); } if (tclass == Datatype.CLASS_CHAR) { if (tsigned == Datatype.SIGN_NONE) { if (tsize == 1) { typeIdx = 3; } } else { if (tsize == 1) { typeIdx = 0; } } } if (tclass == Datatype.CLASS_INTEGER) { if (tsigned == Datatype.SIGN_NONE) { if (tsize == 1) { typeIdx = 3; } else if (tsize == 2) { typeIdx = 4; } else if (tsize == 4) { typeIdx = 5; } else { typeIdx = 11; } } else { if (tsize == 1) { typeIdx = 0; } else if (tsize == 2) { typeIdx = 1; } else if (tsize == 4) { typeIdx = 2; } else { typeIdx = 6; } } } else if (tclass == Datatype.CLASS_FLOAT) { if (tsize == 4) { typeIdx = 7; } else { typeIdx = 8; } } else if (tclass == Datatype.CLASS_STRING) { typeIdx = 9; } else if (tclass == Datatype.CLASS_ENUM) { typeIdx = 10; } if (typeIdx < 0) { continue; } memberTypeChoice.setSelectedIndex(typeIdx); tableModel.setValueAt(memberTypeChoice.getSelectedItem(), i, 1); if (tclass == Datatype.CLASS_STRING) { tableModel.setValueAt(String.valueOf(tsize), i, 2); } else if (tclass == Datatype.CLASS_ENUM) { tableModel.setValueAt(mTypes[i].getEnumMembers(), i, 2); } else { tableModel.setValueAt(String.valueOf(mOrders[i]), i, 2); } } // for (int i=0; i= 0) && (col > -0)) { TableCellEditor ed = table.getCellEditor(row, col); if (ed != null) { ed.stopCellEditing(); } } maxdims = chunks = null; String dname = nameField.getText(); if ((dname == null) || (dname.length() <= 0)) { throw new IllegalArgumentException("Dataset name is empty"); } Group pgroup = (Group) groupList.get(parentChoice.getSelectedIndex()); if (pgroup == null) { throw new IllegalArgumentException("Invalid parent group"); } int n = table.getRowCount(); if (n <= 0) { return null; } String[] mNames = new String[n]; Datatype[] mDatatypes = new Datatype[n]; int[] mOrders = new int[n]; for (int i = 0; i < n; i++) { String name = (String) table.getValueAt(i, 0); if ((name == null) || (name.length() <= 0)) { throw new IllegalArgumentException("Member name is empty"); } mNames[i] = name; int order = 1; String orderStr = (String) table.getValueAt(i, 2); if (orderStr != null) { try { order = Integer.parseInt(orderStr); } catch (Exception ex) { } } mOrders[i] = order; String typeName = (String) table.getValueAt(i, 1); Datatype type = null; if (DATATYPE_NAMES[0].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_INTEGER, 1, Datatype.NATIVE, Datatype.NATIVE); } else if (DATATYPE_NAMES[1].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_INTEGER, 2, Datatype.NATIVE, Datatype.NATIVE); } else if (DATATYPE_NAMES[2].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_INTEGER, 4, Datatype.NATIVE, Datatype.NATIVE); } else if (DATATYPE_NAMES[3].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_INTEGER, 1, Datatype.NATIVE, Datatype.SIGN_NONE); } else if (DATATYPE_NAMES[4].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_INTEGER, 2, Datatype.NATIVE, Datatype.SIGN_NONE); } else if (DATATYPE_NAMES[5].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_INTEGER, 4, Datatype.NATIVE, Datatype.SIGN_NONE); } else if (DATATYPE_NAMES[6].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_INTEGER, 8, Datatype.NATIVE, Datatype.NATIVE); } else if (DATATYPE_NAMES[7].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_FLOAT, 4, Datatype.NATIVE, Datatype.NATIVE); } else if (DATATYPE_NAMES[8].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_FLOAT, 8, Datatype.NATIVE, Datatype.NATIVE); } else if (DATATYPE_NAMES[9].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_STRING, order, Datatype.NATIVE, Datatype.NATIVE); } else if (DATATYPE_NAMES[10].equals(typeName)) { // enum type = fileformat.createDatatype(Datatype.CLASS_ENUM, 4, Datatype.NATIVE, Datatype.NATIVE); if ((orderStr == null) || (orderStr.length() < 1) || orderStr.endsWith("...")) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid member values: " + orderStr, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } else { type.setEnumMembers(orderStr); } } else if (DATATYPE_NAMES[11].equals(typeName)) { type = fileformat.createDatatype(Datatype.CLASS_INTEGER, 8, Datatype.NATIVE, Datatype.SIGN_NONE); } else { throw new IllegalArgumentException("Invalid data type."); } mDatatypes[i] = type; } // for (int i=0; i= tdimsize) { toolkit.beep(); int status = JOptionPane.showConfirmDialog(this, "Chunk size is equal/greater than the current size. " + "\nAre you sure you want to set chunk size to " + chunkSizeField.getText() + "?", getTitle(), JOptionPane.YES_NO_OPTION); if (status == JOptionPane.NO_OPTION) { return null; } } if (tchunksize == 1) { toolkit.beep(); int status = JOptionPane.showConfirmDialog(this, "Chunk size is one, which may cause large memory overhead for large dataset." + "\nAre you sure you want to set chunk size to " + chunkSizeField.getText() + "?", getTitle(), JOptionPane.YES_NO_OPTION); if (status == JOptionPane.NO_OPTION) { return null; } } } // if (checkChunked.isSelected()) int gzip = 0; if (checkCompression.isSelected()) { gzip = compressionLevel.getSelectedIndex(); } if (checkChunked.isSelected()) { obj = fileformat.createCompoundDS(dname, pgroup, dims, maxdims, chunks, gzip, mNames, mDatatypes, mOrders, null); } else { obj = fileformat .createCompoundDS(dname, pgroup, dims, maxdims, null, -1, mNames, mDatatypes, mOrders, null); } return obj; } /** Returns the new dataset created. */ public DataFormat getObject() { return newObject; } /** Returns the parent group of the new dataset. */ public Group getParentGroup() { return (Group) groupList.get(parentChoice.getSelectedIndex()); } private class RowEditorModel { private Hashtable data; public RowEditorModel() { data = new Hashtable(); } // all rows has the same cell editor public RowEditorModel(int rows, TableCellEditor ed) { data = new Hashtable(); for (int i = 0; i < rows; i++) { data.put(new Integer(i), ed); } } public void addEditorForRow(int row, TableCellEditor e) { data.put(new Integer(row), e); } public void removeEditorForRow(int row) { data.remove(new Integer(row)); } public TableCellEditor getEditor(int row) { return (TableCellEditor) data.get(new Integer(row)); } } } jhdf-2.9/ncsa/hdf/view/DefaultTableView.java0000755000175000017500000044746312050301063021665 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Point; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.DoubleBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.LongBuffer; import java.nio.ShortBuffer; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.BitSet; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.CellEditor; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JViewport; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.CompoundBorder; import javax.swing.border.EtchedBorder; import javax.swing.border.LineBorder; import javax.swing.border.MatteBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ListSelectionEvent; import javax.swing.table.AbstractTableModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; import ncsa.hdf.view.ViewProperties.BITMASK_OP; /** * TableView displays an HDF dataset as a two-dimensional table. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class DefaultTableView extends JInternalFrame implements TableView, ActionListener, MouseListener { private static final long serialVersionUID = -7452459299532863847L; /** * The main HDFView. */ private final ViewManager viewer; /** * Numerical data type. * B = byte array, * S = short array, * I = int array, * J = long array, * F = float array, and * D = double array. */ private char NT = ' '; /** * The Scalar Dataset. */ private Dataset dataset; /** * The value of the dataset. */ private Object dataValue; /** * The table used to hold the table data. */ private JTable table; /** Label to indicate the current cell location. */ private JLabel cellLabel; /** Text field to display the value of of the current cell. */ private JTextArea cellValueField; private boolean isValueChanged; private final Toolkit toolkit; private boolean isReadOnly; private boolean isDisplayTypeChar; private boolean isDataTransposed; private boolean isRegRef; private boolean isObjRef; private final JCheckBoxMenuItem checkFixedDataLength; private int fixedDataLength; private final JCheckBoxMenuItem checkScientificNotation; private final JCheckBoxMenuItem checkHex; private final JCheckBoxMenuItem checkBin; private final DecimalFormat scientificFormat = new DecimalFormat("###.#####E0#"); private final NumberFormat normalFormat = null; // NumberFormat.getInstance(); private NumberFormat numberFormat = normalFormat; private boolean showAsHex = false, showAsBin = false; private final boolean startEditing[] = { false }; private JPopupMenu popupMenu; private enum ViewType { TABLE, IMAGE, TEXT } private ViewType viewType; private JTextField frameField; private long curFrame = 0; private long maxFrame = 1; private Object fillValue = null; private BitSet bitmask; private BITMASK_OP bitmaskOP = BITMASK_OP.EXTRACT; private int binaryOrder; private int indexBase = 0; private static final int FLOAT_BUFFER_SIZE = 524288; private static final int INT_BUFFER_SIZE = 524288; private static final int SHORT_BUFFER_SIZE = 1048576; private static final int LONG_BUFFER_SIZE = 262144; private static final int DOUBLE_BUFFER_SIZE = 262144; private static final int BYTE_BUFFER_SIZE = 2097152; /* the value of the current cell value in editing. */ private Object currentEditingCellValue = null; /** * Constructs an TableView. *

    * * @param theView * the main HDFView. */ public DefaultTableView(ViewManager theView) { this(theView, null); } /** * Constructs an TableView. *

    * * @param theView * the main HDFView. * @param map * the properties on how to show the data. The map is used to * allow applications to pass properties on how to display the * data, such as, transposing data, showing data as character, * applying bitmask, and etc. Predefined keys are listed at * ViewProperties.DATA_VIEW_KEY. */ public DefaultTableView(ViewManager theView, HashMap map) { super(); setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE); viewer = theView; toolkit = Toolkit.getDefaultToolkit(); isValueChanged = false; isReadOnly = false; isRegRef = false; isObjRef = false; viewType = ViewType.TABLE; fixedDataLength = -1; HObject hobject = null; popupMenu = null; bitmask = null; if (ViewProperties.isIndexBase1()) indexBase = 1; checkFixedDataLength = new JCheckBoxMenuItem("Fixed Data Length", false); checkScientificNotation = new JCheckBoxMenuItem("Show Scientific Notation", false); checkHex = new JCheckBoxMenuItem("Show Hexadecimal", false); checkBin = new JCheckBoxMenuItem("Show Binary", false); if (map != null) { hobject = (HObject) map.get(ViewProperties.DATA_VIEW_KEY.OBJECT); bitmask = (BitSet) map.get(ViewProperties.DATA_VIEW_KEY.BITMASK); bitmaskOP = (BITMASK_OP) map.get(ViewProperties.DATA_VIEW_KEY.BITMASKOP); Boolean b = (Boolean) map.get(ViewProperties.DATA_VIEW_KEY.CHAR); if (b != null) isDisplayTypeChar = b.booleanValue(); b = (Boolean) map.get(ViewProperties.DATA_VIEW_KEY.TRANSPOSED); if (b != null) isDataTransposed = b.booleanValue(); b = (Boolean) map.get(ViewProperties.DATA_VIEW_KEY.INDEXBASE1); if (b != null) { if (b.booleanValue()) indexBase = 1; else indexBase = 0; } } if (hobject == null) hobject = (HObject) viewer.getTreeView().getCurrentObject(); if ((hobject == null) || !(hobject instanceof Dataset)) { return; } dataset = (Dataset) hobject; isReadOnly = dataset.getFileFormat().isReadOnly(); long[] dims = dataset.getDims(); long tsize = 1; for (int i = 0; i < dims.length; i++) tsize *= dims[i]; if (dataset.getHeight() <= 0 || dataset.getWidth() <= 0 || tsize <= 0) return; // cannot edit hdf4 vdata if (dataset.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4)) && (dataset instanceof CompoundDS)) { isReadOnly = true; } // disable edit feature for szip compression when encode is not enabled if (!isReadOnly) { String compression = dataset.getCompression(); if ((compression != null) && compression.startsWith("SZIP")) { if (!compression.endsWith("ENCODE_ENABLED")) { isReadOnly = true; } } } Datatype dtype = dataset.getDatatype(); isDisplayTypeChar = (isDisplayTypeChar && (dtype.getDatatypeSize() == 1 || (dtype.getDatatypeClass() == Datatype.CLASS_ARRAY && dtype.getBasetype().getDatatypeClass() == Datatype.CLASS_CHAR))); dataset.setEnumConverted(ViewProperties.isConvertEnum()); // create the table and its columnHeader if (dataset instanceof CompoundDS) { isDataTransposed = false; // disable transpose for compound dataset this.setFrameIcon(ViewProperties.getTableIcon()); table = createTable((CompoundDS) dataset); } else { /* if (dataset instanceof ScalarDS) */ this.setFrameIcon(ViewProperties.getDatasetIcon()); table = createTable((ScalarDS) dataset); if (dtype.getDatatypeClass() == Datatype.CLASS_REFERENCE) { table.addMouseListener(this); if (dtype.getDatatypeSize() > 8) { isReadOnly = true; isRegRef = true; } else isObjRef = true; } } if (table == null) { viewer.showStatus("Creating table failed - " + dataset.getName()); dataset = null; super.dispose(); return; } table.setName("data"); ColumnHeader columnHeaders = new ColumnHeader(table); columnHeaders.setName("columnHeaders"); table.setTableHeader(columnHeaders); table.setCellSelectionEnabled(true); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setGridColor(Color.gray); // add the table to a scroller JScrollPane scrollingTable = new JScrollPane(table); scrollingTable.getVerticalScrollBar().setUnitIncrement(100); scrollingTable.getHorizontalScrollBar().setUnitIncrement(100); // create row headers and add it to the scroller RowHeader rowHeaders = new RowHeader(table, dataset); rowHeaders.setName("rowHeaders"); JViewport viewp = new JViewport(); viewp.add(rowHeaders); viewp.setPreferredSize(rowHeaders.getPreferredSize()); scrollingTable.setRowHeader(viewp); cellLabel = new JLabel(""); cellLabel.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); Dimension dim = cellLabel.getPreferredSize(); dim.width = 75; cellLabel.setPreferredSize(dim); cellLabel.setHorizontalAlignment(JLabel.RIGHT); cellValueField = new JTextArea(); cellValueField.setLineWrap(true); cellValueField.setWrapStyleWord(true); cellValueField.setEditable(false); cellValueField.setBackground(new Color(255, 255, 240)); JScrollPane scrollingcellValue = new JScrollPane(cellValueField); scrollingcellValue.getVerticalScrollBar().setUnitIncrement(50); scrollingcellValue.getHorizontalScrollBar().setUnitIncrement(50); JPanel valuePane = new JPanel(); valuePane.setLayout(new BorderLayout()); valuePane.add(cellLabel, BorderLayout.WEST); valuePane.add(scrollingcellValue, BorderLayout.CENTER); JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, valuePane, scrollingTable); splitPane.setDividerLocation(25); JPanel contentPane = (JPanel) getContentPane(); contentPane.add(splitPane); // set title StringBuffer sb = new StringBuffer("TableView - "); sb.append(hobject.getName()); sb.append(" - "); sb.append(hobject.getPath()); sb.append(" - "); sb.append(dataset.getFile()); setTitle(sb.toString()); // setup subset information int rank = dataset.getRank(); int[] selectedIndex = dataset.getSelectedIndex(); long[] count = dataset.getSelectedDims(); long[] stride = dataset.getStride(); // long[] dims = dataset.getDims(); long[] start = dataset.getStartDims(); int n = Math.min(3, rank); if (rank > 2) { curFrame = start[selectedIndex[2]] + indexBase; maxFrame = dims[selectedIndex[2]]; } sb.append(" [ dims"); sb.append(selectedIndex[0]); for (int i = 1; i < n; i++) { sb.append("x"); sb.append(selectedIndex[i]); } sb.append(", start"); sb.append(start[selectedIndex[0]]); for (int i = 1; i < n; i++) { sb.append("x"); sb.append(start[selectedIndex[i]]); } sb.append(", count"); sb.append(count[selectedIndex[0]]); for (int i = 1; i < n; i++) { sb.append("x"); sb.append(count[selectedIndex[i]]); } sb.append(", stride"); sb.append(stride[selectedIndex[0]]); for (int i = 1; i < n; i++) { sb.append("x"); sb.append(stride[selectedIndex[i]]); } sb.append(" ] "); setJMenuBar(createMenuBar()); viewer.showStatus(sb.toString()); // set cell height for large fonts int cellRowHeight = table.getFontMetrics(table.getFont()).getHeight(); rowHeaders.setRowHeight(cellRowHeight); table.setRowHeight(cellRowHeight); // create popup menu for reg. ref. if (isRegRef || isObjRef) popupMenu = createPopupMenu(); } private JMenuBar createMenuBar() { JMenuBar bar = new JMenuBar(); JButton button; boolean isEditable = !isReadOnly; boolean is3D = (dataset.getRank() > 2); JMenu menu = new JMenu("Table", false); menu.setMnemonic('T'); bar.add(menu); JMenuItem item = new JMenuItem("Export Data to Text File"); item.addActionListener(this); item.setActionCommand("Save table as text"); menu.add(item); JMenu exportAsBinaryMenu = new JMenu("Export Data to Binary File"); if ((dataset instanceof ScalarDS)) { menu.add(exportAsBinaryMenu); } item = new JMenuItem("Native Order"); item.addActionListener(this); item.setActionCommand("Save table as binary Native Order"); exportAsBinaryMenu.add(item); item = new JMenuItem("Little Endian"); item.addActionListener(this); item.setActionCommand("Save table as binary Little Endian"); exportAsBinaryMenu.add(item); item = new JMenuItem("Big Endian"); item.addActionListener(this); item.setActionCommand("Save table as binary Big Endian"); exportAsBinaryMenu.add(item); menu.addSeparator(); item = new JMenuItem("Import Data from Text File"); item.addActionListener(this); item.setActionCommand("Import data from file"); item.setEnabled(isEditable); menu.add(item); item = checkFixedDataLength; item.addActionListener(this); item.setActionCommand("Fixed data length"); if (dataset instanceof ScalarDS) { menu.add(item); } JMenu importFromBinaryMenu = new JMenu("Import Data from Binary File"); if ((dataset instanceof ScalarDS)) { menu.add(importFromBinaryMenu); } item = new JMenuItem("Native Order"); item.addActionListener(this); item.setActionCommand("Order as Native Order"); importFromBinaryMenu.add(item); item = new JMenuItem("Little Endian"); item.addActionListener(this); item.setActionCommand("Order as Little Endian"); importFromBinaryMenu.add(item); item = new JMenuItem("Big Endian"); item.addActionListener(this); item.setActionCommand("Order as Big Endian"); importFromBinaryMenu.add(item); menu.addSeparator(); item = new JMenuItem("Copy"); item.addActionListener(this); item.setActionCommand("Copy data"); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK, true)); menu.add(item); item = new JMenuItem("Paste"); item.addActionListener(this); item.setActionCommand("Paste data"); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_MASK, true)); item.setEnabled(isEditable); menu.add(item); menu.addSeparator(); item = new JMenuItem("Copy to New Dataset"); item.addActionListener(this); item.setActionCommand("Write selection to dataset"); item.setEnabled(isEditable && (dataset instanceof ScalarDS)); menu.add(item); item = new JMenuItem("Save Changes to File"); item.addActionListener(this); item.setActionCommand("Save dataset"); item.setEnabled(isEditable); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, KeyEvent.CTRL_MASK, true)); menu.add(item); menu.addSeparator(); item = new JMenuItem("Select All"); item.addActionListener(this); item.setActionCommand("Select all data"); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK, true)); menu.add(item); menu.addSeparator(); item = new JMenuItem("Show Lineplot"); item.addActionListener(this); item.setActionCommand("Show chart"); menu.add(item); item = new JMenuItem("Show Statistics"); item.addActionListener(this); item.setActionCommand("Show statistics"); menu.add(item); menu.addSeparator(); item = new JMenuItem("Math Conversion"); item.addActionListener(this); item.setActionCommand("Math conversion"); item.setEnabled(isEditable); menu.add(item); menu.addSeparator(); item = checkScientificNotation; item.addActionListener(this); item.setActionCommand("Show scientific notation"); if (dataset instanceof ScalarDS) { menu.add(item); } boolean isInt = (NT == 'B' || NT == 'S' || NT == 'I' || NT == 'J'); item = checkHex; item.addActionListener(this); item.setActionCommand("Show hexadecimal"); if ((dataset instanceof ScalarDS) && isInt) { menu.add(item); } item = checkBin; item.addActionListener(this); item.setActionCommand("Show binary"); if ((dataset instanceof ScalarDS) && isInt) { menu.add(item); } menu.addSeparator(); item = new JMenuItem("Close"); item.addActionListener(this); item.setActionCommand("Close"); menu.add(item); bar.add(new JLabel(" ")); // add icons to the menubar Insets margin = new Insets(0, 2, 0, 2); // chart button button = new JButton(ViewProperties.getChartIcon()); bar.add(button); button.setToolTipText("Line Plot"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Show chart"); if (is3D) { bar.add(new JLabel(" ")); // first button button = new JButton(ViewProperties.getFirstIcon()); bar.add(button); button.setToolTipText("First"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("First page"); // previous button button = new JButton(ViewProperties.getPreviousIcon()); bar.add(button); button.setToolTipText("Previous"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Previous page"); frameField = new JTextField(String.valueOf(curFrame)); frameField.setMaximumSize(new Dimension(50, 30)); bar.add(frameField); frameField.setMargin(margin); frameField.addActionListener(this); frameField.setActionCommand("Go to frame"); JLabel tmpField = new JLabel(String.valueOf(maxFrame), SwingConstants.CENTER); tmpField.setMaximumSize(new Dimension(50, 30)); bar.add(tmpField); // next button button = new JButton(ViewProperties.getNextIcon()); bar.add(button); button.setToolTipText("Next"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Next page"); // last button button = new JButton(ViewProperties.getLastIcon()); bar.add(button); button.setToolTipText("Last"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Last page"); } return bar; } public void actionPerformed(ActionEvent e) { try { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Close")) { dispose(); // terminate the application } else if (cmd.equals("Save table as text")) { try { saveAsText(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog((JFrame) viewer, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.startsWith("Save table as binary")) { if (cmd.equals("Save table as binary Native Order")) binaryOrder = 1; if (cmd.equals("Save table as binary Little Endian")) binaryOrder = 2; if (cmd.equals("Save table as binary Big Endian")) binaryOrder = 3; try { saveAsBinary(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog((JFrame) viewer, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.equals("Copy data")) { copyData(); } else if (cmd.equals("Paste data")) { pasteData(); } else if (cmd.equals("Import data from file")) { String currentDir = dataset.getFileFormat().getParent(); JFileChooser fchooser = new JFileChooser(currentDir); fchooser.setFileFilter(DefaultFileFilter.getFileFilterText()); int returnVal = fchooser.showOpenDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String txtFile = choosedFile.getAbsolutePath(); importTextData(txtFile); } else if (cmd.startsWith("Order as")) { if (cmd.equals("Order as Native Order")) binaryOrder = 1; if (cmd.equals("Order as Little Endian")) binaryOrder = 2; if (cmd.equals("Order as Big Endian")) binaryOrder = 3; importBinaryData(); } else if (cmd.equals("Write selection to dataset")) { JTable jtable = getTable(); if ((jtable.getSelectedColumnCount() <= 0) || (jtable.getSelectedRowCount() <= 0)) { JOptionPane.showMessageDialog(this, "Select table cells to write.", "HDFView", JOptionPane.INFORMATION_MESSAGE); return; } TreeView treeView = viewer.getTreeView(); TreeNode node = viewer.getTreeView().findTreeNode(dataset); Group pGroup = (Group) ((DefaultMutableTreeNode) node.getParent()).getUserObject(); TreeNode root = dataset.getFileFormat().getRootNode(); if (root == null) { return; } Vector list = new Vector(dataset.getFileFormat().getNumberOfMembers() + 5); DefaultMutableTreeNode theNode = null; Enumeration local_enum = ((DefaultMutableTreeNode) root).depthFirstEnumeration(); while (local_enum.hasMoreElements()) { theNode = (DefaultMutableTreeNode) local_enum.nextElement(); list.add(theNode.getUserObject()); } NewDatasetDialog dialog = new NewDatasetDialog((JFrame) viewer, pGroup, list, this); dialog.setVisible(true); HObject obj = (HObject) dialog.getObject(); if (obj != null) { Group pgroup = dialog.getParentGroup(); try { treeView.addObject(obj, pgroup); } catch (Exception ex) {} } list.setSize(0); } else if (cmd.equals("Save dataset")) { try { updateValueInFile(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog((JFrame) viewer, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.equals("Select all data")) { try { selectAll(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog((JFrame) viewer, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.equals("Show chart")) { showLineplot(); } else if (cmd.equals("First page")) { firstPage(); } else if (cmd.equals("Previous page")) { previousPage(); } else if (cmd.equals("Next page")) { nextPage(); } else if (cmd.equals("Last page")) { lastPage(); } else if (cmd.equals("Show statistics")) { try { Object theData = null; theData = getSelectedData(); if (dataset instanceof CompoundDS) { int cols = table.getSelectedColumnCount(); if (cols != 1) { JOptionPane.showMessageDialog(this, "Please select one colunm a time for compound dataset.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } } else if (theData == null) { theData = dataValue; } double[] minmax = new double[2]; double[] stat = new double[2]; Tools.findMinMax(theData, minmax, fillValue); if (Tools.computeStatistics(theData, stat, fillValue) > 0) { String statistics = "Min = " + minmax[0] + "\nMax = " + minmax[1] + "\nMean = " + stat[0] + "\nStandard deviation = " + stat[1]; JOptionPane.showMessageDialog(this, statistics, "Statistics", JOptionPane.INFORMATION_MESSAGE); } theData = null; System.gc(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog((JFrame) viewer, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.equals("Math conversion")) { try { mathConversion(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog((JFrame) viewer, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.startsWith("Go to frame")) { int page = 0; try { page = Integer.parseInt(frameField.getText().trim()) - indexBase; } catch (Exception ex) { page = -1; } gotoPage(page); } else if (cmd.equals("Show scientific notation")) { if (checkScientificNotation.isSelected()) { numberFormat = scientificFormat; checkHex.setSelected(false); checkBin.setSelected(false); showAsHex = false; showAsBin = false; } else numberFormat = normalFormat; this.updateUI(); } else if (cmd.equals("Show hexadecimal")) { showAsHex = checkHex.isSelected(); if (showAsHex) { checkScientificNotation.setSelected(false); checkBin.setSelected(false); showAsBin = false; numberFormat = normalFormat; } this.updateUI(); } else if (cmd.equals("Show binary")) { showAsBin = checkBin.isSelected(); if (showAsBin) { checkScientificNotation.setSelected(false); checkHex.setSelected(false); showAsHex = false; numberFormat = normalFormat; } this.updateUI(); } else if (cmd.equals("Fixed data length")) { if (!checkFixedDataLength.isSelected()) { fixedDataLength = -1; this.updateUI(); return; } String str = JOptionPane.showInputDialog( this, "Enter fixed data length when importing text data\n\n" + "For example, for a text string of \"12345678\"\n\t\tenter 2, the data will be 12, 34, 56, 78\n\t\tenter 4, the data will be 1234, 5678\n", ""); if ((str == null) || (str.length() < 1)) { checkFixedDataLength.setSelected(false); return; } try { fixedDataLength = Integer.parseInt(str); } catch (Exception ex) { fixedDataLength = -1; } if (fixedDataLength < 1) { checkFixedDataLength.setSelected(false); return; } } else if (cmd.startsWith("Show data as")) { // show data pointed by reg. ref. if (cmd.endsWith("table")) viewType = ViewType.TABLE; else if (cmd.endsWith("image")) viewType = ViewType.IMAGE; else viewType = ViewType.TABLE; Object theData = getSelectedData(); if (theData == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "No data selected.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } int len = Array.getLength(theData); for (int i = 0; i < len; i++) { if (isRegRef) showRegRefData((String) Array.get(theData, i)); else if (isObjRef) showObjRefData(Array.getLong(theData, i)); } } } finally { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } // Implementing DataView. public HObject getDataObject() { return dataset; } public void dispose() { if (isValueChanged && !isReadOnly) { int op = JOptionPane.showConfirmDialog(this, "\"" + dataset.getName() + "\" has changed.\n" + "Do you want to save the changes?", getTitle(), JOptionPane.YES_NO_OPTION); if (op == JOptionPane.YES_OPTION) { updateValueInFile(); } else dataset.clearData(); // reload data } if (dataset instanceof ScalarDS) { ScalarDS sds = (ScalarDS) dataset; // reload the data when it is displayed next time // because the display type (table or image) may be // different. if (sds.isImage()) { sds.clearData(); } dataValue = null; table = null; } viewer.removeDataView(this); super.dispose(); } // Implementing DataObserver. private void previousPage() { int rank = dataset.getRank(); if (rank < 3) { return; } long[] start = dataset.getStartDims(); long[] dims = dataset.getDims(); int[] selectedIndex = dataset.getSelectedIndex(); long idx = start[selectedIndex[2]]; if (idx == 0) { return; // current page is the first page } gotoPage(start[selectedIndex[2]] - 1); } // Implementing DataObserver. private void nextPage() { int rank = dataset.getRank(); if (rank < 3) { return; } long[] start = dataset.getStartDims(); int[] selectedIndex = dataset.getSelectedIndex(); long[] dims = dataset.getDims(); long idx = start[selectedIndex[2]]; if (idx == dims[selectedIndex[2]] - 1) { return; // current page is the last page } gotoPage(start[selectedIndex[2]] + 1); } // Implementing DataObserver. private void firstPage() { int rank = dataset.getRank(); if (rank < 3) { return; } long[] start = dataset.getStartDims(); int[] selectedIndex = dataset.getSelectedIndex(); long[] dims = dataset.getDims(); long idx = start[selectedIndex[2]]; if (idx == 0) { return; // current page is the first page } gotoPage(0); } // Implementing DataObserver. private void lastPage() { int rank = dataset.getRank(); if (rank < 3) { return; } long[] start = dataset.getStartDims(); int[] selectedIndex = dataset.getSelectedIndex(); long[] dims = dataset.getDims(); long idx = start[selectedIndex[2]]; if (idx == dims[selectedIndex[2]] - 1) { return; // current page is the last page } gotoPage(dims[selectedIndex[2]] - 1); } // Implementing TableObserver. public JTable getTable() { return table; } // Implementing TableObserver. private void showLineplot() { int[] rows = table.getSelectedRows(); int[] cols = table.getSelectedColumns(); if ((rows == null) || (cols == null) || (rows.length <= 0) || (cols.length <= 0)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Select rows/columns to draw line plot.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } int nrow = table.getRowCount(); int ncol = table.getColumnCount(); LineplotOption lpo = new LineplotOption((JFrame) viewer, "Line Plot Options -- " + dataset.getName(), nrow, ncol); lpo.setVisible(true); int plotType = lpo.getPlotBy(); if (plotType == LineplotOption.NO_PLOT) { return; } boolean isRowPlot = (plotType == LineplotOption.ROW_PLOT); int xIndex = lpo.getXindex(); // figure out to plot data by row or by column // Plot data by rows if all columns are selected and part of // rows are selected, otherwise plot data by column double[][] data = null; int nLines = 0; String title = "Lineplot - " + dataset.getPath() + dataset.getName(); String[] lineLabels = null; double[] yRange = { Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY }; double xData[] = null; if (isRowPlot) { title += " - by row"; nLines = rows.length; if (nLines > 10) { toolkit.beep(); nLines = 10; JOptionPane.showMessageDialog(this, "More than 10 rows are selected.\n" + "The first 10 rows will be displayed.", getTitle(), JOptionPane.WARNING_MESSAGE); } lineLabels = new String[nLines]; data = new double[nLines][cols.length]; double value = 0.0; for (int i = 0; i < nLines; i++) { lineLabels[i] = String.valueOf(rows[i]); for (int j = 0; j < cols.length; j++) { data[i][j] = 0; try { value = Double.parseDouble(table.getValueAt(rows[i], cols[j]).toString()); data[i][j] = value; yRange[0] = Math.min(yRange[0], value); yRange[1] = Math.max(yRange[1], value); } catch (NumberFormatException ex) {} } // for (int j = 0; j < ncols; j++) } // for (int i = 0; i < rows.length; i++) if (xIndex >= 0) { xData = new double[cols.length]; for (int j = 0; j < cols.length; j++) { xData[j] = 0; try { value = Double.parseDouble(table.getValueAt(xIndex, cols[j]).toString()); xData[j] = value; } catch (NumberFormatException ex) {} } } } // if (isRowPlot) else { title += " - by column"; nLines = cols.length; if (nLines > 10) { toolkit.beep(); nLines = 10; JOptionPane.showMessageDialog(this, "More than 10 columns are selected.\n" + "The first 10 columns will be displayed.", getTitle(), JOptionPane.WARNING_MESSAGE); } lineLabels = new String[nLines]; data = new double[nLines][rows.length]; double value = 0.0; for (int j = 0; j < nLines; j++) { lineLabels[j] = table.getColumnName(cols[j]); for (int i = 0; i < rows.length; i++) { data[j][i] = 0; try { value = Double.parseDouble(table.getValueAt(rows[i], cols[j]).toString()); data[j][i] = value; yRange[0] = Math.min(yRange[0], value); yRange[1] = Math.max(yRange[1], value); } catch (NumberFormatException ex) {} } // for (int j=0; j= 0) { xData = new double[rows.length]; for (int j = 0; j < rows.length; j++) { xData[j] = 0; try { value = Double.parseDouble(table.getValueAt(rows[j], xIndex).toString()); xData[j] = value; } catch (NumberFormatException ex) {} } } } // else int n = removeInvalidPlotData(data, xData, yRange); if (n < data[0].length) { double[][] dataNew = new double[data.length][n]; for (int i = 0; i < data.length; i++) System.arraycopy(data[i], 0, dataNew[i], 0, n); data = dataNew; if (xData != null) { double[] xDataNew = new double[n]; System.arraycopy(xData, 0, xDataNew, 0, n); xData = xDataNew; } } // allow to draw a flat line: all values are the same if (yRange[0] == yRange[1]) { yRange[1] += 1; yRange[0] -= 1; } else if (yRange[0] > yRange[1]) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Cannot show line plot for the selected data. \n" + "Please check the data range: (" + yRange[0] + ", " + yRange[1] + ").", getTitle(), JOptionPane.ERROR_MESSAGE); data = null; return; } Chart cv = new Chart((JFrame) viewer, title, Chart.LINEPLOT, data, xData, yRange); cv.setLineLabels(lineLabels); String cname = dataValue.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); if ((dname == 'B') || (dname == 'S') || (dname == 'I') || (dname == 'J')) { cv.setTypeToInteger(); } cv.setVisible(true); } /** * Remove values of NaN, INF from the array. * * @param data * the data array * @param xData * the x-axis data points * @param yRange * the range of data values * @return number of data points in the plot data if successful; otherwise, * returns false. */ private int removeInvalidPlotData(double[][] data, double[] xData, double[] yRange) { int idx = 0; boolean hasInvalid = false; if (data == null || yRange == null) return -1; yRange[0] = Double.POSITIVE_INFINITY; yRange[1] = Double.NEGATIVE_INFINITY; for (int i = 0; i < data[0].length; i++) { hasInvalid = false; for (int j = 0; j < data.length; j++) { hasInvalid = Tools.isNaNINF(data[j][i]); if (xData != null) hasInvalid = hasInvalid || Tools.isNaNINF(xData[i]); if (hasInvalid) break; else { data[j][idx] = data[j][i]; if (xData != null) xData[idx] = xData[i]; yRange[0] = Math.min(yRange[0], data[j][idx]); yRange[1] = Math.max(yRange[1], data[j][idx]); } } if (!hasInvalid) idx++; } return idx; } /** * Returns the selected data values. */ public Object getSelectedData() { if (dataset instanceof CompoundDS) { return getSelectedCompoundData(); } else { return getSelectedScalarData(); } } /** * Returns the selected data values. */ private Object getSelectedScalarData() { Object selectedData = null; int[] selectedRows = table.getSelectedRows(); int[] selectedCols = table.getSelectedColumns(); if (selectedRows == null || selectedRows.length <= 0 || selectedCols == null || selectedCols.length <= 0) { return null; } int size = selectedCols.length * selectedRows.length; // the whole table is selected if ((table.getColumnCount() == selectedCols.length) && (table.getRowCount() == selectedRows.length)) { return dataValue; } selectedData = null; if (isRegRef) { // reg. ref data are stored in strings selectedData = new String[size]; } else { switch (NT) { case 'B': selectedData = new byte[size]; break; case 'S': selectedData = new short[size]; break; case 'I': selectedData = new int[size]; break; case 'J': selectedData = new long[size]; break; case 'F': selectedData = new float[size]; break; case 'D': selectedData = new double[size]; break; default: selectedData = null; break; } } if (selectedData == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unsupported data type.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } int r0 = table.getSelectedRow(); int c0 = table.getSelectedColumn(); int w = table.getColumnCount(); int idx_src = 0; int idx_dst = 0; for (int i = 0; i < selectedRows.length; i++) { for (int j = 0; j < selectedCols.length; j++) { idx_src = selectedRows[i] * w + selectedCols[j]; Array.set(selectedData, idx_dst, Array.get(dataValue, idx_src)); idx_dst++; } } // this only works for continuous cells // for (int i = 0; i < rows; i++) { // idx_src = (r0 + i) * w + c0; // System.arraycopy(dataValue, idx_src, selectedData, idx_dst, cols); // idx_dst += cols; // } return selectedData; } /** * Returns the selected data values. */ private Object getSelectedCompoundData() { Object selectedData = null; int cols = table.getSelectedColumnCount(); int rows = table.getSelectedRowCount(); if ((cols <= 0) || (rows <= 0)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "No data is selected.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } Object colData = null; try { colData = ((List) dataset.getData()).get(table.getSelectedColumn()); } catch (Exception ex) { return null; } int size = Array.getLength(colData); String cName = colData.getClass().getName(); int cIndex = cName.lastIndexOf("["); char nt = ' '; if (cIndex >= 0) { nt = cName.charAt(cIndex + 1); } if (nt == 'B') { selectedData = new byte[size]; } else if (nt == 'S') { selectedData = new short[size]; } else if (nt == 'I') { selectedData = new int[size]; } else if (nt == 'J') { selectedData = new long[size]; } else if (nt == 'F') { selectedData = new float[size]; } else if (nt == 'D') { selectedData = new double[size]; } else { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unsupported data type.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } System.arraycopy(colData, 0, selectedData, 0, size); return selectedData; } /** * Creates a JTable to hold a scalar dataset. */ private JTable createTable(ScalarDS d) { JTable theTable = null; int rows = 0; int cols = 0; int rank = d.getRank(); if (rank <= 0) { try { d.init(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex, "createTable:" + getTitle(), JOptionPane.ERROR_MESSAGE); dataValue = null; return null; } rank = d.getRank(); } long[] dims = d.getSelectedDims(); rows = (int) dims[0]; cols = 1; if (rank > 1) { rows = d.getHeight(); cols = d.getWidth(); } dataValue = null; try { dataValue = d.getData(); if (dataValue == null) { JOptionPane.showMessageDialog(this, "No data read", "ScalarDS createTable:" + getTitle(), JOptionPane.WARNING_MESSAGE); return null; } if (Tools.applyBitmask(dataValue, bitmask, bitmaskOP)) { isReadOnly = true; String opName = "Extract bits "; if (bitmaskOP == ViewProperties.BITMASK_OP.AND) opName = "Apply bitwise AND "; Border border = BorderFactory.createCompoundBorder( BorderFactory.createRaisedBevelBorder(), BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE, 1), opName + bitmask, TitledBorder.RIGHT, TitledBorder.TOP, this.getFont(), Color.RED)); this.setBorder(border); } d.convertFromUnsignedC(); dataValue = d.getData(); if (Array.getLength(dataValue) <= rows) cols = 1; } catch (Throwable ex) { JOptionPane.showMessageDialog(this, ex, "ScalarDS createTable:" + getTitle(), JOptionPane.ERROR_MESSAGE); dataValue = null; } if (dataValue == null) { return null; } fillValue = d.getFillValue(); boolean isUnsigned = d.isUnsigned(); String cName = dataValue.getClass().getName(); int cIndex = cName.lastIndexOf("["); if (cIndex >= 0) { NT = cName.charAt(cIndex + 1); } boolean isVL = cName.startsWith("[Ljava.lang.String;"); // convert numerical data into char // only possible cases are byte[] and short[] (converted from unsigned // byte) if (isDisplayTypeChar && ((NT == 'B') || (NT == 'S'))) { int n = Array.getLength(dataValue); char[] charData = new char[n]; for (int i = 0; i < n; i++) { if (NT == 'B') { charData[i] = (char) Array.getByte(dataValue, i); } else if (NT == 'S') { charData[i] = (char) Array.getShort(dataValue, i); } } dataValue = charData; } else if ((NT == 'B') && dataset.getDatatype().getDatatypeClass() == Datatype.CLASS_ARRAY) { Datatype baseType = dataset.getDatatype().getBasetype(); if (baseType.getDatatypeClass() == Datatype.CLASS_STRING) { dataValue = Dataset.byteToString((byte[]) dataValue, baseType.getDatatypeSize()); } } final String columnNames[] = new String[cols]; final int rowCount = rows; final int colCount = cols; final long[] startArray = dataset.getStartDims(); final long[] strideArray = dataset.getStride(); int[] selectedIndex = dataset.getSelectedIndex(); final int rowStart = (int) startArray[selectedIndex[0]]; final int rowStride = (int) strideArray[selectedIndex[0]]; int start = 0; int stride = 1; if (rank > 1) { start = (int) startArray[selectedIndex[1]]; stride = (int) strideArray[selectedIndex[1]]; } for (int i = 0; i < cols; i++) { columnNames[i] = String.valueOf(start + indexBase + i * stride); } AbstractTableModel tm = new AbstractTableModel() { private static final long serialVersionUID = 254175303655079056L; private final StringBuffer stringBuffer = new StringBuffer(); private final Datatype dtype = dataset.getDatatype(); private final Datatype btype = dtype.getBasetype(); private final int typeSize = dtype.getDatatypeSize(); private final boolean isArray = (dtype.getDatatypeClass() == Datatype.CLASS_ARRAY); private final boolean isStr = (NT == 'L'); private final boolean isInt = (NT == 'B' || NT == 'S' || NT == 'I' || NT == 'J'); private final boolean isUINT64 = (dtype.isUnsigned() && (NT == 'J')); private Object theValue; boolean isNaturalOrder = (dataset.getRank()==1 || (dataset.getSelectedIndex()[0] < dataset.getSelectedIndex()[1])); public int getColumnCount() { return columnNames.length; } public int getRowCount() { return rowCount; } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int column) { if (startEditing[0]) return ""; if (isArray) { // ARRAY dataset int arraySize = dtype.getDatatypeSize() / btype.getDatatypeSize(); stringBuffer.setLength(0); // clear the old string int i0 = (row * colCount + column) * arraySize; int i1 = i0 + arraySize; if (isDisplayTypeChar) { for (int i = i0; i < i1; i++) { stringBuffer.append(Array.getChar(dataValue, i)); if (stringBuffer.length() > 0 && i < (i1 - 1)) stringBuffer.append(", "); } } else { if (isUINT64) { for (int i = i0; i < i1; i++) { Long l = (Long) Array.get(dataValue, i); if (l < 0) { l = (l << 1) >>> 1; BigInteger big1 = new BigInteger("9223372036854775808"); // 2^65 BigInteger big2 = new BigInteger(l.toString()); BigInteger big = big1.add(big2); stringBuffer.append(big.toString()); } else stringBuffer.append(Array.get(dataValue, i)); if (stringBuffer.length() > 0 && i < (i1 - 1)) stringBuffer.append(", "); } } else { for (int i = i0; i < i1; i++) { stringBuffer.append(Array.get(dataValue, i)); if (stringBuffer.length() > 0 && i < (i1 - 1)) stringBuffer.append(", "); } } } theValue = stringBuffer; } else { int index = column * rowCount + row; if (dataset.getRank() > 1) { if ((isDataTransposed && isNaturalOrder) || (!isDataTransposed && !isNaturalOrder)) index = column * rowCount + row; else index = row * colCount + column; } theValue = Array.get(dataValue, index); if (isStr) return theValue; if (isUINT64) { Long l = (Long) theValue; if (l < 0) { l = (l << 1) >>> 1; BigInteger big1 = new BigInteger("9223372036854775808"); // 2^65 BigInteger big2 = new BigInteger(l.toString()); BigInteger big = big1.add(big2); theValue = big.toString(); } } else if (showAsHex && isInt) { // show in Hexadecimal theValue = Long.toHexString(Long.valueOf(theValue.toString())); } else if (showAsBin && isInt) { theValue = Tools.toBinaryString(Long.valueOf(theValue.toString()), typeSize); // theValue = // Long.toBinaryString(Long.valueOf(theValue.toString())); } else if (numberFormat != null) { // show in scientific format theValue = numberFormat.format(theValue); } } return theValue; } // getValueAt(int row, int column) }; theTable = new JTable(tm) { private static final long serialVersionUID = -145476220959400488L; private final Datatype dtype = dataset.getDatatype(); private final boolean isArray = (dtype.getDatatypeClass() == Datatype.CLASS_ARRAY); public boolean isCellEditable(int row, int col) { if (isReadOnly || isDisplayTypeChar || isArray || showAsBin || showAsHex) { return false; } else { return true; } } public boolean editCellAt(int row, int column, java.util.EventObject e) { if (!isCellEditable(row, column)) { return super.editCellAt(row, column, e); } if (e instanceof KeyEvent) { KeyEvent ke = (KeyEvent) e; if (ke.getID() == KeyEvent.KEY_PRESSED) { startEditing[0] = true; } } else if (e instanceof MouseEvent) { MouseEvent me = (MouseEvent) e; int mc = me.getClickCount(); if (mc > 1) { currentEditingCellValue = getValueAt(row, column); } } return super.editCellAt(row, column, e); } public void editingStopped(ChangeEvent e) { int row = getEditingRow(); int col = getEditingColumn(); super.editingStopped(e); startEditing[0] = false; Object source = e.getSource(); if (source instanceof CellEditor) { CellEditor editor = (CellEditor) source; String cellValue = (String) editor.getCellEditorValue(); try { updateValueInMemory(cellValue, row, col); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } // if (source instanceof CellEditor) } public boolean isCellSelected(int row, int column) { if ((getSelectedRow() == row) && (getSelectedColumn() == column)) { cellLabel.setText(String.valueOf(rowStart + indexBase + row * rowStride) + ", " + table.getColumnName(column) + " = "); Object val = getValueAt(row, column); String strVal = null; if (isRegRef) { String reg = (String) val; String oidStr = reg.substring(reg.indexOf(':') + 1, reg.indexOf(' ')); long oid[] = { -1 }; // decode object ID try { oid[0] = Long.valueOf(oidStr); HObject obj = FileFormat.findObject(dataset.getFileFormat(), oid); strVal = obj.getFullName() + " " + reg.substring(reg.indexOf("{")); } catch (Exception ex) { strVal = null; } } else if (isObjRef) { Long ref = (Long) val; long oid[] = { ref.longValue() }; // decode object ID try { HObject obj = FileFormat.findObject(dataset.getFileFormat(), oid); strVal = obj.getFullName(); } catch (Exception ex) { strVal = null; } } if (strVal == null && val != null) strVal = val.toString(); cellValueField.setText(strVal); } return super.isCellSelected(row, column); } }; theTable.setName("ScalarDS"); return theTable; } /** * Creates a JTable to hold a compound dataset. */ private JTable createTable(CompoundDS d) { JTable theTable = null; int rank = d.getRank(); if (rank <= 0) { d.init(); } long[] startArray = d.getStartDims(); long[] strideArray = d.getStride(); int[] selectedIndex = d.getSelectedIndex(); final int rowStart = (int) startArray[selectedIndex[0]]; final int rowStride = (int) strideArray[selectedIndex[0]]; // use lazy convert for large number of strings if (d.getHeight() > 10000) { d.setConvertByteToString(false); } dataValue = null; try { dataValue = d.getData(); } catch (Throwable ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "TableView" + getTitle(), JOptionPane.ERROR_MESSAGE); dataValue = null; } if ((dataValue == null) || !(dataValue instanceof List)) { return null; } final int rows = d.getHeight(); int cols = d.getSelectedMemberCount(); String[] columnNames = new String[cols]; int idx = 0; String[] columnNamesAll = d.getMemberNames(); for (int i = 0; i < columnNamesAll.length; i++) { if (d.isMemberSelected(i)) { columnNames[idx] = columnNamesAll[i]; columnNames[idx] = columnNames[idx].replaceAll(CompoundDS.separator, "->"); idx++; } } String[] subColumnNames = columnNames; int columns = d.getWidth(); if (columns > 1) { // multi-dimension compound dataset subColumnNames = new String[columns * columnNames.length]; int halfIdx = columnNames.length / 2; for (int i = 0; i < columns; i++) { for (int j = 0; j < columnNames.length; j++) { // display column index only once, in the middle of the // compound fields if (j == halfIdx) { subColumnNames[i * columnNames.length + j] = (i + 1) + "\n " + columnNames[j]; } else { subColumnNames[i * columnNames.length + j] = " \n " + columnNames[j]; } } } } final String[] allColumnNames = subColumnNames; AbstractTableModel tm = new AbstractTableModel() { private static final long serialVersionUID = -2176296469630678304L; CompoundDS compound = (CompoundDS) dataset; int orders[] = compound.getSelectedMemberOrders(); Datatype types[] = compound.getSelectedMemberTypes(); StringBuffer stringBuffer = new StringBuffer(); int nFields = ((List) dataValue).size(); int nRows = getRowCount(); int nSubColumns = (nFields > 0) ? getColumnCount() / nFields : 0; public int getColumnCount() { return allColumnNames.length; } public int getRowCount() { return rows; } public String getColumnName(int col) { return allColumnNames[col]; } public Object getValueAt(int row, int col) { if (startEditing[0]) return ""; int fieldIdx = col; int rowIdx = row; if (nSubColumns > 1) { // multi-dimension compound dataset int colIdx = col / nFields; fieldIdx = col - colIdx * nFields; // BUG 573: rowIdx = row * orders[fieldIdx] + colIdx * nRows // * orders[fieldIdx]; rowIdx = row * orders[fieldIdx] * nSubColumns + colIdx * orders[fieldIdx]; ; } else { rowIdx = row * orders[fieldIdx]; } Object colValue = ((List) dataValue).get(fieldIdx); if (colValue == null) { return "Null"; } stringBuffer.setLength(0); // clear the old string boolean isString = (types[fieldIdx].getDatatypeClass() == Datatype.CLASS_STRING); if (isString && (colValue instanceof byte[])) { // strings int strlen = types[fieldIdx].getDatatypeSize(); String str = new String(((byte[]) colValue), rowIdx * strlen, strlen); int idx = str.indexOf('\0'); if (idx > 0) { str = str.substring(0, idx); } stringBuffer.append(str.trim()); } else { // numerical values Datatype dtype = types[fieldIdx]; if (dtype.getDatatypeClass() == Datatype.CLASS_ARRAY) dtype = types[fieldIdx].getBasetype(); boolean isUINT64 = false; if (dtype.isUnsigned()) { String cName = colValue.getClass().getName(); int cIndex = cName.lastIndexOf("["); if (cIndex >= 0) { isUINT64 = (cName.charAt(cIndex + 1) == 'J'); } } for (int i = 0; i < orders[fieldIdx]; i++) { Object theValue = Array.get(colValue, rowIdx + i); if (isUINT64) { Long l = (Long) theValue; if (l < 0) { l = (l << 1) >>> 1; BigInteger big1 = new BigInteger("9223372036854775808"); // 2^65 BigInteger big2 = new BigInteger(l.toString()); BigInteger big = big1.add(big2); theValue = big.toString(); } } if (i > 0) stringBuffer.append(", "); stringBuffer.append(theValue); } } // end of else { return stringBuffer; } }; theTable = new JTable(tm) { private static final long serialVersionUID = 3221288637329958074L; int lastSelectedRow = -1; int lastSelectedColumn = -1; public boolean isCellEditable(int row, int column) { return !isReadOnly; } public boolean editCellAt(int row, int column, java.util.EventObject e) { if (!isCellEditable(row, column)) { return super.editCellAt(row, column, e); } if (e instanceof KeyEvent) { KeyEvent ke = (KeyEvent) e; if (ke.getID() == KeyEvent.KEY_PRESSED) startEditing[0] = true; } else if (e instanceof MouseEvent) { MouseEvent me = (MouseEvent) e; int mc = me.getClickCount(); if (mc > 1) { currentEditingCellValue = getValueAt(row, column); } } return super.editCellAt(row, column, e); } public void editingStopped(ChangeEvent e) { int row = getEditingRow(); int col = getEditingColumn(); super.editingStopped(e); startEditing[0] = false; Object source = e.getSource(); if (source instanceof CellEditor) { CellEditor editor = (CellEditor) source; String cellValue = (String) editor.getCellEditorValue(); try { updateValueInMemory(cellValue, row, col); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } // if (source instanceof CellEditor) } public boolean isCellSelected(int row, int column) { if ((lastSelectedRow == row) && (lastSelectedColumn == column)) { return super.isCellSelected(row, column); } lastSelectedRow = row; lastSelectedColumn = column; if ((getSelectedRow() == row) && (getSelectedColumn() == column)) { cellLabel.setText(String.valueOf(rowStart + indexBase + row * rowStride) + ", " + table.getColumnName(column) + " = "); cellValueField.setText(getValueAt(row, column).toString()); } return super.isCellSelected(row, column); } }; if (columns > 1) { // multi-dimension compound dataset MultiLineHeaderRenderer renderer = new MultiLineHeaderRenderer(columns, columnNames.length); Enumeration local_enum = theTable.getColumnModel().getColumns(); while (local_enum.hasMoreElements()) { ((TableColumn) local_enum.nextElement()).setHeaderRenderer(renderer); } } theTable.setName("CompoundDS"); return theTable; } /* createTable */ private void gotoPage(long idx) { if (dataset.getRank() < 3 || idx == (curFrame - indexBase)) { return; } if (isValueChanged) { updateValueInFile(); } long[] start = dataset.getStartDims(); int[] selectedIndex = dataset.getSelectedIndex(); long[] dims = dataset.getDims(); if ((idx < 0) || (idx >= dims[selectedIndex[2]])) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Frame number must be between" + indexBase + " and " + (dims[selectedIndex[2]] - 1 + indexBase), getTitle(), JOptionPane.ERROR_MESSAGE); return; } start[selectedIndex[2]] = idx; curFrame = idx + indexBase; dataset.clearData(); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { dataValue = dataset.getData(); if (dataset instanceof ScalarDS) { ((ScalarDS) dataset).convertFromUnsignedC(); dataValue = dataset.getData(); } } catch (Exception ex) { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); dataValue = null; JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); return; } setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); frameField.setText(String.valueOf(curFrame)); updateUI(); } /** copy data from the spreadsheet to the system clipboard. */ private void copyData() { StringBuffer sb = new StringBuffer(); int r0 = table.getSelectedRow(); // starting row int c0 = table.getSelectedColumn(); // starting column if ((r0 < 0) || (c0 < 0)) { return; } int nr = table.getSelectedRowCount(); int nc = table.getSelectedColumnCount(); int r1 = r0 + nr; // finish row int c1 = c0 + nc; // finishing column try { for (int i = r0; i < r1; i++) { sb.append(table.getValueAt(i, c0).toString()); for (int j = c0 + 1; j < c1; j++) { sb.append("\t"); sb.append(table.getValueAt(i, j).toString()); } sb.append("\n"); } } catch (java.lang.OutOfMemoryError err) { toolkit.beep(); JOptionPane .showMessageDialog( (JFrame) viewer, "Copying data to system clipboard failed. \nUsing \"export/import data\" for copying/pasting large data.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); StringSelection contents = new StringSelection(sb.toString()); cb.setContents(contents, null); } /** paste data from the system clipboard to the spreadsheet. */ private void pasteData() { int pasteDataFlag = JOptionPane.showConfirmDialog(this, "Do you want to paste selected data ?", this.getTitle(), JOptionPane.YES_NO_OPTION); if (pasteDataFlag == JOptionPane.NO_OPTION) { return; } int cols = table.getColumnCount(); int rows = table.getRowCount(); int r0 = table.getSelectedRow(); int c0 = table.getSelectedColumn(); if (c0 < 0) { c0 = 0; } if (r0 < 0) { r0 = 0; } int r = r0; int c = c0; Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); // Transferable content = cb.getContents(this); String line = ""; try { String s = (String) cb.getData(DataFlavor.stringFlavor); StringTokenizer st = new StringTokenizer(s, "\n"); // read line by line while (st.hasMoreTokens() && (r < rows)) { line = st.nextToken(); if (fixedDataLength < 1) { // separate by delimiter StringTokenizer lt = new StringTokenizer(line, "\t"); while (lt.hasMoreTokens() && (c < cols)) { try { updateValueInMemory(lt.nextToken(), r, c); } catch (Exception ex) { continue; } c++; } r = r + 1; c = c0; } else { // the data has fixed length int n = line.length(); String theVal; for (int i = 0; i < n; i = i + fixedDataLength) { try { theVal = line.substring(i, i + fixedDataLength); updateValueInMemory(theVal, r, c); } catch (Exception ex) { continue; } c++; } } } } catch (Throwable ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } table.updateUI(); } /** * import data values from text file. */ private void importTextData(String fname) { int pasteDataFlag = JOptionPane.showConfirmDialog(this, "Do you want to paste selected data ?", this.getTitle(), JOptionPane.YES_NO_OPTION); if (pasteDataFlag == JOptionPane.NO_OPTION) { return; } int cols = table.getColumnCount(); int rows = table.getRowCount(); int r0 = table.getSelectedRow(); int c0 = table.getSelectedColumn(); if (c0 < 0) { c0 = 0; } if (r0 < 0) { r0 = 0; } // start at the first column for compound datasets if (dataset instanceof CompoundDS) c0 = 0; BufferedReader in = null; try { in = new BufferedReader(new FileReader(fname)); } catch (FileNotFoundException ex) { return; } String line = null; StringTokenizer tokenizer1 = null; try { line = in.readLine(); } catch (IOException ex) { try { in.close(); } catch (IOException ex2) {} return; } String delName = ViewProperties.getDataDelimiter(); String delimiter = ""; // delimiter must include a tab to be consistent with copy/paste for // compound fields if (dataset instanceof CompoundDS) delimiter = "\t"; else { if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_TAB)) { delimiter = "\t"; } else if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_SPACE)) { delimiter = " " + delimiter; } else if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_COMMA)) { delimiter = ","; } else if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_COLON)) { delimiter = ":"; } else if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_SEMI_COLON)) { delimiter = ";"; } } String token = null; int r = r0; int c = c0; while ((line != null) && (r < rows)) { if (fixedDataLength > 0) { // the data has fixed length int n = line.length(); String theVal; for (int i = 0; i < n; i = i + fixedDataLength) { try { theVal = line.substring(i, i + fixedDataLength); updateValueInMemory(theVal, r, c); } catch (Exception ex) { continue; } c++; } } else { try { tokenizer1 = new StringTokenizer(line, delimiter); while (tokenizer1.hasMoreTokens() && (c < cols)) { token = tokenizer1.nextToken(); if (dataset instanceof ScalarDS) { StringTokenizer tokenizer2 = new StringTokenizer(token); while (tokenizer2.hasMoreTokens() && (c < cols)) { updateValueInMemory(tokenizer2.nextToken(), r, c); c++; } } else { updateValueInMemory(token, r, c); c++; } } // while (tokenizer1.hasMoreTokens() && index < size) } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); try { in.close(); } catch (IOException ex2) {} return; } } try { line = in.readLine(); } catch (IOException ex) { line = null; } c = 0; r++; } // while ((line != null) && (r < rows)) try { in.close(); } catch (IOException ex) {} table.updateUI(); } /** * import data values from binary file. */ private void importBinaryData() { String currentDir = dataset.getFileFormat().getParent(); JFileChooser fchooser = new JFileChooser(currentDir); fchooser.setFileFilter(DefaultFileFilter.getFileFilterBinary()); int returnVal = fchooser.showOpenDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); int pasteDataFlag = JOptionPane.showConfirmDialog(this, "Do you want to paste selected data ?", this.getTitle(), JOptionPane.YES_NO_OPTION); if (pasteDataFlag == JOptionPane.NO_OPTION) { return; } getBinaryDatafromFile(fname); } /** Reads data from a binary file into a buffer and updates table. */ private void getBinaryDatafromFile(String fileName) { String fname = fileName; FileInputStream inputFile = null; BufferedInputStream in = null; ByteBuffer byteBuffer = null; try { inputFile = new FileInputStream(fname); long fileSize = inputFile.getChannel().size(); in = new BufferedInputStream(inputFile); Object data = dataset.getData(); int datasetSize = Array.getLength(data); String cname = data.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); if (dname == 'B') { long datasetByteSize = datasetSize; byteBuffer = ByteBuffer.allocate(BYTE_BUFFER_SIZE); if (binaryOrder == 1) byteBuffer.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) byteBuffer.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) byteBuffer.order(ByteOrder.BIG_ENDIAN); int bufferSize = (int) Math.min(fileSize, datasetByteSize); int remainingSize = (int) bufferSize - (BYTE_BUFFER_SIZE); int allocValue = 0; int iterationNumber = 0; byte[] byteArray = new byte[BYTE_BUFFER_SIZE]; do { if (remainingSize <= 0) { allocValue = remainingSize + (BYTE_BUFFER_SIZE); } else { allocValue = (BYTE_BUFFER_SIZE); } in.read(byteBuffer.array(), 0, allocValue); byteBuffer.get(byteArray, 0, allocValue); System.arraycopy(byteArray, 0, dataValue, (iterationNumber * BYTE_BUFFER_SIZE), allocValue); byteBuffer.clear(); remainingSize = remainingSize - (BYTE_BUFFER_SIZE); iterationNumber++; } while (remainingSize > -(BYTE_BUFFER_SIZE)); isValueChanged = true; } else if (dname == 'S') { long datasetShortSize = datasetSize * 2; byteBuffer = ByteBuffer.allocate(SHORT_BUFFER_SIZE * 2); if (binaryOrder == 1) byteBuffer.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) byteBuffer.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) byteBuffer.order(ByteOrder.BIG_ENDIAN); int bufferSize = (int) Math.min(fileSize, datasetShortSize); int remainingSize = (int) bufferSize - (SHORT_BUFFER_SIZE * 2); int allocValue = 0; int iterationNumber = 0; ShortBuffer sb = byteBuffer.asShortBuffer(); short[] shortArray = new short[SHORT_BUFFER_SIZE]; do { if (remainingSize <= 0) { allocValue = remainingSize + (SHORT_BUFFER_SIZE * 2); } else { allocValue = (SHORT_BUFFER_SIZE * 2); } in.read(byteBuffer.array(), 0, allocValue); sb.get(shortArray, 0, allocValue / 2); System.arraycopy(shortArray, 0, dataValue, (iterationNumber * SHORT_BUFFER_SIZE), allocValue / 2); byteBuffer.clear(); sb.clear(); remainingSize = remainingSize - (SHORT_BUFFER_SIZE * 2); iterationNumber++; } while (remainingSize > -(SHORT_BUFFER_SIZE * 2)); isValueChanged = true; } else if (dname == 'I') { long datasetIntSize = datasetSize * 4; byteBuffer = ByteBuffer.allocate(INT_BUFFER_SIZE * 4); if (binaryOrder == 1) byteBuffer.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) byteBuffer.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) byteBuffer.order(ByteOrder.BIG_ENDIAN); int bufferSize = (int) Math.min(fileSize, datasetIntSize); int remainingSize = (int) bufferSize - (INT_BUFFER_SIZE * 4); int allocValue = 0; int iterationNumber = 0; int[] intArray = new int[INT_BUFFER_SIZE]; byte[] tmpBuf = byteBuffer.array(); IntBuffer ib = byteBuffer.asIntBuffer(); do { if (remainingSize <= 0) { allocValue = remainingSize + (INT_BUFFER_SIZE * 4); } else { allocValue = (INT_BUFFER_SIZE * 4); } in.read(tmpBuf, 0, allocValue); ib.get(intArray, 0, allocValue / 4); System.arraycopy(intArray, 0, dataValue, (iterationNumber * INT_BUFFER_SIZE), allocValue / 4); byteBuffer.clear(); ib.clear(); remainingSize = remainingSize - (INT_BUFFER_SIZE * 4); iterationNumber++; } while (remainingSize > -(INT_BUFFER_SIZE * 4)); isValueChanged = true; } else if (dname == 'J') { long datasetLongSize = datasetSize * 8; byteBuffer = ByteBuffer.allocate(LONG_BUFFER_SIZE * 8); if (binaryOrder == 1) byteBuffer.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) byteBuffer.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) byteBuffer.order(ByteOrder.BIG_ENDIAN); int bufferSize = (int) Math.min(fileSize, datasetLongSize); int remainingSize = (int) bufferSize - (LONG_BUFFER_SIZE * 8); int allocValue = 0; int iterationNumber = 0; long[] longArray = new long[LONG_BUFFER_SIZE]; LongBuffer lb = byteBuffer.asLongBuffer(); do { if (remainingSize <= 0) { allocValue = remainingSize + (LONG_BUFFER_SIZE * 8); } else { allocValue = (LONG_BUFFER_SIZE * 8); } in.read(byteBuffer.array(), 0, allocValue); lb.get(longArray, 0, allocValue / 8); System.arraycopy(longArray, 0, dataValue, (iterationNumber * LONG_BUFFER_SIZE), allocValue / 8); byteBuffer.clear(); lb.clear(); remainingSize = remainingSize - (LONG_BUFFER_SIZE * 8); iterationNumber++; } while (remainingSize > -(LONG_BUFFER_SIZE * 8)); isValueChanged = true; } else if (dname == 'F') { long datasetFloatSize = datasetSize * 4; byteBuffer = ByteBuffer.allocate(FLOAT_BUFFER_SIZE * 4); if (binaryOrder == 1) byteBuffer.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) byteBuffer.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) byteBuffer.order(ByteOrder.BIG_ENDIAN); int bufferSize = (int) Math.min(fileSize, datasetFloatSize); int remainingSize = (int) bufferSize - (FLOAT_BUFFER_SIZE * 4); int allocValue = 0; int iterationNumber = 0; FloatBuffer fb = byteBuffer.asFloatBuffer(); float[] floatArray = new float[FLOAT_BUFFER_SIZE]; do { if (remainingSize <= 0) { allocValue = remainingSize + (FLOAT_BUFFER_SIZE * 4); } else { allocValue = (FLOAT_BUFFER_SIZE * 4); } in.read(byteBuffer.array(), 0, allocValue); fb.get(floatArray, 0, allocValue / 4); System.arraycopy(floatArray, 0, dataValue, (iterationNumber * FLOAT_BUFFER_SIZE), allocValue / 4); byteBuffer.clear(); fb.clear(); remainingSize = remainingSize - (FLOAT_BUFFER_SIZE * 4); iterationNumber++; } while (remainingSize > -(FLOAT_BUFFER_SIZE * 4)); isValueChanged = true; } else if (dname == 'D') { long datasetDoubleSize = datasetSize * 8; byteBuffer = ByteBuffer.allocate(DOUBLE_BUFFER_SIZE * 8); if (binaryOrder == 1) byteBuffer.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) byteBuffer.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) byteBuffer.order(ByteOrder.BIG_ENDIAN); int bufferSize = (int) Math.min(fileSize, datasetDoubleSize); int remainingSize = (int) bufferSize - (DOUBLE_BUFFER_SIZE * 8); int allocValue = 0; int iterationNumber = 0; DoubleBuffer db = byteBuffer.asDoubleBuffer(); double[] doubleArray = new double[DOUBLE_BUFFER_SIZE]; do { if (remainingSize <= 0) { allocValue = remainingSize + (DOUBLE_BUFFER_SIZE * 8); } else { allocValue = (DOUBLE_BUFFER_SIZE * 8); } in.read(byteBuffer.array(), 0, allocValue); db.get(doubleArray, 0, allocValue / 8); System.arraycopy(doubleArray, 0, dataValue, (iterationNumber * DOUBLE_BUFFER_SIZE), allocValue / 8); byteBuffer.clear(); db.clear(); remainingSize = remainingSize - (DOUBLE_BUFFER_SIZE * 8); iterationNumber++; } while (remainingSize > -(DOUBLE_BUFFER_SIZE * 8)); isValueChanged = true; } } catch (Exception es) { es.printStackTrace(); } finally { try { in.close(); inputFile.close(); } catch (IOException ex) {} } table.updateUI(); } /** Save data as text. */ private void saveAsText() throws Exception { final JFileChooser fchooser = new JFileChooser(dataset.getFile()); fchooser.setFileFilter(DefaultFileFilter.getFileFilterText()); // fchooser.changeToParentDirectory(); fchooser.setDialogTitle("Save Current Data To Text File --- " + dataset.getName()); File choosedFile = new File(dataset.getName() + ".txt"); fchooser.setSelectedFile(choosedFile); int returnVal = fchooser.showSaveDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); // check if the file is in use List fileList = viewer.getTreeView().getCurrentFiles(); if (fileList != null) { FileFormat theFile = null; Iterator iterator = fileList.iterator(); while (iterator.hasNext()) { theFile = (FileFormat) iterator.next(); if (theFile.getFilePath().equals(fname)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unable to save data to file \"" + fname + "\". \nThe file is being used.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } } } if (choosedFile.exists()) { int newFileFlag = JOptionPane.showConfirmDialog(this, "File exists. Do you want to replace it ?", this.getTitle(), JOptionPane.YES_NO_OPTION); if (newFileFlag == JOptionPane.NO_OPTION) { return; } } PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(choosedFile))); String delName = ViewProperties.getDataDelimiter(); String delimiter = ""; // delimiter must include a tab to be consistent with copy/paste for // compound fields if (dataset instanceof CompoundDS) delimiter = "\t"; if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_TAB)) { delimiter = "\t"; } else if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_SPACE)) { delimiter = " " + delimiter; } else if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_COMMA)) { delimiter = "," + delimiter; } else if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_COLON)) { delimiter = ":" + delimiter; } else if (delName.equalsIgnoreCase(ViewProperties.DELIMITER_SEMI_COLON)) { delimiter = ";" + delimiter; } int cols = table.getColumnCount(); int rows = table.getRowCount(); for (int i = 0; i < rows; i++) { out.print(table.getValueAt(i, 0)); for (int j = 1; j < cols; j++) { out.print(delimiter); out.print(table.getValueAt(i, j)); } out.println(); } out.flush(); out.close(); viewer.showStatus("Data save to: " + fname); } /** Save data as binary. */ private void saveAsBinary() throws Exception { final JFileChooser fchooser = new JFileChooser(dataset.getFile()); fchooser.setFileFilter(DefaultFileFilter.getFileFilterBinary()); // fchooser.changeToParentDirectory(); fchooser.setDialogTitle("Save Current Data To Binary File --- " + dataset.getName()); File choosedFile = new File(dataset.getName() + ".bin"); ; fchooser.setSelectedFile(choosedFile); int returnVal = fchooser.showSaveDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); // check if the file is in use List fileList = viewer.getTreeView().getCurrentFiles(); if (fileList != null) { FileFormat theFile = null; Iterator iterator = fileList.iterator(); while (iterator.hasNext()) { theFile = (FileFormat) iterator.next(); if (theFile.getFilePath().equals(fname)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unable to save data to file \"" + fname + "\". \nThe file is being used.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } } } // check if the file exists if (choosedFile.exists()) { int newFileFlag = JOptionPane.showConfirmDialog(this, "File exists. Do you want to replace it ?", this.getTitle(), JOptionPane.YES_NO_OPTION); if (newFileFlag == JOptionPane.NO_OPTION) { return; } } FileOutputStream outputFile = new FileOutputStream(choosedFile); DataOutputStream out = new DataOutputStream(outputFile); if (dataset instanceof ScalarDS) { Object data = dataset.getData(); String cname = data.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); ByteBuffer bb = null; int size = Array.getLength(data); if (dname == 'B') { byte[] bdata = new byte[size]; bdata = (byte[]) data; bb = ByteBuffer.allocate(BYTE_BUFFER_SIZE); if (binaryOrder == 1) bb.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) bb.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) bb.order(ByteOrder.BIG_ENDIAN); int remainingSize = size - BYTE_BUFFER_SIZE; int allocValue = 0; int iterationNumber = 0; do { if (remainingSize <= 0) { allocValue = remainingSize + BYTE_BUFFER_SIZE; } else { allocValue = BYTE_BUFFER_SIZE; } bb.clear(); bb.put(bdata, (iterationNumber * BYTE_BUFFER_SIZE), allocValue); out.write(bb.array(), 0, allocValue); remainingSize = remainingSize - BYTE_BUFFER_SIZE; iterationNumber++; } while (remainingSize > -BYTE_BUFFER_SIZE); out.flush(); out.close(); } else if (dname == 'S') { short[] sdata = new short[size]; sdata = (short[]) data; bb = ByteBuffer.allocate(SHORT_BUFFER_SIZE * 2); if (binaryOrder == 1) bb.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) bb.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) bb.order(ByteOrder.BIG_ENDIAN); ShortBuffer sb = bb.asShortBuffer(); int remainingSize = size - SHORT_BUFFER_SIZE; int allocValue = 0; int iterationNumber = 0; do { if (remainingSize <= 0) { allocValue = remainingSize + SHORT_BUFFER_SIZE; } else { allocValue = SHORT_BUFFER_SIZE; } bb.clear(); sb.clear(); sb.put(sdata, (iterationNumber * SHORT_BUFFER_SIZE), allocValue); out.write(bb.array(), 0, allocValue * 2); remainingSize = remainingSize - SHORT_BUFFER_SIZE; iterationNumber++; } while (remainingSize > -SHORT_BUFFER_SIZE); out.flush(); out.close(); } else if (dname == 'I') { int[] idata = new int[size]; idata = (int[]) data; bb = ByteBuffer.allocate(INT_BUFFER_SIZE * 4); if (binaryOrder == 1) bb.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) bb.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) bb.order(ByteOrder.BIG_ENDIAN); IntBuffer ib = bb.asIntBuffer(); int remainingSize = size - INT_BUFFER_SIZE; int allocValue = 0; int iterationNumber = 0; do { if (remainingSize <= 0) { allocValue = remainingSize + INT_BUFFER_SIZE; } else { allocValue = INT_BUFFER_SIZE; } bb.clear(); ib.clear(); ib.put(idata, (iterationNumber * INT_BUFFER_SIZE), allocValue); out.write(bb.array(), 0, allocValue * 4); remainingSize = remainingSize - INT_BUFFER_SIZE; iterationNumber++; } while (remainingSize > -INT_BUFFER_SIZE); out.flush(); out.close(); } else if (dname == 'J') { long[] ldata = new long[size]; ldata = (long[]) data; bb = ByteBuffer.allocate(LONG_BUFFER_SIZE * 8); if (binaryOrder == 1) bb.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) bb.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) bb.order(ByteOrder.BIG_ENDIAN); LongBuffer lb = bb.asLongBuffer(); int remainingSize = size - LONG_BUFFER_SIZE; int allocValue = 0; int iterationNumber = 0; do { if (remainingSize <= 0) { allocValue = remainingSize + LONG_BUFFER_SIZE; } else { allocValue = LONG_BUFFER_SIZE; } bb.clear(); lb.clear(); lb.put(ldata, (iterationNumber * LONG_BUFFER_SIZE), allocValue); out.write(bb.array(), 0, allocValue * 8); remainingSize = remainingSize - LONG_BUFFER_SIZE; iterationNumber++; } while (remainingSize > -LONG_BUFFER_SIZE); out.flush(); out.close(); } else if (dname == 'F') { float[] fdata = new float[size]; fdata = (float[]) data; bb = ByteBuffer.allocate(FLOAT_BUFFER_SIZE * 4); if (binaryOrder == 1) bb.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) bb.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) bb.order(ByteOrder.BIG_ENDIAN); FloatBuffer fb = bb.asFloatBuffer(); int remainingSize = size - FLOAT_BUFFER_SIZE; int allocValue = 0; int iterationNumber = 0; do { if (remainingSize <= 0) { allocValue = remainingSize + FLOAT_BUFFER_SIZE; } else { allocValue = FLOAT_BUFFER_SIZE; } bb.clear(); fb.clear(); fb.put(fdata, (iterationNumber * FLOAT_BUFFER_SIZE), allocValue); out.write(bb.array(), 0, allocValue * 4); remainingSize = remainingSize - FLOAT_BUFFER_SIZE; iterationNumber++; } while (remainingSize > -FLOAT_BUFFER_SIZE); out.flush(); out.close(); } else if (dname == 'D') { double[] ddata = new double[size]; ddata = (double[]) data; bb = ByteBuffer.allocate(DOUBLE_BUFFER_SIZE * 8); if (binaryOrder == 1) bb.order(ByteOrder.nativeOrder()); else if (binaryOrder == 2) bb.order(ByteOrder.LITTLE_ENDIAN); else if (binaryOrder == 3) bb.order(ByteOrder.BIG_ENDIAN); DoubleBuffer db = bb.asDoubleBuffer(); int remainingSize = size - DOUBLE_BUFFER_SIZE; int allocValue = 0; int iterationNumber = 0; do { if (remainingSize <= 0) { allocValue = remainingSize + DOUBLE_BUFFER_SIZE; } else { allocValue = DOUBLE_BUFFER_SIZE; } bb.clear(); db.clear(); db.put(ddata, (iterationNumber * DOUBLE_BUFFER_SIZE), allocValue); out.write(bb.array(), 0, allocValue * 8); remainingSize = remainingSize - DOUBLE_BUFFER_SIZE; iterationNumber++; } while (remainingSize > -DOUBLE_BUFFER_SIZE); out.flush(); out.close(); } } viewer.showStatus("Data save to: " + fname); } /** * update dataset value in file. The change will go to file. */ public void updateValueInFile() { if (isReadOnly || showAsBin || showAsHex) { return; } // if (!(dataset instanceof ScalarDS) || !isValueChanged) if (!isValueChanged) { return; } try { dataset.write(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); return; } isValueChanged = false; } /** * Selects all rows, columns, and cells in the table. */ private void selectAll() throws Exception { table.selectAll(); } /** * Converting selected data based on predefined math functions. */ private void mathConversion() throws Exception { if (isReadOnly) { return; } int cols = table.getSelectedColumnCount(); // if (!(dataset instanceof ScalarDS)) return; if ((dataset instanceof CompoundDS) && (cols > 1)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Please select one colunm a time for math conversion for compound dataset.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } Object theData = getSelectedData(); if (theData == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "No data is selected.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } MathConversionDialog dialog = new MathConversionDialog((JFrame) viewer, theData); dialog.setVisible(true); if (dialog.isConverted()) { if (dataset instanceof CompoundDS) { Object colData = null; try { colData = ((List) dataset.getData()).get(table.getSelectedColumn()); } catch (Exception ex) {} if (colData != null) { int size = Array.getLength(theData); System.arraycopy(theData, 0, colData, 0, size); } } else { int rows = table.getSelectedRowCount(); int r0 = table.getSelectedRow(); int c0 = table.getSelectedColumn(); int w = table.getColumnCount(); int idx_src = 0; int idx_dst = 0; for (int i = 0; i < rows; i++) { idx_dst = (r0 + i) * w + c0; System.arraycopy(theData, idx_src, dataValue, idx_dst, cols); idx_src += cols; } } theData = null; System.gc(); table.updateUI(); isValueChanged = true; } } /** * update cell value in memory. It does not change the dataset value in * file. * * @param cellValue * the string value of input. * @param row * the row of the editing cell. * @param col * the column of the editing cell. */ private void updateValueInMemory(String cellValue, int row, int col) throws Exception { if (currentEditingCellValue != null) { // data values are the same, no need to change the data if (currentEditingCellValue.toString().equals(cellValue)) return; } if (dataset instanceof ScalarDS) { updateScalarData(cellValue, row, col); } else if (dataset instanceof CompoundDS) { updateCompoundData(cellValue, row, col); } } /** * update cell value in memory. It does not change the dataset value in * file. * * @param cellValue * the string value of input. * @param row * the row of the editing cell. * @param col * the column of the editing cell. */ private void updateScalarData(String cellValue, int row, int col) throws Exception { if (!(dataset instanceof ScalarDS) || (cellValue == null) || ((cellValue = cellValue.trim()) == null) || showAsBin || showAsHex) { return; } int i = 0; if (isDataTransposed) { i = col * table.getRowCount() + row; } else { i = row * table.getColumnCount() + col; } ScalarDS sds = (ScalarDS) dataset; boolean isUnsigned = sds.isUnsigned(); String cname = dataset.getOriginalClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); // check data range for unsigned datatype converted sizes! if (isUnsigned) { long lvalue = -1; long maxValue = Long.MAX_VALUE; if (dname == 'B') { maxValue = 255; lvalue = Long.parseLong(cellValue); if (lvalue < 0) { throw new NumberFormatException("Negative value for unsigned integer: " + lvalue); } if (lvalue > maxValue) { throw new NumberFormatException("Data value is out of range: " + lvalue); } } else if (dname == 'S') { maxValue = 65535; lvalue = Long.parseLong(cellValue); if (lvalue < 0) { throw new NumberFormatException("Negative value for unsigned integer: " + lvalue); } if (lvalue > maxValue) { throw new NumberFormatException("Data value is out of range: " + lvalue); } } else if (dname == 'I') { maxValue = 4294967295L; lvalue = Long.parseLong(cellValue); if (lvalue < 0) { throw new NumberFormatException("Negative value for unsigned integer: " + lvalue); } if (lvalue > maxValue) { throw new NumberFormatException("Data value is out of range: " + lvalue); } } else if (dname == 'J') { BigInteger Jmax = new BigInteger("18446744073709551615"); BigInteger big = new BigInteger(cellValue); if (big.compareTo(Jmax) > 0) { throw new NumberFormatException("Negative value for unsigned integer: " + cellValue); } if (big.compareTo(BigInteger.ZERO) < 0) { throw new NumberFormatException("Data value is out of range: " + cellValue); } } } switch (NT) { case 'B': byte bvalue = 0; bvalue = Byte.parseByte(cellValue); Array.setByte(dataValue, i, bvalue); break; case 'S': short svalue = 0; svalue = Short.parseShort(cellValue); Array.setShort(dataValue, i, svalue); break; case 'I': int ivalue = 0; ivalue = Integer.parseInt(cellValue); Array.setInt(dataValue, i, ivalue); break; case 'J': long lvalue = 0; if (dname == 'J') { BigInteger big = new BigInteger(cellValue); lvalue = big.longValue(); } else lvalue = Long.parseLong(cellValue); Array.setLong(dataValue, i, lvalue); break; case 'F': float fvalue = 0; fvalue = Float.parseFloat(cellValue); Array.setFloat(dataValue, i, fvalue); break; case 'D': double dvalue = 0; dvalue = Double.parseDouble(cellValue); Array.setDouble(dataValue, i, dvalue); break; default: Array.set(dataValue, i, cellValue); break; } isValueChanged = true; } private void updateCompoundData(String cellValue, int row, int col) throws Exception { if (!(dataset instanceof CompoundDS) || (cellValue == null) || ((cellValue = cellValue.trim()) == null)) { return; } CompoundDS compDS = (CompoundDS) dataset; List cdata = (List) compDS.getData(); int orders[] = compDS.getSelectedMemberOrders(); Datatype types[] = compDS.getSelectedMemberTypes(); int nFields = cdata.size(); int nSubColumns = table.getColumnCount() / nFields; int nRows = table.getRowCount(); int column = col; int offset = 0; int morder = 1; if (nSubColumns > 1) { // multi-dimension compound dataset int colIdx = col / nFields; column = col - colIdx * nFields; // //BUG 573: offset = row * orders[column] + colIdx * nRows * // orders[column]; offset = row * orders[column] * nSubColumns + colIdx * orders[column]; } else { offset = row * orders[column]; } morder = orders[column]; Object mdata = cdata.get(column); // strings if (Array.get(mdata, 0) instanceof String) { Array.set(mdata, offset, cellValue); isValueChanged = true; return; } else if (types[column].getDatatypeClass() == Datatype.CLASS_STRING) { // it is string but not converted, still byte array int strlen = types[column].getDatatypeSize(); offset *= strlen; byte[] bytes = cellValue.getBytes(); byte[] bData = (byte[]) mdata; int n = Math.min(strlen, bytes.length); System.arraycopy(bytes, 0, bData, offset, n); offset += n; n = strlen - bytes.length; // space padding for (int i = 0; i < n; i++) { bData[offset + i] = ' '; } isValueChanged = true; return; } // Numeric data char mNT = ' '; String cName = mdata.getClass().getName(); int cIndex = cName.lastIndexOf("["); if (cIndex >= 0) { mNT = cName.charAt(cIndex + 1); } StringTokenizer st = new StringTokenizer(cellValue, ","); if (st.countTokens() < morder) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Number of data point < " + morder + ".", getTitle(), JOptionPane.ERROR_MESSAGE); return; } String token = ""; isValueChanged = true; switch (mNT) { case 'B': byte bvalue = 0; for (int i = 0; i < morder; i++) { token = st.nextToken().trim(); bvalue = Byte.parseByte(token); Array.setByte(mdata, offset + i, bvalue); } break; case 'S': short svalue = 0; for (int i = 0; i < morder; i++) { token = st.nextToken().trim(); svalue = Short.parseShort(token); Array.setShort(mdata, offset + i, svalue); } break; case 'I': int ivalue = 0; for (int i = 0; i < morder; i++) { token = st.nextToken().trim(); ivalue = Integer.parseInt(token); Array.setInt(mdata, offset + i, ivalue); } break; case 'J': long lvalue = 0; for (int i = 0; i < morder; i++) { token = st.nextToken().trim(); BigInteger big = new BigInteger(token); lvalue = big.longValue(); // lvalue = Long.parseLong(token); Array.setLong(mdata, offset + i, lvalue); } break; case 'F': float fvalue = 0; for (int i = 0; i < morder; i++) { token = st.nextToken().trim(); fvalue = Float.parseFloat(token); Array.setFloat(mdata, offset + i, fvalue); } break; case 'D': double dvalue = 0; for (int i = 0; i < morder; i++) { token = st.nextToken().trim(); dvalue = Double.parseDouble(token); Array.setDouble(mdata, offset + i, dvalue); } break; default: isValueChanged = false; } } private class LineplotOption extends JDialog implements ActionListener, ItemListener { private static final long serialVersionUID = -3457035832213978906L; public static final int NO_PLOT = -1; public static final int ROW_PLOT = 0; public static final int COLUMN_PLOT = 1; private int idx_xaxis = -1, nRows = 0, nCols = 0, plotType = -1; private JRadioButton rowButton, colButton; private JComboBox rowBox, colBox; public LineplotOption(JFrame owner, String title, int nrow, int ncol) { super(owner, title, true); nRows = nrow; nCols = ncol; rowBox = new JComboBox(); rowBox.setEditable(false); colBox = new JComboBox(); colBox.setEditable(false); JPanel contentPane = (JPanel) this.getContentPane(); contentPane.setPreferredSize(new Dimension(400, 150)); contentPane.setLayout(new BorderLayout(10, 10)); long[] startArray = dataset.getStartDims(); long[] strideArray = dataset.getStride(); int[] selectedIndex = dataset.getSelectedIndex(); int start = (int) startArray[selectedIndex[0]]; int stride = (int) strideArray[selectedIndex[0]]; rowBox.addItem("array index"); for (int i = 0; i < nrow; i++) { rowBox.addItem("row " + (start + i * stride)); } colBox.addItem("array index"); for (int i = 0; i < ncol; i++) { colBox.addItem("column " + table.getColumnName(i)); } rowButton = new JRadioButton("Row"); colButton = new JRadioButton("Column", true); rowButton.addItemListener(this); colButton.addItemListener(this); ButtonGroup rgroup = new ButtonGroup(); rgroup.add(rowButton); rgroup.add(colButton); JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(2, 1, 5, 5)); p1.add(new JLabel(" Series in:", SwingConstants.RIGHT)); p1.add(new JLabel(" For abscissa use:", SwingConstants.RIGHT)); JPanel p2 = new JPanel(); p2.setLayout(new GridLayout(2, 1, 5, 5)); // p2.setBorder(new LineBorder(Color.lightGray)); p2.add(colButton); p2.add(colBox); JPanel p3 = new JPanel(); p3.setLayout(new GridLayout(2, 1, 5, 5)); // p3.setBorder(new LineBorder(Color.lightGray)); p3.add(rowButton); p3.add(rowBox); JPanel p = new JPanel(); p.setBorder(new LineBorder(Color.lightGray)); p.setLayout(new GridLayout(1, 3, 20, 5)); p.add(p1); p.add(p2); p.add(p3); JPanel bp = new JPanel(); JButton okButton = new JButton("Ok"); okButton.addActionListener(this); okButton.setActionCommand("Ok"); bp.add(okButton); JButton cancelButton = new JButton("Cancel"); cancelButton.addActionListener(this); cancelButton.setActionCommand("Cancel"); bp.add(cancelButton); contentPane.add(new JLabel(" Select plot options:"), BorderLayout.NORTH); contentPane.add(p, BorderLayout.CENTER); contentPane.add(bp, BorderLayout.SOUTH); colBox.setEnabled(colButton.isSelected()); rowBox.setEnabled(rowButton.isSelected()); Point l = getParent().getLocation(); l.x += 450; l.y += 200; setLocation(l); pack(); } int getXindex() { return idx_xaxis; } int getPlotBy() { return plotType; } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Cancel")) { plotType = NO_PLOT; this.dispose(); // terminate the application } else if (cmd.equals("Ok")) { if (colButton.isSelected()) { idx_xaxis = colBox.getSelectedIndex() - 1; plotType = COLUMN_PLOT; } else { idx_xaxis = rowBox.getSelectedIndex() - 1; plotType = ROW_PLOT; } this.dispose(); // terminate the application } } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source.equals(colButton) || source.equals(rowButton)) { colBox.setEnabled(colButton.isSelected()); rowBox.setEnabled(rowButton.isSelected()); } } } private class ColumnHeader extends JTableHeader { private static final long serialVersionUID = -3179653809792147055L; private int currentColumnIndex = -1; private int lastColumnIndex = -1; private JTable parentTable; public ColumnHeader(JTable theTable) { super(theTable.getColumnModel()); parentTable = theTable; setReorderingAllowed(false); } protected void processMouseMotionEvent(MouseEvent e) { super.processMouseMotionEvent(e); if (e.getID() == MouseEvent.MOUSE_DRAGGED) { // do not do anything, just resize the column if (getResizingColumn() != null) return; int colEnd = columnAtPoint(e.getPoint()); if (colEnd < 0) { colEnd = 0; } if (currentColumnIndex < 0) { currentColumnIndex = 0; } parentTable.clearSelection(); if (colEnd > currentColumnIndex) { parentTable.setColumnSelectionInterval(currentColumnIndex, colEnd); } else { parentTable.setColumnSelectionInterval(colEnd, currentColumnIndex); } parentTable.setRowSelectionInterval(0, parentTable.getRowCount() - 1); } } protected void processMouseEvent(MouseEvent e) { super.processMouseEvent(e); int mouseID = e.getID(); if (mouseID == MouseEvent.MOUSE_CLICKED) { if (currentColumnIndex < 0) { return; } if (e.isControlDown()) { // select discontinuous columns parentTable.addColumnSelectionInterval(currentColumnIndex, currentColumnIndex); } else if (e.isShiftDown()) { // select continuous columns if (lastColumnIndex < 0) { parentTable.addColumnSelectionInterval(0, currentColumnIndex); } else if (lastColumnIndex < currentColumnIndex) { parentTable.addColumnSelectionInterval(lastColumnIndex, currentColumnIndex); } else { parentTable.addColumnSelectionInterval(currentColumnIndex, lastColumnIndex); } } else { // clear old selection and set new column selection parentTable.clearSelection(); parentTable.setColumnSelectionInterval(currentColumnIndex, currentColumnIndex); } lastColumnIndex = currentColumnIndex; parentTable.setRowSelectionInterval(0, parentTable.getRowCount() - 1); } else if (mouseID == MouseEvent.MOUSE_PRESSED) { currentColumnIndex = columnAtPoint(e.getPoint()); } } } // private class ColumnHeader /** RowHeader defines the row header component of the Spreadsheet. */ private class RowHeader extends JTable { private static final long serialVersionUID = -1548007702499873626L; private int currentRowIndex = -1; private int lastRowIndex = -1; private JTable parentTable; public RowHeader(JTable pTable, Dataset dset) { // Create a JTable with the same number of rows as // the parent table and one column. // super( pTable.getRowCount(), 1 ); final long[] startArray = dset.getStartDims(); final long[] strideArray = dset.getStride(); final int[] selectedIndex = dset.getSelectedIndex(); final int start = (int) startArray[selectedIndex[0]]; final int stride = (int) strideArray[selectedIndex[0]]; final int rowCount = pTable.getRowCount(); parentTable = pTable; AbstractTableModel tm = new AbstractTableModel() { private static final long serialVersionUID = -8117073107569884677L; public int getColumnCount() { return 1; } public int getRowCount() { return rowCount; } public String getColumnName(int col) { return " "; } public Object getValueAt(int row, int column) { return String.valueOf(start + indexBase + row * stride); } }; this.setModel(tm); // Get the only table column. TableColumn col = getColumnModel().getColumn(0); // Use the cell renderer in the column. col.setCellRenderer(new RowHeaderRenderer()); } /** Overridden to return false since the headers are not editable. */ public boolean isCellEditable(int row, int col) { return false; } /** This is called when the selection changes in the row headers. */ public void valueChanged(ListSelectionEvent e) { if (parentTable == null) { return; } int rows[] = getSelectedRows(); if ((rows == null) || (rows.length == 0)) { return; } parentTable.clearSelection(); parentTable.setRowSelectionInterval(rows[0], rows[rows.length - 1]); parentTable.setColumnSelectionInterval(0, parentTable.getColumnCount() - 1); } protected void processMouseMotionEvent(MouseEvent e) { if (e.getID() == MouseEvent.MOUSE_DRAGGED) { int colEnd = rowAtPoint(e.getPoint()); if (colEnd < 0) { colEnd = 0; } if (currentRowIndex < 0) { currentRowIndex = 0; } parentTable.clearSelection(); if (colEnd > currentRowIndex) { parentTable.setRowSelectionInterval(currentRowIndex, colEnd); } else { parentTable.setRowSelectionInterval(colEnd, currentRowIndex); } parentTable.setColumnSelectionInterval(0, parentTable.getColumnCount() - 1); } } protected void processMouseEvent(MouseEvent e) { int mouseID = e.getID(); if (mouseID == MouseEvent.MOUSE_CLICKED) { if (currentRowIndex < 0) { return; } if (e.isControlDown()) { // select discontinuous rows parentTable.addRowSelectionInterval(currentRowIndex, currentRowIndex); } else if (e.isShiftDown()) { // select contiguous columns if (lastRowIndex < 0) { parentTable.addRowSelectionInterval(0, currentRowIndex); } else if (lastRowIndex < currentRowIndex) { parentTable.addRowSelectionInterval(lastRowIndex, currentRowIndex); } else { parentTable.addRowSelectionInterval(currentRowIndex, lastRowIndex); } } else { // clear old selection and set new column selection parentTable.clearSelection(); parentTable.setRowSelectionInterval(currentRowIndex, currentRowIndex); } lastRowIndex = currentRowIndex; parentTable.setColumnSelectionInterval(0, parentTable.getColumnCount() - 1); } else if (mouseID == MouseEvent.MOUSE_PRESSED) { currentRowIndex = rowAtPoint(e.getPoint()); } } } // private class RowHeader extends JTable /** * RowHeaderRenderer is a custom cell renderer that displays cells as * buttons. */ private class RowHeaderRenderer extends JLabel implements TableCellRenderer { private static final long serialVersionUID = -8963879626159783226L; public RowHeaderRenderer() { super(); setHorizontalAlignment(JLabel.CENTER); setOpaque(true); setBorder(UIManager.getBorder("TableHeader.cellBorder")); setBackground(Color.lightGray); } /** Configures the button for the current cell, and returns it. */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setFont(table.getFont()); if (value != null) { setText(value.toString()); } return this; } } // private class RowHeaderRenderer extends JLabel implements // TableCellRenderer private class MultiLineHeaderRenderer extends JList implements TableCellRenderer { private static final long serialVersionUID = -3697496960833719169L; private final CompoundBorder subBorder = new CompoundBorder(new MatteBorder(1, 0, 1, 0, java.awt.Color.darkGray), new MatteBorder(1, 0, 1, 0, java.awt.Color.white)); private final CompoundBorder majorBorder = new CompoundBorder(new MatteBorder(1, 1, 1, 0, java.awt.Color.darkGray), new MatteBorder(1, 2, 1, 0, java.awt.Color.white)); Vector lines = new Vector(); int nMajorcolumns = 1; int nSubcolumns = 1; public MultiLineHeaderRenderer(int majorColumns, int subColumns) { nMajorcolumns = majorColumns; nSubcolumns = subColumns; setOpaque(true); setForeground(UIManager.getColor("TableHeader.foreground")); setBackground(UIManager.getColor("TableHeader.background")); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setFont(table.getFont()); String str = (value == null) ? "" : value.toString(); BufferedReader br = new BufferedReader(new StringReader(str)); String line; lines.clear(); try { while ((line = br.readLine()) != null) { lines.addElement(line); } } catch (IOException ex) { } if ((column / nSubcolumns) * nSubcolumns == column) { setBorder(majorBorder); } else { setBorder(subBorder); } setListData(lines); return this; } } // //////////////////////////////////////////////////////////////////////// // // // The code below was added to deal with region references // // Peter Cao, 4/30/2009 // // // // //////////////////////////////////////////////////////////////////////// public void mouseClicked(MouseEvent e) { // only deal with reg. ref if (!(isRegRef || isObjRef)) return; int eMod = e.getModifiers(); // provide two options here: double click to show data in table, or // right mouse to choose to show data in table or in image // right mouse click if (e.isPopupTrigger() || (eMod == InputEvent.BUTTON3_MASK) || (System.getProperty("os.name").startsWith("Mac") && (eMod == (InputEvent.BUTTON1_MASK | InputEvent.CTRL_MASK)))) { if (popupMenu != null) { popupMenu.show((JComponent) e.getSource(), e.getX(), e.getY()); } } else if (e.getClickCount() == 2) { // double click viewType = ViewType.TABLE; Object theData = null; try { theData = getDataObject(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); } if (theData == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "No data selected.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } int len = Array.getLength(theData); for (int i = 0; i < len; i++) { if (isRegRef) showRegRefData((String) Array.get(theData, i)); else if (isObjRef) showObjRefData(Array.getLong(theData, i)); } } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } /** creates a popup menu for a right mouse click on a data object */ private JPopupMenu createPopupMenu() { JPopupMenu menu = new JPopupMenu(); JMenuItem item; item = new JMenuItem("Show As Table"); item.setMnemonic(KeyEvent.VK_T); item.addActionListener(this); item.setActionCommand("Show data as table"); menu.add(item); item = new JMenuItem("Show As Image"); item.setMnemonic(KeyEvent.VK_I); item.addActionListener(this); item.setActionCommand("Show data as image"); menu.add(item); // item = new JMenuItem( "Show As Text"); // item.setMnemonic(KeyEvent.VK_I); // item.addActionListener(this); // item.setActionCommand("Show data as text"); // menu.add(item); return menu; } /** * Display data pointed by object references. Data of each object is shown * in a separate spreadsheet. * * @param ref * the array of strings that contain the reg. ref information. * */ private void showObjRefData(long ref) { long[] oid = { ref }; HObject obj = FileFormat.findObject(dataset.getFileFormat(), oid); if (obj == null || !(obj instanceof ScalarDS)) return; ScalarDS dset = (ScalarDS) obj; ScalarDS dset_copy = null; // create an instance of the dataset constructor Constructor constructor = null; Object[] paramObj = null; Object data = null; try { Class[] paramClass = { FileFormat.class, String.class, String.class }; constructor = dset.getClass().getConstructor(paramClass); paramObj = new Object[] { dset.getFileFormat(), dset.getName(), dset.getPath() }; dset_copy = (ScalarDS) constructor.newInstance(paramObj); data = dset_copy.getData(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex, "Object Reference:" + getTitle(), JOptionPane.ERROR_MESSAGE); data = null; } if (data == null) return; // load each selection into a separate dataset and display it in // a separate spreadsheet StringBuffer titleSB = new StringBuffer(); Font font = this.getFont(); CompoundBorder border = BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(), BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE, 3), "Data pointed by object reference", TitledBorder.RIGHT, TitledBorder.TOP, font, Color.RED)); JInternalFrame dataView = null; HashMap map = new HashMap(1); map.put(ViewProperties.DATA_VIEW_KEY.OBJECT, dset_copy); switch (viewType) { case TEXT: dataView = new DefaultTextView(viewer, map); break; case IMAGE: dataView = new DefaultImageView(viewer, map); break; default: dataView = new DefaultTableView(viewer, map); break; } if (dataView != null) { viewer.addDataView((DataView) dataView); titleSB.append(dset_copy.getName()); titleSB.append(" - "); titleSB.append(dset_copy.getPath()); titleSB.append(" - "); titleSB.append(dataset.getFile()); dataView.setTitle(titleSB.toString()); dataView.setBorder(border); } } /** * Display data pointed by region references. Data of each region is shown * in a separate spreadsheet. The reg. ref. information is stored in strings * of the format below: *

    *

      *
    • For point selections: "file_id:obj_id { ...) }", * where is in the form of (location_of_dim0, location_of_dim1, * ...). For example, 0:800 { (0,1) (2,11) (1,0) (2,4) }
    • *
    • For rectangle selections: * "file_id:obj_id { ... }", * where is in the form of * (start_corner)-(oposite_corner). For example, 0:800 { (0,0)-(0,2) * (0,11)-(0,13) (2,0)-(2,2) (2,11)-(2,13) }
    • *
    * * @param reg * the array of strings that contain the reg. ref information. * */ private void showRegRefData(String reg) { boolean isPointSelection = false; if (reg == null || reg.length() <= 0) return; isPointSelection = (reg.indexOf('-') <= 0); // find the object id String oidStr = reg.substring(reg.indexOf(':') + 1, reg.indexOf(' ')); long oid[] = { -1 }; // decode object ID try { oid[0] = Long.valueOf(oidStr); } catch (Exception ex) { return; } // decode the region selection String regStr = reg.substring(reg.indexOf('{') + 1, reg.indexOf('}')); if (regStr == null || regStr.length() <= 0) return; // no selection StringTokenizer st = new StringTokenizer(regStr); int nSelections = st.countTokens(); if (nSelections <= 0) return; // no selection HObject obj = FileFormat.findObject(dataset.getFileFormat(), oid); if (obj == null || !(obj instanceof ScalarDS)) return; ScalarDS dset = (ScalarDS) obj; ScalarDS dset_copy = null; // create an instance of the dataset constructor Constructor constructor = null; Object[] paramObj = null; try { Class[] paramClass = { FileFormat.class, String.class, String.class }; constructor = dset.getClass().getConstructor(paramClass); paramObj = new Object[] { dset.getFileFormat(), dset.getName(), dset.getPath() }; } catch (Exception ex) { constructor = null; } // load each selection into a separate dataset and display it in // a separate spreadsheet StringBuffer titleSB = new StringBuffer(); Font font = this.getFont(); CompoundBorder border = BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(), BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE, 3), "Data pointed by region reference", TitledBorder.RIGHT, TitledBorder.TOP, font, Color.RED)); while (st.hasMoreTokens()) { try { dset_copy = (ScalarDS) constructor.newInstance(paramObj); } catch (Exception ex) { continue; } if (dset_copy == null) continue; try { dset_copy.init(); } catch (Exception ex) { continue; } int rank = dset_copy.getRank(); long start[] = dset_copy.getStartDims(); long count[] = dset_copy.getSelectedDims(); // set the selected dimension sizes based on the region selection // info. int idx = 0; String sizeStr = null; String token = st.nextToken(); titleSB.setLength(0); titleSB.append(token); titleSB.append(" at "); token = token.replace('(', ' '); token = token.replace(')', ' '); if (isPointSelection) { // point selection StringTokenizer tmp = new StringTokenizer(token, ","); while (tmp.hasMoreTokens()) { count[idx] = 1; sizeStr = tmp.nextToken().trim(); start[idx] = Long.valueOf(sizeStr); idx++; } } else { // rectangle selection String startStr = token.substring(0, token.indexOf('-')); String endStr = token.substring(token.indexOf('-') + 1); StringTokenizer tmp = new StringTokenizer(startStr, ","); while (tmp.hasMoreTokens()) { sizeStr = tmp.nextToken().trim(); start[idx] = Long.valueOf(sizeStr); idx++; } idx = 0; tmp = new StringTokenizer(endStr, ","); while (tmp.hasMoreTokens()) { sizeStr = tmp.nextToken().trim(); count[idx] = Long.valueOf(sizeStr) - start[idx] + 1; idx++; } } Object data = null; try { data = dset_copy.getData(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex, "Region Reference:" + getTitle(), JOptionPane.ERROR_MESSAGE); data = null; } JInternalFrame dataView = null; HashMap map = new HashMap(1); map.put(ViewProperties.DATA_VIEW_KEY.OBJECT, dset_copy); switch (viewType) { case TEXT: dataView = new DefaultTextView(viewer, map); break; case IMAGE: dataView = new DefaultImageView(viewer, map); break; default: dataView = new DefaultTableView(viewer, map); break; } if (dataView != null) { viewer.addDataView((DataView) dataView); titleSB.append(dset_copy.getName()); titleSB.append(" - "); titleSB.append(dset_copy.getPath()); titleSB.append(" - "); titleSB.append(dataset.getFile()); dataView.setTitle(titleSB.toString()); dataView.setBorder(border); } } // while (st.hasMoreTokens()) } // private void showRegRefData(String reg) } jhdf-2.9/ncsa/hdf/view/Makefile.in0000644000175000017500000000370612050301063017661 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = ../../.. DIR = ncsa/hdf/view SUBDIRS = NULL JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ JAVA_SRCS = \ DataOptionDialog.java \ HDFView.java \ ImageView.java \ TableView.java \ TextView.java \ TreeView.java \ ViewManager.java \ ViewProperties.java \ NewAttributeDialog.java \ NewDatasetDialog.java \ NewDatatypeDialog.java \ NewLinkDialog.java \ NewTableDataDialog.java \ NewFileDialog.java \ NewGroupDialog.java \ DefaultFileFilter.java \ FileConversionDialog.java \ MathConversionDialog.java \ NewImageDialog.java \ UserOptionsDialog.java \ Tools.java \ Chart.java \ DataView.java \ DefaultImageView.java \ DefaultMetaDataView.java \ DefaultPaletteView.java \ DefaultTableView.java \ DefaultTextView.java \ DefaultTreeView.java \ MetaDataView.java \ HelpView.java \ PaletteView.java include $(TOP)/config/Rules.mk jhdf-2.9/ncsa/hdf/view/NewDatatypeDialog.java0000755000175000017500000003477112050301063022035 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import ncsa.hdf.object.DataFormat; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; /** * NewDatasetDialog shows a message dialog requesting user input for creating a * new HDF4/5 dataset. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class NewDatatypeDialog extends JDialog implements ActionListener, ItemListener { private static final long serialVersionUID = -1930736056916611522L; private JTextField nameField, stringLengthField; private JComboBox parentChoice, classChoice, sizeChoice, endianChoice; private JCheckBox checkUnsigned; private boolean isH5; /** a list of current groups */ private List groupList; private HObject newObject; private FileFormat fileFormat; private final Toolkit toolkit; /** * Constructs NewDatatypeDialog with specified list of possible parent * groups. * * @param owner * the owner of the input * @param pGroup * the parent group which the new group is added to. * @param objs * the list of all objects. */ public NewDatatypeDialog(JFrame owner, Group pGroup, List objs) { super(owner, "New Datatype...", true); newObject = null; fileFormat = pGroup.getFileFormat(); toolkit = Toolkit.getDefaultToolkit(); isH5 = pGroup.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); parentChoice = new JComboBox(); groupList = new Vector(objs.size()); Object obj = null; Iterator iterator = objs.iterator(); while (iterator.hasNext()) { obj = iterator.next(); if (obj instanceof Group) { Group g = (Group) obj; groupList.add(obj); if (g.isRoot()) { parentChoice.addItem(HObject.separator); } else { parentChoice.addItem(g.getPath() + g.getName() + HObject.separator); } } } if (pGroup.isRoot()) { parentChoice.setSelectedItem(HObject.separator); } else { parentChoice.setSelectedItem(pGroup.getPath() + pGroup.getName() + HObject.separator); } JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 600 + (ViewProperties.getFontSize() - 12) * 15; int h = 200 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton okButton = new JButton(" Ok "); okButton.setActionCommand("Ok"); okButton.setMnemonic(KeyEvent.VK_O); okButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.setActionCommand("Cancel"); cancelButton.addActionListener(this); // set OK and CANCEL buttons JPanel buttonPanel = new JPanel(); buttonPanel.add(okButton); buttonPanel.add(cancelButton); contentPane.add(buttonPanel, BorderLayout.SOUTH); // set NAME and PARENT GROUP panel JPanel namePanel = new JPanel(); namePanel.setLayout(new BorderLayout(5, 5)); JPanel tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); tmpP.add(new JLabel("Datatype name: ")); tmpP.add(new JLabel("Parent group: ")); namePanel.add(tmpP, BorderLayout.WEST); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); tmpP.add(nameField = new JTextField()); tmpP.add(parentChoice); namePanel.add(tmpP, BorderLayout.CENTER); contentPane.add(namePanel, BorderLayout.NORTH); // set DATATYPE JPanel typePanel = new JPanel(); typePanel.setLayout(new GridLayout(2, 4, 15, 3)); TitledBorder border = new TitledBorder("Datatype"); border.setTitleColor(Color.blue); typePanel.setBorder(border); stringLengthField = new JTextField("String length"); stringLengthField.setEnabled(false); endianChoice = new JComboBox(); classChoice = new JComboBox(); sizeChoice = new JComboBox(); endianChoice.setEnabled(isH5); classChoice.addItem("INTEGER"); classChoice.addItem("FLOAT"); classChoice.addItem("CHAR"); if (isH5) { classChoice.addItem("STRING"); classChoice.addItem("REFERENCE"); sizeChoice.addItem("NATIVE"); endianChoice.addItem("NATIVE"); endianChoice.addItem("LITTLE ENDIAN"); endianChoice.addItem("BIG ENDIAN"); } else { sizeChoice.addItem("DEFAULT"); endianChoice.addItem("DEFAULT"); typePanel.add(new JLabel()); } sizeChoice.addItem("8"); sizeChoice.addItem("16"); sizeChoice.addItem("32"); sizeChoice.addItem("64"); typePanel.add(new JLabel("Datatype class")); typePanel.add(new JLabel("Size (bits)")); typePanel.add(new JLabel("Byte ordering")); typePanel.add(checkUnsigned = new JCheckBox("Unsigned")); typePanel.add(classChoice); typePanel.add(sizeChoice); typePanel.add(endianChoice); typePanel.add(stringLengthField); contentPane.add(typePanel, BorderLayout.CENTER); classChoice.addItemListener(this); sizeChoice.addItemListener(this); // locate the H5Property dialog Point l = owner.getLocation(); l.x += 250; l.y += 100; setLocation(l); validate(); pack(); } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Ok")) { newObject = createDatatype(); if (newObject != null) { dispose(); } } if (cmd.equals("Cancel")) { newObject = null; dispose(); } } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source.equals(classChoice)) { int idx = classChoice.getSelectedIndex(); sizeChoice.setSelectedIndex(0); endianChoice.setSelectedIndex(0); stringLengthField.setEnabled(false); if (idx == 0) { sizeChoice.setEnabled(true); endianChoice.setEnabled(isH5); checkUnsigned.setEnabled(true); if (sizeChoice.getItemCount() == 3) { sizeChoice.removeItem("32"); sizeChoice.removeItem("64"); sizeChoice.addItem("8"); sizeChoice.addItem("16"); sizeChoice.addItem("32"); sizeChoice.addItem("64"); } } else if (idx == 1) { sizeChoice.setEnabled(true); endianChoice.setEnabled(isH5); checkUnsigned.setEnabled(false); if (sizeChoice.getItemCount() == 5) { sizeChoice.removeItem("16"); sizeChoice.removeItem("8"); } } else if (idx == 2) { sizeChoice.setEnabled(false); endianChoice.setEnabled(isH5); checkUnsigned.setEnabled(true); } else if (idx == 3) { sizeChoice.setEnabled(false); endianChoice.setEnabled(false); checkUnsigned.setEnabled(false); stringLengthField.setEnabled(true); stringLengthField.setText("String length"); } else if (idx == 4) { sizeChoice.setEnabled(false); endianChoice.setEnabled(false); checkUnsigned.setEnabled(false); stringLengthField.setEnabled(false); } } else if (source.equals(sizeChoice)) { if (classChoice.getSelectedIndex() == 0) { checkUnsigned.setEnabled(true); } } } private HObject createDatatype() { String name = null; Group pgroup = null; int tclass = -1, tsize = -1, torder = -1, tsign = -1; name = nameField.getText().trim(); if ((name == null) || (name.length() < 1)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Datatype name is not specified.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (name.indexOf(HObject.separator) >= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Datatype name cannot contain path.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } pgroup = (Group) groupList.get(parentChoice.getSelectedIndex()); if (pgroup == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Parent group is null.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } // set datatype class int idx = classChoice.getSelectedIndex(); if (idx == 0) { tclass = Datatype.CLASS_INTEGER; if (checkUnsigned.isSelected()) { tsign = Datatype.SIGN_NONE; } } else if (idx == 1) { tclass = Datatype.CLASS_FLOAT; } else if (idx == 2) { tclass = Datatype.CLASS_CHAR; if (checkUnsigned.isSelected()) { tsign = Datatype.SIGN_NONE; } } else if (idx == 3) { tclass = Datatype.CLASS_STRING; } else if (idx == 4) { tclass = Datatype.CLASS_REFERENCE; } // set datatype size/order idx = sizeChoice.getSelectedIndex(); if (tclass == Datatype.CLASS_STRING) { int stringLength = 0; try { stringLength = Integer.parseInt(stringLengthField.getText()); } catch (NumberFormatException ex) { stringLength = -1; } if (stringLength <= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid string length: " + stringLengthField.getText(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } tsize = stringLength; } else if (tclass == Datatype.CLASS_REFERENCE) { tsize = 1; } else if (idx == 0) { tsize = Datatype.NATIVE; } else if (tclass == Datatype.CLASS_FLOAT) { tsize = idx * 4; } else { tsize = 1 << (idx - 1); } if ((tsize == 8) && !isH5 && (tclass == Datatype.CLASS_INTEGER)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "HDF4 does not support 64-bit integer.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } // set order idx = endianChoice.getSelectedIndex(); if (idx == 0) { torder = Datatype.NATIVE; } else if (idx == 1) { torder = Datatype.ORDER_LE; } else { torder = Datatype.ORDER_BE; } HObject obj = null; try { String fullPath = HObject.separator; if (pgroup.isRoot()) { fullPath += name; } else { fullPath = pgroup.getPath() + HObject.separator + pgroup.getName() + HObject.separator + name; } Datatype datatype = fileFormat.createDatatype(tclass, tsize, torder, tsign, fullPath); obj = datatype; } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } return obj; } /** Returns the new dataset created. */ public DataFormat getObject() { return newObject; } /** Returns the parent group of the new dataset. */ public Group getParentGroup() { return (Group) groupList.get(parentChoice.getSelectedIndex()); } } jhdf-2.9/ncsa/hdf/view/DefaultPaletteView.java0000755000175000017500000006205312050301063022220 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.image.IndexColorModel; import java.awt.image.MemoryImageSource; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.CellEditor; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.WindowConstants; import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; /** * To view and change palette. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class DefaultPaletteView extends JDialog implements PaletteView, MouseListener, MouseMotionListener, ActionListener, ItemListener { private static final long serialVersionUID = -5092012421988388661L; private final Color[] lineColors = { Color.red, Color.green, Color.blue }; private final String lineLabels[] = { "Red", "Green", "Blue" }; private static String PALETTE_GRAY = "Gray"; private static String PALETTE_DEFAULT = "Default"; private static String PALETTE_REVERSE_GRAY = "Reverse Gray"; private static String PALETTE_GRAY_WAVE = "GrayWave"; private static String PALETTE_RAINBOW = "Rainbow"; private static String PALETTE_NATURE = "Nature"; private static String PALETTE_WAVE = "Wave"; private JRadioButton checkRed, checkGreen, checkBlue; /** Panel that draws plot of data values. */ private ChartPanel chartP; private int x0, y0; // starting point of mouse drag private Image originalImage, currentImage; boolean isPaletteChanged = false; byte[][] palette; private ScalarDS dataset; private ImageView imageView; private int[][] paletteData; private JComboBox choicePalette; private PaletteValueTable paletteValueTable; private int numberOfPalettes; private boolean startEditing = false; public DefaultPaletteView(ImageView theImageView) { this(null, theImageView); } public DefaultPaletteView(ViewManager theViewer, ImageView theImageView) { super((JFrame) theViewer, true); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); imageView = theImageView; dataset = (ScalarDS) imageView.getDataObject(); numberOfPalettes = 1; choicePalette = new JComboBox(); choicePalette.addItemListener(this); boolean isH5 = dataset.getFileFormat().isThisType( FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); choicePalette.addItem("Select palette"); String paletteName = ((ScalarDS) dataset).getPaletteName(0); if (paletteName!= null) paletteName = paletteName.trim(); if (paletteName!= null && paletteName.length()>0) choicePalette.addItem(paletteName); if (isH5 && (dataset instanceof ScalarDS)) { byte[] palRefs = ((ScalarDS) dataset).getPaletteRefs(); if ((palRefs != null) && (palRefs.length > 8)) { numberOfPalettes = palRefs.length / 8; } } for (int i = 1; i < numberOfPalettes; i++) { paletteName = ((ScalarDS) dataset).getPaletteName(i); choicePalette.addItem(paletteName); } choicePalette.addItem(PALETTE_GRAY); choicePalette.addItem(PALETTE_GRAY_WAVE); choicePalette.addItem(PALETTE_RAINBOW); choicePalette.addItem(PALETTE_NATURE); choicePalette.addItem(PALETTE_WAVE); Vector plist = ViewProperties.getPaletteList(); int n = plist.size(); for (int i = 0; i < n; i++) choicePalette.addItem(plist.get(i)); chartP = new ChartPanel(); chartP.setBackground(Color.white); paletteData = new int[3][256]; byte[][] imagePalette = imageView.getPalette(); this.setTitle("Image Palette for - " + dataset.getPath() + dataset.getName()); int d = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 256; j++) { d = imagePalette[i][j]; if (d < 0) { d += 256; } paletteData[i][j] = d; } } imageView = theImageView; chartP.addMouseListener(this); chartP.addMouseMotionListener(this); x0 = y0 = 0; originalImage = currentImage = imageView.getImage(); palette = new byte[3][256]; createUI(); setVisible(true); } /** returns the data object displayed in this data viewer */ public HObject getDataObject() { return dataset; } /** * Creates and layouts GUI componentes. */ private void createUI() { Window owner = getOwner(); JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); int w = 700 + (ViewProperties.getFontSize() - 12) * 15; int h = 500 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); contentPane.add(chartP, BorderLayout.CENTER); JButton button = new JButton(" Ok "); button.addActionListener(this); button.setActionCommand("Ok"); JPanel buttonP = new JPanel(); buttonP.setBorder(new LineBorder(Color.GRAY)); buttonP.add(button); button = new JButton("Cancel"); button.addActionListener(this); button.setActionCommand("Cancel"); buttonP.add(button); button = new JButton("Preview"); button.addActionListener(this); button.setActionCommand("Preview"); buttonP.add(button); JPanel bottomP = new JPanel(); bottomP.setLayout(new BorderLayout(20, 2)); bottomP.add(buttonP, BorderLayout.EAST); checkRed = new JRadioButton("Red"); checkRed.setForeground(Color.red); checkGreen = new JRadioButton("Green"); checkGreen.setForeground(Color.green); checkBlue = new JRadioButton("Blue"); checkBlue.setForeground(Color.blue); checkRed.setSelected(true); ButtonGroup bgroup = new ButtonGroup(); bgroup.add(checkRed); bgroup.add(checkGreen); bgroup.add(checkBlue); JPanel checkP = new JPanel(); checkP.setBorder(new LineBorder(Color.GRAY)); checkP.add(checkRed); checkP.add(checkGreen); checkP.add(checkBlue); bottomP.add(checkP, BorderLayout.WEST); JPanel valueP = new JPanel(); valueP.setLayout(new GridLayout(1, 2)); valueP.setBorder(new LineBorder(Color.GRAY)); JButton valueButton = new JButton("Show Values"); valueButton.setActionCommand("Show palette values"); valueButton.addActionListener(this); valueP.add(choicePalette); valueP.add(valueButton); bottomP.add(valueP, BorderLayout.CENTER); contentPane.add(bottomP, BorderLayout.SOUTH); Point l = owner.getLocation(); l.x += 350; l.y += 200; setLocation(l); pack(); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Ok")) { if (isPaletteChanged) { this.updatePalette(); isPaletteChanged = false; imageView.setPalette(palette); imageView.setImage(currentImage); } super.dispose(); } else if (cmd.equals("Cancel")) { imageView.setImage(originalImage); super.dispose(); } else if (cmd.equals("Preview")) { this.updatePalette(); imageView.setImage(currentImage); } else if (cmd.equals("Show palette values")) { if (paletteValueTable == null) { paletteValueTable = new PaletteValueTable(this); } paletteValueTable.refresh(); paletteValueTable.setVisible(true); } else if (cmd.equals("Hide palette values")) { if (paletteValueTable != null) { paletteValueTable.setVisible(false); } } } @Override public void dispose() { imageView.setImage(originalImage); super.dispose(); } public void itemStateChanged(ItemEvent e) { Object src = e.getSource(); if (!src.equals(choicePalette)) { return; } int idx = choicePalette.getSelectedIndex(); if (idx <= 0) { return; } byte[][] imagePalette = null; Object item = choicePalette.getSelectedItem(); if (item.equals(PALETTE_DEFAULT)) { imagePalette = dataset.getPalette(); } else if (item.equals(PALETTE_GRAY)) { imagePalette = Tools.createGrayPalette(); } else if (item.equals(PALETTE_REVERSE_GRAY)) { imagePalette = Tools.createReverseGrayPalette(); } else if (item.equals(PALETTE_GRAY_WAVE)) { imagePalette = Tools.createGrayWavePalette(); } else if (item.equals(PALETTE_RAINBOW)) { imagePalette = Tools.createRainbowPalette(); } else if (item.equals(PALETTE_NATURE)) { imagePalette = Tools.createNaturePalette(); } else if (item.equals(PALETTE_WAVE)) { imagePalette = Tools.createWavePalette(); } else if (idx > 0 && idx <= numberOfPalettes) { imagePalette = ((ScalarDS) dataset).readPalette(idx - 1); } else { imagePalette = Tools.readPalette((String)item); } if (imagePalette == null) { return; } int d = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 256; j++) { d = imagePalette[i][j]; if (d < 0) { d += 256; } paletteData[i][j] = d; } } chartP.repaint(); isPaletteChanged = true; } private void updatePalette() { for (int i = 0; i < 256; i++) { palette[0][i] = (byte) paletteData[0][i]; palette[1][i] = (byte) paletteData[1][i]; palette[2][i] = (byte) paletteData[2][i]; } IndexColorModel colorModel = new IndexColorModel(8, // bits - the number // of bits each // pixel occupies 256, // size - the size of the color component arrays palette[0], // r - the array of red color components palette[1], // g - the array of green color components palette[2]); // b - the array of blue color components int w = dataset.getWidth(); int h = dataset.getHeight(); MemoryImageSource memoryImageSource = null; try { memoryImageSource = (MemoryImageSource) originalImage.getSource(); } catch (Throwable err) { memoryImageSource = null; } if (memoryImageSource == null) { memoryImageSource = new MemoryImageSource(w, h, colorModel, imageView.getImageByteData(), 0, w); } else { memoryImageSource.newPixels(imageView.getImageByteData(), colorModel, 0, w); } currentImage = Toolkit.getDefaultToolkit().createImage( memoryImageSource); } public void mouseClicked(MouseEvent e) { } // MouseListener public void mouseReleased(MouseEvent e) { if ((paletteValueTable != null) && paletteValueTable.isVisible()) { paletteValueTable.refresh(); } } // MouseListener public void mouseEntered(MouseEvent e) { } // MouseListener public void mouseExited(MouseEvent e) { } // MouseListener public void mouseMoved(MouseEvent e) { } // MouseMotionListener // implementing MouseListener public void mousePressed(MouseEvent e) { // x0 = e.getX()-40; // takes the horizontal gap // if (x0 < 0) x0 = 0; // y0 = e.getY()+20; } // implementing MouseMotionListener public void mouseDragged(MouseEvent e) { int x1 = e.getX() - 40;// takes the vertical gap if (x1 < 0) { x1 = 0; } int y1 = e.getY() + 20; Dimension d = chartP.getSize(); double ry = 255 / (double) d.height; double rx = 255 / (double) d.width; int lineIdx = 0; if (checkGreen.isSelected()) { lineIdx = 1; } else if (checkBlue.isSelected()) { lineIdx = 2; } int idx = 0; double b = (double) (y1 - y0) / (double) (x1 - x0); double a = y0 - b * x0; double value = y0 * ry; int i0 = Math.min(x0, x1); int i1 = Math.max(x0, x1); for (int i = i0; i < i1; i++) { idx = (int) (rx * i); if (idx > 255) { continue; } value = 255 - (a + b * i) * ry; if (value < 0) { value = 0; } else if (value > 255) { value = 255; } paletteData[lineIdx][idx] = (int) value; } chartP.repaint(); isPaletteChanged = true; } /** The dialog to show the palette values in spreadsheet. */ private final class PaletteValueTable extends JDialog { private static final long serialVersionUID = 6105012612969555535L; private JTable valueTable; private DefaultTableModel valueTableModel; String rgbName = "Color"; String idxName = "Index"; int editingRow =-1, editingCol=-1; public PaletteValueTable(DefaultPaletteView owner) { super(owner); String[] columnNames = { idxName, "Red", "Green", "Blue", rgbName }; valueTableModel = new DefaultTableModel(columnNames, 256); valueTable = new JTable(valueTableModel) { private static final long serialVersionUID = -2823793138915014637L; @Override public boolean isCellEditable(int row, int col) { return (col > 0 && col < 4); } @Override public Object getValueAt(int row, int col) { if (startEditing && row==editingRow && col==editingCol) return ""; if (col == 0) return String.valueOf(row); else if (col < 4) { return String.valueOf(paletteData[col - 1][row]); } else { return ""; } } @Override public boolean editCellAt(int row, int column, java.util.EventObject e) { if (!isCellEditable(row, column)) { return super.editCellAt(row, column, e); } if (e instanceof KeyEvent) { KeyEvent ke = (KeyEvent) e; if (ke.getID() == KeyEvent.KEY_PRESSED) { startEditing = true; editingRow = row; editingCol = column; } } return super.editCellAt(row, column, e); } @Override public void editingStopped(ChangeEvent e) { int row = getEditingRow(); int col = getEditingColumn(); if (!isCellEditable(row, col)) { return; } String oldValue = (String) getValueAt(row, col); super.editingStopped(e); startEditing = false; editingRow = -1; editingCol = -1; Object source = e.getSource(); if (source instanceof CellEditor) { CellEditor editor = (CellEditor) source; String newValue = (String) editor.getCellEditorValue(); setValueAt(oldValue, row, col); // set back to what it // is updatePaletteValue(newValue, row, col - 1); } } }; valueTable.setName("PaletteValue"); valueTable.getColumn(rgbName).setCellRenderer( new DefaultTableCellRenderer() { private static final long serialVersionUID = 8390954944015521331L; Color color = Color.white; @Override public java.awt.Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { java.awt.Component comp = super .getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); color = new Color(paletteData[0][row], paletteData[1][row], paletteData[2][row]); comp.setBackground(color); return comp; } }); valueTable.getColumn(idxName).setCellRenderer( new DefaultTableCellRenderer() { private static final long serialVersionUID = 2786027382023940417L; @Override public java.awt.Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { java.awt.Component comp = super .getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); comp.setBackground(Color.LIGHT_GRAY); return comp; } }); valueTable.setRowSelectionAllowed(false); valueTable.setCellSelectionEnabled(true); valueTable.getTableHeader().setReorderingAllowed(false); valueTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // set cell height for large fonts int cellRowHeight = Math.max(16, valueTable.getFontMetrics( valueTable.getFont()).getHeight()); valueTable.setRowHeight(cellRowHeight); JScrollPane scroller = new JScrollPane(valueTable); JPanel contentPane = (JPanel) getContentPane(); int w = 300 + (ViewProperties.getFontSize() - 12) * 10; int h = 600 + (ViewProperties.getFontSize() - 12) * 15; contentPane.setPreferredSize(new Dimension(w, h)); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); contentPane.add(scroller, BorderLayout.CENTER); JButton button = new JButton(" Ok "); button.addActionListener(owner); button.setActionCommand("Hide palette values"); JPanel tmpP = new JPanel(); tmpP.add(button); contentPane.add(tmpP, BorderLayout.SOUTH); Point l = owner.getLocation(); l.x += 100; l.y += 100; setLocation(l); pack(); } private void updatePaletteValue(String strValue, int row, int col) { if (strValue == null) { return; } int value = 0; try { value = Integer.parseInt(strValue); } catch (Exception ex) { return; } if (value < 0 || value > 255) { JOptionPane.showMessageDialog(this, "Value is out of range [0, 255]\n", getTitle(), JOptionPane.ERROR_MESSAGE); return; } paletteData[col][row] = value; chartP.repaint(); isPaletteChanged = true; } public void refresh() { valueTable.editingStopped(new ChangeEvent(valueTable)); valueTable.updateUI(); } } /** The canvas that paints the data lines. */ private final class ChartPanel extends JComponent { private static final long serialVersionUID = -6861041412971944L; /** * Paints the plot components. */ @Override public void paint(Graphics g) { Dimension d = getSize(); int gap = 20; int legendSpace = 60; int h = d.height - gap; int w = d.width - 3 * gap - legendSpace; // draw the X axis g.drawLine(2 * gap, h, w + 2 * gap, h); // draw the Y axis g.drawLine(2 * gap, h, 2 * gap, 0); // draw X and Y labels: 10 labels for x and y int dh = h / 10; int dw = w / 10; int dx = 25; double dy = 25; int xp = 2 * gap, yp = 0, x = 0, x0, y0, x1, y1; double y = 0; // draw X and Y grid labels g.drawString(String.valueOf((int) y), 0, h + 8); g.drawString(String.valueOf(x), xp - 5, h + gap); for (int i = 0; i < 10; i++) { xp += dw; yp += dh; x += dx; y += dy; g.drawLine(xp, h, xp, h - 5); g.drawLine(2 * gap, h - yp, 2 * gap + 5, h - yp); g.drawString(String.valueOf((int) y), 0, h - yp + 8); g.drawString(String.valueOf(x), xp - 5, h + gap); } Color c = g.getColor(); for (int i = 0; i < 3; i++) { g.setColor(lineColors[i]); // set up the line data for drawing one line a time for (int j = 0; j < 255; j++) { x0 = (w * j / 255) + 2 * gap; y0 = (h - h * paletteData[i][j] / 255); x1 = (w * (j + 1) / 255) + 2 * gap; y1 = (h - h * (paletteData[i][j + 1]) / 255); g.drawLine(x0, y0, x1, y1); } x0 = w + legendSpace; y0 = gap + gap * i; g.drawLine(x0, y0, x0 + 7, y0); g.drawString(lineLabels[i], x0 + 10, y0 + 3); } g.setColor(c); // set the color back to its default // draw a box on the legend g.drawRect(w + legendSpace - 10, 10, legendSpace, 10 * gap); } // public void paint(Graphics g) } // private class ChartPanel extends Canvas } // private class PaletteView extends ChartView jhdf-2.9/ncsa/hdf/view/ViewManager.java0000644000175000017500000000431012050301063020654 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import ncsa.hdf.object.HObject; /** * * Defines a list of APIs for the main HDFView winodows * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public abstract interface ViewManager { /** data content is displayed, and add the dataview to the main windows */ public abstract void addDataView(DataView dataView); /** data content is closed, and remove the dataview from the main window */ public abstract void removeDataView(DataView dataView); /** * Returns DataView contains the specified data object. It is useful to * avoid redundant display of data object that is opened already. * * @param dataObject * the whose presence in the main view is to be tested. * @return DataView contains the specified data object, null if the data * object is not displayed. */ public abstract DataView getDataView(HObject dataObject); /** display feedback message */ public abstract void showStatus(String msg); /** returns the current treeView */ public abstract TreeView getTreeView(); /** Tree mouse event fired */ public abstract void mouseEventFired(java.awt.event.MouseEvent e); } jhdf-2.9/ncsa/hdf/view/DefaultTextView.java0000755000175000017500000006461012050301063021547 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.io.BufferedInputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.InputStream; import java.io.PrintWriter; import java.io.RandomAccessFile; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.print.Doc; import javax.print.DocFlavor; import javax.print.DocPrintJob; import javax.print.PrintService; import javax.print.PrintServiceLookup; import javax.print.SimpleDoc; import javax.print.StreamPrintServiceFactory; import javax.swing.CellEditor; import javax.swing.DefaultCellEditor; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JViewport; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ListSelectionEvent; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; /** * TextView displays an HDF string dataset in text. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class DefaultTextView extends JInternalFrame implements TextView, ActionListener, KeyListener { private static final long serialVersionUID = 3892752752951438428L; /** * The main HDFView. */ private final ViewManager viewer; /** * The Scalar Dataset. */ private ScalarDS dataset; /** * The string text. */ private String[] text; /** The table to display the text content */ private JTable table; // Text areas to hold the text. // private JTextArea[] textAreas; private boolean isReadOnly = false; private boolean isTextChanged = false; private TextAreaEditor textEditor = null; private RowHeader rowHeaders = null; private int indexBase = 0; /** * Constructs an TextView. *

    * * @param theView * the main HDFView. */ public DefaultTextView(ViewManager theView) { this(theView, null); } /** * Constructs an TextView. *

    * * @param theView * the main HDFView. * @param map * the properties on how to show the data. The map is used to * allow applications to pass properties on how to display the * data, such as, transposing data, showing data as character, * applying bitmask, and etc. Predefined keys are listed at * ViewProperties.DATA_VIEW_KEY. */ public DefaultTextView(ViewManager theView, HashMap map) { viewer = theView; text = null; table = null; dataset = null; textEditor = new TextAreaEditor(this); if (ViewProperties.isIndexBase1()) indexBase = 1; HObject hobject = null; if (map != null) hobject = (HObject) map.get(ViewProperties.DATA_VIEW_KEY.OBJECT); else hobject = theView.getTreeView().getCurrentObject(); if (!(hobject instanceof ScalarDS)) { return; } dataset = (ScalarDS) hobject; if (!dataset.isText()) { viewer.showStatus("Cannot display non-text dataset in text view."); dataset = null; return; } isReadOnly = dataset.getFileFormat().isReadOnly(); try { text = (String[]) dataset.getData(); } catch (Exception ex) { JOptionPane.showMessageDialog( this, ex, "TextView:"+getTitle(), JOptionPane.ERROR_MESSAGE); text = null; } if (text == null) { viewer.showStatus("Loading text dataset failed - " + dataset.getName()); dataset = null; return; } String fname = new java.io.File(dataset.getFile()).getName(); this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.setTitle("TextView - " + dataset.getName() + " - " + dataset.getPath() + " - " + fname); this.setFrameIcon(ViewProperties.getTextIcon()); int rank = dataset.getRank(); long start[] = dataset.getStartDims(); long count[] = dataset.getSelectedDims(); String colName = "Data selection: ["+start[0]; for (int i=1; i= 0) { // make sure to update the current row String cellValue = (String) textEditor.getCellEditorValue(); text[row] = cellValue; } try { dataset.write(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); return; } isTextChanged = false; } /** Save data as text. */ private void saveAsText() throws Exception { final JFileChooser fchooser = new JFileChooser(dataset.getFile()); fchooser.setFileFilter(DefaultFileFilter.getFileFilterText()); fchooser.changeToParentDirectory(); fchooser.setDialogTitle("Save Current Data To Text File --- " + dataset.getName()); File choosedFile = new File(dataset.getName() + ".txt"); ; fchooser.setSelectedFile(choosedFile); int returnVal = fchooser.showSaveDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); // check if the file is in use List fileList = viewer.getTreeView().getCurrentFiles(); if (fileList != null) { FileFormat theFile = null; Iterator iterator = fileList.iterator(); while (iterator.hasNext()) { theFile = (FileFormat) iterator.next(); if (theFile.getFilePath().equals(fname)) { JOptionPane.showMessageDialog(this, "Unable to save data to file \"" + fname + "\". \nThe file is being used.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } } } if (choosedFile.exists()) { int newFileFlag = JOptionPane.showConfirmDialog(this, "File exists. Do you want to replace it ?", this.getTitle(), JOptionPane.YES_NO_OPTION); if (newFileFlag == JOptionPane.NO_OPTION) { return; } } PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter( choosedFile))); int rows = text.length; for (int i = 0; i < rows; i++) { out.print(text[i].trim()); out.println(); out.println(); } out.flush(); out.close(); viewer.showStatus("Data save to: " + fname); try { RandomAccessFile rf = new RandomAccessFile(choosedFile, "r"); long size = rf.length(); rf.close(); viewer.showStatus("File size (bytes): " + size); } catch (Exception ex) { } } @Override public void dispose() { if (isTextChanged && !isReadOnly) { int op = JOptionPane.showConfirmDialog(this, "\"" + dataset.getName() + "\" has changed.\n" + "Do you want to save the changes?", getTitle(), JOptionPane.YES_NO_OPTION); if (op == JOptionPane.YES_OPTION) { updateValueInFile(); } } viewer.removeDataView(this); super.dispose(); } // Implementing DataView. public HObject getDataObject() { return dataset; } // Implementing TextView. public String[] getText() { return text; } // print the table private void print() { StreamPrintServiceFactory[] spsf = StreamPrintServiceFactory .lookupStreamPrintServiceFactories(null, null); for (int i = 0; i < spsf.length; i++) { System.out.println(spsf[i]); } DocFlavor[] docFlavors = spsf[0].getSupportedDocFlavors(); for (int i = 0; i < docFlavors.length; i++) { System.out.println(docFlavors[i]); } // Get a text DocFlavor InputStream is = null; try { is = new BufferedInputStream(new java.io.FileInputStream( "e:\\temp\\t.html")); } catch (Exception ex) { } DocFlavor flavor = DocFlavor.STRING.TEXT_HTML; // Get all available print services PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); // Print this job on the first print server DocPrintJob job = services[0].createPrintJob(); Doc doc = new SimpleDoc(is, flavor, null); // Print it try { job.print(doc, null); } catch (Exception ex) { System.out.println(ex); } } private class TextAreaRenderer extends JTextArea implements TableCellRenderer { private static final long serialVersionUID = -5869975162678521978L; private final DefaultTableCellRenderer adaptee = new DefaultTableCellRenderer(); /** map from table to map of rows to map of column heights */ private final Map cellSizes = new HashMap(); public TextAreaRenderer() { setLineWrap(true); setWrapStyleWord(true); } public Component getTableCellRendererComponent( // JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) { // set the colours, etc. using the standard for that platform adaptee.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column); setForeground(adaptee.getForeground()); setBackground(adaptee.getBackground()); setBorder(adaptee.getBorder()); setFont(adaptee.getFont()); setText(adaptee.getText()); // This line was very important to get it working with JDK1.4 TableColumnModel columnModel = table.getColumnModel(); setSize(columnModel.getColumn(column).getWidth(), 100000); int height_wanted = (int) getPreferredSize().getHeight(); addSize(table, row, column, height_wanted); height_wanted = findTotalMaximumRowSize(table, row); if (height_wanted != table.getRowHeight(row)) { table.setRowHeight(row, height_wanted); rowHeaders.setRowHeight(row, height_wanted); } return this; } private void addSize(JTable table, int row, int column, int height) { Map rows = (Map) cellSizes.get(table); if (rows == null) { cellSizes.put(table, rows = new HashMap()); } Map rowheights = (Map) rows.get(new Integer(row)); if (rowheights == null) { rows.put(new Integer(row), rowheights = new HashMap()); } rowheights.put(new Integer(column), new Integer(height)); } /** * Look through all columns and get the renderer. If it is also a * TextAreaRenderer, we look at the maximum height in its hash table for * this row. */ private int findTotalMaximumRowSize(JTable table, int row) { int maximum_height = 0; Enumeration columns = table.getColumnModel().getColumns(); while (columns.hasMoreElements()) { TableColumn tc = (TableColumn) columns.nextElement(); TableCellRenderer cellRenderer = tc.getCellRenderer(); if (cellRenderer instanceof TextAreaRenderer) { TextAreaRenderer tar = (TextAreaRenderer) cellRenderer; maximum_height = Math.max(maximum_height, tar .findMaximumRowSize(table, row)); } } return maximum_height; } private int findMaximumRowSize(JTable table, int row) { Map rows = (Map) cellSizes.get(table); if (rows == null) { return 0; } Map rowheights = (Map) rows.get(new Integer(row)); if (rowheights == null) { return 0; } int maximum_height = 0; for (Iterator it = rowheights.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); int cellHeight = ((Integer) entry.getValue()).intValue(); maximum_height = Math.max(maximum_height, cellHeight); } return maximum_height; } } private class TextAreaEditor extends DefaultCellEditor { private static final long serialVersionUID = 1721646779892184957L; public TextAreaEditor(KeyListener keyListener) { super(new JTextField()); final JTextArea textArea = new JTextArea(); textArea.addKeyListener(keyListener); textArea.setWrapStyleWord(true); textArea.setLineWrap(true); JScrollPane scrollPane = new JScrollPane(textArea); scrollPane.setBorder(null); editorComponent = scrollPane; delegate = new DefaultCellEditor.EditorDelegate() { private static final long serialVersionUID = 7662356579385373160L; @Override public void setValue(Object value) { textArea.setText((value != null) ? value.toString() : ""); } @Override public Object getCellEditorValue() { return textArea.getText(); } }; } } /** RowHeader defines the row header component of the Spreadsheet. */ private class RowHeader extends JTable { private static final long serialVersionUID = 2572539746584274419L; private int currentRowIndex = -1; private int lastRowIndex = -1; private JTable parentTable; public RowHeader(JTable pTable, Dataset dset) { // Create a JTable with the same number of rows as // the parent table and one column. super(pTable.getRowCount(), 1); long[] startArray = dset.getStartDims(); long[] strideArray = dset.getStride(); int[] selectedIndex = dset.getSelectedIndex(); int start = (int) startArray[selectedIndex[0]]; int stride = (int) strideArray[selectedIndex[0]]; // Store the parent table. parentTable = pTable; // Set the values of the row headers starting at 0. int n = parentTable.getRowCount(); for (int i = 0; i < n; i++) { setValueAt(new Integer(start + indexBase+ i * stride), i, 0); } // Get the only table column. TableColumn col = getColumnModel().getColumn(0); // Use the cell renderer in the column. col.setCellRenderer(new RowHeaderRenderer()); } /** Overridden to return false since the headers are not editable. */ @Override public boolean isCellEditable(int row, int col) { return false; } /** This is called when the selection changes in the row headers. */ @Override public void valueChanged(ListSelectionEvent e) { if (parentTable == null) { return; } int rows[] = getSelectedRows(); if ((rows == null) || (rows.length == 0)) { return; } parentTable.clearSelection(); parentTable.setRowSelectionInterval(rows[0], rows[rows.length - 1]); parentTable.setColumnSelectionInterval(0, parentTable .getColumnCount() - 1); } @Override protected void processMouseMotionEvent(MouseEvent e) { if (e.getID() == MouseEvent.MOUSE_DRAGGED) { int colEnd = rowAtPoint(e.getPoint()); if (colEnd < 0) { colEnd = 0; } if (currentRowIndex < 0) { currentRowIndex = 0; } parentTable.clearSelection(); if (colEnd > currentRowIndex) { parentTable .setRowSelectionInterval(currentRowIndex, colEnd); } else { parentTable .setRowSelectionInterval(colEnd, currentRowIndex); } parentTable.setColumnSelectionInterval(0, parentTable .getColumnCount() - 1); } } @Override protected void processMouseEvent(MouseEvent e) { int mouseID = e.getID(); if (mouseID == MouseEvent.MOUSE_CLICKED) { if (currentRowIndex < 0) { return; } if (e.isControlDown()) { // select discontinguous rows parentTable.addRowSelectionInterval(currentRowIndex, currentRowIndex); } else if (e.isShiftDown()) { // select continguous columns if (lastRowIndex < 0) { parentTable.addRowSelectionInterval(0, currentRowIndex); } else if (lastRowIndex < currentRowIndex) { parentTable.addRowSelectionInterval(lastRowIndex, currentRowIndex); } else { parentTable.addRowSelectionInterval(currentRowIndex, lastRowIndex); } } else { // clear old selection and set new column selection parentTable.clearSelection(); parentTable.setRowSelectionInterval(currentRowIndex, currentRowIndex); } lastRowIndex = currentRowIndex; parentTable.setColumnSelectionInterval(0, parentTable .getColumnCount() - 1); } else if (mouseID == MouseEvent.MOUSE_PRESSED) { currentRowIndex = rowAtPoint(e.getPoint()); } } } // private class RowHeader extends JTable /** * RowHeaderRenderer is a custom cell renderer that displays cells as * buttons. */ private class RowHeaderRenderer extends JLabel implements TableCellRenderer { private static final long serialVersionUID = 3081275694689434654L; public RowHeaderRenderer() { super(); setHorizontalAlignment(SwingConstants.CENTER); setOpaque(true); setBorder(UIManager.getBorder("TableHeader.cellBorder")); setBackground(Color.lightGray); } /** Configures the button for the current cell, and returns it. */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setFont(table.getFont()); if (value != null) { setText(value.toString()); } return this; } } // private class RowHeaderRenderer extends JLabel implements // TableCellRenderer } jhdf-2.9/ncsa/hdf/view/DefaultMetaDataView.java0000755000175000017500000014371712050301063022311 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; import java.lang.reflect.Array; import java.math.BigInteger; import java.util.Enumeration; import java.util.List; import java.util.StringTokenizer; import javax.swing.BorderFactory; import javax.swing.CellEditor; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.table.DefaultTableModel; import javax.swing.tree.DefaultMutableTreeNode; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; /** * DefaultMetadataView is an dialog window used to show data properties. Data * properties include attributes and general information such as object type, * data type and data space. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class DefaultMetaDataView extends JDialog implements ActionListener, MetaDataView { private static final long serialVersionUID = 7891048909810508761L; /** * The main HDFView. */ private ViewManager viewer; /** The HDF data object */ private HObject hObject; private JTabbedPane tabbedPane = null; private JTextArea attrContentArea; private JTable attrTable; // table to hold a list of attributes private DefaultTableModel attrTableModel; private JLabel attrNumberLabel; private int numAttributes; private boolean isH5, isH4; private byte[] userBlock; private JTextArea userBlockArea; private JButton jamButton; private JTextField linkField = null; private FileFormat fileFormat; private String LinkTObjName; private int[] libver; /** * Constructs a DefaultMetadataView with the given HDFView. */ public DefaultMetaDataView(ViewManager theView) { super((JFrame) theView, false); setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE); setName("DefaultMetaDataView"); viewer = theView; hObject = viewer.getTreeView().getCurrentObject(); fileFormat = hObject.getFileFormat(); numAttributes = 0; userBlock = null; userBlockArea = null; libver = new int[2]; if (hObject == null) { dispose(); } else if (hObject.getPath() == null) { setTitle("Properties - " + hObject.getName()); } else { setTitle("Properties - " + hObject.getPath() + hObject.getName()); } isH5 = hObject.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); isH4 = hObject.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4)); tabbedPane = new JTabbedPane(); // get the metadata information before add GUI components */ try { hObject.getMetadata(); } catch (Exception ex) { } tabbedPane.addTab("General", createGeneralPropertyPanel()); tabbedPane.addTab("Attributes", createAttributePanel()); boolean isRoot = ((hObject instanceof Group) && ((Group) hObject).isRoot()); if (isH5 && isRoot) { // add panel to display user block tabbedPane.addTab("User Block", createUserBlockPanel()); } tabbedPane.setSelectedIndex(0); if (isH5) { if (hObject.getLinkTargetObjName() != null) { LinkTObjName = hObject.getLinkTargetObjName(); } } JPanel bPanel = new JPanel(); bPanel.setName("MetaDataClose"); JButton b = new JButton(" Close "); b.setName("Close"); b.setMnemonic(KeyEvent.VK_C); b.setActionCommand("Close"); b.addActionListener(this); bPanel.add(b); // Add the tabbed pane to this panel. JPanel contentPane = (JPanel) getContentPane(); contentPane.setName("MetaDataContent"); contentPane.setLayout(new BorderLayout()); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); contentPane.setPreferredSize(new Dimension(620, 400)); contentPane.add("Center", tabbedPane); contentPane.add("South", bPanel); // locate the H5Property dialog Point l = getParent().getLocation(); l.x += 250; l.y += 80; setLocation(l); pack(); setVisible(true); } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Close")) { if (isH5 && linkField != null) checkLinkTargetChanged(); dispose(); } else if (cmd.equals("Add attribute")) { addAttribute(hObject); } else if (cmd.equals("Delete attribute")) { deleteAttribute(hObject); } else if (cmd.equals("Jam user block")) { writeUserBlock(); } else if (cmd.equals("Display user block as")) { int type = 0; String typeName = (String) ((JComboBox) source).getSelectedItem(); jamButton.setEnabled(false); userBlockArea.setEditable(false); if (typeName.equalsIgnoreCase("Text")) { type = 0; jamButton.setEnabled(true); userBlockArea.setEditable(true); } else if (typeName.equalsIgnoreCase("Binary")) { type = 2; } else if (typeName.equalsIgnoreCase("Octal")) { type = 8; } else if (typeName.equalsIgnoreCase("Hexadecimal")) { type = 16; } else if (typeName.equalsIgnoreCase("Decimal")) { type = 10; } showUserBlockAs(type); } } private final void checkLinkTargetChanged() { Group pgroup = null; try { pgroup = (Group) hObject.getFileFormat().get(hObject.getPath()); } catch (Exception ex) { } if (pgroup == null) { JOptionPane.showMessageDialog(this, "Parent group is null.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } String target_name = linkField.getText(); if (target_name != null) target_name = target_name.trim(); int linkType = Group.LINK_TYPE_SOFT; if (LinkTObjName.contains(FileFormat.FILE_OBJ_SEP)) linkType = Group.LINK_TYPE_EXTERNAL; else if (target_name.equals("/")) // do not allow to link to the root return; // no change if (target_name.equals(hObject.getLinkTargetObjName())) return; // invalid name if (target_name == null || target_name.length() < 1) return; try { fileFormat.createLink(pgroup, hObject.getName(), target_name, linkType); hObject.setLinkTargetObjName(target_name); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } /** returns the data object displayed in this data viewer */ public HObject getDataObject() { return hObject; } /** Disposes of this dataobserver. */ public void dispose() { super.dispose(); } /** add an attribute to a data object. */ public Attribute addAttribute(HObject obj) { if (obj == null) { return null; } DefaultMutableTreeNode node = (DefaultMutableTreeNode) obj.getFileFormat().getRootNode(); NewAttributeDialog dialog = new NewAttributeDialog(this, obj, node.breadthFirstEnumeration()); dialog.setVisible(true); Attribute attr = dialog.getAttribute(); if (attr == null) { return null; } String rowData[] = new String[4]; // name, value, type, size rowData[0] = attr.getName(); rowData[2] = attr.getType().getDatatypeDescription(); rowData[1] = attr.toString(", "); long dims[] = attr.getDataDims(); rowData[3] = String.valueOf(dims[0]); for (int j = 1; j < dims.length; j++) { rowData[3] += " x " + dims[j]; } attrTableModel.addRow(rowData); attrTableModel.fireTableRowsInserted(attrTableModel.getRowCount() - 1, attrTableModel.getRowCount() - 1); numAttributes++; attrContentArea.setText(""); attrNumberLabel.setText("Number of attributes = " + numAttributes); return attr; } /** delete an attribute from a data object. */ public Attribute deleteAttribute(HObject obj) { if (obj == null) { return null; } int idx = attrTable.getSelectedRow(); if (idx < 0) { JOptionPane.showMessageDialog(getOwner(), "No attribute is selected.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } int option = JOptionPane.showConfirmDialog(this, "Do you want to delete the selected attribute?", getTitle(), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if (option == JOptionPane.NO_OPTION) { return null; } List attrList = null; try { attrList = obj.getMetadata(); } catch (Exception ex) { attrList = null; } if (attrList == null) { return null; } Attribute attr = (Attribute) attrList.get(idx); try { obj.removeMetadata(attr); } catch (Exception ex) { ; } attrTableModel.removeRow(idx); numAttributes--; attrTableModel.fireTableRowsDeleted(idx, idx); attrContentArea.setText(""); attrNumberLabel.setText("Number of attributes = " + numAttributes); return attr; } /** * Creates a panel used to dispaly general information of HDF object. */ private JPanel createGeneralPropertyPanel() { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout(10, 10)); panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); boolean isRoot = ((hObject instanceof Group) && ((Group) hObject).isRoot()); FileFormat theFile = hObject.getFileFormat(); JPanel topPanel = new JPanel(); topPanel.setLayout(new BorderLayout()); JPanel lp = new JPanel(); lp.setLayout(new GridLayout(5, 1)); if (isRoot) { lp.add(new JLabel("File Name: ")); lp.add(new JLabel("File Path: ")); lp.add(new JLabel("File Type: ")); if (isH5) { try { libver = hObject.getFileFormat().getLibBounds(); } catch (Exception ex) { ex.printStackTrace(); } if (((libver[0] == 0) || (libver[0] == 1)) && (libver[1] == 1)) lp.add(new JLabel("Library version: ")); } } else { lp.add(new JLabel("Name: ")); if (isH5) { if (hObject.getLinkTargetObjName() != null) lp.add(new JLabel("Link To Target: ")); } lp.add(new JLabel("Path: ")); lp.add(new JLabel("Type: ")); /* bug #926 to remove the OID, put it back on Nov. 20, 2008, --PC */ if (isH4) { lp.add(new JLabel("Tag, Ref: ")); } else { lp.add(new JLabel("Object Ref: ")); } } JPanel rp = new JPanel(); rp.setLayout(new GridLayout(5, 1)); JLabel nameField = new JLabel(hObject.getName()); rp.add(nameField); JPanel targetObjPanel = new JPanel(); JButton ChangeTargetObjButton = new JButton("Change"); ChangeTargetObjButton.setActionCommand("Change link target"); ChangeTargetObjButton.addActionListener(this); if (isH5) { if (hObject.getLinkTargetObjName() != null) { linkField = new JTextField(hObject.getLinkTargetObjName()); targetObjPanel.setLayout(new BorderLayout()); targetObjPanel.add(linkField, BorderLayout.CENTER); // targetObjPanel.add(ChangeTargetObjButton, BorderLayout.EAST); rp.add(targetObjPanel); } } JLabel pathField = new JLabel(); if (isRoot) { pathField.setText((new File(hObject.getFile())).getParent()); } else { pathField.setText(hObject.getPath()); } rp.add(pathField); String typeStr = "Unknown"; String fileInfo = ""; if (isRoot) { long size = 0; try { size = (new File(hObject.getFile())).length(); } catch (Exception ex) { size = -1; } size /= 1024; int groupCount = 0, datasetCount = 0; DefaultMutableTreeNode root = (DefaultMutableTreeNode) theFile.getRootNode(); DefaultMutableTreeNode theNode = null; Enumeration local_enum = root.depthFirstEnumeration(); while (local_enum.hasMoreElements()) { theNode = (DefaultMutableTreeNode) local_enum.nextElement(); if (theNode.getUserObject() instanceof Group) { groupCount++; } else { datasetCount++; } } fileInfo = "size=" + size + "K, groups=" + groupCount + ", datasets=" + datasetCount; } if (isRoot) { if (isH5) { typeStr = "HDF5, " + fileInfo; } else if (isH4) { typeStr = "HDF4, " + fileInfo; } else { typeStr = fileInfo; } } else if (isH5) { if (hObject instanceof Group) { typeStr = "HDF5 Group"; } else if (hObject instanceof ScalarDS) { typeStr = "HDF5 Scalar Dataset"; } else if (hObject instanceof CompoundDS) { typeStr = "HDF5 Compound Dataset"; } else if (hObject instanceof Datatype) { typeStr = "HDF5 Named Datatype"; } } else if (isH4) { if (hObject instanceof Group) { typeStr = "HDF4 Group"; } else if (hObject instanceof ScalarDS) { ScalarDS ds = (ScalarDS) hObject; if (ds.isImage()) { typeStr = "HDF4 Raster Image"; } else { typeStr = "HDF4 SDS"; } } else if (hObject instanceof CompoundDS) { typeStr = "HDF4 Vdata"; } } else { if (hObject instanceof Group) { typeStr = "Group"; } else if (hObject instanceof ScalarDS) { typeStr = "Scalar Dataset"; } else if (hObject instanceof CompoundDS) { typeStr = "Compound Dataset"; } } JLabel typeField = new JLabel(typeStr); rp.add(typeField); if (isRoot && isH5) { String libversion = null; if ((libver[0] == 0) && (libver[1] == 1)) libversion = "Earliest and Latest"; else if ((libver[0] == 1) && (libver[1] == 1)) libversion = "Latest and Latest"; JLabel libverbound = new JLabel(libversion); rp.add(libverbound); } /* bug #926 to remove the OID, put it back on Nov. 20, 2008, --PC */ String oidStr = null; long[] OID = hObject.getOID(); if (OID != null) { oidStr = String.valueOf(OID[0]); for (int i = 1; i < OID.length; i++) { oidStr += ", " + OID[i]; } } if (!isRoot) { JLabel oidField = new JLabel(oidStr); rp.add(oidField); } JPanel tmpP = new JPanel(); tmpP.setLayout(new BorderLayout()); tmpP.add("West", lp); tmpP.add("Center", rp); tmpP.setBorder(new TitledBorder("")); topPanel.add("North", new JLabel("")); topPanel.add("Center", tmpP); JPanel infoPanel = null; if (hObject instanceof Group) { infoPanel = createGroupInfoPanel((Group) hObject); } else if (hObject instanceof Dataset) { infoPanel = createDatasetInfoPanel((Dataset) hObject); } else if (hObject instanceof Datatype) { infoPanel = createNamedDatatypeInfoPanel((Datatype) hObject); } panel.add(topPanel, BorderLayout.NORTH); if (infoPanel != null) { panel.add(infoPanel, BorderLayout.CENTER); } return panel; } /** * Creates a panel used to display HDF group information. */ private JPanel createGroupInfoPanel(Group g) { JPanel panel = new JPanel(); List mlist = g.getMemberList(); if (mlist == null) { return panel; } int n = mlist.size(); if (n <= 0) { return panel; } String rowData[][] = new String[n][2]; for (int i = 0; i < n; i++) { HObject theObj = (HObject) mlist.get(i); rowData[i][0] = theObj.getName(); if (theObj instanceof Group) { rowData[i][1] = "Group"; } else if (theObj instanceof Dataset) { rowData[i][1] = "Dataset"; } } String[] columnNames = { "Name", "Type" }; JTable table = new JTable(rowData, columnNames) { private static final long serialVersionUID = -834321929059590629L; public boolean isCellEditable(int row, int column) { return false; } }; table.setName("GroupInfo"); table.setCellSelectionEnabled(false); // set cell height for large fonts int cellRowHeight = Math.max(16, table.getFontMetrics(table.getFont()).getHeight()); table.setRowHeight(cellRowHeight); table.getTableHeader().setReorderingAllowed(false); JScrollPane scroller = new JScrollPane(table); panel.setLayout(new BorderLayout()); if (g.getNumberOfMembersInFile() < ViewProperties.getMaxMembers()) { panel.add(new JLabel("Number of members: " + n), BorderLayout.NORTH); } else { panel.add(new JLabel("Number of members: " + n + " (in memory), " + g.getNumberOfMembersInFile() + " (in file)"), BorderLayout.NORTH); } panel.add(scroller, BorderLayout.CENTER); panel.setBorder(new TitledBorder("Group Members")); return panel; } private JPanel createNamedDatatypeInfoPanel(Datatype t) { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); JTextArea infoArea = new JTextArea(t.getDatatypeDescription()); infoArea.setEditable(false); panel.add(infoArea, BorderLayout.CENTER); return panel; } /** * Creates a panel used to display HDF dataset information. */ private JPanel createDatasetInfoPanel(Dataset d) { JPanel lp = new JPanel(); lp.setLayout(new GridLayout(4, 1)); lp.add(new JLabel("No. of Dimension(s): ")); lp.add(new JLabel("Dimension Size(s): ")); lp.add(new JLabel("Max Dimension Size(s): ")); lp.add(new JLabel("Data Type: ")); JPanel rp = new JPanel(); rp.setLayout(new GridLayout(4, 1)); if (d.getRank() <= 0) { d.init(); } JTextField txtf = new JTextField("" + d.getRank()); txtf.setEditable(false); rp.add(txtf); String dimStr = null; String maxDimStr = null; long dims[] = d.getDims(); long maxDims[] = d.getMaxDims(); if (dims != null) { String[] dimNames = d.getDimNames(); boolean hasDimNames = ((dimNames != null) && (dimNames.length == dims.length)); StringBuffer sb = new StringBuffer(); StringBuffer sb2 = new StringBuffer(); sb.append(dims[0]); if (hasDimNames) { sb.append(" ("); sb.append(dimNames[0]); sb.append(")"); } if (maxDims[0] < 0) sb2.append("Unlimited"); else sb2.append(maxDims[0]); for (int i = 1; i < dims.length; i++) { sb.append(" x "); sb.append(dims[i]); if (hasDimNames) { sb.append(" ("); sb.append(dimNames[i]); sb.append(")"); } sb2.append(" x "); if (maxDims[i] < 0) sb2.append("Unlimited"); else sb2.append(maxDims[i]); } dimStr = sb.toString(); maxDimStr = sb2.toString(); } txtf = new JTextField(dimStr); txtf.setEditable(false); rp.add(txtf); txtf = new JTextField(maxDimStr); txtf.setEditable(false); rp.add(txtf); String typeStr = null; if (d instanceof ScalarDS) { ScalarDS sd = (ScalarDS) d; typeStr = sd.getDatatype().getDatatypeDescription(); } else if (d instanceof CompoundDS) { if (isH4) { typeStr = "Vdata"; } else { typeStr = "Compound"; } } txtf = new JTextField(typeStr); txtf.setEditable(false); rp.add(txtf); JPanel infoP = new JPanel(); infoP.setLayout(new BorderLayout()); infoP.add(lp, BorderLayout.WEST); infoP.add(rp, BorderLayout.CENTER); infoP.setBorder(new TitledBorder("")); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(infoP, BorderLayout.NORTH); panel.setBorder(new TitledBorder("Dataspace and Datatype")); // add compound datatype information if (d instanceof CompoundDS) { CompoundDS compound = (CompoundDS) d; int n = compound.getMemberCount(); if (n > 0) { String rowData[][] = new String[n][3]; String names[] = compound.getMemberNames(); Datatype types[] = compound.getMemberTypes(); int orders[] = compound.getMemberOrders(); for (int i = 0; i < n; i++) { rowData[i][0] = names[i]; int mDims[] = compound.getMemeberDims(i); if (mDims == null) { rowData[i][2] = String.valueOf(orders[i]); if (isH4 && types[i].getDatatypeClass() == Datatype.CLASS_STRING) { rowData[i][2] = String.valueOf(types[i].getDatatypeSize()); } } else { String mStr = String.valueOf(mDims[0]); int m = mDims.length; for (int j = 1; j < m; j++) { mStr += " x " + mDims[j]; } rowData[i][2] = mStr; } rowData[i][1] = types[i].getDatatypeDescription(); } String[] columnNames = { "Name", "Type", "Array Size" }; JTable table = new JTable(rowData, columnNames) { private static final long serialVersionUID = -1517773307922536859L; public boolean isCellEditable(int row, int column) { return false; } }; table.setName("CompoundMetaData"); table.setCellSelectionEnabled(false); table.getTableHeader().setReorderingAllowed(false); panel.add(new JScrollPane(table), BorderLayout.CENTER); // set cell height for large fonts int cellRowHeight = Math.max(16, table.getFontMetrics(table.getFont()).getHeight()); table.setRowHeight(cellRowHeight); } // if (n > 0) } // if (d instanceof Compound) // add compression and data lauoyt information // try { d.getMetadata(); } catch (Exception ex) {} String chunkInfo = ""; long[] chunks = d.getChunkSize(); if (chunks == null) { chunkInfo = "NONE"; } else { int n = chunks.length; chunkInfo = String.valueOf(chunks[0]); for (int i = 1; i < n; i++) { chunkInfo += " X " + chunks[i]; } } JPanel bPanel = new JPanel(); bPanel.setBorder(new TitledBorder("")); bPanel.setLayout(new BorderLayout()); lp = new JPanel(); lp.setLayout(new GridLayout(3, 1)); lp.add(new JLabel("Chunking: ")); lp.add(new JLabel("Compression: ")); lp.add(new JLabel("Fill value: ")); bPanel.add(lp, BorderLayout.WEST); Object fillValue = null; String fillValueInfo = "NONE"; if (d instanceof ScalarDS) fillValue = ((ScalarDS) d).getFillValue(); if (fillValue != null) { if (fillValue.getClass().isArray()) { int len = Array.getLength(fillValue); fillValueInfo = Array.get(fillValue, 0).toString(); for (int i = 1; i < len; i++) { fillValueInfo += ", "; fillValueInfo += Array.get(fillValue, i).toString(); } } else fillValueInfo = fillValue.toString(); } rp = new JPanel(); rp.setLayout(new GridLayout(3, 1)); rp.add(new JLabel(chunkInfo)); rp.add(new JLabel(d.getCompression())); rp.add(new JLabel(fillValueInfo)); bPanel.add(rp, BorderLayout.CENTER); panel.add(bPanel, BorderLayout.SOUTH); return panel; } /** * Creates a panel used to display attribute information. */ private JPanel createAttributePanel() { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); // panel.setBorder(BorderFactory.createEmptyBorder(10,0,0,0)); JPanel topPanel = new JPanel(); topPanel.setLayout(new BorderLayout()); attrNumberLabel = new JLabel("Number of attributes = 0"); topPanel.add(attrNumberLabel, BorderLayout.WEST); FileFormat theFile = hObject.getFileFormat(); JPanel bPanel = new JPanel(); JButton b = new JButton(" Add "); b.setMnemonic('A'); b.addActionListener(this); b.setActionCommand("Add attribute"); bPanel.add(b); b.setEnabled(!theFile.isReadOnly()); if (isH5) { // deleting is not supported by HDF4 b = new JButton("Delete"); b.setMnemonic('D'); b.addActionListener(this); b.setActionCommand("Delete attribute"); bPanel.add(b); b.setEnabled(!theFile.isReadOnly()); } topPanel.add(bPanel, BorderLayout.EAST); panel.add(topPanel, BorderLayout.NORTH); List attrList = null; try { attrList = hObject.getMetadata(); } catch (Exception ex) { attrList = null; } if (attrList != null) { numAttributes = attrList.size(); } String[] columnNames = { "Name", "Value", "Type", "Array Size" }; attrTableModel = new DefaultTableModel(columnNames, numAttributes); attrTable = new JTable(attrTableModel) { private static final long serialVersionUID = 2590244645972259454L; int lastSelectedRow = -1; int lastSelectedCol = -1; public boolean isCellEditable(int row, int column) { return ((column == 1) || (isH5 && (column == 0))); // only // attribute // value and // name can // be changed } public void editingStopped(ChangeEvent e) { int row = getEditingRow(); int col = getEditingColumn(); String oldValue = (String) getValueAt(row, col); super.editingStopped(e); Object source = e.getSource(); if (source instanceof CellEditor) { CellEditor editor = (CellEditor) source; String newValue = (String) editor.getCellEditorValue(); setValueAt(oldValue, row, col); // set back to what it is updateAttributeValue(newValue, row, col); } } public boolean isCellSelected(int row, int col) { if ((getSelectedRow() == row) && (getSelectedColumn() == col) && !((lastSelectedRow == row) && (lastSelectedCol == col))) { // selection is changed Object attrV = getValueAt(row, col); if (attrV != null) { attrContentArea.setText(attrV.toString()); } lastSelectedRow = row; lastSelectedCol = col; } return super.isCellSelected(row, col); } }; attrTable.setName("attributes"); attrTable.setRowSelectionAllowed(false); attrTable.setCellSelectionEnabled(true); attrTable.getTableHeader().setReorderingAllowed(false); attrTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // set cell height for large fonts int cellRowHeight = Math.max(16, attrTable.getFontMetrics(attrTable.getFont()).getHeight()); attrTable.setRowHeight(cellRowHeight); JScrollPane scroller1 = new JScrollPane(attrTable); attrContentArea = new JTextArea(); attrContentArea.setLineWrap(true); attrContentArea.setEditable(false); Insets m = new Insets(5, 5, 5, 5); attrContentArea.setMargin(m); JScrollPane scroller2 = new JScrollPane(attrContentArea); JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scroller1, scroller2); // set the divider location int h = Math.min((numAttributes + 2) * attrTable.getRowHeight(), scroller1.getPreferredSize().height - 40); splitPane.setDividerLocation(h); panel.add(splitPane, BorderLayout.CENTER); if (attrList == null) { return panel; } Attribute attr = null; String name, type, size; attrNumberLabel.setText("Number of attributes = " + numAttributes); for (int i = 0; i < numAttributes; i++) { attr = (Attribute) attrList.get(i); name = attr.getName(); // boolean isUnsigned = false; type = attr.getType().getDatatypeDescription(); // isUnsigned = attr.getType().isUnsigned(); if (attr.isScalar()) { size = "Scalar"; } else { long dims[] = attr.getDataDims(); size = String.valueOf(dims[0]); for (int j = 1; j < dims.length; j++) { size += " x " + dims[j]; } } attrTable.setValueAt(name, i, 0); attrTable.setValueAt(attr.toString(", "), i, 1); attrTable.setValueAt(type, i, 2); attrTable.setValueAt(size, i, 3); } // for (int i=0; i attrList = null; try { attrList = hObject.getMetadata(); } catch (Exception ex) { JOptionPane.showMessageDialog(getOwner(), ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return; } Attribute attr = (Attribute) attrList.get(row); if (col == 1) { // To change attribute value Object data = attr.getValue(); if (data == null) { return; } int array_length = Array.getLength(data); StringTokenizer st = new StringTokenizer(newValue, ","); if (st.countTokens() < array_length) { JOptionPane.showMessageDialog(getOwner(), "More data value needed: " + newValue, getTitle(), JOptionPane.ERROR_MESSAGE); return; } char NT = ' '; String cName = data.getClass().getName(); int cIndex = cName.lastIndexOf("["); if (cIndex >= 0) { NT = cName.charAt(cIndex + 1); } boolean isUnsigned = attr.isUnsigned(); double d = 0; String theToken = null; long max = 0, min = 0; for (int i = 0; i < array_length; i++) { max = min = 0; theToken = st.nextToken().trim(); try { if (!(Array.get(data, i) instanceof String)) { d = Double.parseDouble(theToken); } } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(getOwner(), ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return; } if (isUnsigned && (d < 0)) { JOptionPane.showMessageDialog(getOwner(), "Negative value for unsigned integer: " + theToken, getTitle(), JOptionPane.ERROR_MESSAGE); return; } switch (NT) { case 'B': { if (isUnsigned) { min = 0; max = 255; } else { min = Byte.MIN_VALUE; max = Byte.MAX_VALUE; } if ((d > max) || (d < min)) { JOptionPane.showMessageDialog(getOwner(), "Data is out of range[" + min + ", " + max + "]: " + theToken, getTitle(), JOptionPane.ERROR_MESSAGE); } else { Array.setByte(data, i, (byte) d); } break; } case 'S': { if (isUnsigned) { min = 0; max = 65535; } else { min = Short.MIN_VALUE; max = Short.MAX_VALUE; } if ((d > max) || (d < min)) { JOptionPane.showMessageDialog(getOwner(), "Data is out of range[" + min + ", " + max + "]: " + theToken, getTitle(), JOptionPane.ERROR_MESSAGE); } else { Array.setShort(data, i, (short) d); } break; } case 'I': { if (isUnsigned) { min = 0; max = 4294967295L; } else { min = Integer.MIN_VALUE; max = Integer.MAX_VALUE; } if ((d > max) || (d < min)) { JOptionPane.showMessageDialog(getOwner(), "Data is out of range[" + min + ", " + max + "]: " + theToken, getTitle(), JOptionPane.ERROR_MESSAGE); } else { Array.setInt(data, i, (int) d); } break; } case 'J': if (isUnsigned) { if (theToken != null) { String theValue = theToken; BigInteger Jmax = new BigInteger("18446744073709551615"); BigInteger big = new BigInteger(theValue); if ((big.compareTo(Jmax)>0) || (big.compareTo(BigInteger.ZERO)<0)) { JOptionPane.showMessageDialog(getOwner(), "Data is out of range[" + min + ", " + max + "]: " + theToken, getTitle(), JOptionPane.ERROR_MESSAGE); } Array.setLong(data, i, big.longValue()); } else Array.set(data, i, (Object)theToken); } else { min = Long.MIN_VALUE; max = Long.MAX_VALUE; if ((d > max) || (d < min)) { JOptionPane.showMessageDialog(getOwner(), "Data is out of range[" + min + ", " + max + "]: " + theToken, getTitle(), JOptionPane.ERROR_MESSAGE); } Array.setLong(data, i, (long) d); } break; case 'F': Array.setFloat(data, i, (float) d); break; case 'D': Array.setDouble(data, i, d); break; default: Array.set(data, i, (Object)theToken); break; } } try { hObject.getFileFormat().writeAttribute(hObject, attr, true); } catch (Exception ex) { JOptionPane.showMessageDialog(getOwner(), ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return; } // update the attribute table attrTable.setValueAt(attr.toString(", "), row, 1); } if ((col == 0) && isH5) { // To change attribute name try { hObject.getFileFormat().renameAttribute(hObject, attrName, newValue); } catch (Exception ex) { JOptionPane.showMessageDialog(getOwner(), ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return; } // update the attribute table attrTable.setValueAt(newValue, row, 0); } } private void writeUserBlock() { if (!isH5) { return; } int blkSize0 = 0; if (userBlock != null) { blkSize0 = userBlock.length; // The super block space is allocated by offset 0, 512, 1024, 2048, // etc if (blkSize0 > 0) { int offset = 512; while (offset < blkSize0) { offset *= 2; } blkSize0 = offset; } } int blkSize1 = 0; String userBlockStr = userBlockArea.getText(); if (userBlockStr == null) { if (blkSize0 <= 0) { return; // nothing to write } else { userBlockStr = " "; // want to wipe out old userblock content } } byte buf[] = null; buf = userBlockStr.getBytes(); blkSize1 = buf.length; if (blkSize1 <= blkSize0) { java.io.RandomAccessFile raf = null; try { raf = new java.io.RandomAccessFile(hObject.getFile(), "rw"); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Can't open output file: " + hObject.getFile(), getTitle(), JOptionPane.ERROR_MESSAGE); return; } try { raf.seek(0); raf.write(buf, 0, buf.length); raf.seek(buf.length); if (blkSize0 > buf.length) { byte[] padBuf = new byte[blkSize0 - buf.length]; raf.write(padBuf, 0, padBuf.length); } } catch (Exception ex) { } try { raf.close(); } catch (Exception ex) { } JOptionPane.showMessageDialog(this, "Saving user block is successful.", getTitle(), JOptionPane.INFORMATION_MESSAGE); } else { // must rewrite the whole file // must rewrite the whole file int op = JOptionPane.showConfirmDialog(this, "The user block to write is " + blkSize1 + " (bytes),\n" + "which is larger than the user block space in file " + blkSize0 + " (bytes).\n" + "To expand the user block, the file must be rewriten.\n\n" + "Do you want to replace the current file? Click " + "\n\"Yes\" to replace the current file," + "\n\"No\" to save to a different file, " + "\n\"Cancel\" to quit without saving the change.\n\n ", getTitle(), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); if (op == JOptionPane.CANCEL_OPTION) { return; } String fin = hObject.getFile(); String fout = fin + "~copy.h5"; if (fin.endsWith(".h5")) { fout = fin.substring(0, fin.length() - 3) + "~copy.h5"; } else if (fin.endsWith(".hdf5")) { fout = fin.substring(0, fin.length() - 5) + "~copy.h5"; } File outFile = null; if (op == JOptionPane.NO_OPTION) { JFileChooser fchooser = new JFileChooser(); fchooser.setFileFilter(DefaultFileFilter.getFileFilterHDF5()); fchooser.setSelectedFile(new File(fout)); int returnVal = fchooser.showSaveDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } outFile = choosedFile; fout = outFile.getAbsolutePath(); } else { outFile = new File(fout); } if (!outFile.exists()) { try { outFile.createNewFile(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Fail to write user block into file. ", getTitle(), JOptionPane.ERROR_MESSAGE); return; } } // close the file ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "Close file"); ((HDFView) viewer).actionPerformed(e); if (DefaultFileFilter.setHDF5UserBlock(fin, fout, buf)) { if (op == JOptionPane.NO_OPTION) { fin = fout; // open the new file } else { File oldFile = new File(fin); boolean status = oldFile.delete(); if (status) { outFile.renameTo(oldFile); } else { JOptionPane.showMessageDialog(this, "Cannot replace the current file.\nPlease save to a different file.", getTitle(), JOptionPane.ERROR_MESSAGE); outFile.delete(); } } } else { JOptionPane.showMessageDialog(this, "Fail to write user block into file. ", getTitle(), JOptionPane.ERROR_MESSAGE); outFile.delete(); } // reopen the file dispose(); e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "Open file://" + fin); ((HDFView) viewer).actionPerformed(e); } } } jhdf-2.9/ncsa/hdf/view/CMakeLists.txt0000644000175000017500000001333212050301063020350 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_NCSA_HDF_VIEW) SET (CMAKE_VERBOSE_MAKEFILE 1) INCLUDE_DIRECTORIES ( ${JAVA_NCSA_HDF_HDF4_BINARY_DIR} ${JAVA_NCSA_HDF_HDF5_BINARY_DIR} ${JAVA_NCSA_HDF_OBJECT_BINARY_DIR} ${HDFJAVA_LIB_DIR} ) SET (HDFJAVA_NCSA_HDF_VIEW_SRCS Chart.java DataOptionDialog.java DataView.java DefaultFileFilter.java DefaultImageView.java DefaultMetaDataView.java DefaultPaletteView.java DefaultTableView.java DefaultTextView.java DefaultTreeView.java FileConversionDialog.java HDFView.java HelpView.java ImageView.java MathConversionDialog.java MetaDataView.java NewAttributeDialog.java NewDatasetDialog.java NewDatatypeDialog.java NewFileDialog.java NewGroupDialog.java NewImageDialog.java NewLinkDialog.java NewTableDataDialog.java PaletteView.java TableView.java TextView.java Tools.java TreeView.java UserOptionsDialog.java ViewManager.java ViewProperties.java ) SET (HDFJAVA_NCSA_HDF_VIEW_ICONS icons/animation.gif icons/apps.gif icons/audio.gif icons/autocontrast.gif icons/blank.gif icons/brightness.gif icons/chart.gif icons/copy.gif icons/cut.gif icons/dataset.gif icons/datasetA.gif icons/datatype.gif icons/datatypeA.gif icons/fileclose.gif icons/filenew.gif icons/fileopen.gif icons/filesave.gif icons/first.gif icons/folderclose.gif icons/foldercloseA.gif icons/folderopen.gif icons/folderopenA.gif icons/hdf_large.gif icons/hdf.gif icons/hdf32.gif icons/hdf32.icns icons/hdf32.png icons/hdf4.gif icons/hdf5.gif icons/help.gif icons/image.gif icons/imageA.gif icons/last.gif icons/link.gif icons/next.gif icons/palette.gif icons/paste.gif icons/pdf.gif icons/previous.gif icons/question.gif icons/table.gif icons/tableA.gif icons/text.gif icons/textA.gif icons/txt.gif icons/url.gif icons/video.gif icons/xls.gif icons/zoomin.gif icons/zoomout.gif ) SET (HDFJAVA_NCSA_HDF_VIEW_HTML NewAttrHelp.html NewDatsetHelp.html ) INCLUDE_DIRECTORIES (${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${HDFJAVA_NCSA_VIEW_LIB_CORENAME}.dir/ncsa/hdf/object) FOREACH (HCP_JAR ${HDFJAVA_JARS_TO_EXPORT}) GET_FILENAME_COMPONENT (_HCP_FILE ${HCP_JAR} NAME) SET (HDFVIEW_CLASSJARS "${_HCP_FILE} ${HDFVIEW_CLASSJARS}") ENDFOREACH (HCP_JAR ${HDFJAVA_JARS_TO_EXPORT}) FOREACH (HCP_JAR ${HDFJAVA_HDFVIEWJAR_TO_EXPORT}) GET_FILENAME_COMPONENT (_HCP_FILE ${HCP_JAR} NAME) SET (HDFVIEW_CLASSJARS "${_HCP_JAR} ${HDFVIEW_CLASSJARS}") ENDFOREACH (HCP_JAR ${HDFJAVA_HDFVIEWJAR_TO_EXPORT}) FILE (WRITE ${HDFJAVA_NCSA_HDF_VIEW_BINARY_DIR}/Manifest.txt "Main-Class: ncsa.hdf.view.HDFView Class-Path: ${HDFVIEW_CLASSJARS} " ) SET (CMAKE_JAVA_INCLUDE_PATH ${HDFJAVA_OBJECT_JARS} ${HDFVIEW_OPTIONS_INCLUDE_PATH}) SET (CMAKE_JAVA_RESOURCE_PATH "ncsa/hdf/view") ADD_JAR (${HDFJAVA_NCSA_VIEW_LIB_TARGET} ${HDFJAVA_NCSA_HDF_VIEW_BINARY_DIR}/Manifest.txt ${HDFJAVA_NCSA_HDF_VIEW_SRCS} ${HDFJAVA_NCSA_HDF_VIEW_ICONS}) INSTALL_JAR (${HDFJAVA_NCSA_VIEW_LIB_TARGET} ${HJAVA_INSTALL_LIB_DIR} apps) GET_TARGET_PROPERTY(${HDFJAVA_NCSA_VIEW_LIB_TARGET}_JAR_FILE ${HDFJAVA_NCSA_VIEW_LIB_TARGET} JAR_FILE) SET_GLOBAL_VARIABLE (HDFJAVA_HDFVIEWJAR_TO_EXPORT "${HDFJAVA_HDFVIEWJAR_TO_EXPORT};${${HDFJAVA_NCSA_VIEW_LIB_TARGET}_JAR_FILE}") ADD_DEPENDENCIES (${HDFJAVA_NCSA_VIEW_LIB_TARGET} ${HDFJAVA_NCSA_OBJECT_LIB_TARGET}) IF (UNIX) SET (HDFVIEW_SCRIPT "hdfview.sh") ELSE (UNIX) SET (HDFVIEW_SCRIPT "hdfview.bat") ENDIF (UNIX) GET_FILENAME_COMPONENT (HDFVIEW_JAR ${${HDFJAVA_NCSA_VIEW_LIB_TARGET}_JAR_FILE} NAME) GET_FILENAME_COMPONENT (JAVA_PATH ${CMAKE_Java_RUNTIME} PATH) IF (WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_INCLUDE_FLAG_SEP ";") SET (SCRIPT_COMMAND_QUOTE "\"") ELSE (WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_INCLUDE_FLAG_SEP ":") ENDIF (WIN32 AND NOT CYGWIN) IF (HDFJAVA_PACK_JREFILE) CONFIGURE_FILE ( ${HDFJAVA_NCSA_HDF_VIEW_SOURCE_DIR}/jre${HDFVIEW_SCRIPT}.cmake.in ${HDFJAVA_NCSA_HDF_VIEW_BINARY_DIR}/${HDFVIEW_SCRIPT} @ONLY ) ELSE (HDFJAVA_PACK_JREFILE) CONFIGURE_FILE ( ${HDFJAVA_NCSA_HDF_VIEW_SOURCE_DIR}/${HDFVIEW_SCRIPT}.cmake.in ${HDFJAVA_NCSA_HDF_VIEW_BINARY_DIR}/${HDFVIEW_SCRIPT} @ONLY ) ENDIF (HDFJAVA_PACK_JREFILE) IF (BUILD_TESTING) IF (UNIX) SET (HDFVIEW_TEST_SCRIPT "thdfview.sh") ELSE (UNIX) SET (HDFVIEW_TEST_SCRIPT "thdfview.bat") ENDIF (UNIX) SET (HDFVIEW_TEST_CLASSPATH "${HDFVIEW_CLASSPATH}${CMAKE_SOURCE_DIR}/lib") FOREACH (HCP_JAR ${HDFJAVA_JARS_TO_EXPORT}) SET (HDFVIEW_TEST_CLASSPATH "${HCP_JAR}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${HDFVIEW_TEST_CLASSPATH}") ENDFOREACH (HCP_JAR ${HDFJAVA_JARS_TO_EXPORT}) FOREACH (HCP_JAR ${HDFJAVA_HDFVIEWJAR_TO_EXPORT}) SET (HDFVIEW_TEST_CLASSPATH "${HCP_JAR}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${HDFVIEW_TEST_CLASSPATH}") ENDFOREACH (HCP_JAR ${HDFJAVA_HDFVIEWJAR_TO_EXPORT}) FILE (WRITE ${HDFJAVA_NCSA_HDF_VIEW_BINARY_DIR}/${HDFVIEW_TEST_SCRIPT}.cmake.in "${SCRIPT_COMMAND_QUOTE}${CMAKE_Java_RUNTIME}${SCRIPT_COMMAND_QUOTE} -Xmx1024M -Djava.library.path=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} -Dhdfview.root=${PROJECT_BINARY_DIR} -jar ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${HDFVIEW_JAR} -root ${PROJECT_BINARY_DIR} " ) CONFIGURE_FILE ( ${HDFJAVA_NCSA_HDF_VIEW_BINARY_DIR}/${HDFVIEW_TEST_SCRIPT}.cmake.in ${HDFJAVA_NCSA_HDF_VIEW_BINARY_DIR}/${HDFVIEW_TEST_SCRIPT} @ONLY ) ENDIF (BUILD_TESTING) INSTALL ( FILES ${HDFJAVA_NCSA_HDF_VIEW_BINARY_DIR}/${HDFVIEW_SCRIPT} DESTINATION ${HJAVA_INSTALL_BIN_DIR} COMPONENT apps PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) jhdf-2.9/ncsa/hdf/view/FileConversionDialog.java0000644000175000017500000002517512050301063022530 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; import java.util.Iterator; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import ncsa.hdf.object.FileFormat; /** * FileConversionDialog shows a message dialog requesting user input for * converting files. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class FileConversionDialog extends JDialog implements ActionListener { private static final long serialVersionUID = 2645021913986116744L; private String fileTypeFrom, fileTypeTo; private JTextField srcFileField, dstFileField; private boolean isConverted; private boolean isConvertedFromImage; private String convertedFile; private String toFileExtension; private List fileList; private String currentDir; private final Toolkit toolkit; /** * Constructs a FileConversionDialog * * @param owner * The owner of the dialog. * @param typeFrom * source file type * @param typeTo * destinatin file type * @param dir * current file directory * @param openFiles * The list of current open files */ public FileConversionDialog(Frame owner, String typeFrom, String typeTo, String dir, List openFiles) { super(owner, "Convert File...", true); fileTypeFrom = typeFrom; fileTypeTo = typeTo; isConverted = false; isConvertedFromImage = false; fileList = openFiles; toFileExtension = ""; currentDir = dir; toolkit = Toolkit.getDefaultToolkit(); String fromName = "Source"; if (fileTypeTo.equals(FileFormat.FILE_TYPE_HDF5)) { toFileExtension = ".h5"; setTitle("Convert Image to HDF5 ..."); fromName = "IMAGE"; isConvertedFromImage = true; } else if (fileTypeTo.equals(FileFormat.FILE_TYPE_HDF4)) { toFileExtension = ".hdf"; setTitle("Convert Image to HDF4 ..."); fromName = "IMAGE"; isConvertedFromImage = true; } // layout the components JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 450 + (ViewProperties.getFontSize() - 12) * 15; int h = 120 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); // add the top panel for enter file name JPanel p = new JPanel(); p.setLayout(new BorderLayout(5, 5)); JPanel p0 = new JPanel(); p0.setLayout(new GridLayout(2, 1, 5, 5)); p0.add(new JLabel(fromName + " File: ")); p0.add(new JLabel("HDF File: ")); p.add(p0, BorderLayout.WEST); p0 = new JPanel(); p0.setLayout(new GridLayout(2, 1, 5, 5)); p0.add(srcFileField = new JTextField()); p0.add(dstFileField = new JTextField()); p.add(p0, BorderLayout.CENTER); p0 = new JPanel(); p0.setLayout(new GridLayout(2, 1, 5, 5)); JButton jButton = new JButton("Browse..."); jButton.setActionCommand("Browse source file"); jButton.addActionListener(this); p0.add(jButton); jButton = new JButton("Browse..."); jButton.setActionCommand("Browse target file"); jButton.addActionListener(this); p0.add(jButton); p.add(p0, BorderLayout.EAST); contentPane.add(p, BorderLayout.CENTER); JButton okButton = new JButton(" Ok "); okButton.setMnemonic(KeyEvent.VK_O); okButton.setActionCommand("Ok"); okButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.setActionCommand("Cancel"); cancelButton.addActionListener(this); p = new JPanel(); p.add(okButton); p.add(cancelButton); contentPane.add(p, BorderLayout.SOUTH); Point l = owner.getLocation(); l.x += 250; l.y += 80; setLocation(l); pack(); } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Ok")) { isConverted = convert(); if (isConverted) { dispose(); } } else if (cmd.equals("Cancel")) { isConverted = false; convertedFile = null; dispose(); } else if (cmd.equals("Browse source file")) { JFileChooser fchooser = new JFileChooser(currentDir); if (isConvertedFromImage) fchooser.setFileFilter(DefaultFileFilter.getImageFileFilter()); int returnVal = fchooser.showOpenDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); if (fname == null) { return; } currentDir = choosedFile.getParent(); srcFileField.setText(fname); dstFileField.setText(fname + toFileExtension); } else if (cmd.equals("Browse target file")) { JFileChooser fchooser = new JFileChooser(); int returnVal = fchooser.showOpenDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); if (fname == null) { return; } dstFileField.setText(fname); } } /** convert file */ private boolean convert() { boolean converted = false; String srcFile = srcFileField.getText(); String dstFile = dstFileField.getText(); if ((srcFile == null) || (dstFile == null)) { return false; } srcFile = srcFile.trim(); dstFile = dstFile.trim(); if ((srcFile == null) || (srcFile.length() <= 0) || (dstFile == null) || (dstFile.length() <= 0)) { return false; } // verify the source file File f = new File(srcFile); if (!f.exists()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Source file does not exist.", this.getTitle(), JOptionPane.ERROR_MESSAGE); return false; } else if (f.isDirectory()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Source file is a directory.", this.getTitle(), JOptionPane.ERROR_MESSAGE); return false; } // verify target file String srcPath = f.getParent(); f = new File(dstFile); File pfile = f.getParentFile(); if (pfile == null) { dstFile = srcPath + File.separator + dstFile; f = new File(dstFile); } else if (!pfile.exists()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Destination file path does not exist at\n" + pfile.getPath(), this.getTitle(), JOptionPane.ERROR_MESSAGE); return false; } // check if the file is in use if (fileList != null) { FileFormat theFile = null; Iterator iterator = fileList.iterator(); while (iterator.hasNext()) { theFile = (FileFormat) iterator.next(); if (theFile.getFilePath().equals(dstFile)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "The destination file is being used.", getTitle(), JOptionPane.ERROR_MESSAGE); return false; } } } int newFileFlag = -1; if (f.exists()) { newFileFlag = JOptionPane.showConfirmDialog(this, "Destination file exists. Do you want to replace it ?", this.getTitle(), JOptionPane.YES_NO_OPTION); if (newFileFlag == JOptionPane.NO_OPTION) { return false; } } try { Tools.convertImageToHDF(srcFile, dstFile, fileTypeFrom, fileTypeTo); convertedFile = dstFile; converted = true; } catch (Exception ex) { convertedFile = null; converted = false; toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage(), this .getTitle(), JOptionPane.ERROR_MESSAGE); return false; } return converted; } public boolean isFileConverted() { return isConverted; } public String getConvertedFile() { return convertedFile; } } jhdf-2.9/ncsa/hdf/view/HelpView.java0000755000175000017500000000301112050301063020172 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; /** * * The helpview interface for displaying user help information * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public abstract interface HelpView { /** display help informaion */ public abstract void show(); /** * Returns the HelpView's label, which is used to displayed in the HDFVIew * help menu. */ public abstract String getLabel(); /** Returns the action command for this HelpView. */ public abstract String getActionCommand(); } jhdf-2.9/ncsa/hdf/view/DataOptionDialog.java0000644000175000017500000015144612050301063021646 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.BitSet; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import javax.swing.border.EtchedBorder; import javax.swing.border.LineBorder; import javax.swing.border.TitledBorder; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.ScalarDS; /** * DataOptionDialog is an dialog window used to select display options. Display * options include selection of subset, display type (image, text, or * spreadsheet). * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class DataOptionDialog extends JDialog implements ActionListener, ItemListener { /** * */ private static final long serialVersionUID = -1078411885690696784L; /** * The main HDFView. */ private final ViewManager viewer; /** the selected dataset/image */ private Dataset dataset; /** the rank of the dataset/image */ private int rank; /** the starting point of selected subset */ private long start[]; /** the sizes of all dimensions */ private long dims[]; /** the selected sizes of all dimensions */ private long selected[]; /** the stride */ private long stride[]; /** the indices of the selected dimensions. */ private int selectedIndex[]; private int currentIndex[]; private JRadioButton spreadsheetButton, imageButton, base1Button, base0Button; private JRadioButton[] bitmaskButtons; private JCheckBox applyBitmaskButton, extractBitButton; private JCheckBox charCheckbox; private BitSet bitmask; private JButton bitmaskHelp; private JComboBox choiceTextView, choiceTableView, choiceImageView, choicePalette, choices[]; private JComboBox transposeChoice; private boolean isSelectionCancelled; private boolean isTrueColorImage; private boolean isText; private boolean isH5; private JLabel maxLabels[], selLabel; private JTextField startFields[], endFields[], strideFields[]; private JList fieldList; private final Toolkit toolkit; private final PreviewNavigator navigator; private int numberOfPalettes; /** * JComboBox.setSelectedItem() or setSelectedIndex() always fires action * event. If you call setSelectedItem() or setSelectedIndex() at * itemStateChanged() or actionPerformed(), the setSelectedItem() or * setSelectedIndex() will make loop calls of itemStateChanged() or * actionPerformed(). This is not what we want. We want the * setSelectedItem() or setSelectedIndex() behavior like java.awt.Choice. * This flag is used to serve this purpose. */ private boolean performJComboBoxEvent = false; /** * Constructs a DataOptionDialog with the given HDFView. */ public DataOptionDialog(ViewManager theview, Dataset theDataset) { super((JFrame) theview, true); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); viewer = theview; dataset = theDataset; isSelectionCancelled = true; isTrueColorImage = false; isText = false; bitmask = null; numberOfPalettes = 1; toolkit = Toolkit.getDefaultToolkit(); if (dataset == null) { dispose(); } else { setTitle("Dataset Selection - " + dataset.getPath() + dataset.getName()); } isH5 = dataset.getFileFormat().isThisType( FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); rank = dataset.getRank(); if (rank <= 0) { dataset.init(); } if (isH5 && (dataset instanceof ScalarDS)) { byte[] palRefs = ((ScalarDS) dataset).getPaletteRefs(); if ((palRefs != null) && (palRefs.length > 8)) { numberOfPalettes = palRefs.length / 8; } } rank = dataset.getRank(); dims = dataset.getDims(); selected = dataset.getSelectedDims(); start = dataset.getStartDims(); selectedIndex = dataset.getSelectedIndex(); stride = dataset.getStride(); fieldList = null; int h = 1, w = 1; h = (int) dims[selectedIndex[0]]; if (rank > 1) { w = (int) dims[selectedIndex[1]]; } transposeChoice = new JComboBox(); transposeChoice.addItem("Reshape"); transposeChoice.addItem("Transpose"); selLabel = new JLabel("", SwingConstants.CENTER); navigator = new PreviewNavigator(w, h); currentIndex = new int[Math.min(3, rank)]; choicePalette = new JComboBox(); choiceTextView = new JComboBox((Vector) HDFView.getListOfTextView()); choiceImageView = new JComboBox((Vector) HDFView.getListOfImageView()); choiceTableView = new JComboBox((Vector) HDFView.getListOfTableView()); choicePalette.addItem("Select palette"); if(dataset instanceof ScalarDS ){ String paletteName = ((ScalarDS) dataset).getPaletteName(0); if(paletteName==null){ paletteName = "Default"; } choicePalette.addItem(paletteName); for (int i = 2; i <= numberOfPalettes; i++) { paletteName = ((ScalarDS) dataset).getPaletteName(i-1); choicePalette.addItem(paletteName); } } choicePalette.addItem("Gray"); choicePalette.addItem("ReverseGray"); choicePalette.addItem("GrayWave"); choicePalette.addItem("Rainbow"); choicePalette.addItem("Nature"); choicePalette.addItem("Wave"); spreadsheetButton = new JRadioButton("Spreadsheet ", true); spreadsheetButton.setMnemonic(KeyEvent.VK_S); imageButton = new JRadioButton("Image "); imageButton.setMnemonic(KeyEvent.VK_I); charCheckbox = new JCheckBox("Show As Char", false); charCheckbox.setMnemonic(KeyEvent.VK_C); charCheckbox.setEnabled(false); charCheckbox.addItemListener(this); extractBitButton = new JCheckBox("Show Value of Selected Bits", false); extractBitButton.setMnemonic(KeyEvent.VK_V); extractBitButton.setEnabled(false); extractBitButton.addItemListener(this); applyBitmaskButton = new JCheckBox("Apply Bitmask", false); applyBitmaskButton.setMnemonic(KeyEvent.VK_A); applyBitmaskButton.setEnabled(false); applyBitmaskButton.addItemListener(this); bitmaskHelp = new JButton(ViewProperties.getHelpIcon()); bitmaskHelp.setToolTipText("Help on how to set bitmask"); bitmaskHelp.setMargin(new Insets(0, 0, 0, 0)); bitmaskHelp.addActionListener(this); bitmaskHelp.setActionCommand("Help on how to set bitmask"); // layout the components JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); int w1 = 700 + (ViewProperties.getFontSize() - 12) * 15; int h1 = 350 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w1, h1)); JPanel centerP = new JPanel(); centerP.setLayout(new BorderLayout()); centerP.setBorder(new TitledBorder("Dimension and Subset Selection")); JPanel navigatorP = new JPanel(); navigatorP.setLayout(new BorderLayout()); navigatorP.add(navigator, BorderLayout.CENTER); navigatorP.add(selLabel, BorderLayout.SOUTH); navigatorP.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); performJComboBoxEvent = true; if (dataset instanceof CompoundDS) { // setup GUI components for the field selection CompoundDS d = (CompoundDS) dataset; String[] names = d.getMemberNames(); fieldList = new JList(names); fieldList.addSelectionInterval(0, names.length - 1); JPanel fieldP = new JPanel(); fieldP.setLayout(new BorderLayout()); w1 = 150 + (ViewProperties.getFontSize() - 12) * 10; h1 = 250 + (ViewProperties.getFontSize() - 12) * 15; fieldP.setPreferredSize(new Dimension(w1, h1)); JScrollPane scrollP = new JScrollPane(fieldList); fieldP.add(scrollP); fieldP.setBorder(new TitledBorder("Select Members")); contentPane.add(fieldP, BorderLayout.WEST); JPanel tviewP = new JPanel(); tviewP.setLayout(new BorderLayout()); tviewP.add(new JLabel(" TableView: "), BorderLayout.WEST); tviewP.add(choiceTableView, BorderLayout.CENTER); tviewP.setBorder(new LineBorder(Color.LIGHT_GRAY)); centerP.add(tviewP, BorderLayout.SOUTH); } else if (dataset instanceof ScalarDS) { ScalarDS sd = (ScalarDS) dataset; isText = sd.isText(); if (isText) { w1 = 700 + (ViewProperties.getFontSize() - 12) * 15; h1 = 280 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w1, h1)); // add textview selection JPanel txtviewP = new JPanel(); txtviewP.setLayout(new BorderLayout()); txtviewP.add(new JLabel(" TextView: "), BorderLayout.WEST); txtviewP.add(choiceTextView, BorderLayout.CENTER); txtviewP.setBorder(new LineBorder(Color.LIGHT_GRAY)); centerP.add(txtviewP, BorderLayout.SOUTH); } else { w1 = 680 + (ViewProperties.getFontSize() - 12) * 15; h1 = 400 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w1, h1)); if (rank > 1) { centerP.add(navigatorP, BorderLayout.WEST); } // setup GUI components for the display options: table or image imageButton.addItemListener(this); spreadsheetButton.addItemListener(this); ButtonGroup rgroup = new ButtonGroup(); rgroup.add(spreadsheetButton); rgroup.add(imageButton); JPanel viewP = new JPanel(); viewP.setLayout(new GridLayout(2, 1, 5, 5)); viewP.setBorder(new TitledBorder("Display As")); JPanel sheetP = new JPanel(); sheetP.setLayout(new GridLayout(1, 2, 25, 5)); sheetP.add(spreadsheetButton); int tclass = sd.getDatatype().getDatatypeClass(); if (tclass == Datatype.CLASS_CHAR || (tclass == Datatype.CLASS_INTEGER && sd .getDatatype().getDatatypeSize() == 1)) { sheetP.add(charCheckbox); } // add tableview selection JPanel tviewP = new JPanel(); tviewP.setLayout(new BorderLayout()); tviewP.add(new JLabel("TableView: "), BorderLayout.WEST); tviewP.add(choiceTableView, BorderLayout.CENTER); JPanel leftP = new JPanel(); leftP.setBorder(BorderFactory .createLineBorder(Color.LIGHT_GRAY)); leftP.setLayout(new GridLayout(2, 1, 5, 5)); leftP.add(sheetP); leftP.add(tviewP); viewP.add(leftP); JPanel imageP = new JPanel(); imageP.setLayout(new BorderLayout(5, 5)); imageP.add(imageButton, BorderLayout.WEST); imageP.add(choicePalette, BorderLayout.CENTER); // add imageview selection JPanel iviewP = new JPanel(); iviewP.setLayout(new BorderLayout()); iviewP.add(new JLabel("ImageView: "), BorderLayout.WEST); iviewP.add(choiceImageView, BorderLayout.CENTER); JPanel rightP = new JPanel(); rightP.setBorder(BorderFactory .createLineBorder(Color.LIGHT_GRAY)); rightP.setLayout(new GridLayout(2, 1, 5, 5)); rightP.add(imageP); rightP.add(iviewP); viewP.add(rightP); JPanel northP = new JPanel(); northP.setLayout(new GridLayout(1, 2, 5, 5)); northP.add(viewP); viewP = new JPanel(); viewP.setLayout(new BorderLayout()); northP.add(viewP); JPanel baseIndexP = new JPanel(); viewP.add(baseIndexP, BorderLayout.NORTH); baseIndexP.setBorder(new TitledBorder("Index Base")); baseIndexP.setLayout(new GridLayout(1, 2, 5, 5)); base0Button = new JRadioButton("0-based "); base1Button = new JRadioButton("1-based "); ButtonGroup bgrp = new ButtonGroup(); bgrp.add(base0Button); bgrp.add(base1Button); if (ViewProperties.isIndexBase1()) base1Button.setSelected(true); else base0Button.setSelected(true); baseIndexP.add(base0Button); baseIndexP.add(base1Button); if (tclass == Datatype.CLASS_CHAR || (tclass == Datatype.CLASS_INTEGER && sd .getDatatype().getDatatypeSize() <= 2)) { bitmaskButtons = new JRadioButton[8 * sd.getDatatype() .getDatatypeSize()]; for (int i = 0; i < bitmaskButtons.length; i++) { bitmaskButtons[i] = new JRadioButton(String.valueOf(i)); bitmaskButtons[i].setEnabled(false); bitmaskButtons[i].addItemListener(this); } JPanel sheetP2 = new JPanel(); viewP.add(sheetP2, BorderLayout.CENTER); sheetP2.setBorder(new TitledBorder("Bitmask")); JPanel tmpP = new JPanel(); if(bitmaskButtons.length <=8){ tmpP.setLayout(new GridLayout(1, bitmaskButtons.length)); for (int i = bitmaskButtons.length; i>0; i--) tmpP.add(bitmaskButtons[i-1]); } else{ tmpP.setLayout(new GridLayout(2, bitmaskButtons.length/2)); for (int i = bitmaskButtons.length; i>bitmaskButtons.length/2; i--) tmpP.add(bitmaskButtons[i-1]); for (int i = bitmaskButtons.length/2; i>0; i--) tmpP.add(bitmaskButtons[i-1]); } sheetP2.setLayout(new BorderLayout(10, 10)); sheetP2.add(tmpP, BorderLayout.CENTER); sheetP2.add(new JLabel(), BorderLayout.NORTH); JPanel tmpP2 = new JPanel(); tmpP2.setLayout(new GridLayout(2,1)); tmpP2.add(extractBitButton); tmpP2.add(applyBitmaskButton); tmpP = new JPanel(); tmpP.setLayout(new BorderLayout()); tmpP.add(tmpP2, BorderLayout.WEST); tmpP2 = new JPanel(); tmpP2.add(bitmaskHelp); tmpP.add(tmpP2, BorderLayout.EAST); sheetP2.add(tmpP, BorderLayout.NORTH); } contentPane.add(northP, BorderLayout.NORTH); } } // setup GUI for dimension and subset selection JPanel selectionP = new JPanel(); selectionP.setLayout(new GridLayout(5, 6, 10, 3)); selectionP.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); centerP.add(selectionP, BorderLayout.CENTER); contentPane.add(centerP, BorderLayout.CENTER); selectionP.add(new JLabel(" ")); if (rank > 1) selectionP.add(transposeChoice); else selectionP.add(new JLabel(" ")); JLabel label = new JLabel("Start:"); selectionP.add(label); label = new JLabel("End: "); selectionP.add(label); label = new JLabel("Stride:"); selectionP.add(label); label = new JLabel("Max Size"); selectionP.add(label); choices = new JComboBox[3]; maxLabels = new JLabel[3]; startFields = new JTextField[3]; endFields = new JTextField[3]; strideFields = new JTextField[3]; JLabel dimLabels[] = { new JLabel("Height", SwingConstants.RIGHT), new JLabel("Width", SwingConstants.RIGHT), new JLabel("Depth", SwingConstants.RIGHT), }; String[] dimNames = dataset.getDimNames(); for (int i = 0; i < 3; i++) { choices[i] = new JComboBox(); choices[i].addItemListener(this); for (int j = 0; j < rank; j++) { if (dimNames == null) { choices[i].addItem("dim " + j); } else { choices[i].addItem(dimNames[j]); } } maxLabels[i] = new JLabel("1"); startFields[i] = new JTextField("0"); endFields[i] = new JTextField("0"); strideFields[i] = new JTextField("1"); selectionP.add(dimLabels[i]); selectionP.add(choices[i]); selectionP.add(startFields[i]); selectionP.add(endFields[i]); selectionP.add(strideFields[i]); selectionP.add(maxLabels[i]); // disable the selection components // init() will set them appropriate choices[i].setEnabled(false); startFields[i].setEnabled(false); endFields[i].setEnabled(false); strideFields[i].setEnabled(false); maxLabels[i].setEnabled(false); } // add button dimension selection when dimension size >= 4 JButton button = new JButton("dims..."); selectionP.add(new JLabel("", SwingConstants.RIGHT)); selectionP.add(button); button.setActionCommand("Select more dimensions"); button.addActionListener(this); button.setEnabled((rank > 3)); selectionP.add(new JLabel(" ")); selectionP.add(new JLabel(" ")); button = new JButton("Reset"); button.setActionCommand("Reset data range"); button.addActionListener(this); selectionP.add(button); selectionP.add(new JLabel(" ")); // add OK and CANCEL buttons JPanel confirmP = new JPanel(); contentPane.add(confirmP, BorderLayout.SOUTH); button = new JButton(" Ok "); button.setMnemonic(KeyEvent.VK_O); button.setActionCommand("Ok"); button.addActionListener(this); confirmP.add(button); button = new JButton("Cancel"); button.setMnemonic(KeyEvent.VK_C); button.setActionCommand("Cancel"); button.addActionListener(this); confirmP.add(button); init(); // locate the H5Property dialog Point l = getParent().getLocation(); l.x += 250; l.y += 80; setLocation(l); pack(); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Ok")) { // set palette for image view if ((dataset instanceof ScalarDS) && imageButton.isSelected()) { setPalette(); } isSelectionCancelled = !setSelection(); if (isSelectionCancelled) { return; } if (dataset instanceof ScalarDS) { ((ScalarDS) dataset).setIsImageDisplay(imageButton.isSelected()); } dispose(); } else if (cmd.equals("Cancel")) { dispose(); } else if (cmd.equals("Reset data range")) { int n = startFields.length; for (int i = 0; i < n; i++) { startFields[i].setText("0"); strideFields[i].setText("1"); long l = Long.valueOf(maxLabels[i].getText()) - 1; endFields[i].setText(String.valueOf(l)); } } else if (cmd.equals("Select more dimensions")) { if (rank < 4) { return; } int idx = 0; Vector choice4 = new Vector(rank); int[] choice4Index = new int[rank - 3]; for (int i = 0; i < rank; i++) { if ((i != currentIndex[0]) && (i != currentIndex[1]) && (i != currentIndex[2])) { choice4.add(choices[0].getItemAt(i)); choice4Index[idx++] = i; } } String msg = "Select slice location for dimension(s):\n\"" + choice4.get(0) + " [0 .. " + (dims[choice4Index[0]] - 1) + "]\""; String initValue = String.valueOf(start[choice4Index[0]]); int n = choice4.size(); for (int i = 1; i < n; i++) { msg += " x \"" + choice4.get(i) + " [0 .. " + (dims[choice4Index[i]] - 1) + "]\""; initValue += " x " + String.valueOf(start[choice4Index[i]]); } String result = JOptionPane.showInputDialog(this, msg, initValue); if ((result == null) || ((result = result.trim()) == null) || (result.length() < 1)) { return; } StringTokenizer st = new StringTokenizer(result, "x"); if (st.countTokens() < n) { JOptionPane.showMessageDialog(this, "Number of dimension(s) is less than " + n + "\n" + result, "Select Slice Location", JOptionPane.ERROR_MESSAGE); return; } long[] start4 = new long[n]; for (int i = 0; i < n; i++) { try { start4[i] = Long.parseLong(st.nextToken().trim()); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), "Select Slice Location", JOptionPane.ERROR_MESSAGE); return; } if ((start4[i] < 0) || (start4[i] >= dims[choice4Index[i]])) { JOptionPane.showMessageDialog(this, "Slice location is out of range.\n" + start4[i] + " >= " + dims[choice4Index[i]], "Select Slice Location", JOptionPane.ERROR_MESSAGE); return; } } for (int i = 0; i < n; i++) { start[choice4Index[i]] = start4[i]; } } // else if (cmd.equals("Select more dimensions")) else if (cmd.equals("Help on how to set bitmask")) { String msg ="" + "\"Apply Bitmask\" applies bitwise \"AND\" to the original data.\n" + "For example, bits 2, 3, and 4 are selected for the bitmask\n" + " 10010101 (data)\n" + "AND 00011100 (mask) \n" + " = 00010100 (result) ==> the decimal value is 20. \n" + "\n" + "\"Extract Bit(s)\" removes all the bits from the result above where\n" + "their corresponding bits in the bitmask are 0. \nFor the same example above, " + "the result is \n101 ==> the decimal value is 5.\n\n"; JOptionPane.showMessageDialog((JFrame) viewer, msg); } } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source.equals(imageButton)) { choicePalette.setEnabled(!isTrueColorImage); choiceImageView.setEnabled(true); choiceTableView.setEnabled(false); charCheckbox.setSelected(false); charCheckbox.setEnabled(false); } else if (source.equals(spreadsheetButton)) { choicePalette.setEnabled(false); choiceImageView.setEnabled(false); choiceTableView.setEnabled(true); Datatype dtype = dataset.getDatatype(); int tclass = dtype.getDatatypeClass(); charCheckbox.setEnabled((tclass == Datatype.CLASS_CHAR || tclass == Datatype.CLASS_INTEGER)&& (dtype.getDatatypeSize() == 1)); } else if (source instanceof JToggleButton) { checkBitmaskButtons((JToggleButton)source); } else if (source instanceof JComboBox) { if (!performJComboBoxEvent) { return; } if (e.getStateChange() == ItemEvent.DESELECTED) { return; // don't care about the deselect } JComboBox theChoice = (JComboBox) source; int theSelectedChoice = -1; int n = Math.min(3, rank); for (int i = 0; i < n; i++) { if (theChoice.equals(choices[i])) { theSelectedChoice = i; } } if (theSelectedChoice < 0) { return; // the selected JComboBox is not a dimension choice } int theIndex = theChoice.getSelectedIndex(); if (theIndex == currentIndex[theSelectedChoice]) { return; // select the same item, no change } start[currentIndex[theSelectedChoice]] = 0; // reset the selected dimension choice startFields[theSelectedChoice].setText("0"); endFields[theSelectedChoice].setText(String .valueOf(dims[theIndex] - 1)); strideFields[theSelectedChoice].setText("1"); maxLabels[theSelectedChoice] .setText(String.valueOf(dims[theIndex])); // if the selected choice selects the dimension that is selected by // other dimension choice, exchange the dimensions for (int i = 0; i < n; i++) { if (i == theSelectedChoice) { continue; // don't exchange itself } else if (theIndex == choices[i].getSelectedIndex()) { setJComboBoxSelectedIndex(choices[i], currentIndex[theSelectedChoice]); startFields[i].setText("0"); endFields[i] .setText(String .valueOf(dims[currentIndex[theSelectedChoice]] - 1)); strideFields[i].setText("1"); maxLabels[i].setText(String .valueOf(dims[currentIndex[theSelectedChoice]])); } } for (int i = 0; i < n; i++) { currentIndex[i] = choices[i].getSelectedIndex(); } // update the navigator if (rank > 1) { if (isText) { endFields[1].setText(startFields[1].getText()); } else { int hIdx = choices[0].getSelectedIndex(); int wIdx = choices[1].getSelectedIndex(); transposeChoice.setSelectedIndex(0); // Use transpose option only if the dims are not in original // order if (hIdx < wIdx) transposeChoice.setEnabled(false); else transposeChoice.setEnabled(true); long dims[] = dataset.getDims(); int w = (int) dims[wIdx]; int h = (int) dims[hIdx]; navigator.setDimensionSize(w, h); navigator.updateUI(); } } if (rank > 2) { endFields[2].setText(startFields[2].getText()); } } // else if (source instanceof JComboBox) } /** Returns true if the data selection is cancelled. */ public boolean isCancelled() { return isSelectionCancelled; } /** Returns true if the display option is image. */ public boolean isImageDisplay() { return imageButton.isSelected(); } public boolean isIndexBase1() { if (base1Button==null) return false; return base1Button.isSelected(); } /** for deal with bit masks only */ private void checkBitmaskButtons(JToggleButton source) { boolean b = false; int n = 0; if (source.equals(applyBitmaskButton)) { if (applyBitmaskButton.isSelected()) extractBitButton.setSelected(false); } else if (source.equals(extractBitButton)) { if (extractBitButton.isSelected()) applyBitmaskButton.setSelected(false); } b = (applyBitmaskButton.isSelected() || extractBitButton.isSelected()); bitmaskButtons[0].setEnabled(b); if (bitmaskButtons[0].isSelected()) n = 1; for (int i = 1; i < bitmaskButtons.length; i++) { bitmaskButtons[i].setEnabled(b); if (bitmaskButtons[i].isSelected() && !bitmaskButtons[i-1].isSelected()) n++; } // do not allow non-adjacent selection for extracting bits if (extractBitButton.isSelected() && n>1) { if (source.equals(extractBitButton) && extractBitButton.isSelected()) { applyBitmaskButton.setSelected(true); JOptionPane.showMessageDialog(this, "Selecting non-adjacent bits is only allowed \nfor the \"Apply Bitmask\" option.", "Select Bitmask", JOptionPane.ERROR_MESSAGE); } else if (source instanceof JRadioButton){ JOptionPane.showMessageDialog(this, "Please select contiguous bits \nwhen the \"Show Value of Selected Bits\" option is checked.", "Select Bitmask", JOptionPane.ERROR_MESSAGE); source.setSelected(false); } } // if (extractBitButton.isSelected() && n>1) { } /** * Set the initial state of all the variables */ private void init() { // set the imagebutton state boolean isImage = false; if (dataset instanceof ScalarDS) { ScalarDS sd = (ScalarDS) dataset; isImage = sd.isImageDisplay(); isTrueColorImage = sd.isTrueColor(); } else if (dataset instanceof CompoundDS) { imageButton.setEnabled(false); } choiceTableView.setEnabled(!isImage); choiceImageView.setEnabled(isImage); imageButton.setSelected(isImage); choicePalette.setEnabled(isImage && !isTrueColorImage); int n = Math.min(3, rank); long endIdx = 0; for (int i = 0; i < n; i++) { choices[i].setEnabled(true); startFields[i].setEnabled(true); endFields[i].setEnabled(true); strideFields[i].setEnabled(true); maxLabels[i].setEnabled(true); int idx = selectedIndex[i]; endIdx = start[idx] + selected[idx] * stride[idx]; if (endIdx >= dims[idx]) { endIdx = dims[idx]; } setJComboBoxSelectedIndex(choices[i], idx); maxLabels[i].setText(String.valueOf(dims[idx])); startFields[i].setText(String.valueOf(start[idx])); endFields[i].setText(String.valueOf(endIdx - 1)); if (!isH5 && (dataset instanceof CompoundDS)) { strideFields[i].setEnabled(false); } else { strideFields[i].setText(String.valueOf(stride[idx])); } } if (rank > 1) { transposeChoice .setEnabled((choices[0].getSelectedIndex() > choices[1] .getSelectedIndex())); if (isText) { endFields[1].setEnabled(false); endFields[1].setText(startFields[1].getText()); } } if (rank > 2) { endFields[2].setEnabled(false); strideFields[2].setEnabled(false); if (isTrueColorImage && imageButton.isSelected()) { choices[0].setEnabled(false); choices[1].setEnabled(false); choices[2].setEnabled(false); startFields[2].setEnabled(false); startFields[2].setText("0"); endFields[2].setText("0"); } else { choices[0].setEnabled(true); choices[1].setEnabled(true); choices[2].setEnabled(true); startFields[2].setEnabled(true); startFields[2].setText(String.valueOf(start[selectedIndex[2]])); // endFields[2].setEnabled(!isText); endFields[2].setText(startFields[2].getText()); } } for (int i = 0; i < n; i++) { currentIndex[i] = choices[i].getSelectedIndex(); } // reset show char button Datatype dtype = dataset.getDatatype(); int tclass = dtype.getDatatypeClass(); if (tclass == Datatype.CLASS_CHAR || tclass == Datatype.CLASS_INTEGER) { int tsize = dtype.getDatatypeSize(); charCheckbox.setEnabled((tsize == 1) && spreadsheetButton.isSelected()); extractBitButton.setEnabled(tsize <= 2); applyBitmaskButton.setEnabled(tsize <= 2); } else { charCheckbox.setEnabled(false); charCheckbox.setSelected(false); extractBitButton.setEnabled(false); applyBitmaskButton.setEnabled(false); } } /** * JComboBox.setSelectedItem() or setSelectedIndex() always fires action * event. If you call setSelectedItem() or setSelectedIndex() at * itemStateChanged() or actionPerformed(), the setSelectedItem() or * setSelectedIndex() will make loop calls of itemStateChanged() or * actionPerformed(). This is not what we want. We want the * setSelectedItem() or setSelectedIndex() behavior like java.awt.Choice. * This flag is used to serve this purpose. */ private void setJComboBoxSelectedIndex(JComboBox box, int idx) { performJComboBoxEvent = false; box.setSelectedIndex(idx); performJComboBoxEvent = true; } private void setPalette() { if (!(dataset instanceof ScalarDS)) { return; } byte[][] pal = null; int palChoice = choicePalette.getSelectedIndex(); if (palChoice == 0) { return; /* using default palette */ } if (palChoice == numberOfPalettes + 1) { pal = Tools.createGrayPalette(); } else if (palChoice == numberOfPalettes + 2) { pal = Tools.createReverseGrayPalette(); } else if (palChoice == numberOfPalettes + 3) { pal = Tools.createGrayWavePalette(); } else if (palChoice == numberOfPalettes + 4) { pal = Tools.createRainbowPalette(); } else if (palChoice == numberOfPalettes + 5) { pal = Tools.createNaturePalette(); } else if (palChoice == numberOfPalettes + 6) { pal = Tools.createWavePalette(); } else if ((palChoice > 0) && (palChoice <= numberOfPalettes)) { // multiple palettes attached pal = ((ScalarDS) dataset).readPalette(palChoice - 1); } ((ScalarDS) dataset).setPalette(pal); } private boolean setSelection() { long[] n0 = { 0, 0, 0 }; // start long[] n1 = { 0, 0, 0 }; // end long[] n2 = { 1, 1, 1 }; // stride int[] sIndex = { 0, 1, 2 }; boolean retVal = true; int n = Math.min(3, rank); for (int i = 0; i < n; i++) { sIndex[i] = choices[i].getSelectedIndex(); try { n0[i] = Long.parseLong(startFields[i].getText()); if (i < 2) { n1[i] = Long.parseLong(endFields[i].getText()); n2[i] = Long.parseLong(strideFields[i].getText()); } } catch (NumberFormatException ex) { toolkit.beep(); JOptionPane.showMessageDialog((JFrame) viewer, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } // silently correct errors if (n0[i] < 0) { n0[i] = 0; // start } if (n0[i] >= dims[sIndex[i]]) { n0[i] = dims[sIndex[i]] - 1; } if (n1[i] < 0) { n1[i] = 0; // end } if (n1[i] >= dims[sIndex[i]]) { n1[i] = dims[sIndex[i]] - 1; } if (n0[i] > n1[i]) { n1[i] = n0[i]; // end <= start } if (n2[i] > dims[sIndex[i]]) { n2[i] = dims[sIndex[i]]; } if (n2[i] <= 0) { n2[i] = 1; // stride cannot be zero } } // for (int i=0; i 1) && isText) { selected[selectedIndex[1]] = 1; stride[selectedIndex[1]] = 1; } else if ((rank > 2) && isTrueColorImage && imageButton.isSelected()) { start[selectedIndex[2]] = 0; selected[selectedIndex[2]] = 3; } // clear the old data dataset.clearData(); retVal = setBitmask(); return retVal; } private boolean setBitmask() { boolean isAll=false, isNothing=false; if (bitmaskButtons == null) { bitmask = null; return true; } if (!(applyBitmaskButton.isSelected() || extractBitButton.isSelected())) { bitmask = null; return true; } int len = bitmaskButtons.length; for (int i = 0; i < len; i++) { isAll = (isAll && bitmaskButtons[i].isSelected()); isNothing = (isNothing && !bitmaskButtons[i].isSelected()); } if (isAll || isNothing) { bitmask = null; return true; } if (bitmask == null) bitmask = new BitSet(len); for (int i = 0; i < len; i++) { bitmask.set(i, bitmaskButtons[i].isSelected()); } return true; } /** SubsetNavigator draws selection rectangle of subset. */ private class PreviewNavigator extends JComponent implements MouseListener, MouseMotionListener { private static final long serialVersionUID = -4458114008420664965L; private final int NAVIGATOR_SIZE = 150; private int dimX, dimY, x, y; private double r; private Point startPosition; // mouse clicked position private Rectangle selectedArea; private Image previewImage = null; private PreviewNavigator(int w, int h) { dimX = w; dimY = h; if (dimX > dimY) { x = NAVIGATOR_SIZE; r = dimX / (double) x; y = (int) (dimY / r); } else { y = NAVIGATOR_SIZE; r = dimY / (double) y; x = (int) (dimX / r); } selectedArea = new Rectangle(); setPreferredSize(new Dimension(NAVIGATOR_SIZE, NAVIGATOR_SIZE)); try { previewImage = createPreviewImage(); } catch (Exception ex) { ex.printStackTrace(); } addMouseListener(this); addMouseMotionListener(this); } private Image createPreviewImage() throws Exception { if ((rank <= 1) || !(dataset instanceof ScalarDS)) { return null; } Image preImage = null; ScalarDS sd = (ScalarDS) dataset; if (sd.isText()) { return null; } // backup the selection long[] strideBackup = new long[rank]; long[] selectedBackup = new long[rank]; long[] startBackup = new long[rank]; int[] selectedIndexBackup = new int[3]; System.arraycopy(stride, 0, strideBackup, 0, rank); System.arraycopy(selected, 0, selectedBackup, 0, rank); System.arraycopy(start, 0, startBackup, 0, rank); System.arraycopy(selectedIndex, 0, selectedIndexBackup, 0, 3); // set the selection for preview for (int i = 0; i < rank; i++) { start[i] = 0; stride[i] = 1; selected[i] = 1; } if (choices != null) { selectedIndex[0] = choices[0].getSelectedIndex(); selectedIndex[1] = choices[1].getSelectedIndex(); } long steps = (long) Math.ceil(r); selected[selectedIndex[0]] = (dims[selectedIndex[0]] / steps); selected[selectedIndex[1]] = (dims[selectedIndex[1]] / steps); stride[selectedIndex[0]] = stride[selectedIndex[1]] = steps; if (selected[selectedIndex[0]] == 0) { selected[selectedIndex[0]] = 1; } if (selected[selectedIndex[1]] == 0) { selected[selectedIndex[1]] = 1; } if (isTrueColorImage && (start.length > 2)) { start[selectedIndex[2]] = 0; selected[selectedIndex[2]] = 3; stride[selectedIndex[2]] = 1; } // update the ration of preview image size to the real dataset y = (int) selected[selectedIndex[0]]; x = (int) selected[selectedIndex[1]]; r = Math.min((double) dims[selectedIndex[0]] / (double) selected[selectedIndex[0]], (double) dims[selectedIndex[1]] / (double) selected[selectedIndex[1]]); try { Object data = sd.read(); Object fillValue = sd.getFillValue(); if (fillValue != null){ if(sd.isFillValueConverted) fillValue = ScalarDS.convertToUnsignedC(fillValue, null); } byte[] bData = Tools.getBytes(data, sd.getImageDataRange(), fillValue, null); int h = sd.getHeight(); int w = sd.getWidth(); if (isTrueColorImage) { boolean isPlaneInterlace = (sd.getInterlace() == ScalarDS.INTERLACE_PLANE); preImage = Tools.createTrueColorImage(bData, isPlaneInterlace, w, h); } else { byte[][] imagePalette = sd.getPalette(); if (imagePalette == null) { imagePalette = Tools.createGrayPalette(); } if ((isH5 || (rank > 2)) && (selectedIndex[0] > selectedIndex[1])) { // transpose data int n = bData.length; byte[] bData2 = new byte[n]; System.arraycopy(bData, 0, bData2, 0, n); for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { bData[i * w + j] = bData2[j * h + i]; } } } if (!isH5 && !sd.isDefaultImageOrder()&& (selectedIndex[1] > selectedIndex[0])) { // transpose data for hdf4 images where selectedIndex[1] > selectedIndex[0] int n = bData.length; byte[] bData2 = new byte[n]; System.arraycopy(bData, 0, bData2, 0, n); for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { bData[i * w + j] = bData2[j * h + i]; } } } preImage = Tools.createIndexedImage(bData, imagePalette, w, h); } } finally { // set back the origianl selection System.arraycopy(strideBackup, 0, stride, 0, rank); System.arraycopy(selectedBackup, 0, selected, 0, rank); System.arraycopy(startBackup, 0, start, 0, rank); System.arraycopy(selectedIndexBackup, 0, selectedIndex, 0, 3); } return preImage; } @Override public void paint(Graphics g) { g.setColor(Color.blue); if (previewImage != null) { g.drawImage(previewImage, 0, 0, this); } else { g.fillRect(0, 0, x, y); } int w = selectedArea.width; int h = selectedArea.height; if ((w > 0) && (h > 0)) { g.setColor(Color.red); g.drawRect(selectedArea.x, selectedArea.y, w, h); } } public void mousePressed(MouseEvent e) { startPosition = e.getPoint(); selectedArea.setBounds(startPosition.x, startPosition.y, 0, 0); } public void mouseClicked(MouseEvent e) { startPosition = e.getPoint(); selectedArea.setBounds(startPosition.x, startPosition.y, 0, 0); repaint(); } public void mouseDragged(MouseEvent e) { Point p0 = startPosition; Point p1 = e.getPoint(); int x0 = Math.max(0, Math.min(p0.x, p1.x)); int y0 = Math.max(0, Math.min(p0.y, p1.y)); int x1 = Math.min(x, Math.max(p0.x, p1.x)); int y1 = Math.min(y, Math.max(p0.y, p1.y)); int w = x1 - x0; int h = y1 - y0; selectedArea.setBounds(x0, y0, w, h); try { updateSelection(x0, y0, w, h); } catch (Exception ex) { } repaint(); } private void updateSelection(int x0, int y0, int w, int h) { int i0 = 0, i1 = 0; String selStr; i0 = (int) (y0 * r); if (i0 > dims[currentIndex[0]]) { i0 = (int) dims[currentIndex[0]]; } startFields[0].setText(String.valueOf(i0)); i1 = (int) ((y0 + h) * r); if (i1 < i0) { i1 = i0; } endFields[0].setText(String.valueOf(i1)); selStr = String.valueOf((int) (h * r)); if (rank > 1) { i0 = (int) (x0 * r); if (i0 > dims[currentIndex[1]]) { i0 = (int) dims[currentIndex[1]]; } startFields[1].setText(String.valueOf(i0)); i1 = (int) ((x0 + w) * r); if (i1 < i0) { i1 = i0; } endFields[1].setText(String.valueOf(i1)); selStr += " x " + ((int) (w * r)); } selLabel.setText(selStr); } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } private void setDimensionSize(int w, int h) { dimX = w; dimY = h; if (dimX > dimY) { x = NAVIGATOR_SIZE; r = dimX / (double) x; y = (int) (dimY / r); } else { y = NAVIGATOR_SIZE; r = dimY / (double) y; x = (int) (dimX / r); } setPreferredSize(new Dimension(NAVIGATOR_SIZE, NAVIGATOR_SIZE)); selectedArea.setSize(0, 0); try { previewImage = createPreviewImage(); } catch (Exception ex) { } repaint(); } } // private class SubsetNavigator extends JComponent /** * * @return true if display the data as characters; otherwise, display as * numbers. */ public boolean isDisplayTypeChar() { return charCheckbox.isSelected(); } /** * Return the bitmask. */ public BitSet getBitmask() { if (bitmask == null) return null; if (!extractBitButton.isEnabled()) return null; // do not use bitmask if it is empty (all bits are zero) if (bitmask.isEmpty()) return null; boolean isAllSelected = true; int size = bitmask.size(); for (int i = 0; i < size; i++) isAllSelected = (bitmask.get(i) && isAllSelected); // do not use bitmask if it is full (all bits are one) if (isAllSelected) return null; return bitmask; } /** * Check if it only apply bitmask. */ public boolean isApplyBitmaskOnly() { if (getBitmask()==null) return false; return applyBitmaskButton.isSelected(); } /** * * @return true if transpose the data in 2D table; otherwise, do not * transpose the data. */ public boolean isTransposed() { return (transposeChoice.getSelectedIndex() == 1); } /** return the name of selected dataview */ public String getDataViewName() { String viewName = null; if (isText) { viewName = (String) choiceTextView.getSelectedItem(); } else if (isImageDisplay()) { viewName = (String) choiceImageView.getSelectedItem(); } else { viewName = (String) choiceTableView.getSelectedItem(); } return viewName; } } jhdf-2.9/ncsa/hdf/view/NewLinkDialog.java0000755000175000017500000006050712050301063021153 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.io.File; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import ncsa.hdf.object.DataFormat; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; /** * NewLinkDialog shows a message dialog requesting user input for creating a * new links. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class NewLinkDialog extends JDialog implements ActionListener,DocumentListener, ItemListener { private static final long serialVersionUID = 7100424106041533918L; private JTextField nameField; private JComboBox parentChoice, targetObject; private String currentDir; private JTextField targetFile; private JButton targetFileButton; private JRadioButton hardLink, softLink, externalLink; private JCheckBox checkUnsigned; /** a list of current groups */ private List groupList; /** a list of current objects */ private List objList; private HObject newObject; private FileFormat fileFormat; private final Toolkit toolkit; private ViewManager viewer; private final List fileList; /** * Constructs NewLinkDialog with specified list of possible parent groups. * * @param owner * the owner of the input * @param pGroup * the parent group which the new group is added to. * @param objs * the list of all objects. */ public NewLinkDialog(JFrame owner, Group pGroup, List objs) { super(owner, "New Link...", true); viewer = (ViewManager)owner; fileList = viewer.getTreeView().getCurrentFiles(); newObject = null; fileFormat = pGroup.getFileFormat(); toolkit = Toolkit.getDefaultToolkit(); objList = objs; currentDir = ViewProperties.getWorkDir(); parentChoice = new JComboBox(); targetObject = new JComboBox(); targetObject.setEditable(false); groupList = new Vector(objs.size()); HObject obj = null; Iterator iterator = objs.iterator(); String full_name = null; int idx_root = -1, idx = -1; while (iterator.hasNext()) { obj = (HObject) iterator.next(); idx++; if (obj instanceof Group) { Group g = (Group) obj; groupList.add(obj); if (g.isRoot()) { full_name = HObject.separator; idx_root = idx; } else { full_name = g.getPath() + g.getName() + HObject.separator; } parentChoice.addItem(full_name); } else { full_name = obj.getPath() + obj.getName(); } targetObject.addItem(full_name); } targetObject.removeItemAt(idx_root); objList.remove(idx_root); if (pGroup.isRoot()) { parentChoice.setSelectedItem(HObject.separator); } else { parentChoice.setSelectedItem(pGroup.getPath() + pGroup.getName() + HObject.separator); } JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 600 + (ViewProperties.getFontSize() - 12) * 15; int h = 280 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton okButton = new JButton(" Ok "); okButton.setActionCommand("Ok"); okButton.setMnemonic(KeyEvent.VK_O); okButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.setActionCommand("Cancel"); cancelButton.addActionListener(this); // set OK and CANCEL buttons JPanel buttonPanel = new JPanel(); buttonPanel.add(okButton); buttonPanel.add(cancelButton); contentPane.add(buttonPanel, BorderLayout.SOUTH); // set NAME and PARENT GROUP panel JPanel namePanel = new JPanel(); namePanel.setLayout(new BorderLayout(5, 5)); JPanel tmpP = new JPanel(); tmpP.setLayout(new GridLayout(5, 1,5, 5)); tmpP.add(new JLabel("Link name: ")); tmpP.add(new JLabel("Parent group: ")); JPanel tmpLinkJPanel = new JPanel(); tmpLinkJPanel.setLayout(new GridLayout(2, 1)); tmpLinkJPanel.add(new JLabel("Type of Link: ")); JButton helpButton = new JButton(ViewProperties.getHelpIcon()); helpButton.setToolTipText("Help on Links"); helpButton.setMargin(new Insets(0, 0, 0, 0)); helpButton.addActionListener(this); helpButton.setActionCommand("Help on Links"); tmpLinkJPanel.add(helpButton); tmpP.add(tmpLinkJPanel); tmpP.add(new JLabel("Target File: ")); tmpP.add(new JLabel("Target Object: ")); namePanel.add(tmpP, BorderLayout.WEST); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(5, 1,5,5)); tmpP.add(nameField = new JTextField()); tmpP.add(parentChoice); JPanel tmpP0 = new JPanel(); tmpP0.setLayout(new GridLayout(1, 3)); tmpP0.add(hardLink = new JRadioButton("Hard Link ", true)); tmpP0.add(softLink = new JRadioButton("Soft Link ")); tmpP0.add(externalLink = new JRadioButton("External Link ")); tmpP0.setBorder(new TitledBorder("")); tmpP.add(tmpP0); ButtonGroup bgroup = new ButtonGroup(); bgroup.add(hardLink); bgroup.add(softLink); bgroup.add(externalLink); hardLink.addItemListener(this); softLink.addItemListener(this); externalLink.addItemListener(this); JPanel p0 = new JPanel(); p0.setLayout(new BorderLayout()); p0.add(targetFile = new JTextField(), BorderLayout.CENTER); targetFile.getDocument().addDocumentListener(this); targetFile.addActionListener(this); targetFile.setActionCommand("Link to File"); JButton b = new JButton("Browse..."); targetFileButton = b; b.setActionCommand("Browse File"); b.addActionListener(this); p0.add(b, BorderLayout.EAST); tmpP.add(p0); targetFile.setEnabled(false); targetFileButton.setEnabled(false); tmpP.add(targetObject); namePanel.add(tmpP, BorderLayout.CENTER); contentPane.add(namePanel, BorderLayout.CENTER); // locate the H5Property dialog Point l = owner.getLocation(); l.x += 250; l.y += 100; setLocation(l); validate(); pack(); } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Help on Links")) { final String msg = "The Type of Link specifies which type of link the user wants to create. \n" + "It could be hard, soft or external links. \n\n" + "Hard Link \n" + "Hard Link creates a hard link to a pre-existing object in an HDF5 file. \n" + "The target object must already exist in the file.\n" + "The HDF5 library keeps a count of all hard links pointing to an object. \n\n" + "Soft Link \n" + "Soft Link creates a new soft link to an object in an HDF5 file. \n" + "Soft links are only for use only if the target object is in the current file. \n" + "Unlike hard links, a soft link in an HDF5 file is allowed to dangle, \n" + "meaning that the target object need not exist at the time that the link is created.\n" + "The HDF5 library does not keep a count of soft links \n\n" + "External Link \n" + "External Link creates a new soft link to an external object, which is an object\n" + "in a different HDF5 file from the location of the link. External links are \n" + "allowed to dangle like soft links. \n\n" + "Soft links and external links are also known as symbolic links as they use \n" + "a name to point to an object; hard links employ an object's address in the file. \n\n\n"; JOptionPane.showMessageDialog(this, msg); } if (cmd.equals("Browse File")) { String filename = null; filename = openTargetFile(); if (filename == null) { return; } targetFile.setText(filename); } if (cmd.equals("Ok")) { newObject = createLink(); if (newObject != null) { dispose(); } } if (cmd.equals("Cancel")) { newObject = null; dispose(); ((Vector) groupList).setSize(0); } } private String openTargetFile() { JFileChooser fchooser = new JFileChooser(currentDir); fchooser.setFileFilter(DefaultFileFilter.getFileFilter()); int returnVal = fchooser.showOpenDialog(this); if(returnVal != JFileChooser.APPROVE_OPTION) { return null; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return null; } if (choosedFile.isDirectory()) { currentDir = choosedFile.getPath(); } else { currentDir = choosedFile.getParent(); } return choosedFile.getAbsolutePath(); } private final List breadthFirstUserObjects(TreeNode node) { if (node == null) { return null; } Vector list = new Vector(); DefaultMutableTreeNode theNode = null; Enumeration local_enum = ((DefaultMutableTreeNode)node).breadthFirstEnumeration(); while(local_enum.hasMoreElements()) { theNode = (DefaultMutableTreeNode)local_enum.nextElement(); list.add(theNode.getUserObject()); } return list; } private HObject createLink() { String name = null; Group pgroup = null; HObject obj = null; name = nameField.getText().trim(); if ((name == null) || (name.length() < 1)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Link name is not specified.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (name.indexOf(HObject.separator) >= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Link name cannot contain path.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } pgroup = (Group) groupList.get(parentChoice.getSelectedIndex()); if (pgroup == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Parent group is null.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (hardLink.isSelected()) { HObject targetObj = (HObject) objList.get(targetObject .getSelectedIndex()); if (targetObj == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Target object is null.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if ((targetObj instanceof Group) && ((Group) targetObj).isRoot()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Cannot make a link to the root group.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } try { obj = fileFormat.createLink(pgroup, name, targetObj); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } } else if (softLink.isSelected()){ String target_name = targetObject.getEditor().getItem().toString(); if (target_name.length() < 1) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Target object name is not specified.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } HObject targetObj = null; try{ targetObj = fileFormat.get(targetObject.getEditor().getItem().toString()); }catch (Exception ex) { } String tObj = null; if(targetObj==null){ tObj = targetObject.getEditor().getItem().toString(); if (!tObj.startsWith(HObject.separator)) { tObj = HObject.separator + tObj; } } if ((targetObj instanceof Group) && ((Group) targetObj).isRoot()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Cannot make a link to the root group.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } try { if(targetObj !=null) obj = fileFormat.createLink(pgroup, name, targetObj, Group.LINK_TYPE_SOFT); else if(tObj!=null) obj = fileFormat.createLink(pgroup, name, tObj, Group.LINK_TYPE_SOFT); } catch (Exception ex) { ex.printStackTrace(); toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } } else if (externalLink.isSelected()){ String TargetFileName = targetFile.getText(); FileFormat TargetFileFormat = null; int fileAccessID = FileFormat.FILE_CREATE_OPEN; File TargetFile = new File(TargetFileName); if (!TargetFile.exists()) { return null; } FileFormat h5format = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); try { //h5format.close(); TargetFileFormat = h5format.createInstance(TargetFileName, fileAccessID); TargetFileFormat.open(); //open the file } catch (Exception ex) { return null; } HObject targetObj = null; try{ targetObj = TargetFileFormat.get(targetObject.getEditor().getItem().toString()); }catch (Exception ex) { ex.printStackTrace(); } try { TargetFileFormat.close(); } catch (Exception ex) { } String tFileObj = null; if(targetObj==null){ String tObj = null; tObj = targetObject.getEditor().getItem().toString(); if (tObj.length() < 1) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Target object name not specified.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } tFileObj = TargetFileName + FileFormat.FILE_OBJ_SEP + tObj; } // should allow to link to the root of an external file // if ((targetObj instanceof Group) && ((Group) targetObj).isRoot()) { // toolkit.beep(); // JOptionPane.showMessageDialog(this, // "Cannot make a link to the root group.", getTitle(), // JOptionPane.ERROR_MESSAGE); // return null; // } try { if(targetObj !=null) obj = fileFormat.createLink(pgroup, name, targetObj, Group.LINK_TYPE_EXTERNAL); else if(tFileObj!=null) obj = fileFormat.createLink(pgroup, name, tFileObj, Group.LINK_TYPE_EXTERNAL); } catch (Exception ex) { ex.printStackTrace(); toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } } return obj; } /** Returns the new dataset created. */ public DataFormat getObject() { return newObject; } /** Returns the parent group of the new dataset. */ public Group getParentGroup() { return (Group) groupList.get(parentChoice.getSelectedIndex()); } public void changedUpdate(DocumentEvent arg0) { } public void insertUpdate(DocumentEvent e) { targetObject.setEnabled(true); getTargetFileObjs(); } public void removeUpdate(DocumentEvent arg0) { targetObject.setEnabled(true); getTargetFileObjs(); } //Retrieving objects from Target File. private void getTargetFileObjs(){ FileFormat fileFormatC = null; int fileAccessID = FileFormat.FILE_CREATE_OPEN; String filename = null; filename = targetFile.getText(); if (filename == null || filename.length()<1) { return; } //Check if the target File is not the current file. String CurrentFileName = fileFormat.getAbsolutePath(); if(CurrentFileName.equals(filename)) targetObject.setEnabled(false); //Check if the target File is open in treeView if (isFileOpen(filename)) { return; } File choosedFile = new File(filename); if (!choosedFile.exists()) { targetObject.setEnabled(false); return; } FileFormat h5format = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); try { //h5format.close(); fileFormatC = h5format.createInstance(filename, fileAccessID); fileFormatC.open(); //open the file } catch (Exception ex) { targetObject.setEnabled(false); toolkit.beep(); JOptionPane.showMessageDialog(this,"Invalid File Format", getTitle(), JOptionPane.ERROR_MESSAGE); return; } //getting the list of objects from the file:- retriveObjects(fileFormatC); try { fileFormatC.close(); } catch (Exception ex) { } } //Function to check if the target File is open in treeView private boolean isFileOpen(String filename) { boolean isOpen = false; FileFormat theFile = null; Iterator iterator = fileList.iterator(); while(iterator.hasNext()) { theFile = (FileFormat)iterator.next(); if (theFile.getFilePath().equals(filename)) { isOpen = true; if(!theFile.isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5))){ targetObject.setEnabled(false); } retriveObjects(theFile); break; } } // while(iterator.hasNext()) return isOpen; } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source instanceof JRadioButton) { if (source.equals(hardLink) || source.equals(softLink) || source.equals(externalLink)) { if (hardLink.isSelected()) { targetFile.setEnabled(false); targetFileButton.setEnabled(false); targetObject.setEnabled(true); targetObject.setEditable(false); retriveObjects(fileFormat); } else if (softLink.isSelected()) { targetFile.setEnabled(false); targetFileButton.setEnabled(false); targetObject.setEnabled(true); targetObject.setEditable(true); retriveObjects(fileFormat); } else if (externalLink.isSelected()) { targetFile.setEnabled(true); targetFileButton.setEnabled(true); targetObject.setEnabled(true); targetObject.setEditable(true); targetObject.removeAllItems(); } } } } //getting the list of objects from the file:- private void retriveObjects(FileFormat file) { List objsFile = breadthFirstUserObjects(file.getRootNode()); List groupListFile = new Vector(objsFile.size()); HObject obj = null; Iterator iterator = objsFile.iterator(); List objListFile = objsFile; String full_name = null; int idx_root = -1, idx = -1; targetObject.removeAllItems(); while (iterator.hasNext()) { obj = (HObject) iterator.next(); idx++; if (obj instanceof Group) { Group g = (Group) obj; groupListFile.add(obj); if (g.isRoot()) { full_name = HObject.separator; idx_root = idx; } else { full_name = g.getPath() + g.getName() + HObject.separator; } } else { full_name = obj.getPath() + obj.getName(); } targetObject.addItem(full_name); } targetObject.removeItemAt(idx_root); objListFile.remove(idx_root); } } jhdf-2.9/ncsa/hdf/view/MathConversionDialog.java0000644000175000017500000003467012050301063022542 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.lang.reflect.Array; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.border.TitledBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * MathConversionDialog shows a message dialog requesting user input for math * conversion. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class MathConversionDialog extends JDialog implements ActionListener, ListSelectionListener { private static final long serialVersionUID = 5136554941147830371L; private JTextField aField, bField; private JTextArea infoArea; private JList functionList; private Object dataValue; private char NT; private final Toolkit toolkit; private String[] functionDescription; private boolean isConverted; /** * Constructs MathConversionDialog. * * @param owner * the owner of the input * @param data * the data array to convert. */ public MathConversionDialog(JFrame owner, Object data) { super(owner, "Convert Data...", true); toolkit = Toolkit.getDefaultToolkit(); isConverted = false; dataValue = data; NT = ' '; String cName = data.getClass().getName(); int cIndex = cName.lastIndexOf("["); if (cIndex >= 0) { NT = cName.charAt(cIndex + 1); } String[] functionNames = { "[a, b]", "abs (x)", "a + b * x", "pow (x, a)", "exp (x)", "ln (x)", "log (a, x)", "sin (x)", "cos (x)", "tan (x)" }; functionList = new JList(functionNames); functionList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); functionList.addListSelectionListener(this); String[] tmpStrs = { "The filter by lower and upper bounds. x=a if xb." + "\ne.g.\n x=5, [0, 127]=5\n x=-5, [0, 127]=0\n x=255, [0, 127]=127.", "The absolute value of a number, the number without its sign." + "\ne.g.\n abs(5)=5\n abs(-5)=5.", "Linear function." + "\ne.g.\n a=5, b=2, x=2.5, a+b*x=10.", "The result of a number raised to power of a." + "\ne.g.\n x=2.5, a=10, pow(x, a)=9536.743\n x=25, a=0.5, pow(x, a)=5.", "The exponential number e (i.e., 2.718...) raised to the power of x." + "\ne.g.\n exp(5.0)=148.41316\n exp(5.5)=244.69193", "The natural logarithm (base e) of x." + "\ne.g.\n ln(20.085541)=3\n ln(10)=2.302585", "The logarithm of x to the base of a, \"a\" must be an integer > 0." + "\ne.g.\n log(10, 2)=3.321928\n log(2, 10)=0.30103", "The trigonometric sine of angle x in radians." + "\ne.g.\n sin(0.523599)=0.5\n sin(1.047198)=0.866025", "The trigonometric cosine of angle x in radians." + "\ne.g.\n cos(0.523599)=0.866025\n cos(1.047198)=0.5", "The trigonometric tangent of angle x in radians." + "\ne.g.\n tan(0.785398)=1\n tan(1.047198)=1.732051" }; functionDescription = tmpStrs; JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(10, 5, 5, 5)); int w = 500 + (ViewProperties.getFontSize() - 12) * 15; int h = 300 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton okButton = new JButton(" Ok "); okButton.setActionCommand("Ok"); okButton.setMnemonic(KeyEvent.VK_O); okButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.setActionCommand("Cancel"); cancelButton.addActionListener(this); // set OK and CANCEL buttons JPanel buttonPanel = new JPanel(); buttonPanel.add(okButton); buttonPanel.add(cancelButton); contentPane.add(buttonPanel, BorderLayout.SOUTH); // set name, parent, width and height panel JPanel centerP = new JPanel(); centerP.setLayout(new BorderLayout(10, 10)); JScrollPane scroller = new JScrollPane(functionList); centerP.add(scroller, BorderLayout.CENTER); JPanel tmpP = new JPanel(); tmpP.setLayout(new BorderLayout(5, 5)); JPanel tmpP0 = new JPanel(); tmpP0.setLayout(new GridLayout(4, 1, 5, 5)); tmpP0.add(new JLabel("a = ")); tmpP0.add(new JLabel("b = ")); tmpP0.add(new JLabel(" ")); tmpP0.add(new JLabel(" ")); tmpP.add(tmpP0, BorderLayout.WEST); tmpP0 = new JPanel(); tmpP0.setLayout(new GridLayout(4, 1, 5, 5)); tmpP0.add(aField = new JTextField("0")); tmpP0.add(bField = new JTextField("1")); tmpP0.add(new JLabel(" ")); tmpP0.add(new JLabel(" ")); tmpP.add(tmpP0, BorderLayout.CENTER); centerP.add(tmpP, BorderLayout.EAST); centerP.setBorder(new TitledBorder( "Converting Data With A Mathematic Function")); centerP.add(infoArea = new JTextArea(4, 80), BorderLayout.SOUTH); infoArea.setEditable(false); infoArea.setLineWrap(true); infoArea.setBackground(java.awt.Color.lightGray); infoArea.setWrapStyleWord(true); aField.setEnabled(false); bField.setEnabled(false); contentPane.add(centerP, BorderLayout.CENTER); // locate the H5Property dialog Point l = owner.getLocation(); l.x += 250; l.y += 80; setLocation(l); validate(); pack(); } private boolean convertData() { double a = 0, b = 1; int index = functionList.getSelectedIndex(); try { if ((index == 0) || (index == 2)) { a = Double.parseDouble(aField.getText().trim()); b = Double.parseDouble(bField.getText().trim()); } else if (index == 3) { a = Double.parseDouble(aField.getText().trim()); } else if (index == 6) { a = Integer.parseInt(aField.getText().trim()); if (a <= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "a must be an integer greater than zero.", getTitle(), JOptionPane.ERROR_MESSAGE); return false; } } } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return false; } int n = Array.getLength(dataValue); double value = 0, x = 0; switch (NT) { case 'B': byte[] bdata = (byte[]) dataValue; for (int i = 0; i < n; i++) { x = bdata[i]; value = y(index, x, a, b); if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) { JOptionPane.showMessageDialog(this, "Invalid byte value: " + (long) value, getTitle(), JOptionPane.ERROR_MESSAGE); return false; } bdata[i] = (byte) value; } // for (int i=0; i Short.MAX_VALUE) || (value < Short.MIN_VALUE)) { JOptionPane.showMessageDialog(this, "Invalid short value: " + (long) value, getTitle(), JOptionPane.ERROR_MESSAGE); return false; } sdata[i] = (short) value; } // for (int i=0; i Integer.MAX_VALUE) || (value < Integer.MIN_VALUE)) { JOptionPane.showMessageDialog(this, "Invalid int value: " + (long) value, getTitle(), JOptionPane.ERROR_MESSAGE); return false; } idata[i] = (int) value; } // for (int i=0; i Long.MAX_VALUE) || (value < Long.MIN_VALUE)) { JOptionPane.showMessageDialog(this, "Invalid long value: " + (long) value, getTitle(), JOptionPane.ERROR_MESSAGE); return false; } ldata[i] = (long) value; } // for (int i=0; i Float.MAX_VALUE) || (value < -Float.MAX_VALUE) || (value == Float.NaN)) { JOptionPane.showMessageDialog(this, "Invalid float value: " + value, getTitle(), JOptionPane.ERROR_MESSAGE); return false; } fdata[i] = (float) value; } // for (int i=0; i Double.MAX_VALUE) || (value < -Double.MAX_VALUE) || (value == Double.NaN)) { JOptionPane.showMessageDialog(this, "Invalid double value: " + value, getTitle(), JOptionPane.ERROR_MESSAGE); return false; } ddata[i] = value; } // for (int i=0; i b) { y = b; } break; case 1: y = Math.abs(x); break; case 2: y = (a + b * x); break; case 3: y = Math.pow(x, a); break; case 4: y = Math.exp(x); break; case 5: y = Math.log(x); break; case 6: y = (Math.log(x) / Math.log(a)); break; case 7: y = Math.sin(x); break; case 8: y = Math.cos(x); break; case 9: y = Math.tan(x); break; default: y = x; break; } return y; } /** Returns true if the data is successfully converted. */ public boolean isConverted() { return isConverted; } } jhdf-2.9/ncsa/hdf/view/TableView.java0000644000175000017500000000276112050301063020341 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import javax.swing.JTable; /** * * The table view interface for displaying data in table form * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public abstract interface TableView extends DataView { /** returns the table */ public abstract JTable getTable(); /** returns array of selected data */ public abstract Object getSelectedData(); /** Write the change of a dataset into file. */ public abstract void updateValueInFile(); } jhdf-2.9/ncsa/hdf/view/DefaultImageView.java0000755000175000017500000040611712050301063021647 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Image; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.DirectColorModel; import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.awt.image.ImageProducer; import java.awt.image.IndexColorModel; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; import java.awt.image.RGBImageFilter; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.io.RandomAccessFile; import java.lang.reflect.Array; import java.text.DecimalFormat; import java.util.BitSet; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFormattedTextField; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.border.Border; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.text.NumberFormatter; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; import ncsa.hdf.view.ViewProperties.BITMASK_OP; /** * ImageView displays an HDF dataset as an image. *

    * A scalar dataset in HDF can be displayed in image or table. By default, an * HDF4 GR image and HDF5 image is displayed as an image. Other scalar datasets * are display in a two-dimensional table. *

    * Users can also choose to display a scalar dataset as image. Currently verion * of the ImageView only supports 8-bit raster image with indexed RGB color * model of 256 colors or 24-bit true color raster image. Data of other type * will be converted to 8-bit integer. The simple linear conversion is used for * this purpose: * *

     * y = f * (x - min),
     *       where y   = the value of 8-bit integer,
     *             x   = the value of original data,
     *             f   = 255/(max-min), conversion factor,
     *             max = the maximum of the original data,
     *             min = the minimum of the original data.
     * 
    *

    * A default color table is provided for images without palette attached to it. * Current choice of default palettes include Gray, Rainbow, Nature and Wave. * For more infomation on palette, read HDF5 Image and * Palette Specification * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class DefaultImageView extends JInternalFrame implements ImageView, ActionListener { private static final long serialVersionUID = -6534336542813587242L; /** Horizontal direction to flip an image. */ public static final int FLIP_HORIZONTAL = 0; /** Vertical direction to flip an image. */ public static final int FLIP_VERTICAL = 1; /** ROTATE IMAGE 90 DEGREE CLOCKWISE. */ public static final int ROTATE_CW_90 = 10; /** ROTATE IMAGE COUNTER CLOCKWISE 90 DEGREE. */ public static final int ROTATE_CCW_90 = 11; /** * The main HDFView. */ private final ViewManager viewer; /** * The Scalar Dataset. */ private ScalarDS dataset; /** * The JComponent containing the image. */ private ImageComponent imageComponent; /** * The image contained in the ImageView. */ private Image image; /** * The zooming factor of this image. */ private float zoomFactor; /** * The byte data array of the image. */ private byte[] imageByteData; /** * The color table of the image. */ private byte[][] imagePalette; /** * The title of this imageview. */ private String frameTitle; /** TextField to show the image value. */ private JTextField valueField; /** Flag to indicate if the image is a true color image */ private boolean isTrueColor; /** Flag to indicate if the image is a 3D */ private boolean is3D; /** Flag to indicate if the image is plane interleaved */ private boolean isPlaneInterlace; private boolean isHorizontalFlipped = false; private boolean isVerticalFlipped = false; private int rotateCount = 0; /** the number type of the image data */ private char NT; /** the raw data of the image */ private Object data; /** flag to indicate if the original data type is unsigned integer */ private boolean isUnsigned; private boolean isUnsignedConverted = false; private final Toolkit toolkit; private double[] dataRange; private final double[] originalRange = {0,0}; private PaletteComponent paletteComponent; private int animationSpeed = 2; private List rotateRelatedItems; private JScrollPane imageScroller; private JTextField frameField; private long curFrame = 0, maxFrame = 1; private MemoryImageSource memoryImageSource; // private AutoContrastSlider autoContrastSlider; private ContrastSlider contrastSlider; private int indexBase = 0; private int[] dataDist = null; /** * equates to brightness */ private boolean doAutoGainContrast = false; private double[] gainBias, gainBias_current; /** * int array to hold unsigned short or signed int data from applying the * autogain */ private Object autoGainData; private BitSet bitmask; private boolean convertByteData = false; private BITMASK_OP bitmaskOP = BITMASK_OP.EXTRACT; /* image origin: 0-UL, 1-LL, 2-UR, 3-LR */ private int origin = 0; /** * Constructs an ImageView. *

    * * @param theView * the main HDFView. */ public DefaultImageView(ViewManager theView) { this(theView, null); } /** * Constructs an ImageView. *

    * * @param theView * the main HDFView. * @param map * the properties on how to show the data. The map is used to * allow applications to pass properties on how to display the * data, such as, transposing data, showing data as character, * applying bitmask, and etc. Predefined keys are listed at * ViewProperties.DATA_VIEW_KEY. */ public DefaultImageView(ViewManager theView, HashMap map) { super(); setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE); setFrameIcon(ViewProperties.getImageIcon()); viewer = theView; zoomFactor = 1.0f; imageByteData = null; imagePalette = null; paletteComponent = null; isTrueColor = false; is3D = false; isPlaneInterlace = false; isUnsigned = false; data = null; NT = 0; toolkit = Toolkit.getDefaultToolkit(); rotateRelatedItems = new Vector(10); imageScroller = null; memoryImageSource = null; gainBias = null; gainBias_current = null; autoGainData = null; contrastSlider = null; bitmask = null; String origStr = ViewProperties.getImageOrigin(); if (ViewProperties.ORIGIN_LL.equalsIgnoreCase(origStr)) origin = 1; else if (ViewProperties.ORIGIN_UR.equalsIgnoreCase(origStr)) origin = 2; else if (ViewProperties.ORIGIN_LR.equalsIgnoreCase(origStr)) origin = 3; if (ViewProperties.isIndexBase1()) indexBase = 1; HObject hobject = null; if (map != null) { hobject = (HObject) map.get(ViewProperties.DATA_VIEW_KEY.OBJECT); bitmask = (BitSet) map.get(ViewProperties.DATA_VIEW_KEY.BITMASK); bitmaskOP = (BITMASK_OP)map.get(ViewProperties.DATA_VIEW_KEY.BITMASKOP); Boolean b = (Boolean) map .get(ViewProperties.DATA_VIEW_KEY.CONVERTBYTE); if (b != null) convertByteData = b.booleanValue(); b = (Boolean) map.get(ViewProperties.DATA_VIEW_KEY.INDEXBASE1); if (b != null) { if (b.booleanValue()) indexBase = 1; else indexBase = 0; } } if (hobject == null) hobject = (HObject) theView.getTreeView().getCurrentObject(); if ((hobject == null) || !(hobject instanceof ScalarDS)) { viewer.showStatus("Display data in image failed for - " + hobject); return; } dataset = (ScalarDS) hobject; dataRange = dataset.getImageDataRange(); if (dataRange == null) { dataRange = new double[2]; dataRange[0] = dataRange[1] = 0; if (dataset.getDatatype().getDatatypeSize() == 1 && !convertByteData) { dataRange[1] = 255; // byte image data rang = [0, 255] } } else { if (dataRange[0] < dataRange[1]) convertByteData = true; } JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout()); // add the text field to display pixel data contentPane.add(valueField = new JTextField(), BorderLayout.SOUTH); valueField.setEditable(false); valueField.setVisible(ViewProperties.showImageValues()); if (image == null) { getImage(); } if (image == null) { viewer.showStatus("Loading image failed - " + dataset.getName()); dataset = null; return; } originalRange[0] = dataRange[0]; originalRange[1] = dataRange[1]; imageComponent = new ImageComponent(image); JScrollPane scroller = new JScrollPane(imageComponent); scroller.getVerticalScrollBar().setUnitIncrement(50); scroller.getHorizontalScrollBar().setUnitIncrement(50); imageScroller = scroller; contentPane.add(scroller, BorderLayout.CENTER); // add palette convas to show the palette if (imagePalette != null) { paletteComponent = new PaletteComponent(imagePalette, dataRange); contentPane.add(paletteComponent, BorderLayout.EAST); } if (origin == 1) flip(FLIP_VERTICAL); else if (origin == 2) flip(FLIP_HORIZONTAL); if (origin == 3) { rotate(ROTATE_CW_90); rotate(ROTATE_CW_90); } // set title StringBuffer sb = new StringBuffer("ImageView <"+ViewProperties.getImageOrigin()+"> - "); sb.append(hobject.getName()); sb.append(" - "); sb.append(hobject.getPath()); sb.append(" - "); sb.append(dataset.getFile()); setTitle(sb.toString()); frameTitle = sb.toString(); setTitle(frameTitle); this.setName(frameTitle); // setup subset information int rank = dataset.getRank(); int[] selectedIndex = dataset.getSelectedIndex(); long[] count = dataset.getSelectedDims(); long[] stride = dataset.getStride(); long[] dims = dataset.getDims(); long[] start = dataset.getStartDims(); int n = Math.min(3, rank); if (rank > 2) { curFrame = start[selectedIndex[2]]+indexBase; maxFrame = dims[selectedIndex[2]]; } sb.append(" [ dims"); sb.append(selectedIndex[0]); for (int i = 1; i < n; i++) { sb.append("x"); sb.append(selectedIndex[i]); } sb.append(", start"); sb.append(start[selectedIndex[0]]); for (int i = 1; i < n; i++) { sb.append("x"); sb.append(start[selectedIndex[i]]); } sb.append(", count"); sb.append(count[selectedIndex[0]]); for (int i = 1; i < n; i++) { sb.append("x"); sb.append(count[selectedIndex[i]]); } sb.append(", stride"); sb.append(stride[selectedIndex[0]]); for (int i = 1; i < n; i++) { sb.append("x"); sb.append(stride[selectedIndex[i]]); } sb.append(" ] "); setJMenuBar(createMenuBar()); viewer.showStatus(sb.toString()); } private JMenuBar createMenuBar() { JMenuBar bar = new JMenuBar(); JButton button; boolean isEditable = !dataset.getFileFormat().isReadOnly(); JMenu menu = new JMenu("Image", false); menu.setMnemonic('I'); bar.add(menu); JMenu convertImageMenu = new JMenu("Save Image As"); menu.add(convertImageMenu); JMenuItem item = new JMenuItem(Tools.FILE_TYPE_JPEG); item.addActionListener(this); item.setActionCommand("Save image as jpeg"); convertImageMenu.add(item); /* * ImageIO does not support tiff by default item = new * JMenuItem(Tools.FILE_TYPE_TIFF); item.addActionListener(this); * item.setActionCommand("Save image as tiff"); * convertImageMenu.add(item); */ item = new JMenuItem(Tools.FILE_TYPE_PNG); item.addActionListener(this); item.setActionCommand("Save image as png"); convertImageMenu.add(item); item = new JMenuItem(Tools.FILE_TYPE_GIF); item.addActionListener(this); item.setActionCommand("Save image as gif"); convertImageMenu.add(item); item = new JMenuItem(Tools.FILE_TYPE_BMP); item.addActionListener(this); item.setActionCommand("Save image as bmp"); convertImageMenu.add(item); menu.addSeparator(); item = new JMenuItem("Write Selection to Image"); item.addActionListener(this); item.setActionCommand("Write selection to image"); item.setEnabled(isEditable); rotateRelatedItems.add(item); menu.add(item); menu.addSeparator(); item = new JMenuItem("Change Palette"); item.addActionListener(this); item.setActionCommand("Edit palette"); item.setEnabled(!isTrueColor); menu.add(item); item = new JMenuItem("Import Palette"); item.addActionListener(this); item.setActionCommand("Import palette"); item.setEnabled(!isTrueColor); menu.add(item); item = new JMenuItem("Export Palette"); item.addActionListener(this); item.setActionCommand("Export palette"); item.setEnabled(!isTrueColor); menu.add(item); menu.addSeparator(); item = new JMenuItem("Set Value Range"); item.setEnabled(!isTrueColor); item.addActionListener(this); item.setActionCommand("Set data range"); menu.add(item); // no need for byte data // commented out for 2.6. May also need to apply range filter to byte // data. // try { // String cname = data.getClass().getName(); // char dname = cname.charAt(cname.lastIndexOf("[")+1); // if (dname == 'B') { // item.setEnabled(false); // } // } catch (Exception ex) {} menu.addSeparator(); item = new JMenuItem("Show Histogram"); item.addActionListener(this); item.setActionCommand("Show chart"); item.setEnabled(!isTrueColor); rotateRelatedItems.add(item); menu.add(item); menu.addSeparator(); item = new JMenuItem("Zoom In"); item.addActionListener(this); item.setActionCommand("Zoom in"); menu.add(item); item = new JMenuItem("Zoom Out"); item.addActionListener(this); item.setActionCommand("Zoom out"); menu.add(item); menu.addSeparator(); JMenu imageMenu = new JMenu("Flip"); menu.add(imageMenu); item = new JMenuItem("Horizontal"); item.addActionListener(this); item.setActionCommand("Flip horizontal"); imageMenu.add(item); item = new JMenuItem("Vertical"); item.addActionListener(this); item.setActionCommand("Flip vertical"); imageMenu.add(item); imageMenu = new JMenu("Rotate Image"); menu.add(imageMenu); char t = 186; item = new JMenuItem("90" + t + " CW"); item.addActionListener(this); item.setActionCommand("Rotate clockwise"); imageMenu.add(item); item = new JMenuItem("90" + t + " CCW"); item.addActionListener(this); item.setActionCommand("Rotate counter clockwise"); imageMenu.add(item); menu.addSeparator(); item = new JMenuItem("Brightness/Contrast"); item.addActionListener(this); item.setActionCommand("Brightness"); menu.add(item); JMenu contourMenu = new JMenu("Contour"); for (int i = 3; i < 10; i++) { item = new JMenuItem(String.valueOf(i)); item.addActionListener(this); item.setActionCommand("Contour " + i); contourMenu.add(item); } menu.add(contourMenu); menu.addSeparator(); item = new JMenuItem("Show Animation"); item.addActionListener(this); item.setActionCommand("Show animation"); item.setEnabled(is3D); menu.add(item); JMenu animationMenu = new JMenu("Animation (frames/second)"); for (int i = 2; i < 12; i = i + 2) { item = new JMenuItem(String.valueOf(i)); item.addActionListener(this); item.setActionCommand("Animation speed " + i); animationMenu.add(item); } animationMenu.setEnabled(is3D); menu.add(animationMenu); menu.addSeparator(); JCheckBoxMenuItem imageValueCheckBox = new JCheckBoxMenuItem( "Show Value", false); imageValueCheckBox.addActionListener(this); imageValueCheckBox.setActionCommand("Show image value"); imageValueCheckBox.setSelected(ViewProperties.showImageValues()); rotateRelatedItems.add(imageValueCheckBox); menu.add(imageValueCheckBox); item = new JMenuItem("Show Statistics"); item.addActionListener(this); item.setActionCommand("Show statistics"); menu.add(item); menu.addSeparator(); item = new JMenuItem("Select All"); item.addActionListener(this); item.setActionCommand("Select all data"); menu.add(item); menu.addSeparator(); item = new JMenuItem("Close"); item.addActionListener(this); item.setActionCommand("Close"); menu.add(item); bar.add(new JLabel(" ")); // add icons to the menubar Insets margin = new Insets(0, 2, 0, 2); // chart button button = new JButton(ViewProperties.getChartIcon()); bar.add(button); button.setToolTipText("Histogram"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Show chart"); button.setEnabled(!isTrueColor); // palette button button = new JButton(ViewProperties.getPaletteIcon()); bar.add(button); button.setToolTipText("Palette"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Edit palette"); button.setEnabled(!isTrueColor); // brightness button button = new JButton(ViewProperties.getBrightIcon()); bar.add(button); button.setToolTipText("Brightness"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Brightness"); // brightness button // button = new JButton(ViewProperties.getAutocontrastIcon()); // bar.add(button); // button.setToolTipText("Calculate AutoGain"); // button.setMargin(margin); // button.addActionListener(this); // button.setActionCommand("Calculate AutoGain"); // button.setEnabled(ViewProperties.isAutoContrast()); button = new JButton(ViewProperties.getZoominIcon()); bar.add(button); button.addActionListener(this); button.setMargin(margin); button.setActionCommand("Zoom in"); button.setToolTipText("Zoom In"); // zoom out button button = new JButton(ViewProperties.getZoomoutIcon()); bar.add(button); button.setToolTipText("Zoom Out"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Zoom out"); if (is3D) { bar.add(new JLabel(" ")); // first button button = new JButton(ViewProperties.getFirstIcon()); bar.add(button); button.setToolTipText("First"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("First page"); // previous button button = new JButton(ViewProperties.getPreviousIcon()); bar.add(button); button.setToolTipText("Previous"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Previous page"); frameField = new JTextField(String.valueOf(curFrame)); frameField.setMaximumSize(new Dimension(50, 30)); bar.add(frameField); frameField.setMargin(margin); frameField.addActionListener(this); frameField.setActionCommand("Go to frame"); JLabel tmpField = new JLabel(String.valueOf(maxFrame), SwingConstants.CENTER); tmpField.setMaximumSize(new Dimension(50, 30)); bar.add(tmpField); // next button button = new JButton(ViewProperties.getNextIcon()); bar.add(button); button.setToolTipText("Next"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Next page"); // last button button = new JButton(ViewProperties.getLastIcon()); bar.add(button); button.setToolTipText("Last"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Last page"); button = new JButton(ViewProperties.getAnimationIcon()); bar.add(button); button.setToolTipText("Animation"); button.setMargin(margin); button.addActionListener(this); button.setActionCommand("Show animation"); } return bar; } // Implementing DataObserver. private void previousPage() { int rank = dataset.getRank(); if (rank < 3) { return; } int[] selectedIndex = dataset.getSelectedIndex(); long[] selectedDims = dataset.getSelectedDims(); if (selectedDims[selectedIndex[2]] > 1) { return; // it is a true color image with three color components } long[] start = dataset.getStartDims(); long[] dims = dataset.getDims(); long idx = start[selectedIndex[2]]; if (idx == 0) { return; // current page is the first page } gotoPage(start[selectedIndex[2]] - 1); } // Implementing DataObserver. private void nextPage() { int rank = dataset.getRank(); if (rank < 3) { return; } int[] selectedIndex = dataset.getSelectedIndex(); long[] selectedDims = dataset.getSelectedDims(); if (selectedDims[selectedIndex[2]] > 1) { return; // it is a true color image with three color components } long[] start = dataset.getStartDims(); long[] dims = dataset.getDims(); long idx = start[selectedIndex[2]]; if (idx == dims[selectedIndex[2]] - 1) { return; // current page is the last page } gotoPage(start[selectedIndex[2]] + 1); } // Implementing DataObserver. private void firstPage() { int rank = dataset.getRank(); if (rank < 3) { return; } int[] selectedIndex = dataset.getSelectedIndex(); long[] selectedDims = dataset.getSelectedDims(); if (selectedDims[selectedIndex[2]] > 1) { return; // it is a true color image with three color components } long[] start = dataset.getStartDims(); long[] dims = dataset.getDims(); long idx = start[selectedIndex[2]]; if (idx == 0) { return; // current page is the first page } gotoPage(0); } // Implementing DataObserver. private void lastPage() { int rank = dataset.getRank(); if (rank < 3) { return; } int[] selectedIndex = dataset.getSelectedIndex(); long[] selectedDims = dataset.getSelectedDims(); if (selectedDims[selectedIndex[2]] > 1) { return; // it is a true color image with three color components } long[] start = dataset.getStartDims(); long[] dims = dataset.getDims(); long idx = start[selectedIndex[2]]; if (idx == dims[selectedIndex[2]] - 1) { return; // current page is the last page } gotoPage(dims[selectedIndex[2]] - 1); } public Image getImage() { if (image != null) { return image; } int rank = dataset.getRank(); if (rank <= 0) { dataset.init(); } isTrueColor = dataset.isTrueColor(); is3D = (dataset.getRank() > 2) && !((ScalarDS) dataset).isTrueColor(); String strValue = null; try { if (isTrueColor) { getTrueColorImage(); } else { getIndexedImage(); } } catch (Throwable ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "ImageView:"+getTitle(), JOptionPane.ERROR_MESSAGE); return null; } // set number type, ... if (data != null) { isUnsigned = dataset.isUnsigned(); String cname = data.getClass().getName(); NT = cname.charAt(cname.lastIndexOf("[") + 1); } return image; } /** * @throws Exception * @throws OutOfMemoryError */ private void getIndexedImage() throws Exception, OutOfMemoryError { if (imagePalette==null) imagePalette = dataset.getPalette(); boolean noPalette = false; boolean isLocalFile = dataset.getFileFormat().exists(); if (imagePalette == null) { noPalette = true; imagePalette = Tools.createGrayPalette(); viewer.showStatus("\nNo attached palette found, default grey palette is used to display image"); } data = dataset.getData(); if (bitmask != null) { if (Tools.applyBitmask(data, bitmask, bitmaskOP)) { String opName = "Extract bits "; if (bitmaskOP==ViewProperties.BITMASK_OP.AND) opName = "Apply bitwise AND "; Border border = BorderFactory.createCompoundBorder( BorderFactory.createRaisedBevelBorder(), BorderFactory .createTitledBorder(BorderFactory .createLineBorder(Color.BLUE, 1), opName + bitmask, TitledBorder.RIGHT, TitledBorder.TOP, this.getFont(), Color.RED)); doAutoGainContrast = false; this.setBorder(border); } } int typeClass = dataset.getDatatype().getDatatypeClass(); if (typeClass == Datatype.CLASS_INTEGER || typeClass == Datatype.CLASS_CHAR) { data = dataset.convertFromUnsignedC(); isUnsignedConverted = true; doAutoGainContrast = doAutoGainContrast || (ViewProperties.isAutoContrast() && noPalette && isLocalFile); } else doAutoGainContrast = false; boolean isAutoContrastFailed = true; if (doAutoGainContrast) { isAutoContrastFailed = (!computeAutoGainImageData(gainBias,null)); } int w = dataset.getWidth(); int h = dataset.getHeight(); if (isAutoContrastFailed) { doAutoGainContrast = false; imageByteData = Tools.getBytes(data, dataRange, w, h, !dataset .isDefaultImageOrder(), dataset.getFillValue(), convertByteData, imageByteData); } else if (dataRange!= null && dataRange[0]==dataRange[1]) { Tools.findMinMax(data, dataRange, null); } image = createIndexedImage(imageByteData, imagePalette, w, h); } /** * @throws Exception * @throws OutOfMemoryError */ private void getTrueColorImage() throws Exception, OutOfMemoryError { isPlaneInterlace = (dataset.getInterlace() == ScalarDS.INTERLACE_PLANE); long[] selected = dataset.getSelectedDims(); long[] start = dataset.getStartDims(); int[] selectedIndex = dataset.getSelectedIndex(); long[] stride = dataset.getStride(); if (start.length > 2) { start[selectedIndex[2]] = 0; selected[selectedIndex[2]] = 3; stride[selectedIndex[2]] = 1; } // reload data dataset.clearData(); data = dataset.getData(); // converts raw data to image data imageByteData = Tools.getBytes(data, dataRange, dataset.getFillValue(), imageByteData); int w = dataset.getWidth(); int h = dataset.getHeight(); image = createTrueColorImage(imageByteData, isPlaneInterlace, w, h); } /** * Compute image data from autogain * * @return */ private boolean computeAutoGainImageData(double[] gb, double[] range) { boolean retValue = true; // data is unsigned short. Convert image byte data using auto-contrast // image algorithm boolean isUnsigned = dataset.isUnsigned(); if (gainBias == null) { // calculate auto_gain only once gainBias = new double[2]; Tools.autoContrastCompute(data, gainBias, isUnsigned); } if (gb == null) gb = gainBias; autoGainData = Tools.autoContrastApply(data, autoGainData, gb, range, isUnsigned); if (autoGainData != null) { if ((imageByteData == null) || (imageByteData.length != Array.getLength(data))) { imageByteData = new byte[Array.getLength(data)]; } retValue = (Tools.autoContrastConvertImageBuffer(autoGainData, imageByteData, true) >= 0); } else retValue = false; if (gainBias_current == null) gainBias_current = new double[2]; gainBias_current[0] = gb[0]; gainBias_current[1] = gb[1]; return retValue; } // implementing ImageObserver private void zoomIn() { if (zoomFactor >= 1) { zoomTo(zoomFactor + 1.0f); } else { zoomTo(zoomFactor + 0.125f); } } // implementing ImageObserver private void zoomOut() { if (zoomFactor > 1) { zoomTo(zoomFactor - 1.0f); } else { zoomTo(zoomFactor - 0.125f); } } // implementing ImageObserver private void zoomTo(float zf) { if (zf > 8) zf = 8; else if (zf < 0.125) zf = 0.125f; if (zoomFactor == zf) return; // no change in zooming zoomFactor = zf; Dimension imageSize = new Dimension( (int) (imageComponent.originalSize.width * zoomFactor), (int) (imageComponent.originalSize.height * zoomFactor)); this.invalidate(); imageComponent.invalidate(); imageComponent.setImageSize(imageSize); this.validate(); // updateUI(); if ((zoomFactor > 0.99) && (zoomFactor < 1.01)) { setTitle(frameTitle); } else { setTitle(frameTitle + " - " + 100 * zoomFactor + "%"); } } // implementing ImageObserver private void showColorTable() { if (imagePalette == null) { return; } String viewName = (String) HDFView.getListOfPaletteView().get(0); try { Class theClass = Class.forName(viewName); if ("ncsa.hdf.view.DefaultPaletteView".equals(viewName)) { Object[] initargs = { viewer, this }; PaletteView theView = (PaletteView) Tools.newInstance(theClass, initargs); } else { Object[] initargs = { this }; PaletteView theView = (PaletteView) Tools.newInstance(theClass, initargs); } } catch (Exception ex) { viewer.showStatus(ex.toString()); } } // implementing ImageObserver private void showHistogram() { Rectangle rec = imageComponent.selectedArea; if (isTrueColor) { toolkit.beep(); JOptionPane .showMessageDialog( this, "Unsupported operation: unable to draw histogram for true color image.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } if ((rec == null) || (rec.getWidth() <= 0) || (rec.getHeight() <= 0)) { toolkit.beep(); JOptionPane .showMessageDialog( this, "No data for histogram.\nUse Shift+Mouse_drag to select an image area.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } double chartData[][] = new double[1][256]; for (int i = 0; i < 256; i++) { chartData[0][i] = 0.0; } int w = dataset.getWidth(); int x0 = (int) (rec.x / zoomFactor); int y0 = (int) (rec.y / zoomFactor); int x = x0 + (int) (rec.width / zoomFactor); int y = y0 + (int) (rec.height / zoomFactor); int arrayIndex = 0; for (int i = y0; i < y; i++) { for (int j = x0; j < x; j++) { arrayIndex = (int) imageByteData[i * w + j]; if (arrayIndex < 0) { arrayIndex += 256; } chartData[0][arrayIndex] += 1.0; } } /* Use original data range */ double[] xRange = originalRange; if (xRange == null || xRange[0] == xRange[1]) { xRange = new double[2]; Tools.findMinMax(data, xRange, null); } // double[] xRange = {0, 255}; Chart cv = new Chart((JFrame) viewer, "Histogram - " + dataset.getPath() + dataset.getName() + " - by pixel index", Chart.HISTOGRAM, chartData, xRange, null); cv.setVisible(true); } /** * Selects all whole image. * * @throws Exception */ private void selectAll() throws Exception { imageComponent.selectAll(); } // implementing ImageObserver private void flip(int direction) { ImageFilter filter = new FlipFilter(direction); if (filter == null) { return; } if (applyImageFilter(filter)) { // taggle flip flag if (direction == FLIP_HORIZONTAL) { isHorizontalFlipped = !isHorizontalFlipped; } else { isVerticalFlipped = !isVerticalFlipped; } } } // implementing ImageObserver private void rotate(int direction) { if ( !(direction == ROTATE_CW_90 || direction == ROTATE_CCW_90)) return; Rotate90Filter filter = new Rotate90Filter(direction); applyImageFilter(filter); if (direction == ROTATE_CW_90) { rotateCount++; if (rotateCount == 4) { rotateCount = 0; } } else { rotateCount--; if (rotateCount == -4) { rotateCount = 0; } } } // implementing ImageObserver private void contour(int level) { ImageFilter filter = new ContourFilter(level); if (filter == null) { return; } applyImageFilter(filter); } // implementing ImageObserver private void brightness(int blevel, int clevel) { ImageFilter filter = new BrightnessFilter(blevel, clevel); if (filter == null) { return; } applyImageFilter(filter); } /** Apply contrast/brightness to unsigned short integer */ private void applyAutoGain(double[] gb, double[] range) { if (computeAutoGainImageData(gb, range)) { int w = dataset.getWidth(); int h = dataset.getHeight(); image = createIndexedImage(imageByteData, imagePalette, w, h); imageComponent.setImage(image); zoomTo(zoomFactor); } } // implementing ImageObserver private void setValueVisible(boolean b) { valueField.setVisible(b); validate(); // updateUI(); //bug !!! on Windows. gives NullPointerException at // javax.swing.plaf.basic.BasicInternalFrameUI$BorderListener.mousePressed(BasicInternalFrameUI.java:693) } /** * This method returns true if the specified image has transparent pixels. * * @param image * the image to be check if has alpha. * @return true if the image has alpha setting. */ private boolean hasAlpha(Image image) { if (image == null) { return false; } // If buffered image, the color model is readily available if (image instanceof BufferedImage) { BufferedImage bimage = (BufferedImage) image; return bimage.getColorModel().hasAlpha(); } // Use a pixel grabber to retrieve the image's color model; // grabbing a single pixel is usually sufficient PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false); try { pg.grabPixels(); } catch (InterruptedException e) { } ColorModel cm = pg.getColorModel(); return cm.hasAlpha(); } /** * This method returns a buffered image with the contents of an image. * * @param image * the plain image object. * @return buffered image for the given image. */ private BufferedImage toBufferedImage(Image image) { if (image == null) { return null; } if (image instanceof BufferedImage) { return (BufferedImage) image; } // !!!!!!!!!!!!!!!!!! NOTICE !!!!!!!!!!!!!!!!!!!!! // the following way of creating a buffered image is using // Component.createImage(). This method can be used only if the // component is visible on the screen. Also, this method returns // buffered images that do not support transparent pixels. // The buffered image created by this way works for package // com.sun.image.codec.jpeg.* // It does not work well with JavaTM Advanced Imaging // com.sun.media.jai.codec.*; // if the screen setting is less than 32-bit color int w = image.getWidth(null); int h = image.getHeight(null); BufferedImage bimage = (BufferedImage) createImage(w, h); Graphics g = bimage.createGraphics(); g.drawImage(image, 0, 0, null); g.dispose(); return bimage; } /** * Save the image to an image file. * * @param type * the image type. * @throws Exception */ private void saveImageAs(String type) throws Exception { if (image == null) { return; } final JFileChooser fchooser = new JFileChooser(dataset.getFile()); if (type.equals(Tools.FILE_TYPE_JPEG)) { fchooser.setFileFilter(DefaultFileFilter.getFileFilterJPEG()); // } else if (type.equals(Tools.FILE_TYPE_TIFF)) { // fchooser.setFileFilter(DefaultFileFilter.getFileFilterTIFF()); } else if (type.equals(Tools.FILE_TYPE_PNG)) { fchooser.setFileFilter(DefaultFileFilter.getFileFilterPNG()); } else if (type.equals(Tools.FILE_TYPE_GIF)) { fchooser.setFileFilter(DefaultFileFilter.getFileFilterGIF()); } else if (type.equals(Tools.FILE_TYPE_BMP)) { fchooser.setFileFilter(DefaultFileFilter.getFileFilterBMP()); } // fchooser.changeToParentDirectory(); fchooser.setDialogTitle("Save Current Image To " + type + " File --- " + dataset.getName()); File choosedFile = new File(dataset.getName() + "." + type.toLowerCase()); fchooser.setSelectedFile(choosedFile); int returnVal = fchooser.showSaveDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); if (choosedFile.exists()) { int newFileFlag = JOptionPane.showConfirmDialog(this, "File exists. Do you want to replace it ?", this.getTitle(), JOptionPane.YES_NO_OPTION); if (newFileFlag == JOptionPane.NO_OPTION) { return; } } BufferedImage bi = null; try { bi = toBufferedImage(image); } catch (OutOfMemoryError err) { toolkit.beep(); JOptionPane.showMessageDialog(this, err.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return; } Tools.saveImageAs(bi, choosedFile, type); bi = null; viewer.showStatus("Current image saved to: " + fname); try { RandomAccessFile rf = new RandomAccessFile(choosedFile, "r"); long size = rf.length(); rf.close(); viewer.showStatus("File size (bytes): " + size); } catch (Exception ex) { } } public void actionPerformed(ActionEvent e) { try { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Close")) { dispose(); // terminate the application ((Vector) rotateRelatedItems).setSize(0); } else if (cmd.startsWith("Save image as ")) { String filetype = null; if (cmd.equals("Save image as jpeg")) { filetype = Tools.FILE_TYPE_JPEG; } else if (cmd.equals("Save image as tiff")) { filetype = Tools.FILE_TYPE_TIFF; } else if (cmd.equals("Save image as png")) { filetype = Tools.FILE_TYPE_PNG; } else if (cmd.equals("Save image as gif")) { filetype = Tools.FILE_TYPE_GIF; } else if (cmd.equals("Save image as bmp")) { filetype = Tools.FILE_TYPE_BMP; } try { saveImageAs(filetype); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.equals("Write selection to image")) { if ((getSelectedArea().width <= 0) || (getSelectedArea().height <= 0)) { JOptionPane .showMessageDialog( this, "No data to write.\nUse Shift+Mouse_drag to select an image area.", "HDFView", JOptionPane.INFORMATION_MESSAGE); return; } TreeView treeView = viewer.getTreeView(); TreeNode node = treeView.findTreeNode(dataset); Group pGroup = (Group) ((DefaultMutableTreeNode) node .getParent()).getUserObject(); TreeNode root = dataset.getFileFormat().getRootNode(); if (root == null) { return; } Vector list = new Vector(dataset.getFileFormat() .getNumberOfMembers() + 5); DefaultMutableTreeNode theNode = null; Enumeration local_enum = ((DefaultMutableTreeNode) root) .depthFirstEnumeration(); while (local_enum.hasMoreElements()) { theNode = (DefaultMutableTreeNode) local_enum.nextElement(); list.add(theNode.getUserObject()); } NewDatasetDialog dialog = new NewDatasetDialog((JFrame) viewer, pGroup, list, this); dialog.setVisible(true); HObject obj = (HObject) dialog.getObject(); if (obj != null) { Group pgroup = dialog.getParentGroup(); try { treeView.addObject(obj, pgroup); } catch (Exception ex) { } } list.setSize(0); } else if (cmd.equals("Zoom in")) { zoomIn(); } else if (cmd.equals("Zoom out")) { zoomOut(); } else if (cmd.equals("Edit palette")) { showColorTable(); } else if (cmd.equals("Import palette")) { JFileChooser fchooser = new JFileChooser(ViewProperties .getWorkDir()); int returnVal = fchooser.showOpenDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null || choosedFile.isDirectory()) { return; } Vector palList = ViewProperties.getPaletteList(); String palPath = choosedFile.getAbsolutePath(); if(!palList.contains(palList)) palList.addElement(palPath); } else if (cmd.equals("Export palette")) { if (imagePalette == null) return; String wd =ViewProperties.getWorkDir()+File.separator; JFileChooser fchooser = new JFileChooser(wd); FileNameExtensionFilter filter = new FileNameExtensionFilter("Color lookup table", "lut"); File pfile = Tools.checkNewFile(wd, ".lut"); fchooser.setSelectedFile(pfile); fchooser.setFileFilter(filter); int returnVal = fchooser.showOpenDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null || choosedFile.isDirectory()) { return; } if (choosedFile.exists()) { int newFileFlag = JOptionPane.showConfirmDialog(this, "File exists. Do you want to replace it ?", this.getTitle(), JOptionPane.YES_NO_OPTION); if (newFileFlag == JOptionPane.NO_OPTION) { return; } } PrintWriter out = null; try { out = new PrintWriter(new BufferedWriter(new FileWriter(choosedFile))); } catch (Exception ex) { out = null; } if (out == null) return; int cols = 3; int rows = 256; int rgb = 0; for (int i=0; i 0) { String statistics = "Min = " + minmax[0] + "\nMax = " + minmax[1] + "\nMean = " + stat[0] + "\nStandard deviation = " + stat[1]; JOptionPane.showMessageDialog(this, statistics, "Statistics", JOptionPane.INFORMATION_MESSAGE); } } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog((JFrame) viewer, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.equals("Select all data")) { try { selectAll(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog((JFrame) viewer, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } } finally { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } public void dispose() { // reload the data when it is displayed next time // because the display type (table or image) may be // different. if (!dataset.isImage()) { dataset.clearData(); } data = null; image = null; imageByteData = null; imageComponent = null; autoGainData = null; ((Vector) rotateRelatedItems).setSize(0); System.runFinalization(); System.gc(); viewer.removeDataView(this); super.dispose(); } // Implementing DataView. public HObject getDataObject() { return dataset; } public byte[] getImageByteData() { return imageByteData; } /** * Returns the selected data values. * * @return the selected data object. */ public Object getSelectedData() { Object selectedData = null; int cols = imageComponent.originalSelectedArea.width; int rows = imageComponent.originalSelectedArea.height; if ((cols <= 0) || (rows <= 0)) { return null; // no data is selected } int size = cols * rows; if (isTrueColor) { size *= 3; } if (NT == 'B') { selectedData = new byte[size]; } else if (NT == 'S') { selectedData = new short[size]; } else if (NT == 'I') { selectedData = new int[size]; } else if (NT == 'J') { selectedData = new long[size]; } else if (NT == 'F') { selectedData = new float[size]; } else if (NT == 'D') { selectedData = new double[size]; } else { return null; } int r0 = imageComponent.originalSelectedArea.y; int c0 = imageComponent.originalSelectedArea.x; int w = imageComponent.originalSize.width; int h = imageComponent.originalSize.height; // transfer location to the original coordinator if (isHorizontalFlipped) { c0 = w - 1 - c0 - cols; } if (isVerticalFlipped) { r0 = h - 1 - r0 - rows; } int idx_src = 0, idx_dst = 0; if (isTrueColor) { int imageSize = w * h; if (isPlaneInterlace) { for (int j = 0; j < 3; j++) { int plane = imageSize * j; for (int i = 0; i < rows; i++) { idx_src = plane + (r0 + i) * w + c0; System.arraycopy(data, idx_src, selectedData, idx_dst, cols); idx_dst += cols; } } } else { int numberOfDataPoints = cols * 3; for (int i = 0; i < rows; i++) { idx_src = (r0 + i) * w + c0; System.arraycopy(data, idx_src * 3, selectedData, idx_dst, numberOfDataPoints); idx_dst += numberOfDataPoints; } } } else // indexed image { for (int i = 0; i < rows; i++) { idx_src = (r0 + i) * w + c0; System.arraycopy(data, idx_src, selectedData, idx_dst, cols); idx_dst += cols; } } return selectedData; } /** * returns the selected area of the image * * @return the rectangle of the selected image area. */ public Rectangle getSelectedArea() { return imageComponent.originalSelectedArea; } /** @return true if the image is a truecolor image. */ public boolean isTrueColor() { return isTrueColor; } /** @return true if the image interlace is plance interlace. */ public boolean isPlaneInterlace() { return isPlaneInterlace; } public void setImage(Image img) { image = img; imageComponent.setImage(img); setImageDirection(); } private void setImageDirection() { boolean isHF = isHorizontalFlipped; boolean isVF = isVerticalFlipped; int rc = rotateCount; if (isHF || isVF || rc!=0) { isHorizontalFlipped = false; isVerticalFlipped = false; rotateCount = 0; if (isHF) flip(FLIP_HORIZONTAL); if (isVF) flip(FLIP_VERTICAL); while (rc > 0) { rotate(ROTATE_CW_90); rc--; } while (rc < 0) { rotate(ROTATE_CCW_90); rc++; } } else { if (origin == 1) flip(FLIP_VERTICAL); else if (origin == 2) flip(FLIP_HORIZONTAL); if (origin == 3) { rotate(ROTATE_CW_90); rotate(ROTATE_CW_90); } } zoomTo(zoomFactor); } public byte[][] getPalette() { return imagePalette; } public void setPalette(byte[][] pal) { imagePalette = pal; paletteComponent.updatePalette(pal); } private void gotoPage(long idx) { if (dataset.getRank() < 3 || idx == (curFrame-indexBase) ) { return; } long[] start = dataset.getStartDims(); int[] selectedIndex = dataset.getSelectedIndex(); long[] dims = dataset.getDims(); if ((idx < 0) || (idx >= dims[selectedIndex[2]])) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Frame number must be between "+indexBase+" and " + (dims[selectedIndex[2]] - 1+indexBase), getTitle(), JOptionPane.ERROR_MESSAGE); return; } setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); start[selectedIndex[2]] = idx; curFrame = idx+indexBase; dataset.clearData(); image = null; gainBias = null; imageComponent.setImage(getImage()); frameField.setText(String.valueOf(curFrame)); isHorizontalFlipped = false; isVerticalFlipped = false; rotateCount = 0; if (origin == 1) flip(FLIP_VERTICAL); else if (origin == 2) flip(FLIP_HORIZONTAL); if (origin == 3) { rotate(ROTATE_CW_90); rotate(ROTATE_CW_90); } setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); updateUI(); } /** * Creates a RGB indexed image of 256 colors. * * @param imageData * the byte array of the image data. * @param palette * the color lookup table. * @param w * the width of the image. * @param h * the height of the image. * @return the image. */ public Image createIndexedImage(byte[] imageData, byte[][] palette, int w, int h) { Image theImage = null; IndexColorModel colorModel = new IndexColorModel(8, // bits - the number // of bits each // pixel occupies 256, // size - the size of the color component arrays palette[0], // r - the array of red color components palette[1], // g - the array of green color components palette[2]); // b - the array of blue color components if (memoryImageSource == null) { memoryImageSource = new MemoryImageSource(w, h, colorModel, imageData, 0, w); } else { memoryImageSource.newPixels(imageData, colorModel, 0, w); } theImage = Toolkit.getDefaultToolkit().createImage(memoryImageSource); return theImage; } /** * Creates a true color image. *

    * DirectColorModel is used to construct the image from raw data. The * DirectColorModel model is similar to an X11 TrueColor visual, which has * the following parameters:
    * *

         * Number of bits:        32
         *             Red mask:              0x00ff0000
         *             Green mask:            0x0000ff00
         *             Blue mask:             0x000000ff
         *             Alpha mask:            0xff000000
         *             Color space:           sRGB
         *             isAlphaPremultiplied:  False
         *             Transparency:          Transparency.TRANSLUCENT
         *             transferType:          DataBuffer.TYPE_INT
         * 
    *

    * The data may be arranged in one of two ways: by pixel or by plane. In * both cases, the dataset will have a dataspace with three dimensions, * height, width, and components. *

    * For HDF4, the interlace modes specify orders for the dimensions as: * *

         * INTERLACE_PIXEL = [width][height][pixel components]
         *            INTERLACE_PLANE = [pixel components][width][height]
         * 
    *

    * For HDF5, the interlace modes specify orders for the dimensions as: * *

         * INTERLACE_PIXEL = [height][width][pixel components]
         *            INTERLACE_PLANE = [pixel components][height][width]
         * 
    *

    * * @param imageData * the byte array of the image data. * @param planeInterlace * flag if the image is plane intelace. * @param w * the width of the image. * @param h * the height of the image. * @return the image. */ public Image createTrueColorImage(byte[] imageData, boolean planeInterlace, int w, int h) { Image theImage = null; int imgSize = w * h; int packedImageData[] = new int[imgSize]; int pixel = 0, idx = 0, r = 0, g = 0, b = 0; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { pixel = r = g = b = 0; if (planeInterlace) { r = (int) imageData[idx]; g = (int) imageData[imgSize + idx]; b = (int) imageData[imgSize * 2 + idx]; } else { r = (int) imageData[idx * 3]; g = (int) imageData[idx * 3 + 1]; b = (int) imageData[idx * 3 + 2]; } r = (r << 16) & 0x00ff0000; g = (g << 8) & 0x0000ff00; b = b & 0x000000ff; // bits packed into alpha (1), red (r), green (g) and blue (b) // as 11111111rrrrrrrrggggggggbbbbbbbb pixel = 0xff000000 | r | g | b; packedImageData[idx++] = pixel; } // for (int j=0; j 0) && (selectedArea.height > 0)) { g.setColor(Color.red); g.drawRect(selectedArea.x, selectedArea.y, selectedArea.width, selectedArea.height); } } /** * Create an image using multiple step bilinear, see details at * http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html * * @param img the original image to be scaled * @param targetWidth the desired width of the scaled instance * @param targetHeight the desired height of the scaled instance, * @return a scaled version of the original */ private Image multiBiliner(Image img, int targetWidth, int targetHeight, boolean highquality) { Image ret = img; int w = img.getWidth(null)/2; int h = img.getHeight(null)/2; // only do multiple step bilinear for down scale more than two times if (!highquality || w <=targetWidth || h <=targetHeight) return ret; int type = BufferedImage.TYPE_INT_RGB; if (image instanceof BufferedImage) { BufferedImage tmp = (BufferedImage)image; if (tmp.getColorModel().hasAlpha()) type = BufferedImage.TYPE_INT_ARGB; } else { PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false); ColorModel cm = pg.getColorModel(); if (cm!=null && cm.hasAlpha()) type = BufferedImage.TYPE_INT_ARGB; } do { BufferedImage tmp = new BufferedImage(w, h, type); Graphics2D g2 = tmp.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2.drawImage(ret, 0, 0, w, h, null); g2.dispose(); ret = tmp; w /= 2; if (w < targetWidth) { w = targetWidth; } h /= 2; if (h < targetHeight) { h = targetHeight; } } while (w != targetWidth || h != targetHeight); return ret; } public void mousePressed(MouseEvent e) { startPosition = e.getPoint(); selectedArea.setBounds(startPosition.x, startPosition.y, 0, 0); scrollDim = imageScroller.getSize(); hbar = imageScroller.getHorizontalScrollBar(); vbar = imageScroller.getVerticalScrollBar(); if ((e.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) == InputEvent.SHIFT_DOWN_MASK) { setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } } public void mouseClicked(MouseEvent e) { startPosition = e.getPoint(); selectedArea.setBounds(startPosition.x, startPosition.y, 0, 0); if (hbar.isVisible()) { hbar.setValue(startPosition.x - scrollDim.width / 2); } if (vbar.isVisible()) { vbar.setValue(startPosition.y - scrollDim.height / 2); } repaint(); } public void mouseDragged(MouseEvent e) { // don't update too often. try { Thread.sleep(20); } catch (Exception ex) { } currentPosition = e.getPoint(); if ((e.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) == InputEvent.SHIFT_DOWN_MASK) { int x0 = Math.max(0, Math.min(startPosition.x, currentPosition.x)); int y0 = Math.max(0, Math.min(startPosition.y, currentPosition.y)); int x1 = Math.min(imageSize.width, Math.max(startPosition.x, currentPosition.x)); int y1 = Math.min(imageSize.height, Math.max(startPosition.y, currentPosition.y)); int w = x1 - x0; int h = y1 - y0; selectedArea.setBounds(x0, y0, w, h); double ratio = 1.0 / zoomFactor; originalSelectedArea.setBounds((int) (x0 * ratio), (int) (y0 * ratio), (int) (w * ratio), (int) (h * ratio)); repaint(); } else { if (hbar.isVisible()) { int dx = startPosition.x - currentPosition.x; hbar.setValue(hbar.getValue() + dx); } if (vbar.isVisible()) { int dy = startPosition.y - currentPosition.y; vbar.setValue(vbar.getValue() + dy); } } } public void mouseReleased(MouseEvent e) { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseMoved(MouseEvent e) { yMousePosition = e.getY(); showPixelValue(e.getX(), yMousePosition); } public void mouseWheelMoved(MouseWheelEvent e) { JScrollBar jb = imageScroller.getVerticalScrollBar(); int us = e.getUnitsToScroll(); int wr = e.getWheelRotation(); int n = us * jb.getUnitIncrement(); int y = jb.getValue(); if (((y <= 0) && (wr < 0)) || (y + jb.getVisibleAmount() * wr >= zoomFactor * originalSize.height)) { return; } yMousePosition += n; jb.setValue(jb.getValue() + n); showPixelValue(e.getX(), yMousePosition); } private void showPixelValue(int x, int y) { if (!valueField.isVisible() || rotateCount != 0) { return; } if (data == null) { return; } x = (int) (x / zoomFactor); int w = originalSize.width; if ((x < 0) || (x >= w)) { return; // out of image bound } y = (int) (y / zoomFactor); int h = originalSize.height; if ((y < 0) || (y >= h)) { return; // out of image bound } // transfer location to the original coordinator if (isHorizontalFlipped) { x = w - 1 - x; } if (isVerticalFlipped) { y = h - 1 - y; } strBuff.setLength(0); // reset the string buffer strBuff.append("x="); strBuff.append(x+indexBase); strBuff.append(", y="); strBuff.append(y+indexBase); strBuff.append(", value="); if (isTrueColor) { strBuff.append("("); int i0, i1, i2; String r, g, b; if (isPlaneInterlace) { i0 = y * w + x; // index for the first plane i1 = i0 + w * h; // index for the second plane i2 = i0 + 2 * w * h; // index for the third plane } else { i0 = 3 * (y * w + x); // index for the first pixel i1 = i0 + 1; // index for the second pixel i2 = i0 + 2; // index for the third pixel } if (isUnsigned && !isUnsignedConverted) { r = String.valueOf(convertUnsignedPoint(i0)); g = String.valueOf(convertUnsignedPoint(i1)); b = String.valueOf(convertUnsignedPoint(i2)); } else { r = String.valueOf(Array.get(data, i0)); g = String.valueOf(Array.get(data, i1)); b = String.valueOf(Array.get(data, i2)); } strBuff.append(r + ", " + g + ", " + b); strBuff.append(")"); } // if (isTrueColor) else { int idx = y * w + x; if (!dataset.isDefaultImageOrder()) idx = x*h+y; if (isUnsigned && !isUnsignedConverted) { strBuff.append(convertUnsignedPoint(idx)); } else { strBuff.append(Array.get(data, idx)); } } valueField.setText(strBuff.toString()); } // private void showPixelValue private void selectAll() { selectedArea.setBounds(0, 0, imageSize.width, imageSize.height); originalSelectedArea.setBounds(0, 0, originalSize.width, originalSize.height); repaint(); } private long convertUnsignedPoint(int idx) { long l = 0; if (NT == 'B') { byte b = Array.getByte(data, idx); if (b < 0) { l = b + 256; } else { l = b; } } else if (NT == 'S') { short s = Array.getShort(data, idx); if (s < 0) { l = s + 65536; } else { l = s; } } else if (NT == 'I') { int i = Array.getInt(data, idx); if (i < 0) { l = i + 4294967296L; } else { l = i; } } return l; } private void setImageSize(Dimension size) { imageSize = size; setPreferredSize(imageSize); int w = selectedArea.width; int h = selectedArea.height; if ((w > 0) && (h > 0)) { // use fixed selected area to reduce the rounding error selectedArea.setBounds( (int) (originalSelectedArea.x * zoomFactor), (int) (originalSelectedArea.y * zoomFactor), (int) (originalSelectedArea.width * zoomFactor), (int) (originalSelectedArea.height * zoomFactor)); } repaint(); } private void setImage(Image img) { image = img; imageSize = new Dimension(image.getWidth(this), image .getHeight(this)); originalSize = imageSize; selectedArea.setSize(0, 0); setPreferredSize(imageSize); setImageSize(new Dimension((int) (originalSize.width * zoomFactor), (int) (originalSize.height * zoomFactor))); repaint(); } } // private class ImageComponent extends JComponent /** * FlipFileter creates image filter to flip image horizontally or * vertically. */ private class FlipFilter extends ImageFilter { /** flip direction */ private int direction; /** pixel value */ private int raster[] = null; /** width & height */ private int imageWidth, imageHeight; /** * Constructs an image filter to flip horizontally or vertically. *

    * * @param d * the flip direction. */ private FlipFilter(int d) { if (d < FLIP_HORIZONTAL) { d = FLIP_HORIZONTAL; } else if (d > FLIP_VERTICAL) { d = FLIP_VERTICAL; } direction = d; } public void setDimensions(int w, int h) { imageWidth = w; imageHeight = h; // specify the raster if (raster == null) { raster = new int[imageWidth * imageHeight]; } consumer.setDimensions(imageWidth, imageHeight); } public void setPixels(int x, int y, int w, int h, ColorModel model, byte pixels[], int off, int scansize) { int srcoff = off; int dstoff = y * imageWidth + x; for (int yc = 0; yc < h; yc++) { for (int xc = 0; xc < w; xc++) { raster[dstoff++] = model.getRGB(pixels[srcoff++] & 0xff); } srcoff += (scansize - w); dstoff += (imageWidth - w); } } public void setPixels(int x, int y, int w, int h, ColorModel model, int pixels[], int off, int scansize) { int srcoff = off; int dstoff = y * imageWidth + x; for (int yc = 0; yc < h; yc++) { for (int xc = 0; xc < w; xc++) { raster[dstoff++] = model.getRGB(pixels[srcoff++]); } srcoff += (scansize - w); dstoff += (imageWidth - w); } } public void imageComplete(int status) { if ((status == IMAGEERROR) || (status == IMAGEABORTED)) { consumer.imageComplete(status); return; } int pixels[] = new int[imageWidth]; for (int y = 0; y < imageHeight; y++) { if (direction == FLIP_VERTICAL) { // grab pixel values of the target line ... int pos = (imageHeight - 1 - y) * imageWidth; for (int kk = 0; kk < imageWidth; kk++) { pixels[kk] = raster[pos + kk]; } } else { int pos = y * imageWidth; for (int kk = 0; kk < imageWidth; kk++) { pixels[kk] = raster[pos + kk]; } // swap the pixel values of the target line int hw = imageWidth / 2; for (int kk = 0; kk < hw; kk++) { int tmp = pixels[kk]; pixels[kk] = pixels[imageWidth - kk - 1]; pixels[imageWidth - kk - 1] = tmp; } } // consumer it .... consumer.setPixels(0, y, imageWidth, 1, ColorModel .getRGBdefault(), pixels, 0, imageWidth); } // for (int y = 0; y < imageHeight; y++) // complete ? consumer.imageComplete(status); } } // private class FlipFilter extends ImageFilter /** * Apply general brightness/contrast algorithm. For details, visit * http://www.developerfusion.co.uk/ * * The general algorithm is represented by: If Brighten = True New_Value = * Old_Value + Adjustment_Amount Else New_Value = Old_Value - * Adjustment_Amount If New_Value < Value_Minimum New_Value = Value_Minimum * If New_Value > Value_Maximum New_Value = Value_Maximum * * Contrast is a complicated operation. It is hard to formulate a * "general algorithm". Here is the closest representation * (Contrast_Value=[0, 2]): * * //Converts to a percent //[0, 1] New_Value = Old_Value / 255 * * //Centers on 0 instead of .5 //[-.5, .5] New_Value -= 0.5 * * //Adjusts by Contrast_Value //[-127.5, 127.5], usually [-1, 1] New_Value * *= Contrast_Value * * //Re-add .5 (un-center over 0) //[-127, 128] New_Value += 0.5 * * //Re-multiply by 255 (un-convert to percent) //[-32385, 32640], usually * [0, 255] New_Value *= 255 //Clamp [0, 255] If(New_Value > 255) New_Value * = 255 If(New_Value < 0) New_Value = 0 */ private class BrightnessFilter extends RGBImageFilter { // brightness level = [-200, 200] int brightLevel = 0; // contrast level [0, 4] float contrastLevel = 0; public BrightnessFilter(int blevel, int clevel) { if (blevel < -100) { brightLevel = -100; } else if (blevel > 100) { brightLevel = 100; } else { brightLevel = blevel; } brightLevel *= 2; if (clevel < -100) { clevel = -100; } else if (clevel > 100) { clevel = 100; } if (clevel > 0) { contrastLevel = (clevel / 100f + 1) * 2; } else if (clevel < 0) { contrastLevel = (clevel / 100f + 1) / 2; } else { contrastLevel = 0; } canFilterIndexColorModel = true; } public int filterRGB(int x, int y, int rgb) { // adjust brightness first, then adjust contrast // it gives more color depth if (brightLevel != 0) { int r = (rgb & 0x00ff0000) >> 16; int g = (rgb & 0x0000ff00) >> 8; int b = (rgb & 0x000000ff); r += brightLevel; g += brightLevel; b += brightLevel; if (r < 0) { r = 0; } if (r > 255) { r = 255; } if (g < 0) { g = 0; } if (g > 255) { g = 255; } if (b < 0) { b = 0; } if (b > 255) { b = 255; } r = (r << 16) & 0x00ff0000; g = (g << 8) & 0x0000ff00; b = b & 0x000000ff; rgb = ((rgb & 0xff000000) | r | g | b); } if (contrastLevel > 0.000001) { // do not compare float using !=0 or // ==0 int r = (rgb & 0x00ff0000) >> 16; int g = (rgb & 0x0000ff00) >> 8; int b = (rgb & 0x000000ff); float f = (float) r / 255f; f -= 0.5; f *= contrastLevel; f += 0.5; f *= 255f; if (f < 0) { f = 0; } if (f > 255) { f = 255; } r = (int) f; f = (float) g / 255f; f -= 0.5; f *= contrastLevel; f += 0.5; f *= 255f; if (f < 0) { f = 0; } if (f > 255) { f = 255; } g = (int) f; f = (float) b / 255f; f -= 0.5; f *= contrastLevel; f += 0.5; f *= 255f; if (f < 0) { f = 0; } if (f > 255) { f = 255; } b = (int) f; r = (r << 16) & 0x00ff0000; g = (g << 8) & 0x0000ff00; b = b & 0x000000ff; rgb = ((rgb & 0xff000000) | r | g | b); } return rgb; } } /** * Makes an image filter for contour. */ private class ContourFilter extends ImageFilter { // default color model private ColorModel defaultRGB; // contour level int level; // the table of the contour levels int levels[]; // colors for drawable contour line int[] levelColors; // default RGB // pixel value private int raster[] = null; // width & height private int imageWidth, imageHeight; /** * Create an contour filter for a given level contouring. * * @param theLevel * the contour level. */ private ContourFilter(int theLevel) { defaultRGB = ColorModel.getRGBdefault(); levelColors = new int[9]; if (theLevel < 1) { theLevel = 1; } else if (theLevel > 9) { theLevel = 9; } level = theLevel; levels = new int[level]; levelColors[0] = Color.white.getRGB(); levelColors[1] = Color.red.getRGB(); levelColors[2] = Color.yellow.getRGB(); levelColors[3] = Color.blue.getRGB(); levelColors[4] = Color.orange.getRGB(); levelColors[5] = Color.green.getRGB(); levelColors[6] = Color.cyan.getRGB(); levelColors[7] = Color.pink.getRGB(); levelColors[8] = Color.gray.getRGB(); int dx = 255 / level; for (int i = 0; i < level; i++) { levels[i] = (i + 1) * dx; } } public void setDimensions(int width, int height) { this.imageWidth = width; this.imageHeight = height; // specify the raster if (raster == null) { raster = new int[imageWidth * imageHeight]; } consumer.setDimensions(width, height); } public void setPixels(int x, int y, int w, int h, ColorModel model, byte pixels[], int off, int scansize) { int rgb = 0; int srcoff = off; int dstoff = y * imageWidth + x; for (int yc = 0; yc < h; yc++) { for (int xc = 0; xc < w; xc++) { rgb = model.getRGB(pixels[srcoff++] & 0xff); raster[dstoff++] = (((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff)) / 3; } srcoff += (scansize - w); dstoff += (imageWidth - w); } } public void setPixels(int x, int y, int w, int h, ColorModel model, int pixels[], int off, int scansize) { int rgb = 0; int srcoff = off; int dstoff = y * imageWidth + x; for (int yc = 0; yc < h; yc++) { for (int xc = 0; xc < w; xc++) { rgb = model.getRGB(pixels[srcoff++] & 0xff); raster[dstoff++] = (((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff)) / 3; } srcoff += (scansize - w); dstoff += (imageWidth - w); } } public void imageComplete(int status) { if ((status == IMAGEERROR) || (status == IMAGEABORTED)) { consumer.imageComplete(status); return; } int pixels[] = new int[imageWidth * imageHeight]; for (int z = 0; z < levels.length; z++) { int currentLevel = levels[z]; int color = levelColors[z]; setContourLine(raster, pixels, currentLevel, color, imageWidth, imageHeight); } int line[] = new int[imageWidth]; for (int y = 0; y < imageHeight; y++) { for (int x = 0; x < imageWidth; x++) { line[x] = pixels[y * imageWidth + x]; } consumer.setPixels(0, y, imageWidth, 1, defaultRGB, line, 0, imageWidth); } // for (int y = 0; y < imageHeight; y++) { // complete ? consumer.imageComplete(status); } /** * draw a contour line based on the current parameter---level, color * * @param raster * the data of the raster image. * @param pixels * the pixel value of the image. * @param level * the contour level. * @param color * the color of the contour line. * @param w * the width of the image. * @param h * the height of the image. */ private void setContourLine(int[] raster, int[] pixels, int level, int color, int w, int h) { int p = 0; // entrance point int q = p + (w * h - 1); // bottom right point int u = 0 + (w - 1); // top right point // first round while (true) { while (p < u) { int rgb = raster[p]; if (rgb < level) { while ((raster[p] < level) && (p < u)) { p++; } if (raster[p] >= level) { pixels[p] = color; } } else if (rgb == level) { while ((raster[p] == level) && (p < u)) { p++; } if ((raster[p] < level) || (raster[p] > level)) { pixels[p] = color; } } else { while ((raster[p] > level) && (p < u)) { p++; } if ((raster[p] <= level)) { pixels[p] = color; } } } if (u == q) { break; } else { u += w; p++; } } } } // private class ContourFilter extends ImageFilter private class Rotate90Filter extends ImageFilter { private ColorModel defaultRGB = ColorModel.getRGBdefault(); private double coord[] = new double[2]; private int raster[]; private int xoffset, yoffset; private int srcW, srcH; private int dstW, dstH; private int direction; public Rotate90Filter(int dir) { direction = dir; } public void transform(double x, double y, double[] retcoord) { if (direction == ROTATE_CW_90) { retcoord[0] = -y; retcoord[1] = x; } else { retcoord[0] = y; retcoord[1] = -x; } } public void itransform(double x, double y, double[] retcoord) { if (direction == ROTATE_CCW_90) { retcoord[0] = -y; retcoord[1] = x; } else { retcoord[0] = y; retcoord[1] = -x; } } public void transformBBox(Rectangle rect) { double minx = Double.POSITIVE_INFINITY; double miny = Double.POSITIVE_INFINITY; double maxx = Double.NEGATIVE_INFINITY; double maxy = Double.NEGATIVE_INFINITY; for (int y = 0; y <= 1; y++) { for (int x = 0; x <= 1; x++) { transform(rect.x + x * rect.width, rect.y + y * rect.height, coord); minx = Math.min(minx, coord[0]); miny = Math.min(miny, coord[1]); maxx = Math.max(maxx, coord[0]); maxy = Math.max(maxy, coord[1]); } } rect.x = (int) Math.floor(minx); rect.y = (int) Math.floor(miny); rect.width = (int) Math.ceil(maxx) - rect.x; rect.height = (int) Math.ceil(maxy) - rect.y; } public void setDimensions(int width, int height) { Rectangle rect = new Rectangle(0, 0, width, height); transformBBox(rect); xoffset = -rect.x; yoffset = -rect.y; srcW = width; srcH = height; dstW = rect.width; dstH = rect.height; raster = new int[srcW * srcH]; consumer.setDimensions(dstW, dstH); } public void setProperties(Hashtable props) { props = (Hashtable) props.clone(); Object o = props.get("filters"); if (o == null) { props.put("filters", toString()); } else if (o instanceof String) { props.put("filters", ((String) o) + toString()); } consumer.setProperties(props); } public void setColorModel(ColorModel model) { consumer.setColorModel(defaultRGB); } public void setHints(int hintflags) { consumer.setHints(TOPDOWNLEFTRIGHT | COMPLETESCANLINES | SINGLEPASS | (hintflags & SINGLEFRAME)); } public void setPixels(int x, int y, int w, int h, ColorModel model, byte pixels[], int off, int scansize) { int srcoff = off; int dstoff = y * srcW + x; for (int yc = 0; yc < h; yc++) { for (int xc = 0; xc < w; xc++) { raster[dstoff++] = model.getRGB(pixels[srcoff++] & 0xff); } srcoff += (scansize - w); dstoff += (srcW - w); } } public void setPixels(int x, int y, int w, int h, ColorModel model, int pixels[], int off, int scansize) { int srcoff = off; int dstoff = y * srcW + x; if (model == defaultRGB) { for (int yc = 0; yc < h; yc++) { System.arraycopy(pixels, srcoff, raster, dstoff, w); srcoff += scansize; dstoff += srcW; } } else { for (int yc = 0; yc < h; yc++) { for (int xc = 0; xc < w; xc++) { raster[dstoff++] = model.getRGB(pixels[srcoff++]); } srcoff += (scansize - w); dstoff += (srcW - w); } } } public void imageComplete(int status) { if ((status == IMAGEERROR) || (status == IMAGEABORTED)) { consumer.imageComplete(status); return; } int pixels[] = new int[dstW]; for (int dy = 0; dy < dstH; dy++) { itransform(0 - xoffset, dy - yoffset, coord); double x1 = coord[0]; double y1 = coord[1]; itransform(dstW - xoffset, dy - yoffset, coord); double x2 = coord[0]; double y2 = coord[1]; double xinc = (x2 - x1) / dstW; double yinc = (y2 - y1) / dstW; for (int dx = 0; dx < dstW; dx++) { int sx = (int) Math.round(x1); int sy = (int) Math.round(y1); if ((sx < 0) || (sy < 0) || (sx >= srcW) || (sy >= srcH)) { pixels[dx] = 0; } else { pixels[dx] = raster[sy * srcW + sx]; } x1 += xinc; y1 += yinc; } consumer.setPixels(0, dy, dstW, 1, defaultRGB, pixels, 0, dstW); } consumer.imageComplete(status); } } // private class RotateFilter /** * Makes animaion for 3D images. */ private class Animation extends JDialog implements ActionListener, Runnable { private static final long serialVersionUID = 6717628496771098250L; private final int MAX_ANIMATION_IMAGE_SIZE = 300; private Image[] frames = null; // a list of images for animation private JComponent canvas = null; // canvas to draw the image private Thread engine = null; // Thread animating the images private int numberOfImages = 0; private int currentFrame = 0; private int sleepTime = 200; private Image offScrImage; // Offscreen image private Graphics offScrGC; // Offscreen graphics context private JFrame owner; private int x0 = 0, y0 = 0; // offset of the image drawing public Animation(JFrame theOwner, ScalarDS dataset) { super(theOwner, "Animation", true); owner = theOwner; setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE); long[] dims = dataset.getDims(); long[] stride = dataset.getStride(); long[] start = dataset.getStartDims(); long[] selected = dataset.getSelectedDims(); int[] selectedIndex = dataset.getSelectedIndex(); int rank = dataset.getRank(); if (animationSpeed != 0) { sleepTime = 1000 / animationSpeed; } // back up the start and selected size long[] tstart = new long[rank]; long[] tselected = new long[rank]; long[] tstride = new long[rank]; System.arraycopy(start, 0, tstart, 0, rank); System.arraycopy(selected, 0, tselected, 0, rank); System.arraycopy(stride, 0, tstride, 0, rank); int stride_n = 1; int max_size = (int) Math.max(selected[selectedIndex[0]], selected[selectedIndex[1]]); if (max_size > MAX_ANIMATION_IMAGE_SIZE) { stride_n = (int)( (double)max_size / (double)MAX_ANIMATION_IMAGE_SIZE +0.5); } start[selectedIndex[0]] = 0; start[selectedIndex[1]] = 0; start[selectedIndex[2]] = 0; selected[selectedIndex[0]] = dims[selectedIndex[0]] / stride_n; selected[selectedIndex[1]] = dims[selectedIndex[1]] / stride_n; selected[selectedIndex[2]] = 1; stride[selectedIndex[0]] = stride_n; stride[selectedIndex[1]] = stride_n; stride[selectedIndex[2]] = 1; Object data3d = null; byte[] byteData = null; int h = (int) selected[selectedIndex[0]]; int w = (int) selected[selectedIndex[1]]; int size = w * h; numberOfImages = (int) dims[selectedIndex[2]]; frames = new Image[numberOfImages]; MemoryImageSource mir = memoryImageSource; try { for (int i = 0; i < numberOfImages; i++) { memoryImageSource = null; // each animation image has its // own image resource start[selectedIndex[2]] = i; dataset.clearData(); try { data3d = dataset.read(); } catch (Throwable err) { continue; } byteData = new byte[size]; byteData=Tools.getBytes(data3d, dataRange, w, h, false, dataset.getFillValue(), true, byteData); frames[i] = createIndexedImage(byteData, imagePalette, w, h); } } finally { // set back to original state memoryImageSource = mir; System.arraycopy(tstart, 0, start, 0, rank); System.arraycopy(tselected, 0, selected, 0, rank); System.arraycopy(tstride, 0, stride, 0, rank); } offScrImage = owner.createImage(w, h); offScrGC = offScrImage.getGraphics(); x0 = Math.max((MAX_ANIMATION_IMAGE_SIZE - w) / 2, 0); y0 = Math.max((MAX_ANIMATION_IMAGE_SIZE - h) / 2, 0); canvas = new JComponent() { private static final long serialVersionUID = -6828735330511795835L; public void paint(Graphics g) { g.clearRect(0, 0, MAX_ANIMATION_IMAGE_SIZE, MAX_ANIMATION_IMAGE_SIZE); if ((offScrGC == null) || (frames == null)) { return; } offScrGC.drawImage(frames[currentFrame], 0, 0, owner); g.drawImage(offScrImage, x0, y0, owner); } }; JPanel contentPane = (JPanel) getContentPane(); contentPane.setPreferredSize(new Dimension( MAX_ANIMATION_IMAGE_SIZE, MAX_ANIMATION_IMAGE_SIZE)); contentPane.setLayout(new BorderLayout()); JButton b = new JButton("Close"); b.setActionCommand("Close animation"); b.addActionListener(this); contentPane.add(b, BorderLayout.SOUTH); contentPane.add(canvas, BorderLayout.CENTER); start(); Point l = getParent().getLocation(); l.x += 300; l.y += 200; setLocation(l); pack(); setVisible(true); } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Close animation")) { dispose(); // terminate the animation } } public void dispose() { engine = null; frames = null; super.dispose(); } /** * No need to clear anything; just paint. */ public void update(Graphics g) { paint(g); } /** * Paint the current frame */ public void paint(Graphics g) { canvas.paint(g); } /** * Start the applet by forking an animation thread. */ private void start() { engine = new Thread(this); engine.start(); } /** * Run the animation. This method is called by class Thread. * * @see java.lang.Thread */ public void run() { Thread me = Thread.currentThread(); if ((frames == null) || (canvas == null)) { return; } while (me == engine) { if (++currentFrame >= numberOfImages) currentFrame = 0; repaint(); this.getToolkit().sync(); // Force it to be drawn *now*. try { Thread.sleep(sleepTime); } catch (InterruptedException e) { } } } // public void run() { } // private class Animation extends JDialog private class DataRangeDialog extends JDialog implements ActionListener, ChangeListener, PropertyChangeListener { final int W = 500, H = 400; double[] minmax_current = {0, 0}; double min, max; final double[] minmax_previous = {0, 0}; final double[] minmax_dist = {0,0}; JSlider minSlider, maxSlider; JFormattedTextField minField, maxField; public DataRangeDialog(JFrame theOwner, double[] minmaxCurrent, double[] minmaxOriginal, final int[] dataDist) { super(theOwner, "Image Vaule Range", true); Tools.findMinMax(dataDist, minmax_dist, null); if ((minmaxCurrent == null) || (minmaxCurrent.length <= 1)) { minmax_current[0] = 0; minmax_current[1] = 255; } else { if (minmaxCurrent[0] == minmaxCurrent[1]) { Tools.findMinMax(data, minmaxCurrent, dataset.getFillValue()); } minmax_current[0] = minmaxCurrent[0]; minmax_current[1] = minmaxCurrent[1]; } minmax_previous[0] = min = minmax_current[0]; minmax_previous[1] = max = minmax_current[1]; int tickSpace = (int) (minmaxOriginal[1]-minmaxOriginal[0]) / 10; final DecimalFormat numberFormat = new DecimalFormat("#.##E0"); NumberFormatter formatter = new NumberFormatter(numberFormat); formatter.setMinimum(new Double(min)); formatter.setMaximum(new Double(max)); minField = new JFormattedTextField(formatter); minField.addPropertyChangeListener(this); minField.setValue(new Double(min)); maxField = new JFormattedTextField(formatter); maxField.addPropertyChangeListener(this); maxField.setValue(new Double(max)); minSlider = new JSlider(JSlider.HORIZONTAL, (int)minmaxOriginal[0], (int)minmaxOriginal[1], (int) min); minSlider.setMajorTickSpacing(tickSpace); minSlider.setPaintTicks(true); minSlider.setPaintLabels(true); minSlider.addChangeListener(this); minSlider.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); maxSlider = new JSlider(JSlider.HORIZONTAL, (int)minmaxOriginal[0], (int)minmaxOriginal[1], (int) max); maxSlider.setMajorTickSpacing(tickSpace); maxSlider.setPaintTicks(true); maxSlider.setPaintLabels(true); maxSlider.addChangeListener(this); maxSlider.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); contentPane.setPreferredSize(new Dimension(W, H)); JPanel minPane = new JPanel(); minPane.setBorder(new TitledBorder("Lower Bound")); minPane.setLayout(new BorderLayout()); minPane.add(minField, BorderLayout.CENTER); minPane.add(minSlider, BorderLayout.SOUTH); JPanel maxPane = new JPanel(); maxPane.setBorder(new TitledBorder("Upper Bound")); maxPane.setLayout(new BorderLayout()); maxPane.add(maxField, BorderLayout.CENTER); maxPane.add(maxSlider, BorderLayout.SOUTH); JPanel chartPane = new JPanel() { int numberOfPoints = dataDist.length; int gap = 5; int xgap = 2 * gap; double xmin = originalRange[0]; double xmax = originalRange[1]; public void paint(Graphics g) { int h = H/3 -50; int w = W; int xnpoints = Math.min(10, numberOfPoints - 1); // draw the X axis g.drawLine(xgap, h, w + xgap, h); // draw x labels double xp = 0, x = xmin; double dw = (double) w / (double) xnpoints; double dx = (xmax - xmin) / xnpoints; for (int i = 0; i <= xnpoints; i++) { x = xmin + i * dx; xp = xgap + i * dw; g.drawLine((int) xp, h, (int) xp, h - 5); g.drawString(numberFormat.format(x), (int) xp - 5, h + 20); } Color c = g.getColor(); double yp, ymin=minmax_dist[0], dy=minmax_dist[1]-minmax_dist[0]; if (dy<=0) dy =1; xp = xgap; yp = 0; g.setColor(Color.blue); int barWidth = w / numberOfPoints; if (barWidth <= 0) { barWidth = 1; } dw = (double) w / (double) numberOfPoints; for (int j = 0; j < numberOfPoints; j++) { xp = xgap + j * dw; yp = (int) (h * (dataDist[j] - ymin) / dy); g.fillRect((int) xp, (int) (h - yp), barWidth, (int) yp); } g.setColor(c); // set the color back to its default } // public void paint(Graphics g) } ; JPanel mainPane = new JPanel(); mainPane.setLayout(new GridLayout(3, 1, 5, 5)); mainPane.add(chartPane); mainPane.add(minPane); mainPane.add(maxPane); contentPane.add(mainPane, BorderLayout.CENTER); // add OK and CANCEL buttons JPanel confirmP = new JPanel(); JButton button = new JButton(" Ok "); button.setMnemonic(KeyEvent.VK_O); button.setActionCommand("Ok"); button.addActionListener(this); confirmP.add(button); button = new JButton("Cancel"); button.setMnemonic(KeyEvent.VK_C); button.setActionCommand("Cancel"); button.addActionListener(this); confirmP.add(button); button = new JButton("Apply"); button.setMnemonic(KeyEvent.VK_A); button.setActionCommand("Apply"); button.addActionListener(this); confirmP.add(button); contentPane.add(confirmP, BorderLayout.SOUTH); contentPane.add(new JLabel(" "), BorderLayout.NORTH); if ((max-min) < 2) { minSlider.setEnabled(false); maxSlider.setEnabled(false); } Point l = getParent().getLocation(); Dimension d = getParent().getPreferredSize(); l.x += 300; l.y += 200; setLocation(l); pack(); setVisible(true); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Ok")) { minmax_current[0] = ((Number) minField.getValue()).doubleValue(); minmax_current[1] = ((Number) maxField.getValue()).doubleValue(); this.dispose(); } if (cmd.equals("Apply")) { minmax_previous[0] = minmax_current[0]; minmax_previous[1] = minmax_current[1]; minmax_current[0] = ((Number) minField.getValue()).doubleValue(); minmax_current[1] = ((Number) maxField.getValue()).doubleValue(); applyDataRange(minmax_current); minmax_current[0] = minmax_current[1] = 0; } else if (cmd.equals("Cancel")) { minmax_current[0] = minmax_previous[0]; minmax_current[1] = minmax_previous[1]; applyDataRange(minmax_previous); this.dispose(); } } /** Listen to the slider. */ public void stateChanged(ChangeEvent e) { Object source = e.getSource(); if (!(source instanceof JSlider)) { return; } JSlider slider = (JSlider) source; if (!slider.isEnabled()) return; double value = slider.getValue(); if (slider.equals(minSlider)) { double maxValue = maxSlider.getValue(); if (value > maxValue) { value = maxValue; slider.setValue((int)value); } minField.setValue(new Double(value)); } else if (slider.equals(maxSlider)) { double minValue = minSlider.getValue(); if (value < minValue) { value = minValue; slider.setValue((int)value); } maxField.setValue(new Double(value)); } } /** * Listen to the text field. This method detects when the value of the * text field changes. */ public void propertyChange(PropertyChangeEvent e) { Object source = e.getSource(); if ("value".equals(e.getPropertyName())) { Number num = (Number) e.getNewValue(); if (num == null) { return; } double value = num.doubleValue(); if (source.equals(minField) && (minSlider != null) && minSlider.isEnabled()) { int maxValue = maxSlider.getValue(); if (value > maxValue) { value = maxValue; minField.setText(String.valueOf(value)); } //minmax[0] = value; minSlider.setValue((int) value); } else if (source.equals(maxField) && (maxSlider != null) && minSlider.isEnabled()) { int minValue = minSlider.getValue(); if (value < minValue) { value = minValue; maxField.setText(String.valueOf(value)); } //minmax[1] = value; maxSlider.setValue((int) value); } } } public double[] getRange() { return minmax_current; } } // private class DataRangeDialog extends JDialog implements ActionListener private class ContrastSlider extends JDialog implements ActionListener, ChangeListener, PropertyChangeListener { private static final long serialVersionUID = -3002524363351111565L; JSlider brightSlider, contrastSlider; JFormattedTextField brightField, contrastField; ImageProducer imageProducer; double[] autoGainBias = {0, 0}; int bLevel=0, cLevel=0; public ContrastSlider(JFrame theOwner, ImageProducer producer) { super(theOwner, "Brightness/Contrast", true); String bLabel = "Brightness", cLabel="Contrast"; imageProducer = producer; if (doAutoGainContrast && gainBias!= null) { bLabel = "Bias"; cLabel="Gain"; this.setTitle(bLabel+"/"+cLabel); } java.text.NumberFormat numberFormat = java.text.NumberFormat .getNumberInstance(); NumberFormatter formatter = new NumberFormatter(numberFormat); formatter.setMinimum(new Integer(-100)); formatter.setMaximum(new Integer(100)); brightField = new JFormattedTextField(formatter); brightField.addPropertyChangeListener(this); brightField.setValue(new Integer(0)); brightSlider = new JSlider(JSlider.HORIZONTAL, -100, 100, 0); brightSlider.setMajorTickSpacing(20); brightSlider.setPaintTicks(true); brightSlider.setPaintLabels(true); brightSlider.addChangeListener(this); brightSlider .setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); formatter = new NumberFormatter(numberFormat); formatter.setMinimum(new Integer(-100)); formatter.setMaximum(new Integer(100)); contrastField = new JFormattedTextField(formatter); contrastField.addPropertyChangeListener(this); contrastField.setValue(new Integer(0)); contrastSlider = new JSlider(JSlider.HORIZONTAL, -100, 100, 0); contrastSlider.setMajorTickSpacing(20); contrastSlider.setPaintTicks(true); contrastSlider.setPaintLabels(true); contrastSlider.addChangeListener(this); contrastSlider.setBorder(BorderFactory.createEmptyBorder(0, 0, 10,0)); JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); contentPane.setPreferredSize(new Dimension(500, 300)); JPanel brightPane = new JPanel(); brightPane.setBorder(new TitledBorder(bLabel+"%")); brightPane.setLayout(new BorderLayout()); brightPane.add(brightField, BorderLayout.NORTH); brightPane.add(brightSlider, BorderLayout.CENTER); JPanel contrastPane = new JPanel(); contrastPane.setBorder(new TitledBorder(cLabel+"%")); contrastPane.setLayout(new BorderLayout()); contrastPane.add(contrastField, BorderLayout.NORTH); contrastPane.add(contrastSlider, BorderLayout.CENTER); JPanel mainPane = new JPanel(); mainPane.setLayout(new GridLayout(2, 1, 5, 5)); mainPane.add(brightPane); mainPane.add(contrastPane); contentPane.add(mainPane, BorderLayout.CENTER); // add OK and CANCEL buttons JPanel confirmP = new JPanel(); JButton button = new JButton(" Ok "); button.setMnemonic(KeyEvent.VK_O); button.setActionCommand("Ok_brightness_change"); button.addActionListener(this); confirmP.add(button); button = new JButton("Cancel"); button.setMnemonic(KeyEvent.VK_C); button.setActionCommand("Cancel_brightness_change"); button.addActionListener(this); confirmP.add(button); button = new JButton("Apply"); button.setMnemonic(KeyEvent.VK_A); button.setActionCommand("Apply_brightness_change"); button.addActionListener(this); confirmP.add(button); contentPane.add(confirmP, BorderLayout.SOUTH); contentPane.add(new JLabel(" "), BorderLayout.NORTH); Point l = getParent().getLocation(); Dimension d = getParent().getPreferredSize(); l.x += 300; l.y += 200; setLocation(l); pack(); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Ok_brightness_change") || cmd.equals("Apply_brightness_change")) { int b = ((Number) brightField.getValue()).intValue(); int c = ((Number) contrastField.getValue()).intValue(); applyBrightContrast(b, c); if (cmd.startsWith("Ok")) { bLevel = b; cLevel = c; setVisible(false); } } else if (cmd.equals("Cancel_brightness_change")) { applyBrightContrast(bLevel, cLevel); setVisible(false); } } /** Listen to the slider. */ public void stateChanged(ChangeEvent e) { Object source = e.getSource(); if (!(source instanceof JSlider)) { return; } JSlider slider = (JSlider) source; int value = slider.getValue(); if (slider.equals(brightSlider)) { brightField.setValue(new Integer(value)); } else if (slider.equals(contrastSlider)) { contrastField.setValue(new Integer(value)); } } /** * Listen to the text field. This method detects when the value of the * text field changes. */ public void propertyChange(PropertyChangeEvent e) { Object source = e.getSource(); if ("value".equals(e.getPropertyName())) { Number num = (Number) e.getNewValue(); if (num == null) { return; } double value = num.doubleValue(); if (value > 100) { value = 100; } else if (value < -100) { value = -100; } if (source.equals(brightField) && (brightSlider != null)) { brightSlider.setValue((int) value); } else if (source.equals(contrastField) && (contrastSlider != null)) { contrastSlider.setValue((int) value); } } } private void applyBrightContrast(int blevel, int clevel) { // do not separate autodain and simple contrast process // ImageFilter filter = new BrightnessFilter(blevel, clevel); // image = createImage(new FilteredImageSource(imageProducer, filter)); // imageComponent.setImage(image); // zoomTo(zoomFactor); // separate autodain and simple contrast process if (doAutoGainContrast && gainBias!= null) { autoGainBias[0] = gainBias[0]*(1+((double)clevel)/100.0); autoGainBias[1] = gainBias[1]*(1+((double)blevel)/100.0); applyAutoGain(autoGainBias, null); } else { ImageFilter filter = new BrightnessFilter(blevel, clevel); image = createImage(new FilteredImageSource(imageProducer, filter)); imageComponent.setImage(image); zoomTo(zoomFactor); } } } // private class ContrastSlider extends JDialog implements ActionListener } jhdf-2.9/ncsa/hdf/view/ViewProperties.java0000644000175000017500000014501712050301063021450 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.Collections; import java.util.Enumeration; import java.util.Properties; import java.util.Vector; import java.util.jar.JarEntry; import java.util.jar.JarFile; import javax.swing.Icon; import javax.swing.ImageIcon; import ncsa.hdf.object.FileFormat; /** * The ViewProperties holds all the HDFView static information. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class ViewProperties extends Properties { private static final long serialVersionUID = -6411465283887959066L; /** the version of the HDFViewer */ public static final String VERSION = "2.9"; /** the local property file name */ private static final String USER_PROPERTY_FILE = ".hdfview" + VERSION.substring(0, 3); /** the maximum number of most recent files */ public static final int MAX_RECENT_FILES = 15; /** name of the tab delimiter */ public static final String DELIMITER_TAB = "Tab"; /** name of the tab delimiter */ public static final String DELIMITER_COMMA = "Comma"; /** name of the tab delimiter */ public static final String DELIMITER_SPACE = "Space"; /** name of the tab delimiter */ public static final String DELIMITER_COLON = "Colon"; /** image origin: UpperLeft */ public static final String ORIGIN_UL = "UpperLeft"; /** image origin: LowerLeft */ public static final String ORIGIN_LL = "LowerLeft"; /** image origin: UpperRight */ public static final String ORIGIN_UR = "UpperRight"; /** image origin: LowerRight */ public static final String ORIGIN_LR = "LowerRight"; /** name of the tab delimiter */ public static final String DELIMITER_SEMI_COLON = "Semi-Colon"; /** * Property keys how how the data is displayed. */ public static enum DATA_VIEW_KEY { CHAR, CONVERTBYTE, TRANSPOSED, READONLY, OBJECT, BITMASK, BITMASKOP, BORDER, INFO, INDEXBASE1 } /** * Property keys how how the data is displayed. */ public static enum BITMASK_OP { AND, EXTRACT } /** user's guide */ private static String usersGuide = System.getProperty("user.dir") + "/UsersGuide/index.html"; /** the font size */ private static int fontSize = 12; /** the font type */ private static String fontType = null; /** the full path of H4toH5 converter */ private static String h4toh5 = ""; /** data delimiter */ private static String delimiter = DELIMITER_TAB; /** image origin */ private static String origin = ORIGIN_UL; /** default index type */ private static String indexType = "H5_INDEX_NAME"; /** default index order */ private static String indexOrder = "H5_ITER_INC"; /** a list of most recent files */ private static Vector mrf; /** the root directory of the HDFView */ private static String rootDir; /** default starting file directory */ private static String workDir = "user.dir"; /** default HDF4 file extension */ private static String fileExt = "hdf, h4, hdf4, h5, hdf5, he4, he5"; private static ClassLoader extClassLoader = null; /** a list of srb accounts */ private static Vector srbAccountList = new Vector(5); /** * flag to indicate if auto contrast is used in image process. Do not use * autocontrast by default (2.6 change). */ private static boolean isAutoContrast = false; private static boolean showImageValues = false; /** * flag to indicate if default open file is read only. By default, use * read/write. */ private static boolean isReadOnly = false; private static boolean isEarlyLib = true; /** a list of palette files */ private static Vector paletteList = new Vector(5); /** flag to indicate if enum data is converted to strings */ private static boolean convertEnum = true; /** flag to indicate if data is 1-based index */ private static boolean isIndexBase1 = false; /** * Current Java application such as HDFView cannot handle files with large * number of objects such 1,000,000 objects. max_members defines the maximum * number of objects will be loaded into memory. */ private static int max_members = Integer.MAX_VALUE; // load all by default // 1,000 // by // default /** * Current Java application such as HDFView cannot handle files with large * number of objects such 1,000,000 objects. start_members defines the * starting index of objects will be loaded into memory. */ private static int start_members = 0; // 0 // by // default private static ImageIcon hdfIcon, h4Icon, h5Icon, largeHdfIcon, blankIcon, helpIcon, fileopenIcon, filesaveIcon, filenewIcon, filecloseIcon, foldercloseIcon, folderopenIcon, foldercloseIconA, folderopenIconA, datasetIcon, imageIcon, tableIcon, textIcon, datasetIconA, imageIconA, tableIconA, textIconA, zoominIcon, zoomoutIcon, paletteIcon, chartIcon, brightIcon, autocontrastIcon, copyIcon, cutIcon, pasteIcon, previousIcon, nextIcon, firstIcon, lastIcon, animationIcon, datatypeIcon, datatypeIconA, linkIcon, iconAPPS, iconURL, iconVIDEO, iconXLS, iconPDF, iconAUDIO, questionIcon; private static String propertyFile; /** a list of treeview module */ private static Vector moduleListTreeView = new Vector(5); /** a list of metaview module */ private static Vector moduleListMetaDataView = new Vector(5); /** a list of textview module */ private static Vector moduleListTextView = new Vector(5); /** a list of tableview module */ private static Vector moduleListTableView = new Vector(5); /** a list of imageview module */ private static Vector moduleListImageView = new Vector(5); /** a list of paletteview module */ private static Vector moduleListPaletteView = new Vector(5); /** a list of helpview module */ private static Vector moduleListHelpView = new Vector(5); /** * Creates a property list with given root directory of the HDFView. */ public ViewProperties(String viewRoot) { super(); rootDir = viewRoot; mrf = new Vector(MAX_RECENT_FILES + 5); // find the property file String uh = "", ud = "", h5v = "", fn; // look for the property file at the use home directory fn = USER_PROPERTY_FILE; uh = System.getProperty("user.home") + File.separator + fn; ud = System.getProperty("user.dir") + File.separator + fn; h5v = viewRoot + File.separator + "lib" + File.separator + fn; if ((new File(uh)).exists()) { propertyFile = uh; } else if ((new File(ud)).exists()) { propertyFile = ud; } else // create new property file at user home directory { propertyFile = uh; File pFile = new File(uh); try { pFile.createNewFile(); } catch (Exception ex) { propertyFile = null; } } } /* the properties are sorted by keys */ @SuppressWarnings("unchecked") public synchronized Enumeration keys() { Enumeration keysEnum = super.keys(); @SuppressWarnings("rawtypes") Vector keyList = new Vector(50); while (keysEnum.hasMoreElements()) { keyList.add(keysEnum.nextElement()); } Collections.sort(keyList); return keyList.elements(); } /** load module classes */ public static ClassLoader loadExtClass() { if (extClassLoader != null) { return extClassLoader; } else { // default classloader extClassLoader = ClassLoader.getSystemClassLoader(); } String rootPath = System.getProperty("hdfview.root"); if (rootPath == null) rootPath = System.getProperty("user.dir"); String dirname = rootPath + File.separator + "lib" + File.separator + "ext" + File.separator; File extdir = new File(dirname); String[] jars = extdir.list(); if ((jars == null) || (jars.length <= 0)) { return extClassLoader; } Vector jarList = new Vector(50); Vector classList = new Vector(50); for (int i = 0; i < jars.length; i++) { if (jars[i].endsWith(".jar")) { jarList.add(jars[i]); // add class names to the list of classes File tmpFile = new File(extdir, jars[i]); try { JarFile jarFile = new JarFile(tmpFile, false, JarFile.OPEN_READ); Enumeration emu = jarFile.entries(); while (emu.hasMoreElements()) { JarEntry jarEntry = (JarEntry) emu.nextElement(); String entryName = jarEntry.getName(); int idx = entryName.indexOf(".class"); if ((idx > 0) && (entryName.indexOf('$') <= 0)) { entryName = entryName.replace('/', '.'); classList.add(entryName.substring(0, idx)); } } } catch (Exception ex) { } } // if (jars[i].endsWith(".jar")) { } // for (int i=0; i theClass = null; try { theClass = Class.forName(theName); } catch (Exception ex) { theClass = extClassLoader.loadClass(theName); } Class[] interfaces = theClass.getInterfaces(); if (interfaces != null) { for (int j = 0; j < interfaces.length; j++) { String interfaceName = interfaces[j].getName(); if ("ncsa.hdf.view.TreeView".equals(interfaceName) && !moduleListTreeView.contains(theName)) { moduleListTreeView.add(theName); break; } else if ("ncsa.hdf.view.MetaDataView".equals(interfaceName) && !moduleListMetaDataView.contains(theName)) { moduleListMetaDataView.add(theName); break; } else if ("ncsa.hdf.view.TextView".equals(interfaceName) && !moduleListTextView.contains(theName)) { moduleListTextView.add(theName); break; } else if ("ncsa.hdf.view.TableView".equals(interfaceName) && !moduleListTableView.contains(theName)) { moduleListTableView.add(theName); break; } else if ("ncsa.hdf.view.ImageView".equals(interfaceName) && !moduleListImageView.contains(theName)) { moduleListImageView.add(theName); break; } else if ("ncsa.hdf.view.PaletteView".equals(interfaceName) && !moduleListPaletteView.contains(theName)) { moduleListPaletteView.add(theName); break; } else if ("ncsa.hdf.view.HelpView".equals(interfaceName) && !moduleListHelpView.contains(theName)) { moduleListHelpView.add(theName); break; } } // for (int j=0; j theList = moduleList[i]; propVal = (String) get(moduleKeys[i]); if (propVal != null) { // set default to the module specified in property file theList.remove(propVal); theList.add(0, propVal); } else { // use default module theList.remove(moduleNames[i]); theList.add(0, moduleNames[i]); } } // add netcdf and fits file formats try { FileInputStream fis = new FileInputStream(propertyFile); load(fis); fis.close(); } catch (Exception e) { ; } // add fileformat modules Enumeration local_enum = this.keys(); String theKey = null; String fExt = null; while (local_enum.hasMoreElements()) { theKey = (String) local_enum.nextElement(); if (theKey.startsWith("module.fileformat")) { fExt = theKey.substring(18); try { // enables use of JHDF5 in JNLP (Web Start) applications, // the system class loader with reflection first. String className = (String) get(theKey); Class theClass = null; try { theClass = Class.forName(className); } catch (Exception ex) { try { theClass = extClassLoader.loadClass(className); } catch (Exception ex2) { } } Object theObject = theClass.newInstance(); if (theObject instanceof FileFormat) { FileFormat.addFileFormat(fExt, (FileFormat) theObject); } } catch (Throwable err) { ; } } } propVal = (String) get("users.guide"); if (propVal != null) { usersGuide = propVal; } propVal = (String) get("image.contrast"); if (propVal != null) { isAutoContrast = ("auto".equalsIgnoreCase(propVal)); } propVal = (String) get("image.showvalues"); if (propVal != null) { showImageValues = ("true".equalsIgnoreCase(propVal)); } propVal = (String) get("file.mode"); if (propVal != null) { isReadOnly = ("r".equalsIgnoreCase(propVal)); } propVal = (String) get("lib.version"); if (propVal != null) { isEarlyLib = ("early".equalsIgnoreCase(propVal)); } propVal = (String) get("enum.conversion"); if (propVal != null) { convertEnum = ("true".equalsIgnoreCase(propVal)); } propVal = (String) get("index.base1"); if (propVal != null) { isIndexBase1 = ("true".equalsIgnoreCase(propVal)); } propVal = (String) get("data.delimiter"); if ((propVal != null) && (propVal.length() > 0)) { delimiter = propVal; } propVal = (String) get("image.origin"); if ((propVal != null) && (propVal.length() > 0)) { origin = propVal; } propVal = (String) get("h5file.indexType"); if ((propVal != null) && (propVal.length() > 0)) { indexType = propVal; } propVal = (String) get("h5file.indexOrder"); if ((propVal != null) && (propVal.length() > 0)) { indexOrder = propVal; } propVal = (String) get("h4toh5.converter"); if ((propVal != null) && (propVal.length() > 0)) { h4toh5 = propVal; } propVal = (String) get("work.dir"); if ((propVal != null) && (propVal.length() > 0)) { workDir = propVal; } propVal = (String) get("file.extension"); if ((propVal != null) && (propVal.length() > 0)) { fileExt = propVal; FileFormat.addFileExtension(fileExt); } propVal = (String) get("font.size"); if ((propVal != null) && (propVal.length() > 0)) { try { fontSize = Integer.parseInt(propVal); } catch (Exception ex) { } } propVal = (String) get("font.type"); if ((propVal != null) && (propVal.length() > 0)) { fontType = propVal.trim(); } propVal = (String) get("max.members"); if ((propVal != null) && (propVal.length() > 0)) { try { max_members = Integer.parseInt(propVal); } catch (Exception ex) { } } // load the most recent file list from the property file String theFile = null; for (int i = 0; i < MAX_RECENT_FILES; i++) { theFile = getProperty("recent.file" + i); if ((theFile != null) && !mrf.contains(theFile)) { if (theFile.startsWith("http://") || theFile.startsWith("ftp://") || (new File(theFile)).exists()) { mrf.addElement(theFile); } } else { this.remove("recent.file" + i); } } // load the most recent palette file list from the property file theFile = null; for (int i = 0; i < MAX_RECENT_FILES; i++) { theFile = getProperty("palette.file" + i); if (theFile != null) theFile = theFile.trim(); if ((theFile != null && theFile.length() > 0) && !paletteList.contains(theFile)) { if ((new File(theFile)).exists()) { paletteList.addElement(theFile); } } else { this.remove("palette.file" + i); } } // load srb account propVal = null; String srbaccount[] = new String[7]; for (int i = 0; i < MAX_RECENT_FILES; i++) { if (null == (srbaccount[0] = getProperty("srbaccount" + i + ".host"))) { continue; } if (null == (srbaccount[1] = getProperty("srbaccount" + i + ".port"))) { continue; } if (null == (srbaccount[2] = getProperty("srbaccount" + i + ".user"))) { continue; } if (null == (srbaccount[3] = getProperty("srbaccount" + i + ".password"))) { continue; } if (null == (srbaccount[4] = getProperty("srbaccount" + i + ".home"))) { continue; } if (null == (srbaccount[5] = getProperty("srbaccount" + i + ".domain"))) { continue; } if (null == (srbaccount[6] = getProperty("srbaccount" + i + ".resource"))) { continue; } srbAccountList.add(srbaccount); srbaccount = new String[7]; } // set default modules from user property files for (int i = 0; i < 6; i++) { String moduleName = (String) get(moduleKeys[i]); if ((moduleName != null) && (moduleName.length() > 0)) { if (moduleList[i].contains(moduleName)) moduleList[i].remove(moduleName); moduleList[i].add(0, moduleName); } } } /** Save user properties into property file */ public void save() { if (propertyFile == null) { return; } else { clear(); } // update data saving options if (delimiter == null) { put("data.delimiter", DELIMITER_TAB); } else { put("data.delimiter", delimiter); } if (origin == null) { put("image.origin", ORIGIN_UL); } else { put("image.origin", origin); } if (indexType != null) { put("h5file.indexType", indexType); } if (indexOrder != null) { put("h5file.indexOrder", indexOrder); } if (usersGuide != null) { put("users.guide", usersGuide); } if (workDir != null) { put("work.dir", workDir); } if (fileExt != null) { put("file.extension", fileExt); } if (h4toh5 != null) { put("h4toh5.converter", h4toh5); } put("font.size", String.valueOf(fontSize)); if (fontType != null) { put("font.type", fontType); } put("max.members", String.valueOf(max_members)); if (isAutoContrast) { put("image.contrast", "auto"); } else { put("image.contrast", "general"); } if (showImageValues) put("image.showvalues", "true"); else put("image.showvalues", "false"); if (isReadOnly) { put("file.mode", "r"); } else { put("file.mode", "rw"); } if (isEarlyLib) { put("lib.version", "early"); } else { put("lib.version", "latest"); } put("enum.conversion", String.valueOf(convertEnum)); put("index.base1", String.valueOf(isIndexBase1)); // save the list of most recent files String theFile; int size = mrf.size(); int minSize = Math.min(size, MAX_RECENT_FILES); for (int i = 0; i < minSize; i++) { theFile = mrf.elementAt(i); if ((theFile != null) && (theFile.length() > 0)) { put("recent.file" + i, theFile); } } // save the list of most recent palette files size = paletteList.size(); minSize = Math.min(size, MAX_RECENT_FILES); for (int i = 0; i < minSize; i++) { theFile = paletteList.elementAt(i); if ((theFile != null) && (theFile.length() > 0)) { put("palette.file" + i, theFile); } } // save srb account String srbaccount[] = null; size = srbAccountList.size(); minSize = Math.min(size, MAX_RECENT_FILES); for (int i = 0; i < minSize; i++) { srbaccount = srbAccountList.get(i); if ((srbaccount[0] != null) && (srbaccount[1] != null) && (srbaccount[2] != null) && (srbaccount[3] != null) && (srbaccount[4] != null) && (srbaccount[5] != null) && (srbaccount[6] != null)) { put("srbaccount" + i + ".host", srbaccount[0]); put("srbaccount" + i + ".port", srbaccount[1]); put("srbaccount" + i + ".user", srbaccount[2]); put("srbaccount" + i + ".password", srbaccount[3]); put("srbaccount" + i + ".home", srbaccount[4]); put("srbaccount" + i + ".domain", srbaccount[5]); put("srbaccount" + i + ".resource", srbaccount[6]); } } // save default modules String moduleName = moduleListTreeView.elementAt(0); if ((moduleName != null) && (moduleName.length() > 0)) { put("module.treeview", moduleName); } moduleName = moduleListMetaDataView.elementAt(0); if ((moduleName != null) && (moduleName.length() > 0)) { put("module.metadataview", moduleName); } moduleName = moduleListTextView.elementAt(0); if ((moduleName != null) && (moduleName.length() > 0)) { put("module.textview", moduleName); } moduleName = moduleListTableView.elementAt(0); if ((moduleName != null) && (moduleName.length() > 0)) { put("module.tableview", moduleName); } moduleName = moduleListImageView.elementAt(0); if ((moduleName != null) && (moduleName.length() > 0)) { put("module.imageview", moduleName); } moduleName = moduleListPaletteView.elementAt(0); if ((moduleName != null) && (moduleName.length() > 0)) { put("module.paletteview", moduleName); } // save the current supported fileformat Enumeration keys = FileFormat.getFileFormatKeys(); String theKey = null; while (keys.hasMoreElements()) { theKey = (String) keys.nextElement(); FileFormat theformat = FileFormat.getFileFormat(theKey); put("module.fileformat." + theKey, theformat.getClass().getName()); } try { FileOutputStream fos = new FileOutputStream(propertyFile); store(fos, "User properties modified on "); fos.close(); } catch (Exception e) { ; } } /** returns the name of the user property file */ public static String getPropertyFile() { return propertyFile; } /** returns the default work directory, where the open file starts. */ public static String getWorkDir() { if (workDir.equals("user.dir")) { workDir = System.getProperty("user.dir"); } return workDir; } /** returns the maximum number of the most recent file */ public static int getMaxRecentFiles() { return MAX_RECENT_FILES; } /** return the path of the H5View uers guide */ public static String getUsersGuide() { return usersGuide; }; /** returns the delimiter of data values */ public static String getDataDelimiter() { return delimiter; } /** returns the image origin */ public static String getImageOrigin() { return origin; } /** returns the default index type for display */ public static String getIndexType() { return indexType; } /** returns the default index order for display */ public static String getIndexOrder() { return indexOrder; } /** returns the font size */ public static int getFontSize() { return fontSize; } /** returns the font type */ public static String getFontType() { return fontType; } /** gets the file extensions of supported file formats */ public static String getFileExtension() { return fileExt; } /** sets the font size */ public static void setFontSize(int fsize) { fontSize = (fsize / 2) * 2; if (fontSize < 8) { fontSize = 8; } } /** sets the font size */ public static void setFontType(String ftype) { if (ftype != null) { fontType = ftype.trim(); } } /** returns the path of the H5toH5 converter */ public static String getH4toH5() { return h4toh5; }; /** returns the list of most recent files */ public static Vector getMRF() { return mrf; } /** returns the list of palette files */ public static Vector getPaletteList() { return paletteList; } public static Vector getSrbAccount() { return srbAccountList; } /** returns a list of treeview modules */ public static Vector getTreeViewList() { return moduleListTreeView; } /** returns a list of metadataview modules */ public static Vector getMetaDataViewList() { return moduleListMetaDataView; } /** returns a list of textview modules */ public static Vector getTextViewList() { return moduleListTextView; } /** returns a list of tableview modules */ public static Vector getTableViewList() { return moduleListTableView; } /** returns a list of imageview modules */ public static Vector getImageViewList() { return moduleListImageView; } /** returns a list of paletteview modules */ public static Vector getPaletteViewList() { return moduleListPaletteView; } /** returns a list of helpview modules */ public static Vector getHelpViewList() { return moduleListHelpView; } /** set the path of H5View User's guide */ public static void setUsersGuide(String str) { if ((str == null) || (str.length() <= 0)) { return; } usersGuide = str; } /** set the path of the H5to H5 converter */ public static void setH4toH5(String tool) { h4toh5 = tool; } /** set the path of the default work directory */ public static void setWorkDir(String wDir) { workDir = wDir; } /** set the file extension */ public static void setFileExtension(String ext) { fileExt = ext; } /** set the delimiter of data values */ public static void setDataDelimiter(String delim) { delimiter = delim; } /** set the image origin */ public static void setImageOrigin(String o) { origin = o; } /** set the index type */ public static void setIndexType(String idxType) { indexType = idxType; } /** set the index order */ public static void setIndexOrder(String idxOrder) { indexOrder = idxOrder; } /** * Current Java application such as HDFView cannot handle files with large * number of objects such 1,000,000 objects. setMaxMembers() sets the * maximum number of objects will be loaded into memory. * * @param n * the maximum number of objects to load into memory */ public static void setMaxMembers(int n) { max_members = n; } /** * Current Java application such as HDFView cannot handle files with large * number of objects such 1,000,000 objects. setStartMember() sets the * starting index of objects will be loaded into memory. * * @param idx * the maximum number of objects to load into memory */ public static void setStartMembers(int idx) { if (idx < 0) { idx = 0; } start_members = idx; } /** * Current Java application such as HDFView cannot handle files with large * number of objects such 1,000,000 objects. getMaxMembers() returns the * maximum number of objects will be loaded into memory. */ public static int getMaxMembers() { if (max_members < 0) return Integer.MAX_VALUE; // load the whole file return max_members; } /** * Current Java application such as HDFView cannot handle files with large * number of objects such 1,000,000 objects. getStartMembers() returns the * starting index of objects will be loaded into memory. */ public static int getStartMembers() { return start_members; } /** * Returns true if auto contrast is used in image process. * * @return true if auto contrast is used in image process; otherwise, * returns false. */ public static boolean isAutoContrast() { return isAutoContrast; } /** * Returns true if "show image values" is set. * * @return true if "show image values" is set; otherwise, returns false. */ public static boolean showImageValues() { return showImageValues; } /** * Set the flag to indicate if auto contrast is used in image process. * * @param b * the flag to indicate if auto contrast is used in image * process. */ public static void setAutoContrast(boolean b) { isAutoContrast = b; } /** * Set the flag to indicate if "show image values" is set. * * @param b * the flag to indicate if if "show image values" is set. */ public static void setShowImageValue(boolean b) { showImageValues = b; } /** * Returns true if default file access is read only. * * @return true if default file access is read only; otherwise, returns * false. */ public static boolean isReadOnly() { return isReadOnly; } /** * Set the flag to indicate if default file access is read only. * * @param b * the flag to indicate if default file access is read only. */ public static void setReadOnly(boolean b) { isReadOnly = b; } /** * Returns true if default lib version is the earliest. * * @return true if default lib version is the earliest; otherwise, returns * false. */ public static boolean isEarlyLib() { return isEarlyLib; } /** * Set the flag to indicate if default lib version is the earliest. * * @param b * the flag to indicate if default lib version is the earliest. */ public static void setEarlyLib(boolean b) { isEarlyLib = b; } /** * @return the convertEnum */ public static boolean isConvertEnum() { return convertEnum; } /** * @return the convertEnum */ public static boolean isIndexBase1() { return isIndexBase1; } /** * @param convertEnum * the convertEnum to set */ public static void setConvertEnum(boolean convertEnum) { ViewProperties.convertEnum = convertEnum; } /** * @param convertEnum * the convertEnum to set */ public static void setIndexBase1(boolean b) { ViewProperties.isIndexBase1 = b; } } jhdf-2.9/ncsa/hdf/view/TextView.java0000644000175000017500000000261212050301063020231 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; /** * * The text view interface for displaying text data * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public abstract interface TextView extends DataView { /** return array of the text in this textview */ public abstract String[] getText(); /** Write the change of a dataset into file. */ public abstract void updateValueInFile(); } jhdf-2.9/ncsa/hdf/view/NewImageDialog.java0000644000175000017500000002735212050301063021276 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import ncsa.hdf.object.DataFormat; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; /** * NewImageDialog shows a message dialog requesting user input for creating a * new HDF4/5 Image. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class NewImageDialog extends JDialog implements ActionListener, ItemListener { private static final long serialVersionUID = 6204900461720887966L; private JTextField nameField, widthField, heightField; private JComboBox parentChoice; private JRadioButton checkIndex, checkTrueColor, checkInterlacePixel, checkInterlacePlane; /** a list of current groups */ private List groupList; private boolean isH5; private HObject newObject; private FileFormat fileFormat; private final Toolkit toolkit; /** * Constructs NewImageDialog with specified list of possible parent groups. * * @param owner * the owner of the input * @param pGroup * the parent group which the new group is added to. * @param objs * the list of all objects. */ public NewImageDialog(Frame owner, Group pGroup, List objs) { super(owner, "New HDF Image...", true); newObject = null; isH5 = pGroup.getFileFormat().isThisType( FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); fileFormat = pGroup.getFileFormat(); toolkit = Toolkit.getDefaultToolkit(); parentChoice = new JComboBox(); groupList = new Vector(); Object obj = null; Iterator iterator = objs.iterator(); while (iterator.hasNext()) { obj = iterator.next(); if (obj instanceof Group) { groupList.add(obj); Group g = (Group) obj; if (g.isRoot()) { parentChoice.addItem(HObject.separator); } else { parentChoice.addItem(g.getPath() + g.getName() + HObject.separator); } } } if (pGroup.isRoot()) { parentChoice.setSelectedItem(HObject.separator); } else { parentChoice.setSelectedItem(pGroup.getPath() + pGroup.getName() + HObject.separator); } JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(10, 5, 5, 5)); int w = 400 + (ViewProperties.getFontSize() - 12) * 15; int h = 250 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton okButton = new JButton(" Ok "); okButton.setActionCommand("Ok"); okButton.setMnemonic(KeyEvent.VK_O); okButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.setActionCommand("Cancel"); cancelButton.addActionListener(this); // set OK and CANCEL buttons JPanel buttonPanel = new JPanel(); buttonPanel.add(okButton); buttonPanel.add(cancelButton); contentPane.add(buttonPanel, BorderLayout.SOUTH); // set name, parent, width and height panel JPanel centerP = new JPanel(); centerP.setLayout(new BorderLayout(5, 5)); JPanel tmpP = new JPanel(); tmpP.setLayout(new GridLayout(6, 1, 5, 5)); tmpP.add(new JLabel("Image name: ")); tmpP.add(new JLabel("Parent group: ")); tmpP.add(new JLabel("Height: ")); tmpP.add(new JLabel("Width: ")); tmpP.add(new JLabel("Image type: ")); tmpP.add(new JLabel("Data layout: ")); centerP.add(tmpP, BorderLayout.WEST); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(6, 1, 5, 5)); tmpP.add(nameField = new JTextField()); tmpP.add(parentChoice); tmpP.add(heightField = new JTextField()); tmpP.add(widthField = new JTextField()); JPanel tmpP0 = new JPanel(); tmpP0.setLayout(new GridLayout(1, 2)); tmpP0.add(checkIndex = new JRadioButton("Indexed colormap", true)); tmpP0.add(checkTrueColor = new JRadioButton("24-bit truecolor")); tmpP0.setBorder(new TitledBorder("")); tmpP.add(tmpP0); tmpP0 = new JPanel(); tmpP0.setLayout(new GridLayout(1, 2)); tmpP0.add(checkInterlacePixel = new JRadioButton("Pixel interlace")); tmpP0.add(checkInterlacePlane = new JRadioButton("Plane interlace")); tmpP0.setBorder(new TitledBorder("")); tmpP.add(tmpP0); centerP.add(tmpP, BorderLayout.CENTER); ButtonGroup bgroup = new ButtonGroup(); bgroup.add(checkInterlacePixel); bgroup.add(checkInterlacePlane); bgroup = new ButtonGroup(); bgroup.add(checkTrueColor); bgroup.add(checkIndex); checkIndex.addItemListener(this); checkTrueColor.addItemListener(this); checkInterlacePixel.setSelected(true); checkInterlacePixel.setEnabled(false); checkInterlacePlane.setEnabled(false); centerP.setBorder(new TitledBorder("")); contentPane.add(centerP, BorderLayout.CENTER); // locate the H5Property dialog Point l = owner.getLocation(); l.x += 250; l.y += 80; setLocation(l); validate(); pack(); } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Ok")) { newObject = createHDFimage(); if (newObject != null) { dispose(); } } if (cmd.equals("Cancel")) { newObject = null; dispose(); ((Vector) groupList).setSize(0); } } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source.equals(checkIndex)) { checkInterlacePixel.setSelected(true); checkInterlacePixel.setEnabled(false); checkInterlacePlane.setEnabled(false); } else if (source.equals(checkTrueColor)) { checkInterlacePixel.setEnabled(true); checkInterlacePlane.setEnabled(true); } } private Dataset createHDFimage() { Dataset dataset = null; String name = nameField.getText(); if (name != null) { name = name.trim(); } if ((name == null) || (name.length() <= 0)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Dataset name is not specified.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (name.indexOf(HObject.separator) >= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Dataset name cannot contain path.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } Group pgroup = (Group) groupList.get(parentChoice.getSelectedIndex()); if (pgroup == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Select a parent group.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } int w = 0, h = 0; try { w = Integer.parseInt(widthField.getText()); h = Integer.parseInt(heightField.getText()); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } long[] dims = null; int tclass = Datatype.CLASS_CHAR; int tsign = Datatype.SIGN_NONE; int tsize = 1; int torder = Datatype.NATIVE; int interlace = ScalarDS.INTERLACE_PIXEL; int ncomp = 2; if (checkIndex.isSelected()) { // indexed colormap if (isH5) { long[] tmpdims = { h, w }; dims = tmpdims; } else { long[] tmpdims = { w, h }; dims = tmpdims; } } else { // true color image if (isH5) { // HDF5 true color image if (checkInterlacePixel.isSelected()) { long[] tmpdims = { h, w, 3 }; dims = tmpdims; } else { interlace = ScalarDS.INTERLACE_PLANE; long[] tmpdims = { 3, h, w }; dims = tmpdims; } } else { // HDF4 true color image ncomp = 3; long[] tmpdims = { w, h }; dims = tmpdims; if (checkInterlacePlane.isSelected()) { interlace = ScalarDS.INTERLACE_PLANE; } } } try { Datatype datatype = fileFormat.createDatatype(tclass, tsize, torder, tsign); dataset = fileFormat.createImage(name, pgroup, datatype, dims, dims, null, -1, ncomp, interlace, null); dataset.init(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } return dataset; } /** Returns the new dataset created. */ public DataFormat getObject() { return newObject; } /** Returns the parent group of the new dataset. */ public Group getParentGroup() { return (Group) groupList.get(parentChoice.getSelectedIndex()); } } jhdf-2.9/ncsa/hdf/view/DefaultTreeView.java0000755000175000017500000025777112050301063021536 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.GridLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.Serializable; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.BitSet; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButton; import javax.swing.JSeparator; import javax.swing.JTree; import javax.swing.border.BevelBorder; import javax.swing.border.SoftBevelBorder; import javax.swing.border.TitledBorder; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; import ncsa.hdf.view.ViewProperties.DATA_VIEW_KEY; /** * *

    * TreeView defines APIs for open a file and display the file structure in tree * structure. *

    * *

    * TreeView uses folders and leaf nodes to represent groups and data objects in * the file. You can expand or collapse folders to navigate data objects in the * file. *

    * *

    * From the TreeView, you can open data content or metadata of selected object. * You can selet object(s) to delete or add new object to the file. *

    * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class DefaultTreeView extends JPanel implements TreeView, ActionListener { private static final long serialVersionUID = 4092566164712521186L; /** the owner of this treeview */ private ViewManager viewer; /** * The super root of tree: all open files start at this root. */ private final DefaultMutableTreeNode root; /** * The tree which holds file structures. */ private final JTree tree; /** * The tree model */ private final DefaultTreeModel treeModel; /** A list open files. */ private final List fileList; private final Toolkit toolkit; /** Selected file */ private FileFormat selectedFile; /** The current selected node. */ private DefaultMutableTreeNode selectedNode; /** The current selected TreePath. */ private TreePath selectedTreePath; /** the current selected object */ private HObject selectedObject; /** flag to indicate if the dataset is displayed as default */ private boolean isDefaultDisplay; /** * The popup menu used to display user choice of actions on data object. */ private final JPopupMenu popupMenu; private JSeparator separator; /** a list of editing GUI components */ private List editGUIs; /** the list of current selected objects */ private List objectsToCopy; private JMenuItem addTableMenuItem, addDatasetMenuItem; private JMenuItem addDatatypeMenuItem; private JMenuItem addLinkMenuItem; private JMenuItem setLibVerBoundsItem; private JMenuItem changeIndexItem; private String currentSearchPhrase = null; private boolean moveFlag; private TreePath[] currentSelectionsForMove; private boolean isApplyBitmaskOnly = false; private int currentIndexType; private int currentIndexOrder; public DefaultTreeView(ViewManager theView) { viewer = theView; root = new DefaultMutableTreeNode() { private static final long serialVersionUID = -6829919815424470510L; public boolean isLeaf() { return false; } }; fileList = new Vector(); toolkit = Toolkit.getDefaultToolkit(); editGUIs = new Vector(); objectsToCopy = null; isDefaultDisplay = true; selectedTreePath = null; selectedNode = null; moveFlag = false; currentSelectionsForMove = null; addDatasetMenuItem = new JMenuItem("Dataset", ViewProperties.getDatasetIcon()); addDatasetMenuItem.addActionListener(this); addDatasetMenuItem.setActionCommand("Add dataset"); addTableMenuItem = new JMenuItem("Compound DS", ViewProperties.getTableIcon()); addTableMenuItem.addActionListener(this); addTableMenuItem.setActionCommand("Add table"); addDatatypeMenuItem = new JMenuItem("Datatype", ViewProperties.getDatatypeIcon()); addDatatypeMenuItem.addActionListener(this); addDatatypeMenuItem.setActionCommand("Add datatype"); addLinkMenuItem = new JMenuItem("Link", ViewProperties.getLinkIcon()); addLinkMenuItem.addActionListener(this); addLinkMenuItem.setActionCommand("Add link"); setLibVerBoundsItem = new JMenuItem("Set Lib version bounds"); setLibVerBoundsItem.addActionListener(this); setLibVerBoundsItem.setActionCommand("Set Lib version bounds"); changeIndexItem = new JMenuItem("Change file indexing"); changeIndexItem.addActionListener(this); changeIndexItem.setActionCommand("Change file indexing"); // initialize the tree and root treeModel = new DefaultTreeModel(root); tree = new JTree(treeModel); tree.setLargeModel(true); tree.setCellRenderer(new HTreeCellRenderer()); tree.addMouseListener(new HTreeMouseAdapter()); tree.addKeyListener(new HTreeKeyAdapter()); tree.setRootVisible(false); // tree.setShowsRootHandles(true); int rowheight = 23 + (int) ((tree.getFont().getSize() - 12) * 0.5); tree.setRowHeight(rowheight); // create the separator separator = new JPopupMenu.Separator(); // create the popupmenu popupMenu = createPopupMenu(); // reset the scroll increament // layout GUI component this.setLayout(new BorderLayout()); this.add(tree, BorderLayout.CENTER); } /** * Insert a node into the tree. * * @param node * the node to insert. * @param pnode * the parent node. */ private void insertNode(TreeNode node, TreeNode pnode) { if ((node == null) || (pnode == null)) { return; } treeModel.insertNodeInto((DefaultMutableTreeNode) node, (DefaultMutableTreeNode) pnode, pnode.getChildCount()); } /** * Checks if a file is already open. */ private boolean isFileOpen(String filename) { boolean isOpen = false; // find the file by matching its file name and close the file FileFormat theFile = null; Iterator iterator = fileList.iterator(); while (iterator.hasNext()) { theFile = iterator.next(); if (theFile.getFilePath().equals(filename)) { isOpen = true; break; } } // while(iterator.hasNext()) return isOpen; } /** creates a popup menu for a right mouse click on a data object */ private JPopupMenu createPopupMenu() { JPopupMenu menu = new JPopupMenu(); JMenuItem item; item = new JMenuItem("Open"); item.setMnemonic(KeyEvent.VK_O); item.addActionListener(this); item.setActionCommand("Open data"); menu.add(item); item = new JMenuItem("Open As"); item.setMnemonic(KeyEvent.VK_A); item.addActionListener(this); item.setActionCommand("Open data as"); menu.add(item); menu.addSeparator(); JMenu newOjbectMenu = new JMenu("New"); menu.add(newOjbectMenu); editGUIs.add(newOjbectMenu); item = new JMenuItem("Group", ViewProperties.getFoldercloseIcon()); item.addActionListener(this); item.setActionCommand("Add group"); newOjbectMenu.add(item); newOjbectMenu.add(addDatasetMenuItem); item = new JMenuItem("Image", ViewProperties.getImageIcon()); item.addActionListener(this); item.setActionCommand("Add image"); newOjbectMenu.add(item); newOjbectMenu.add(addTableMenuItem); newOjbectMenu.add(addDatatypeMenuItem); newOjbectMenu.add(addLinkMenuItem); menu.addSeparator(); item = new JMenuItem("Copy"); item.setMnemonic(KeyEvent.VK_C); item.addActionListener(this); item.setActionCommand("Copy object"); menu.add(item); item = new JMenuItem("Paste"); item.setMnemonic(KeyEvent.VK_P); item.addActionListener(this); item.setActionCommand("Paste object"); menu.add(item); editGUIs.add(item); item = new JMenuItem("Delete"); item.setMnemonic(KeyEvent.VK_D); item.addActionListener(this); item.setActionCommand("Cut object"); menu.add(item); editGUIs.add(item); item = new JMenuItem("Cut"); item.setMnemonic(KeyEvent.VK_T); item.addActionListener(this); item.setActionCommand("Move object"); menu.add(item); editGUIs.add(item); menu.addSeparator(); item = new JMenuItem("Save to"); item.setMnemonic(KeyEvent.VK_S); item.addActionListener(this); item.setActionCommand("Save object to file"); menu.add(item); item = new JMenuItem("Rename"); item.setMnemonic(KeyEvent.VK_R); item.addActionListener(this); item.setActionCommand("Rename object"); menu.add(item); editGUIs.add(item); menu.addSeparator(); item = new JMenuItem("Show Properties"); item.addActionListener(this); item.setActionCommand("Show object properties"); menu.add(item); item = new JMenuItem("Show Properties As"); item.addActionListener(this); item.setActionCommand("Show object properties as"); menu.add(item); menu.add(changeIndexItem); menu.addSeparator(); item = new JMenuItem("Find"); item.setMnemonic(KeyEvent.VK_F); item.addActionListener(this); item.setActionCommand("Find"); menu.add(item); // item = new JMenuItem( "Find Next"); // item.setMnemonic(KeyEvent.VK_N); // item.addActionListener(this); // item.setActionCommand("Find next"); // menu.add(item); menu.addSeparator(); item = new JMenuItem("Expand All"); item.addActionListener(this); item.setActionCommand("Expand all"); menu.add(item); item = new JMenuItem("Collapse All"); item.addActionListener(this); item.setActionCommand("Collapse all"); menu.add(item); menu.addSeparator(); item = new JMenuItem("Close File"); item.setMnemonic(KeyEvent.VK_E); item.addActionListener(this); item.setActionCommand("Close file"); menu.add(item); item = new JMenuItem("Reload File"); // item.setMnemonic(KeyEvent.VK_R); item.addActionListener(this); item.setActionCommand("Reload file"); menu.add(item); menu.add(separator); menu.add(setLibVerBoundsItem); return menu; } /** display the popupmenu of data properties */ private void showPopupMenu(MouseEvent e) { int x = e.getX(); int y = e.getY(); HObject selectedObject = ((HObject) (selectedNode.getUserObject())); boolean isReadOnly = selectedObject.getFileFormat().isReadOnly(); setEnabled(editGUIs, !isReadOnly); boolean isWritable = !selectedObject.getFileFormat().isReadOnly(); if (selectedObject instanceof Group) { popupMenu.getComponent(0).setEnabled(false); // "open" menuitem popupMenu.getComponent(1).setEnabled(false); // "open as" menuitem boolean state = !(((Group) selectedObject).isRoot()); popupMenu.getComponent(5).setEnabled(state); // "Copy" menuitem popupMenu.getComponent(6).setEnabled(isWritable); // "Paste" // menuitem popupMenu.getComponent(7).setEnabled(state && isWritable); // "Delete" // menuitem popupMenu.getComponent(10).setEnabled(state); // "save to" menuitem popupMenu.getComponent(11).setEnabled(state && isWritable); // "rename" // menuitem popupMenu.getComponent(8).setEnabled( (selectedObject.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5))) && state && isWritable); // "cut" menuitem } else { popupMenu.getComponent(0).setEnabled(true); popupMenu.getComponent(1).setEnabled(true); popupMenu.getComponent(5).setEnabled(true); // "Copy" menuitem popupMenu.getComponent(6).setEnabled(isWritable); // "Paste" // menuitem popupMenu.getComponent(7).setEnabled(isWritable); // "Delete" // menuitem popupMenu.getComponent(10).setEnabled(true); // "save to" menuitem popupMenu.getComponent(11).setEnabled(isWritable); // "rename" // menuitem popupMenu.getComponent(8).setEnabled( (selectedObject.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5))) && isWritable); // "cut" menuitem } // adding table is only supported by HDF5 if ((selectedFile != null) && selectedFile.isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5))) { addDatasetMenuItem.setText("Dataset"); addTableMenuItem.setVisible(true); addDatatypeMenuItem.setVisible(true); addLinkMenuItem.setVisible(true); boolean state = false; if ((selectedObject instanceof Group)) { state = (((Group) selectedObject).isRoot()); separator.setVisible(isWritable && state); setLibVerBoundsItem.setVisible(isWritable && state); // added // only if // it is // HDF5format, // iswritable // & isroot } else { separator.setVisible(false); setLibVerBoundsItem.setVisible(false); } changeIndexItem.setVisible(state); } else { addDatasetMenuItem.setText("SDS"); addTableMenuItem.setVisible(false); addDatatypeMenuItem.setVisible(false); addLinkMenuItem.setVisible(false); separator.setVisible(false); setLibVerBoundsItem.setVisible(false); changeIndexItem.setVisible(false); } popupMenu.show((JComponent) e.getSource(), x, y); } /** disable/enable GUI components */ private static void setEnabled(List list, boolean b) { Component item = null; Iterator it = list.iterator(); while (it.hasNext()) { item = it.next(); item.setEnabled(b); } } /** * Save the current file into HDF4. Since HDF4 does not support packing. The * source file is copied into the new file with the exact same content. */ private final void saveAsHDF4(FileFormat srcFile) { if (srcFile == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Select a file to save.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } JFrame owner = (viewer == null) ? new JFrame() : (JFrame) viewer; String currentDir = srcFile.getParent(); NewFileDialog dialog = new NewFileDialog(owner, currentDir, FileFormat.FILE_TYPE_HDF4, getCurrentFiles()); // dialog.show(); if (!dialog.isFileCreated()) { return; } String filename = dialog.getFile(); // since cannot pack hdf4, simple copy the whole phyisical file int length = 0; int bsize = 512; byte[] buffer; BufferedInputStream bi = null; BufferedOutputStream bo = null; try { bi = new BufferedInputStream(new FileInputStream(srcFile.getFilePath())); } catch (Exception ex) { toolkit.beep(); JOptionPane .showMessageDialog(this, ex.getMessage() + "\n" + filename, "HDFView", JOptionPane.ERROR_MESSAGE); return; } try { bo = new BufferedOutputStream(new FileOutputStream(filename)); } catch (Exception ex) { try { bi.close(); } catch (Exception ex2) { } toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); return; } buffer = new byte[bsize]; try { length = bi.read(buffer, 0, bsize); } catch (Exception ex) { length = 0; } while (length > 0) { try { bo.write(buffer, 0, length); length = bi.read(buffer, 0, bsize); } catch (Exception ex) { length = 0; } } try { bo.flush(); } catch (Exception ex) { } try { bi.close(); } catch (Exception ex) { } try { bo.close(); } catch (Exception ex) { } try { openFile(filename, FileFormat.WRITE); } catch (Exception ex) { toolkit.beep(); JOptionPane .showMessageDialog(this, ex.getMessage() + "\n" + filename, "HDFView", JOptionPane.ERROR_MESSAGE); } } /** * Copy the current file into a new file. The new file does not include the * inaccessible objects. Values of reference dataset are not updated in the * new file. */ private void saveAsHDF5(FileFormat srcFile) { if (srcFile == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Select a file to save.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } TreeNode root = srcFile.getRootNode(); if (root == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "The file is empty.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } JFrame owner = (viewer == null) ? new JFrame() : (JFrame) viewer; NewFileDialog dialog = new NewFileDialog(owner, srcFile.getParent(), FileFormat.FILE_TYPE_HDF5, getCurrentFiles()); // dialog.show(); if (!dialog.isFileCreated()) { return; } String filename = dialog.getFile(); int n = root.getChildCount(); Vector objList = new Vector(n); DefaultMutableTreeNode node = null; for (int i = 0; i < n; i++) { node = (DefaultMutableTreeNode) root.getChildAt(i); objList.add(node.getUserObject()); } FileFormat newFile = null; try { newFile = openFile(filename, FileFormat.WRITE); } catch (Exception ex) { toolkit.beep(); JOptionPane .showMessageDialog(this, ex.getMessage() + "\n" + filename, "HDFView", JOptionPane.ERROR_MESSAGE); return; } if (newFile == null) { return; } TreeNode pnode = newFile.getRootNode(); pasteObject(objList, pnode, newFile); objList.setSize(0); Group srcGroup = (Group) ((DefaultMutableTreeNode) root).getUserObject(); Group dstGroup = (Group) ((DefaultMutableTreeNode) newFile.getRootNode()).getUserObject(); Object[] parameter = new Object[2]; Class classHOjbect = null; Class[] parameterClass = new Class[2]; Method method = null; // copy attributes of the root group try { parameter[0] = srcGroup; parameter[1] = dstGroup; classHOjbect = Class.forName("ncsa.hdf.object.HObject"); parameterClass[0] = parameterClass[1] = classHOjbect; method = newFile.getClass().getMethod("copyAttributes", parameterClass); method.invoke(newFile, parameter); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); } // update reference datasets parameter[0] = srcGroup.getFileFormat(); parameter[1] = newFile; parameterClass[0] = parameterClass[1] = parameter[0].getClass(); try { method = newFile.getClass().getMethod("updateReferenceDataset", parameterClass); method.invoke(newFile, parameter); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); } } /** copy selected objects */ private void copyObject() { objectsToCopy = getSelectedObjects(); moveFlag = false; } /** move selected objects */ private void moveObject() { objectsToCopy = getSelectedObjects(); moveFlag = true; currentSelectionsForMove = tree.getSelectionPaths(); } /** paste selected objects */ private void pasteObject() { if (moveFlag == true) { HObject theObj = null; for (int i = 0; i < currentSelectionsForMove.length; i++) { DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelectionsForMove[i] .getLastPathComponent()); theObj = (HObject) currentNode.getUserObject(); if (isObjectOpen(theObj)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Cannot move the selected object: " + theObj + "\nThe dataset or dataset in the group is in use." + "\n\nPlease close the dataset(s) and try again.\n", "HDFView", JOptionPane.ERROR_MESSAGE); moveFlag = false; currentSelectionsForMove = null; objectsToCopy = null; return; } } } TreeNode pnode = selectedNode; if ((objectsToCopy == null) || (objectsToCopy.size() <= 0) || (pnode == null)) { return; } FileFormat srcFile = ((HObject) objectsToCopy.get(0)).getFileFormat(); FileFormat dstFile = getSelectedFile(); FileFormat h5file = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); FileFormat h4file = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4); if (srcFile == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Source file is null.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } else if (dstFile == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Destination file is null.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } else if (srcFile.isThisType(h4file) && dstFile.isThisType(h5file)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unsupported operation: cannot copy HDF4 object to HDF5 file", "HDFView", JOptionPane.ERROR_MESSAGE); return; } else if (srcFile.isThisType(h5file) && dstFile.isThisType(h4file)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unsupported operation: cannot copy HDF5 object to HDF4 file", "HDFView", JOptionPane.ERROR_MESSAGE); return; } if (moveFlag == true) { if (srcFile != dstFile) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Cannot move the selected object to different file", "HDFView", JOptionPane.ERROR_MESSAGE); moveFlag = false; currentSelectionsForMove = null; objectsToCopy = null; return; } } if (pnode.isLeaf()) { pnode = pnode.getParent(); } Group pgroup = (Group) ((DefaultMutableTreeNode) pnode).getUserObject(); String fullPath = pgroup.getPath() + pgroup.getName(); if (pgroup.isRoot()) { fullPath = HObject.separator; } String msg = ""; int msgType = JOptionPane.QUESTION_MESSAGE; if (srcFile.isThisType(h4file)) { msg = "WARNING: object can not be deleted after it is copied.\n\n"; msgType = JOptionPane.WARNING_MESSAGE; } msg += "Do you want to copy the selected object(s) to \nGroup: " + fullPath + "\nFile: " + dstFile.getFilePath(); int op = -1; if (moveFlag == true) { String moveMsg = "Do you want to paste the selected object(s) to \nGroup: " + fullPath + "\nFile: " + dstFile.getFilePath(); op = JOptionPane.showConfirmDialog(this, moveMsg, "Copy object", JOptionPane.YES_NO_OPTION, msgType); } else { op = JOptionPane.showConfirmDialog(this, msg, "Copy object", JOptionPane.YES_NO_OPTION, msgType); } if (op == JOptionPane.NO_OPTION) { return; } pasteObject(objectsToCopy, pnode, dstFile); // objectsToCopy = null; if (moveFlag == true) { removeSelectedObjects(); moveFlag = false; currentSelectionsForMove = null; objectsToCopy = null; } } /** paste selected objects */ private void pasteObject(List objList, TreeNode pnode, FileFormat dstFile) { if ((objList == null) || (objList.size() <= 0) || (pnode == null)) { return; } ((HObject) objList.get(0)).getFileFormat(); Group pgroup = (Group) ((DefaultMutableTreeNode) pnode).getUserObject(); HObject theObj = null; TreeNode newNode = null; Iterator iterator = objList.iterator(); while (iterator.hasNext()) { newNode = null; theObj = (HObject) iterator.next(); if ((theObj instanceof Group) && ((Group) theObj).isRoot()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unsupported operation: cannot copy the root group", "HDFView", JOptionPane.ERROR_MESSAGE); return; } // check if it creates infinite loop Group pg = pgroup; while (!pg.isRoot()) { if (theObj.equals(pg)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unsupported operation: cannot copy a group to itself.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } pg = pg.getParent(); } try { newNode = dstFile.copy(theObj, pgroup, null); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); // newNode = null; } // add the node to the tree if (newNode != null) { insertNode(newNode, pnode); } } // while (iterator.hasNext()) } private void removeSelectedObjects() { FileFormat theFile = getSelectedFile(); if (theFile.isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4))) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unsupported operation: cannot delete HDF4 object.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } TreePath[] currentSelections = tree.getSelectionPaths(); if (moveFlag == true) { currentSelections = currentSelectionsForMove; } if ((currentSelections == null) || (currentSelections.length <= 0)) { return; } if (moveFlag != true) { int op = JOptionPane.showConfirmDialog(this, "Do you want to remove all the selected object(s) ?", "Remove object", JOptionPane.YES_NO_OPTION); if (op == JOptionPane.NO_OPTION) { return; } } HObject theObj = null; for (int i = 0; i < currentSelections.length; i++) { DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelections[i].getLastPathComponent()); theObj = (HObject) currentNode.getUserObject(); // cannot delete root if (theObj instanceof Group) { Group g = (Group) theObj; if (g.isRoot()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unsupported operation: cannot delete the file root.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } } if (moveFlag != true) { if (isObjectOpen(theObj)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Cannot delete the selected object: " + theObj + "\nThe dataset or dataset in the group is in use." + "\n\nPlease close the dataset(s) and try again.\n", "HDFView", JOptionPane.ERROR_MESSAGE); continue; } } try { theFile.delete(theObj); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); continue; } if (theObj.equals(selectedObject)) { selectedObject = null; } removeNode(currentNode); } // for (int i=0; i< currentSelections.length; i++) { } private void removeNode(DefaultMutableTreeNode node) { if (node == null) { return; } DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) (node.getParent()); if (parentNode != null) { treeModel.removeNodeFromParent(node); // add the two lines to fix bug in HDFView 1.2. Delete a subgroup // and // then copy the group to another group, the deleted group still // exists. Group pgroup = (Group) parentNode.getUserObject(); pgroup.removeFromMemberList((HObject) node.getUserObject()); if (node.equals(selectedNode)) { selectedNode = null; selectedFile = null; } } // if (parentNode != null) { } private boolean isObjectOpen(HObject obj) { boolean isOpen = false; if (obj instanceof Group) { Group g = (Group) obj; List members = g.getMemberList(); if ((members == null) || (members.size() == 0)) { isOpen = false; } else { int n = members.size(); for (int i = 0; i < n; i++) { HObject theObj = (HObject) members.get(i); isOpen = (viewer.getDataView(theObj) != null); if (isOpen) { break; } } } } else { if (viewer.getDataView(obj) == null) { isOpen = false; } else { isOpen = true; } } return isOpen; } /** * Returns a list of all user objects that traverses the subtree rooted at * this node in breadth-first order.. * * @param node * the node to start with. */ private final List breadthFirstUserObjects(TreeNode node) { if (node == null) { return null; } Vector list = new Vector(); DefaultMutableTreeNode theNode = null; Enumeration local_enum = ((DefaultMutableTreeNode) node).breadthFirstEnumeration(); while (local_enum.hasMoreElements()) { theNode = (DefaultMutableTreeNode) local_enum.nextElement(); list.add(theNode.getUserObject()); } return list; } /** * Find first object that is matched by name. * * @param objName * -- the object name. * @return the object if found, otherwise, returns null. */ private final static HObject find(String objName, TreePath treePath, JTree tree) { HObject retObj = null; boolean isFound = false, isPrefix = false, isSuffix = false, isContain = false; if (objName == null || objName.length() <= 0 || treePath == null) { return null; } if (objName.equals("*")) return null; if (objName.startsWith("*")) { isSuffix = true; objName = objName.substring(1, objName.length()); } if (objName.endsWith("*")) { isPrefix = true; objName = objName.substring(0, objName.length() - 1); } if (isPrefix && isSuffix) { isContain = true; isPrefix = isSuffix = false; } if (objName == null || objName.length() <= 0) return null; DefaultMutableTreeNode node = (DefaultMutableTreeNode) treePath.getLastPathComponent(); if (node == null) return null; HObject obj = null; String theName = null; DefaultMutableTreeNode theNode = null; Enumeration local_enum = node.breadthFirstEnumeration(); while (local_enum.hasMoreElements()) { theNode = (DefaultMutableTreeNode) local_enum.nextElement(); obj = (HObject) theNode.getUserObject(); if (obj != null && (theName = obj.getName()) != null) { if (isPrefix) isFound = theName.startsWith(objName); else if (isSuffix) isFound = theName.endsWith(objName); else if (isContain) isFound = theName.contains(objName); else isFound = theName.equals(objName); if (isFound) { retObj = obj; break; } } } if (retObj != null) { TreePath dstPath = getTreePath(treePath, theNode, 0); // tree.fireTreeExpanded(dstPath) ; tree.setSelectionPath(dstPath); tree.scrollPathToVisible(dstPath); } return retObj; } /** * Get the TreePath from the parent to the target node. * * @param parent * -- the parent TreePath * @param node * -- the target node * @param depth * @return the tree path if target node found, otherwise; returns null; */ private static TreePath getTreePath(TreePath parent, TreeNode node, int depth) { if (node == null || parent == null || depth < 0) return null; TreeNode theNode = (TreeNode) parent.getLastPathComponent(); if (node == theNode) return parent; if (theNode.getChildCount() >= 0) { for (Enumeration e = theNode.children(); e.hasMoreElements();) { TreeNode n = (TreeNode) e.nextElement(); TreePath path = parent.pathByAddingChild(n); TreePath result = getTreePath(path, node, depth + 1); if (result != null) { return result; } } } return null; } private void addGroup() { if ((selectedObject == null) || (selectedNode == null)) { return; } Group pGroup = null; if (selectedObject instanceof Group) { pGroup = (Group) selectedObject; } else { pGroup = (Group) ((DefaultMutableTreeNode) selectedNode.getParent()).getUserObject(); } NewGroupDialog dialog = new NewGroupDialog((JFrame) viewer, pGroup, breadthFirstUserObjects(selectedObject.getFileFormat().getRootNode())); dialog.setVisible(true); HObject obj = (HObject) dialog.getObject(); if (obj == null) { return; } Group pgroup = dialog.getParentGroup(); try { this.addObject(obj, pgroup); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); return; } } private void addDataset() { if ((selectedObject == null) || (selectedNode == null)) { return; } Group pGroup = null; if (selectedObject instanceof Group) { pGroup = (Group) selectedObject; } else { pGroup = (Group) ((DefaultMutableTreeNode) selectedNode.getParent()).getUserObject(); } NewDatasetDialog dialog = new NewDatasetDialog((JFrame) viewer, pGroup, breadthFirstUserObjects(selectedObject.getFileFormat().getRootNode())); dialog.setVisible(true); HObject obj = (HObject) dialog.getObject(); if (obj == null) { return; } Group pgroup = dialog.getParentGroup(); try { addObject(obj, pgroup); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); return; } } private void addImage() { if ((selectedObject == null) || (selectedNode == null)) { return; } Group pGroup = null; if (selectedObject instanceof Group) { pGroup = (Group) selectedObject; } else { pGroup = (Group) ((DefaultMutableTreeNode) selectedNode.getParent()).getUserObject(); } NewImageDialog dialog = new NewImageDialog((JFrame) viewer, pGroup, breadthFirstUserObjects(selectedObject .getFileFormat().getRootNode())); dialog.setVisible(true); HObject obj = (HObject) dialog.getObject(); if (obj == null) { return; } Group pgroup = dialog.getParentGroup(); try { this.addObject(obj, pgroup); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); return; } } private void addTable() { if ((selectedObject == null) || (selectedNode == null)) { return; } Group pGroup = null; if (selectedObject instanceof Group) { pGroup = (Group) selectedObject; } else { pGroup = (Group) ((DefaultMutableTreeNode) selectedNode.getParent()).getUserObject(); } NewTableDataDialog dialog = new NewTableDataDialog((JFrame) viewer, pGroup, breadthFirstUserObjects(selectedObject.getFileFormat().getRootNode())); dialog.setVisible(true); HObject obj = (HObject) dialog.getObject(); if (obj == null) { return; } Group pgroup = dialog.getParentGroup(); try { addObject(obj, pgroup); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); return; } } private void addDatatype() { if ((selectedObject == null) || (selectedNode == null)) { return; } Group pGroup = null; if (selectedObject instanceof Group) { pGroup = (Group) selectedObject; } else { pGroup = (Group) ((DefaultMutableTreeNode) selectedNode.getParent()).getUserObject(); } NewDatatypeDialog dialog = new NewDatatypeDialog((JFrame) viewer, pGroup, breadthFirstUserObjects(selectedObject.getFileFormat().getRootNode())); dialog.setVisible(true); HObject obj = (HObject) dialog.getObject(); if (obj == null) { return; } Group pgroup = dialog.getParentGroup(); try { addObject(obj, pgroup); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); return; } } private void addLink() { if ((selectedObject == null) || (selectedNode == null)) { return; } Group pGroup = null; if (selectedObject instanceof Group) { pGroup = (Group) selectedObject; } else { pGroup = (Group) ((DefaultMutableTreeNode) selectedNode.getParent()).getUserObject(); } NewLinkDialog dialog = new NewLinkDialog((JFrame) viewer, pGroup, breadthFirstUserObjects(selectedObject .getFileFormat().getRootNode())); dialog.setVisible(true); HObject obj = (HObject) dialog.getObject(); if (obj == null) { return; } Group pgroup = dialog.getParentGroup(); try { addObject(obj, pgroup); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); return; } } private void renameObject() { if (selectedObject == null) { return; } if ((selectedObject instanceof Group) && ((Group) selectedObject).isRoot()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Cannot rename the root.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } boolean isH4 = selectedObject.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4)); if (isH4) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Cannot rename HDF4 object.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } String oldName = selectedObject.getName(); String newName = (String) JOptionPane.showInputDialog(this, "Rename \"" + oldName + "\" to:", "Rename...", JOptionPane.INFORMATION_MESSAGE, null, null, oldName); if (newName == null) { return; } newName = newName.trim(); if ((newName == null) || (newName.length() == 0) || newName.equals(oldName)) { return; } try { selectedObject.setName(newName); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage(), "HDFView", JOptionPane.ERROR_MESSAGE); } } private void setLibVersionBounds() { Object[] lowValues = { "Earliest", "Latest" }; Object[] highValues = { "Latest" }; JComboBox lowComboBox = new JComboBox(lowValues); JComboBox highComboBox = new JComboBox(highValues); Object[] msg = { "Earliest Version:", lowComboBox, "Latest Version:", highComboBox }; Object[] options = { "Ok", "Cancel" }; JOptionPane op = new JOptionPane(msg, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, options); JDialog dialog = op.createDialog(this, "Set the library version bounds: "); dialog.setVisible(true); String result = null; try { result = (String) op.getValue(); } catch (Exception err) { // err.printStackTrace(); } if ((result != null) && (result.equals("Ok"))) { int low = -1; int high = 1; if ((lowComboBox.getSelectedItem()).equals("Earliest")) low = 0; else low = 1; try { selectedObject.getFileFormat().setLibBounds(low, high); } catch (Throwable err) { toolkit.beep(); JOptionPane.showMessageDialog(this, err, "Error when setting lib version bounds", JOptionPane.ERROR_MESSAGE); return; } } else return; } // Implementing java.io.ActionListener public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Close file")) { ((HDFView) viewer).actionPerformed(e); } else if (cmd.equals("Reload file")) { ((HDFView) viewer).actionPerformed(e); } else if (cmd.equals("Add group")) { addGroup(); } else if (cmd.equals("Add dataset")) { addDataset(); } else if (cmd.equals("Add image")) { addImage(); } else if (cmd.equals("Add table")) { addTable(); } else if (cmd.equals("Add datatype")) { addDatatype(); } else if (cmd.equals("Add link")) { addLink(); } else if (cmd.startsWith("Open data")) { if (cmd.equals("Open data")) { isDefaultDisplay = true; } else { isDefaultDisplay = false; } try { showDataContent(selectedObject); } catch (Throwable err) { toolkit.beep(); JOptionPane.showMessageDialog(this, err, "HDFView", JOptionPane.ERROR_MESSAGE); return; } } else if (cmd.equals("Copy object")) { copyObject(); } else if (cmd.equals("Paste object")) { pasteObject(); } else if (cmd.equals("Cut object")) { removeSelectedObjects(); } else if (cmd.equals("Move object")) { moveObject(); } else if (cmd.equals("Save object to file")) { if (selectedObject == null) { return; } if ((selectedObject instanceof Group) && ((Group) selectedObject).isRoot()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Cannot save the root group.\nUse \"Save As\" from file menu to save the whole file", "HDFView", JOptionPane.ERROR_MESSAGE); return; } String filetype = FileFormat.FILE_TYPE_HDF4; boolean isH5 = selectedObject.getFileFormat().isThisType( FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); if (isH5) { filetype = FileFormat.FILE_TYPE_HDF5; } NewFileDialog dialog = new NewFileDialog((JFrame) viewer, selectedObject.getFileFormat().getParent(), filetype, fileList); // dialog.show(); if (!dialog.isFileCreated()) { return; } String filename = dialog.getFile(); FileFormat dstFile = null; try { dstFile = openFile(filename, FileFormat.WRITE); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage() + "\n" + filename, "HDFView", JOptionPane.ERROR_MESSAGE); } List objList = new Vector(2); objList.add(selectedObject); pasteObject(objList, dstFile.getRootNode(), dstFile); } else if (cmd.equals("Rename object")) { renameObject(); } else if (cmd.startsWith("Show object properties")) { if (cmd.equals("Show object properties")) { isDefaultDisplay = true; } else { isDefaultDisplay = false; } try { showMetaData(selectedObject); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, "HDFView", JOptionPane.ERROR_MESSAGE); } } else if (cmd.startsWith("Find")) { if (cmd.equals("Find")) { String findStr = currentSearchPhrase; if (findStr == null) findStr = ""; findStr = (String) JOptionPane.showInputDialog(this, "Find (e.g. O3Quality, O3*, or *Quality):", "Find Object by Name", JOptionPane.PLAIN_MESSAGE, null, null, findStr); if (findStr != null && findStr.length() > 0) currentSearchPhrase = findStr; } find(currentSearchPhrase, selectedTreePath, tree); } else if (cmd.startsWith("Expand all")) { int row = 0; while (row < tree.getRowCount()) { tree.expandRow(row); row++; } } else if (cmd.startsWith("Collapse all")) { int row = tree.getRowCount() - 1; while (row >= 0) { tree.collapseRow(row); row--; } } else if (cmd.startsWith("Set Lib version bounds")) { setLibVersionBounds(); } else if (cmd.startsWith("Change file indexing")) { ChangeIndexingDialog dialog = new ChangeIndexingDialog((JFrame) viewer, selectedFile); dialog.setVisible(true); if (dialog.isreloadFile()) { selectedFile.setIndexType(dialog.getIndexType()); selectedFile.setIndexOrder(dialog.getIndexOrder()); ((HDFView) viewer).reloadFile(); } } } public FileFormat reopenFile(FileFormat fileFormat) throws Exception { if (fileFormat.isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5))) { this.currentIndexType = fileFormat.getIndexType(null); this.currentIndexOrder = fileFormat.getIndexOrder(null); } if (fileFormat.isReadOnly()) return openFile(fileFormat.getAbsolutePath(), FileFormat.READ); else return openFile(fileFormat.getAbsolutePath(), FileFormat.WRITE); } /** * Opens a file and retrieves the file structure of the file. It also can be * used to create a new file by setting the accessID to FileFormat.CREATE. * *

    * Subclasses must implement this function to take appropriate steps to open * a file. *

    * * @param filename * the name of the file to open. * @param accessID * identifier for the file access. Valid value of accessID is: *
      *
    • FileFormat.READ --- allow read-only access to file.
    • *
    • FileFormat.WRITE --- allow read and write access to file.
    • *
    • FileFormat.CREATE --- create a new file.
    • *
    * * @return the FileFormat of this file if successful; otherwise returns * null. */ public FileFormat openFile(String filename, int accessID) throws Exception { FileFormat fileFormat = null; MutableTreeNode fileRoot = null; boolean bNewFile = (FileFormat.OPEN_NEW == (accessID & FileFormat.OPEN_NEW)); if(bNewFile) accessID = accessID - FileFormat.OPEN_NEW; if (isFileOpen(filename)) { viewer.showStatus("File is in use"); return null; // throw new UnsupportedOperationException("File is in use."); } File tmpFile = new File(filename); if (!tmpFile.exists()) { throw new UnsupportedOperationException("File does not exist."); } if (!tmpFile.canWrite()) { accessID = FileFormat.READ; } Enumeration keys = FileFormat.getFileFormatKeys(); String theKey = null; while (keys.hasMoreElements()) { theKey = (String) keys.nextElement(); if (theKey.equals(FileFormat.FILE_TYPE_HDF4)) { try { FileFormat h4format = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4); if ((h4format != null) && h4format.isThisType(filename)) { fileFormat = h4format.createInstance(filename, accessID); break; } } catch (Throwable err) { } continue; } else if (theKey.equals(FileFormat.FILE_TYPE_HDF5)) { try { FileFormat h5format = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); if ((h5format != null) && h5format.isThisType(filename)) { fileFormat = h5format.createInstance(filename, accessID); break; } } catch (Throwable err) { } continue; } else { try { FileFormat theformat = FileFormat.getFileFormat(theKey); if (theformat.isThisType(filename)) { fileFormat = theformat.createInstance(filename, accessID); break; } } catch (Throwable err) { } } } if (fileFormat == null) { throw new java.io.IOException("Unsupported fileformat - " + filename); } ((JFrame) viewer).setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { fileFormat.setMaxMembers(ViewProperties.getMaxMembers()); fileFormat.setStartMembers(ViewProperties.getStartMembers()); if (fileFormat.isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5))) { if(bNewFile) { currentIndexType = fileFormat.getIndexType(ViewProperties.getIndexType()); currentIndexOrder = fileFormat.getIndexOrder(ViewProperties.getIndexOrder()); } fileFormat.setIndexType(currentIndexType); fileFormat.setIndexOrder(currentIndexOrder); } fileFormat.open(); } finally { ((JFrame) viewer).setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } fileRoot = (MutableTreeNode) fileFormat.getRootNode(); if (fileRoot != null) { insertNode(fileRoot, root); int currentRowCount = tree.getRowCount(); if (currentRowCount > 0) { tree.expandRow(tree.getRowCount() - 1); } fileList.add(fileFormat); } return fileFormat; } /** * close a file * * @param file * the file to close */ public void closeFile(FileFormat file) throws Exception { if (file == null) { return; } // find the file node in the tree and removed it from the tree first FileFormat theFile = null; DefaultMutableTreeNode theNode = null; Enumeration enumeration = root.children(); while (enumeration.hasMoreElements()) { theNode = (DefaultMutableTreeNode) enumeration.nextElement(); Group g = (Group) theNode.getUserObject(); theFile = g.getFileFormat(); if (theFile.equals(file)) { treeModel.removeNodeFromParent(theNode); try { theFile.close(); } catch (Exception ex) { ; } fileList.remove(theFile); if (theFile.equals(selectedFile)) { selectedFile = null; selectedNode = null; } break; } } // while(enumeration.hasMoreElements()) } /** * save a file * * @param file * the file to save */ public void saveFile(FileFormat file) throws Exception { if (file == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Select a file to save.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } boolean isH4 = file.isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4)); boolean isH5 = file.isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); if (!(isH4 || isH5)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Saving file is not supported for this file type", "HDFView", JOptionPane.ERROR_MESSAGE); return; } // write the change of the data into file before save the file List views = ((HDFView) viewer).getDataViews(); Object theView = null; TableView tableView = null; TextView textView = null; FileFormat theFile = null; if (views != null) { int n = views.size(); for (int i = 0; i < n; i++) { theView = views.get(i); if (theView instanceof TableView) { tableView = (TableView) theView; theFile = tableView.getDataObject().getFileFormat(); if (file.equals(theFile)) { tableView.updateValueInFile(); } } else if (theView instanceof TextView) { textView = (TextView) theView; theFile = textView.getDataObject().getFileFormat(); if (file.equals(theFile)) { textView.updateValueInFile(); } } } } if (isH5) { saveAsHDF5(file); } else if (isH4) { saveAsHDF4(file); } } /** * Gets the selected the file. When multiple files are open, we need to know * which file is currently selected. * * @return the FileFormat of the selected file. */ public FileFormat getSelectedFile() { return selectedFile; } /** * Gets a list of selected object in the tree. Obtaining a list of current * selected objects is necessary for copy/paste/delete objects. * * @return a list of selected object in the tree. */ public List getSelectedObjects() { TreePath[] paths = tree.getSelectionPaths(); if ((paths == null) || (paths.length <= 0)) { return null; } List objs = new Vector(paths.length); HObject theObject = null, parentObject; DefaultMutableTreeNode currentNode = null, parentNode = null; for (int i = 0; i < paths.length; i++) { currentNode = (DefaultMutableTreeNode) (paths[i].getLastPathComponent()); theObject = (HObject) currentNode.getUserObject(); if (theObject != null) { objs.add(theObject); // removed the group from the selected list if some of its // members are selected // to avoid duplicated copy/paste when a group is pasted. parentNode = (DefaultMutableTreeNode) currentNode.getParent(); parentObject = (HObject) parentNode.getUserObject(); objs.remove(parentObject); } } return objs; } /** * @return the current selected object in the tree. */ public HObject getCurrentObject() { return selectedObject; } /** * Dispaly the content of a data object. * * @param dataObject * the data object * @return the dataview that displays the data content * @throws Exception */ public DataView showDataContent(HObject dataObject) throws Exception { if ((dataObject == null) || !(dataObject instanceof Dataset)) { return null; // can only display dataset } Dataset d = (Dataset) dataObject; if (d.getRank() <= 0) { d.init(); } boolean isText = ((d instanceof ScalarDS) && ((ScalarDS) d).isText()); boolean isImage = ((d instanceof ScalarDS) && ((ScalarDS) d).isImage()); boolean isDisplayTypeChar = false; boolean isTransposed = false; boolean isIndexBase1 = ViewProperties.isIndexBase1(); BitSet bitmask = null; String dataViewName = null; JInternalFrame theFrame = (JInternalFrame) viewer.getDataView(d); if (isDefaultDisplay) { if (theFrame != null) { theFrame.toFront(); return null; } if (isText) { dataViewName = (String) HDFView.getListOfTextView().get(0); } else if (isImage) { dataViewName = (String) HDFView.getListOfImageView().get(0); } else { dataViewName = (String) HDFView.getListOfTableView().get(0); } } else { DataOptionDialog dialog = new DataOptionDialog(viewer, d); dialog.setVisible(true); if (dialog.isCancelled()) { return null; } isImage = dialog.isImageDisplay(); isDisplayTypeChar = dialog.isDisplayTypeChar(); dataViewName = dialog.getDataViewName(); isTransposed = dialog.isTransposed(); bitmask = dialog.getBitmask(); isIndexBase1 = dialog.isIndexBase1(); isApplyBitmaskOnly = dialog.isApplyBitmaskOnly(); } // enables use of JHDF5 in JNLP (Web Start) applications, the system // class loader with reflection first. Class theClass = null; try { theClass = Class.forName(dataViewName); } catch (Exception ex) { try { theClass = ViewProperties.loadExtClass().loadClass(dataViewName); } catch (Exception ex2) { theClass = null; } } // use default dataview if (theClass == null) { if (isText) dataViewName = "ncsa.hdf.view.DefaultTextView"; else if (isImage) dataViewName = "ncsa.hdf.view.DefaultImageView"; else dataViewName = "ncsa.hdf.view.DefaultTableView"; try { theClass = Class.forName(dataViewName); } catch (Exception ex) { } } Object theView = null; Object[] initargs = { viewer }; HashMap map = new HashMap(8); map.put(ViewProperties.DATA_VIEW_KEY.INDEXBASE1, new Boolean(isIndexBase1)); if (bitmask != null) { map.put(ViewProperties.DATA_VIEW_KEY.BITMASK, bitmask); if (isApplyBitmaskOnly) map.put(ViewProperties.DATA_VIEW_KEY.BITMASKOP, ViewProperties.BITMASK_OP.AND); // create a copy of dataset ScalarDS d_copy = null; Constructor constructor = null; Object[] paramObj = null; try { Class[] paramClass = { FileFormat.class, String.class, String.class, long[].class }; constructor = d.getClass().getConstructor(paramClass); paramObj = new Object[] { d.getFileFormat(), d.getName(), d.getPath(), d.getOID() }; } catch (Exception ex) { constructor = null; } try { d_copy = (ScalarDS) constructor.newInstance(paramObj); } catch (Exception ex) { d_copy = null; } if (d_copy != null) { try { d_copy.init(); int rank = d.getRank(); System.arraycopy(d.getDims(), 0, d_copy.getDims(), 0, rank); System.arraycopy(d.getStartDims(), 0, d_copy.getStartDims(), 0, rank); System.arraycopy(d.getSelectedDims(), 0, d_copy.getSelectedDims(), 0, rank); System.arraycopy(d.getStride(), 0, d_copy.getStride(), 0, rank); System.arraycopy(d.getSelectedIndex(), 0, d_copy.getSelectedIndex(), 0, 3); } catch (Throwable ex) { ex.printStackTrace(); } map.put(ViewProperties.DATA_VIEW_KEY.OBJECT, d_copy); } } if (dataViewName.startsWith("ncsa.hdf.view.DefaultTableView")) { map.put(ViewProperties.DATA_VIEW_KEY.CHAR, new Boolean(isDisplayTypeChar)); map.put(ViewProperties.DATA_VIEW_KEY.TRANSPOSED, new Boolean(isTransposed)); Object[] tmpargs = { viewer, map }; initargs = tmpargs; } else if (dataViewName.startsWith("ncsa.hdf.view.DefaultImageView")) { map.put(ViewProperties.DATA_VIEW_KEY.CONVERTBYTE, new Boolean((bitmask != null))); Object[] tmpargs = { viewer, map }; initargs = tmpargs; } ((JFrame) viewer).setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { theView = Tools.newInstance(theClass, initargs); viewer.addDataView((DataView) theView); } finally { ((JFrame) viewer).setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } return (DataView) theView; } /** * Displays the meta data of a data object. * * @param dataObject * the data object * @return the MetaDataView that displays the MetaData of the data object * @throws Exception */ public MetaDataView showMetaData(HObject dataObject) throws Exception { if (dataObject == null) { return null; } List metaDataViewList = HDFView.getListOfMetaDataView(); if ((metaDataViewList == null) || (metaDataViewList.size() <= 0)) { return null; } int n = metaDataViewList.size(); String className = (String) metaDataViewList.get(0); if (!isDefaultDisplay && (n > 1)) { className = (String) JOptionPane.showInputDialog(this, "Select MetaDataView", "HDFView", JOptionPane.INFORMATION_MESSAGE, null, metaDataViewList.toArray(), className); } // enables use of JHDF5 in JNLP (Web Start) applications, the system // class loader with reflection first. Class theClass = null; try { theClass = Class.forName(className); } catch (Exception ex) { theClass = ViewProperties.loadExtClass().loadClass(className); } Object[] initargs = { viewer }; MetaDataView dataView = (MetaDataView) Tools.newInstance(theClass, initargs); return dataView; } /** * Adds a new data object to the file. * * @param newObject * the new object to add. * @param parentGroup * the parent group the object is to add to. * @throws Exception */ public void addObject(HObject newObject, Group parentGroup) throws Exception { if ((newObject == null) || (parentGroup == null)) { return; } TreeNode pnode = findTreeNode(parentGroup); TreeNode newnode = null; if (newObject instanceof Group) { newnode = new DefaultMutableTreeNode(newObject) { private static final long serialVersionUID = -8852535261445958398L; public boolean isLeaf() { return false; } }; } else { newnode = new DefaultMutableTreeNode(newObject); } treeModel.insertNodeInto((DefaultMutableTreeNode) newnode, (DefaultMutableTreeNode) pnode, pnode.getChildCount()); } /** * Returns the JTree which holds the file structure. * * @return the JTree which holds the file structure. */ public JTree getTree() { return tree; } /** * Returns the list of current open files.. */ public List getCurrentFiles() { return fileList; } /** * Returns the tree node that contains the given data object. */ public TreeNode findTreeNode(HObject obj) { if (obj == null) { return null; } TreeNode theFileRoot = obj.getFileFormat().getRootNode(); if (theFileRoot == null) { return null; } DefaultMutableTreeNode theNode = null; HObject theObj = null; Enumeration local_enum = ((DefaultMutableTreeNode) theFileRoot).breadthFirstEnumeration(); while (local_enum.hasMoreElements()) { theNode = (DefaultMutableTreeNode) local_enum.nextElement(); theObj = (HObject) theNode.getUserObject(); if (theObj == null) { continue; } else if (theObj.equals(obj)) { return theNode; } } return null; } /** * This class is used to change the default icons for tree nodes. * * @see javax.swing.tree.DefaultTreeCellRenderer */ private class HTreeCellRenderer extends DefaultTreeCellRenderer { private static final long serialVersionUID = -9030708781106435297L; private Icon h4Icon, h5Icon, datasetIcon, imageIcon, tableIcon, textIcon, openFolder, closeFolder, datasetIconA, imageIconA, tableIconA, textIconA, openFolderA, closeFolderA, datatypeIcon, datatypeIconA, questionIcon; private HTreeCellRenderer() { super(); openFolder = ViewProperties.getFolderopenIcon(); closeFolder = ViewProperties.getFoldercloseIcon(); datasetIcon = ViewProperties.getDatasetIcon(); imageIcon = ViewProperties.getImageIcon(); h4Icon = ViewProperties.getH4Icon(); h5Icon = ViewProperties.getH5Icon(); tableIcon = ViewProperties.getTableIcon(); textIcon = ViewProperties.getTextIcon(); openFolderA = ViewProperties.getFolderopenIconA(); closeFolderA = ViewProperties.getFoldercloseIconA(); datasetIconA = ViewProperties.getDatasetIconA(); imageIconA = ViewProperties.getImageIconA(); tableIconA = ViewProperties.getTableIconA(); textIconA = ViewProperties.getTextIconA(); datatypeIcon = ViewProperties.getDatatypeIcon(); datatypeIconA = ViewProperties.getDatatypeIconA(); questionIcon = ViewProperties.getQuestionIcon(); if (openFolder != null) { openIcon = openFolder; } else { openFolder = this.openIcon; } if (closeFolder != null) { closedIcon = closeFolder; } else { closeFolder = closedIcon; } if (datasetIcon == null) { datasetIcon = leafIcon; } if (imageIcon == null) { imageIcon = leafIcon; } if (tableIcon == null) { tableIcon = leafIcon; } if (textIcon == null) { textIcon = leafIcon; } if (h4Icon == null) { h4Icon = leafIcon; } if (h5Icon == null) { h5Icon = leafIcon; } if (datatypeIcon == null) { datatypeIcon = leafIcon; } if (questionIcon == null) { questionIcon = leafIcon; } if (openFolderA == null) { openFolderA = openFolder; } if (closeFolderA == null) { closeFolderA = closeFolder; } if (datasetIconA == null) { datasetIconA = datasetIcon; } if (imageIconA == null) { imageIconA = imageIcon; } if (tableIconA == null) { tableIconA = tableIcon; } if (textIconA == null) { textIconA = textIcon; } if (datatypeIconA == null) { datatypeIconA = datatypeIcon; } } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { HObject theObject = (HObject) ((DefaultMutableTreeNode) value).getUserObject(); boolean hasAttribute = false; if (theObject instanceof Dataset) { if (theObject instanceof ScalarDS) { ScalarDS sd = (ScalarDS) theObject; hasAttribute = sd.hasAttribute(); if (sd.isImage()) { if (hasAttribute) { leafIcon = imageIconA; } else { leafIcon = imageIcon; } } else if (sd.isText()) { if (hasAttribute) { leafIcon = textIconA; } else { leafIcon = textIcon; } } else { if (hasAttribute) { leafIcon = datasetIconA; } else { leafIcon = datasetIcon; } } } else if (theObject instanceof CompoundDS) { if (theObject.hasAttribute()) { leafIcon = tableIconA; } else { leafIcon = tableIcon; } } } else if (theObject instanceof Group) { Group g = (Group) theObject; if (g.hasAttribute()) { openIcon = openFolderA; closedIcon = closeFolderA; } else { openIcon = openFolder; closedIcon = closeFolder; } if (g.isRoot()) { if (g.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5))) { openIcon = closedIcon = h5Icon; } else if (g.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4))) { openIcon = closedIcon = h4Icon; } } } else if (theObject instanceof Datatype) { Datatype t = (Datatype) theObject; if (t.hasAttribute()) { leafIcon = datatypeIconA; } else { leafIcon = datatypeIcon; } } else { leafIcon = questionIcon; } return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); } } // private class HTreeCellRenderer /** * Handle mouse clicks on data object in the tree view. A right mouse-click * to show the popup menu for user choice. A double left-mouse-click to * display the data content. A single left-mouse-click to select the current * data object. */ private class HTreeMouseAdapter extends MouseAdapter { // public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) { TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); if (selPath == null) { return; } DefaultMutableTreeNode theNode = (DefaultMutableTreeNode) selPath.getLastPathComponent(); if (!theNode.equals(selectedNode)) { selectedTreePath = selPath; selectedNode = theNode; selectedObject = ((HObject) (selectedNode.getUserObject())); FileFormat theFile = selectedObject.getFileFormat(); if ((theFile != null) && !theFile.equals(selectedFile)) { // a different file is selected, handle only one file a time selectedFile = theFile; tree.clearSelection(); tree.setSelectionPath(selPath); } viewer.mouseEventFired(e); } // *************************************************************** // Different platforms have different ways to show popups // if (e.getModifiers() == MouseEvent.BUTTON3_MASK) works for all // but mac // mouseReleased() and e.isPopupTrigger() work on windows and mac // but not unix, // mouseClicked() and e.isPopupTrigger() work on unix and mac but // not windows, // to solve the problem, we use both. // 7/25/06 bug 517. e.isPopupTrigger does not work on one mouse Mac. // add (MouseEvent.BUTTON1_MASK|MouseEvent.CTRL_MASK) for MAC int eMod = e.getModifiers(); if (e.isPopupTrigger() || (eMod == MouseEvent.BUTTON3_MASK) || (System.getProperty("os.name").startsWith("Mac") && (eMod == (MouseEvent.BUTTON1_MASK | MouseEvent.CTRL_MASK)))) { int selRow = tree.getRowForLocation(e.getX(), e.getY()); if (!tree.isRowSelected(selRow)) { // reselect the node tree.clearSelection(); tree.setSelectionRow(selRow); } showPopupMenu(e); } // double click to open data content else if (e.getClickCount() == 2) { isDefaultDisplay = true; try { showDataContent(selectedObject); } catch (Exception ex) { } } } // public void mousePressed(MouseEvent e) } // private class HTreeMouseAdapter extends MouseAdapter /** * Handle key pressed event. */ private class HTreeKeyAdapter extends KeyAdapter { @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_KP_LEFT || key == KeyEvent.VK_KP_RIGHT || key == KeyEvent.VK_KP_UP || key == KeyEvent.VK_KP_DOWN || key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_UP || key == KeyEvent.VK_DOWN) { TreePath selPath = ((JTree) e.getComponent()).getSelectionPath(); if (selPath == null) { return; } DefaultMutableTreeNode theNode = (DefaultMutableTreeNode) selPath.getLastPathComponent(); if (!theNode.equals(selectedNode)) { selectedTreePath = selPath; selectedNode = theNode; selectedObject = ((HObject) (selectedNode.getUserObject())); FileFormat theFile = selectedObject.getFileFormat(); if ((theFile != null) && !theFile.equals(selectedFile)) { // a different file is selected, handle only one file a // time selectedFile = theFile; tree.clearSelection(); tree.setSelectionPath(selPath); } ((HDFView) viewer).showMetaData(selectedObject); } } } } /** * ChangeIndexingDialog displays file index options. */ private class ChangeIndexingDialog extends JDialog implements ActionListener { private static final long serialVersionUID = 1048114401768228742L; private JRadioButton checkIndexType; private JRadioButton checkIndexOrder; private JRadioButton checkIndexNative; private boolean reloadFile; private FileFormat selectedFile; private int indexType; private int indexOrder; /** * constructs an UserOptionsDialog. * * @param view * The HDFView. */ private ChangeIndexingDialog(JFrame view, FileFormat viewSelectedFile) { super(view, "Index Options", true); selectedFile = viewSelectedFile; indexType = selectedFile.getIndexType(null); indexOrder = selectedFile.getIndexOrder(null); reloadFile = false; JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(8, 8)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); JPanel indexP = new JPanel(); TitledBorder tborder = new TitledBorder("Index Options"); tborder.setTitleColor(Color.darkGray); indexP.setBorder(tborder); indexP.setLayout(new GridLayout(2, 1, 10, 10)); indexP.setBorder(new SoftBevelBorder(BevelBorder.LOWERED)); contentPane.add(indexP); JPanel pType = new JPanel(); tborder = new TitledBorder("Indexing Type"); tborder.setTitleColor(Color.darkGray); pType.setBorder(tborder); pType.setLayout(new GridLayout(1, 2, 8, 8)); checkIndexType = new JRadioButton("By Name", (indexType) == selectedFile.getIndexType("H5_INDEX_NAME")); checkIndexType.setName("Index by Name"); pType.add(checkIndexType); JRadioButton checkIndexCreateOrder = new JRadioButton("By Creation Order", (indexType) == selectedFile.getIndexType("H5_INDEX_CRT_ORDER")); checkIndexCreateOrder.setName("Index by Creation Order"); pType.add(checkIndexCreateOrder); ButtonGroup bTypegrp = new ButtonGroup(); bTypegrp.add(checkIndexType); bTypegrp.add(checkIndexCreateOrder); indexP.add(pType); JPanel pOrder = new JPanel(); tborder = new TitledBorder("Indexing Order"); tborder.setTitleColor(Color.darkGray); pOrder.setBorder(tborder); pOrder.setLayout(new GridLayout(1, 3, 8, 8)); checkIndexOrder = new JRadioButton("Increments", (indexOrder) == selectedFile.getIndexOrder("H5_ITER_INC")); checkIndexOrder.setName("Index Increments"); pOrder.add(checkIndexOrder); JRadioButton checkIndexDecrement = new JRadioButton("Decrements", (indexOrder) == selectedFile.getIndexOrder("H5_ITER_DEC")); checkIndexDecrement.setName("Index Decrements"); pOrder.add(checkIndexDecrement); checkIndexNative = new JRadioButton("Native", (indexOrder) == selectedFile.getIndexOrder("H5_ITER_NATIVE")); checkIndexNative.setName("Index Native"); pOrder.add(checkIndexNative); ButtonGroup bOrdergrp = new ButtonGroup(); bOrdergrp.add(checkIndexOrder); bOrdergrp.add(checkIndexDecrement); bOrdergrp.add(checkIndexNative); indexP.add(pOrder); JPanel buttonP = new JPanel(); JButton b = new JButton("Reload File"); b.setName("Reload File"); b.setActionCommand("Reload File"); b.addActionListener(this); buttonP.add(b); b = new JButton("Cancel"); b.setName("Cancel"); b.setActionCommand("Cancel"); b.addActionListener(this); buttonP.add(b); contentPane.add("Center", indexP); contentPane.add("South", buttonP); // locate the parent dialog Point l = getParent().getLocation(); l.x += 250; l.y += 80; setLocation(l); validate(); pack(); } public void setVisible(boolean b) { super.setVisible(b); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Reload File")) { setIndexOptions(); setVisible(false); } else if (cmd.equals("Cancel")) { reloadFile = false; setVisible(false); } } private void setIndexOptions() { if (checkIndexType.isSelected()) selectedFile.setIndexType(selectedFile.getIndexType("H5_INDEX_NAME")); else selectedFile.setIndexType(selectedFile.getIndexType("H5_INDEX_CRT_ORDER")); indexType = selectedFile.getIndexType(null); if (checkIndexOrder.isSelected()) selectedFile.setIndexOrder(selectedFile.getIndexOrder("H5_ITER_INC")); else if (checkIndexNative.isSelected()) selectedFile.setIndexOrder(selectedFile.getIndexOrder("H5_ITER_NATIVE")); else selectedFile.setIndexOrder(selectedFile.getIndexOrder("H5_ITER_DEC")); indexOrder = selectedFile.getIndexOrder(null); reloadFile = true; } public int getIndexType() { return indexType; } public int getIndexOrder() { return indexOrder; } public boolean isreloadFile() { return reloadFile; } } } jhdf-2.9/ncsa/hdf/view/NewFileDialog.java0000644000175000017500000001736412050301063021135 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.Toolkit; import java.io.File; import java.util.Iterator; import java.util.List; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import ncsa.hdf.object.FileFormat; /** * NewFileDialog shows a message dialog requesting user input for creating a new * HDF4/5 file. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class NewFileDialog extends JFileChooser // JDialog // implements ActionListener { private static final long serialVersionUID = 4796246032789504234L; /** flag if the new file is an HDF5 */ private String fileType; /** The current working directory */ private String currentDir; /** The view working directory */ private String viewDir; private boolean fileCreated; private List fileList; private final Toolkit toolkit; private final JFrame viewer; private boolean isH5 = false; private boolean isH4 = false; /** * constructs an NewFileDialog. * * @param owner * The owner of the dialog. * @param dir * The default directory of the new file. * @param type * The type of file format. * @param openFiles * The list of current open files. It is used to make sure the * new file cannot be any file in use. */ public NewFileDialog(JFrame owner, String dir, String type, List openFiles) { super(dir); currentDir = dir; viewer = owner; viewDir = dir; fileType = type; fileCreated = false; fileList = openFiles; toolkit = Toolkit.getDefaultToolkit(); if (currentDir != null) { currentDir += File.separator; } else { currentDir = ""; } if (fileType == FileFormat.FILE_TYPE_HDF4) { isH4 = true; setSelectedFile(Tools.checkNewFile(currentDir, ".hdf")); setFileFilter(DefaultFileFilter.getFileFilterHDF4()); } else if (fileType == FileFormat.FILE_TYPE_HDF5) { isH5 = true; setSelectedFile(Tools.checkNewFile(currentDir, ".h5")); setFileFilter(DefaultFileFilter.getFileFilterHDF5()); } this.showSaveDialog(owner); } @Override protected void fireActionPerformed(String command) { super.fireActionPerformed(command); if (command.equals("ApproveSelection")) { fileCreated = createNewFile(); } else { fileCreated = false; } } /** create a new HDF file with default file creation properties */ private boolean createNewFile() { File f = this.getSelectedFile(); if (f == null) { return false; } String fname = f.getAbsolutePath(); if (fname == null) { return false; } fname = fname.trim(); if ((fname == null) || (fname.length() == 0)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid file name.", viewer .getTitle(), JOptionPane.ERROR_MESSAGE); return false; } String extensions = FileFormat.getFileExtensions(); boolean noExtension = true; if ((extensions != null) && (extensions.length() > 0)) { java.util.StringTokenizer currentExt = new java.util.StringTokenizer( extensions, ","); String extension = ""; String tmpFilename = fname.toLowerCase(); while (currentExt.hasMoreTokens() && noExtension) { extension = currentExt.nextToken().trim().toLowerCase(); noExtension = !tmpFilename.endsWith("." + extension); } } if (noExtension) { if (isH4) { fname += ".hdf"; f = new File(fname); setSelectedFile(f); } else if (isH5) { fname += ".h5"; f = new File(fname); setSelectedFile(f); } } if (f.exists() && f.isDirectory()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "File is a directory.", viewer .getTitle(), JOptionPane.ERROR_MESSAGE); return false; } File pfile = f.getParentFile(); if (pfile == null) { fname = viewDir + File.separator + fname; f = new File(fname); } else if (!pfile.exists()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "File path does not exist at\n" + pfile.getPath(), viewer.getTitle(), JOptionPane.ERROR_MESSAGE); return false; } // check if the file is in use if (fileList != null) { FileFormat theFile = null; Iterator iterator = fileList.iterator(); while (iterator.hasNext()) { theFile = (FileFormat) iterator.next(); if (theFile.getFilePath().equals(fname)) { toolkit.beep(); JOptionPane .showMessageDialog( this, "Unable to create the new file. \nThe file is being used.", viewer.getTitle(), JOptionPane.ERROR_MESSAGE); return false; } } } int newFileFlag = -1; if (f.exists()) { newFileFlag = JOptionPane.showConfirmDialog(this, "File exists. Do you want to replace it ?", viewer .getTitle(), JOptionPane.YES_NO_OPTION); if (newFileFlag == JOptionPane.NO_OPTION) { return false; } } currentDir = f.getParent(); try { int aFlag = FileFormat.FILE_CREATE_DELETE; if (ViewProperties.isEarlyLib()) aFlag = FileFormat.FILE_CREATE_DELETE | FileFormat.FILE_CREATE_EARLY_LIB; FileFormat.getFileFormat(fileType).createFile(fname, aFlag); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage(), viewer .getTitle(), JOptionPane.ERROR_MESSAGE); return false; } return true; } public boolean isFileCreated() { return fileCreated; } public String getFile() { String fname = null; File f = this.getSelectedFile(); if (f != null) { fname = f.getAbsolutePath(); } return fname; } } jhdf-2.9/ncsa/hdf/view/TreeView.java0000644000175000017500000001221312050301063020202 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.util.List; import javax.swing.JTree; import javax.swing.tree.TreeNode; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; /** * *

    * TreeView defines APIs for open a file and display the file structure in tree * structure. *

    * *

    * TreeView uses folders and leaf nodes to represent groups and data objects in * the file. You can expand or collapse folders to navigate data objects in the * file. *

    * *

    * From the TreeView, you can open data content or metadata of selected object. * You can select object(s) to delete or add new object to the file. *

    * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public abstract interface TreeView { /** * Opens a file and retrieves the file structure of the file. It also can be * used to create a new file by setting the accessID to FileFormat.CREATE. * *

    * Subclasses must implement this function to take appropriate steps to open * a file. *

    * * @param filename * the name of the file to open. * @param accessID * identifier for the file access. Valid value of accessID is: *
      *
    • FileFormat.READ --- allow read-only access to file.
    • *
    • FileFormat.WRITE --- allow read and write access to file.
    • *
    • FileFormat.CREATE --- create a new file.
    • *
    * * @return the FileFormat of this file if successful; otherwise returns * null. */ public abstract FileFormat openFile(String filename, int accessID) throws Exception; public abstract FileFormat reopenFile(FileFormat theFile) throws Exception; /** * close a file * * @param file * the file to close */ public abstract void closeFile(FileFormat file) throws Exception; /** * save a file * * @param file * the file to save */ public abstract void saveFile(FileFormat file) throws Exception; /** * Gets the selected the file. When multiple files are open, we need to know * which file is currently selected. * * @return the FileFormat of the selected file. */ public abstract FileFormat getSelectedFile(); /** * Gets a list of selected objects in the tree. Obtaining a list of current * selected objects is necessary for copy/paste/delete objects. * * @return a list of selected object in the tree. */ public abstract List getSelectedObjects(); /** * @return the current selected object in the tree. */ public abstract HObject getCurrentObject(); /** * Display the content of a data object. * * @param dataObject * the data object * @return the dataview that displays the data content * @throws Exception */ public abstract DataView showDataContent(HObject dataObject) throws Exception; /** * Displays the meta data of a data object. * * @param dataObject * the data object * @return the MetaDataView that displays the MetaData of the data object * @throws Exception */ public abstract MetaDataView showMetaData(HObject dataObject) throws Exception; /** * Adds a new data object to the file. * * @param newObject * the new object to add. * @param parentGroup * the parent group the object is to add to. * @throws Exception */ public abstract void addObject(HObject newObject, Group parentGroup) throws Exception; /** * Returns the JTree which holds the file structure. * * @return the JTree which holds the file structure. */ public abstract JTree getTree(); /** * Returns the list of current open files.. */ public abstract List getCurrentFiles(); /** * Returns the tree node that contains the given data object. */ public abstract TreeNode findTreeNode(HObject obj); } jhdf-2.9/ncsa/hdf/view/HDFView.java0000644000175000017500000022122212050543762017724 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Constructor; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDesktopPane; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JToolBar; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; /** * HDFView is the main class of this HDF visual tool. It is used to layout the * graphical components of the hdfview. The major GUI components of the HDFView * include Menubar, Toolbar, TreeView, ContentView, and MessageArea. *

    * The HDFView is designed in such a way that it does not have direct access to * the HDF library. All the HDF library access is done through HDF objects. * Therefore, the HDFView package depends on the object package but not the * library package. The source code of the view package (ncsa.hdf.view) should * be complied with the library package (ncsa.hdf.hdflib and ncsa.hdf.hdf5lib). * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class HDFView extends JFrame implements ViewManager, ActionListener, ChangeListener, DropTargetListener { private static final long serialVersionUID = 2211017444445918998L; /** a list of tree view implementation. */ private static List treeViews; /** a list of image view implementation. */ private static List imageViews; /** a list of tree table implementation. */ private static List tableViews; /** a list of Text view implementation. */ private static List textViews; /** a list of metadata view implementation. */ private static List metaDataViews; /** a list of palette view implementation. */ private static List paletteViews; /** a list of help view implementation. */ private static List helpViews; private static final String aboutHDFView = "HDF Viewer, " + "Version " + ViewProperties.VERSION + "\n" + "For " + System.getProperty("os.name") + "\n\n" + "Copyright " + '\u00a9' + " 2006-2012 The HDF Group.\n" + "All rights reserved."; private static final String JAVA_COMPILER = "jdk 1.7"; /** the directory where the HDFView is installed */ private String rootDir; /** the current working directory */ private String currentDir; /** the current working file */ private String currentFile; /** the view properties */ private ViewProperties props; /** the list of most recent files */ // private Vector recentFiles; /** GUI component: the TreeView */ private TreeView treeView; /** The offset when a new dataview is added into the main window. */ private int frameOffset; /** GUI component: the panel which is used to display the data content */ private final JDesktopPane contentPane; /** GUI component: the text area for showing status message */ private final JTextArea statusArea; /** GUI component: the text area for quick attribute view */ private final JTextArea attributeArea; /* create tab pane to display attributes and status information */ private final JTabbedPane infoTabbedPane; /** the main menu bar */ private JMenuBar menuBar; /** GUI component: a list of current data windwos */ private final JMenu windowMenu; /** GUI component: file menu on the menubar */ private final JMenu fileMenu; /** the string buffer holding the status message */ private final StringBuffer message; /** the string buffer holding the meadata information */ private final StringBuffer metadata; private final Toolkit toolkit; /** The list of GUI components related to editing */ private final List editGUIs; /** The list of GUI components related to HDF5 */ private final List h5GUIs; /** The list of GUI components related to HDF4 */ private final List h4GUIs; /** to add and display url */ private JComboBox urlBar; private UserOptionsDialog userOptionDialog; private Constructor ctrSrbFileDialog = null; private JDialog srbFileDialog = null; /** * Constructs the HDFView with a given root directory, where the HDFView is * installed, and opens the given file in the viewer. *

    * * @param root * the directory where the HDFView is installed. * @param flist * a list of files to open. */ public HDFView(String root, List flist, int width, int height, int x, int y) { super("HDFView " + ViewProperties.VERSION); this.setName("hdfview"); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // set the module class jar files to the class path rootDir = root; currentFile = null; frameOffset = 0; userOptionDialog = null; ctrSrbFileDialog = null; toolkit = Toolkit.getDefaultToolkit(); ViewProperties.loadIcons(rootDir); ViewProperties.loadExtClass(); editGUIs = new Vector(); h4GUIs = new Vector(); h5GUIs = new Vector(); // load the view properties props = new ViewProperties(rootDir); try { props.load(); } catch (Exception ex) { ; } // recentFiles = ViewProperties.getMRF(); currentDir = ViewProperties.getWorkDir(); if (currentDir == null) { currentDir = System.getProperty("user.dir"); } treeViews = ViewProperties.getTreeViewList(); metaDataViews = ViewProperties.getMetaDataViewList(); textViews = ViewProperties.getTextViewList(); tableViews = ViewProperties.getTableViewList(); imageViews = ViewProperties.getImageViewList(); paletteViews = ViewProperties.getPaletteViewList(); helpViews = ViewProperties.getHelpViewList(); // initialize GUI components statusArea = new JTextArea(); statusArea.setEditable(false); statusArea.setBackground(new java.awt.Color(240, 240, 240)); statusArea.setLineWrap(true); statusArea.setName("status"); message = new StringBuffer(); metadata = new StringBuffer(); showStatus("HDFView root - " + rootDir); showStatus("User property file - " + ViewProperties.getPropertyFile()); attributeArea = new JTextArea(); attributeArea.setEditable(false); attributeArea.setBackground(new java.awt.Color(240, 240, 240)); attributeArea.setLineWrap(true); attributeArea.setName("attributes"); // create tab pane to display attributes and status information infoTabbedPane = new JTabbedPane(JTabbedPane.BOTTOM); infoTabbedPane.addChangeListener(this); infoTabbedPane.setName("tabpane"); contentPane = new JDesktopPane(); contentPane.setName("contentpane"); windowMenu = new JMenu("Window"); windowMenu.setName("windowmenu"); fileMenu = new JMenu("File"); fileMenu.setName("filemenu"); int n = treeViews.size(); Class theClass = null; for (int i = 0; i < n; i++) { // use the first available treeview String className = treeViews.get(i); // enables use of JHDF5 in JNLP (Web Start) applications, the system // class loader with reflection first. try { theClass = Class.forName(className); } catch (Exception ex) { try { theClass = ViewProperties.loadExtClass().loadClass(className); } catch (Exception ex2) { theClass = null; } } if (theClass != null) break; } if (theClass != null) { try { Class[] paramClass = { Class.forName("ncsa.hdf.view.ViewManager") }; Constructor constructor = theClass.getConstructor(paramClass); Object[] paramObj = { this }; treeView = (TreeView) constructor.newInstance(paramObj); } catch (Exception ex) { treeView = null; } } // could not load user's treeview, use default treeview. if (treeView == null) treeView = new DefaultTreeView(this); createMainWindow(width, height, x, y); try { java.awt.Font font = null; String ftype = ViewProperties.getFontType(); int fsize = ViewProperties.getFontSize(); try { font = new java.awt.Font(ftype, java.awt.Font.PLAIN, fsize); } catch (Exception ex) { font = null; } if (font != null) { updateFontSize(font); } } catch (Exception ex) { ; } // need to call pack() before open any file so that // all GUI components will be in place. pack(); /* add support for drag and drop file */ new DropTarget(this, this); int nfiles = flist.size(); File theFile = null; for (int i = 0; i < nfiles; i++) { theFile = flist.get(i); if (theFile.isFile()) { currentDir = theFile.getParentFile().getAbsolutePath(); currentFile = theFile.getAbsolutePath(); try { treeView.openFile(currentFile, FileFormat.WRITE); try { urlBar.removeItem(currentFile); urlBar.insertItemAt(currentFile, 0); urlBar.setSelectedIndex(0); } catch (Exception ex2) { } } catch (Exception ex) { showStatus(ex.toString()); } } else { currentDir = theFile.getAbsolutePath(); } } if (FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4) == null) { setEnabled(h4GUIs, false); } if (FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5) == null) { setEnabled(h5GUIs, false); } } /** * Set default UI fonts. */ private void updateFontSize(Font font) { if (font == null) { return; } UIDefaults defaults = UIManager.getLookAndFeelDefaults(); for (Iterator i = defaults.keySet().iterator(); i.hasNext();) { Object key = i.next(); if (defaults.getFont(key) != null) { UIManager.put(key, new javax.swing.plaf.FontUIResource(font)); } } SwingUtilities.updateComponentTreeUI(this); } /** * Creates and lays out GUI compoents. * *
         * ||=========||=============================||
         * ||         ||                             ||
         * ||         ||                             ||
         * || TreeView||       ContentPane           ||
         * ||         ||                             ||
         * ||=========||=============================||
         * ||            Message Area                ||
         * ||========================================||
         * 
    */ private void createMainWindow(int width, int height, int x, int y) { // create splitpane to separate treeview and the contentpane JScrollPane treeScroller = new JScrollPane((Component) treeView); treeScroller.setName("treescroller"); JScrollPane contentScroller = new JScrollPane(contentPane); contentScroller.setName("contentscroller"); JSplitPane topSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, treeScroller, contentScroller); topSplitPane.setDividerLocation(200); topSplitPane.setName("topsplitpane"); infoTabbedPane.addTab("Log Info", new JScrollPane(statusArea)); infoTabbedPane.addTab("Metadata ", new JScrollPane(attributeArea)); infoTabbedPane.setSelectedIndex(1); // create splitpane to separate message area and treeview-contentpane topSplitPane.setBorder(null); // refer to Java bug #4131528 JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topSplitPane, infoTabbedPane); splitPane.setName("splitpane"); // set the window size // float inset = 0.17f; // for UG only. float inset = 0.04f; Dimension d = toolkit.getScreenSize(); if (height > 300) { d.height = height; } else { d.height = (int) ((1 - 2 * inset) * d.height); } if (width > 300) { d.width = width; } else { d.width = (int) (0.9 * (double) d.height); } // TEST if (treeView.getClass().getName().startsWith("ext.erdc")) { topSplitPane.setDividerLocation(500); d.width = (int) (0.9 * toolkit.getScreenSize().width); d.height = (int) (d.width * 0.618); } splitPane.setDividerLocation(d.height - 180); this.setLocation(x, y); try { this.setIconImage(((ImageIcon) ViewProperties.getHdfIcon()).getImage()); } catch (Exception ex) { } this.setJMenuBar(menuBar = createMenuBar()); JToolBar toolBar = createToolBar(); /** create URL address bar */ urlBar = new JComboBox(ViewProperties.getMRF()); urlBar.setMaximumRowCount(ViewProperties.MAX_RECENT_FILES); urlBar.setEditable(true); urlBar.addActionListener(this); urlBar.setActionCommand("Open file: from file bar"); urlBar.setSelectedIndex(-1); JPanel urlPane = new JPanel(); urlPane.setLayout(new BorderLayout()); urlPane.setName("urlpane"); JButton b = new JButton("Clear Text"); b.setActionCommand("Clear current selection"); b.setToolTipText("Clear current selection"); b.setMargin(new Insets(1, 3, 1, 3)); b.addActionListener(this); urlPane.add(b, BorderLayout.EAST); b = new JButton("Recent Files"); b.addActionListener(this); b.setActionCommand("Popup URL list"); b.setToolTipText("List of recent files"); b.setMargin(new Insets(1, 3, 1, 3)); urlPane.add(b, BorderLayout.WEST); urlPane.add(urlBar, BorderLayout.CENTER); JPanel toolPane = new JPanel(); toolPane.setLayout(new GridLayout(2, 1, 0, 0)); toolPane.add(toolBar); toolPane.add(urlPane); toolPane.setName("toolpane"); JPanel mainPane = (JPanel) getContentPane(); mainPane.setLayout(new BorderLayout()); mainPane.add(toolPane, BorderLayout.NORTH); mainPane.add(splitPane, BorderLayout.CENTER); mainPane.setPreferredSize(d); mainPane.setName("mainpane"); } private JMenuBar createMenuBar() { JMenuBar mbar = new JMenuBar(); mbar.setName("mbar"); JMenu menu = null; JMenuItem item; // add file menu fileMenu.setMnemonic('f'); mbar.add(fileMenu); item = new JMenuItem("Open"); item.setMnemonic(KeyEvent.VK_O); item.addActionListener(this); item.setActionCommand("Open file"); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK, true)); fileMenu.add(item); item = new JMenuItem("Open Read-Only"); item.setMnemonic(KeyEvent.VK_R); item.addActionListener(this); item.setActionCommand("Open file read-only"); if (!ViewProperties.isReadOnly()) fileMenu.add(item); // boolean isSrbSupported = true; // try { // Class.forName("ncsa.hdf.srb.H5SRB"); // Class.forName("ncsa.hdf.srb.SRBFileDialog"); // } catch (Throwable ex) {isSrbSupported = false;} // // if (isSrbSupported) { // item = new JMenuItem( "Open from iRODS"); // item.setMnemonic(KeyEvent.VK_S); // item.addActionListener(this); // item.setActionCommand("Open from irods"); // fileMenu.add(item); // } fileMenu.addSeparator(); JMenu newFileMenu = new JMenu("New"); item = new JMenuItem("HDF4"); item.setActionCommand("New HDF4 file"); item.setMnemonic(KeyEvent.VK_4); item.addActionListener(this); h4GUIs.add(item); newFileMenu.add(item); item = new JMenuItem("HDF5"); item.setActionCommand("New HDF5 file"); item.setMnemonic(KeyEvent.VK_5); item.addActionListener(this); h5GUIs.add(item); newFileMenu.add(item); fileMenu.add(newFileMenu); fileMenu.addSeparator(); item = new JMenuItem("Close"); item.setMnemonic(KeyEvent.VK_C); item.addActionListener(this); item.setActionCommand("Close file"); fileMenu.add(item); item = new JMenuItem("Close All"); item.setMnemonic(KeyEvent.VK_A); item.addActionListener(this); item.setActionCommand("Close all file"); fileMenu.add(item); fileMenu.addSeparator(); item = new JMenuItem("Save"); item.setMnemonic(KeyEvent.VK_S); item.addActionListener(this); item.setActionCommand("Save current file"); fileMenu.add(item); item = new JMenuItem("Save As"); item.setMnemonic(KeyEvent.VK_A); item.addActionListener(this); item.setActionCommand("Save current file as"); fileMenu.add(item); fileMenu.addSeparator(); item = new JMenuItem("Exit"); item.setMnemonic(KeyEvent.VK_X); item.addActionListener(this); item.setActionCommand("Exit"); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK, true)); fileMenu.add(item); fileMenu.addSeparator(); // add window menu windowMenu.setMnemonic('w'); mbar.add(windowMenu); item = new JMenuItem("Cascade"); item.setMnemonic(KeyEvent.VK_C); item.setActionCommand("Cascade all windows"); item.addActionListener(this); windowMenu.add(item); item = new JMenuItem("Tile"); item.setMnemonic(KeyEvent.VK_T); item.setActionCommand("Tile all windows"); item.addActionListener(this); windowMenu.add(item); windowMenu.addSeparator(); item = new JMenuItem("Close Window"); item.setMnemonic(KeyEvent.VK_W); item.setActionCommand("Close a window"); item.addActionListener(this); windowMenu.add(item); item = new JMenuItem("Close All"); item.setMnemonic(KeyEvent.VK_A); item.setActionCommand("Close all windows"); item.addActionListener(this); windowMenu.add(item); windowMenu.addSeparator(); // add tool menu menu = new JMenu("Tools"); menu.setMnemonic('T'); mbar.add(menu); JMenu imageSubmenu = new JMenu("Convert Image To"); item = new JMenuItem("HDF4"); item.setActionCommand("Convert image file: Image to HDF4"); item.addActionListener(this); h4GUIs.add(item); imageSubmenu.add(item); item = new JMenuItem("HDF5"); item.setActionCommand("Convert image file: Image to HDF5"); item.addActionListener(this); h5GUIs.add(item); imageSubmenu.add(item); menu.add(imageSubmenu); menu.addSeparator(); item = new JMenuItem("User Options"); item.setMnemonic(KeyEvent.VK_O); item.setActionCommand("User options"); item.addActionListener(this); menu.add(item); menu.addSeparator(); item = new JMenuItem("Register File Format"); item.setMnemonic(KeyEvent.VK_R); item.setActionCommand("Register file format"); item.addActionListener(this); menu.add(item); item = new JMenuItem("Unregister File Format"); item.setMnemonic(KeyEvent.VK_U); item.setActionCommand("Unregister file format"); item.addActionListener(this); menu.add(item); // add help menu menu = new JMenu("Help"); menu.setMnemonic('H'); mbar.add(menu); item = new JMenuItem("User's Guide"); item.setMnemonic(KeyEvent.VK_U); item.setActionCommand("Users guide"); item.addActionListener(this); menu.add(item); menu.addSeparator(); if ((helpViews != null) && (helpViews.size() > 0)) { int n = helpViews.size(); for (int i = 0; i < n; i++) { HelpView theView = (HelpView) helpViews.get(i); item = new JMenuItem(theView.getLabel()); item.setActionCommand(theView.getActionCommand()); item.addActionListener(this); menu.add(item); } menu.addSeparator(); } item = new JMenuItem("HDF4 Library Version"); item.setMnemonic(KeyEvent.VK_4); item.setActionCommand("HDF4 library"); item.addActionListener(this); h4GUIs.add(item); menu.add(item); item = new JMenuItem("HDF5 Library Version"); item.setMnemonic(KeyEvent.VK_5); item.setActionCommand("HDF5 library"); item.addActionListener(this); h5GUIs.add(item); menu.add(item); item = new JMenuItem("Java Version"); item.setMnemonic(KeyEvent.VK_5); item.setActionCommand("Java version"); item.addActionListener(this); menu.add(item); menu.addSeparator(); item = new JMenuItem("Supported File Formats"); item.setMnemonic(KeyEvent.VK_L); item.setActionCommand("File format list"); item.addActionListener(this); menu.add(item); menu.addSeparator(); item = new JMenuItem("About..."); item.setMnemonic(KeyEvent.VK_A); item.setActionCommand("About"); item.addActionListener(this); menu.add(item); return mbar; } private JToolBar createToolBar() { JToolBar tbar = new JToolBar(); tbar.setFloatable(false); tbar.setName("tbar"); // open file button JButton button = new JButton(ViewProperties.getFileopenIcon()); tbar.add(button); button.setName("Open"); button.setToolTipText("Open"); button.addActionListener(this); button.setActionCommand("Open file"); // close file button button = new JButton(ViewProperties.getFilecloseIcon()); tbar.add(button); button.setName("Close"); button.setToolTipText("Close"); button.addActionListener(this); button.setActionCommand("Close file"); tbar.addSeparator(new Dimension(20, 20)); // help button button = new JButton(ViewProperties.getHelpIcon()); tbar.add(button); button.setName("Help"); button.setToolTipText("Help"); button.addActionListener(this); button.setActionCommand("Users guide"); // HDF4 Library Version button button = new JButton(ViewProperties.getH4Icon()); tbar.add(button); button.setName("HDF4 library"); button.setToolTipText("HDF4 Library Version"); button.addActionListener(this); button.setActionCommand("HDF4 library"); if (FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4) == null) { button.setEnabled(false); } // HDF5 Library Version button button = new JButton(ViewProperties.getH5Icon()); tbar.add(button); button.setName("HDF5 library"); button.setToolTipText("HDF5 Library Version"); button.addActionListener(this); button.setActionCommand("HDF5 library"); if (FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5) == null) { button.setEnabled(false); } return tbar; } /** * Bring the window to the front. *

    * * @param name * the name of the window to show. */ private void showWindow(String name) { int n = contentPane.getComponentCount(); if (n <= 0) { return; } Component comp = null; JInternalFrame jif = null; for (int i = 0; i < n; i++) { comp = contentPane.getComponent(i); if (!(comp instanceof JInternalFrame)) continue; jif = (JInternalFrame) contentPane.getComponent(i); if (jif.getName().equals(name)) { jif.toFront(); return; } } } /** Cascade all windows. */ private void cascadeWindow() { int y = 2, x = 2; JInternalFrame jif = null; Component[] clist = contentPane.getComponents(); if ((clist == null) || (clist.length <= 0)) { return; } Dimension d = contentPane.getSize(); int w = Math.max(50, d.width - 100); int h = Math.max(50, d.height - 100); for (int i = 0; i < clist.length; i++) { jif = (JInternalFrame) clist[i]; jif.setBounds(x, y, w, h); contentPane.moveToFront(jif); x += 20; y += 20; } } /** Tile all windows. */ private void tileWindow() { int y = 0, x = 0, idx = 0; JInternalFrame jif = null; Component[] clist = contentPane.getComponents(); if ((clist == null) || (clist.length <= 0)) { return; } int n = clist.length; int cols = (int) Math.sqrt(n); int rows = (int) Math.ceil((double) n / (double) cols); Dimension d = contentPane.getSize(); int w = d.width / cols; int h = d.height / rows; for (int i = 0; i < rows; i++) { x = 0; for (int j = 0; j < cols; j++) { idx = i * cols + j; if (idx >= n) { return; } jif = (JInternalFrame) clist[idx]; jif.setBounds(x, y, w, h); x += w; } y += h; } } /** Closes all windows. */ private void closeAllWindow() { JInternalFrame jif = null; Component[] clist = contentPane.getComponents(); if ((clist == null) || (clist.length <= 0)) { return; } for (int i = 0; i < clist.length; i++) { jif = (JInternalFrame) clist[i]; jif.dispose(); jif = null; } } /** disable/enable GUI components */ private static void setEnabled(List list, boolean b) { Component item = null; Iterator it = list.iterator(); while (it.hasNext()) { item = it.next(); item.setEnabled(b); } } // To do: Implementing java.io.ActionListener public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Exit")) { dispose(); // terminate the application } else if (cmd.startsWith("Open file")) { int fileAccessID = FileFormat.WRITE; String filename = null; if (ViewProperties.isReadOnly()) fileAccessID = FileFormat.READ; if (cmd.equals("Open file: from file bar")) { filename = (String) urlBar.getSelectedItem(); if (filename == null || filename.length() < 1) { return; } // local file if (!(filename.startsWith("http://") || filename.startsWith("ftp://"))) { File tmpFile = new File(filename); if (!tmpFile.exists()) return; if (tmpFile.isDirectory()) { currentDir = filename; filename = openLocalFile(); } } } else if (cmd.equals("Open file read-only")) { fileAccessID = FileFormat.READ; filename = openLocalFile(); } else if (cmd.startsWith("Open file://")) { filename = cmd.substring(12); } else { filename = openLocalFile(); } if (filename == null) { return; } if (filename.startsWith("http://") || filename.startsWith("ftp://")) { filename = openRemoteFile(filename); } if ((filename == null) || (filename.length() < 1) || filename.equals(currentFile)) { return; } currentFile = filename; try { urlBar.removeItem(filename); urlBar.insertItemAt(filename, 0); urlBar.setSelectedIndex(0); } catch (Exception ex) { } try { treeView.openFile(filename, fileAccessID + FileFormat.OPEN_NEW); } catch (Throwable ex) { try { treeView.openFile(filename, FileFormat.READ); } catch (Throwable ex2) { String msg = "Failed to open file " + filename + "\n" + ex2; toolkit.beep(); JOptionPane.showMessageDialog(this, msg, getTitle(), JOptionPane.ERROR_MESSAGE); } } } else if (cmd.equals("Open from irods")) { try { openFromSRB(); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.startsWith("New HDF")) { String ftype = FileFormat.FILE_TYPE_HDF5; if (cmd.equals("New HDF4 file")) { ftype = FileFormat.FILE_TYPE_HDF4; } NewFileDialog dialog = new NewFileDialog(this, currentDir, ftype, treeView.getCurrentFiles()); dialog.setName("newfiledialog"); // dialog.show(); if (!dialog.isFileCreated()) { return; } String filename = dialog.getFile(); if (filename == null) { return; } try { treeView.openFile(filename, FileFormat.WRITE); currentFile = filename; try { urlBar.removeItem(filename); urlBar.insertItemAt(filename, 0); urlBar.setSelectedIndex(0); } catch (Exception ex2) { } } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage() + "\n" + filename, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.equals("Close file")) { closeFile(treeView.getSelectedFile()); } else if (cmd.equals("Close all file")) { closeAllWindow(); List files = treeView.getCurrentFiles(); while (!files.isEmpty()) { try { treeView.closeFile(files.get(0)); } catch (Exception ex) { } } currentFile = null; attributeArea.setText(""); } else if (cmd.equals("Reload file")) { reloadFile(); } else if (cmd.equals("Save current file as")) { try { treeView.saveFile(treeView.getSelectedFile()); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); } } else if (cmd.equals("Save current file")) { /* save what have been changed in memory into file */ try { FileFormat file = treeView.getSelectedFile(); List views = getDataViews(); Object theView = null; TableView tableView = null; TextView textView = null; FileFormat theFile = null; if (views != null) { int n = views.size(); for (int i = 0; i < n; i++) { theView = views.get(i); if (theView instanceof TableView) { tableView = (TableView) theView; theFile = tableView.getDataObject().getFileFormat(); if (file.equals(theFile)) { tableView.updateValueInFile(); } } else if (theView instanceof TextView) { textView = (TextView) theView; theFile = textView.getDataObject().getFileFormat(); if (file.equals(theFile)) { textView.updateValueInFile(); } } } // for (int i=0; i local_enum = FileFormat.getFileFormatKeys(); while (local_enum.hasMoreElements()) { theKey = (String) local_enum.nextElement(); if (theKey.endsWith(key)) { JOptionPane.showMessageDialog(this, "Invalid key: " + key + " is taken.", "Register File Format", JOptionPane.ERROR_MESSAGE); return; } theClassName = FileFormat.getFileFormat(theKey).getClass().getName(); if (theClassName.endsWith(className)) { JOptionPane.showMessageDialog(this, "The file format has already been registered: " + className, "Register File Format", JOptionPane.ERROR_MESSAGE); return; } } // enables use of JHDF5 in JNLP (Web Start) applications, the system // class loader with reflection first. Class theClass = null; try { theClass = Class.forName(className); } catch (Exception ex) { try { theClass = ViewProperties.loadExtClass().loadClass(className); } catch (Exception ex2) { theClass = null; } } if (theClass == null) { return; } try { Object theObject = theClass.newInstance(); if (theObject instanceof FileFormat) { FileFormat.addFileFormat(key, (FileFormat) theObject); } } catch (Throwable ex) { JOptionPane.showMessageDialog(this, "Failed to register " + str + "\n\n" + ex, "Register File Format", JOptionPane.ERROR_MESSAGE); return; } if ((extension != null) && (extension.length() > 0)) { extension = extension.trim(); String ext = ViewProperties.getFileExtension(); ext += ", " + extension; ViewProperties.setFileExtension(ext); } } else if (cmd.equals("Unregister file format")) { Enumeration keys = FileFormat.getFileFormatKeys(); ArrayList keylist = new ArrayList(); while (keys.hasMoreElements()) { keylist.add((Object)keys.nextElement()); } String theKey = (String) JOptionPane.showInputDialog(this, "Unregister a file format", "Unregister a file format", JOptionPane.WARNING_MESSAGE, ViewProperties.getLargeHdfIcon(), keylist.toArray(), null); if (theKey == null) { return; } FileFormat.removeFileFormat(theKey); } else if (cmd.equals("Users guide")) { String ugPath = ViewProperties.getUsersGuide(); // URL is invalid, use default path. if (ugPath == null || !ugPath.startsWith("http://")) { String sep = File.separator; File tmpFile = new File(ugPath); if (!(tmpFile.exists())) { ugPath = rootDir + sep + "UsersGuide" + sep + "index.html"; tmpFile = new File(ugPath); if (!(tmpFile.exists())) { // use the online copy ugPath = "http://www.hdfgroup.org/hdf-java-html/hdfview/UsersGuide/index.html"; } ViewProperties.setUsersGuide(ugPath); } } try { Tools.launchBrowser(ugPath); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), "HDFView", JOptionPane.ERROR_MESSAGE, ViewProperties.getLargeHdfIcon()); } } else if (cmd.equals("HDF4 library")) { FileFormat thefile = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4); if (thefile == null) { return; } JOptionPane.showMessageDialog(this, thefile.getLibversion(), "HDFView", JOptionPane.PLAIN_MESSAGE, ViewProperties.getLargeHdfIcon()); } else if (cmd.equals("HDF5 library")) { FileFormat thefile = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); if (thefile == null) { return; } JOptionPane.showMessageDialog(this, thefile.getLibversion(), "HDFView", JOptionPane.PLAIN_MESSAGE, ViewProperties.getLargeHdfIcon()); } else if (cmd.equals("Java version")) { String info = "Compiled at " + JAVA_COMPILER + "\nRunning at " + System.getProperty("java.version"); JOptionPane.showMessageDialog(this, info, "HDFView", JOptionPane.PLAIN_MESSAGE, ViewProperties.getLargeHdfIcon()); } else if (cmd.equals("File format list")) { Enumeration formatKeys = FileFormat.getFileFormatKeys(); String str = "\nSupported File Formats: \n"; while (formatKeys.hasMoreElements()) { str += " " + formatKeys.nextElement() + "\n"; } str += "\n"; JOptionPane.showMessageDialog(this, str, "HDFView", JOptionPane.PLAIN_MESSAGE, ViewProperties.getLargeHdfIcon()); } else if (cmd.equals("About")) { JOptionPane.showMessageDialog(this, aboutHDFView, "HDFView", JOptionPane.PLAIN_MESSAGE, ViewProperties.getLargeHdfIcon()); } else if (cmd.equals("Popup URL list")) { urlBar.setPopupVisible(true); } else if (cmd.equals("Clear current selection")) { // urlBar.setPopupVisible(true); urlBar.setSelectedIndex(-1); } else { if ((helpViews == null) || (helpViews.size() <= 0)) { return; } // try if one of the user help information; int n = helpViews.size(); for (int i = 0; i < n; i++) { HelpView theView = (HelpView) helpViews.get(i); if (cmd.equals(theView.getActionCommand())) { theView.show(); break; } } // for (int i=0; i fileList = (List) tr.getTransferData(DataFlavor.javaFileListFlavor); int n = fileList.size(); for (int i = 0; i < n; i++) { File file = (File) fileList.get(i); if (file.isDirectory()) continue; String filename = file.getAbsolutePath(); currentFile = filename; try { treeView.openFile(filename, FileFormat.WRITE); } catch (Throwable ex) { try { treeView.openFile(filename, FileFormat.READ); } catch (Throwable ex2) { String msg = "Failed to open file " + filename + "\n" + ex2; toolkit.beep(); JOptionPane.showMessageDialog(this, msg, getTitle(), JOptionPane.ERROR_MESSAGE); continue; } } try { urlBar.removeItem(filename); urlBar.insertItemAt(filename, 0); urlBar.setSelectedIndex(0); } catch (Exception ex) { } } evt.getDropTargetContext().dropComplete(true); } else { evt.rejectDrop(); } } catch (final IOException io) { evt.rejectDrop(); } catch (final UnsupportedFlavorException ufe) { evt.rejectDrop(); } } public void dragExit(DropTargetEvent evt) { } public void dropActionChanged(DropTargetDragEvent evt) { } public void dragOver(DropTargetDragEvent dtde) { } public void dispose() { try { props.save(); } catch (Exception ex) { } try { closeAllWindow(); } catch (Exception ex) { } // close all open files try { List filelist = treeView.getCurrentFiles(); if ((filelist != null) && (filelist.size() > 0)) { Object[] files = filelist.toArray(); int n = files.length; for (int i = 0; i < n; i++) { try { treeView.closeFile((FileFormat) files[i]); } catch (Throwable ex) { continue; } } } } catch (Exception ex) { } try { super.dispose(); } catch (Exception ex) { } System.exit(0); } /** data content is displayed, and add the dataview to the main windows */ public void addDataView(DataView dataView) { if (dataView == null) { return; } if (!(dataView instanceof JInternalFrame)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Unsupported DataView: the dataview is not a JInternalFrame.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } // check if the data content is already displayed JInternalFrame[] frames = contentPane.getAllFrames(); JInternalFrame theFrame = null; if (frames != null) { // test if the data is already displayed for (int i = 0; i < frames.length; i++) { if (dataView.equals(frames[i])) { theFrame = frames[i]; break; } } } if (theFrame != null) { // Data is already displayed. Just bring the dataview to the front theFrame.toFront(); try { theFrame.setSelected(true); } catch (java.beans.PropertyVetoException e) { } return; } JInternalFrame frame = (JInternalFrame) dataView; contentPane.add(frame); HObject dataObject = null; try { dataObject = dataView.getDataObject(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); } if (dataObject == null) { // toolkit.beep(); // JOptionPane // .showMessageDialog( // this, // "Unsupported DataObject: the data object is not supported.", // getTitle(), JOptionPane.ERROR_MESSAGE); return; } String fullPath = dataObject.getPath() + dataObject.getName(); String cmd = "SHOW WINDOW" + dataObject.getFID() + fullPath; // make the // window // to be // uniquie: // fid+path frame.setName(cmd); // data windows are identified by full path the file // id frame.setMaximizable(true); frame.setClosable(true); frame.setResizable(true); JMenuItem item = new JMenuItem(fullPath); item.setActionCommand(cmd); item.addActionListener(this); if (windowMenu.getMenuComponentCount() == 6) { Component[] menuItems = windowMenu.getMenuComponents(); for (int i = 0; i < 6; i++) { menuItems[i].setEnabled(true); } } windowMenu.add(item); frame.setLocation(frameOffset, frameOffset); if (frameOffset < 60) { frameOffset += 15; } else { frameOffset = 0; } Dimension d = contentPane.getSize(); frame.setSize(d.width - 60, d.height - 60); frame.show(); } /** data content is closed, and remove the dataview from the main window */ public void removeDataView(DataView dataView) { if (!(dataView instanceof JInternalFrame)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "The dataview is not a JInternalFrame.", getTitle(), JOptionPane.ERROR_MESSAGE); return; } JInternalFrame frame = (JInternalFrame) dataView; String name = frame.getName(); int n = windowMenu.getItemCount(); JMenuItem theItem = null; for (int i = 6; i < n; i++) { theItem = windowMenu.getItem(i); if (theItem == null) { continue; } if (theItem.getActionCommand().equals(name)) { windowMenu.remove(i); theItem = null; break; } } if (windowMenu.getMenuComponentCount() == 6) { Component[] menuItems = windowMenu.getMenuComponents(); for (int i = 0; i < 6; i++) { menuItems[i].setEnabled(false); } } } public TreeView getTreeView() { return treeView; } /** Tree mouse event fired */ public void mouseEventFired(java.awt.event.MouseEvent e) { HObject obj = treeView.getCurrentObject(); if (obj == null) { return; } Object src = e.getSource(); if ((src instanceof JComponent)) { String filename = obj.getFile(); urlBar.setSelectedItem(filename); if (infoTabbedPane.getSelectedIndex() == 1) showMetaData(obj); } } public void showMetaData(HObject obj) { if (obj == null || currentFile == null) { return; } metadata.setLength(0); metadata.append(obj.getName()); String oidStr = null; long[] OID = obj.getOID(); if (OID != null) { oidStr = String.valueOf(OID[0]); for (int i = 1; i < OID.length; i++) { oidStr += ", " + OID[i]; } } metadata.append(" ("); metadata.append(oidStr); metadata.append(")"); if (obj instanceof Group) { Group g = (Group) obj; metadata.append("\n Group size = "); metadata.append(g.getMemberList().size()); } else if (obj instanceof Dataset) { Dataset d = (Dataset) obj; if (d.getRank() <= 0) { d.init(); } metadata.append("\n "); if (d instanceof ScalarDS) { Datatype dtype = d.getDatatype(); if (dtype != null) metadata.append(dtype.getDatatypeDescription()); } else if (d instanceof CompoundDS) { metadata.append("Compound/Vdata"); } metadata.append(", "); long dims[] = d.getDims(); if (dims != null) { metadata.append(dims[0]); for (int i = 1; i < dims.length; i++) { metadata.append(" x "); metadata.append(dims[i]); } } } // else if (obj instanceof Dataset) List attrList = null; try { attrList = obj.getMetadata(); } catch (Exception ex) { ex.printStackTrace(); } if (attrList == null) { metadata.append("\n Number of attributes = 0"); } else { int n = attrList.size(); metadata.append("\n Number of attributes = "); metadata.append(n); for (int i = 0; i < n; i++) { Object attrObj = attrList.get(i); if (!(attrObj instanceof Attribute)) { continue; } Attribute attr = (Attribute) attrObj; metadata.append("\n "); metadata.append(attr.getName()); metadata.append(" = "); metadata.append(attr.toString(",")); } } attributeArea.setText(metadata.toString()); attributeArea.setCaretPosition(0); } /** * Returns DataView contains the specified data object. It is useful to * avoid redundant display of data object that is opened already. * * @param dataObject * the whose presence in the main view is to be tested. * @return DataView contains the specified data object, null if the data * object is not displayed. */ public DataView getDataView(HObject dataObject) { if (dataObject == null) { return null; } // check if the data content is already displayed JInternalFrame[] frames = contentPane.getAllFrames(); JInternalFrame theFrame = null; if (frames == null) { return null; } HObject obj = null; for (int i = 0; i < frames.length; i++) { if (!(frames[i] instanceof DataView)) { continue; } obj = (HObject) (((DataView) frames[i]).getDataObject()); if (dataObject.equals(obj)) { theFrame = frames[i]; break; // data is already displayed } } return (DataView) theFrame; } /** * Returns a list of all open DataViews */ public List getDataViews() { // check if the data content is already displayed JInternalFrame[] frames = contentPane.getAllFrames(); if ((frames == null) || (frames.length <= 0)) { return null; } Vector views = new Vector(frames.length); for (int i = 0; i < frames.length; i++) { if (!(frames[i] instanceof DataView)) { continue; } else { views.add(frames[i]); } } return views; } /** * @return a list of treeview implementations. */ public static final List getListOfTreeView() { return treeViews; } /** * @return a list of imageview implementations. */ public static final List getListOfImageView() { return imageViews; } /** * @return a list of tableview implementations. */ public static final List getListOfTableView() { return tableViews; } /** * @return a list of textview implementations. */ public static final List getListOfTextView() { return textViews; } /** * @return a list of metaDataview implementations. */ public static final List getListOfMetaDataView() { return metaDataViews; } /** * @return a list of paletteview implementations. */ public static final List getListOfPaletteView() { return paletteViews; } /** * Display feedback message. * * @param msg * the message to display. */ public void showStatus(String msg) { message.append(msg); message.append("\n"); statusArea.setText(message.toString()); } public void reloadFile() { int temp_index_type = 0; int temp_index_order = 0; FileFormat theFile = treeView.getSelectedFile(); if (theFile.isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5))) { temp_index_type = theFile.getIndexType(null); temp_index_order = theFile.getIndexOrder(null); } closeFile(theFile); if (theFile.isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5))) { theFile.setIndexType(temp_index_type); theFile.setIndexOrder(temp_index_order); } try { treeView.reopenFile(theFile); } catch (Exception ex) { } } /** choose local file */ private String openLocalFile() { JFileChooser fchooser = new JFileChooser(currentDir); fchooser.setFileFilter(DefaultFileFilter.getFileFilter()); int returnVal = fchooser.showOpenDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return null; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return null; } if (choosedFile.isDirectory()) { currentDir = choosedFile.getPath(); } else { currentDir = choosedFile.getParent(); } return choosedFile.getAbsolutePath(); } /** load remote file and save it to local temporary directory */ private String openRemoteFile(String urlStr) { String localFile = null; if (urlStr == null) { return null; } if (urlStr.startsWith("http://")) { localFile = urlStr.substring(7); } else if (urlStr.startsWith("ftp://")) { localFile = urlStr.substring(6); } else { return null; } localFile = localFile.replace('/', '@'); localFile = localFile.replace('\\', '@'); // search the local file cache String tmpDir = System.getProperty("java.io.tmpdir"); File tmpFile = new File(tmpDir); if (!tmpFile.canWrite()) tmpDir = System.getProperty("user.home"); localFile = tmpDir + localFile; tmpFile = new File(localFile); if (tmpFile.exists()) { return localFile; } URL url = null; try { url = new URL(urlStr); } catch (Exception ex) { url = null; toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } BufferedInputStream in = null; BufferedOutputStream out = null; try { in = new BufferedInputStream(url.openStream()); out = new BufferedOutputStream(new FileOutputStream(tmpFile)); } catch (Exception ex) { in = null; toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); try { out.close(); } catch (Exception ex2) { } return null; } setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); byte[] buff = new byte[512]; // set the default buff size to 512 try { int n = 0; while ((n = in.read(buff)) > 0) { out.write(buff, 0, n); } } catch (Exception ex) { } try { in.close(); } catch (Exception ex2) { } try { out.close(); } catch (Exception ex2) { } setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); return localFile; } /** open file from SRB server */ private void openFromSRB() throws Exception { if (ctrSrbFileDialog == null) { Class theClass = null; try { theClass = Class.forName("ncsa.hdf.srb.SRBFileDialog"); } catch (Exception ex) { theClass = null; showStatus(ex.toString()); throw (new ClassNotFoundException("Cannot find SRBFileDialog")); } try { Class[] paramClass = { Class.forName("java.awt.Frame") }; ctrSrbFileDialog = theClass.getConstructor(paramClass); } catch (Exception ex) { ctrSrbFileDialog = null; throw (new InstantiationException("Cannot construct SRBFileDialog")); } } if (srbFileDialog == null) { try { Object[] paramObj = { (java.awt.Frame) this }; srbFileDialog = (JDialog) ctrSrbFileDialog.newInstance(paramObj); } catch (Exception ex) { throw ex; } } else { srbFileDialog.setVisible(true); } currentFile = srbFileDialog.getName(); } // For test only. Delete it from production. // Add plugin modules. private static final void loadExtModules() throws Exception { ClassLoader extClassLoader = ViewProperties.loadExtClass(); Vector moduleListTreeView = ViewProperties.getTreeViewList(); Vector moduleListImageView = ViewProperties.getImageViewList(); if (extClassLoader == null || moduleListTreeView == null || moduleListImageView == null) return; String[] extTreeViews = { "ext.erdc.TreeViewERDC", "ext.npoess.TreeViewNPOESS" }; String[] extImageViews = { "ext.erdc.ImageViewERDC" }; for (int i = 0; i < extTreeViews.length; i++) { if (!moduleListTreeView.contains(extTreeViews[i])) { try { extClassLoader.loadClass(extTreeViews[i]); // make sure the // class exists moduleListTreeView.add(extTreeViews[i]); } catch (Exception ex) { continue; } } } for (int i = 0; i < extImageViews.length; i++) { if (!moduleListImageView.contains(extImageViews[i])) { try { extClassLoader.loadClass(extImageViews[i]); // make sure the // class exists moduleListImageView.add(extImageViews[i]); } catch (Exception ex) { continue; } } } } /** * The starting point of this application. * *
         * Usage: java(w)
         *        -Dncsa.hdf.hdf5lib.H5.hdf5lib="your HDF5 library path"
         *        -Dncsa.hdf.hdflib.HDFLibrary.hdflib="your HDF4 library path"
         *        -root "the directory where the HDFView is installed"
         *        [filename] "the file to open"
         * 
    */ public static void main(String args[]) { try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { } String rootDir = System.getProperty("user.dir"); File tmpFile = null; int i = 0, j = -1, W = 0, H = 0, X = 0, Y = 0; for (i = 0; i < args.length; i++) { if ("-root".equalsIgnoreCase(args[i])) { try { tmpFile = new File(args[++i]); j = i + 1; if (tmpFile.isDirectory()) { rootDir = tmpFile.getPath(); } else if (tmpFile.isFile()) { rootDir = tmpFile.getParent(); } } catch (Exception e) { } } else if ("-g".equalsIgnoreCase(args[i]) || "-geometry".equalsIgnoreCase(args[i])) { // -geometry WIDTHxHEIGHT+XOFF+YOFF try { String geom = args[++i]; j = i + 1; int idx = 0; int idx0 = geom.lastIndexOf('-'); int idx1 = geom.lastIndexOf('+'); idx = Math.max(idx0, idx1); if (idx > 0) { Y = Integer.parseInt(geom.substring(idx + 1)); if (idx == idx0) { Y = -Y; } geom = geom.substring(0, idx); idx0 = geom.lastIndexOf('-'); idx1 = geom.lastIndexOf('+'); idx = Math.max(idx0, idx1); if (idx > 0) { X = Integer.parseInt(geom.substring(idx + 1)); if (idx == idx0) { X = -X; } geom = geom.substring(0, idx); } } idx = geom.indexOf('x'); if (idx > 0) { W = Integer.parseInt(geom.substring(0, idx)); H = Integer.parseInt(geom.substring(idx + 1)); } } catch (Exception e) { e.printStackTrace(); } } else if ("-java.version".equalsIgnoreCase(args[i])) { String info = "Compiled at " + JAVA_COMPILER + "\nRunning at " + System.getProperty("java.version"); JOptionPane.showMessageDialog(new JFrame(), info, "HDFView", JOptionPane.PLAIN_MESSAGE, ViewProperties.getLargeHdfIcon()); System.exit(0); } } Vector flist = new Vector(); tmpFile = null; if (j >= 0) { for (i = j; i < args.length; i++) { tmpFile = new File(args[i]); if (tmpFile.exists() && (tmpFile.isFile() || tmpFile.isDirectory())) { flist.add(new File(tmpFile.getAbsolutePath())); } } } final Vector the_flist = flist; final String the_rootDir = rootDir; final int the_X = X, the_Y = Y, the_W = W, the_H = H; // Schedule a job for the event-dispatching thread: // creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { HDFView frame = new HDFView(the_rootDir, the_flist, the_W, the_H, the_X, the_Y); frame.setVisible(true); } }); // try { loadExtModules(); } catch (Exception ex) {} } } jhdf-2.9/ncsa/hdf/view/Tools.java0000644000175000017500000020570612050301063017563 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.Image; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.math.BigInteger; import java.util.BitSet; import java.util.StringTokenizer; import javax.imageio.ImageIO; import javax.swing.tree.DefaultMutableTreeNode; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.ScalarDS; import ncsa.hdf.view.ViewProperties.BITMASK_OP; /** * The "Tools" class contains various of tools for HDF files such as jpeg to HDF * converter. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public final class Tools { public static final long MAX_INT8 = 127; public static final long MAX_UINT8 = 255; public static final long MAX_INT16 = 32767; public static final long MAX_UINT16 = 65535; public static final long MAX_INT32 = 2147483647; public static final long MAX_UINT32 = 4294967295L; public static final long MAX_INT64 = 9223372036854775807L; public static final BigInteger MAX_UINT64 = new BigInteger("18446744073709551615"); /** Key for JPEG image file type. */ public static final String FILE_TYPE_JPEG = "JPEG"; /** Key for TIFF image file type. */ public static final String FILE_TYPE_TIFF = "TIFF"; /** Key for PNG image file type. */ public static final String FILE_TYPE_PNG = "PNG"; /** Key for GIF image file type. */ public static final String FILE_TYPE_GIF = "GIF"; /** Key for BMP image file type. */ public static final String FILE_TYPE_BMP = "BMP"; /** Key for all image file type. */ public static final String FILE_TYPE_IMAGE = "IMG"; /** Print out debug information */ public static final void debug(Object caller, Object msg) { if (caller != null) System.out.println("*** " + caller.getClass().getName() + ": " + msg); } /** * Converts an image file into HDF4/5 file. * * @param imgFileName * the input image file. * @param hFileName * the name of the HDF4/5 file. * @param fromType * the type of image. * @param toType * the type of file converted to. */ public static void convertImageToHDF(String imgFileName, String hFileName, String fromType, String toType) throws Exception { File imgFile = null; if (imgFileName == null) { throw new NullPointerException("The source image file is null."); } else if (!(imgFile = new File(imgFileName)).exists()) { throw new NullPointerException("The source image file does not exist."); } else if (hFileName == null) { throw new NullPointerException("The target HDF file is null."); } if (!fromType.equals(FILE_TYPE_IMAGE)) { throw new UnsupportedOperationException("Unsupported image type."); } else if (!(toType.equals(FileFormat.FILE_TYPE_HDF4) || toType.equals(FileFormat.FILE_TYPE_HDF5))) { throw new UnsupportedOperationException("Unsupported destination file type."); } BufferedImage image = null; try { BufferedInputStream in = new BufferedInputStream(new FileInputStream(imgFileName)); image = ImageIO.read(in); in.close(); } catch (Throwable err) { image = null; } if (image == null) throw new UnsupportedOperationException("Failed to read image: " + imgFileName); int h = image.getHeight(); int w = image.getWidth(); byte[] data = null; try { data = new byte[3 * h * w]; } catch (OutOfMemoryError err) { err.printStackTrace(); throw new RuntimeException("Out of memory error."); } int idx = 0; int rgb = 0; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { rgb = image.getRGB(j, i); data[idx++] = (byte) (rgb >> 16); data[idx++] = (byte) (rgb >> 8); data[idx++] = (byte) rgb; } } long[] dims = null; Datatype type = null; Group pgroup = null; String imgName = imgFile.getName(); FileFormat newfile = null, thefile = null; if (toType.equals(FileFormat.FILE_TYPE_HDF5)) { thefile = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); long[] h5dims = { h, w, 3 }; // RGB pixel interlace dims = h5dims; } else if (toType.equals(FileFormat.FILE_TYPE_HDF4)) { thefile = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF4); long[] h4dims = { w, h, 3 }; // RGB pixel interlace dims = h4dims; } else { thefile = null; } if (thefile != null) { newfile = thefile.createInstance(hFileName, FileFormat.CREATE); newfile.open(); pgroup = (Group) ((DefaultMutableTreeNode) newfile.getRootNode()).getUserObject(); type = newfile.createDatatype(Datatype.CLASS_CHAR, 1, Datatype.NATIVE, Datatype.SIGN_NONE); newfile.createImage(imgName, pgroup, type, dims, null, null, -1, 3, ScalarDS.INTERLACE_PIXEL, data); newfile.close(); } // clean up memory data = null; image = null; Runtime.getRuntime().gc(); } /** * Save a BufferedImage into an image file. * * @param image * the BufferedImage to save. * @param file * the image file. * @param type * the image type. */ public static void saveImageAs(BufferedImage image, File file, String type) throws Exception { if (image == null) { throw new NullPointerException("The source image is null."); } ImageIO.write(image, type, file); } /** * Creates the gray palette of the indexed 256-color table. *

    * The palette values are stored in a two-dimensional byte array and arrange * by color components of red, green and blue. palette[][] = byte[3][256], * where, palette[0][], palette[1][] and palette[2][] are the red, green and * blue components respectively. * * @return the gray palette in the form of byte[3][256] */ public static final byte[][] createGrayPalette() { byte[][] p = new byte[3][256]; for (int i = 0; i < 256; i++) { p[0][i] = p[1][i] = p[2][i] = (byte) (i); } return p; } /** * Creates the reverse gray palette of the indexed 256-color table. *

    * The palette values are stored in a two-dimensional byte array and arrange * by color components of red, green and blue. palette[][] = byte[3][256], * where, palette[0][], palette[1][] and palette[2][] are the red, green and * blue components respectively. * * @return the gray palette in the form of byte[3][256] */ public static final byte[][] createReverseGrayPalette() { byte[][] p = new byte[3][256]; for (int i = 0; i < 256; i++) { p[0][i] = p[1][i] = p[2][i] = (byte) (255 - i); } return p; } /** * Creates the gray wave palette of the indexed 256-color table. *

    * The palette values are stored in a two-dimensional byte array and arrange * by color components of red, green and blue. palette[][] = byte[3][256], * where, palette[0][], palette[1][] and palette[2][] are the red, green and * blue components respectively. * * @return the gray palette in the form of byte[3][256] */ public static final byte[][] createGrayWavePalette() { byte[][] p = new byte[3][256]; for (int i = 0; i < 256; i++) { p[0][i] = p[1][i] = p[2][i] = (byte) (255 / 2 + (255 / 2) * Math.sin((i - 32) / 20.3)); } return p; } /** * Creates the rainbow palette of the indexed 256-color table. *

    * The palette values are stored in a two-dimensional byte array and arrange * by color components of red, green and blue. palette[][] = byte[3][256], * where, palette[0][], palette[1][] and palette[2][] are the red, green and * blue components respectively. * * @return the rainbow palette in the form of byte[3][256] */ public static final byte[][] createRainbowPalette() { byte r, g, b; byte[][] p = new byte[3][256]; for (int i = 1; i < 255; i++) { if (i <= 29) { r = (byte) (129.36 - i * 4.36); g = 0; b = (byte) 255; } else if (i <= 86) { r = 0; g = (byte) (-133.54 + i * 4.52); b = (byte) 255; } else if (i <= 141) { r = 0; g = (byte) 255; b = (byte) (665.83 - i * 4.72); } else if (i <= 199) { r = (byte) (-635.26 + i * 4.47); g = (byte) 255; b = 0; } else { r = (byte) 255; g = (byte) (1166.81 - i * 4.57); b = 0; } p[0][i] = r; p[1][i] = g; p[2][i] = b; } p[0][0] = p[1][0] = p[2][0] = 0; p[0][255] = p[1][255] = p[2][255] = (byte) 255; return p; } /** * Creates the nature palette of the indexed 256-color table. *

    * The palette values are stored in a two-dimensional byte array and arrange * by color components of red, green and blue. palette[][] = byte[3][256], * where, palette[0][], palette[1][] and palette[2][] are the red, green and * blue components respectively. * * @return the nature palette in the form of byte[3][256] */ public static final byte[][] createNaturePalette() { byte[][] p = new byte[3][256]; for (int i = 1; i < 210; i++) { p[0][i] = (byte) ((Math.sin((double) (i - 5) / 16) + 1) * 90); p[1][i] = (byte) ((1 - Math.sin((double) (i - 30) / 12)) * 64 * (1 - (double) i / 255) + 128 - i / 2); p[2][i] = (byte) ((1 - Math.sin((double) (i - 8) / 9)) * 110 + 30); } for (int i = 210; i < 255; i++) { p[0][i] = (byte) 80; p[1][i] = (byte) 0; p[2][i] = (byte) 200; } p[0][0] = p[1][0] = p[2][0] = 0; p[0][255] = p[1][255] = p[2][255] = (byte) 255; return p; } /** * Creates the wave palette of the indexed 256-color table. *

    * The palette values are stored in a two-dimensional byte array and arrange * by color components of red, green and blue. palette[][] = byte[3][256], * where, palette[0][], palette[1][] and palette[2][] are the red, green and * blue components respectively. * * @return the wave palette in the form of byte[3][256] */ public static final byte[][] createWavePalette() { byte[][] p = new byte[3][256]; for (int i = 1; i < 255; i++) { p[0][i] = (byte) ((Math.sin(((double) i / 40 - 3.2)) + 1) * 128); p[1][i] = (byte) ((1 - Math.sin((i / 2.55 - 3.1))) * 70 + 30); p[2][i] = (byte) ((1 - Math.sin(((double) i / 40 - 3.1))) * 128); } p[0][0] = p[1][0] = p[2][0] = 0; p[0][255] = p[1][255] = p[2][255] = (byte) 255; return p; } /** * read an image palette from a file. * * A palette file has format of (value, red, green, blue). The color value * in palette file can be either unsigned char [0..255] or float [0..1]. * Float value will be converted to [0..255]. * * The color table in file can have any number of entries between 2 to 256. * It will be converted to a color table of 256 entries. Any missing index * will calculated by linear interpolation between the neighboring index * values. For example, index 11 is missing in the following table 10 200 60 * 20 12 100 100 60 Index 11 will be calculated based on index 10 and index * 12, i.e. 11 150 80 40 * * @param filename * the name of the palette file. * * @return the wave palette in the form of byte[3][256] */ public static final byte[][] readPalette(String filename) { final int COLOR256 = 256; BufferedReader in = null; String line = null; int nentries = 0, i, j, idx; float v, r, g, b, ratio, max_v, min_v, max_color, min_color; float[][] tbl = new float[COLOR256][4]; /* value, red, green, blue */ if (filename == null) return null; try { in = new BufferedReader(new FileReader(filename)); } catch (Exception ex) { in = null; } if (in == null) return null; idx = 0; v = r = g = b = ratio = max_v = min_v = max_color = min_color = 0; do { try { line = in.readLine(); } catch (Exception ex) { line = null; } if (line == null) continue; StringTokenizer st = new StringTokenizer(line); // invalid line if (st.countTokens() != 4) { continue; } try { v = Float.valueOf(st.nextToken()); r = Float.valueOf(st.nextToken()); g = Float.valueOf(st.nextToken()); b = Float.valueOf(st.nextToken()); } catch (NumberFormatException ex) { continue; } tbl[idx][0] = v; tbl[idx][1] = r; tbl[idx][2] = g; tbl[idx][3] = b; if (idx == 0) { max_v = min_v = v; max_color = min_color = r; } max_v = Math.max(max_v, v); max_color = Math.max(max_color, r); max_color = Math.max(max_color, g); max_color = Math.max(max_color, b); min_v = Math.min(min_v, v); min_color = Math.min(min_color, r); min_color = Math.min(min_color, g); min_color = Math.min(min_color, b); idx++; if (idx >= COLOR256) break; /* only support to 256 colors */ } while (line != null); try { in.close(); } catch (Exception ex) { } nentries = idx; if (nentries <= 1) // must have more than one entries return null; // convert color table to byte nentries = idx; if (max_color <= 1) { ratio = (min_color == max_color) ? 1.0f : ((COLOR256 - 1.0f) / (max_color - min_color)); for (i = 0; i < nentries; i++) { for (j = 1; j < 4; j++) tbl[i][j] = (tbl[i][j] - min_color) * ratio; } } // convert table to 256 entries idx = 0; ratio = (min_v == max_v) ? 1.0f : ((COLOR256 - 1.0f) / (max_v - min_v)); int[][] p = new int[3][COLOR256]; for (i = 0; i < nentries; i++) { idx = (int) ((tbl[i][0] - min_v) * ratio); for (j = 0; j < 3; j++) p[j][idx] = (int) tbl[i][j + 1]; } /* linear interpolating missing values in the color table */ for (i = 1; i < COLOR256; i++) { if ((p[0][i] + p[1][i] + p[2][i]) == 0) { j = i + 1; // figure out number of missing points between two given points while (j < COLOR256 && (p[0][j] + p[1][j] + p[2][j]) == 0) j++; if (j >= COLOR256) break; // nothing in the table to interpolating float d1 = (p[0][j] - p[0][i - 1]) / (j - i); float d2 = (p[1][j] - p[1][i - 1]) / (j - i); float d3 = (p[2][j] - p[2][i - 1]) / (j - i); for (int k = i; k <= j; k++) { p[0][k] = (int) (p[0][i - 1] + d1 * (k - i + 1)); p[1][k] = (int) (p[1][i - 1] + d2 * (k - i + 1)); p[2][k] = (int) (p[2][i - 1] + d3 * (k - i + 1)); } i = j + 1; } // if ((p[0][i] + p[1][i] + p[2][i]) == 0) } // for (i = 1; i < COLOR256; i++) { byte[][] pal = new byte[3][COLOR256]; for (i = 1; i < COLOR256; i++) { for (j = 0; j < 3; j++) pal[j][i] = (byte) (p[j][i]); } return pal; } /** * This method returns true if the specified image has transparent pixels. * * @param image * the image to be check if has alpha. * @return true if the image has alpha setting. */ public static boolean hasAlpha(Image image) { if (image == null) { return false; } // If buffered image, the color model is readily available if (image instanceof BufferedImage) { BufferedImage bimage = (BufferedImage) image; return bimage.getColorModel().hasAlpha(); } // Use a pixel grabber to retrieve the image's color model; // grabbing a single pixel is usually sufficient PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false); try { pg.grabPixels(); } catch (InterruptedException e) { } ColorModel cm = pg.getColorModel(); return cm.hasAlpha(); } /** * Creates a RGB indexed image of 256 colors. * * @param imageData * the byte array of the image data. * @param palette * the color lookup table. * @param w * the width of the image. * @param h * the height of the image. * @return the image. */ public static Image createIndexedImage(byte[] imageData, byte[][] palette, int w, int h) { Image theImage = null; IndexColorModel colorModel = new IndexColorModel(8, // bits - the number // of bits each // pixel occupies 256, // size - the size of the color component arrays palette[0], // r - the array of red color components palette[1], // g - the array of green color components palette[2]); // b - the array of blue color components theImage = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(w, h, colorModel, imageData, 0, w)); return theImage; } /** * Creates a true color image. *

    * DirectColorModel is used to construct the image from raw data. The * DirectColorModel model is similar to an X11 TrueColor visual, which has * the following parameters:
    * *

         * Number of bits:        32
         *             Red mask:              0x00ff0000
         *             Green mask:            0x0000ff00
         *             Blue mask:             0x000000ff
         *             Alpha mask:            0xff000000
         *             Color space:           sRGB
         *             isAlphaPremultiplied:  False
         *             Transparency:          Transparency.TRANSLUCENT
         *             transferType:          DataBuffer.TYPE_INT
         * 
    *

    * The data may be arranged in one of two ways: by pixel or by plane. In * both cases, the dataset will have a dataspace with three dimensions, * height, width, and components. *

    * For HDF4, the interlace modes specify orders for the dimensions as: * *

         * INTERLACE_PIXEL = [width][height][pixel components]
         *            INTERLACE_PLANE = [pixel components][width][height]
         * 
    *

    * For HDF5, the interlace modes specify orders for the dimensions as: * *

         * INTERLACE_PIXEL = [height][width][pixel components]
         *            INTERLACE_PLANE = [pixel components][height][width]
         * 
    *

    * * @param imageData * the byte array of the image data. * @param planeInterlace * flag if the image is plane intelace. * @param w * the width of the image. * @param h * the height of the image. * @return the image. */ public static Image createTrueColorImage(byte[] imageData, boolean planeInterlace, int w, int h) { Image theImage = null; int imgSize = w * h; int packedImageData[] = new int[imgSize]; int pixel = 0, idx = 0, r = 0, g = 0, b = 0; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { pixel = r = g = b = 0; if (planeInterlace) { r = imageData[idx]; g = imageData[imgSize + idx]; b = imageData[imgSize * 2 + idx]; } else { r = imageData[idx * 3]; g = imageData[idx * 3 + 1]; b = imageData[idx * 3 + 2]; } r = (r << 16) & 0x00ff0000; g = (g << 8) & 0x0000ff00; b = b & 0x000000ff; // bits packed into alpha (1), red (r), green (g) and blue (b) // as 11111111rrrrrrrrggggggggbbbbbbbb pixel = 0xff000000 | r | g | b; packedImageData[idx++] = pixel; } // for (int j=0; j * * @param rawData * The input raw data. * @param minmax * the range of the raw data. * @return the byte array of pixel data. */ public static byte[] getBytes(Object rawData, double[] minmax, byte[] byteData) { return Tools.getBytes(rawData, minmax, -1, -1, false, null, false, byteData); } public static byte[] getBytes(Object rawData, double[] minmax, int w, int h, boolean isTransposed, byte[] byteData) { return Tools.getBytes(rawData, minmax, w, h, isTransposed, null, false, byteData); } public static byte[] getBytes(Object rawData, double[] minmax, Object fillValue, byte[] byteData) { return Tools.getBytes(rawData, minmax, -1, -1, false, fillValue, false, byteData); } public static byte[] getBytes(Object rawData, double[] minmax, int w, int h, boolean isTransposed, Object fillValue, byte[] byteData) { return getBytes(rawData, minmax, w, h, isTransposed, fillValue, false, byteData); } /** * Convert an array of raw data into array of a byte data. *

    * * @param rawData * The input raw data. * @param minmax * the range of the raw data. * @param isTransposed * if the data is transposeed * @return the byte array of pixel data. */ public static byte[] getBytes(Object rawData, double[] minmax, int w, int h, boolean isTransposed, Object fillValue, boolean convertByteData, byte[] byteData) { // no input data if (rawData == null) { return null; } // input data is not an array if (!rawData.getClass().isArray()) { return null; } double min = Double.MAX_VALUE, max = -Double.MAX_VALUE, ratio = 1.0d; String cname = rawData.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); int size = Array.getLength(rawData); if (minmax == null) { minmax = new double[2]; minmax[0] = minmax[1] = 0; } if (dname == 'B') { return convertByteData((byte[]) rawData, minmax, w, h, isTransposed, fillValue, convertByteData, byteData); } if ((byteData == null) || (size != byteData.length)) { byteData = new byte[size]; // reuse the old buffer } if (minmax[0] == minmax[1]) { Tools.findMinMax(rawData, minmax, fillValue); } min = minmax[0]; max = minmax[1]; ratio = (min == max) ? 1.00d : (double) (255.00 / (max - min)); int idxSrc = 0, idxDst = 0; switch (dname) { case 'S': short[] s = (short[]) rawData; short fvs = 0; // set fill value to zero if (fillValue != null) { fvs = ((short[]) fillValue)[0]; } if (isTransposed) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { idxSrc = j * h + i; idxDst = i * w + j; if (s[idxSrc] <= min || s[idxSrc] == fvs) byteData[idxDst] = 0; else if (s[idxSrc] >= max) byteData[idxDst] = (byte) 255; else byteData[idxDst] = (byte) ((s[idxSrc] - min) * ratio); } } } else { for (int i = 0; i < size; i++) { if (s[i] <= min || s[i] == fvs) byteData[i] = 0; else if (s[i] >= max) byteData[i] = (byte) 255; else byteData[i] = (byte) ((s[i] - min) * ratio); } } break; case 'I': int[] ia = (int[]) rawData; int fvi = 0; // set fill value to zero if (fillValue != null) { fvi = ((int[]) fillValue)[0]; } if (isTransposed) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { idxSrc = j * h + i; idxDst = i * w + j; if (ia[idxSrc] <= min || ia[idxSrc] == fvi) byteData[idxDst] = 0; else if (ia[idxSrc] >= max) byteData[idxDst] = (byte) 255; else byteData[idxDst] = (byte) ((ia[idxSrc] - min) * ratio); } } } else { for (int i = 0; i < size; i++) { if (ia[i] <= min || ia[i] == fvi) byteData[i] = 0; else if (ia[i] >= max) byteData[i] = (byte) 255; else byteData[i] = (byte) ((ia[i] - min) * ratio); } } break; case 'J': long[] l = (long[]) rawData; long fvl = 0; // set fill value to zero if (fillValue != null) { fvl = ((long[]) fillValue)[0]; } if (isTransposed) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { idxSrc = j * h + i; idxDst = i * w + j; if (l[idxSrc] <= min || l[idxSrc] == fvl) byteData[idxDst] = 0; else if (l[idxSrc] >= max) byteData[idxDst] = (byte) 255; else byteData[idxDst] = (byte) ((l[idxSrc] - min) * ratio); } } } else { for (int i = 0; i < size; i++) { if (l[i] <= min || l[i] == fvl) byteData[i] = 0; else if (l[i] >= max) byteData[i] = (byte) 255; else byteData[i] = (byte) ((l[i] - min) * ratio); } } break; case 'F': float[] f = (float[]) rawData; float fvf = 0; // set fill value to zero if (fillValue != null) { fvf = ((float[]) fillValue)[0]; } if (isTransposed) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { idxSrc = j * h + i; idxDst = i * w + j; if (f[idxSrc] <= min || f[idxSrc] == fvf || isNaNINF((double) f[idxSrc])) byteData[idxDst] = 0; else if (f[idxSrc] >= max) byteData[idxDst] = (byte) 255; else byteData[idxDst] = (byte) ((f[idxSrc] - min) * ratio); } } } else { for (int i = 0; i < size; i++) { if (f[i] <= min | f[i] == fvf || isNaNINF((double) f[i])) byteData[i] = 0; else if (f[i] >= max) byteData[i] = (byte) 255; else byteData[i] = (byte) ((f[i] - min) * ratio); } } break; case 'D': double[] d = (double[]) rawData; double fvd = 0; // set fill value to zero if (fillValue != null) { fvd = ((double[]) fillValue)[0]; } if (isTransposed) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { idxSrc = j * h + i; idxDst = i * w + j; if (d[idxSrc] <= min || d[idxSrc] == fvd || isNaNINF(d[idxSrc])) byteData[idxDst] = 0; else if (d[idxSrc] >= max) byteData[idxDst] = (byte) 255; else byteData[idxDst] = (byte) ((d[idxSrc] - min) * ratio); } } } else { for (int i = 0; i < size; i++) { if (d[i] <= min || d[i] == fvd || isNaNINF(d[i])) byteData[i] = 0; else if (d[i] >= max) byteData[i] = (byte) 255; else byteData[i] = (byte) ((d[i] - min) * ratio); } } break; default: byteData = null; break; } // switch (dname) return byteData; } private static byte[] convertByteData(byte[] rawData, double[] minmax, int w, int h, boolean isTransposed, Object fillValue, boolean convertByteData, byte[] byteData) { double min = Double.MAX_VALUE, max = -Double.MAX_VALUE, ratio = 1.0d; if (rawData == null) return null; if (convertByteData) { if (minmax[0] == minmax[1]) { Tools.findMinMax(rawData, minmax, fillValue); } } if (minmax[0] == 0 && minmax[1] == 255) convertByteData = false; // no need to convert data // no conversion and no transpose if (!convertByteData && !isTransposed) { if (byteData != null && byteData.length == rawData.length) { System.arraycopy(rawData, 0, byteData, 0, rawData.length); return byteData; } return rawData; } // don't want to change the original raw data if (byteData == null || rawData == byteData) byteData = new byte[rawData.length]; if (!convertByteData) { // do not convert data, just transpose the data minmax[0] = 0; minmax[1] = 255; if (isTransposed) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { byteData[i * w + j] = rawData[j * h + i]; } } } return byteData; } // special data range used, must convert the data min = minmax[0]; max = minmax[1]; ratio = (min == max) ? 1.00d : (double) (255.00 / (max - min)); if (isTransposed) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { int idxSrc = j * h + i; int idxDst = i * w + j; if (rawData[idxSrc] >= max) byteData[idxDst] = (byte) 255; else if (rawData[idxSrc] <= min) byteData[idxDst] = (byte) 0; else byteData[idxDst] = (byte) ((rawData[idxSrc] - min) * ratio); } } } else { for (int i = 0; i < rawData.length; i++) { if (rawData[i] >= max) byteData[i] = (byte) 255; else if (rawData[i] <= min) byteData[i] = (byte) 0; else byteData[i] = (byte) ((rawData[i] - min) * ratio); } } return byteData; } /** * Create and initialize a new instance of the given class. * * @param initargs * - array of objects to be passed as arguments * @return a new instance of the given class. */ public static Object newInstance(Class cls, Object[] initargs) throws Exception { Object instance = null; if (cls == null) { return null; } if ((initargs == null) || (initargs.length == 0)) { instance = cls.newInstance(); } else { Constructor[] constructors = cls.getConstructors(); if ((constructors == null) || (constructors.length == 0)) { return null; } boolean isConstructorMatched = false; Constructor constructor = null; Class[] params = null; int m = constructors.length; int n = initargs.length; for (int i = 0; i < m; i++) { constructor = constructors[i]; params = constructor.getParameterTypes(); if (params.length == n) { // check if all the parameters are matched isConstructorMatched = params[0].isInstance(initargs[0]); for (int j = 1; j < n; j++) { isConstructorMatched = isConstructorMatched && params[j].isInstance(initargs[j]); } if (isConstructorMatched) { instance = constructor.newInstance(initargs); break; } } } // for (int i=0; i * The computation is based on the following scaling * *

         *      int_8       [0, 127]
         *      uint_8      [0, 255]
         *      int_16      [0, 32767]
         *      uint_16     [0, 65535]
         *      int_32      [0, 2147483647]
         *      uint_32     [0, 4294967295]
         *      int_64      [0, 9223372036854775807]
         *      uint_64     [0, 18446744073709551615] // Not supported.
         * 
    * * @param data * the raw data array of signed/unsigned integers * @param params * the auto gain parameter. params[0]=gain, params[1]=bias, * @param isUnsigned * the flag to indicate if the data array is unsigned integer * @return non-negative if successful; otherwise, returns negative */ public static int autoContrastCompute(Object data, double[] params, boolean isUnsigned) { int retval = 1; long maxDataValue = 255; double[] minmax = new double[2]; // check parameters if ((data == null) || (params == null) || (Array.getLength(data) <= 0) || (params.length < 2)) { return -1; } retval = autoContrastComputeMinMax(data, minmax); // force the min_max method so we can look at the target grids data sets if ((retval < 0) || (minmax[1] - minmax[0] < 10)) { retval = findMinMax(data, minmax, null); } if (retval < 0) { return -1; } String cname = data.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); switch (dname) { case 'B': maxDataValue = MAX_INT8; break; case 'S': maxDataValue = MAX_INT16; if (isUnsigned) { maxDataValue = MAX_UINT8; // data was upgraded from unsigned byte } break; case 'I': maxDataValue = MAX_INT32; if (isUnsigned) { maxDataValue = MAX_UINT16; // data was upgraded from unsigned short } break; case 'J': maxDataValue = MAX_INT64; if (isUnsigned) { maxDataValue = MAX_UINT32; // data was upgraded from unsigned int } break; default: retval = -1; break; } // switch (dname) if (minmax[0] == minmax[1]) { params[0] = 1.0; params[1] = 0.0; } else { // This histogram method has a tendency to stretch the // range of values to be a bit too big, so we can // account for this by adding and subtracting some percent // of the difference to the max/min values // to prevent the gain from going too high. double diff = minmax[1] - minmax[0]; double newmax = (minmax[1] + (diff * 0.1)); double newmin = (minmax[0] - (diff * 0.1)); if (newmax <= maxDataValue) { minmax[1] = newmax; } if (newmin >= 0) { minmax[0] = newmin; } params[0] = maxDataValue / (minmax[1] - minmax[0]); params[1] = -minmax[0]; } return retval; } /** * Apply autocontrast parameters to the original data in place (destructive) * * @param data_in * the original data array of signed/unsigned integers * @param data_out * the converted data array of signed/unsigned integers * @param params * the auto gain parameter. params[0]=gain, params[1]=bias * @param minmax * the data range. minmax[0]=min, minmax[1]=max * @param isUnsigned * the flag to indicate if the data array is unsigned integer * * @return the data array with the auto contrast conversion; otherwise, * returns null */ public static Object autoContrastApply(Object data_in, Object data_out, double[] params, double[] minmax, boolean isUnsigned) { int size = 0; double min = -MAX_INT64, max = MAX_INT64; if ((data_in == null) || (params == null) || (params.length < 2)) { return null; } if (minmax != null) { min = minmax[0]; max = minmax[1]; } // input and output array must be the same size size = Array.getLength(data_in); if ((data_out != null) && (size != Array.getLength(data_out))) { return null; } double gain = params[0]; double bias = params[1]; double value_out, value_in; String cname = data_in.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); switch (dname) { case 'B': byte[] b_in = (byte[]) data_in; if (data_out == null) { data_out = new byte[size]; } byte[] b_out = (byte[]) data_out; byte b_max = (byte) MAX_INT8; for (int i = 0; i < size; i++) { value_in = Math.max(b_in[i], min); value_in = Math.min(b_in[i], max); value_out = (value_in + bias) * gain; value_out = Math.max(value_out, 0.0); value_out = Math.min(value_out, b_max); b_out[i] = (byte) value_out; } break; case 'S': short[] s_in = (short[]) data_in; if (data_out == null) { data_out = new short[size]; } short[] s_out = (short[]) data_out; short s_max = (short) MAX_INT16; if (isUnsigned) { s_max = (short) MAX_UINT8; // data was upgraded from unsigned byte } for (int i = 0; i < size; i++) { value_in = Math.max(s_in[i], min); value_in = Math.min(s_in[i], max); value_out = (value_in + bias) * gain; value_out = Math.max(value_out, 0.0); value_out = Math.min(value_out, s_max); s_out[i] = (byte) value_out; } break; case 'I': int[] i_in = (int[]) data_in; if (data_out == null) { data_out = new int[size]; } int[] i_out = (int[]) data_out; int i_max = (int) MAX_INT32; if (isUnsigned) { i_max = (int) MAX_UINT16; // data was upgraded from unsigned short } for (int i = 0; i < size; i++) { value_in = Math.max(i_in[i], min); value_in = Math.min(i_in[i], max); value_out = (value_in + bias) * gain; value_out = Math.max(value_out, 0.0); value_out = Math.min(value_out, i_max); i_out[i] = (byte) value_out; } break; case 'J': long[] l_in = (long[]) data_in; if (data_out == null) { data_out = new long[size]; } long[] l_out = (long[]) data_out; long l_max = MAX_INT64; if (isUnsigned) { l_max = MAX_UINT32; // data was upgraded from unsigned int } for (int i = 0; i < size; i++) { value_in = Math.max(l_in[i], min); value_in = Math.min(l_in[i], max); value_out = (value_in + bias) * gain; value_out = Math.max(value_out, 0.0); value_out = Math.min(value_out, l_max); l_out[i] = (byte) value_out; } break; default: break; } // switch (dname) return data_out; } /** * Converts image raw data to bytes. *

    * The integer data is converted to byte data based on the following rule * *

         *         uint_8       x
         *         int_8       (x & 0x7F) << 1
         *         uint_16     (x >> 8) & 0xFF
         *         int_16      (x >> 7) & 0xFF
         *         uint_32     (x >> 24) & 0xFF
         *         int_32      (x >> 23) & 0xFF
         *         uint_64     (x >> 56) & 0xFF
         *         int_64      (x >> 55) & 0xFF
         * 
    * * @param src * the source data array of signed integers or unsigned shorts * @param dst * the destination data array of bytes * @param isUnsigned * the flag to indicate if the data array is unsigned integer * @return non-negative if successful; otherwise, returns negative */ public static int autoContrastConvertImageBuffer(Object src, byte[] dst, boolean isUnsigned) { int retval = 0; if ((src == null) || (dst == null) || (dst.length != Array.getLength(src))) { return -1; } int size = dst.length; String cname = src.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); switch (dname) { case 'B': byte[] b_src = (byte[]) src; if (isUnsigned) { for (int i = 0; i < size; i++) { dst[i] = b_src[i]; } } else { for (int i = 0; i < size; i++) { dst[i] = (byte) ((b_src[i] & 0x7F) << 1); } } break; case 'S': short[] s_src = (short[]) src; if (isUnsigned) { // data was upgraded from unsigned byte for (int i = 0; i < size; i++) { dst[i] = (byte) s_src[i]; } } else { for (int i = 0; i < size; i++) { dst[i] = (byte) ((s_src[i] >> 7) & 0xFF); } } break; case 'I': int[] i_src = (int[]) src; if (isUnsigned) { // data was upgraded from unsigned short for (int i = 0; i < size; i++) { dst[i] = (byte) ((i_src[i] >> 8) & 0xFF); } } else { for (int i = 0; i < size; i++) { dst[i] = (byte) ((i_src[i] >> 23) & 0xFF); } } break; case 'J': long[] l_src = (long[]) src; if (isUnsigned) { // data was upgraded from unsigned int for (int i = 0; i < size; i++) { dst[i] = (byte) ((l_src[i] >> 24) & 0xFF); } } else { for (int i = 0; i < size; i++) { dst[i] = (byte) ((l_src[i] >> 55) & 0xFF); } } break; default: retval = -1; break; } // switch (dname) return retval; } /** * Computes autocontrast parameters by * *
         *    min = mean - 3 * std.dev 
         *    max = mean + 3 * std.dev
         * 
    * * @param data * the raw data array * @param minmax * the min and max values. * @return non-negative if successful; otherwise, returns negative */ public static int autoContrastComputeMinMax(Object data, double[] minmax) { int retval = 1; if ((data == null) || (minmax == null) || (Array.getLength(data) <= 0) || (Array.getLength(minmax) < 2)) { return -1; } double[] avgstd = { 0, 0 }; retval = computeStatistics(data, avgstd, null); if (retval < 0) { return retval; } minmax[0] = avgstd[0] - 3.0 * avgstd[1]; minmax[1] = avgstd[0] + 3.0 * avgstd[1]; return retval; } /** * Finds the min and max values of the data array * * @param data * the raw data array * @param minmax * the mmin and max values of the array. * @param fillValue * the missing value or fill value. Exclude this value when check * for min/max * @return non-negative if successful; otherwise, returns negative */ public static int findMinMax(Object data, double[] minmax, Object fillValue) { int retval = 1; if ((data == null) || (minmax == null) || (Array.getLength(data) <= 0) || (Array.getLength(minmax) < 2)) { return -1; } int n = Array.getLength(data); double fill = 0.0; boolean hasFillValue = (fillValue != null && fillValue.getClass().isArray()); String cname = data.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); minmax[0] = Float.MAX_VALUE; minmax[1] = -Float.MAX_VALUE; switch (dname) { case 'B': byte[] b = (byte[]) data; minmax[0] = minmax[1] = b[0]; if (hasFillValue) fill = ((byte[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && b[i] == fill) continue; if (minmax[0] > b[i]) { minmax[0] = b[i]; } if (minmax[1] < b[i]) { minmax[1] = b[i]; } } break; case 'S': short[] s = (short[]) data; minmax[0] = minmax[1] = s[0]; if (hasFillValue) fill = ((short[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && s[i] == fill) continue; if (minmax[0] > s[i]) { minmax[0] = s[i]; } if (minmax[1] < s[i]) { minmax[1] = s[i]; } } break; case 'I': int[] ia = (int[]) data; minmax[0] = minmax[1] = ia[0]; if (hasFillValue) fill = ((int[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && ia[i] == fill) continue; if (minmax[0] > ia[i]) { minmax[0] = ia[i]; } if (minmax[1] < ia[i]) { minmax[1] = ia[i]; } } break; case 'J': long[] l = (long[]) data; minmax[0] = minmax[1] = l[0]; if (hasFillValue) fill = ((long[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && l[i] == fill) continue; if (minmax[0] > l[i]) { minmax[0] = l[i]; } if (minmax[1] < l[i]) { minmax[1] = l[i]; } } break; case 'F': float[] f = (float[]) data; minmax[0] = minmax[1] = f[0]; if (hasFillValue) fill = ((float[]) fillValue)[0]; for (int i = 0; i < n; i++) { if ((hasFillValue && f[i] == fill) || isNaNINF((double) f[i])) continue; if (minmax[0] > f[i]) { minmax[0] = f[i]; } if (minmax[1] < f[i]) { minmax[1] = f[i]; } } break; case 'D': double[] d = (double[]) data; minmax[0] = minmax[1] = d[0]; if (hasFillValue) fill = ((double[]) fillValue)[0]; for (int i = 0; i < n; i++) { if ((hasFillValue && d[i] == fill) || isNaNINF(d[i])) continue; if (minmax[0] > d[i]) { minmax[0] = d[i]; } if (minmax[1] < d[i]) { minmax[1] = d[i]; } } break; default: retval = -1; break; } // switch (dname) return retval; } /** * Finds the distribution of data values * * @param data * the raw data array * @param dataDist * the data distirbution. * @param minmax * the data range * @return non-negative if successful; otherwise, returns negative */ public static int findDataDist(Object data, int[] dataDist, double[] minmax) { int retval = 0; double delt = 1; if ((data == null) || (minmax == null) || dataDist == null) return -1; int n = Array.getLength(data); if (minmax[1] != minmax[0]) delt = (dataDist.length - 1) / (minmax[1] - minmax[0]); for (int i = 0; i < dataDist.length; i++) dataDist[i] = 0; int idx; double val; for (int i = 0; i < n; i++) { val = ((Number) Array.get(data, i)).doubleValue(); idx = (int) ((val - minmax[0]) * delt); dataDist[idx]++; } return retval; } /** * Computes mean and standard deviation of a data array * * @param data * the raw data array * @param avgstd * the statistics: avgstd[0]=mean and avgstd[1]=stdev. * @param fillValue * the missing value or fill value. Exclude this value when * compute statistics * @return non-negative if successful; otherwise, returns negative */ public static int computeStatistics(Object data, double[] avgstd, Object fillValue) { int retval = 1, npoints = 0; double sum = 0, avg = 0.0, var = 0.0, diff = 0.0, fill = 0.0; if ((data == null) || (avgstd == null) || (Array.getLength(data) <= 0) || (Array.getLength(avgstd) < 2)) { return -1; } int n = Array.getLength(data); boolean hasFillValue = (fillValue != null && fillValue.getClass().isArray()); String cname = data.getClass().getName(); char dname = cname.charAt(cname.lastIndexOf("[") + 1); npoints = 0; switch (dname) { case 'B': byte[] b = (byte[]) data; if (hasFillValue) fill = ((byte[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && b[i] == fill) continue; sum += b[i]; npoints++; } avg = sum / npoints; for (int i = 0; i < n; i++) { if (hasFillValue && b[i] == fill) continue; diff = b[i] - avg; var += diff * diff; } break; case 'S': short[] s = (short[]) data; if (hasFillValue) fill = ((short[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && s[i] == fill) continue; sum += s[i]; npoints++; } avg = sum / npoints; for (int i = 0; i < n; i++) { if (hasFillValue && s[i] == fill) continue; diff = s[i] - avg; var += diff * diff; } break; case 'I': int[] ia = (int[]) data; if (hasFillValue) fill = ((int[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && ia[i] == fill) continue; sum += ia[i]; npoints++; } avg = sum / npoints; for (int i = 0; i < n; i++) { if (hasFillValue && ia[i] == fill) continue; diff = ia[i] - avg; var += diff * diff; } break; case 'J': long[] l = (long[]) data; if (hasFillValue) fill = ((long[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && l[i] == fill) continue; sum += l[i]; npoints++; } avg = sum / npoints; for (int i = 0; i < n; i++) { if (hasFillValue && l[i] == fill) continue; diff = l[i] - avg; var += diff * diff; } break; case 'F': float[] f = (float[]) data; if (hasFillValue) fill = ((float[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && f[i] == fill) continue; sum += f[i]; npoints++; } avg = sum / npoints; for (int i = 0; i < n; i++) { if (hasFillValue && f[i] == fill) continue; diff = f[i] - avg; var += diff * diff; } break; case 'D': double[] d = (double[]) data; if (hasFillValue) fill = ((double[]) fillValue)[0]; for (int i = 0; i < n; i++) { if (hasFillValue && d[i] == fill) continue; sum += d[i]; npoints++; } avg = sum / npoints; for (int i = 0; i < n; i++) { if (hasFillValue && d[i] == fill) continue; diff = d[i] - avg; var += diff * diff; } break; default: retval = -1; break; } // switch (dname) if (npoints <= 1) { if (npoints < 1) avgstd[0] = fill; avgstd[1] = 0; } else { avgstd[0] = avg; avgstd[1] = Math.sqrt(var / (npoints - 1)); } return retval; } /** * Returns a string representation of the long argument as an unsigned * integer in base 2. This is different from Long.toBinaryString(long i). * This function add padding (0's) to the string based on the nbytes. For * example, if v=15, nbytes=1, the string will be "00001111". * * @param v * the lon value * @param nbytes * nubmer of bytes in the integer * @return the string representation of the unsigned long value represented * by the argument in binary (base 2). */ public static final String toBinaryString(long v, int nbytes) { if (nbytes <= 0) return null; int nhex = nbytes * 2; short[] hex = new short[nhex]; for (int i = 0; i < nhex; i++) hex[i] = (short) (0x0F & (v >> (i * 4))); StringBuffer sb = new StringBuffer(); boolean isEven = true; for (int i = nhex - 1; i >= 0; i--) { if (isEven) sb.append(" "); isEven = !isEven; // toggle switch (hex[i]) { case 0: sb.append("0000"); break; case 1: sb.append("0001"); break; case 2: sb.append("0010"); break; case 3: sb.append("0011"); break; case 4: sb.append("0100"); break; case 5: sb.append("0101"); break; case 6: sb.append("0110"); break; case 7: sb.append("0111"); break; case 8: sb.append("1000"); break; case 9: sb.append("1001"); break; case 10: sb.append("1010"); break; case 11: sb.append("1011"); break; case 12: sb.append("1100"); break; case 13: sb.append("1101"); break; case 14: sb.append("1110"); break; case 15: sb.append("1111"); break; } } return sb.toString(); } /** * Apply bitmask to a data array. * * @param theData * the data array which the bitmask is applied to. * @param theMask * the bitmask to be applied to the data array. * @return true if bitmask is applied successfuly; otherwise, false. */ public static final boolean applyBitmask(Object theData, BitSet theMask, ViewProperties.BITMASK_OP op) { if (theData == null || Array.getLength(theData) <= 0 || theMask == null) return false; char nt = '0'; String cName = theData.getClass().getName(); int cIndex = cName.lastIndexOf("["); if (cIndex >= 0) { nt = cName.charAt(cIndex + 1); } // only deal with 8 or 16 bit data if (!(nt == 'B' || nt == 'S')) return false; int bmask = 0, theValue = 0, packedValue = 0; int nbits = theMask.length(); int len = Array.getLength(theData); for (int i = 0; i < nbits; i++) { if (theMask.get(i)) bmask += 1 << i; } for (int i = 0; i < len; i++) { if (nt == 'B') theValue = ((byte[]) theData)[i] & bmask; else theValue = ((short[]) theData)[i] & bmask; // apply bitmask only if (op == BITMASK_OP.AND) packedValue = theValue; else { // extract bits packedValue = 0; int bitPosition = 0, bitValue = 0; ; for (int j = 0; j < nbits; j++) { if (theMask.get(j)) { bitValue = (theValue & 1); packedValue += (bitValue << bitPosition); bitPosition++; } // move to the next bit theValue = theValue >> 1; } } if (nt == 'B') ((byte[]) theData)[i] = (byte) packedValue; else ((short[]) theData)[i] = (short) packedValue; } /* for (int i = 0; i < len; i++) */ return true; } /* public static final boolean applyBitmask() */ /** * Launch default browser for a given URL. * * @param url * -- the URL to open. * @throws Exception */ public static final void launchBrowser(String url) throws Exception { String os = System.getProperty("os.name"); Runtime runtime = Runtime.getRuntime(); // Block for Windows Platform if (os.startsWith("Windows")) { String cmd = "rundll32 url.dll,FileProtocolHandler " + url; if (new File(url).exists()) cmd = "cmd /c start \"\" \"" + url + "\""; runtime.exec(cmd); } // Block for Mac OS else if (os.startsWith("Mac OS")) { Class fileMgr = Class.forName("com.apple.eio.FileManager"); Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[] { String.class }); if (new File(url).exists()) { // local file url = "file://" + url; } openURL.invoke(null, new Object[] { url }); } // Block for UNIX Platform else { String[] browsers = { "firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape" }; String browser = null; for (int count = 0; count < browsers.length && browser == null; count++) if (runtime.exec(new String[] { "which", browsers[count] }).waitFor() == 0) browser = browsers[count]; if (browser == null) throw new Exception("Could not find web browser"); else runtime.exec(new String[] { browser, url }); } } /* public static final void launchBrowser(String url) */ /** * Check and find a non-exist file. * * @param path * -- the path that the new file will be checked. * @param ext * -- the extention of the new file. * @return -- the new file. */ public static final File checkNewFile(String path, String ext) { File file = new File(path + "new" + ext); int i = 1; while (file.exists()) { file = new File(path + "new" + i + ext); i++; } return file; } /** * Check if a given number if NaN or INF. * * @param val * the nubmer to be checked * @return true if the number is Nan or INF; otherwise, false. */ public static final boolean isNaNINF(double val) { if (Double.isNaN(val) || val == Float.NEGATIVE_INFINITY || val == Float.POSITIVE_INFINITY || val == Double.NEGATIVE_INFINITY || val == Double.POSITIVE_INFINITY) return true; return false; } } jhdf-2.9/ncsa/hdf/view/NewDatasetDialog.java0000644000175000017500000013001712050301063021632 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.net.URL; import java.net.URLClassLoader; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.html.HTMLDocument; import javax.swing.text.html.HTMLFrameHyperlinkEvent; import ncsa.hdf.object.DataFormat; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.ScalarDS; /** * NewDatasetDialog shows a message dialog requesting user input for creating a * new HDF4/5 dataset. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class NewDatasetDialog extends JDialog implements ActionListener, ItemListener, HyperlinkListener { private static final long serialVersionUID = 5381164938654184532L; private JTextField nameField, currentSizeField, maxSizeField, chunkSizeField, stringLengthField, fillValueField; private JComboBox parentChoice, classChoice, sizeChoice, endianChoice, rankChoice, compressionLevel; private JCheckBox checkUnsigned, checkCompression, checkFillValue; private JRadioButton checkContinguous, checkChunked; private JDialog helpDialog; private boolean isH5; /** a list of current groups */ private List groupList; private HObject newObject; private FileFormat fileFormat; private final Toolkit toolkit; private final DataView dataView; /** * Constructs NewDatasetDialog with specified list of possible parent * groups. * * @param owner * the owner of the input * @param pGroup * the parent group which the new group is added to. * @param objs * the list of all objects. */ public NewDatasetDialog(JFrame owner, Group pGroup, List objs) { super(owner, "New Dataset...", true); helpDialog = null; newObject = null; dataView = null; fileFormat = pGroup.getFileFormat(); toolkit = Toolkit.getDefaultToolkit(); isH5 = pGroup.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); parentChoice = new JComboBox(); groupList = new Vector(); Object obj = null; Iterator iterator = objs.iterator(); while (iterator.hasNext()) { obj = iterator.next(); if (obj instanceof Group) { Group g = (Group) obj; groupList.add(obj); if (g.isRoot()) { parentChoice.addItem(HObject.separator); } else { parentChoice.addItem(g.getPath() + g.getName() + HObject.separator); } } } if (pGroup.isRoot()) { parentChoice.setSelectedItem(HObject.separator); } else { parentChoice.setSelectedItem(pGroup.getPath() + pGroup.getName() + HObject.separator); } JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 600 + (ViewProperties.getFontSize() - 12) * 15; int h = 350 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton okButton = new JButton(" Ok "); okButton.setName("OK"); okButton.setActionCommand("Ok"); okButton.setMnemonic(KeyEvent.VK_O); okButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setName("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.setActionCommand("Cancel"); cancelButton.addActionListener(this); JButton helplButton = new JButton("Help"); helplButton.setName("Help"); helplButton.setMnemonic(KeyEvent.VK_H); helplButton.setActionCommand("Show help"); helplButton.addActionListener(this); // set OK and CANCEL buttons JPanel buttonPanel = new JPanel(); buttonPanel.add(okButton); buttonPanel.add(cancelButton); buttonPanel.add(helplButton); contentPane.add(buttonPanel, BorderLayout.SOUTH); // set NAME and PARENT GROUP panel JPanel namePanel = new JPanel(); namePanel.setLayout(new BorderLayout(5, 5)); JPanel tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); tmpP.add(new JLabel("Dataset name: ")); tmpP.add(new JLabel("Parent group: ")); namePanel.add(tmpP, BorderLayout.WEST); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); tmpP.add(nameField = new JTextField()); nameField.setName("datasetname"); tmpP.add(parentChoice); namePanel.add(tmpP, BorderLayout.CENTER); contentPane.add(namePanel, BorderLayout.NORTH); // set DATATYPE JPanel typePanel = new JPanel(); typePanel.setLayout(new GridLayout(2, 4, 15, 3)); TitledBorder border = new TitledBorder("Datatype"); border.setTitleColor(Color.gray); typePanel.setBorder(border); stringLengthField = new JTextField("String length"); stringLengthField.setEnabled(false); endianChoice = new JComboBox(); classChoice = new JComboBox(); sizeChoice = new JComboBox(); endianChoice.setEnabled(isH5); classChoice.addItem("INTEGER"); classChoice.addItem("FLOAT"); classChoice.addItem("CHAR"); if (isH5) { classChoice.addItem("STRING"); classChoice.addItem("REFERENCE"); classChoice.addItem("ENUM"); sizeChoice.addItem("NATIVE"); endianChoice.addItem("NATIVE"); endianChoice.addItem("LITTLE ENDIAN"); endianChoice.addItem("BIG ENDIAN"); } else { sizeChoice.addItem("DEFAULT"); endianChoice.addItem("DEFAULT"); } sizeChoice.addItem("8"); sizeChoice.addItem("16"); sizeChoice.addItem("32"); sizeChoice.addItem("64"); typePanel.add(new JLabel("Datatype class")); typePanel.add(new JLabel("Size (bits)")); typePanel.add(new JLabel("Byte ordering")); typePanel.add(checkUnsigned = new JCheckBox("Unsigned")); typePanel.add(classChoice); typePanel.add(sizeChoice); typePanel.add(endianChoice); typePanel.add(stringLengthField); // set DATATSPACE JPanel spacePanel = new JPanel(); spacePanel.setLayout(new GridLayout(2, 3, 15, 3)); border = new TitledBorder("Dataspace"); border.setTitleColor(Color.gray); spacePanel.setBorder(border); rankChoice = new JComboBox(); for (int i = 1; i < 33; i++) { rankChoice.addItem(String.valueOf(i)); } rankChoice.setSelectedIndex(1); currentSizeField = new JTextField("1 x 1"); currentSizeField.setName("currentsize"); maxSizeField = new JTextField(""); spacePanel.add(new JLabel("No. of dimensions")); spacePanel.add(new JLabel("Current size")); spacePanel.add(new JLabel("")); spacePanel.add(rankChoice); spacePanel.add(currentSizeField); JButton jb = new JButton("Set Max Size"); jb.setActionCommand("Set max size"); jb.addActionListener(this); spacePanel.add(jb); // spacePanel.add(maxSizeField); // set storage layout and data compression JPanel layoutPanel = new JPanel(); layoutPanel.setLayout(new BorderLayout()); border = new TitledBorder("Storage Properties"); border.setTitleColor(Color.gray); layoutPanel.setBorder(border); checkContinguous = new JRadioButton("Contiguous"); checkContinguous.setSelected(true); checkChunked = new JRadioButton("Chunked (size) "); ButtonGroup bgroup = new ButtonGroup(); bgroup.add(checkChunked); bgroup.add(checkContinguous); chunkSizeField = new JTextField("1 x 1"); chunkSizeField.setEnabled(false); checkCompression = new JCheckBox("gzip (level) "); compressionLevel = new JComboBox(); for (int i = 0; i < 10; i++) { compressionLevel.addItem(String.valueOf(i)); } compressionLevel.setSelectedIndex(6); compressionLevel.setEnabled(false); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); tmpP.add(new JLabel("Storage layout: ")); tmpP.add(new JLabel("Compression: ")); layoutPanel.add(tmpP, BorderLayout.WEST); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); // storage layout JPanel tmpP0 = new JPanel(); tmpP0.setLayout(new GridLayout(1, 3, 0, 5)); tmpP0.add(checkContinguous); JPanel tmpP00 = new JPanel(); tmpP00.setLayout(new BorderLayout()); tmpP00.add(checkChunked, BorderLayout.WEST); tmpP00.add(chunkSizeField, BorderLayout.CENTER); tmpP0.add(tmpP00); tmpP0.add(new JLabel("")); tmpP.add(tmpP0); tmpP0 = new JPanel(); tmpP0.setLayout(new GridLayout(1, 2, 30, 5)); // compression tmpP00 = new JPanel(); tmpP00.setLayout(new BorderLayout()); tmpP00.add(checkCompression, BorderLayout.WEST); tmpP00.add(compressionLevel, BorderLayout.CENTER); tmpP0.add(tmpP00); // fill values checkFillValue = new JCheckBox("Fill Value "); fillValueField = new JTextField("0"); fillValueField.setEnabled(false); checkFillValue.setSelected(false); tmpP00 = new JPanel(); tmpP00.setLayout(new BorderLayout()); tmpP00.add(checkFillValue, BorderLayout.WEST); tmpP00.add(fillValueField, BorderLayout.CENTER); if (isH5) tmpP0.add(tmpP00); else tmpP0.add(new JLabel("")); tmpP.add(tmpP0); layoutPanel.add(tmpP, BorderLayout.CENTER); JPanel infoPanel = new JPanel(); infoPanel.setLayout(new GridLayout(3, 1, 5, 10)); infoPanel.add(typePanel); infoPanel.add(spacePanel); infoPanel.add(layoutPanel); contentPane.add(infoPanel, BorderLayout.CENTER); classChoice.addItemListener(this); sizeChoice.addItemListener(this); rankChoice.addItemListener(this); checkCompression.addItemListener(this); checkFillValue.addItemListener(this); checkContinguous.addItemListener(this); checkChunked.addItemListener(this); // locate the H5Property dialog Point l = owner.getLocation(); l.x += 250; l.y += 80; setLocation(l); validate(); pack(); } /** * Constructs NewDatasetDialog with specified list of possible parent * groups. * * @param owner * the owner of the input * @param pGroup * the parent group which the new group is added to. * @param objs * the list of all objects. */ public NewDatasetDialog(JFrame owner, Group pGroup, List objs, DataView observer) { super(owner, "New Dataset...", true); helpDialog = null; newObject = null; dataView = observer; fileFormat = pGroup.getFileFormat(); toolkit = Toolkit.getDefaultToolkit(); isH5 = pGroup.getFileFormat().isThisType(FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5)); parentChoice = new JComboBox(); groupList = new Vector(); Object obj = null; Iterator iterator = objs.iterator(); while (iterator.hasNext()) { obj = iterator.next(); if (obj instanceof Group) { Group g = (Group) obj; groupList.add(obj); if (g.isRoot()) { parentChoice.addItem(HObject.separator); } else { parentChoice.addItem(g.getPath() + g.getName() + HObject.separator); } } } if (pGroup.isRoot()) { parentChoice.setSelectedItem(HObject.separator); } else { parentChoice.setSelectedItem(pGroup.getPath() + pGroup.getName() + HObject.separator); } JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 400 + (ViewProperties.getFontSize() - 12) * 15; int h = 120 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton okButton = new JButton(" Ok "); okButton.setActionCommand("Ok"); okButton.setMnemonic(KeyEvent.VK_O); okButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.setActionCommand("Cancel"); cancelButton.addActionListener(this); // set OK and CANCEL buttons JPanel buttonPanel = new JPanel(); buttonPanel.add(okButton); buttonPanel.add(cancelButton); contentPane.add(buttonPanel, BorderLayout.SOUTH); // set NAME and PARENT GROUP panel JPanel namePanel = new JPanel(); namePanel.setLayout(new BorderLayout(5, 5)); JPanel tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); tmpP.add(new JLabel("Dataset name: ")); tmpP.add(new JLabel("Parent group: ")); namePanel.add(tmpP, BorderLayout.WEST); tmpP = new JPanel(); tmpP.setLayout(new GridLayout(2, 1)); tmpP.add(nameField = new JTextField(((HObject) observer.getDataObject()).getName() + "~copy", 40)); tmpP.add(parentChoice); namePanel.add(tmpP, BorderLayout.CENTER); contentPane.add(namePanel, BorderLayout.CENTER); // locate the H5Property dialog Point l = owner.getLocation(); l.x += 250; l.y += 80; setLocation(l); pack(); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Ok")) { if (dataView instanceof TableView) { newObject = createFromTable(); } else if (dataView instanceof ImageView) { newObject = createFromImage(); } else if (dataView == null) { newObject = createFromScratch(); } if (newObject != null) { dispose(); } } if (cmd.equals("Cancel")) { newObject = null; dispose(); ((Vector) groupList).setSize(0); } else if (cmd.equals("Show help")) { if (helpDialog == null) { createHelpDialog(); } helpDialog.setVisible(true); } else if (cmd.equals("Hide help")) { if (helpDialog != null) { helpDialog.setVisible(false); } } else if (cmd.equals("Set max size")) { String strMax = maxSizeField.getText(); if (strMax == null || strMax.length() < 1) strMax = currentSizeField.getText(); String msg = JOptionPane.showInputDialog(this, "Enter max dimension sizes. \n" + "Use \"unlimited\" for unlimited dimension size.\n\n" + "For example,\n" + " 200 x 100\n" + " 100 x unlimited\n\n", strMax); if (msg == null || msg.length() < 1) maxSizeField.setText(currentSizeField.getText()); else maxSizeField.setText(msg); checkMaxSize(); } } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source.equals(classChoice)) { int idx = classChoice.getSelectedIndex(); sizeChoice.setSelectedIndex(0); endianChoice.setSelectedIndex(0); stringLengthField.setEnabled(false); if (idx == 0) { // INTEGER sizeChoice.setEnabled(true); endianChoice.setEnabled(isH5); checkUnsigned.setEnabled(true); if (sizeChoice.getItemCount() == 3) { sizeChoice.removeItem("32"); sizeChoice.removeItem("64"); sizeChoice.addItem("8"); sizeChoice.addItem("16"); sizeChoice.addItem("32"); sizeChoice.addItem("64"); } } else if (idx == 1) { // FLOAT sizeChoice.setEnabled(true); endianChoice.setEnabled(isH5); checkUnsigned.setEnabled(false); if (sizeChoice.getItemCount() == 5) { sizeChoice.removeItem("16"); sizeChoice.removeItem("8"); } } else if (idx == 2) { // CHAR sizeChoice.setEnabled(false); endianChoice.setEnabled(isH5); checkUnsigned.setEnabled(true); } else if (idx == 3) { // STRING sizeChoice.setEnabled(false); endianChoice.setEnabled(false); checkUnsigned.setEnabled(false); stringLengthField.setEnabled(true); stringLengthField.setText("String length"); } else if (idx == 4) { // REFERENCE sizeChoice.setEnabled(false); endianChoice.setEnabled(false); checkUnsigned.setEnabled(false); stringLengthField.setEnabled(false); } else if (idx == 5) { // ENUM sizeChoice.setEnabled(true); checkUnsigned.setEnabled(true); stringLengthField.setEnabled(true); stringLengthField.setText("R=0,G=1,B=2,..."); } } else if (source.equals(sizeChoice)) { if (classChoice.getSelectedIndex() == 0) { checkUnsigned.setEnabled(true); } } else if (source.equals(rankChoice)) { int rank = rankChoice.getSelectedIndex() + 1; String currentSizeStr = "1"; String maxSizeStr = "0"; for (int i = 1; i < rank; i++) { currentSizeStr += " x 1"; maxSizeStr += " x 0"; } currentSizeField.setText(currentSizeStr); maxSizeField.setText(maxSizeStr); String currentStr = currentSizeField.getText(); int idx = currentStr.lastIndexOf("x"); String chunkStr = "1"; if (rank <= 1) { chunkStr = currentStr; } else { for (int i = 1; i < rank - 1; i++) { chunkStr += " x 1"; } if (idx > 0) { chunkStr += " x " + currentStr.substring(idx + 1); } } chunkSizeField.setText(chunkStr); } else if (source.equals(checkContinguous)) { chunkSizeField.setEnabled(false); } else if (source.equals(checkChunked)) { chunkSizeField.setEnabled(true); String chunkStr = ""; StringTokenizer st = new StringTokenizer(currentSizeField.getText(), "x"); int rank = rankChoice.getSelectedIndex() + 1; while (st.hasMoreTokens()) { long l = Math.max(1, Long.valueOf(st.nextToken().trim()) / (2 * rank)); chunkStr += String.valueOf(l) + "x"; } chunkStr = chunkStr.substring(0, chunkStr.lastIndexOf('x')); chunkSizeField.setText(chunkStr); } else if (source.equals(checkCompression)) { boolean isCompressed = checkCompression.isSelected(); if (isCompressed && isH5) { if (!checkChunked.isSelected()) { String currentStr = currentSizeField.getText(); int idx = currentStr.lastIndexOf("x"); String chunkStr = "1"; int rank = rankChoice.getSelectedIndex() + 1; if (rank <= 1) { chunkStr = currentStr; } else { for (int i = 1; i < rank - 1; i++) { chunkStr += " x 1"; } if (idx > 0) { chunkStr += " x " + currentStr.substring(idx + 1); } } chunkSizeField.setText(chunkStr); } compressionLevel.setEnabled(true); checkContinguous.setEnabled(false); checkChunked.setSelected(true); chunkSizeField.setEnabled(true); } else { compressionLevel.setEnabled(isCompressed); checkContinguous.setEnabled(true); } } else if (source.equals(checkFillValue)) { fillValueField.setEnabled(checkFillValue.isSelected()); } } /** check is the max size is valid */ private void checkMaxSize() { boolean isChunkNeeded = false; String dimStr = currentSizeField.getText(); String maxStr = maxSizeField.getText(); StringTokenizer stMax = new StringTokenizer(maxStr, "x"); StringTokenizer stDim = new StringTokenizer(dimStr, "x"); if (stMax.countTokens() != stDim.countTokens()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Wrong number of values in the max dimension size " + maxStr, getTitle(), JOptionPane.ERROR_MESSAGE); maxSizeField.setText(null); return; } int rank = stDim.countTokens(); long max = 0, dim = 0; long[] maxdims = new long[rank]; for (int i = 0; i < rank; i++) { String token = stMax.nextToken().trim(); token = token.toLowerCase(); if (token.startsWith("u")) { max = -1; isChunkNeeded = true; } else { try { max = Long.parseLong(token); } catch (NumberFormatException ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid max dimension size: " + maxStr, getTitle(), JOptionPane.ERROR_MESSAGE); maxSizeField.setText(null); return; } } token = stDim.nextToken().trim(); try { dim = Long.parseLong(token); } catch (NumberFormatException ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid dimension size: " + dimStr, getTitle(), JOptionPane.ERROR_MESSAGE); return; } if (max != -1 && max < dim) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid max dimension size: " + maxStr, getTitle(), JOptionPane.ERROR_MESSAGE); maxSizeField.setText(null); return; } else if (max > dim) { isChunkNeeded = true; } maxdims[i] = max; } // for (int i = 0; i < rank; i++) if (isH5) { if (isChunkNeeded && !checkChunked.isSelected()) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Chunking is required for the max dimensions of " + maxStr, getTitle(), JOptionPane.ERROR_MESSAGE); checkChunked.setSelected(true); } } else { for (int i = 1; i < rank; i++) { if (maxdims[i] <= 0) { maxSizeField.setText(currentSizeField.getText()); toolkit.beep(); JOptionPane.showMessageDialog(this, "Only dim[0] can be unlimited." + maxStr, getTitle(), JOptionPane.ERROR_MESSAGE); return; } } } } /** Creates a dialog to show the help information. */ private void createHelpDialog() { helpDialog = new JDialog(this, "Create New Dataset"); JPanel contentPane = (JPanel) helpDialog.getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 500 + (ViewProperties.getFontSize() - 12) * 15; int h = 400 + (ViewProperties.getFontSize() - 12) * 10; contentPane.setPreferredSize(new Dimension(w, h)); JButton b = new JButton(" Ok "); b.addActionListener(this); b.setActionCommand("Hide help"); JPanel tmpP = new JPanel(); tmpP.add(b); contentPane.add(tmpP, BorderLayout.SOUTH); JEditorPane infoPane = new JEditorPane(); infoPane.setEditable(false); JScrollPane editorScrollPane = new JScrollPane(infoPane); contentPane.add(editorScrollPane, BorderLayout.CENTER); try { URL url = null, url2 = null, url3 = null; String rootPath = ViewProperties.getViewRoot(); try { url = new URL("file:" + rootPath + "/lib/jhdfview.jar"); } catch (java.net.MalformedURLException mfu) { } try { url2 = new URL("file:" + rootPath + "/"); } catch (java.net.MalformedURLException mfu) { } try { url3 = new URL("file:" + rootPath + "/src/"); } catch (java.net.MalformedURLException mfu) { } URL uu[] = { url, url2, url3 }; URLClassLoader cl = new URLClassLoader(uu); URL u = cl.findResource("ncsa/hdf/view/NewDatasetHelp.html"); infoPane.setPage(u); infoPane.addHyperlinkListener(this); } catch (Exception e) { infoPane.setContentType("text/html"); StringBuffer buff = new StringBuffer(); buff.append(""); buff.append(""); buff.append("ERROR: cannot load help information."); buff.append(""); buff.append(""); infoPane.setText(buff.toString()); } Point l = helpDialog.getOwner().getLocation(); l.x += 50; l.y += 80; helpDialog.setLocation(l); helpDialog.validate(); helpDialog.pack(); } public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { JEditorPane pane = (JEditorPane) e.getSource(); if (e instanceof HTMLFrameHyperlinkEvent) { HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent) e; HTMLDocument doc = (HTMLDocument) pane.getDocument(); doc.processHTMLFrameHyperlinkEvent(evt); } else { try { pane.setPage(e.getURL()); } catch (Throwable t) { } } } } private HObject createFromScratch() { String name = null; Group pgroup = null; int rank = -1, gzip = -1, tclass = -1, tsize = -1, torder = -1, tsign = -1; long dims[], maxdims[] = null, chunks[] = null; name = nameField.getText().trim(); if ((name == null) || (name.length() < 1)) { toolkit.beep(); JOptionPane .showMessageDialog(this, "Dataset name is not specified.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (name.indexOf(HObject.separator) >= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Dataset name cannot contain path.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } pgroup = (Group) groupList.get(parentChoice.getSelectedIndex()); if (pgroup == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Parent group is null.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } // set datatype class int idx = classChoice.getSelectedIndex(); if (idx == 0) { tclass = Datatype.CLASS_INTEGER; if (checkUnsigned.isSelected()) { tsign = Datatype.SIGN_NONE; } } else if (idx == 1) { tclass = Datatype.CLASS_FLOAT; } else if (idx == 2) { tclass = Datatype.CLASS_CHAR; if (checkUnsigned.isSelected()) { tsign = Datatype.SIGN_NONE; } } else if (idx == 3) { tclass = Datatype.CLASS_STRING; } else if (idx == 4) { tclass = Datatype.CLASS_REFERENCE; } else if (idx == 5) { tclass = Datatype.CLASS_ENUM; } // set datatype size/order idx = sizeChoice.getSelectedIndex(); if (tclass == Datatype.CLASS_STRING) { int stringLength = 0; try { stringLength = Integer.parseInt(stringLengthField.getText()); } catch (NumberFormatException ex) { stringLength = -1; } if (stringLength <= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid string length: " + stringLengthField.getText(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } tsize = stringLength; } else if (tclass == Datatype.CLASS_ENUM) { String enumStr = stringLengthField.getText(); if ((enumStr == null) || (enumStr.length() < 1) || enumStr.endsWith("...")) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid member values: " + stringLengthField.getText(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } } else if (tclass == Datatype.CLASS_REFERENCE) { tsize = 1; } else if (idx == 0) { tsize = Datatype.NATIVE; } else if (tclass == Datatype.CLASS_FLOAT) { tsize = idx * 4; } else { tsize = 1 << (idx - 1); } if ((tsize == 8) && !isH5 && (tclass == Datatype.CLASS_INTEGER)) { toolkit.beep(); JOptionPane.showMessageDialog(this, "HDF4 does not support 64-bit integer.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } // set order idx = endianChoice.getSelectedIndex(); if (idx == 0) { torder = Datatype.NATIVE; } else if (idx == 1) { torder = Datatype.ORDER_LE; } else { torder = Datatype.ORDER_BE; } rank = rankChoice.getSelectedIndex() + 1; StringTokenizer st = new StringTokenizer(currentSizeField.getText(), "x"); if (st.countTokens() < rank) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Number of values in the current dimension size is less than " + rank, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } long l = 0; dims = new long[rank]; String token = null; for (int i = 0; i < rank; i++) { token = st.nextToken().trim(); try { l = Long.parseLong(token); } catch (NumberFormatException ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid dimension size: " + currentSizeField.getText(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (l <= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Dimension size must be greater than zero.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } dims[i] = l; } String maxFieldStr = maxSizeField.getText(); if (maxFieldStr != null && maxFieldStr.length() > 1) { st = new StringTokenizer(maxFieldStr, "x"); if (st.countTokens() < rank) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Number of values in the max dimension size is less than " + rank, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } l = 0; maxdims = new long[rank]; for (int i = 0; i < rank; i++) { token = st.nextToken().trim(); token = token.toLowerCase(); if (token.startsWith("u")) l = -1; else { try { l = Long.parseLong(token); } catch (NumberFormatException ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid max dimension size: " + maxSizeField.getText(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } } if (l < -1) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Dimension size cannot be less than -1.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } else if (l == 0) { l = dims[i]; } maxdims[i] = l; } } chunks = null; if (checkChunked.isSelected()) { st = new StringTokenizer(chunkSizeField.getText(), "x"); if (st.countTokens() < rank) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Number of values in the chunk size is less than " + rank, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } l = 0; chunks = new long[rank]; for (int i = 0; i < rank; i++) { token = st.nextToken().trim(); try { l = Long.parseLong(token); } catch (NumberFormatException ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Invalid chunk dimension size: " + chunkSizeField.getText(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (l < 1) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Chunk size cannot be less than 1.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } chunks[i] = l; } // for (int i=0; i= tdimsize) { toolkit.beep(); int status = JOptionPane.showConfirmDialog(this, "Chunk size is equal/greater than the current size. " + "\nAre you sure you want to set chunk size to " + chunkSizeField.getText() + "?", getTitle(), JOptionPane.YES_NO_OPTION); if (status == JOptionPane.NO_OPTION) { return null; } } if (tchunksize == 1) { toolkit.beep(); int status = JOptionPane.showConfirmDialog(this, "Chunk size is one, which may cause large memory overhead for large dataset." + "\nAre you sure you want to set chunk size to " + chunkSizeField.getText() + "?", getTitle(), JOptionPane.YES_NO_OPTION); if (status == JOptionPane.NO_OPTION) { return null; } } } // if (checkChunked.isSelected()) if (checkCompression.isSelected()) { gzip = compressionLevel.getSelectedIndex(); } else { gzip = 0; } HObject obj = null; try { Datatype datatype = fileFormat.createDatatype(tclass, tsize, torder, tsign); if (tclass == Datatype.CLASS_ENUM) { datatype.setEnumMembers(stringLengthField.getText()); } String fillValue = null; if (fillValueField.isEnabled()) fillValue = fillValueField.getText(); obj = fileFormat.createScalarDS(name, pgroup, datatype, dims, maxdims, chunks, gzip, fillValue, null); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex, getTitle(), JOptionPane.ERROR_MESSAGE); return null; } return obj; } private HObject createFromTable() { HObject obj = null; String name = null; Group pgroup = null; name = nameField.getText(); if (name == null) { toolkit.beep(); JOptionPane .showMessageDialog(this, "Dataset name is not specified.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (name.indexOf(HObject.separator) >= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Dataset name cannot contain path.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } pgroup = (Group) groupList.get(parentChoice.getSelectedIndex()); if (pgroup == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Parent group is null.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } TableView tableView = (TableView) dataView; Object theData = tableView.getSelectedData(); if (theData == null) { return null; } int w = tableView.getTable().getSelectedColumnCount(); int h = tableView.getTable().getSelectedRowCount(); Dataset dataset = (Dataset) tableView.getDataObject(); if (dataset instanceof ScalarDS) { ScalarDS sd = (ScalarDS) dataset; if (sd.isUnsigned()) { theData = Dataset.convertToUnsignedC(theData, null); } } try { long[] dims = { h, w }; obj = dataset.copy(pgroup, name, dims, theData); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } return obj; } private HObject createFromImage() { HObject obj = null; String name = null; Group pgroup = null; name = nameField.getText(); if (name == null) { toolkit.beep(); JOptionPane .showMessageDialog(this, "Dataset name is not specified.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } if (name.indexOf(HObject.separator) >= 0) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Dataset name cannot contain path.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } pgroup = (Group) groupList.get(parentChoice.getSelectedIndex()); if (pgroup == null) { toolkit.beep(); JOptionPane.showMessageDialog(this, "Parent group is null.", getTitle(), JOptionPane.ERROR_MESSAGE); return null; } ImageView imageView = (ImageView) dataView; ScalarDS dataset = (ScalarDS) imageView.getDataObject(); Object theData = imageView.getSelectedData(); if (theData == null) { return null; } // in version 2.4, unsigned image data is converted to signed data // to write data, the data needs to converted back to unsigned. if (dataset.isUnsigned()) { theData = Dataset.convertToUnsignedC(theData, null); } int w = imageView.getSelectedArea().width; int h = imageView.getSelectedArea().height; try { long[] dims = null; if (isH5) { if (imageView.isTrueColor()) { dims = new long[3]; if (imageView.isPlaneInterlace()) { dims[0] = 3; dims[1] = h; dims[2] = w; } else { dims[0] = h; dims[1] = w; dims[2] = 3; } } else { dims = new long[2]; dims[0] = h; dims[1] = w; } } else { dims = new long[2]; dims[0] = w; dims[1] = h; } obj = dataset.copy(pgroup, name, dims, theData); } catch (Exception ex) { toolkit.beep(); JOptionPane.showMessageDialog(this, ex.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE); return null; } return obj; } /** Returns the new dataset created. */ public DataFormat getObject() { return newObject; } /** Returns the parent group of the new dataset. */ public Group getParentGroup() { return (Group) groupList.get(parentChoice.getSelectedIndex()); } } jhdf-2.9/ncsa/hdf/view/UserOptionsDialog.java0000644000175000017500000011406412050301063022071 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.border.BevelBorder; import javax.swing.border.SoftBevelBorder; import javax.swing.border.TitledBorder; /** * UserOptionsDialog displays components for choosing user options. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class UserOptionsDialog extends JDialog implements ActionListener, ItemListener { private static final long serialVersionUID = -8521813136101442590L; /** * The main HDFView. */ private final JFrame viewer; private String H4toH5Path; private JTextField H4toH5Field, UGField, workField, fileExtField, maxMemberField, startMemberField; private JComboBox fontSizeChoice, fontTypeChoice, delimiterChoice, imageOriginChoice, indexBaseChoice; private JComboBox choiceTreeView, choiceMetaDataView, choiceTextView, choiceTableView, choiceImageView, choicePaletteView; private String rootDir, workDir; private JCheckBox checkCurrentUserDir, checkAutoContrast, checkConvertEnum, checkShowValues; private JButton currentDirButton; private JRadioButton checkReadOnly, checkIndexType, checkIndexOrder, checkIndexNative, checkLibVersion, checkReadAll; private int fontSize; private boolean isFontChanged; private boolean isUserGuideChanged; private boolean isWorkDirChanged; /** default index type for files */ private static String indexType; /** default index ordering for files */ private static String indexOrder; /** a list of tree view implementation. */ private static Vector treeViews; /** a list of image view implementation. */ private static Vector imageViews; /** a list of tree table implementation. */ private static Vector tableViews; /** a list of Text view implementation. */ private static Vector textViews; /** a list of metadata view implementation. */ private static Vector metaDataViews; /** a list of palette view implementation. */ private static Vector paletteViews; // private JList srbJList; // private JTextField srbFields[]; // private Vector srbVector; /** * constructs an UserOptionsDialog. * * @param view * The HDFView. */ public UserOptionsDialog(JFrame view, String viewroot) { super(view, "User Options", true); viewer = view; rootDir = viewroot; isFontChanged = false; isUserGuideChanged = false; isWorkDirChanged = false; // srbJList = null; fontSize = ViewProperties.getFontSize(); workDir = ViewProperties.getWorkDir(); if (workDir == null) { workDir = rootDir; } treeViews = ViewProperties.getTreeViewList(); metaDataViews = ViewProperties.getMetaDataViewList(); textViews = ViewProperties.getTextViewList(); tableViews = ViewProperties.getTableViewList(); imageViews = ViewProperties.getImageViewList(); paletteViews = ViewProperties.getPaletteViewList(); // srbVector = ViewProperties.getSrbAccount(); indexType = ViewProperties.getIndexType(); indexOrder = ViewProperties.getIndexOrder(); JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout(8, 8)); contentPane.setBorder(BorderFactory.createEmptyBorder(15, 5, 5, 5)); int w = 700 + (ViewProperties.getFontSize() - 12) * 15; int h = 550 + (ViewProperties.getFontSize() - 12) * 15; contentPane.setPreferredSize(new Dimension(w, h)); JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab("General Setting", createGeneralOptionPanel()); tabbedPane.addTab("Default Module", createModuleOptionPanel()); /* * try { Class.forName("ncsa.hdf.srb.SRBFileDialog"); * tabbedPane.addTab("SRB Connection", createSrbConnectionPanel()); } * catch (Exception ex) {;} */ tabbedPane.setSelectedIndex(0); JPanel buttonP = new JPanel(); JButton b = new JButton(" Ok "); b.setActionCommand("Set options"); b.addActionListener(this); buttonP.add(b); b = new JButton("Cancel"); b.setActionCommand("Cancel"); b.addActionListener(this); buttonP.add(b); contentPane.add("Center", tabbedPane); contentPane.add("South", buttonP); // locate the H5Property dialog Point l = getParent().getLocation(); l.x += 250; l.y += 80; setLocation(l); validate(); pack(); } public void setVisible(boolean b) { if (b) { // reset flags isFontChanged = false; isUserGuideChanged = false; isWorkDirChanged = false; fontSize = ViewProperties.getFontSize(); workDir = ViewProperties.getWorkDir(); if (workDir == null) { workDir = rootDir; } } super.setVisible(b); } private JPanel createGeneralOptionPanel() { String[] fontSizeChoices = { "12", "14", "16", "18", "20", "22", "24", "26", "28", "30", "32", "34", "36", "48" }; fontSizeChoice = new JComboBox(fontSizeChoices); fontSizeChoice.setSelectedItem(String.valueOf(ViewProperties.getFontSize())); String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); String fname = ViewProperties.getFontType(); fontTypeChoice = new JComboBox(fontNames); boolean isFontValid = false; if (fontNames != null) { for (int i = 0; i < fontNames.length; i++) { if (fontNames[i].equalsIgnoreCase(fname)) { isFontValid = true; } } } if (!isFontValid) { fname = (viewer).getFont().getFamily(); ViewProperties.setFontType(fname); } fontTypeChoice.setSelectedItem(fname); String[] delimiterChoices = { ViewProperties.DELIMITER_TAB, ViewProperties.DELIMITER_COMMA, ViewProperties.DELIMITER_SPACE, ViewProperties.DELIMITER_COLON, ViewProperties.DELIMITER_SEMI_COLON }; delimiterChoice = new JComboBox(delimiterChoices); delimiterChoice.setSelectedItem(ViewProperties.getDataDelimiter()); String[] imageOriginChoices = { ViewProperties.ORIGIN_UL, ViewProperties.ORIGIN_LL, ViewProperties.ORIGIN_UR, ViewProperties.ORIGIN_LR }; imageOriginChoice = new JComboBox(imageOriginChoices); imageOriginChoice.setSelectedItem(ViewProperties.getImageOrigin()); JPanel centerP = new JPanel(); GridBagConstraints c = new GridBagConstraints(); // natural height, maximum width c.fill = GridBagConstraints.HORIZONTAL; c.weightx = 0.5; c.fill = GridBagConstraints.HORIZONTAL; centerP.setLayout(new GridBagLayout()); centerP.setBorder(new SoftBevelBorder(BevelBorder.LOWERED)); JPanel p0 = new JPanel(); p0.setLayout(new BorderLayout()); p0.add(checkCurrentUserDir = new JCheckBox("\"Current Working Directory\" or", false), BorderLayout.WEST); checkCurrentUserDir.addActionListener(this); checkCurrentUserDir.setActionCommand("Set current dir to user.dir"); p0.add(workField = new JTextField(workDir), BorderLayout.CENTER); JButton b = new JButton("Browse..."); currentDirButton = b; b.setActionCommand("Browse current dir"); b.addActionListener(this); p0.add(b, BorderLayout.EAST); TitledBorder tborder = new TitledBorder("Default Working Directory"); tborder.setTitleColor(Color.darkGray); p0.setBorder(tborder); c.gridx = 0; c.gridy = 0; centerP.add(p0, c); p0 = new JPanel(); p0.setLayout(new BorderLayout()); p0.add(new JLabel("User's Guide: "), BorderLayout.WEST); p0.add(UGField = new JTextField(ViewProperties.getUsersGuide()), BorderLayout.CENTER); b = new JButton("Browse..."); b.setActionCommand("Browse UG"); b.addActionListener(this); p0.add(b, BorderLayout.EAST); tborder = new TitledBorder("Help Document"); tborder.setTitleColor(Color.darkGray); p0.setBorder(tborder); c.gridx = 0; c.gridy = 1; centerP.add(p0, c); p0 = new JPanel(); p0.setLayout(new GridLayout(1, 3, 8, 8)); JPanel p00 = new JPanel(); p00.setLayout(new BorderLayout()); p00.add(new JLabel("Extension: "), BorderLayout.WEST); p00.add(fileExtField = new JTextField(ViewProperties.getFileExtension()), BorderLayout.CENTER); tborder = new TitledBorder("File Extension"); tborder.setTitleColor(Color.darkGray); p00.setBorder(tborder); JPanel p01 = new JPanel(); p01.setLayout(new GridLayout(1, 2, 8, 8)); p01.add(checkReadOnly = new JRadioButton("Read Only", ViewProperties.isReadOnly())); JRadioButton rw = new JRadioButton("Read/Write", !ViewProperties.isReadOnly()); p01.add(rw); ButtonGroup bgrp = new ButtonGroup(); bgrp.add(checkReadOnly); bgrp.add(rw); tborder = new TitledBorder("Default File Access Mode"); tborder.setTitleColor(Color.darkGray); p01.setBorder(tborder); JPanel p02 = new JPanel(); p02.setLayout(new GridLayout(1, 2, 8, 8)); p02.add(checkLibVersion = new JRadioButton("Earliest", ViewProperties.isEarlyLib())); JRadioButton latestLib = new JRadioButton("Latest", !ViewProperties.isReadOnly()); p02.add(latestLib); bgrp = new ButtonGroup(); bgrp.add(checkLibVersion); bgrp.add(latestLib); tborder = new TitledBorder("Default Lib Version"); tborder.setTitleColor(Color.darkGray); p02.setBorder(tborder); p0.add(p01); p0.add(p00); p0.add(p02); c.gridx = 0; c.gridy = 2; centerP.add(p0, c); p0 = new JPanel(); p0.setLayout(new GridLayout(1, 2, 8, 8)); p00 = new JPanel(); p00.setLayout(new BorderLayout()); p00.add(new JLabel("Font Size:"), BorderLayout.WEST); p00.add(fontSizeChoice, BorderLayout.CENTER); p0.add(p00); p00 = new JPanel(); p00.setLayout(new BorderLayout()); p00.add(new JLabel("Font Type:"), BorderLayout.WEST); p00.add(fontTypeChoice, BorderLayout.CENTER); p0.add(p00); tborder = new TitledBorder("Text Font"); tborder.setTitleColor(Color.darkGray); p0.setBorder(tborder); c.gridx = 0; c.gridy = 3; centerP.add(p0, c); p0 = new JPanel(); p0.setLayout(new GridLayout(1, 4, 8, 8)); p00 = new JPanel(); p00.setLayout(new BorderLayout()); checkAutoContrast = new JCheckBox("Autogain Image Contrast"); checkAutoContrast.setSelected(ViewProperties.isAutoContrast()); p00.add(checkAutoContrast, BorderLayout.CENTER); JButton button = new JButton(ViewProperties.getHelpIcon()); button.setToolTipText("Help on Auto Contrast"); button.setMargin(new Insets(0, 0, 0, 0)); button.addActionListener(this); button.setActionCommand("Help on Auto Contrast"); p00.add(button, BorderLayout.WEST); p0.add(p00); p0.add(checkShowValues = new JCheckBox("Show Values")); checkShowValues.setSelected(ViewProperties.showImageValues()); p00 = new JPanel(); p00.setLayout(new BorderLayout()); p00.add(new JLabel("Image Origin:"), BorderLayout.WEST); p00.add(imageOriginChoice, BorderLayout.CENTER); p0.add(p00); tborder = new TitledBorder("Image"); tborder.setTitleColor(Color.darkGray); p0.setBorder(tborder); c.gridx = 0; c.gridy = 4; centerP.add(p0, c); p0 = new JPanel(); p0.setLayout(new GridLayout(1, 3, 20, 8)); p00 = new JPanel(); p00.setLayout(new BorderLayout()); button = new JButton(ViewProperties.getHelpIcon()); button.setToolTipText("Help on Convert Enum"); button.setMargin(new Insets(0, 0, 0, 0)); button.addActionListener(this); button.setActionCommand("Help on Convert Enum"); p00.add(button, BorderLayout.WEST); checkConvertEnum = new JCheckBox("Convert Enum"); checkConvertEnum.setSelected(ViewProperties.isConvertEnum()); p00.add(checkConvertEnum, BorderLayout.CENTER); p0.add(p00); p00 = new JPanel(); p00.setLayout(new BorderLayout()); String[] indexBaseChoices = { "0-based", "1-based" }; indexBaseChoice = new JComboBox(indexBaseChoices); if (ViewProperties.isIndexBase1()) indexBaseChoice.setSelectedIndex(1); else indexBaseChoice.setSelectedIndex(0); p00.add(new JLabel("Index Base: "), BorderLayout.WEST); p00.add(indexBaseChoice, BorderLayout.CENTER); p0.add(p00); p00 = new JPanel(); p00.setLayout(new BorderLayout()); p00.add(new JLabel("Data Delimiter:"), BorderLayout.WEST); p00.add(delimiterChoice, BorderLayout.CENTER); p0.add(p00); tborder = new TitledBorder("Data"); tborder.setTitleColor(Color.darkGray); p0.setBorder(tborder); c.gridx = 0; c.gridy = 5; centerP.add(p0, c); p0 = new JPanel(); p0.setLayout(new GridLayout(1, 3, 8, 8)); int nMax = ViewProperties.getMaxMembers(); checkReadAll = new JRadioButton("Open All", (nMax<=0) || (nMax==Integer.MAX_VALUE)); checkReadAll.addItemListener(this); p0.add(checkReadAll); p00 = new JPanel(); p00.setLayout(new BorderLayout()); p00.add(new JLabel("Start Member: "), BorderLayout.WEST); p00.add(startMemberField = new JTextField(String.valueOf(ViewProperties.getStartMembers())), BorderLayout.CENTER); p0.add(p00); p00 = new JPanel(); p00.setLayout(new BorderLayout()); p00.add(new JLabel("Member Count: "), BorderLayout.WEST); p00.add(maxMemberField = new JTextField(String.valueOf(ViewProperties.getMaxMembers())), BorderLayout.CENTER); p0.add(p00); startMemberField.setEnabled(!checkReadAll.isSelected()); maxMemberField.setEnabled(!checkReadAll.isSelected()); tborder = new TitledBorder("Objects to Open"); tborder.setTitleColor(Color.darkGray); p0.setBorder(tborder); c.gridx = 0; c.gridy = 6; centerP.add(p0, c); p0 = new JPanel(); p0.setLayout(new GridLayout(1, 2, 8, 8)); JPanel pType = new JPanel(); pType.setLayout(new GridLayout(1, 2, 8, 8)); checkIndexType = new JRadioButton("By Name", indexType.compareTo("H5_INDEX_NAME") == 0); pType.add(checkIndexType); JRadioButton checkIndexCreateOrder = new JRadioButton("By Creation Order", indexType.compareTo("H5_INDEX_CRT_ORDER") == 0); pType.add(checkIndexCreateOrder); ButtonGroup bTypegrp = new ButtonGroup(); bTypegrp.add(checkIndexType); bTypegrp.add(checkIndexCreateOrder); tborder = new TitledBorder("Indexing Type"); tborder.setTitleColor(Color.darkGray); pType.setBorder(tborder); p0.add(pType); JPanel pOrder = new JPanel(); pOrder.setLayout(new GridLayout(1, 3, 8, 8)); checkIndexOrder = new JRadioButton("Increments", indexOrder.compareTo("H5_ITER_INC") == 0); pOrder.add(checkIndexOrder); JRadioButton checkIndexDecrement = new JRadioButton("Decrements", indexOrder.compareTo("H5_ITER_DEC") == 0); pOrder.add(checkIndexDecrement); checkIndexNative = new JRadioButton("Native", indexOrder.compareTo("H5_ITER_NATIVE") == 0); pOrder.add(checkIndexNative); ButtonGroup bOrdergrp = new ButtonGroup(); bOrdergrp.add(checkIndexOrder); bOrdergrp.add(checkIndexDecrement); bOrdergrp.add(checkIndexNative); tborder = new TitledBorder("Indexing Order"); tborder.setTitleColor(Color.darkGray); pOrder.setBorder(tborder); p0.add(pOrder); tborder = new TitledBorder("Display Indexing Options"); tborder.setTitleColor(Color.darkGray); p0.setBorder(tborder); c.gridx = 0; c.gridy = 7; centerP.add(p0, c); if (workDir.equals(System.getProperty("user.dir"))) { checkCurrentUserDir.setSelected(true); workField.setEnabled(false); } return centerP; } private JPanel createModuleOptionPanel() { choiceTreeView = new JComboBox(treeViews); choiceTableView = new JComboBox(tableViews); choiceTextView = new JComboBox(textViews); choiceImageView = new JComboBox(imageViews); choiceMetaDataView = new JComboBox(metaDataViews); choicePaletteView = new JComboBox(paletteViews); JPanel moduleP = new JPanel(); moduleP.setLayout(new GridLayout(6, 1, 10, 10)); moduleP.setBorder(new SoftBevelBorder(BevelBorder.LOWERED)); JPanel treeP = new JPanel(); TitledBorder tborder = new TitledBorder("TreeView"); tborder.setTitleColor(Color.darkGray); treeP.setBorder(tborder); moduleP.add(treeP); treeP.setLayout(new BorderLayout(5, 5)); treeP.add(choiceTreeView, BorderLayout.CENTER); JPanel attrP = new JPanel(); tborder = new TitledBorder("MetaDataView"); tborder.setTitleColor(Color.darkGray); attrP.setBorder(tborder); moduleP.add(attrP); attrP.setLayout(new BorderLayout(5, 5)); attrP.add(choiceMetaDataView, BorderLayout.CENTER); JPanel textP = new JPanel(); tborder = new TitledBorder("TextView"); tborder.setTitleColor(Color.darkGray); textP.setBorder(tborder); moduleP.add(textP); textP.setLayout(new BorderLayout(5, 5)); textP.add(choiceTextView, BorderLayout.CENTER); JPanel tableP = new JPanel(); tborder = new TitledBorder("TableView"); tborder.setTitleColor(Color.darkGray); tableP.setBorder(tborder); moduleP.add(tableP); tableP.setLayout(new BorderLayout(5, 5)); tableP.add(choiceTableView, BorderLayout.CENTER); JPanel imageP = new JPanel(); tborder = new TitledBorder("ImageView"); tborder.setTitleColor(Color.darkGray); imageP.setBorder(tborder); moduleP.add(imageP); imageP.setLayout(new BorderLayout(5, 5)); imageP.add(choiceImageView, BorderLayout.CENTER); JPanel palP = new JPanel(); tborder = new TitledBorder("PaletteView"); tborder.setTitleColor(Color.darkGray); palP.setBorder(tborder); moduleP.add(palP); palP.setLayout(new BorderLayout(5, 5)); palP.add(choicePaletteView, BorderLayout.CENTER); return moduleP; } /* * private JPanel createSrbConnectionPanel() { JPanel p = new JPanel(); * p.setLayout(new BorderLayout(5,5)); TitledBorder tborder = new * TitledBorder("SRB Connections"); tborder.setTitleColor(Color.darkGray); * p.setBorder(tborder); * * DefaultListModel listModel = new DefaultListModel(); srbJList = new * JList(listModel); * srbJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); * srbJList.addListSelectionListener(this); * * srbFields = new JTextField[7]; * * if (srbVector!= null) { int n=srbVector.size(); * * String srbaccount[] = null; for (int i=0; i0)) { * srbJList.setSelectedIndex(0); } * * return p; } */ public void actionPerformed(ActionEvent e) { Object source = e.getSource(); String cmd = e.getActionCommand(); if (cmd.equals("Set options")) { setUserOptions(); setVisible(false); } else if (cmd.equals("Cancel")) { isFontChanged = false; setVisible(false); } else if (cmd.equals("Set current dir to user.dir")) { boolean isCheckCurrentUserDirSelected = checkCurrentUserDir.isSelected(); workField.setEnabled(!isCheckCurrentUserDirSelected); currentDirButton.setEnabled(!isCheckCurrentUserDirSelected); } else if (cmd.equals("Browse UG")) { final JFileChooser fchooser = new JFileChooser(rootDir); int returnVal = fchooser.showOpenDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); if (fname == null) { return; } UGField.setText(fname); } else if (cmd.equals("Browse current dir")) { final JFileChooser fchooser = new JFileChooser(rootDir); fchooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int returnVal = fchooser.showDialog(this, "Select"); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); if (fname == null) { return; } workField.setText(fname); } else if (cmd.equals("Browse h4toh5")) { final JFileChooser fchooser = new JFileChooser(rootDir); int returnVal = fchooser.showOpenDialog(this); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } File choosedFile = fchooser.getSelectedFile(); if (choosedFile == null) { return; } String fname = choosedFile.getAbsolutePath(); if (fname == null) { return; } H4toH5Path = fname; H4toH5Field.setText(fname); } else if (cmd.startsWith("Add Module")) { String newModule = JOptionPane.showInputDialog(this, "Type the full path of the new module:", cmd, JOptionPane.PLAIN_MESSAGE); if ((newModule == null) || (newModule.length() < 1)) { return; } // enables use of JHDF5 in JNLP (Web Start) applications, the system // class loader with reflection first. try { Class.forName(newModule); } catch (Exception ex) { try { ViewProperties.loadExtClass().loadClass(newModule); } catch (ClassNotFoundException ex2) { JOptionPane.showMessageDialog(this, "Cannot find module:\n " + newModule + "\nPlease check the module name and classpath.", "HDFView", JOptionPane.ERROR_MESSAGE); return; } } if (cmd.endsWith("TreeView") && !treeViews.contains(newModule)) { treeViews.add(newModule); choiceTreeView.addItem(newModule); } else if (cmd.endsWith("MetadataView") && !metaDataViews.contains(newModule)) { metaDataViews.add(newModule); choiceMetaDataView.addItem(newModule); } else if (cmd.endsWith("TextView") && !textViews.contains(newModule)) { textViews.add(newModule); choiceTextView.addItem(newModule); } else if (cmd.endsWith("TableView") && !tableViews.contains(newModule)) { tableViews.add(newModule); choiceTableView.addItem(newModule); } else if (cmd.endsWith("ImageView") && !imageViews.contains(newModule)) { imageViews.add(newModule); choiceImageView.addItem(newModule); } else if (cmd.endsWith("PaletteView") && !paletteViews.contains(newModule)) { paletteViews.add(newModule); choicePaletteView.addItem(newModule); } } else if (cmd.startsWith("Delete Module")) { JComboBox theChoice = (JComboBox) source; if (theChoice.getItemCount() == 1) { JOptionPane.showMessageDialog(this, "Cannot delete the last module.", cmd, JOptionPane.ERROR_MESSAGE); return; } int reply = JOptionPane.showConfirmDialog(this, "Do you want to delete the selected module?", cmd, JOptionPane.YES_NO_OPTION); if (reply == JOptionPane.NO_OPTION) { return; } String moduleName = (String) theChoice.getSelectedItem(); theChoice.removeItem(moduleName); if (cmd.endsWith("TreeView")) { treeViews.remove(moduleName); } else if (cmd.endsWith("MetadataView")) { metaDataViews.remove(moduleName); } else if (cmd.endsWith("TextView")) { textViews.remove(moduleName); } else if (cmd.endsWith("TableView")) { tableViews.remove(moduleName); } else if (cmd.endsWith("ImageView")) { imageViews.remove(moduleName); } else if (cmd.endsWith("PaletteView")) { paletteViews.remove(moduleName); } } /* * else if (cmd.equals("Add srb connsction")) { String srbaccount[] = * new String[7]; for (int i=0; i<7; i++) { srbaccount[i] = * srbFields[i].getText(); if (srbaccount[i] == null) { return; } } * DefaultListModel lm = (DefaultListModel)srbJList.getModel(); * * if (lm.contains(srbaccount[0])) { int n = * srbJList.getSelectedIndex(); if ( n<0 ) return; String * srbaccountOld[] = (String[])srbVector.get(n); for (int i=0; i<7; i++) * srbaccountOld[i] = srbaccount[i]; } else { srbVector.add(srbaccount); * lm.addElement(srbaccount[0]); * srbJList.setSelectedValue(srbaccount[0], true); } } else if * (cmd.equals("Delete srb connsction")) { int n = * srbJList.getSelectedIndex(); if (n<0) { return; } * * int resp = JOptionPane.showConfirmDialog(this, * "Are you sure you want to delete the following SRB connection?\n"+ * " \""+srbJList.getSelectedValue()+"\"", * "Delete SRB Connection", JOptionPane.YES_NO_OPTION); if (resp == * JOptionPane.NO_OPTION) { return; } * * DefaultListModel lm = (DefaultListModel)srbJList.getModel(); * lm.removeElementAt(n); srbVector.remove(n); for (int i=0; i<7; i++) { * srbFields[i].setText(""); } } */ else if (cmd.equals("Help on Auto Contrast")) { final String msg = "Auto Contrast does the following to compute a gain/bias \n" + "that will stretch the pixels in the image to fit the pixel \n" + "values of the graphics system. For example, it stretches unsigned\n" + "short data to fit the full range of an unsigned short. Later \n" + "code simply takes the high order byte and passes it to the graphics\n" + "system (which expects 0-255). It uses some statistics on the pixels \n" + "to prevent outliers from throwing off the gain/bias calculations much.\n\n" + "To compute the gain/bias we... \n" + "Find the mean and std. deviation of the pixels in the image \n" + "min = mean - 3 * std.dev. \n" + "max = mean + 3 * std.dev. \n" + "small fudge factor because this tends to overshoot a bit \n" + "Stretch to 0-USHRT_MAX \n" + " gain = USHRT_MAX / (max-min) \n" + " bias = -min \n" + "\n" + "To apply the gain/bias to a pixel, use the formula \n" + "data[i] = (data[i] + bias) * gain \n" + "\n" // + // "Finally, for auto-ranging the sliders for gain/bias, we do the following \n" // + "gain_min = 0 \n" // + "gain_max = gain * 3.0 \n" // + "bias_min = -fabs(bias) * 3.0 \n" // + "bias_max = fabs(bias) * 3.0 \n" + "\n\n"; JOptionPane.showMessageDialog(this, msg); } else if (cmd.equals("Help on Convert Enum")) { final String msg = "Convert enum data to strings. \n" + "For example, a dataset of an enum type of (R=0, G=, B=2) \n" + "has values of (0, 2, 2, 2, 1, 1). With conversion, the data values are \n" + "shown as (R, B, B, B, G, G).\n\n\n"; JOptionPane.showMessageDialog(this, msg); } } /* * public void valueChanged(ListSelectionEvent e) { Object src = * e.getSource(); * * if (!src.equals(srbJList)) { return; } * * int n = srbJList.getSelectedIndex(); if ( n<0 ) { return; } * * String srbaccount[] = (String[])srbVector.get(n); if (srbaccount == null) * { return; } * * n = Math.min(7, srbaccount.length); for (int i=0; i 0)) { UGPath = UGPath.trim(); isUserGuideChanged = !UGPath.equals(ViewProperties.getUsersGuide()); ViewProperties.setUsersGuide(UGPath); } String workPath = workField.getText(); if (checkCurrentUserDir.isSelected()) { workPath = "user.dir"; } if ((workPath != null) && (workPath.length() > 0)) { workPath = workPath.trim(); isWorkDirChanged = !workPath.equals(ViewProperties.getWorkDir()); ViewProperties.setWorkDir(workPath); } String ext = fileExtField.getText(); if ((ext != null) && (ext.length() > 0)) { ext = ext.trim(); ViewProperties.setFileExtension(ext); } if (checkReadOnly.isSelected()) ViewProperties.setReadOnly(true); else ViewProperties.setReadOnly(false); if (checkLibVersion.isSelected()) ViewProperties.setEarlyLib(true); else ViewProperties.setEarlyLib(false); // set font size int fsize = 12; try { fsize = Integer.parseInt((String) fontSizeChoice.getSelectedItem()); ViewProperties.setFontSize(fsize); if ((fontSize != ViewProperties.getFontSize())) { isFontChanged = true; } } catch (Exception ex) { } // set font type String ftype = (String) fontTypeChoice.getSelectedItem(); if (!ftype.equalsIgnoreCase(ViewProperties.getFontType())) { isFontChanged = true; ViewProperties.setFontType(ftype); } // set data delimiter ViewProperties.setDataDelimiter((String) delimiterChoice.getSelectedItem()); ViewProperties.setImageOrigin((String) imageOriginChoice.getSelectedItem()); // set index type if (checkIndexType.isSelected()) ViewProperties.setIndexType("H5_INDEX_NAME"); else ViewProperties.setIndexType("H5_INDEX_CRT_ORDER"); // set index order if (checkIndexOrder.isSelected()) ViewProperties.setIndexOrder("H5_ITER_INC"); else if (checkIndexNative.isSelected()) ViewProperties.setIndexOrder("H5_ITER_NATIVE"); else ViewProperties.setIndexOrder("H5_ITER_DEC"); if (checkReadAll.isSelected()) { ViewProperties.setStartMembers(0); ViewProperties.setMaxMembers(-1); } else { try { int maxsize = Integer.parseInt(maxMemberField.getText()); ViewProperties.setMaxMembers(maxsize); } catch (Exception ex) { } try { int startsize = Integer.parseInt(startMemberField.getText()); ViewProperties.setStartMembers(startsize); } catch (Exception ex) { } } Vector[] moduleList = { treeViews, metaDataViews, textViews, tableViews, imageViews, paletteViews }; JComboBox[] choiceList = { choiceTreeView, choiceMetaDataView, choiceTextView, choiceTableView, choiceImageView, choicePaletteView }; for (int i = 0; i < 6; i++) { Object theModule = choiceList[i].getSelectedItem(); moduleList[i].remove(theModule); moduleList[i].add(0, theModule); } ViewProperties.setAutoContrast(checkAutoContrast.isSelected()); ViewProperties.setShowImageValue(checkShowValues.isSelected()); ViewProperties.setConvertEnum(checkConvertEnum.isSelected()); if (indexBaseChoice.getSelectedIndex() == 0) ViewProperties.setIndexBase1(false); else ViewProperties.setIndexBase1(true); } public boolean isFontChanged() { return isFontChanged; } public boolean isUserGuideChanged() { return isUserGuideChanged; } public boolean isWorkDirChanged() { return isWorkDirChanged; } @Override public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source.equals(checkReadAll)) { startMemberField.setEnabled(!checkReadAll.isSelected()); maxMemberField.setEnabled(!checkReadAll.isSelected()); } } } jhdf-2.9/ncsa/hdf/view/ImageView.java0000644000175000017500000000424212050301063020330 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.awt.Image; import java.awt.Rectangle; /** * The image view interface for displaying image object * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public abstract interface ImageView extends DataView { /** * returns the selected area of the image * * @return the rectangle of the selected image area. */ public abstract Rectangle getSelectedArea(); /** @return true if the image is a truecolor image. */ public abstract boolean isTrueColor(); /** @return true if the image interlace is plance interlace. */ public abstract boolean isPlaneInterlace(); /** returns array of selected data */ public abstract Object getSelectedData(); /** returns the image displayed in this imageView */ public abstract Image getImage(); /** sets the image */ public abstract void setImage(Image img); /** returns the palette of the image */ public abstract byte[][] getPalette(); /** sets the image palette */ public abstract void setPalette(byte[][] palette); /** returns the byte array of the image data */ public abstract byte[] getImageByteData(); } jhdf-2.9/ncsa/hdf/view/NewDatasetHelp.html0000644000175000017500000000556512050301063021357 0ustar sylvestresylvestre

    How to Create a New Dataset

    The following instructions explain how to create a new dataset. This dialog allows the creation of a dataset (an HDF4 SDS or an HDF5 dataset). The dataset can be a 1 to 32 dimension array of numbers, characters, or strings.  

    To create a dataset, it is necessary to define its name , parent group, datatype, dataspace (i.e., the dimensions). Optionally, the storage properties can be specified.

    The dataset will be created and filled with zeros. Data can be added with the hdfedit tool, or  by a program.

    1) Dataset name and path

    The name of the new dataset must follow the HDF5 name rules (similar to the unix name rules). The name may contain almost any characters, but it must not contain the path separator, '/'.

    The dataset must be a member of some Group. The 'Add to group' selection lists all the Groups in the file.

    2) Datatype

    The datatype specifies the type of the data elements of the array. This Java-based tool only supports three datatypes: integer, float and string.

    The size specifies the size of a single data point in bits such as 32-bit integer or 64-bit float. The size of a float is either 32-bit or 64-bit. For HDF5, there are three byte order choices: NATIVE, LITTLE ENDIAN and BIG ENDIAN. "NATIVE" byte order means that the byte order is determined by the machine. The byte order cannot be specified for HDF4.

    3) Dataspace

    The dataspece specifies number of dimensions (rank), current dimension size and maximum dimension size. The dimension size is separated by  "x". For example, a 3D dataset might show the dimensions as:  20 x 30 x 5.

    The current size must be greater than zero, and the maximum size must be at least as large as the current size. A maximum size or zero means the maximum size will be set to the current size. Setting the maximum size to -1  will make the dimension "unlimited".

    4) Storage layout and data compression

    There are two options for storage layout: continguous or chunked. The default storage layout is continguous. If chunked layout is selected, the chunk size must be specified.

    The dataset may be compressed with GZIP. The compression level is ranged from zero (no compression) to 9 (highest compression).  In HDF5, if compression is selected then the dataset must be chunked. jhdf-2.9/ncsa/hdf/view/DataView.java0000755000175000017500000000332412050301063020162 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import ncsa.hdf.object.HObject; /** * The data view interface for displaying data object * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public abstract interface DataView { /** The unknown view type */ public final static int DATAVIEW_UNKNOWN = -1; /** The table view type */ public final static int DATAVIEW_TABLE = 1; /** The image view type */ public final static int DATAVIEW_IMAGE = 2; /** The text view type */ public final static int DATAVIEW_TEXT = 3; /** returns the data object displayed in this data viewer */ public abstract HObject getDataObject(); /** Disposes this datao viewer */ public abstract void dispose(); } jhdf-2.9/ncsa/hdf/view/DefaultFileFilter.java0000644000175000017500000006240612050301063022013 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; import java.util.Enumeration; import java.util.Hashtable; import java.util.StringTokenizer; import javax.swing.filechooser.FileFilter; /** * A convenience implementation of FileFilter that filters out all files except * for those type extensions that it knows about. * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public class DefaultFileFilter extends FileFilter { private static FileFilter FILE_FILTER_HDF = null; private static FileFilter FILE_FILTER_HDF4 = null; private static FileFilter FILE_FILTER_HDF5 = null; private static FileFilter FILE_FILTER_JPEG = null; private static FileFilter FILE_FILTER_TIFF = null; private static FileFilter FILE_FILTER_PNG = null; private static FileFilter FILE_FILTER_GIF = null; private static FileFilter FILE_FILTER_BMP = null; private static FileFilter FILE_FILTER_IMG = null; private static FileFilter FILE_FILTER_TEXT = null; private static FileFilter FILE_FILTER_BINARY = null; private static String fileExtension = ViewProperties.getFileExtension(); private Hashtable filters = null; private String description = null; private String fullDescription = null; private boolean useExtensionsInDescription = true; /** * Creates a file filter. If no filters are added, then all files are * accepted. * * @see #addExtension */ public DefaultFileFilter() { this.filters = new Hashtable(); } /** * Creates a file filter that accepts files with the given extension. * Example: new DefaultFileFilter("jpg"); * * @see #addExtension */ public DefaultFileFilter(String extension) { this(extension, null); } /** * Creates a file filter that accepts the given file type. Example: new * DefaultFileFilter("jpg", "JPEG Image Images"); * * Note that the "." before the extension is not needed. If provided, it * will be ignored. * * @see #addExtension */ public DefaultFileFilter(String extension, String description) { this(); if (extension != null) { addExtension(extension); } if (description != null) { setDescription(description); } } /** * Creates a file filter from the given string array. Example: new * DefaultFileFilter(String {"gif", "jpg"}); * * Note that the "." before the extension is not needed adn will be ignored. * * @see #addExtension */ public DefaultFileFilter(String[] filters) { this(filters, null); } /** * Creates a file filter from the given string array and description. * Example: new DefaultFileFilter(String {"gif", "jpg"}, * "Gif and JPG Images"); * * Note that the "." before the extension is not needed and will be ignored. * * @see #addExtension */ public DefaultFileFilter(String[] filters, String description) { this(); for (int i = 0; i < filters.length; i++) { // add filters one by one addExtension(filters[i]); } if (description != null) { setDescription(description); } } /** * Return true if this file should be shown in the directory pane, false if * it shouldn't. * * Files that begin with "." are ignored. * * @see #getExtension */ @Override public boolean accept(File f) { if (f != null) { if (f.isDirectory()) { return true; } String extension = getExtension(f); if ((extension != null) && (filters.get(getExtension(f)) != null)) { return true; } } return false; } /** * Return the extension portion of the file's name . * * @see #getExtension * @see FileFilter#accept */ public String getExtension(File f) { if (f != null) { String filename = f.getName(); int i = filename.lastIndexOf('.'); if ((i > 0) && (i < filename.length() - 1)) { return filename.substring(i + 1).toLowerCase(); } ; } return null; } /** * Adds a filetype "dot" extension to filter against. * * For example: the following code will create a filter that filters out all * files except those that end in ".jpg" and ".tif": * * DefaultFileFilter filter = new DefaultFileFilter(); * filter.addExtension("jpg"); filter.addExtension("tif"); or * filter.addExtension("jpg, tif"); * * Note that the "." before the extension is not needed and will be ignored. */ public void addExtension(String extension) { if (filters == null) { filters = new Hashtable(5); } String ext = null; StringTokenizer st = new StringTokenizer(extension, ","); while (st.hasMoreElements()) { ext = st.nextToken().trim(); filters.put(ext.toLowerCase(), this); } fullDescription = null; } /** * Returns the human readable description of this filter. For example: * "JPEG and GIF Image Files (*.jpg, *.gif)" */ @Override public String getDescription() { if (fullDescription == null) { if ((description == null) || isExtensionListInDescription()) { fullDescription = description == null ? "(" : description + " ("; // build the description from the extension list Enumeration extensions = filters.keys(); if (extensions != null) { if (!extensions.hasMoreElements()) { fullDescription = null; return null; } fullDescription += "." + extensions.nextElement(); while (extensions.hasMoreElements()) { fullDescription += ", " + extensions.nextElement(); } } fullDescription += ")"; } else { fullDescription = description; } } return fullDescription; } /** * Sets the human readable description of this filter. For example: * filter.setDescription("Gif and JPG Images"); */ public void setDescription(String description) { this.description = description; fullDescription = null; } /** * Determines whether the extension list (.jpg, .gif, etc) should show up in * the human readable description. * * Only relevent if a description was provided in the constructor or using * setDescription(); * */ public void setExtensionListInDescription(boolean b) { useExtensionsInDescription = b; fullDescription = null; } /** * Returns whether the extension list (.jpg, .gif, etc) should show up in * the human readable description. * * Only relevent if a description was provided in the constructor or using * setDescription(); */ public boolean isExtensionListInDescription() { return useExtensionsInDescription; } /** Return a file filter for HDF4/5 file. */ public static FileFilter getFileFilter() { boolean extensionNotChanged = (fileExtension .equalsIgnoreCase(ViewProperties.getFileExtension())); if ((FILE_FILTER_HDF != null) && extensionNotChanged) { return FILE_FILTER_HDF; } // update extensions fileExtension = ViewProperties.getFileExtension(); DefaultFileFilter filter = new DefaultFileFilter(); filter.setDescription("HDF & more"); filter.addExtension(fileExtension); return (FILE_FILTER_HDF = filter); } /** Return a file filter for HDF4 file. */ public static FileFilter getFileFilterHDF4() { if (FILE_FILTER_HDF4 != null) { return FILE_FILTER_HDF4; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("hdf"); filter.addExtension("h4"); filter.addExtension("hdf4"); filter.setDescription("HDF4 files"); FILE_FILTER_HDF4 = filter; return FILE_FILTER_HDF4; } /** Return a file filter for HDF5 file. */ public static FileFilter getFileFilterHDF5() { if (FILE_FILTER_HDF5 != null) { return FILE_FILTER_HDF5; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("h5"); filter.addExtension("hdf5"); filter.setDescription("HDF5 files"); FILE_FILTER_HDF5 = filter; return FILE_FILTER_HDF5; } /** Return a file filter for JPEG image files. */ public static FileFilter getFileFilterJPEG() { if (FILE_FILTER_JPEG != null) { return FILE_FILTER_JPEG; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("jpg"); filter.addExtension("jpeg"); filter.addExtension("jpe"); filter.addExtension("jif"); filter.addExtension("jfif"); filter.addExtension("jfi"); filter.setDescription("JPEG images"); FILE_FILTER_JPEG = filter; return FILE_FILTER_JPEG; } /** Return a file filter for TIFF image files. */ public static FileFilter getFileFilterTIFF() { if (FILE_FILTER_TIFF != null) { return FILE_FILTER_TIFF; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("tif"); filter.addExtension("tiff"); filter.setDescription("TIFF images"); FILE_FILTER_TIFF = filter; return FILE_FILTER_TIFF; } /** Return a file filter for PNG image files. */ public static FileFilter getFileFilterPNG() { if (FILE_FILTER_PNG != null) { return FILE_FILTER_PNG; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("png"); filter.setDescription("PNG images"); FILE_FILTER_PNG = filter; return FILE_FILTER_PNG; } /** Return a file filter for BMP image files. */ public static FileFilter getFileFilterBMP() { if (FILE_FILTER_BMP != null) { return FILE_FILTER_BMP; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("bmp"); filter.addExtension("dib"); filter.setDescription("BMP images"); FILE_FILTER_BMP = filter; return FILE_FILTER_BMP; } /** Return a file filter for GIF image files. */ public static FileFilter getFileFilterGIF() { if (FILE_FILTER_GIF != null) { return FILE_FILTER_GIF; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("gif"); filter.setDescription("GIF images"); FILE_FILTER_GIF = filter; return FILE_FILTER_GIF; } /** Return a file filter for GIF, JPEG, BMP, or PNG image files. */ public static FileFilter getImageFileFilter() { if (FILE_FILTER_IMG != null) { return FILE_FILTER_IMG; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("jpg"); filter.addExtension("jpeg"); filter.addExtension("jpe"); filter.addExtension("jif"); filter.addExtension("jfif"); filter.addExtension("jfi"); filter.addExtension("png"); filter.addExtension("gif"); filter.addExtension("bmp"); filter.addExtension("dib"); filter.setDescription("GIF, JPEG, BMP, or PNG images"); FILE_FILTER_IMG = filter; return FILE_FILTER_IMG; } /** Return a file filter for text file. */ public static FileFilter getFileFilterText() { if (FILE_FILTER_TEXT != null) { return FILE_FILTER_TEXT; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("txt"); filter.addExtension("text"); filter.setDescription("Text"); FILE_FILTER_TEXT = filter; return FILE_FILTER_TEXT; } /** Return a file filter for binary file. */ public static FileFilter getFileFilterBinary() { if (FILE_FILTER_BINARY != null) { return FILE_FILTER_BINARY; } DefaultFileFilter filter = new DefaultFileFilter(); filter.addExtension("bin"); filter.setDescription("Binary"); FILE_FILTER_BINARY = filter; return FILE_FILTER_BINARY; } /** * look at the first 4 bytes of the file to see if it is an HDF4 file. * byte[0]=14, byte[1]=3, byte[2]=19, byte[3]=1 or if it is a netCDF file * byte[0]=67, byte[1]=68, byte[2]=70, byte[3]=1 or */ public static boolean isHDF4(String filename) { boolean ish4 = false; RandomAccessFile raf = null; try { raf = new RandomAccessFile(filename, "r"); } catch (Exception ex) { raf = null; } if (raf == null) { return false; } byte[] header = new byte[4]; try { raf.read(header); } catch (Exception ex) { header = null; } if (header != null) { if ( // HDF4 ((header[0] == 14) && (header[1] == 3) && (header[2] == 19) && (header[3] == 1)) /* * // netCDF || (header[0]==67 && header[1]==68 && header[2]==70 && * header[3]==1) */ ) { ish4 = true; } else { ish4 = false; } } try { raf.close(); } catch (Exception ex) { } return ish4; } /** * look at the first 8 bytes of the file to see if it is an HDF5 file. * byte[0]=-199 which is 137 in unsigned byte, byte[1]=72, byte[2]=68, * byte[3]=70, byte[4]=13, byte[5]=10, byte[6]=26, byte[7]=10 */ public static boolean isHDF5(String filename) { boolean ish5 = false; RandomAccessFile raf = null; try { raf = new RandomAccessFile(filename, "r"); } catch (Exception ex) { raf = null; } if (raf == null) { return false; } byte[] header = new byte[8]; long fileSize = 0; try { fileSize = raf.length(); } catch (Exception ex) { } // The super block is located by searching for the HDF5 file signature // at byte offset 0, byte offset 512 and at successive locations in the // file, each a multiple of two of the previous location, i.e. 0, 512, // 1024, 2048, etc long offset = 0; while (!ish5 && (offset < fileSize)) { try { raf.seek(offset); raf.read(header); } catch (Exception ex) { header = null; } if ((header[0] == -119) && (header[1] == 72) && (header[2] == 68) && (header[3] == 70) && (header[4] == 13) && (header[5] == 10) && (header[6] == 26) && (header[7] == 10)) { ish5 = true; } else { ish5 = false; if (offset == 0) { offset = 512; } else { offset *= 2; } } } try { raf.close(); } catch (Exception ex) { } return ish5; } /** * look at the first 4 bytes of the file to see if it is a netCDF file * byte[0]=67, byte[1]=68, byte[2]=70, byte[3]=1 or */ public static boolean isNetcdf(String filename) { boolean isnc = false; RandomAccessFile raf = null; try { raf = new RandomAccessFile(filename, "r"); } catch (Exception ex) { raf = null; } if (raf == null) { return false; } byte[] header = new byte[4]; try { raf.read(header); } catch (Exception ex) { header = null; } if (header != null) { if ( // netCDF (header[0] == 67) && (header[1] == 68) && (header[2] == 70) && (header[3] == 1)) { isnc = true; } else { isnc = false; } } try { raf.close(); } catch (Exception ex) { } return isnc; } /** * Read HDF5 user block data into byte array. * * @return a byte array of user block, or null if there is user data. */ public static byte[] getHDF5UserBlock(String filename) { byte[] userBlock = null; RandomAccessFile raf = null; try { raf = new RandomAccessFile(filename, "r"); } catch (Exception ex) { try { raf.close(); } catch (Throwable err) { ; } raf = null; } if (raf == null) { return null; } byte[] header = new byte[8]; long fileSize = 0; try { fileSize = raf.length(); } catch (Exception ex) { fileSize = 0; } if (fileSize <= 0) { try { raf.close(); } catch (Throwable err) { ; } return null; } // The super block is located by searching for the HDF5 file signature // at byte offset 0, byte offset 512 and at successive locations in the // file, each a multiple of two of the previous location, i.e. 0, 512, // 1024, 2048, etc long offset = 0; boolean ish5 = false; while (offset < fileSize) { try { raf.seek(offset); raf.read(header); } catch (Exception ex) { header = null; } if ((header[0] == -119) && (header[1] == 72) && (header[2] == 68) && (header[3] == 70) && (header[4] == 13) && (header[5] == 10) && (header[6] == 26) && (header[7] == 10)) { ish5 = true; break; // find the end of user block } else { ish5 = false; if (offset == 0) { offset = 512; } else { offset *= 2; } } } if (!ish5 || (offset == 0)) { try { raf.close(); } catch (Throwable err) { ; } return null; } int blockSize = (int) offset; userBlock = new byte[blockSize]; try { raf.seek(0); raf.read(userBlock, 0, blockSize); } catch (Exception ex) { userBlock = null; } try { raf.close(); } catch (Exception ex) { } return userBlock; } /** * Write HDF5 user block data into byte array. * * @return a byte array of user block, or null if there is user data. */ public static boolean setHDF5UserBlock(String fin, String fout, byte[] buf) { boolean ish5 = false; if ((buf == null) || (buf.length <= 0)) { return false; } File tmpFile = new File(fin); if (!tmpFile.exists()) { return false; } // find the end of user block for the input file; RandomAccessFile raf = null; try { raf = new RandomAccessFile(fin, "r"); } catch (Exception ex) { raf = null; } if (raf == null) { return false; } byte[] header = new byte[8]; long fileSize = 0; try { fileSize = raf.length(); } catch (Exception ex) { fileSize = 0; } try { fileSize = raf.length(); } catch (Exception ex) { fileSize = 0; } if (fileSize <= 0) { try { raf.close(); } catch (Throwable err) { ; } return false; } // The super block is located by searching for the HDF5 file signature // at byte offset 0, byte offset 512 and at successive locations in the // file, each a multiple of two of the previous location, i.e. 0, 512, // 1024, 2048, etc long offset = 0; while (offset < fileSize) { try { raf.seek(offset); raf.read(header); } catch (Exception ex) { header = null; } if ((header[0] == -119) && (header[1] == 72) && (header[2] == 68) && (header[3] == 70) && (header[4] == 13) && (header[5] == 10) && (header[6] == 26) && (header[7] == 10)) { ish5 = true; break; } else { ish5 = false; if (offset == 0) { offset = 512; } else { offset *= 2; } } } try { raf.close(); } catch (Throwable err) { ; } if (!ish5) { return false; } int length = 0; int bsize = 1024; byte[] buffer; BufferedInputStream bi = null; BufferedOutputStream bo = null; try { bi = new BufferedInputStream(new FileInputStream(fin)); } catch (Exception ex) { try { bi.close(); } catch (Exception ex2) { } return false; } try { bo = new BufferedOutputStream(new FileOutputStream(fout)); } catch (Exception ex) { try { bo.close(); } catch (Exception ex2) { } try { bi.close(); } catch (Exception ex2) { } return false; } // skip the header of original file try { bi.skip(offset); } catch (Exception ex) { } // write the header into the new file try { bo.write(buf, 0, buf.length); } catch (Exception ex) { } // The super block space is allocated by offset 0, 512, 1024, 2048, etc offset = 512; while (offset < buf.length) { offset *= 2; } int padSize = (int) (offset - buf.length); if (padSize > 0) { byte[] padBuf = new byte[padSize]; try { bo.write(padBuf, 0, padSize); } catch (Exception ex) { } } // copy the hdf5 file content from input file to the output file buffer = new byte[bsize]; try { length = bi.read(buffer, 0, bsize); } catch (Exception ex) { length = 0; } while (length > 0) { try { bo.write(buffer, 0, length); length = bi.read(buffer, 0, bsize); } catch (Exception ex) { length = 0; } } try { bo.flush(); } catch (Exception ex) { } try { bi.close(); } catch (Exception ex) { } try { bo.close(); } catch (Exception ex) { } return true; } } jhdf-2.9/ncsa/hdf/view/MetaDataView.java0000755000175000017500000000277112050301063020776 0ustar sylvestresylvestre/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.view; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.HObject; /** * *The metadata view interface for displaying metadata information * * @author Peter X. Cao * @version 2.4 9/6/2007 */ public abstract interface MetaDataView extends DataView { /** add an attribute to a data object. */ public abstract Attribute addAttribute(HObject obj); /** delete an attribribute from a data object. */ public abstract Attribute deleteAttribute(HObject obj); } jhdf-2.9/ncsa/Makefile.in0000644000175000017500000000237712050301064016152 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = .. DIR = ncsa SUBDIRS = hdf JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ include $(TOP)/config/Rules.mk jhdf-2.9/ncsa/CMakeLists.txt0000644000175000017500000000017012050301064016632 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_NCSA) ADD_SUBDIRECTORY(${HDFJAVA_NCSA_SOURCE_DIR}/hdf hdf) jhdf-2.9/Readme.txt0000644000175000017500000000520112050301103015076 0ustar sylvestresylvestre ******************************************************************************* HDF-Java Products ******************************************************************************* The HDF Java Products include three distinct components: =============================================================================== 1) Java HDF Interface (JHI4 & JHI5): a Java Native Interface to the standard HDF (4&5) libraries 2) Java HDF Object Package: a Java package that implements HDF data objects in an object-oriented form 3) HDFView: a visual tool for browsing and editing HDF files Features and changes =============================================================================== For major changes, please read "About This Release" at http://www.hdfgroup.org/hdf-java-html/ Files included in the release =============================================================================== 1) The "hdfview/" directory contains the installation programs for easy download and installation for HDFView. The installation programs are named by platforms. For example, "hdfview_install_linux32.bin" if for 32-bit linux machines. After you install HDFView, you have the pre-built binaries for all the HDF-Java products: JNI wrapper, object package, and HDFView. 2) The "bin/" directory includes the pre-built binaries for all of the HDF-Java product. You can either download the tarball, which has all the necessary binaries, or individual part of pre-built binaries. We strongly recommend you to download the tarball instead of individual files. 3) The "src/" directory has all of the source code for the HDF-Java product. You will only need it if you are building HDF-Java from the source. Install and use pre-built HDF-Java products =============================================================================== For instructions on the installation and use of HDF Java Products, please read "Installing and Using HDF Java Products" at http://www.hdfgroup.org/hdf-java-html/ or http://www.hdfgroup.org/hdf-java-html/install_use_hdf_java_products.pdf Build HDF-Java products from the source =============================================================================== For instructions of building the source on 1) Unix and MacOSX, visit http://www.hdfgroup.org/hdf-java-html/build_src_unix.html 2) Windows, visit http://www.hdfgroup.org/hdf-java-html/build_src_windows.html For more Information, read ======================================= http://www.hdfgroup.org/hdf-java-html For questions, send email to ======================================= help@hdfgroup.org jhdf-2.9/runconfig-example.sh0000644000175000017500000000357012050301103017126 0ustar sylvestresylvestre#!/bin/sh ## This is an example script to set the configure parameters for ## the HDF Java products. ## ## The paths need to be set according to the local configuration ## ## May need to adjust the arguments to configure ## ## ## ## IMPORTANT NOTE: The make files require 'gmake' ## ## Be sure to 'setenv MAKE gmake' if necessary ## INSTDIR= #where to install the hdfview. JAVAINC= #path to java includes (jni.h, etc.) JAVALIB= #path to java lib (the rt.jar, etc.) HDF5= # path to HDF5 installation, e.g., /usr/local/hdf5-1.6.2 HDF4= # path to HDF4 installation (if used) HDF45= # path to HDF4 to HDF5 installation (if used) ## Autoconf detects shared libraries, but we need static versions ## must set these paths for external libraries needed for HDF libraries. # JPEG is required by HDF4. If HDF4 is used, _must_ set JPEG JPEG= # path to JPEG installation (the path to libjpeg.a is needed) # GZIP is required by HDF4 and optional for HDF5. # If HDF4 is used, _must_ set GZIP # If HDF5 is used and zlib is used, _must_ set GZIP GZIP= # path to GZIP installation (the path to libz.a is needed) # SZIP is optional for HDF4 and HDF5. # If szip is used in one or both HDF libraries, _must_ set SZIP SZIP= # path to SZIP installation (the path to libsz.a is needed) #### ./configure --prefix=$INSTDIR --with-jdk=$JAVAINC,$JAVALIB --with-hdf5=$HDF5/include,$HDF5/lib --with-hdf4=$HDF4/include,$HDF4/lib --with-libsz=$SZIP/include,$SZIP/lib --with-libz=$GZIP/include,$GZIP/lib --with-libjpeg=$JPEG/include,$JPEG/lib # other options # # --without-hdf4 -- omit HDF4 # --without-hdf5 -- omit HDF5 # --without-libsz -- omit SZIP # --without-libz -- omit GZIP # --without-libsz -- omit GZIP # # # Some options required only for macOSX # # -build=powerpc-apple # --with-jdkclasses= # path to classes if not in 'jdk/lib' # --with-javabin= # path to java bin, if not in 'jdk/bin' jhdf-2.9/samples/0000755000175000017500000000000012051203650014617 5ustar sylvestresylvestrejhdf-2.9/samples/hdf5_test.h50000644000175000017500000664630312050301075016763 0ustar sylvestresylvestreHDF  L`HEAP@A notearraysdatatypesimagesdsetNotesTREE( V`p @C@ -N%xSNOD8`((HHEAP[< (^CfG  HThis file was created for testing purpose. fdaIt contains groups, datatypes, datasets, links.jfdjsakfldsaj; fjdklsajfdkl;as fjdksaljfdkl;as fjdsklajfdkls;a jfdklsa;jfdlsa fdsajfdlk;sa ?@??@UUUUUU?@UUUUUU@?A@?A @UUUUUU?A @$I$I?B %I$I@?DB @qq?B qq@ ?Bffffff@@Y@Bd@Y@e Y@Be Y@fUUUUUY@BfUUUUUY@gY@BgY@h Y@Bh Y@i Y@Bi Y@j$I$ Y@Cj$I$ Y@5Y@CkY@lrqY@$ClrqY@mfffffY@5CmfffffY@ i@HC i@i@ICi@ i@LC i@i@QCi@fffffi@XCfffffi@UUUUUi@aCUUUUUi@I$Ii@lCI$Ii@i@yCi@98i@C98i@33333i@C33333i@ h  ACfG 0IMAGE_VERSION1.2 0CLASSIMAGE :`8 /\M 0CLASSIMAGEX` @testthis is a test TREE =hSNODh0xK;  d2 d2CfG 8test test 0 d2  fd2CfGx  d2  @d2 CfGp*h    CfGxHEAPH5T_NATIVE_INT/t9Ρ:fff??ff&@`@̌@ff@33@@@33 AA(A4A33CAQAff^AlAyAA33AA̘A33AffA̬AAffAAA33AAA33AAA33AAffBBB B33BBB33BffBB"B&B?`@ff@@33 A(A33CAff^AyA33A̘AffAAA33AAA33AffBB33BBffB"B33)B33/B5B;BBBHBNBTBZB_BeB33kBpBffvB{BB33B̅BffBBffB̏B33BBB{.>ff&@`@@(AQAyAAffAffA33A33A33AB33B33B"Bff,B5B>BHBPBZBffbB33kBsB{B́B̅BBffBBBBffBB̡B̤B̧BB33B̯B33BB̶B̸B̺BB33B̿B33>ff@@(Aff^A33AffAAA33ABB"B33/B;BHBTB_B33kBffvBB̅BB̏BB33BB̡B̥BB33BB̳B̶BffBB33B33BBBBBBBBBBBBB?@(AQA33A̬A33AAB33B33)B8BHBVBeBsBB33BffBffB33BḄBB33BffB33B̸BB̾B33B33BB33B33BBBB33B33BB33B33B̾BB̸B33BffB33BB333?(Aff^AyAffA33A33A33B"B5BHBZB33kB{B̅BffBBffB̡B̧B33B33B̶B̺B33B33BBBBBBBBBB33B33B̺B̶B33B33B̧B̡BffBBffB̅B{B33kBZBR^?QA33AAAA33B&B;BPBeB33yB̅BBBB̥BffB33BffBB̿BB33BBBBffBBB33BBffBBBB̡BffB33BBBnBZBDB33/B33BffBAffAlAff?yAffAffAAB"B;BTB33kBBBBB̥B33B̳BffB33BBBBBBBBB33BffB̳B33B̥BBBBB33kBTB;B"BBAffAff^A@ff^ff(?AAffA33A33B5BPB33kB́BffBB̡BB33B̸B33BffBBffBBffBBffB33B̸B33BB̡BBffB́B33kBPB5B33B33AffAyA@yff3333š5P33ḱ…?ffAA33AB33)BHBeBBffB33ḄB33B33BB33BB33BB33BB33BB33B33ḄB33BffBBeBHB33)BB33A33A33 A33 333333)Hšešff33̣3333?ffA33A33AB8BZB33yBBḄBB̶BBB33BBBBBBBffB̠BB33BpBPB33/B B33AA@ff&33C̬33Bffbššff̦š̸33R?33AB33A"BHB33kB̅BB̡B33B̶B33BBBBBB33B̶B33B̡BB̅B33kBHB"B33AffA(A(ff33"H33k̅š̡33̶33šš33̶z?33ABB33/BVB{BBBB33BBBBB33BBffB33B̦B33BBpB33KB"BA̘A@`l33š;ffb33ff̡33̿š3333̸̢šš¸@33A"B33B;BeB̅BB̥B33BBBBBB33BffBB̡B33BBZB33/BffBffA33 A`yffHpffš3333ffš33̶ffšffffvN"š@B33/B33BHBsBffBB33B̸B33B33BB33B33B̸B33BBffBsBHB33B33AQAQ3333Hšsffš33̸33333333̸33šffšsH3333QQAH@33B;B"BTBBB̥B̳B33BBBBBffB33BBB33kB;BBffA@ffš;33kš33ff33̳̥ššT"ff^ff^AA"BTB%@33BHBff,B_B33BffBffBffBffB33BBBffBBBBffhB5BA33Aff&@33C"V33šff33š33ff̡šp>33ffAA33BNBff~BB̦Bף0@"BTB5B33kBffB̡B33B33BBBB33B33B̡BffB33kB5B33AyAy33533kff̡3333šš3333̡ff33kš533yyA33A5B33kBffB̡B33B33BBAffB>BffvBffB̧BffBBffB33BB̶B̦B33BsB;BAyAfff33B33yšš33ffš33̥p833l?ABDB{B̕BB̸BBBBB33ABHBB33B33BBBBBB33B33BBHBB33A33Hš33333333šH3333ABHBB33B33BBBBBB33B33BA33BPB̅BB33B̿BBffB33BB̡BBZB33BffAff&@yH́ff̯3333ff̶̤ffffb"ffffQA33A>B{BB33BBBBB̸B̧BB33kBff,B̘ABZBḄB̶BBBBBffBBpB33/B33A@33C33Bšffš33333333š33Hffff^ff@A33)B33kB33BB̺BBBB33B̥BffB_BffBffA?33AffBffbB̏BB̺B33BBffB33B̠B̅B33KBffBQA533y33̯33̾ffvff23333ff^ABNB33B̡BBBBBB̧BB_B33B̘AfffffffA"B33kBB33B33BBB33B33BB33kB"BffAff"33kš33333333š33k"ffffA"B33kBB33B33BBB33B33BB33kB"BffAff"33kš̬A33)BsB33BffB33BBB̸ḄB33BHBA33 AQVffš3333̾33ffše3333̌@33A8BBB33B33BB33B33BBB8B33Ǎ@3333šeff33̾A33/B{BB33BBBB33B33BpB"B̘A`33;33̡3333ššešy@AHBffB̥B̺BB33B33BffB̏BZBB33CA(ffTffš33šffA5B́B̡B̸BBffB33BBffBPB33A@y3333k33ffff3333k33šy@33APBffBB33BffBB̸B̡B́B5BffAff5̸̡́šff33šA;B̅B̥BBBBffB̡BB33/BffA`Hš33š̶šffv"33@33ATB̏B33B33BBB̳B33B33kBBff^A(š_ššššš_ABBBB̾BBB̳BBeB B(Alffšsšffš̤33ff2ff̌@APB̏BB33BBB̯B33BVB33A33@̘ff,š̸̢̺̟33y"33AHBffB33B33BB33B33BffBHB33A33Hff33333333ffH3333AHBffB33B33BB33B33BffBHB33A33Hff33333333ffH3333AANBBB33BBB̥B́B33)BA(pšffš33ffbff33ffA8BffBB33BB33BffBB>BǍ33\š̺̠ffv3333ClA"Bff~BATBB̳BBBffBB33kBB@ff;3333̥š"ff^ff^A"BB̥B33BBB33BB;BffA33kšff̳šTATBB̳B33AZBB̶B33BBBBPB33Aff&33ffbff̸š33Hffff@B33kBB̺BffBB̯BffB>BffA33šs̡šff33šš5š(A33B{B̤B33BBA_BffBffB33BBBB5B33A33C"33š3333̡pffANBB33BBB̳B33BHBA33ffṿ3333̧šff(̘A;BffBBffBB33BAeBBBB33BBB33B33 A̬Hff3333ffff833QA33)B33B33B33B33B̸B33BVB33Ǎšṣ̣̾̾šš33AVB33B̸B33B33B33B33B33A33kB̡B33BB33B̡B33kB33A3333k̡3333̡33k3333A33kB̡B33BB33B̡B33kB33A3333k̡3333̡33k3333A33kB̡B33BB33B̡B33kB33AApB̤B33BB̺BffBTBffA33 ̅ff33̳šš5l33A>B33BBB33BffB́BB33@33\šš̡̾ffhšff&@B33yB̧BBB̸BB33KBffA4ffBffvB̧BB33B̶B33B;ByA33Bš33š33̥p33?B{BBBB33B̏B5Bff^A̘Hff33̣33kš`@33BBffBBB̳BffB33/B33CAffNB{BBB33B33BB"B@33ffb̸̡̿š>šyAHBB̺BB33BBZBffA(ff,ffšff̧šs33ff&@33B́B33BBB̯B̅B33Bff@3333k̤BB33BBB33BBBš3333šBB33BBB33BBBš3333šBB33BBB33BBBš33 B33B̯BB33B̧BnBA33)š̶š33šT33yADB33BBBBB8B33CAff_̢33̳šff̌33A33yBffBBBffB{BA`33ffš33B̅B33BB33B̡BZBffAyHff33̶ff"ff33A{B33BBB̧B33kB33A(5š̺̺šš5(33A33kB̧BBB33B{B33Aff"ff̶33ffBffBBB̾BffBDBff^Affe̦š33ffšsA5B̕BBB33BB"B̌@ff́š33̠Tš̘AVB̡BBB̯BBAff&̸̏ffšff2BB̶BBBB33/B@33š33šHff^A33kBBBB̥B_BffA33T̡33ffv(A;B33B33BB̳B̅BB`"̏ffff̏"`33BffB̸BB̸BffB33B33ff̸̸ff3333BffB̸BB̸BffB33B33ff̸̸ff3333BffB̸BB̸BffB33B33ff̸̸ff3333BffB̏B̺BB33B̅BffB53333ffv33ff^ANB̡BBB̧B_B̘Affešš̟H33CA{BB33B33BB33/Bff@ff̶ffffš?"B33BB33BBBffB{BAff^P̣š̢NšQAff~B33BBBBffBfff"ff33ffš33y33lATB̤BffB33B̡B33KB33CA33ff̏33š?&BBB"BB33BB33B33kBffAff33k3333š""BB33BB33B33kBffAff33k3333š""BB33BB33B33kBffAff33k3333š""BB33BB&BB̿BBBZBlÁ33̶ššQATB̦BBB33Bff,B?š̾ššš_33Aff~B̳BB33B33B33A4N̤šffff2`33B33BBBffB33)B33B33BḄBHB33 Aff3333še3333AB33BB33BB33A33e3333ff33 AHḄBB33B33B33)B33)3333̣H33 BffBB33B33BeBff,BffBffBBB5Bff&@"33š̡>ff33BB̿BB̤BHB@333333̧P(BffBBBBZBQA33̺ff33ffbšy33A̅B̸BB̯B33kBA33/BBBB33B"B`;̡33š@HB̥BB33B̏BB(Tš33ff^A_B33BBffB̅BA3333kš̶ššffAffvB̳BB̳BffvBffAff2B̟BB33BffB33BTš33̅š̘AsB̳BB33BnB33A33ffffšNšB̕B33BBBff,Bٿ8̡33334AZBffBB̸B33BAff33y5B̡BB33BffB33Ay33k333333kšy33AffB33BB̡B5B5̡š33ff33yA33kB33BB33B33kByA33ff33š̡š55B̡BB33BffB33Ay33k338ḄB33BB33B33A̸̬33šȞ33)BBB̾BffBA33s3333V33 33B33B33B33BffBBQeffffšešQBffB33B33B33B33B33 V33;B̥BBffBBffA33š"@TB33BB̳B33kBff^Aššff^A33kB̳BB33BTB@"š33ffABffBB̥B;B;̥ff>B̧BffB̶BsByAšff3333A{B̸BB̤B5Bff&Hšš33kšQ33BBB̿BffB33Aff̺́33̡ff,ff@PB33BB33BffbB(A33ffš33šBBBB̳BeB(Affšš33ffȀB33BB33B33A̘̺̟"33 A_B33BBffBHB?;̧š3333k33CBffBB33B̅BAff33šffDBffBBBVBff@ff2̥ff33ffh(B̟B33BffB33yByA 33š33šffA33BffB33B33B33A̿ff3333A33BBBffB33Blffv̸š̠"šAHB33BB33BHBH3333HHB33BB33BHBH3333HHB33BB33BHBH3333HHB33BB33BHBH3333HHB33KBBBB8Bff\̳ff̣&(AnB33B33BBByff~ššffA33B33BffB̏BA33̿ff̬33A̕BffBBBA33š̸p4"B̢BNBBB̥B33)B(pffš33ffffAffB33B33BBA33̺ffv33C"ḄBB33BTB?Ḩ33/33 A33kB33BBffBB̘̅33ffšABffBPB33BffB̡B33Bý33ffffff33ABB̸B33kB@5ššš5š@33kB̸BBB33Affffff33́šy33B̡BffB33BPBP33ff̡33šyÁB33BffBTB̳BBBBff33šff^"B̥BB33B;B33kffšABBffB33kB@;33̥"ff^AB33BBBffAš̳TTB̳BBBVB33B33B33BA33ff̸šěHBffB33BBB̬ff33šs33 8B33BḄB33B333333̾ššQ33)BBBB33)BQ̾33333333ḄBB33B8BZB̶BBB33A33ff33Hff@33kB̺BBffBffA33̡33š5(A{B33B33B̅ByA"̧̧"šyA̅B33B33B{B(A533̡33ffAffBB̺B33kBff@\B33BB̏B̬A33̢š33)lA̅BB33BsB@D333333AffBBffBBBffvš33šff^ff,BffBB̡B BffZfff?_B̸BffBBffA_BffBBB33A"š̡šABB̳BHBffv3333š(;BBB33BA33š3333/ff^A̅BBB33kB`@T̶̏ffB̥BB̥BBff̏ffbB̺BffB̅BQA5̯33B̡BB̧B33BffššHš@{B̿B33BsBff@P̶šffš"BBBB33A33ffff33ff,šyABB̸BZBff&33kšeBB33BB33 AH33ff3333)B33B33B33B33Ạ̣33A33B33B33B33)B33ff33H33 AB33BBeBe33š33 HB33BBffB33A33)3333ffhB33B̿BffvB̌@Ź33 33KB̶BBffBQA;šš33ff,BBBB̬Affššff33 B̥BB̟BA33̠̤šAffBBB33B̕33kB33B33B33kB33k333333k33kB33B33B33kB33k333333k33kB33B33B33kB33k333333k33kB33B33B33kB33k333333k33kB33B33B33kB33k333333knB33BB_B̌{šffP33 ABBBBBQ3333ff233ABBB"B̬ffš33ABB̤BffB̡̟33B̦BBffBA33ffš33pB33B̺BTB33 ̅ff̳š533A33BBffBB33̡šB̧BBBffA33)šš33CHB33BB{B`@e3333š_ff@BB̶BBBff^ff"AsB33B̸BHBQff33333333ABBB33A333333ffšQHB̸B33BsBs33̸HšQAffB33B33B33B33š3333B33B33BffBQAH̸33šssBffvBB̶B;B33š̥33BBB̏Bff^AHff3333k`@BB̳B33/Bff33̡B33BBB(AT33š_@̅BBB"Bšš"BB33yBBB33/B̬ffšff33)BBBff~B?sš533A33BB̟BA"ffff́`nB33BffB;B̡šffB̯BBBff@ffh33̸BABB{BB33B"B33̡ššyHB̺B33BZB(ff̧3333B33BB̅Bff@33k33̶š5ffAffBBffBffA5̶3333kff@̅BB33B33B33̧ff(ZB33B̺Bff~BffB̯BB̧šeBB̶Bff2B̕šy33KBBBNBl̟ff33/BB33BffhBšš33BBBBfff?{š33šA̦BB33BBB33BB33šBB33BB33šBB33BB33šBB33BB33šBB33BB33šBB33BB́BBB33A3333ff33kš@ffBffB̡BffA5̸33PšyABBByAP33̸š5ffA̡BffBffB@33kff333333ABB́B́šš3333B33BffB33kB33BB̧BA33)̶33TšyA33BBB33CA_33̳ff33AffBB{B`ff̣š5BffB33BHB̘̏33 33kBBB33Bšp@ffBB̟BffABBB̤BA8̺ffš;ffẠBB̅Bfff?3333̥5BBB>B̢33šٿ́BB̦B33Aff2ffšB̬A̡BBffBff&@̧š33/B̸B33BDBff̠̅BB̡BffAH33̶"33A33BB33kB(š(33kBB33B33A"̶33HffA̡BB̅B̡̅ffHB33B̶B"B3333š33k(ABBB(A33kš33B33BB33AV33ff33B33B̾BHB̬̣33š̌@ffBB33BQAe333333)B̸BB8B33šs33 AffBBffB33 Asš338BB̸B33)B3333ffBBffBff^Aešff5BB33B"Bffš33T̘A̡BBBff̏š33 ffvBB̥BAH33̳33B33B33BBB̧p(ABBffB`@33̟BBB(Asš̤ffPB33B̯B33Aff,̸̺"šB33B̿BHBff̧š33kšQAffBffB̅Bff&ffšš{B33B̡BAZff33335BB̶B33B33š33>BBB@šff^33kBB̥BffAT33;B33B̳BB"ffff"B̳B33B;B33TffḀBB33kBff^š@BBBš33BBB`@33́̕B33BffB(A33yššff^nBB̢B33Affbff̦ffVBBBA33K33>B33BffB33Aff233š&B̺BffBB3333" BffBBffBffffffBBffBffffffBBffBffffffBBffBffffffBBffBffffffBBffBffffffBBBB`ffš@B33Bff~B(ššsff^A̠BBffhB33̤ff\ffABBPBff33DA̯B33B8B3333ff,BB̺BB̸33"BffB̏BB̅B33ffvff^A̡BB_BffHAB33B33/B̶ff"BB̳B33A;3333šTBB̥B33A33kš(BBB`@`@BBBB́B(šffbffAB33B>B33̺33"BB33B33AHff̧š33kB33BffB@̅ffff&@BffB{BQ̡šZffA33B̿B5B̶̸33ff,B33B̯B33BB{Bff^̣šNA33BBffB"33š33TBffB̡B33CȀš?B33BffvBy̥HšA̳B̺BB33)33šZBB̟B(A33ff`@BBpBffB33BsB33338B̸B33BAH33̣šQBBffB̌3333še̬A33B̾B33)B33ff33VBBB33 A333333 ABBVB33ff3333)B̾B33B̬ABB33kBff3333""B33B33BffA33kšBB33kBff3333""B33B33BffA33kšBB33kBff3333""B33B33BffA33kšBB33kBff̕BBffbBff̺ š;BffḄB4A̅33šQḀBB5B̯ffhBBffBٿ\33ABffBBB33̡šffBBBļ33/33B33BBffAnBBZB33̶šTBB33B?šš_33A̳B33B33ANff`33BBeB33ffffHBffBBff@̏3333kAB̺BBBš̟ffBBpBffBBPB33̸33ff33kBffBffB̡ffš533B33BByÁ́šyAB33B33B5ff̡šffBffB33kBff33̸33PBBBšP33A̸B33BffA33kff     LMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./0123456789:;<=>?@ABCDExyz{|}~     @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq      !"#$%&'()*+,-./0123456789lmnopqrstuvwxyz{|}~456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde                           ! " # $ % & ' ( ) * + , - ` 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                           ! 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                 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  !"#$%&'()*+,-./0123456789:;<=>?@Atuvwxyz{|}~ <=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm      !"#$%&'()*+,-./012345hijklmnopqrstuvwxyz{|}~0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a      !"#$%&'()\]^_`abcdefghijklmnopqrstuvwxyz{|}~$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU     PQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHI|}~     DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu   !"#$%&'()*+,-./0123456789:;<=pqrstuvwxyz{|}~89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi      !"#$%&'()*+,-./01defghijklmnopqrstuvwxyz{|}~,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]      !"#$%XYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ     LMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./0123456789:;<=>?@ABCDExyz{|}~     @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq                   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x y z { | } ~  !!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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""" " " " " """"""""""""""""""" "!"""#"$"%"&"'"(")"*"+","-"`"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###################################################################$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$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%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&& & & & & &&&&&&&&&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&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'''''''''''''''' '!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2'3'4'5'6'7'8'9':';'<'='>'?'@'A'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([(\(](^(_(`(a(b(c(d(e(f(g(h(i(j(k(l(m((((((((((((((((((((((((((((((((((((((((((((((((((())))) ) ) ) ) ))))))))))))))))))) )!)")#)$)%)&)')()))*)+),)-).)/)0)1)2)3)4)5)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***************************************************0}}fG0}}O 1}}f7q2L#Շ5xw95G6!6e8qɉ8G1- :! :} :q2Y!:x.!:7.!!:7":7"9wOM#97d%8~~7(8||xy)9yy!ݎ*9~~A+:j,8 -8m.8Eѐ.8508||08B08Ua08{{bŒ06zz'?)06||06}}sy05b@U25'24D24AB34wwH34uu6lI44 44544u34hٗ244h=24@12c1/@i0/=h͙0q0g71q71x#4x#I5O6x6xu8ٰ8Gl=:x :x :xli :7.Ͳ :71!:7"97"9~~7]"87%87?%(8x)8!*9Q+9,8t-8EO}.88H.8s!E-8H-8H -8q-8uuDչ-6rrd9-6qq'h-5rrb{-5vv{e15||Iɻ24D-2434qqB35tt?Y45 l45?!45?354354M354@234F20{y10/7&/-0!17u4wY47O5x!5x7x7x?M777x9xy 9x2 9}}7A!9zzx!9zz7 "8zzOm"7}}w$775'7(7G?)8a*9+8O),8E!-88.8U+8!+8t+8xxD+8ppH+6jj'I+5hhl+5jjDd+5oo/lu14vvj14'l=14pH24||+35 i35d35d145l35354]354h234%2211./&=/03!i474O14xB6x16x1]667[%878x8uu7$Q 8uu@ 7ss7?!7tt1}!6yy7$6E&6w(6 )7)q*7d+89,8!-8-8!e+8Ut+88-+8'+8mm+5iitY+5iij+5kk! +4kkp 04ooe? 14}} M 13p 13m 26?y 36[ 36~A 36 36h 36m 264 24451313]-&"-uM#.O#/$077y$1O$37!A%4O%3xB &3xBm&41&4x5'4'4i'6yy7ia(6rry( 4||7))!47l)!3O)#3U*&3*'3B+(4+)4+*5I,+5eO,,5-,5tu-,5DH-,5U=.,51.,5yyjH/,3eei/,3``I!/,2kkMB10,2uu002ww B001pB]101Rl1111%214224224?Q334324r414~{}414h414E504h5/4] 6,wBI,}]J.J.O%K/7K0K37#QL3!L2x1M2G?}M3GM3GEN3x?N3x2 O5qO5{{O 3vv9P 3zzlP 2xQ#1xBeQ&1GQ'2L-R(3\R)3kBR*3OYS+3S,3v!!T,3vtT-3vT-3vMU-3I1U-3}}?V-2jjHyV-2hhV-2uuOAW-2W/1 X01DmX01RBX105Y13mY23mlY23?aZ23EZ03r{)[03y[03[/3rU\/4\.4r]+ q+u&mq,q-5r/!r/x#r0!as0x!s1x)t17Ot1qt1gUu2?u2Gv2v27v2xIw2xw 1?x!1qOux%1fOx&1g=y'2Ly(2z)1Oiz*1Hz+1fO1{,1{/1!{/1]|/1vH|/1ww%}/2xx^B}/2~~}/2zQ~/1~/1y/1y}0000E13H13md 23m?q23mՁ/3 9/3~{/3r.3%e.4rYɃ-4-+u+:},F,wE.wG/wO 0q0w՚17191xO1ft1<He2k!ɜ2g-2x2H2OY1x1G?!0#0%1eOM%1%2q&0By&0qݡ'0hA'0e?.0e -0Om.0!ѣ.0{{^O5/2O02O32Ha31ť/1)/0/0/0U/2p?/2p/2h/2m302~3I02 ]02F/25u/3~٪.3mY=,),#<,:,wU-w-7&.u!.O/x!I/g1<0Ou0H0!=/L!/x/G!i/LH/B1/:H"/KH"/H]"/L#0!%&/k'/'/LQ'/./f./!}////OE0/O1/< 3/Oq40/019/1/1D/2phe/1h/1D-/1/1b/1Y/1/1 !.1.0 _-1AM,9,#,,wTe-7--.w.7O/x#Y.g0!!0!/H/<M/g#/O.qOy.g.HA.H /;  /1m!/fH#/LH5&/1(/f?)/f]a)/eh./f)//70/1/U1/#2/4/40t/0I/0/1/1pdu/1d/1=/1b/1p.1Ci.1p_.11-1-0EY,0],u:I , ,,wu,7,=-7!-x#.x#i.G.qH1-!/L.O].L.q%,k,q1,qBQ,f++1}!+#+L1E&-L(-f *-q*-^/-^d9/-1-!2-Be3,3,-5-4-d/-Y/./.b?!/./.p/.DM/.p//D./y-/C-/DA,/Y,0U +0Em -#Y4-4-w!5-w5-&5-wM6.q6.}O7.q!y7.7-qOA8-q!8.Lt 9.qBm9.q9.g!5:,fH:+:+Ga;+G1;+L)<*f<!*<#*LtU=&,Lt=(,>*,?>*,n>.,nI?/,?2,@3,u@4,nl@3,d=A4,A3,B/,ndiB/-B/-l1C/-hC/-^C/.Dc]D/.pD/.D%E..E-/DE-/pQF,/DF,/G+0}G+i[+w&[+>1\+7G\-7G\-x]].O].gO%^-gB^-O^.eBQ_-_-O`,}`,H`,!Ea,>a,fO b,L!qb+qb +H9c *Hc!*xd#*kHed&,gtd(,-e),fBe),de,,Yf.,f1,]!g3,g4,?g3,Mh3,?h2,nli/,^yi/+^?i/+b3Aj/+zj/,b k/-mk/-pk/.D5l..pl./l./Dam-/Dm-/Y)n,0pYn,wy,wL݂,7A,7 .7  .xm /gGф/L5..J/ha.ņ.).:B-d-gOU-LO-q-G,x"+xtI"*q"*#*qu&+ً'+!='+'+J++^i-+3͍0+e13+f33,2,]2+0+%/+^/*^/*Q/*3/,F/,bc}/,/-E/.pY/.pY //pq./DՔ./D9-/,7,,wQ,x .!.x} .qB.E/f/g] /fq/cխ/n9//.T.Oe/qɯ.O-.-H#,qY#+q#+G!#*q2&+g&+gM&+&+fB)+y,+ݴ0+fA2+f33+3 1+m1+Ѷ/*5/*/*^/)za/)Ÿ/+?)/+z/,m]/-pU0.%0.0/////I./Y.7,w.7a.x#.)%.>%.G$/gU$0L$0q$0LF#00I 0J /!1<u"2O"1q=#1#0G!!/gi",x"+G1"+q$+g%+]%+g%+d%++f,+f.+fQ/+0+1+}3-4*E1,1) 1)zdq1(d1*8<91+81,z1,e/-m/.b-./p%./--Y--/x<.x /Tq0#0x>9%0q%1q%2qe%3L&$4L-$4<T$6!5;Y!4"37!"4q"5"5G!M#4qw#3!2Oy!1}O"0GA"0q%.}B &.LBm&-g'-f5,,,+.*a/)e0.:)1.4/]4.^U1/1.J1.z1.1/:I1/1-81.u/-/-= ..mY .. --i -- /T0G0T0GJ#1L>I %1G %2&!%3}u!%4L!&4f="&7<"&7^#$6Ki#$5;#$571$#5n!$#77$#7x!]%"6gw%"6gw%& 3x!& 2!&!0GQ'#07'&0xd('/x}((/g()-E),-),+ *.)q*/)*0.9+1/fT+4/,4/Te,1/,1/:--1.z:-1.z-1/Y.1/.1.s!/1.F//.//._M0..mY0..p1-.Dy1-.11E1L--F1F1JF#2YG&2G&4!H&4H'5kH'5&MI'8k&I'8J'8<yJ&7TJ&7dAK%6K>K$8< L$8qmL#7f}L#6!5M 4qOM 3gM"2aN#17N'1w3)O)/7]O+0qO+/>UP,-:P-,Q/+Q0+Q1/IR21R5/;S5/uS2/S2/-=T2.T2.U20iU208KU2/z1V2/V//z5V/0C_]W.0DYW.0p%X-/pX-/CX2l2K=m3Lm3)n&3&in'4\&n(5f&1o(5&o)6>o*7B]p*9Gp*:Ld%q):Tq)9q(9Qr(9Jr':s&9}s&9>s$8Et!5gt!4} u#4?qu%4xu)3x9v*3Fv,1Gw,1gTew-0Tw-.F-x/-Kx0-;x10Yy22y50!z60z20z20;M{2/z{2/zK|21y|21|20A}20}/1_ ~/1mm~.1p~.15-1-1C44M4<5&5Gy'5ݕ(7A)7J*8 +8m,;&ї,<5*<*<q)<a)<ř)<n)(<n(;';U%8d$7}d%6G&6)5GI+6GT,6},3gu.2ٞ.1;=0011^22i34z͠641643232s]3232K%33z33z33KQ33/2b/2}.3.3CE-3-3 55]6 6<%&7(7>)8JGQ*8&+9,:}-=>.>E)>)>;: *>nq*>*?<<9*?+>*=e';g&:<-&9'9x:*8}]Y*8}+9!+85.7.4_M0514826ny36^8668A66348 348m3434S5343434a35D/3)/3.4 .4bU-4-46K 7/m7S 765&8(8>)9Ga*:G+:)-;.>.?LU)?)?*@^*@J+BfI,B,A-@>:u)=)==)<7*<*<}Ti*<q+<1,<.;/9]0918%2839n68^Q78b838838}36s36SE3636S 35q35s/6D9/6.7p.7Ce-5M-5Y-7S !7} #8E '8SE (8/ *9'< ,:q -: -;9 ,< *?& )@qe +@ +@J-+Ad+A<+CY+C+C!+B-?->!M->--=7->7-y->x.>A.>_/=f /<Ym0:e0;51:1:298a29^39b8)3939E37U36+3663636+16bSI07.7b,7bu*5p*6C=9z-)0!90"9E0&9 U1)9/1+:2,=2-=72-=GI3,=G3+@&4*@&u4+Aq>4+B=5+D5+Dn6+EJi6+E:6+Eg17+D}7.D7.C}-]8.E}8.D}K%9.BOK9.B9.BgQ:.Bf:/Bg;/Bf};0A;0AE<1Ab8<1A^8 =2A8q=2@=3@9>3>n>3>?3>e?3<?3<R-@3;R@3:@18D/YA08A.7S!B,78B*9bB*9DMC 9S9W"9gW#9+X%9+eX*:/X+;-Y,>Y-?Y->GYZ,>Z+A![+Aq[,BL[,CJM\,D:\,D],Fy],E],EA^,Eg-^.D} _.Dm_.E;_.E};5`.E}`.Eg_`.Egaa.Dfa/Cg)b/Cb0Db0C8Uc1B8c1Bd2B^d2Bd3AIe3Ae3@f3@uf3>bf3<(=g3;g3;'h19Dih/8h.7m-1i,7si+9i+9p]j!8I~"8~#8$9 u+;',<=,?J-@-@<i,@&́,CJ1,Cq,Cq,CG],Dg,Dg%,Fg,F,FQ,ET/E/E;}/GO;/FxE/J&/I> /Hq/GՈ/Ff9/E0F0E8e1DɊ1D-2D2D^2DnY2D2D!2Ce2?2?p M2<b'2;0:y/:Dݏ.9pA,9K,9s ,98m"77Y#7/#8'>!$9M,;-=M-@,AJ>,B<y-BTݨ-DA-Dq-DGT -Dxm-EgJѪ-E&5-Gg-G3-Ga-F7Ŭ/F7;)/F7;/H#;/HwU/L/K/J>/I/HI/G0F0Eu1D4ٱ1D=2E2E2Di2Eͳ2E12EeA2@2? ]2='2<b%0;m/:J.:DQ-:,9mK-9Us}#6/i$6/7$7&1&8-:>.<]-?J&,@<:%,B<-B.DQ.D-Dq-EGK}-Fg-FE-F}-F} -Gxq-Hw0H7590Hw0J#0J7e0L&0K-0Kf0J/JY/I0H!0G1E41EM2E2E1Ey1E1DA1D1@C 1@ m1@1?I50</;.;ma-:D-;/).;p%5y&5I'6'A(7'B.8I> .:<>m-=<,>5,@<;-@5.Ca/D.EG).E}-.Gg.G}U.GG3.G.H7.I0I#;I0Iu0KwY0L!u0Lx0K}=0L0Kf/Li/K0J10I1G1G]2F2F%1E1Ee1DeQ1C1Ae`1A*}1@1@bIE0=/< .;q-;-;M9.;CU&5'5'w(5IOQ+506/8B}-:,;>>E,=>->>< /ATq0C}.D7-9.FG.H .H}e .G}3 .Hx-!.I!]!.I!0Ju5Y"0JY"0M7!#0M#0MO#0LGM$0Mg$0M%/Ny%/Mn%0NA&0ME&1J '1J~m'2IA'2Hn5(1G(1F(1Dea)1Df)1C)*1C**1A *1@U+/?D+/?D,.<p,-<D,.<pbI-/<-(5A)5OA)5aB*5wB+5)C+6wC,8C,9&UD-<ggD-=&E.@JE.BGE-D/IF-FwF-GwG-HwuG-Hw3G-Hw=H-H#H-J#5I/Ju_iI/K#I/K#1J/N7J/M7J/M}]K/MK/M%L-ML-ML.NQM/Nz8M0MEN0ME}N1KN1JEO1HO1Ge P1EeqP1DvP1C\*9Q1C*Q1A*R1AbeR3@pR2? -S2<DpS1<CS0>CAYT/>pT(2h)3> i)4Oqi*6i+8<9j+9>wj,9&k,9ek-;k-<}-l.=l.?Ol-A/Ym-Cwm-E!n-Ew:n-H#n-H#Mo-Huo-JYp/Kuyp/Lup/MAq/Nq/M7 r/Jmr/Gr/JY5s-Nns.Ns.Gat/D8t0N8)u0LEu1JEu1KUv1MAv1L(w1Fw1Bb(w1EIx1C`x1@*y1?Muy2@py2?pR=z2<z1<{0Cp i{/Bp{(0-F)1)33*5+6I+7O,8B,8&Ou-:ْ-;L=.=!<.?-AOi-Cw͔-DS1-EuK-Hu;-Hu]-Hu-J%0K0L0MQ0N0K70K&}0K0PE/Wn/Y /Vnq/R՛0O90M1H81Fnse1Gɝ1H-1F1B1DY1A^1?!1?62@62@pAM1=D+1;C0=pEy0=ݢ(//Fɶ)0F-)1n*2J+4?Y+5>},7B!!,7x-:B&-:}M.<7.>K.@O8y.B8ݻ.CuA.D.Iu .Ium.Jѽ.Lu50M#0N0Nua0Oſ0K)0N0T0_U0i0mn0l^0k0`bI0Yn1O1H8u1H1G =1EA1@eA1C i1?^1<11<E1=1>DE]1>DE1=%08DE09m)/n*/n=*0:+1+2>i+3B,51,6-8!-9O].;.=!K%.?.A.Bw8Q.Cu.Hu.J#8}.Ku.ME1Pu1OX 1Qq1O#1L91Q1^1me1zn1-1b11{^Y1r0e!0Y81TE1MM1GU1BU1Dy1@1<D8A1;80; 0<Dm0=p0;ps51:C19p8)13*1M*0?+0+1>By+2},4BA,5w&-7#d -8m.9!.;;5 /=O8 /? /A!Ea /D8 /I8) /L# /NX /PU 1RX 1R 1S 1Q# 1OxI1V1f1wnu22=2^21^i10{10p1i81_E]1Us1NE%1KE1E81?8Q1;p/9b/9}08b08mE16b17D )63+*4J>],*3,+1%-+1-+27B-,3!Q.,4!B.-6/-7}/.8O/.:7;E0/<#z0/>O 1/@uq1/BXs1/JuE92/M#82/OX83/Re32Tu832T#-42S#42Rw42Q7Y52ZgY52l!626463M7372818y81b80A90918 :1x8m:1n:1f85;1]p8;1V;1Ma<1De</>D)=/;=/;=07U>15p>24?)<< S);<mS*8S+5>5T+4T+4OHT,5}aU,6!7U-7&)V-8#V.9V.;!UW/=O-W/?OX/AX/C#X/JuIY/MUY/PSZ/SXSuZ2WKZ2Uu=[2U#[2S#\2S!i\2]B\2n1]2]48]4]^38^2z8%_1z8_18_08Q`0D`1a18}a3p8a18Eb3z8b1r c3fDqc1Xc0P9d/IpYd1FDYe0CYee3?e2=-f)@dz'=<}z*:<z*7E{+5B{,5 |,5!q|,6|,79},7u},9~,;e~/=#~/?#-0@0B1JRY1MR2R!2V/1W1X#;M1W#s1Tw1S7Ey1^8݃1pEA1s2E 2Em2Eх2zE52s2s2a2Ň3U8)3b8483U434y3j4`eI2X^Y2R1Ou3Nٌ3K='BB)(A(@>*>BU+<,:B,8>,7!d,6uI,6,7!,8u/;<٥0>=0A1ER1Ii2MXͧ2R'12U1W1X#]1Z1[w+%1T1Xd+1gQ1|+2A2}2A2 E22s 2q2Rծ4b894C4p48e4Dɰ4D-444tY3hY2]!2XY3X4YM'C9(B>B(A+?Be,=B-;--:B-9O-7Y-7!d-7!!-8#0:<0=<M0@1D'1HX'y2LM2QIA3TI1V 1W#m1Y#1Z!51U1W1e] a1y2R)2R2R26U282s 2p2D4CI4e4E4Eu484b=4D44i4u3i13c3`4`](EI)EB)C&+A&Bu,?B-==-<-;Od-8i-8u>-7#1-8uf0:X1=]1?1CI%2G3J3NQ3Re2TX2We}2Y#2Y7E2W2XI 2bq2sI2'92 2D2`e282A-225Y5m5b !5Ds5p5b8M5E55y43xDA3s4k8 5im+IY+H)FB!,D}-Bd.@M.?.>!.:#y.9u.9uA.9f1:# 1<um1>2@u\53Eu\3Iu\3La4Ou\2R#)2U\2Ww2W!U2Xe2X 2^ 2p 2I!2I!2M"28 u"28 "2(=#2#2R$5mAi$5$5m1%5%5U%5D]&5s&5E%'5p'5'4EQ(4}(4u)6pD4})+N3i=,M=*L1>,Jd>-H>.F]?.Dt?.C!%@.?#d@.> >@.=QA.=!A1=B2>}B2@uLB3?uLEC3C)C4Ek D4K#LqD4ND3Q#9E3RE3VLF3VeF3ZF3V-G3[G3lvG2~;jYH2zH2 !I28II28`I2s'MJ2U`J2b K6RyK6RK6D AL6p L6p M6mM6M6U5N6N5mN4DaO4DO5D)P6{DP+Qyd,Pd,OAe-Me.K f/Imf/GOf/G5g/Bu>g/A fg/@#&ah/?#gh2?u)i2?#Li2ALi3@uLUj3Buj4Ek4KLk5M#Lk3PIl3ROl3U7m3Uum3Y>m3U=n3Z\n3io2|\io2zo21p2jp2p2U ]q2Iq2+M%r6ppr6m r6p Qs6Ds6DDt6D }t6Rt6Eu6DRu6 v5 qv5pCv5p9w6w-S,Rd-QddQ.OB/M/Kt}/J!/I!E/E!&/Dg /Bq/AՏ2@#92A3A#L3@qe4Aɑ4C#G-5I#q5M#L3OLY3RL3UL!3UL3WL3RM3Xk3j2}y2\ݖ2;A2z\2Uj 2m2Mј2b56m6 6pIa6IŚ6)66 6U6M6555I7&V)T>-SBJa/Pų/Od)/L/L/J!&U/HO/F!/EG/B#G2B GI2A#G3CG3A#Gu4Cqٸ4D#G=4Jq5Muq2Oqi2Qqͺ2Tq12UBq2Uq2Qq]2Wn2jL%2~z2L2bQ2^22}2b-2DE7p7p 7Cq7j7Dj97v7v7e77-7M77Y7'X<(W +W&q.UH>.TH9.RO>.R&.POge.M.KO-.KOG.H!G1HxY1G#2Hx!2F#x3G3G#xM4J4N#x2Rxy2UB2UGA2V>2X3 2Um2Zn2kq54{zq4q4qa44<)4D4D4CU7D77\7\7DI7p7D7vu6v6=6 66i6v(Yd )X; +XB3 -V .UHI .T& .S .R&u .N! .MO= .LG .KO 0Ji 0J 1J1 1I!x 2G!x 2H!x] 3Lx 3OOx% 3R 3Sx 3VQ 3T3 3Xx 3UG} 3YT 3kKE 6{x 6x 6sq 6s 6<9 6'< 6 6De 7C 7p<- 7m 7 7DfY 7D\ 7^v! 7D 6  6M 6 6 6vCy 6 *\G:' *[-( +[( ,YG( -XY) -W1) -VB}!* -V&* -S* -RM+ -QO}+ -O!, /Oy, 0O, 0OA- 0M!x- 1JOG . 1Jxm. 2Mx. 2PG5/ 3SBx/ 3V/ 3Vdxa0 3T0 3W3)1 3Vn1 3Zn1 3k^xU2 6y2 6x3 63 6q3 6gI4 64 6Dq5 6gu5 8Df5 8=6 8p6 8p^7 8i7 87 8Dv18 8e8 6'8 6p]9 6 9 6v%: 6vA: 6: -\N -\O=O -[O .ZP .YiP .Y&P .XHG1Q .XQ .UGQ .TG]R .SR .R%S /RS 0RS 0R#7QT 0P!GT 1LOxU 1KG}U 2OxU 2RBqEV 4TV 4Wdq W 4WqW 4WxW 4V9X 4UxX 4\Y 4j^xeY 4yKY 4x-Z 4xZ 4xZ 4pY[ 4mq[ 4pL!\ 4L\ 8Mf\ 8M] 8M] 8^ 8Dy^ 8Db^ 8A_ 8R_ 7R ` 7m` 7E` 7v5a 7Ea 7Ea 1\&u 0\Mv 1[<v 1[tw /Zyw /Y#w /Y&Ax /YGx /W} y /Vmy /U1y /U5z 0T7z 0U!z 1U7a{ 1S!7{ 2OOx)| 2Ox| 3Qx| 3S}U} 4UG} 4X~ 4YG~ 4X~ 4U:I 4U 4\J 4hxu 4u^ـ 4|6= 4 4G 4Di 4Mx͂ 4Cq1 4Dq 9DL 9M] 9K 9K% 9z 9Ds 9EQ 9es 9  9v } 9~e 9E 9 9 6[ 6[] 4[O 5Z!&% 1ZG 1Y 1YQ 1Y 1X!G 1X} 1W 1VE 1VO7 1WO7 2W!7q 2Xxբ 3QO79 3Qx 4Sx 4Uxe 5X}Gɤ 5X- 5Ygq 5X 5WY 5UG 5Y! 5e 6n 6ubM 6~ 6Dq 6py 6ݩ 6DA 6DG 9q 9fm 9ѫ 9jS5 9S 9 96a 9~vAŭ ;xv+) ;rv ;l ;oU ; ; :[ :[m 9[G 9[.G5 2Z 2ZB 2ZGa 2ZH& 2Y&) 2Y 2XG 2X.U 2Xt 2Y 3Yt7 3Yt7 4SxI 4Tx 4Ux 5Xu 5Yq 5Zg= 7Z> 5Yf) 7YfLi 5U) 7Xq1 5_G :dbx 8jx] :sx 8yb% :zp 8zM :Q :x 9 9e} 9v 9E 9v 9e 9}vRq 9yv <s 9 <nR <i <o4e <4 <- >[ =Z!} <ZG 9ZE 9ZG 7Z 6Yq 6Y 5Zl9 4Yi& 3Yi 3XNGe 5XNG 6YP- 6ZP 6Z1 7V1xY 8Vx 8X! 8Y 9Z 9ZM ;Z) :Z <[y ;W =W^A <\ =^G ;bqm <jmx :qpx5 ;tx 9tx :xxa :}v7 8 ) ; x =q >qU >v\ =v\ ;} :z =z MI =x( =t =|u = == @Z}) ?Z =Zu ;ZGU 9Z} 7Z& 7Z 6Z> ,5XI ,5X2 4X 4YPu 6YL 6ZH= 6Z 7Z1 7Zi 8ZL 8Z1 .9[ .;] .;^)] ;\ <\\% <Ye =W) =W^kQ =Xb =Zbx =]} <`x <`DxE ;gx ;j7  :pxq :r x ;xk79 <7 =k! = Ge! =vG! = )-" <" ; " >vY# >M# > !$ >R$ >$ >AM% BZg99 AZg9 ?Z &: =Z e: :Z&: 7Z>-; 7ZH; 7Z.>; 6X.Y< 6X>< 5X>!= 5Y.= 7Yo= 7Z.M> 7Z.g> 8Z? 8Z>y? 9Z? 9\<A@ 9]@ .<] A <^mA <\A =\f5B =]fB >[<B >[e\aC ?Y)C >Zp))D >\bkD =_bqD =^DUE <aE <exF ;kxF ;nxF >u IG >G > xH =uH = H > =I > I ?)J ?\iJ ?J ?1K ?jK ?MK ?']L F\I` B\&` C\!&a ?\gua ;\!&a 8\.=b 8\b 8\c 7Ztic 7Zc 7ZPd1d 7[<d 8[2d 8\J]e 8\1Je 9\%f 9\Hf :\f :]Qg <]Bg =]h >^g}h >^kh >\qEi ?_'i ?]e' j @\qj @[^jj ?Z9k ?[Djk >]D l >\Del =]Cl =b-m <em >im AqYn @}xn >vx!o = o =vo >Mp @xp ALq @\yq @q @Ar @r @ s @ms H[!gY F[g F[&! B[H& ;[ :[M :[ :[] ;Zy ;Z:݊ ;ZJA ;[ ;[ ;\|m ;\2ь <\15 .<] =] =];a =^;Ŏ ?^};) A^g B^ B^U C^e C^S C] D[ B\MI B[D A\C A[Cu @^pٓ @bC)= ?d) ?g Boi Az͕ ?1 > >7 ?x] AG Bg% B` B` BQ BL B\ B} J[!Li I[ͮ G[&1 E[g =[ ;[] ;[ ;[1% <ZP <Z =ZQ =[ <[N <\} <\P =\1E .=] >^ >^Yq ?^}յ B^B9 C_q C^f D^e D^ɷ E^8- E^s E\+ C^Y C]RR B^RM! B^p0 Ab( AcpM @cC) @e) Bly Axݼ AA @x @x Axm A`GѾ B`}5 Cg Cg Cga Cq Cq) C MZ!&y LZ!& HZgA FZH >ZG <Z.gm <Z.d =Z5 >Z >Z2 ?Za ?[ =[) >\P >\1 ?]U ?^ @^ @^} @_} D^I D_f D^f E^fu E] F]= F^p8 F_pE D_Ei D`m CaR1 CbC Be`j BeC0] Aa( Ab% Ah) Bt* C{Q D} Dx C} Bx B`GE DG DG DGq Dx Dx9 Dx NZ LZOg IZOQ GZ >ZO <Zg} =Z =ZoE >Zo ?Z @Zq @[ >[P9 >\ >\ ?]8e @^B8 @`B- @^} A_} D^}Y D_f E^f! E^e F^ F_M G`b Gab8 Da8y Da DaC6A Cd' ChI Bg*m Bc* Bb5 Aj Bv) D|`qa E` E) Dx Bx AU E7 Ex Ex Ex ExI E K[O# JZ># I[Oa$ HZt$ G[G)% EZ% E[.>% DZ.nU& D[.& CZt:' C[n' C[1' A\PKI( A\( A]) A]u) A^) A^}=* A^* A^}+ C^g8i+ D^f+ E^v1, E\\, F`e, Fa]- Ga - Gbp%. IbR8. Has. Ha`Q/ Gb// Gk0 Fj}0 Fe'0 FdE1 Gk`1 Hx 2 H}`)q2 G2 G`k93 FG3 F4 Fqe4 Gq4 G-5 Gx5 Gx5 GwY6 G76 K]O:J J\O K J]t>qK F\K G]9L E\L D]M D\t:eM C^tM C]:-N C^:N B]PN B^1-YO B]O B^E!P B]HP B]}P B]}MQ B^ Q D\gR D\fsyR E[8R E]fAS F^vS F`e T G_DmT G`CT Gbp5U IcC8U HdU Hd`saV HdV Gk)W GhW FeW GfUX InX Ix^Y HY HkY G`kIZ GZ F[ Fu[ Gq[ G=\ Gq\ Gx] Gxi] G7] M]q K]!<r J]Odr G]r G]Is G]ts F]tt F]tut E^tnt E^J=u D^Ju D^1Jv D^1iv D^v D^1K1w D^Bw D\w D^}]x D_G6x D^g%y E[+y F[esy F\eQz G^z G_D{ H]p}{ H]b{ I_E| J`C| Jb } Jcq} Ie} Hi9~ Hg~ He Gg8e Jnz Jy- I- I H\Y H Gk! G G GM G Gx Gxy G݄ M]!<ɘ J]!d- I]!< H]! H]OY G] F]! F].J E] E]H<M D]< D]H E]y E]ݝ E]A E]B E^` E_} m Ea џ F`5 F]f/ G\e G[a G[DEš H[p8) I[8 I\ I\U K_C Jc Jf Ig IgI Hg Hh Hlu Ks٦ K|8= J8 J' Ii I\ͨ H1 H G G] G Gx% G G M^!dٿ K^= J^! J^O I^i I^Og I^1 H^O> G^t< G^t] G^t F^.% H^t H^' .H^'Q .H^} H^}I H`I} HaqI H`fIE G]M GZ GYD6q HXS IXpE9 I[ps I_8 Jb(8e Ke(8 Ki- Kl8 Jk JlY Il Io! Hr Ly8 M8M L L Ky K) JA J H HLm H Hq5 H Hx M^O K^tM J^H J^g K^y K^ J^OgA .J^!g .I^ I^.m H^ H^\5 I^ I^ I^<a I^} .I]) .I_ge I` I_U G\ HZ HX IXD IYDI J` JgC+ JnCu Ls(E Ks= Ksr Kqr Jo8i Ip Ir81 Kv Nz8 N] M8 ME% L Ln KQ Kq H H} Hx HE Hq Hq M_Hd J_B] J_B I_G% L_1G M_G .L_Q L_!G K_! K_!L} J_ J_!E I_O I_  I_q I_< I^G>9 I_gg I`fk I^ke H[ JY0- JZDj KZDC K_DRY Lh  LrM'! Mz N{ N{UM Mz MvE Lqy LrU LtrEA KwE Ozs  O~Em N N95 M M8 La Ln H) HG Hg HkU Hk H! O_H 5 M_Bm5 L_5 L_G56 N_O}6 N_OG6 M_OGa7 M_O7 L^!)8 L^O8 K^OL8 K^U9 J^OL9 J^!: J^w: J_xf: Ja}gI; Jaq; JaG< J^u< H[k< H[== I\j= I_M'> JkMi> Ls0> M}1? M0? N? N}']@ N{@ Mx'%A Msr'A LsRA LxQB K{B N~+C N}C OC M8ED ND L E MqE KE HK9F GF HLG GfeG HG Gk-H R_O\ Q_}\ P_H\ M_qE] N_O] N_Oq ^ N_!7q^ N_^ N^!x9_ N^G_ N^!G` N^!e` K^!` K^wL-a K^!La J_xGa JcqYb Icfxb Iaq!c G]c JZqc J\Md J_Dd JaM\e Jtye Kye K)Af K*f J~ g Kymg Nyr)g Pw\5h Qwrjh QxIh P}'ai ODi M )j Kj Mj K8Uk MEk Kl Ml Kl IIm Gm Jn H/un Jn F=o V\!<) U^O> T`g R`U Q_ O_G O_ OaG Ob#GI O_#G O]#G O]u LaGه LcwG= Kb7q K`}x Jdgxi Ja͉ I]x1 H^ J[q IZDG] IeD IsL% JyML Jz* K~*Q K J}L Kx)} Or PlE Qtj QvI PMq OՐ M9 K K Ke Kɒ K- KU KD G Y H H8! I` H8 GSM X[O<9 X^t W`g U`qe Q`Lɫ O_G- O` Oa#G ObGY O`G O_#G! O`G MbwG Mc!M Lb! L`qx Kfgy K_xݰ J\xA I^x Ka Jdxm KmDѲ KvDG5 Kwq K{ L}a LxŴ MqG) NkL Ol PnU Rur R|r QI OD NI L/ LU Lu L8ٹ L= L LR Hi Iͻ I 1 J I H] YYOI X[ X^O V^Ou P^O P^q= P_#G P`x Pa#Gi P`G P_#G1 P` Oa!G NaOG] N`Gq M^}G% MbgG L\f L[exQ Lc Kk JqDx} Kv KyE Ky Ky*G Lx`q Ln Me9 N`rL Ojr Qr\e R} Rj- Q Q NY L L'! LM L+ LM L L  I y J J A K J Im WW!Y VZ! V\!! V^ R]!G R^GM R_q Ra# R`qy R`#G R`GA RaG Paw P`m P_GG O\}5 OZkx NZfG Nbqa Mj Lqx) Lv Lx LzU Mw Ms Mm Mb N]rGI Oa=) Qlr Rxu S S\= T\ Q O9i O O1 OM O6 OE] O O% L M MRQ N+ MU LU} WUi WW W[u1 W\g S]! S]&]! S_! Sa#%" S_#" S`#g" SaGQ# Sa!G# R`!x$ R_x7}$ Q_G$ Q^xE% PVg% P_f & Onvq& OtG& Lx9' LxG' LxG( Lye( MsG( Mj*-) M`C) M[r) N_Y* Ojr* RvrL!+ S+ S\+ S\M, T, T\- Py- O- OA. OI. O / Om/ O/ O50 M 0 N`0 N a1 O1 N8)2 M2 ZRyF ZUuF XX#AG XZ!G S[O> H S\mH S^<H S`#5I S`I Sa#I Sa#aJ Sa!qJ S`7G)K S`!K RbxGK RagGUL Q^GL QjM PyvGM P}qM NzvqIN NxeLN NvkO NsLuO NjO Nc=P P[(P P]r)Q OhiQ PvLQ T1R ULR VR V]S UkS T%T QT QT QQU QU QRV QU}V QV QAEW OMW O( X PqX P`sX P89Y O|8Y \N#m \Qm [UQn [W!n TX!o TZ}o T\7Jo T^Ep Tanp Tb q Tbqq TaLq T_79r SaLr SfGs Rhgqes Rnkqs Quq-t Q|qt Q{vt NwvkYu Nvu Np!v Njv Nav N^LMw P_Lw Pex Ppyx Q}kx TAy U`y V z Vmz ULz T)5{ Q){ Q){ Qa| Q| QM)} QM} Q } Q U~ O`~ PR Q Q P8I Ou XJ# XMJ XQ!a WT!nŕ VW7:) VYO V\!: V^U Vd# Ve Vd7< Vb! V_!I Vax UgG Slku Rwٚ Qyq= Pxq Ot  Qrvi Qt͜ Sl1 SbD SZC S_] Tf< Tm% [vL [ Z*Q X X`L WL} V TE Sq S) R\q R)գ Q9 Q PI PRe Vɥ U- T8 R8 P~8Y Nf YD!: XF: XJq XP!ռ .VR-9 VW7 V]T V_#Ke V`#ɾ Va- V` V_7< Vb7Y Ug ToG! Ssg Rwk Qz<M P|\ Oyv Rpvy Rg< T`A T\(< T` TfCm Uo* Uy5 [' Z< Y\a X X) WL V\ U<U V S SQ S R)I Q0 Q' Q u V8 U= T R Pqi Oh8 Y= X?! XFT .XJ!z WPzI WT W[#; W]Ku W`uK W`u= W^ W^w UcwJi UhG Tnq1 SsL RtkJ Qv] Pt  PpvK% Ug; Ua U]Q U\(n Ve` Vk} Xt X}E Z ZK Zq Y Y<9 X W Ve W- W- W V) V)Y U U! T XU WM VU UE Ssy Qk8 .Z6- Y:-- Y? YD# XK#Y XOu; XV;! XY/ X^u- X\M X\u- X^uUc-yUhToqnATsLSsk RqmRj:Rc5W\8WZW\CaW\CSXhCK)XnzZwZUZZ8Z8ZZ;IYnYYuZY=YX X\iW\W 1WvWIWp]V6U~+%TyRs8.[2u0.Z5#=1Y;u1ZA#82YGui2YKK2YRuK13YVuK3YX3YYS]4YY4Y^8%5Vc#5Vix+5Voq-Q6Urq/6Urk7Tjn}7T` 7TWE8XTz8YW 9Y\q9Ya*9Yl9:Yr:[{v8;[e;\;\-<]C<\C<\CY=[s=[K!>[>\>\M?\?[@[ey@Zj@ZjAAZ AX BXvmBW BV~65CU}}+CTy||+C.\-usW[38MXZ8XZ<YZBSyYZG-YZMAZZQZZSs [ZSXm[ZUE[ZZ#5\Wa8\WiGS\WmGKa]Wlq-]Wj)^Wb^WXvJ^WPU_[Q_[X`[``[f8`[o8Ia[ua]|8b]8ub]b]=c^8c^d^8id^d^81e^e_Se^`]f^f]`%g]g\`g\Qh\\hX iX}iW~\iW~~IEjV|| jU}{{p k.\+8~/[.s][4XZ8%[>[B~~[HSQ[Ku[NuE[N}[OuS[WsEY_sYfGS YgxqYgkՄZb9Z[<ZQv<ZNe\RɆ\[-\eS\lK^uY^z8^`!^_C8_M`C8`Caya݋cAa8`s `Km`э_5^^^ a]ŏX)W\W{vW|}}+UVzzV~zz+.]( .[+XSm.\/Ѧ\3X5[7}}[<{{]@||Ua[CSŨ]Is)[H+]K/[RwU\[7UZaxS]bxS[`-]_kI[Zv^T^Tu]\٭]g=_p^_vn_{i_~ͯ_S1_CS``CS]bsb%b`8bc8Qc8baE}``E__ ^eq^\նW~~k9W}}kWw}}Wu||'eW}zz0ɸVyyy-`&K.](X/}\-/[1XE_3_7}}+ `:}}Uq_<U`Gu9_D`Gu'_O'e]Zx/\_x-^^x]\_`kY^\v`Y!`\\g]qM_z:``y_`^A]bD c mdpd5dsdcEacc)d8d8dUbb_][}}f[}}IZ||kYs{{LXozz)uXuyyjWrxx=`()^'X\(/[)XU_._3X+_7U_9_=RI_?p_DM_J'u\Ox]Vxb=]Zq^]k+^Yi_[vI_^1_e`naw<]b<b`%b`beaCQ`cIcD}e eCEe6e cqc8d989e8eeseca-^~~e]{{\^{{fY]w{{L[kzz)!YfxxeWjxxjWlwwM_*X9])[)XZ)e_-_1XS-_5_76_;}}u Y_>}}u_A}}XI!_H}}\O}}7'\S}}xM \X||qS ]Z||k!]\|| y!^^~~I!^d~~A"_k}}"bu}}*\ #c~~`m#d~~`#e5$e$d$ca%b%dj)&dI&fD&fMU'f 'f(dU(d(fI)f)f~~*fEu*e*c~~=+a}}e+`||e,a{zzi,`tzzv,^lyy1-[duu-Zcvvj-Ybvv/].^-XIB]-XB[,RC\,XuC^/6C^1X+=D^3D^4+E^9~~iE^<~~ME^@||1F^E||jF\K||7F\Q||x^]G\U||kEG]Vxx\S%H]\yyv'H^^||H^f||QI^p}}*Ibz}}fJc}}`}Jd}}Je~~CfEKeKdCk LcqLbLe9MejMf Ng eNgMNf`-Oe6OeOgYPg~~EPg}}`!Qf}}Qf}}Qe||`MRdyyRc{zzSduxxyScnxxS`ixxAT^crrDT\]uu U[]vv+mU.`2/Yi_0Xi^0/!j]0X j_1j._2X6Mk_3Ek_4XUl_9 yl_;ul_?XAm_D\m\I7e n\Mqmn]RkEn]S~~e5o^X~~o^\~~o_d~~*ap_n~~paz~~)qb~~qc~~qd}}CUrd}}krc~~(sb~~\sa(se\Ite tf~~ug0uug~~ uf}}*=ve||Mve{{wgzziwgxxEwfxxs1xexxxexx/xeww']yeyvvjyervv%zfmttzdksszbiqqQ{`cmm+{_\rrE|_Znn}|a7~~Xi`6~~͐_6X1^5'`5X `5'].`6`66%`;I`=u`@Q`D\]Iv^ML}^QfK^RjE_V'`Y\ `a*qbk~~L՗au~~L9b~~gc~~kd}}Led}}CLəc}}L-b}}fa}}d}}Yd||f||)!f|| fzz fzz Mdyy dyy` eyy+ydww`ݞdww+Acwwcww dzttemdrss\Ѡemrr`5djrrecippbjppabfkk`Ţbaqq6)c_mmc?uAyc=~~ݷb=X6Aa= d=XI d;md;XMѹd;'5d?u\d@u\dCadFuŻaK7)aNq\aQfbReUbY cZ~~Lc_~~Ldg~~dq~~qId{~~Le~~qf}}quf}}qe}}L=d}}d||c{{`ic~{{ez{{\1ey{{e{{{0e|zz]cyyjcxx'%bxx_xxp`|xxQ_ztt_vtt``rss}bmss`)cjrrEakqq)aloo aloo/qbkjjsegoo9hfmm.dDX+dD~~+cDXQbCeCXMeC}.eBeBEeD)eE) eGuqeJ)bOL9bR7LbTecUec\ d\~~)-d\~~`ea~~9fi~~GYgr~~Gh{~~!i}}Gi||h}}GMg{{`f{{fb{{ycy{{\dtxxAdo{{`dpyy) dryymcvyyawxx5_wxx`^txx\svva[rssI]mss`)_lssajrrbkqqGU^moo_ooo`ommcojj6gnooIkmllE.dI+dJXseIX aeI/gIX')hII.gHgH)UfIXfJ eL eNu eRI gT iX kY~~Lu k]~~q j[~~*G= i\~~` h^}} gd}}i in}} lx}}x1o}||xozzxn||q]lyyjyy%h}xxguxxeovv(Qckyy)biyybjxx)}bmvv\bmvvE^muu([luu YkttJqWjrr`Wgqq9Yhqq`q]hppx^kooebnnn`xcqnnq-eqmmqipjj\ppmmCIYvojjDeRX,fRE -fRuUq-hR-iRX9.hR.hR\/hRLe/gU/fV-0fWX0fXu0fYY1h[x1j\~~xG!2l\~~x2mb~~2ma~~xM3la~~`3kb}}74le}}y4mk}}74pq}}`A5ruzzx5rzzzx 6p|yyLm6myy6kxx57g|vvC7euvv7dmtta8beww`q8acuu`G)9``uu`G9a_ss`L9`_tt`U:[^ss`:Y^rr`;Warr;Vbqq`q;Weqq`GI<Ygppx<^ioo`=_knn7u=dkmm=emll(x=>imjjG>mjhhC?tjlli?{rii`'?iWSjWu+TjWXUTkWuTjWIUkWuUkWVjWuVjXViY=WiYWh[Xh\u7iXj]~~Xk^}}1Ym_~~7Yod~~Yoc}} 7]Zoc}} 7Zoc}}`%[qf}}7[rj}}7[sn}}Q\tpzz\sryyx]qtxxq}]nvxxf]lvwwE^dsttf^cmssL _agrrxq_`bttG__^ss9`^Zrr`_YqqCqa^WrrGeaWXppaTXpp`}-bS\ppqbS^oo`xbWcoo7Yc[cnn`7c`fnn7!dbgmmwdhill`7djjkk7Meokii`xevjggf}fkk`yfohhjfl]Xzl]uS-{m]8{n]X8{m]Y|m]u|m]!}l]q}l[x}k\M~k]w~k^h_~~wyi`}}ja}}7Ala~~me~~w oe}}Dmod}}C7сpd}}`75se}}7sf}}sh{{xashyyŃqiwwq)njxxqlkuuqjkttgUcissqbfrrx`bqqx^_rr]ZqqCxI]Wppx]Unn(\RppGuUQmmCxوSSoox=SWoo`xTXoo7X^oo`7i\^nn7͊camm`71fcll`7ngjj`7piii`7]xkhhxiff%ekkqhh`na١oau6=oaSpauoauioaͣoa<1nauGn_xm`w]m`~~7ma~~u%hb||ic||#id||wQjd||wwke||7mf||7}nf||ngzzCErgzzqfzzx qfzzGqofyyժmhwwf9khwwxihuu7ghttecgqqɬbepp`7-`dpp`^coo`7]]mmxY]Zmm`x]Vll`x!\RmmxTPll`7SPmm`xMSTmmxVUiix[Wmm7y`Ypp`xݱh[oo7Aj]kk`taggw xdgg7mfhh*ѳfeeG5gii`odd {+xCfG 8HDF4_OBJECT_TYPEVdata HHDF4_OBJECT_NAMEVdata with mixed typesTREE@ SNODHEAP`0TREEP1D String2D float array2D int array3D int arrayArrayOfStructuresVdata with mixed types4D int8Rſ>VMWDAINBXQ mAv&A`BAؚB B5BqB dcB"BBgBA2BQBNAۻBCtB9AJOBJء>YFOAIISPPS ZȓBA@BB@b@PBRBhBA-B AB?BNB)ABa@bBARſ>VMWDAINBXQ BR-B}ЕA%EB B{[B\ BSB.B?@{n=VwB̤BqAYFOAIISPPS &aB B6[BզBߠAݡBpBG_BVBBYAoApBB,BDގBSB~6AABK$BRſ>VMWDAINBXQ ALB6B@ipABTWBBptBjReBABsB8VB̷A@BAkUAݫ1B:9rBH h?HFFPQKLLBN 5BXBg#AXB+B5 AFvBOsB֍@>iB@BoBB1B@kBoB"B0*AV'?BYAKSOSDJR hBƃ?B;B9hBϒAJABUAC:A/ūB2BA=AZABgͅBKA AQBBG6@EDXVUWHYMJ B7Bq=]@لB_BBBB!ÒBWBxBlB&B6/BA/BtD{>[BFKBX _@YHXRDCHXXW [BUAgA^A-B=rB̲B\amB]A٦B -@jZB B]xBBkAA_A]AqBO N@VHBKFUCHYA ~B&kB>9BK~@%BBRAE@B;BBlB΍BDYBB=AiB:flBA-BK eA@HYIVATPBSR T_A[B BBUpAB{B7iBrB*B;BAJEBB%BԸA(AJB ABW <.?NBPNVGDKXW zBiJBB-AkBY̱Bo;B EBBAB]MB A?lA4@AABfcB{BN @@XESPFUJSIB BBB1ABX@BǙHAB#BLBB &BؾBێAkyQB B`Aq@WBfAG9ADNYQCELJWH tAqBBRBO6BL,A3>BךB AГ3BaAs~B9BަBؕSB"Byn@BxA"h@K3?EFUJJIOIXJ iRBAA #@qFB+BfB֤BGՏAFEOQLUHOBF /BB?0EB\A1BB*B(mB~BaxB2}AA7BAR@rKA`BLBUBBMN@ELUVBBDLKU hj&B2B?BA5x@VAFBB0BCB:BBIBpD^B@'ODA;r@@B!BA?UYJHGABBAY BB1BTA2BAԠ B6zBH&}&BB!!!!!!7w7GGGGx&<qB۹!B#BBw#蹌O&Ow}!u#uuuu#uu77O}BܜúO!!!?h?Bh[2Z[oHB1!1iZ$ ||P갺 t.݀!OHOO!t!O!OO#!OtÒܶ..HO!##u###!!!#uOOO!######!!OO##uu##uu#u#u#u#u#u#u#u#uu#u#u##!wdwwu######uÜOXHúOHH!O!}BBB&!!#!HO!.H2117!OHl?l2܊?i@ycccw&}GGqBBù!wOO7!!!!w7xxxG>JJ>gGG&&B}lB}Ow#!O###uuXuuu7OOBúttO!#!BB3liHtOtHH.llN|""[ i2.ttt tHOO!!O!!!!tttt.tH1t.tttO!##u##u!Ouu ##XXX####w!!##uu#uu#u#u#u#u#u#u#u#u#uu#u#uuw}#####u##B?HO#t!}OOOBBBBBO!OtOtH2?2hHyO!BO???2l?[[cY3}G7w7qg}}Oww!wOOO7!7!x7777}G>qG7xG}!B?dOB!OOd&}7wu###uu##!!O7ÜܜúBO!O#t 2No11HHH1궶" 2tootHBt!OOOtOO!O!!!!Htt.t.1H1tt!!7#7O!ww!!ݺt!!!O!!w#uuu##wuu####u#u#u#u#u#u#u#uuu#u#u#uwuɌw#uuuu#uudúù?ܜBùO!BB&B!!!݀!.l.{iBOOtHlll2l2??i?cd}7xxG}}!!w!!!!!!!Ox!7w77G}gBgGGGG77OxwBBdBۜd?&>>>7wO! ##!HBB?dOOB!!#O}B@$lPP.ttOHH܅to2H.P?2H1OOO!!!OO!!OO#####!݀.N[[i2H.OOO!!u}O!!u!!#!!OO!w#u u##w!#u#uuu#u#u#u#u#u#u#u###u#u#uuuw!uwuuuuu#}!lBh11BB!}BBOt2H.1h?H12l?N??3F}G7!x7x!!7!O!7O!7!ww#!!w77!7!G&Bd}GGGx7x!7!}d?}3ܜw!}?:u蹀H!uHB1l?d!XOO!O#1 .Pt.!O!Ht..tH1NtHO!O#!!#OO!!!OHHtt.t2itt.O!#!!!#####uuuw#uuuu##!!######u#u#u#u#u#u#u#u#uu#u#u#Xw#wuuuuuuu#dH#?1úÒB}&!OddHH??l2Ò1lt?2i11222?2?l1ih?FFdB}7www7#ww!!7OxO!#u#w!ww!77!O}dBGGxxwwww!#uulFlܴ]Fz_;:!tÒt.tÒ1lù!O!!}Àu!dBi?PPPPHtt!X ootHl2t !HOOO!!!#!HBꜜ1H[2PHHH!#!#u!1 #!!!!ww##u#u#!!uu#u#u#u#u#u#u#u#u#u#u#u#uwuuwu#}w#uuuu#BlÜBúùO̹ddBBB!tH11OHl22i12211ll?lúl1?hh3}w##wwu###!!7O!7Ow##w!7w!!7O}ddB}G7ww#x!wu!BBly@?Fhi3:Ɨz5d!OH1BHHù!uݜhPH"1ÒtO݀ Hllt.݀O!O!!OOO!!!!#OBHOHt.tHll111.OH HO1OXX!w##uu#u###uuu#!Ow###uu#u#u#u#u#u#u#u#u#u#u#uwwuuwɴw##uuuuOOwX!!lOHOO7Bh?H݀!lO12??1NidH1?llHt?h!ww#uuu##ww!!!7!7wwwww7OO!B۹g}GxOwu!!!h?{@%ii?lK-5!!o1H1BOOO#!!!!d% | 2HPtHHtOH! u!tdlOu! u!OO!!!OOO7!!!!!BtBHHHttt1liN1H11Ht.! Ot!!####uu#uuuuu###!O!u##u#u#u#u#u#u#u#u#uuu#uuuuuuwuww!#uuuu}!uHBdB!B?Bw!dOGd̹OHúݺHú÷iޒ?2B1t2?21HBHHB!}}Ow#uuu####7wwww!w}ɹ!w}!!!&>Oɹ#O}ܵ@@iBhd??BO!OO!Fll2iN2ܒ1ú1B1ܜ}!77www7uuuu#w#w#wɹx7O77&wO7OG>5!uuܴ?. l@[?l}d?<3YcYYa2N2BO!#uu##Hd?.. Pt1tBdH!!O!uu#!OO!!!O!O!OOB1BttOt!H.2i221tt1NP...H.tt. uXu!uuu#uu#u##u#uu##w!#uu##u#u#u#u#u#u#u#u#uu#u#uuuuw#w###uuu#Ow!w!H##?XBO!7!Ow#!?!yOõ?2P2ޜH!ùtÜBll%aO۹!7uuuu#u#uu}}d>Gd>77d}&B]B#?H?.2ldlB>dG}>!!!#l{y[ÀÜ?Bd>GG%Y@lBt!!BÀ#XX#!O#O2ޜ ؊i "|i|Pt.tHO!!!!!!####!OO7OO7!!!tOtOOHl21{i[?N?l |["PPHt. X#uu###7u u#uuu##!wuu#uu#u#u#u#u#u#u#u#uu##u#u#w}}ww##u#uu#O##u#!w}ÜdOOu!OO7!GG!7!7ww!O!!1}!?ÜÀuݹ?[i{Fduuuuuuuuu7#Y5>d>}&ddB?OBd%%t!Oû>̹7&_Tֲ%[lBO!OX!O#uX!ݹHiHi Z2|Pt!OtO!!O݀u#!!###O#!OOOOOttH1dܺ?iN[2iNN|i"[ 22tu#u####wOu##uuu !!7!#uu#u#u#u#u#u#u#u#u#u#uu#u#uu7!uw###uuuu!!!#uu!OuO!77GGG&&G7w##w!d!hô{BBu!B???lhi?hl}dB7XXXuu##w#}ɋq-K;JT;5J}Gdd݀?2[@[tOH}O>>:]YihNBHt!! #XwXXX!BB1PiNN|"|[2PH.u ###u!!##!7u##!!#!!!!tH111ܵ21li2PܶN|||PtݺO! u##ww7#u#uuu##!!uu ##u#u#u#u#u#u#u#u#uu#u#uu#uwuw#u#u#u#uw7Xu#!!?!O!#7!77&}7##ww!!B!lBdhclBBB1ÜB}B2hhB?w##uu#wwx&T<-K5GG̹d!B!ll@úOHB!d:Tdl?hhlBt!#!# #uXuX#!BN2P"| Z[u#!OO.O!7#uuu######!OttHú2??21122l21HP|2|..X#uuwwwu#uu#u#!!O!#uuuu#u#u#u#u#u#u#u#u#u##u###wuuuuw#u#uuuu###!!u#OOXB?BBw#!B7##!OG>>>&̹7!7w#!!1h!HOB}Bùú1?h{%ayù?d}!#uu#w}G<K֗YGwBB1ÀBlihH!OB5>>??d1BBtO!# uXuX!HHH2Z"["21H.!#OBBHO!!!#u##!ttH?i12l2.||" "PޅN[u #!##uw#u##uuuu##!!!#u##u#u#u#u#u#u#u#u#uuu#u#u#wX7uwuu#uu7!O#}dO#}!#!!7#&B&B&&&G7uuw!!OHB?Hi1l??B}B!}}dhF?ÜyFdXOu##O><<<<;YOO?1t1B@iHHBd#&OGK>>&BB1ܜihHHt!! X X X !údHO!O1?ܵ?2OH!OHOO!uu#uuu##!耀!tHú1.1?N12.?ܒ?i2i2i $ |"NPHO# X##u####uuuuuuuu#!ww#u##u#u#u#u#u#u#u#u####u#ww#u#w!wuuuuu#uuO##!#O!!wO!##7##!&}&&G!!###w!O!1!ݵ%c?ld?ddBB}w}d???yyFOu!wuw>>fn_dBdhd.1tP.H@HOd&&:<<JŽ}BBHÜ?a߰2HHt!Ht!! Xu HOOhlܜ?Ht!HHOOO####uuu!#!l21H2Üiܵ[i...귉aYZ i2t!u####uu###uXuuu#uuu#ww#u##u#u#u#u#u#uu#u#u###uuw!wuuuw!wuuu##u#uOO!!!!B!O#####OBG&GO7w#uuu##!Üõ2hc?hBBBdd%߻!%{FO###u7zμ]3!B?yh1ly{@?i[i&<<<BB}Üly߰[i?.úݹ݀uu #!OOddܜB1tH1tO!O#####uuu####!!OHd1H1tHli%ii12 Z$i"N2HO##uu##uuuuu#u###u#w#####u#u#u#uu#u#u#u#u###uu#w#uu#####uu#u##ut݀#!u#wOwO>O&!######uwB&}!#u##!!HdB÷yܜ1{l?1hy?1OBBBB?hhc3?B}Àw#7<f/'ld?hcyBYaYa%[@y><_d>Bdl[@$@1ù!O}!u}O#!#OBúBl??l1Bttttt.!!O##u#u#!###tHÒHt1l1ܒ2lia22$%@[N?H1H!!!O#######uu####wwww###u#u#u#u#u#u#u#u#u###uuu#u###u#u#uu###u#?H!!!!wOdOw#!O7###uu#7d>&ww#O!!!OlݺiܵO lch1}BBB}]ccYؙù?7}O!#w#uw7}&gg/SThhh!Hdֲ%@2l{YYc3>>dBl?@2.H!OBOOHO}!!#!Bút!l1tOO!##u##!!!7#####!!OOHH1Ülill?@?2ܴ%ltPH.11O!!!!!!##w##u#uu#u##!!w!7#u#u#u#u#u#u#u#u#uu####uuuu###uuu#u######t݀ #w#!!7O!###>&}ùw!1܀2[ú2[i@B2h?lBFhF?d!!!,Xuu#w7>gggfS3h[?1Odd{YY@@yYd3&>g}lyy[i[iH}Ow!B}OH!!#uOB}ܜ1ÒH@Ht!!O!##u##!!####OOHtlHt1t1il[ܱh??@$i1..H1.1tO!!!!!!##ww##uuu###w!7!!!w#u#u#u#u#u#u#u#u#uu####uuu###uuuu######2tt!!&7!####>>&&dB}!w#11212l?lh??2hhl?dd]3]?!#uuX#xG&gJs֗5HHݹBOByhY]d&>B&dd@%|iZHOw!!!!w!Ou!!!?2ll12lO!!##uO7##u###耹Hl?2i?2{?N?l?@22@tO!!O!!#####uuuuu##ww7!7w#u#u#u#u#u#u#u#u##u#u##########uuu######"21H.# OO!7O}BFO7!O!###7d>&B}!u#w#O Ü1H12?l2ddB3B]3{B!uuwwwwOGgn-E8888%t݀!tHd!7O!yB%&x}>}>&dBd%?N[$}!w#!u7!7w!!!!!O!BB?d?@y$P2BBB#u7OO####!OBHHHllll??21 i??1212.t.!!OHHù!#####uuuuu##u#w!!!w#u#u#u#u#u#u#u#u##uu####w##u###u#u#####222tOu!!B!7!̹#!&OOwu#!u!ú.1N1tt1i?i?ûÜdBBd_Bh{B#ww&ۙ^;SS֯ HHHOO!!!Bdhd}B}7}>Gd?{i1i%OO!7#w#w7!!!HO!}Hdh@@2ldBO!!uO7!7##!7###!OtBll21l2h1HB1dï?!݀!ù!w!#X#uuuuu#uuww!7w#uu#u#u#u#u#u#u#u#u###u#uuuu######u####uui"a%!! ##!wOOO###7OBd77www!u u# !1Ò.B1ܻl?}1}BBB{@!#Xu77}>K8c?2ldOHO!O!O1dh!wOwwwwG}gdF>™Olll2[tB&}O7###!!1BBBO[@2?BH77##!#77!OB1dllll???@O??tÒOtHHݹú!###uuu#uuu#u##ww#u#u#u#u#u#u#u#u#uuu#u##uu###u######u###wi@@@2HB!#77!O#OO####!OBldB!#w##!u1Htld[1?d?BtOù!Bdd?OBh{%!uuwww}}\+ssY@?1OHBBBB}!#!wO77d}B]:3̴llNi1B!7#u##!OHBOO!dd??tO!!O!!#!O!l2ܜlBܴ?d2ܒ.HH݀!H!uu###u#uuuu#######u#u#u#u#u#u#uu#u#u#u##u#######u#uu#u##wl?tH!##OO7!#!7O!OHHH?l!w#u!O#..ttt1ÜF}B1!!!BO#OO!?%al1uu#u7}f>f'6E8Y{?BBBBBO##Xu!uuw7d}}B77#B?l2??B>B##7O!}O}}Üh?dl?tO̹O!7!!!!!!!O!##!O!d2Hdl}h?hlúÒ11?!!!݀u u##uuuuuuu##u#uuuu##u#uu#u#uu#u#u##uu########u##u##u#u!?!yd!B!#!BOOO##OHtHBH!!uu#!!ݜ.HHHBHOd!}lH!ݺ??2!@!HOXuuuw!}qkj+88ֲ1OB1HHHHHttBHtOO#!!uu!&BB}!OX7B>d}}BHH1?ܴdd?dBO##u!!?B}&]yldܺOO!!!OO7!7!!O!7!##OO!ÜtO}.ҹÜl?H.1.1.ຜH!t!!uu uuuuuuu###u#uuu#u#u#u##u#u#u#u##u#####u########u#u##u##w!#O]#O!BOO#OH111BO!w#݀1tB2dùÜ!X{21ÜÀO1!!!#wwGx7\'U88B!OOOOtO!HHHú#!!}OBw}ddBHtOHl?dB!#!!!1iB}BBB_%]?B!O#7̹OO!!7!7!####d?111?B!}!úݴ@a%[H.t..??1.t.t!݀# #u#uuuuuuu###uuuuuuu#u#uuu#u#u#u#u#uw##u#u#########u#####wwBB!#&̹OOOH122l?BO!HHlܺXuOBBuB!hhcFúh[[22N$%À!ݺ.lB&̹7OwO7xQ\M6E8ֲBOOtttt..ttÒHO!OO!XuuuOBdOû?hۙBd!HOtlh3?d̹!!!!!ݜOHBBBBF_cBH!!!##!!B̹&7!!!!#7##!3htHHl??hdB?lÜú.H?12PHtHH!#u #u uuuu##uuuu#uu#u###u#u#u#u#u#ww##uu###u#u#######w##cBdBO&573d1Hl?dt!!OOH!OHOHOu!X۴d?݀2lÒ?dBHt2B1d?wuwx7ν%dBtHB1Ht.Ot!!!!###BB}??uBOBHHBBdhi?1!!!!݀[dl!Bd555FH!!!!!OO7O!!O!###!?HtH1?݀h.l.1oHHúuuu #uuuuuuu#uwuuu#uuuuu#u#u#u#u#u#uu#!wuuu#uuu#u#####w#w###&_]dtB!&5YJ:l2޶P12ll?2l!HO!!{tÀ݀uOB!]?}O{l!H3{ùttݺ2li[@}7#GɑG)L:yhHHtt!ttttOOO1tH1##!BdB}!7}BùBBBtOtBl?i?ú!!Ü2޶HttBJnY;]BOO!G!O!#!tHO !!OHdll2l?lùl?l? OH?ttl[Núú!u uuu###uuu#uuuuuu##uuuuu#u#u#u#u#u#u#u#u#u#u#uu#####u###u#O!!ud]YBB!!#}缗K:-SK3T?2|"|22lܵ22t!ݺ!}t!>H{Nt1!X#3BdByB?1.1[$%@3dOOɑGGLLd31OH1?t!!OOtHOtOt!t܀ۜO}dB}!B}OOOd?h[?lhݹ}H21P:n;3dBO!!!7OOOHHt.!!l111l[l܀u.OlܺuB?{c!??iltú!#uuuu#uuu#uuXu#uuuuuuuuuu#u#u#u#u#u#uuu#u#u#u############uw}d>O!#}:-;-T;?" "Nl1t22?2?1t!ݺO!!ll21Bdd]]F33B}B?iܺ .ݜ22{%]}G#xwGGxwd?O! !1tuOOOHBOOÜOX!B}BB}O!}BO!tH?ii@aiߴúHBBö222??d:Tn;ֽTd!O!7O7!#!OHHHt!!dllܜ1i2l1u !Ü!X! ly?tl?l2?1tOO##u###uuuuu#w##uuuuuuuu#u#u#u#u#u#u#u#u##u##u#############d#>ϼ/K8K/-KFl?i "?ll212t?|ll1Oݺt!HBlBHdH?dt1i?HBwOdF__5_c?l$.tHH?Y%>wwwww77xxGxuBuX!O!!O!OHt!tOuOBd!u#X}#u!u!Oli{@1HB12N2l-nK8Y5B!OOOO!!!Ollt122OOO!tt2!!ܺݜùtBFy݀ݺ!..1H!####uu#uuu#uu##uuuu#u#u#u#uu#u#u#uu#u#u##u#########X耀u#u]Os8-T32O.2PP?HÒ1HHO?tBl11ù}55Y֗_ N.lBB]YYw7wwww77#Ot ! t2!OOO!tO!tO X #OOH}t!## !#u#Otl?@%[2iÜ?[hh:K/8O!#BO#OBlH!!H?i?2túl1lllB.!ô2l1Bt#lhܺX ݺ1útO!!!!##u#uuuuuuuuXuuuuuuu#u#u#u#u#u#u#u#u#u#u#u##u########u##u#}d3>&T-8ӕ?1l?2Pܜ1HOHOH!H?1!X}%֗Y?$@ih{&_]>7wwwwu#w!O!uܴ?O!!OHHOuO#tú! u!OO!OhHHl11l?i@Fϼ-//6ssO!!!!!!!O!?hhN@# Oll2?BlO!ÜttHl2B#XH?2!݀.O!!u#uuuuu#uuuuuuuuuuuuu#u#uu#u#u#u#u#####u##########u ##u!BO>J>&BsE'::3]{2. 1l2ll21ltH??lO1#,!uuBd?_>:>7#!!!!#O!Ot!!.Hl?cOtOB!!lB!1B!.OHú!! XÜBO!O!!OtBl[@{{y@%yll????@c5T/+E888]&O!OOOO#Odh?llll222OtOtllu!11ÜBH!!!ҀHH1. !tttt!!#uuuuuuuuXu7#7O7wuu#u#u#u#u#u#u#u#u#u#u#u##u#########u#!!##B!&<䕕IS<:?hB1BHPP2llH1!1hlOH!#1#u!7!}wG\Y%%{Yֲֲֲ:B&BGwOu##!!!!!HB?tBܴOÜHtHHy%y?úݜH..l1dtOHHHB?22i1hi??{5 E8B!!OOO!Hli11tXݜH!1l21?HBttO!u!.݀!!w#uuuuu#uuuuXw}O}}!####u#u#u#u#u#u#u#u##u#uu##########u!BHuX&JJMIs/M\JdB}tPPl?"ilݒlB! ݹ}}!}7x;Y%YY%_dO7#!#}túi 1!HHBOBHHôhdÜh%y{BdlHݒ?yN1lݺ#ÜBH?@a@???1Nhh@F58/R++885]O!O!!OOO!t?i?1HHl.HÜttHݹ22BH!ݜd1!u!HB ݀..݀!݀uuwwwu#uu#uu!BBOuu#uu#u#u#u#u#u#u#u#u################u###!<T)M/))<f>dB&BBHܜú1?li2?HH݀!!!!!!}}!wwYYֽY%GO7#w!1!2..Od!B?y@BHlhh@c@hh1ܜl?[@i221BBl?[[ai1?c' 'R88!!!OHt.iH.H1tOH11ÜHOH !11ÜhOܜݺ.!݀!O!!wuuu##u#uuuuuOuu#uu##u#u#u#u#u#u#u#u##############uu#!!#u<-;) S\)g!B2l.ܜޜ?N?2??a!!!!u#u#B}!wwwɋɑ:;ƽ8s88YY?77##Olܵl.?!tOH!HHdh{{B?l??@F{{h211N?@1Bddd??@@N??Y8E R8JO!# B!݀Hl2 tHHH2tB?hO BOHB??HHHtú..!!!w#uu#uu#uuuuuu#uu#u#u#u#u#u#u#u#u##########u#######!Ou#g&L)<<խ'KխqggO7!O!!ݜ!dP!.Hh?1OX!#u#w7wwwuw!}G7G&<\+Ssԗ-5>&!OB11[߷$@?1d!!tútÜ??[h]hhB!܊P11lt1HH!tOOOd??@@h;ES8MIM48<>>BO!tH1tt.211l2?!lB2lܜú!!# HO111.tO!wu##u#wuuu#uu##u##uuu##u#u#u#u#uu#u#u##########u#u#ww#!!!u>gJISEsUsӢ;&O7O!OBB1iiylOBOtH1H!BBBl1?{hh]3Üi?.1t.!O!!OHd{[$aZ%&SS6EMM((Ш48S>u X1[[?H1Ht$tlhudh?lhl1!t!O!OH1H!O!?!t!ܜܺúO!!##u###u#uuuuuuuuuuuuu##u#u#u#u#uu#u#u#u#############ww!!#u#!!/s-SJ<-:<>&O!w##!!OH!ݹHh!OXu!!!Ü}!O#wwww!#uBB&Ď8++++bB}O#!1??2lBBO!t1?HOBl?{yF3t2ll121HtHO!OBi[@@$aaa) MjMАS:JO##OHtܺH?i2liillH궴t!H!t!̯?H l?Blldl!tutÒ1t!!!w##!ww#u##uuuuuuuuuuu###u#u#u#u#u#u#u#############w!!!##!!::)\8EK<<&OOݹú}uݜ1útO!!!!uBd?À##O#w7}۹!dd>g8sUٔ&!#!!O?ܜú?OOOHO!HByyHd?{%Yccddl2lNPP?.O!OBBdl???d[ߵ3<)/6/M *АSJ>Bt1.ݺtOl22ilHH2tO!XOB1BBHdO?݀.t12O!w!OwX###uuuuuuuu#wuuu#uuu#uu#uu#u#u#############7!##!BO-'IRSssE/-><-E8>O.ùܴ?PÜHH uy?Ü!ú#ÀB3ww#?>}g>>g-8sEsz;<:&!O!OH!!!HBHHH!!OOO1hh_Y5hF?22 2dBdBBll1BBd>dxLS8sRM*488>OOu.!ltylHhl?ullt!t O22hl!BúOHܺ.!PlúBù!#ww##u#u#u#uuu#u##uu#u#uu######u#uu#uu##u#uu#u#!uOOuuu!'/j\\LJ3:-SEsJ:d>G!!Ò.}!w}.ݺ..Hl$y1.H ôlܒ!!!?ܺ}BB!w}wO}Bg}G&L68888TO#!!H#OOHH1HH1?]h7#tdd_Y%{y{[ZZ| ||?ôdBddlB}7}B>dgG6E0 8J<d1 1H22??ûylll? #!2lOH1!!!B!O!O#l}lii1122H݀}Ow##u#uu#u#u#u###u#u#u#u####u#u####u#uuu#uuuuuuX##u#!###!!!8--'k)GJJΔ+sJ:3Jd>Oú}!!#.HttHlh$i.?H?X?ݹ}w#!w}}O77GE8K:!##H!O1BÜ11d!Bd?ֲYֲY%ca$$@߷l?!!}B>>Lq)/I88-2ú!#u#uH1l?l1lݜ?B#!O!7!7!7w7I8z<&O!O!tB!H1útt?lddlhcֲ_YY%{@yal?B}ÜdB}!O}Bg}ggLpM0* 8E/JϴdHOHܺ!1H??dô@l1yطltҺ1ݺHH!O!OO!OtH1.t#uuuu#w#uu#u#u#u#u#u#u#u#u#u#u#####uuu#u # #u#u#uuuu#OO88qGǑGI-8;d>>ܴO!!w!#!2?2l?1?ݒ?d!ù!!O7!7#w777788\&>GGOOBOBOH!O!HHHtBd]??l?3YY5_Y%%cy%F]]BB?BB?1ùO!!}}qqG\IRRj*<O}1ܺ!!!www!OO21[1t!uݺ!B!w!!!7!www777w7J--88Ez8LGhBdOOt!ܻ33ϻ3FcYYֽ;5ֲֲ5%زcF?d&Bl?BùO}BG}qxӢ''RȈ(A8<>d1t2ܜ2Ü1l?Bu?yld1%O!yHHÜ!OOO!d?dHtOH BH!uOX##u#uuuu#u#u#u#u#u#u#u#u#u#u####u#u#uuu#uu#u##!uuu#!##!8ɑOw}}>q<E-&>>>>̹B?OOO!!ww!OB1OO11tH.dhHll!!?{dB!uww7!wuw!w7G<:-88LB]cOOHݜ2B33ϙ?]%YKK;_d&BdùBB}qGG/M'M (8sOܜ!.?2h?Bdl?X1 !?i2HOtB#]؜?hhO๺1OHOOHOO#w!uuu##uwu#u#u#u#u#u#u#u#u##u#uu######u#uuu# ###uuu w!!!uuEΕG7#7w&K-GFO!ݺddd<%֗K-S;_3>BִB?lBù}GxxGI M `REsHH2!!lFa{O1Hl! 1{a!B##OOHHO!O?B1B##uuu##u##uu##uu#uu#u#uuuuuuuuuuuu####uww#uwuu#uu#uuuu#uXuu##u##!!!u6/'Ixx}wuu}B&>gqG7G!!!O}!OOOlltt#1úBd}!X!!Owuw!!uuw777Ls<T>&T7!wOOBB:]J:Y֗KSs853>>F_?l2d?ܹ}BGGqR'**`USK5?!#dtOH3?hO2yY{1t!11!B11OHB#!!Xt!B!BúOO!#uuuuu##u#u#u##u#u#u#u#uuuuu#u#u#u###uww#uww#u#!!uuuu###uXu#u6'LGwd&LL<<77#7!O!7O!OHHO!Otl1H#1? w!OݹBu}!!!7uuuw\<KTTJ>G&}7!7!ww!!dTT::F_YֽsS/Sss֗֗5553]]d}ܜB}ddBgB}Gqg8/MI *U8K:t݀!O!#dݺݜ?ܺݺ݀1yd!O!OBO!!!!#u###u uu#uuu#u#u##u#u#u#uuuuuuu#u######ww#w##!!wuuu##ww###uuw#u!!!++<<7!7O!!!!OBù#u#H11Ht!Bd12..?FB]!B!1OO}}wuwuu#wwS88-J&&Td>}!O3]:;-K5_Y֗S6-S__]Fdۀ1d}B&gLs66' *`Edl?H1Xt?h1# Ouc?ùBli2Bú Xtݜ@HXHHH!O!O!!!!!##uuuu#u#u#uuuu#u#u#u#u##u###u#u#w###ww####w!w!u#uuuuuuu##uu#O!!+-TJ<BGdT>g?FTTFK;;K_֗U++6/_YY3]?B}?BB}B}>gGxEs8M*`RE>d2l1?hlO!h]FhBlÀ!1l!1O1l!!#tOO!tu#!O##uuuuuuuu#uu#u#uu#u#u#u#u#u#u#u#uw#w#w#ww##www#!!#uu uu#uuu!##u#u88->&d<<LLG7###u##u!.Üú.Ü?2..OO?HluB]_ֲ@ػwX#!wuw#uuɌ֗G&ddT;sK֗֗8Es+6+SY53]hBl3BB}>ù}}Gq>HÜÜ!{?!?ôߴt??t݀HH??ܓ!tX !#uuuuuu#u##uu#u#u#u#uu#u######u#w####www!w#w!w##w###uuuu##uu#XXu#A8>>:nę\L>G!!O!ݺÜ2?21.1H!B1Hliu3a%%ch?B}!7w##uuɋxq)/<>G&>:<ώ<:]5_88888S֗8UA+SSYYYYY]{aܴOܜB!B7}۹۹7gJn΢R' *`E;dd1ܜO]lBldOOHtOtܜ!Üt#X!!tÀ# ###!##uu#uuu#uu#uuu#u#uu#uu##u#u###u#####w}O##wu##uuuu#u#uuu####uu#uuw ֗5><&۹77!###!#!ݺ.Ni@yBy[l{h%%c{YY%}#w#www##wG)n-Kę>GGJ:ώT88sSSsY֗88EU sԗ֗YYY%hFhdܴÜ7}B}}gwLJnIj 'E<̹O7!!X!. PlNa@lH!OBhYFh55dT%!!uuu77ɑ<&Jd--_Y֗88E+6+S֗888888EsE8c5c]3Bdd}dB7ݹBx}xff'R++/Fl?l??dOOBBdBBl?hd!1{ilh!?dO1u!HtҀHBBO!!!!#uuuuuuuuuuuu#u#u#uu#u#uu#uu#u##u#ww#####u###w!wwu##uuuuw!!########u###* s:G&-JJJB}̹!#u#!!t!ݶN[[iltHH!OBBcB}B&g&ŽcB#7Gwu777;-7GG&&>J:-KK֗888ԖRR/S88888ԖEss888Yֲ%F3dBdB}B!!}7wxGLe'BFFOuw#錌::gG-;;_88Ԗ('-֗8888EU+EEYYYdBB۹}ݹ!}}7wxqGvvj\<[Bl?![HO!OOdHO!!@ܺ Ou}uBhaXH{!#OO!#uXXuuuu#uu#u#u###u##u##u#u#######u##w#####uw!wuuu#u###uu##w##u####uuu##w# Is5TK:TS-d&!7!7!ݜ!.1lúttt!1d!w!}c7GB7whiزc}77G7GG&JT;;֗8Ԗ 'K8sUU88+Uz8Y%y{BOOBB}!d!۹7GLff\v&d@hFO!O!OXO!#Xt!dlBB?t!7wXB?%at!!HÀ!u uXXXuu#uuu#u####u##u##u#u#u#############uu#w#u##wuu#w##uu##uuuu##u#u#w##)'-S֗S8T!7O!!O1HÀH H!!1B1tH1l{d!BF!}O!w7w}d?aYOc{B7苹7>>TTJ3;;;֗4A 'JKs8sS+UsU++SsYacyh[?ùB?!!w}xqqkvI<>lca3BOÀd!ll!d?BOtO#1X#w!O}cF?# ###OOXuXuuXuuuuuuu####u#u#u#u#u##u#u#######uw####u##u#uuwwwuu#u###uu#u######w####uL)LєE֗E8FdBO7OOO!OH?t#u}HBO!!OtcB7##}7!{hdY%]B777&>&:ֽK5֗4惪C Iĕ/E+6U++Y%ya[hO}!w!ݹO7wG<v>;5-3;Y֗֗֗Ԑ̈́`*IUs+6R+AS_yca[h?O!!!!!!!O}GfLqğ:}}Btc32Hlh?Ht?lh#X!h{a#!!!X#X!!###!uXXuuuuuu#u#u####uu#uuu###u##u#########u#u#u#u####w!wuwuuu##u#u#w##u##uww##uuJI E֗֗8sE8YO!#!!OHuOO#uXXú!!.11HB!Oh]5}#!]!!}!#u!}}F_YY>>wOB>Ow&/:Y֗Y֗88EEA((`*MR 44RR/_a@ h?B}}}777G<<:K-J-_%F3OOLFyy?HBh@F?H1{݀![yO Ot!{{!##XXXX#!OOuuuuuXuuuuuuuu#u##u#u##u##u#uw#########uw#ww##u#u#uuuu#www#u##uu##w##w######uuuu#uu/6+M` R6+E88887OO#O>?OO?h?t!O!!!#!ul}l}{%hB!!Oⲝ3&B_><:<Kn<<>FF?}!x&K88֗֗֗֗֗8 AA EEEE8Ԗ((pRS5{a[ylh}۴d?dGww7777xGq£dOB3]{Hll{lh{2HtlܺHO!{c{u݀ u !!!!!!O!!Xuuuuuuuuuuu#uu#u#uu#u#u##u############w!#######u#u##w#####uu#w##w#######uu#u#u#qI 000M+ 83!7!?3OO!O.11B!#H?dBhB!uù53&G}gT<<>3>̹̹K88֗֗֗֗8EUU88s888U ( //SFhZ2[ܺ?!3&77ww77Gg>>B?B?Bh?!!H?d{!Bh?.HOu O!!!Ҁ!! BBww#Xuuuuuuuuuuuuu#uu#####uu#u#u#u###########uu##w#u###uuuu#uu#######u###w###w##uu#wwwwww!\j))))\ (ԗT!!7F!!OOO1HH1t!u Ҁ!Ow7۴dۜOHH5_g5x<<&>3?BB&d;8E88֗֗֗֗8EsEE88֗88s+s R K;K]l"l[?2ݺHdhB}7www7}}:d}3?Od?u!dahu1lt!BtuXX#..ttt.# #uuuuuuuuuuuu##u###w##u##u##uu#########w#w#w#####u#u#u###uu#ww#uu######u#u###u#####GqLLLnխ)MA+EO!]cFOOt.B2.t. !HOB!77}}H!H}5ֲYqBB3>BBŽ;zsE888֗Y֗88888֗8E++R D'p/-K;]dl?ފ$[lBBB}wwu#w7OxG}q?3̹h!B!BFFܻܵܺl!!BtO1HN!.XXXXXuuuuuuuuu#u#u#u#www####u##u##u########7w!w######u#u###wwwwww#u######u####u#uuuuuu#qxqGx:խ 0* (AE8TG}%!OO!BlH..ܴdOdBHÜ12??֗<>۹&G_5>BdH}7&-USSK8888888888YYY֗E AD'/-KKlii?.!ݹO}###wwO7Owww}&>:B{%!XOddl?? tHO!O!1i.1[} uXXuXu#Xuuuu#uu#u###w!wu#u#u##u#########www#w#uu###u##uu##ww!!!#w#u###uuu#uu###w##uwGxɑ&JQ)M0*s>!775dɹ!Oo.HܵlHOOBBhBO}liް3:KSSEs8Jxxg5d&ddBĕRR/;sE8EsEEEEss888Yֲ֗E(M'M'K?1ފ?.Hu#uwww#uwwww#wwwO}d1}B&_at!OO@[?!ttB.ii[hu XuXXuuXu##uuu##### u.!#u#u##u##uuuuuu######w#####u#uu##www##############u###u#u#w!!!77g7LI'I (S-J&77!77L>5w!!!# 22tOh?1?lH?i|{TKS-M+sz8;J<G&&gۙ3>BB>d™<R'+++AA 88YY֗8(MIM5hd22úBݜÜBGOwwww##wO!21dO7:ôt#1B!h1?11 Htu1ܜ?uuuuXuXuuuuu###u !O.t uu#uu#u#uu#w#ww#########u#uu#ww####u#########u##u##u####ww77gGwQk0M+S-O!!#&T_7#u#! .l?B!?F{@[2@%TKn'jD/ӽsTJG&GG}dBBBBd<<''MII RRR6 EE8֗8888+ 'K;5?2i?2?ÀHl۹Ow!ww#wwO#7}d&d>hOh1h 1Hiut! O#݀# uuXuXuu#u###u### X#t111t# #####u#######ww#w########uuu#####w##u#u##u#u#u#u#u#u########u7ɋ7wwɋk M'O!7GG:&77Xu?N?H?h?hdBO!BhcYH12bee''/KJ-BGG}G}G}FBBd>fIeeII' D`A s8E֗888+ MI'S;c{[?2dBxOw7}&dd}B̴O&3c%%BOHtHu !B XOH?yF܀ !!tXҀXuuuuuuuuu##!!!#!Bܜt# ######uw#####www######u##u##u#####u##uu#u#######u##uu#uu#####7wwww77\pI<<! u77}O#Xu !1l12?cBOO3y3BH!]Kj''':۹G&}۹&_Bdf\\\\\eIM (AUsEE4888s'II/K;YY_%altÜl1ùB7G&ddB!dB̌!BF!H#! !tBOXXX@?!uu!X#Xuuuuuuuuuu#!OOttH2?11!u# ####################u####uuu###u##uuu##u#u#u#u#uu##u#u#####ɋww7wwɑIU:d}# !7}!!u uO uH1y>?wX蹹!O#OX?BLL)kLLѣvj I`'` RR ٞUmЫ4E88EIє-KY[?iHÜúH}dd&}}BB!!BBd!OXHl!H?!tt1X!uXu#XuO#u#XXuuuuuuuuu##!O!tÜ# u######w####uu#########uu##uu#u##u##u##u#u#uuu#u#u###u###u###ɋɋwwɋw7/U88U:O#O#wu7!### X u!O1d!OOw#7!7!&!qfJ'/->}d&dGJY5>f&gLLLLL\\j IMp D RR CІ 8E+'/Kֲy@PtOÜl.}dd>&}GOwdBBO!dO!#?!,H!!O!u###!Ouuu###u#!O!tt!!#u#u##########u#u#u####u#u#u###u#u##########uu#uu#u##u#u##u######77ww7w77G<E8Ԗ8;#w#w#!!## O}?dB&OB̴!w!7O}q:L)LOd>>&7qd&gLqGqLLLLLLk\\jM II MS/'nƘ_Fcal.1[úl?>:3&7̹wdd}l1tH?!!h1!u#!##O#Xuu##utt݀# ########w#######u##u#uu#uu#u###u####uwuuuuuuuu##u##u######u777ɋwwG:E8Jww#uw#O#!u !d}!c]BdBw#7&wGGGLLk\L>}g}G7Jd&GGGGGGqGqqqqqqqqLL-ΕjjvvM4R'I?OB1Ü?3dT&}>>۹%B?l1! ??H!Ou!#uuX#######u##uu# HÒXX#uu### u#u##########u##uu#w##uuuuuuu#uu##u#u##u######u#u##w######uuGOGwGGsU((6ּ7Ɍ#u#!!!O݀#X!O}dhF3?BO77w777GqGqLGGGL&B۹}g>>&5>>&gGGxxxxxxGqqqq<ĕ\\vv 444ԖEӔ'nhÜBܜ!?ldFhdh3d]FB1[21dhhO OOOic?########u#w#u݀H22?11t u###uu#########w####u#u##w#w#u#u#u#uuu#u##u##u#u#u##u######u#####w7}>>ǹ&&7:;3&&G쑑xxxxxxxGxx<<5Y]FF#h3!B?llܜO#?!BHX#uu###u#uuuu#X#!OHt?1H!!########################wwww##uuuuu#uu##u##u######u##u###w####u##7wG>}x7G:/I0 RS狋77!!u!O!H#!#O}BBù!!!! !#w7777777GG}}&]:G}&}xGxxGxxxxqgqgf^ve'p AEԖEEMn_Yd}?H!}BO&uO?B!O}l?{{{l!!t!d{XuuOwuuXXXXuuuuu#u#X#!HHH12H! u!!#######u######w####u#########uuuuu#uu##u###u###u#u#u##############w7Gwww7ɋ7x)L77&d!!!#!!!!!!B..o.t21O#77w####wwO77777x}}gG<&G}777xxxGGxGxqqLKKzsEs s88֗+II'n-ֲYdOHHݺݺ}}G>&7G?!!dB?%FO11꓀ XX#!uXuuXXXXXXXu###OtOOHt1t ! uXuu#!##################u#uu#u#u#uu#uu#u#u##uu#u#u##u##u##uw##########&G}G!}>>uW7L&7Oֲ5F7##uu#w!Üú!Ò1P1P2?2H7##wuwwwww777w777}}}}!x&GG777x7xxxGqG쑑qGqfSS6A+ԖsY֗+ M'K_h#1!ݺ}L>&hBlddHOd1w#dHH!u u###uuuuXuuXuuuuu!!O!!OtOtH1Hu!u!##!################u##u#uu#u##u#uuuuuuu#u###u#u##u#uu############77Gɋ7777}#!7Y#!!uu##B!ݺ12?2PP2hdOu7www7uuw##7}Ox!wwww}>BOwGGG&&G77xxxq)L)qGxxxxڟRR448֗֗8MMDIJT5]]񹹹O}B}}G<]3%d???ld?OÀO2B1XXu uuuu uuuuuuuXXuu!!OOݺHHHttOOX##XX###################u####u#uuuuuuuuu#u##uu##u##u###########!¯wwxNjw#!wx888c#O!#u!uݺÒ2111l2BBwO!!ww}wx}w#!###ww!7ww}BɑGG&GGxx󭭭)խGqxxxxx7xqq\\M(888888888Es8MMM ':]_n^nfq7}d>&GGJ3&dcBOBHB!?{aX݀!OHܜ !O!#uXXXuu!#XuO !H2!!#!O!#!#!O!####uu u###w###u#u#uu#u#uu#uu##u#u#u#uu####################O}7>#w77##LL)\)kxxxx7xx77GG)M RAA~6MMMJTKSzgqG&>G&&>&7wyH??#X[tX tuH#Xu u u!!#uuuuu#u!!!!OOHlú!###!!##O!###############u#u#u#u##u#u#u##uu#u#u#u#u####################!}}>}}GwwW7XJ-SAF&u###uuuuXXXXut.OO}}3www7#wG>!B}!!u#!w!777&ggg&&>>>>g><\))kqxxxxɑ)\jM' ӧRRD C MRURIID/;8EULq7&>>dGGGGd>d&7dld!}hlB2À!XҀ!H u!##uX#w#u##u!!t݀tiOO!O###!OOO耀#u#########u###u##u##u#u#uu##u#u#u#u#####################Bd}}O##7#B33s Ap';X#XuuuXuX!úwBB}B:>Lq7&77u!}Xu#ww!7!>&&g&™d77ÜlFlh?{?3XXX!XXX!##!u !uuu##耀Hllhl!#O!!!OO!!!!!!u############u#u##u##u#u#u#u#u#u#u#u#u###################Bugd]dxwww7W#!!B5_;KSII&w#!u#u##}Oݺ!!!7&gdn>q<!#uwuu!###!7g>dggg&&]:J;;;SM ך))7xGgL\\\\ pzzb^ppE8(ADILgGwwGT]F#7!B?BBh!cXuuXuuu!u uXu!u##u#Ott!.11?lP !HH!H1BHtO!#!!7##########u##u##u##u#u#u#u#u#u#u#u#u#################u#!d}!}}BG#u777dOBF]K/'\f<}uu!uu#!ݺ.G}̹&;<n:¹#!ݺO!w!!dJL&gƝ֗Y֗8s+RM0))xxxG}gggqqk\I IbKbpppDUA(rCMjkkkGxw]TB>?tuH!ݹ!h}uwX#XuXuuuuuXX#O!!#u#!tHOH11t2!Pu!!tt! #!!O####w#####u##u##u###u#u#u#u#u#u#u#uu##################w!!Bh}!BBG#7BF]hdh<\G#u###!t?ihltd<Ks<&>G!!wO}!B}w!&>™J>&&gGgd֗֗֗8EE R j0 )xxGGGGxxxxq))eI IM'^bDCC6`(CvkLk}x7G>d3B>h?d!dhBt?BO#X}XuXXX##u#uX !!O#!!!uu.tt111.,X.tott.!.tH2꺀 #!!!!u##uu#######u#u#u#uu#u#u#u#u#u#u#u#uw##################ی}>w#77c%d>&\7Gd###!!!tH1?[N5J>d5cϜ7Yh?!!d7#Xw###!O#u uw!!# 耀!t12t2.o.tHttHH.!t !!!##!!##u########u#u##uu##u#u#u#u#u#u#u#u#u###############u#!##B}}O#3YY&GGw&}#u## tP2PNi2233YY5Kss<&GOuB}?}}>K3>G>n:nK8֗8s/')kGqqxxw7xxxfDMRpRpCCDm8ԧ`CȮ )qgq}g&>wdd?F1?O#O!!uuuuu!##݀u݀##!!Oݺ1HÒ.t.tt.HHHt!! !!!##!!!##uuw#uuuuuu#uu#uuu#u#u#u#u#u#u#u#uw####u#uuu#u#######!##!B&w7}d{O777Gɋ##̹w ݒ2P.to.l?yY_YY֗KT--K/S&G&d&]3}dB}Bg>T:>:::-E s8֗֗֗8s^kkqqxx7xGqkDC6+CrDD8U* kkqqŽg>>ۓBha{yXOh!O!OuX!!uuuuuu#w!w##!! #1Ott.....O.OH.!݀####uuuu###!####uuu#uu#uuuu#u#uu#u#uu#u#u######u##u#u#####!OOO!!}d3d&7B&dBB7#w7#u!w#uOHt.tPH.Hd]Y֗֗֗֗;^ڣJL>>d:T5YF?>B7}}&&uuOXuuuuwwuu!B1H111ܜBB֗88sE88888E88-G<3֗;:gBB!}B&dg><''IIIIM6SEs888888)Lqxqk'RR6 88sEm~(eekfK:g™:3u?HBXd # O##uuu!uu!#!X Ou!!#u!!!O!u!!!!# ###!####u#u#uuuuuu#uuuu#u#u#u#u#u#u#u##########w#ww#݀O!!!OBùuO!O#uX##XXuu#w!w!#tOtOOÜds888s+ +68KJ&&8U5>}}}B>™ggg\<eџŞ+E8888Enqxqq)j/ 88U(~**vvvkkffnnfg%!wOOBOd!#X#X#uXuuuuu!##w!!#u#uu!ww##u##u!!!O!!u#!!!!!###!!!!!!!###uuu#uwuuuuuuu#u#u#u#u#u#u#u#u#u######w#w#w#!!tHHOO!!u#!##G7##XuXX##Xuuuuw!!w!#!#XO}&+R p֗>J֗SKB}Bgkk0jCR 'UEUEEsE8nGgkkvIIٿC8Esrr*vv qkenļƝyO!dB#!B! #X#u#uu#uu#u#!# uXu###uXw#u!!w!#u!!!!##!!!OOOOOO!!!uu#u##u###uuuu#uuuu#u#u#u#u#u#u#u##u####w##w#wttH22!?O#OG7#7#XXuuu####w# uX#X&>: Ij' M j\I-T-''J>}}}JG}GGLLfgqGkj'M00'''R+8KLfkkkj8DRR֗r~~`ͩ`(Cv\fd<<>gGGGGGGGqxxxqGLLL)jIMUD 88Se \jDmA` Ԩ=~̓vvkffn>7w,iOu#XXuuuuuu#u##uuuuuuuuuuu#uu#w!wuuuXuX##uu#w7!!u### !!!1HtH!OuuuXuu#u###uu#u#u#u#u#u##uu#####u#u#w####u#!!tto1[!!!#X#!!O!#uu#uuu#!!!ݹ}Bd>>gB>>d>}>dJqGxGGGGGqGGxxGL\j 'M+ 'ڔU*`4VEԖ9ʈ qkfļ¹OuXҀw#uuuuuuuuuu#uuuuuu#u#uuu#uuuuuuuuuuuXuu#####uuuu## # uOOH1Oݹ!O!!!ww#u##u#u###u##u#u#u#u#u##u#uuuuuuuuuw!!Ht11!uu##Xu#!OOOO!O!#XuuuHH!!#!H>dd<>GxxqLL\G}GwxGG>n6EBGGqqGGGGxGqxG)\\M6E R+UU/I ' *(﨨VU4ʈ\qqfnfff>}X݀Xuuuuuuuuuuu#u##u#uu#uuuu##uuuuuXuXuuuuuuu##uuuu#u#uu#!!OHHHHOH!O!!!####uu#uu##u#u##u#u##u#u#u#u ###uu # uw##!O1H.1tltO#!!O!OOO!!OO!!耀#XXXXXu#!t!#!!!O33&&G77xgL۹7>dG}}g<'/S8533]g&gGGx7xGGGGL\\\՚I ` 8/I ڦD`VVV4E qkļfGL7w#}uX#XuuuXuuuuuuuu#u###u#uuuuuuuuuuuuuuuuuuuuuuuuuuXuuuuuuu#u##!OBOO!##!!##uuuu#u#u##u##u####u#u#u##u##u#u#uu##!l12.t1t1!!!!!!!OOOt!!!! u##.t!!!OBB3GG77GGx>g}g}gG<&&&}L\I688_YֲY:JJnLLqqqqkLLkL)))՚MM `R8+Mj j`*V4VАԐrCkqxk™fqxgww7w#uwXuuu#uuuXu#uuuu##u##u#uuuuuuuuuuuuuXuXuuuuuuuuuuuuuuu##!!O!#XX!#!# uu #uuu##u##uu#u##uu#u#uu#u# u###!!OÜt.P$?BHtO!#!#O!uOH1H!tX#!t.H...P1tH3d>>d7>f:-'<w}ddX}gLI/sY_ֲ__5T:™Jn::Ƙ<qqg£xwGw####uXuu#uuuuuuu##u#uuu#uu#u#uuuuu#uuuu#uuuuuuuuuuuuuuuuu##uuuuuu##w#####uuuuu####uuuuuu#uuuu#wu##u#u#u######u#u u!Hut1?11"@[yHtO!! O!HHtt! 1HH1?..tP2iy]3>G77&ѕ!}Bdu'+E-_cF::-TK<<<<'<\L\<Q)0' 888UpICM `~~ 4444U =(Cbfggggf:7uuuXuuuuuuuu##u#uu#uu#uuuuuuu#u##u#uuuuuuuuuuuuuuuuu#u##uuuu#u#uuuu u#uuuuu##u#u#u###uu#uu#####u###u#u######u###u#!!!#݀1Ht. Hl!FHtOO!!###!OHBdl꒒1?cط2..2h@y55:>GG&SS-J&ddBw}gggfJ:-TJ>£ggL-3F!OX!۹>;YYYYYY֗588sSESssS<<SK8888sK \v++U Dbpp`( s884=9`C\kxxx7wO}!݀ u###uu##uuuu#u###uu#uuu#uuuuuu#u##uuuuuuuu#u#uuuu##w#uuuuuuuuuuuuuuuXuXuuɌuuuuuuuu#####w##uu##u##u#u######u#!!w!OO#!!#ݓ12l2!3ִ!HBH1HH!!OOO!!!!#t#OHH1l+SԗLg<-<>&q<:&d>3>5Fݹ}7R88E8zgGx:<<<<&T3]]!OB۹>KY֗K//+UU''/:D psEԗ88bfkL)jє8U'+UCCmr~~U44=99CfqqGx!1t .7#uuu#uuuuuu##uuu#uuu#uuuu#uuuuuu#uuuuuuuuu###ww!wu#uu#uuuuuuuuuXuuuuuuuuuuu#####uuuuuuuuuuuu#u###u#u## #uu!!!O!XOÀ 1@@[%BOB!O!!!t!!݀####OG}\'jM+C+<>'-;}&gT3d>d<۹}77T֗8Ӕ/+URpM'b+I<<eID C6888se\fL)ej88+C(rrrrmr 4=rCDekgqggxqx7#OHt茌uu#uuuuuuuu#uu#u#uuuuuuuuuuuu#u#u#uu#u#uuuu#u#uu###wwwu#uuuuuuuuuuuuuuuuuuuuuuuuuuu#######uuuuuuuuuuuu#u###u#u####uuuu!OB!# u..["?ty#{!!t!t!!!#!!O!#O7G}GLk\\' ';G}qգ>J:3__F]ddT5_d3d}!}<;֗Y-ΔS6 I'SI\jIDM UEeevj/E86EECrr~m 44V=r9ʈʈDCpkgqxqq&&!HoHl!w#uu#uuuuuuuuu###uu#u#u#uuu#u#uuuu#uuuuu#u#uuu#u######uuuuuu#uuuuuuuuuuuu#uuuuuu#u#####uuuuu#uuuu#u#u###uu#u#uuuݹwX##!Xuñ@$?2@OOlBH1tO!!!#OOO!#wuw!7q)\\/''I:ƙ&G}Lq>gd}}TT5֗֗88S/R6++Mj^ES'ffkj M`6ED+/88p'+~44ʈp^gqkqkqGOO l#!!u#uu#u#u#uu#uuu#uuuuuuuu#uuuuuuuu#uuuuuuuu#u#u##uuu#uuuuuuuu#uuuuuuuuuuuuu####uuu######u#uu#uuuuuuu#u###u#uu##uuu!u!#!XX.t.[y2chOy#HlH1t##?3ϴO!#!!uwGqL'<J&G&dLf)Jg}}G}۝:™J:F&!&}dB__;K֗֗88E// 6EU \eEk\\ 0 *MEs/'jڕ+E6E'MU8 ٧rr ~4=Ȥpzfffkq&!!!l!!uuuu#uuuu#uu#u#uuuuuu#uu#uuuuuu#uuuuuuuuuuu#uuuuu#u#u#uuuuuuuuuuuuuuw##uu##u#uuuu#uuuuuuuuu#uu#u#u####u##u!wOO!!!H2to.Py2l2l?Ҋ@2?#OH1HtBHl%F3BBOHO!!ww77GG-:GgL;SJd&F⻎&B]]3::];֗֗888EEU+' '6I\vK'\LLgkLLLfך) ++ e\e6++''I8EEU~mR 444VrMpz^eek&&1H!X##u#uuuu#uuu#u#uuuuuu#uuu#uuuu#uuuuuuuuuu#uuuuu#uuuuuuuuuu#uuuu#uuuuuuu#u#u#u#u####uu#uuu#u###uuuuuuuuuu#u####u###u#!!!O2#.h coN?P.!#HtBlcH#wu##7w7Gq<g}gg^8Kg77d><GdFT8EUUUA6 IM'\\\LLqLqqqL\0j'p))/s/p'8888~( 4V~(bpp^z8zz^e\fgBB1t##u#u#uu####uuuuuuu#uu#uuuuu#u#u#uuu#uu#uuuuuuu#u#uuuuuuuu#uuuuuuuuuuuu##uuuu##u#u#uuu#uuuuuuuuu#uu##u########u# O1BÜ1l1?.?Niܺ!O3]YYYYYa?!##w!wG<:n&-;zK:::gd}}>:JYd»֗8E88sU US++M)))LLe)GGGGf\)ѕIխG6E8 /6DsEUԿ C44VVV~pee^^^ڟ\v}}BHO!u#uuuuu#uuuuuuuuuu#uu#uuuuu#uuu#uuu#uu#uu#u#uuu##uuuuuuuu#u#u#uuuuuuuuu#u#uuuuu#u##uuuu#uuuuuuuuuuu#u####w###݀u!.ݜ1P.?iauOXBTYֲ%yú!w!777&&<&ggJ^֗T:>]:J:<>5ֲ3Bd]8sUE ++s /'I)LqGxxxq))\Jqxxqq\IDR/p8EEECp44VVVDppbeee^ڟڣG<&&gn8ngd:3_>G33?35Y55;sUU+UEUӕ\LxGxx77xxL£qGGLqGx7xG'ٞŞ88 6 Ԗ4V=D^efeę}BOX##uuu#u#uuu##u#u#uu##uu#uuu#u#uuu#uuu#uuu#u##uuuuuuu##u#uuuu#uuuuuuuuu#uuu#u#u#uuuuuuuuuuuu#u#u#u#u#u#u#u#u#w!ww!!X.t .P?lihOB]Fcù!<{@h13BÀ#!}&>>:<<--<:n;>GBGBOdd]];UU++R+Uӕ777777ɑxqffLxGqG}qx777w77xjEԗUb'sb'DA6 44=rCDDevkkevv>wX!X#Xu#uuuu#uuu####u#u#uu##u#u#uu#uuuuuu#u#uuuuuuuuuuu#uuu#u#uu#uuuu#uuuuu#uuu#uuuuuuuuuuuuuuu#u#u#u#u#u#u#uu#ww!!!X.úHlPtPP.{?!BdYY!!B>>Tӕ:F?2Ü}wwB&&&&GGgfJ<;77!#?KSSK+6// S88qxww7w777xqqqgqxxxxGxxx7777777xE8sD'bIDſ 4444Р`^^eev\kkff}wXuXuuu#uuu#uu#u######u#u##u#uuuu#uuuuuuuuu##uu#uuuuuuu##uu#uuuuuu#u#uuuuu#uuuu#u####u#uu#uuuuuu#u#u#u#u#u#u#u#u#wwO!#@PPd%@Y۴Fdd]F&>d<>d:-+/Δ'6Sdc_F>Bg<<'Jex7ww###w77x7Ɍu77xxx777eDUjIM pRr~ meee^ğekfkɌuXX Xuuuuuu#uu#u#u####uuu###u#u##u#u#uu#uu#uu#u#uu#uuuuuuuuuuuu#uu#u#uuuuuuuu#uuuu#uuu##uuuuuu#####u#u#u#u#u#u#u#u##### H1i..oNܶlBlYyBwd_T;;L)';1HBBBBϴ&&L&<-<<>̹}O#?BgBgGg\ģf)\LqG77###uu#ww77w77xGGGxxxxGL\kvvvvIڟΞDRmmErrrppvڟbDD^kkq7##XX#uu#uuuuuuu#u#uwu#u#u###uuuuuuuu#uu#uu###u#uuuuuu#uu##uu#uu#uu#uuuuuuuu#uu#u#u#uuuuuu#u#u#u#u#u#u#uuuuuuu#uu耀uil މ2l[1d?Odd3daK8K\-Y]BB%cl??lh%]gL:TT:LgL-&f>q}GqqqgLfBOh>-JqfۙfGL:-<>ۀ!BB}}}}}&qGGxxGGGGqGqLL<<w7w##uu###uww##ww7uxg<ęLxGL:KLkLf<ģDpDb A(DCpDȤpmCٟf7uuuuuw#uuu#uwwuwwu##uu####uu#u#uuuuu#uuu#u#u##u####uu#uuuuuuuu#uuu#uuuuu#u#uu#uuuuuu#u#uu#uu#uu#uu#u#u#########u#!!112N|" Z 1[{iy2@B?cFcGJ-<S-TOhlBSS+eeqLGLLLJJJ:O}}}7G7GG}GGxxxxxxGGGqqqfffqx77#u##uuuu#uu#w7w7xg£x>7}B1x!!!!7!x77!777wwww77wx7xxxGqgqqqGx7wuuuuuuuu#wwwq}qqqLqqgfGGLfLLnnğnn^DpDDpDbDppeٔڣkuuuuuuu#uu#uuuuuuuuu###uuuuu#uuuuu#uuu#uu#u##u#u#u#uuuuuuu#u#u#uuu#u#u#uuuuuuu#u#uuuuuu#uuuuuuu#u#u##uw###### P2i|2PHlNH[yF?lFydy?}77GGGggJf'Jl?B&dJ'/ 8USSJ&G&&d}Bd?ù7!7!w77w7w7wwwww#wwwx7xgggLqxxwww#uuuuuuu#ww#w77xgge>fLqۑxkgfĎƽn^^bzbpDpDDpbpşCqwwuuu#uw#uuuuuuuuuuuu##uuuuu#uuuu#uuuuuu#u#u##u#uuu#u#u#uuu#uuuuuu#uuuuuuuuu#u#u#u#uuuu#u#u#u#u##### # ݺPP[i[2ill@{F@h?dBh3Bl{1GG۹77G77gxqxqLJ]?hOJ UsJ&ۙJ7:BG!Bl?}!!w##wwww777wwww###www7wxxGggGw7##uuu#www7www777xgLJļ:gLqGxxqqJ^ef^^bpppDDDڟDpegɌuuuuuu#uuuuuuu#uuuuuuu##uuXuuuuu#uuuuu#u#u#u###u#uuuuuuu#uuuuu#uu#uuuuuuuuuu#uuuuu#u##uuu#u#uuu#u#u##u#### ..PPP1Pi?@1{l?cdBdd⻝{y{#l?:G7wxxxqxLxG:Y3d3lOOI++s7™&wO}}w#w#wu#wwwwwwwwww##7!xxq}x}ww77Gc33Blh?BO}&L\I'R /K:7>>dBddB}BúOw##wwu###wwwwwwwwwwww77GgBBBBùw##w##u#####w##wwwwwwww7xxGgL)\j<ddd>B!X1BHO7w#u##wwuuuuuuuuuu##w7ww7xG}fqGGxx77777wxɑx7www77GGGLLf<^K;nxggxG7xxgĎfƥzzsmpDp٧DCDDI\Xuuuuuuuuuuuuuuuuuuuuu#u#uuu#uuuuuuuuu#uu#uu#uuu#uu#uuuuu#uuuuuuuuu#uuuuuuuuu#u#u#u#u#u###u###u######݀122N22|"1@߷cc!d!B&>J:]w!Ow!}۹7G&d&Bd]d}}ggqG)Bd&>B!!#tBBO!ww##w#Xuuuu#wwwww7xxGg}xxx7x7x7777xxLgGw!7gLkk8zzCDppCpbCDCDII#uXuuuuuuuuuuuuu#u##u#uuuu#uuuuuuu#uuu#uu#uu#uuuuuuuuu#uuu#uuu#uuuuu#u#u#uu#uuuuu#u##u#u##u##uu#### 1Pl.P[[Hc}d#B!}B#Jƕ:Y37O?hG<G}GGGOB<>d}ú.ldB!7ww#w#w#w###uuu#u#ww#w77xqxGx7777777G<Gxxxe!OB>>&>7}B112?l}O777www7www!wwww#w#wuw7xGqG}G777ɑJGGGGqg<Jqգnn}GGG}g£^zƝzzKbſCȾDDڔёwuuuuuuuuuuuuuuuu####u#uuuuuuuuuuu#uuu#uuuuuuu#uuuuuuu#uuuu#uuu#uuuuuu#uuuuuu#uuuu#uuu#u##u#u##u##w!!PP1PP..o1?Üllldh??@B#h{?uX<ՕK:T:dtdB?hG>>¼™BgdGx77q_:>GOOOBd&G&OBB.BB7!ww#wwwwww##w######uw#777Gq}q}77777x>dHB??[2?dB}}}7wu####ww#ɋ##7x7}G}xgwx7xgJ-K/GqGg/S6L^f>7}q£n^bDpCM(mppppM'Q# uuuuuuuuXuuuuuuu#####uu###uuuuuuuuu#uu#uuuuuuuuuuuuu#uuu#uuuuuuuuuuuu#uu#u#uu#u#uuu####u##w##u#! !H1.1t"ii??úl11!!ùh{!?Ou#tX>&OBHBBO>&™q}Fnwd}ddddOhl21dlddB}7wwwuuwww#wwwwww#w7!x}}G7xwx77xG-'qxq:SES/'q}F:g7uBBddddO#lll1ldd̹7!#uuwuuw#uwwwɋw7g>GG}xw7w7xLqqLnzE /qļng}}}}Ogfgfb^nDbDDCCbpppCC Qu uu#uuuuuuuu#u#uu#uu#u#u#uuuu#u#uuuuuuu#uuu#u#uuu####uu#uu#uu#u#u#u#uuuuuuuuuuu#uu#uuuuu#uuuuu##uu!OO.݀ttt1thla1d1}X!OBBl?1?x77&G̹BBB!G&7G7TxBBd<GwwB&BO!1dlldBxOwuu#www#u#www7w7!OgBg}gO}w7xxGfSS++/qLJ:g}}}ggfgļ^ģbDmspDpCDC`D X##u#u#uuuuu#u#uu#u#uu#uu#u#uuuu#u#u#uu#u#uuuuuuu##uuuuu#uuuu#uuuuuuuu#uuuuuuuuuuu#uu#uuuu##u#!OOtOÒt܊P11P?i[Ü?HB?{{HHBl21iyy{l!?t&xGG7OOBdHBOOO&B&7g}d>}xu!!OBOO1꺺2dB}}O!w###w#w#w7wwwx7w7>}&}777GqJI)Lļ 'Jfƥ^nğepbDpspCMC((Q# Xu#u#uuuuuuuuuuuu#uu#uu#u#uuu#u#uuu#uu#uuuuuu#uuuu#uuuuuuuuuuuuuu#u#uuuuuuu#u#u#u#u#uuuuuuuu#uu##!OOHHtH?{޵t.l2ݷ1BÀuHt?i1 ú1ii@a2x7۹O#d33]TJ>Fh&>w躹#!!OBd&OOHHÜ2B}}}!wuu##wwwww77777#7GdFFg}xG™ļƼeڟbmDmUmDCruu uuuuu#uuuuuu#uuuu#uuuuuuu#uuuuuuuuuuuu#uu#uuuuu##uuuuuu#uuuuu#uu#u#u#u#uu#uu#uu#uu####u###!Ot??ttt11H2Ni@[2 ݵ!ݺ2l1ii?رylu?@&F&OOdHtd&>_&>3d>F۹۴?O!OO!B!BO!tÜ1BBۺO!O}ww!wwwww7w7777cFc3}qg<<<///J<dhHd>5:>dd&g]}Bd!#!OBBHHÜ}}}}!7!!}}}}7wwwwww7OGG۹>335F5%3d>}7GgJ<:n/I''I<<<G}g}G7#uw!x}f¼eeebٞMC*`=rCXu#uu#uuuXuuuuuu#uu#u#uu#u#uuu#uu#uuuuuuuuuuuuuuu###u#u#u#u#u#uuu#uuuuuu#uuuuuuuuuu#uuw##w##!!!!Ot#!!!l12tiH1i2 l??ltlP2ilܒ?l2{2۹BBÜ1BtHBOd>:333B}}dwÜO#}BBBÜÜB}!w!!}}}B7۹77۹}۹35}xGf<KJ-K'I>>>}7G}}x!u7OGg™nnefDDٞpr==Muu#uuuuuuuuuu#u#uu#uuu#u#uu#uuuuuuuuuuuuuuuu#uuu#uuuuuu#u#uuuuuuuuuuuuuu#uuu#u#u#u#u##u#u#uu#u##OOOOtH!X݀݀.2HtXܷ.1l1ill?@@{@[ic%t@!B#l1l]]>d3Fdd3BhuBBul?H&O!B1O}}w!}}}BBggg>w&&&d3]gGGgTKK/K&g&Gwwwww##u##77}zeev\bpDCCpCp``(~=peG#uuuuuuuuuuuuuuu#uu#uu#uu#uuu#uuuuuuuu#u#uuuuu#u#uu#u#u#uu#u#uuuuuuuu#u#uu#uu#u##u#u##u##u#uu#u#####!!O!!!#tH!1HÒlúlHtli!!?ilN?aN÷ht.ldBBBdl1HtB33:dώ»BB!BO?OuݺÜBBBB!!}Bú}}OO}}}&}B}d۹dddqGgg<-sΕSΕ<>}Oww##uuu7nƥƼĎbppppDCrr 4rfwXuu#u#uuuuuuuuu#uuuuu#uu#uu#uuuuuuuuuuu#u#uu#u#uuu#uu#uuuuuuuuuuuu#uuuu##u#u###u##u##u##u#u####u##!OH!.t຺݀.݀.l2Ü1??ܷ@[iNܜַ!lB?h1??BB3>d?}B}}&>!Xtݜh1lB̹O}BB1BB}O7ۜOwOB!۹7x}۹3333dTdg}Gqq<:-S/'-ΕB&!Owuuuu7&nnƼnğ^pDCppDCRrmrrrr6^guuuuuuu#u#u#uu#uu#uu#uuuuuu#uu#uuuu#uuuu#u##uuuuuuuuuuuuuuu#uuuu#uuuuuuuuu#u#u###u##u#u##u##u#uuuu#!!O!,耀Ü1Hݜt.212?y1[Ü2ÜllÀ?BB?hhúH1B?%d<&}۹}B}}B?Bݺ!lh??BddBO!!Ü?dB}}}!!}!}dB!}&>55_5gggJnKK--Ӕ '//nJ>BB}7Ouuuu#uĎn^bnğģe^ڤDDDm m~rrquu#uuuuuuu#uu#uuuu#uuuu#uuuuuuuuuuuu#uuuuuuuu#uuuuuuuu#uuuu#uuuu#uuu#u##u#u##u#u#u#####u#u##!!!##?tO!! HݜN@i2i.$N1#÷{?{y1#,tlltd??l1?]>&&&>}B?B}O7B!OÀHOH1BO7!Od??}}&?BùBBG}}>dh3}gqgJK;KK-ӔΔ''nn:>B!O!wuu#uuX#nb^ğğڟDDppCpm mmpDʪruuuuuuu#uu#uuuuuuu#uu#u#uuuuu#uuuuuuuu##uuuu#uu#uuuuuuuu#u#uuu#uu#uu#uuuuuuu#u##u###u#uu#u##u###### ##!u !X!! .tҺH1??H[@ܒi!O?{1OHt??hOdlddld>Gd}B!!!#!1@!ݺ!}O!!O!OÜddldB}B?d]hh]}7w7w}B33::g}w#!O!#XX#xn^^ڟğpbbmbDmCCC96Q7uu#u#uuuuu#uuuu#uuuuuuu#u#uuuuuuuuu#uu#uuu#u#u#u#uuuu#uu##uu#u#u#u#u#uuuu##uu#u####u######!u#u#! ld?l?.N2Hi[@߷12?FBOBBh{l{hhl?3?F?d&&dddy:/EsK''<<>O!#!OO#uXu##!BzzDpDpDȟCDDpk###w#Xu#uu#uuuuuuu#uu#uuuuu#uuuuuuuuuuuuu#uuuu#u#uuuuuuuu#uuuuuu###uu#u#u#u#u##########u##!!!!!!!# X u OݵH?l12?2{%%%d%Y%ܺhFlH!B?HHd}>3GJ>dBdlHO!XX!!OBHO}O#!!#!OBBd??dHOH#B}g3O7O>7>w&}h_YnsEs''ę<<!u####w7zŞUbe^ڤvC((C`pfɌX u #uu##uuu#uuuuuuuuuuuuuuuuuu#u#uu#uu#uuuuuuuuuuuuuuu#u#u#uuu#u####u#u#u#u#########u!!!!u!!!O!HOHo..,N1a{hayh?hYyHhH?Ht1gg>&O!}B!!dO!OB&!#!O!O}}}dd3?B!t]w!&d>F^SbI>B!u!X#wdsRbCpDDCCCRٟɋXXu uuu#uuuuuu#u#uuuuuuuuuuuuuuuuuuuuuuuu#uu#uuuuuuu#uuuu#uu#uu##u##u#uuu#u#u###########w!!!!##u uu!tBܜNiZ@i?iFBOFB?OÀH!OtlyB7]3FFd}wg&<&ܹ#X#}Bú!!Bܻ?tOOO###!O}!Où!BF3??H!hdwB3?O!7Od>>dd:3:'/џ:>BO!!#X##!]֗8spDCebDpC(CC͡CmD #uu uuuuuuu#uuuuuuuuuuuuuuuuuuu#u#u#u#uuu#uuuuuuuuuuuuu#uu#uu##u##u##u#u#u#u###########!w! #u . Oܷ@Nl22H1!úBcÜHúd?at3OBd]d]xwG<3&d!ғ!OO!uuB?dB#!OtOO!!O!t!}B333}>]B!}OO&Bd>B>d::JnğI'ğ<I<&&BOu#uXX#7۴8ŞmbDpbDDCDpppCʩr(wuu uuuu#uuuuuu#uu#u#uuuuuuuuuuuuuuuu#uuuuuuuuu#u#u#u#u#u#uuuuuuu##u##uuu#u#u################u#!OtO1BHtH2tu 2?ݜd!úh%yOOlcFhh!!#O۴}w]]3&ϼT7Bdu#X#HOO?tB#O #!!O!!!OB}d>3]BdhF%]%?Od<>BBÀ#XX!utBtdh!OBtO##!HtOtݹBd&JY3B%húH?33&777#BBwOX X##XOBOOlOOtt1Oú}lh3d35c33B]_YB1̺OB]:ĕKĔ;'e\Ou ##u#uu#O7>zU+pmpDDDDpppțʪ=quuXu#uuuuuuu#uuuuuuuuuuuuuuuuuuuuuu#uuu#uuuuuuuu#uuuuuuuuu#uu#uu#u###u#u#uuu#u##############!utttH2?1.iNY@@d?Bc{H!!FO!]%}w}x#77!}w7GOu u#!!!XOdOtOtHHH1dtݺ2dB}B5d5BhhddY%dO!OOBd>>n-Ε<<f:TddBt!!!#####Ž;zUbmpvȾͪr~puuXu#u#uuuu##u#uuuuuuuuuuuuuuuuuuu#wu#uuu#u#uuuuuuu#uu#u###u#u##u#u##u###u#####uuuO1tݒ1111.!?[hiy@F{d?H#H?hh&Bd☎]۹7u7OO!X!uX #O!t!!HHBOHOOH!OH1B?Bd7&Y%3񻝻ۙcY%hB!HB۹}g<'/nB!O!# ###u蹹Bnzb^bDppCDȟȮȾ(r=pku#uXu#u#uuuu#uu#uuuuuuuuuuuuuuuuu#uuuuuu#u#uuuuuuuuuuuuuu#uuuu#uu##u##u#uuu#u##u###!O! !õt ܜ ذX{%?!tdB!HB1OthBHh3c&>!!7!O# u##!#!BOOHBOHOOtBB}G><:cY5]O?FY1ù?d<3nzDDCD٧DpDڟvvȈCCrpڑǹ#Xu##uuuu#u##uuuuuuuuu#uuuuuuu##uu#uuuuuuuuuuuu#u#u#u#uuu#u##uu##u#u#u#u##u#######u#!O!!112[.$a?#ii1!HHOB{Ht{??Y!>g>]F}w̌#OÜ !O#tHBHOlt!OB?hldh?Bd&dGwGGG>d!7B3&&Fyal3I''n<dBHú!OO݀!!!O3TKss'DCpmDD^DڤvțȾC*9Cq}w!###uuuu#uu#uuuuuuuuuuuuuuu##uuuuuuuuuuuuuuuu#uu#uuuuuuu##u##u#u#u#u#u#u######u#!!tt1P.2ot11iil{u1Ҁ2دOXH!BBayH2YF?cF3}ێcuuO!1t!#!#!OBOOO>B?h?B&&7GG77™{c{OB>IIen<<<<£<&G1BúO!!OBd3nn^ΞDDppDȟvvȾʾ*ʾk77X###uuuuu#u#uuuuuuuuuuuuuuuuuuuuu##uuuuu#u#u#u#uu#uuuuuuu#u#u#u#u#u#u#uuu####!!!O!OttHto22,. X O1t@1H2@l?HÀ%%hHHh?l]dd}g3F7w7u3#!HHt#!!!BH1OBBB̹BdG7>x7G7Ou#&>d}}BBBBw7uw#u##X!t!#dB?BB!OBBO!!O&}O7Bx!Gw&7&&dJf™gJ>fgO!ݺ!ݺOO!O}g£bDpDDjھvvvȾ` ȾȈuu####u#uuuuuuuuuuuuuuuuuuuuuuu#7u#uu#uuuu#uuuuuuu#uuuu#u###u##u##uu##u######OO## ?.ot.1tt.!X?O?FBlyylHlFllhBycùwww777O!w#u#!!!#XX!!tH.t!Bdddh3HOOùO!O7!!7OO}!OB?B3dddd?]c:gff>f&>B.BHÜ.tttg>ff£bbpMevvevv Ȥʾ*țʦv}## uu#uuuu#uuuuuuuuuuuuu###uuuwuuuuu#uuuuuu#uu#uuuuuu##u##u##w#uu###O## .1iZP1ll[t{hHlH관dtO!cc]}>#uuw!!!##!!!!!##uO!!tHH1BBBBBddBHOOO칹!OO!7!OO!#O!Hdh?cG!O!?Bd:-J'//<gggg&&BB̹!!ÒliiNNPP11ù۝^ťmpv vv ʦ``ʂʡ9u&w u uu#uuuuuuuuuuuuuuuuuuuuuw#uu##u#u#uu#uuuuuuuu#uuuuuuuu#u#uu###uu#!!!! #!###!H .oP2X!1ܷ[?hy!!??#l{FFFB3FFF#uuw#!tO!!!u#OOt11tttOBBOHBO!OO7OOO!7!!7!!O!!]]3d]5dBdddd™;-JngGqL>>>g}}}ù݀uݺ2PH1ęe^bbD kk v v`ʡʦǹ7# uuuuuuuuuuuuuuuuuuuuuuuu###uu#uuuuuu#uuu#u#uuuuuu#u####u#u###X##!#u#t11i?.XlltX.aï{{h?1t!??1c%?d}_YF_w##w!!!!Bt!#!!B?HO1BOBO!!O!O1tO!!!OOOO!!OO#d{hd_d}!}?h>dѕ'<<q7GGG&&۹GO H...o..ÜffK;<<<>g}7Gw7wwO!w##!!.tP21HBgkqe^DDDCțv vȾ```eɹwu Xu#wu#uuuuuuuuuuuu#u#u###u#uuu#uuuu#u#uuuuuu#uuu#uuu#u##u#uu#u#!!O!u !!# #t1tt?11?.!?c1?lHa!@dlh[H?dBO>3d_3>w!!!!!!݀!!ݹtO!OHt#HB!OtOH1.Ht.ttHdFOOd?3]33B>>J5KJ<>777777w##wwuu#!ݺH޵|21ú}g£eDCCpCțȾ``ͦ͡uw苋uuuuuww#uuuuuuuuuuu#uu#u#uu##uu###uu#uuuu#uuuu#u#uu#u#u#u##u##u#uw!OO! ##!!#u #tܵ?t1?Hi?XO2iyH?u??iH1y?dHhcww!O!!O!!u# Ҁ!OtX!!#!d21tttH1!Htt2??hl[{%B}>5JGd?}Bf>>7ww7wuuu!!Ò1PNP1}BqfٞRRp(pC```X# ##uuuuuuuuuuu###u#u###u###u#uuuuuuuuu#uuuuuu#uuuuu##u#u#u#uu#!!!!!!!uutHH1tH ܜH#!Üܺlh?l!B@%aaܴ1cccddx7x&7O!#!OOO! # !tOtҀOOOO!ttHHtt2tHl[@@hhiFcYdddd77BBBBdggtݜldܺO݀!!###ݺ.O!H1H.OOOttO.122liNli?ic%%%Fh3T}73O!!}<-fg<g<>O7uXXuu!OOOtttP1H}}gffveDCpC``ͩͩͩͩ(e7u#싌#Xu#Ɍuuu###uuuu#uu##u#uuuu#uu#u#uuuu#uuu#uu#uu#uuu#uuu####u!!ݺOt!!####! OÜH!1HHt!?t OlܵB@ܷ%BB?FFFd>d7ۯ!lú!!###!!!!!!!tHt!!!OtÜ2N?Nl3]F5>d3:7O>B}BTgJ<::&OXXXXu#OO!Otttt111B}GgeeDpbCʡͩͩ̈́peu#GwXuXnj##u##X#uu#uuu###u#u#uuu#uu#uuuuuuuuuuu#uuuuuu#uuuuuuu####݀!O!#!Hݜú!HOtOúOHlt!݀ÀO!O1?dh3%yY&]]7ݜtO!!!!#u###!Ot.H1d܀!!OtOO.1ܜd>>?d>>>&OO7OOO3d&<Bqg>>gg>ێ7O!깺2hdB!BŽfn:<J:}uXuu!OOO!!!OOOttt.t}}qfŸDpp((ͩͩͩͩͩͩ̈́͠k#茋XuXB#uuuu#uuuuuu#####u#uuuuu#uuuuu#uuuuu#u#uuuuuuuuuuuu#uuu##w!ݺú!#w#ww#ݺÜtB.t2NloH.?llHHh?li#2{c{B}BF11lܜÀ!uu#!##uu## #ݹH?tOBBBHB1}}ώ>}g>dxOB21Bd۹g>f<™3B7BÎ11 ! uuuuuXuuu!OH1t11iHOOOÜ1Ü&<ƙB>d&d}}>&5:<&d]¹!OOHݜ&3ggfnq&&BBHOtOHBOOOO!OOO!wx}ŸMr`ͩ999w7wg}u#uuXuuuu####u##u#uwuuwuu###u###uuu#u#uuuuuuwO#!!O!!!##uuu#!#!## !.oH1.i?H[Ohi!2HBh!}7#7w?Ü!}!úXXuu茓X!HÜ2ܶ.OO#d&&d&3?h]::g!}dlB12}HdBdqGL><<£nI;<>d}OO!!!!!OHOO!!!!!w!xfDM*rrͩ9ͳCJ7uOuxuw#77uuuuu##u#uu#uu#u##u#u#wuuuuuwu###u##uuuuuu#u##!w!!!!!w###u#u##w!HOu##O!݀"t.1!.X1dO?H!1BHdh}Bd!ۺu!d?hO̜1B2.!XXXu##ܜܜ11HHH!Od!&BB>&lldd&::L۹#}Bhhld>qwgGxq£J-T:3t!OOO!!!!O###w7}gğDDM**揸`ͩͳ99`p7#Ɍw7uۙuw#uuw###u##u###u#u#u#uw#uu#wu##uuuuuuuu u#wO!!!ww##uu###!!!X##!̜HPN?1.1 !lh[%{{Yc2?@@dw#Bd]Bdܴ???!1Bltu# ##!!ÜH!.1H??lO!B&ddB>&7w!w!}BHhlB}7q}x7qgn)<d!!!!!O!!Ot##w!!qg£DDrrͩͩC9ͩ`pxu###ww7x!wuuu#uuu##u#u#u##u#u####u####uu#uuuuuuuuuu#uuw!!ݹH!####u #u #u#w#!!XuOHt.궜?21Àch[cdl@{?YlB!BBhdHútHt!u!útt1tÜl3ܻ2HBdddd?>7xww!llBBd>}qxxgLfJn>&B̺O!#!!OOOO###!OG}gfeD*`rrͩͩ9ͩͳ9CDɌw#wwu}>7!w#u##uu#u###u#u#u##u#uu####uuu##u##u#uu#u!w!!####u uuuuuuuu##!Ouu u#1lto.HHܺ. H?{ܓdط{l?lܜ3]Ycch@h?dB1?2dHXXt1t11H3{?ld1ÜBd3F3?dx7w!}!}dݜB}}>d}>Gxgq<ĕ&O!###!!!!!!##wG}kfڤȦr=r9ͩ9Cku#w7Oww>7w#uu#w#u##uu#u##uu###!7w#X#######uu#uu#!!w!!!O!# u#uuuuuuu#uu ######!!ttt1?1.. !!B?OhyOyBô%c1?O!!OB1O!H1lt11H?y[llܺH}BddBB}<777!7!dۺBiiHBd}BgqqqGGLJ<LL>O!!##u#!u!###!!xGgfv*Crrrͩͩͩͩͩ99CDvw##w>www7wuu######u#u##u#u#u#u#uuw!7uu#######u##!!!#!OO!###uuuuuuu#u#u#u##!!!u u X!1.1Hݒl1.1?HdB?H?Fyy@idܴH]1ܒBdOO!!!.ݺ!tú112?{2tBùBB]dB}G7!!#!}O!BùiÜ?}>GGqgqGg&&c{l?lH2iB&dd3B&&7蹹#H!OÜ?yH}B3gG>gGGGq&><>!###!##!!77GgkvvȾ`ͩ͡`pNjuuu#ug7uwwuuuuuuuuuuuuuuuuuwuu}uuuuu#uuu####uuu#!#w!uuu uu u##u#uu#u#uuu!!u#u u#Hܜt t݀.o t!tHdaB{?lBl?ܜ #u!X?i2ܒ??.1?t12 #!!.!!HtH1OBBB33?1HÜ1B}Bd3]Fdd}O?F!l2hB!!B?Fdۙ&G}q&&&BBO###u ###!#!!7O!#7!!xGk vDC*`ͩͩ`DڑuwwuXuuuu#wwuuu#uu##u#uuu#uw}7!u#u#u#uu###u####!!!!#uuuuuuuuu#######u!##u݀t ݒH1HH!ຜ H{hc?hcF?ܴ!!!!Bܜi22ll?H!??ttu#Ot! t1tldFF3h1B1?BBB>&&>d]]]ddOOBݹO}B?OH?!!d:J}g&}GO!Ot#uuuu#u!!7##77Ggk\vv(C*ͩͩͩͩCDeɌw7uu77#u7!########uuuu#uuuw!uwuwuuuuuu######!!!!w!w#uuuuuuuuuuu###uu###uu#!H.Ht?12221!?l!H1#lû܀úOBdlhމ??.2?@y?2t#!O!t !Ü]h3?B&FF7B.ldd&<:}۹OBBh?%ݺܹO!u}dh%}>}xqGB&GGGO!!O##u#uu#!!#uuwwGqLk v(`țțͩCDeɌ#7wuuu}w!7u####u#u#uu#uuu#uX#uw#uuuuuu####u#u!!!!!#u###u####u###u#uuutúttÜto2N Ot{hBdOl%ll2d?y@l[1Pi2{@ܺ !!!#!O#OB?dd3B3BOuݜ::TG}>OtO!?Bdyش1uX#]dd¹xx77g>GO7!BO!!##u#####uuuuɹqLkȾCCCͩͩͩͩͩCDɌuu#uuuu#w#u#w####uuuu#uuuu#u#u#uu#uuuu#u#uuuu###u# #!!O7##uu#u#uuu######u##!ݶ211.!o 2À2{%%{Ouda߰H1HH?ú@?2lY{aHH O#OOHd&BÜB!Bddd3::T>7BOuOH]hyرdO#X!!7xxGB۹!G!!H!!!###uu#u#u#uuu#xqqk ڦ*vCCCͩ99̈́C ёuuu###uuu#uuuw##uuu#uu#uuuu#u##uuuuuu#uu####u耀!!!!!#uu##uu############w!wu!1ÜoP| tOHBha%?l!NttHt!u2Ò2221NBHH, !O!!HHB&]33dddBBܻd:JgdBO#!l1Od[?BB!Og>&O7NjG7}}}}w7#OO#!7#uX#GGqvȾȾ```ͩ9'wuuwww#w#u#w#u#ww#uuuuuu#uuu#uuuuuuuuuuu#uuu##!!!!!!#uuu#######u#####u#u##..ݺt.Ht..o| |t11{dhFOt?1l!Hl22NPNt#!Ҁ!tHOBHHB>OBBddd}lB%nFJ}Gx&3>d#?ۺ̹O!u#dd??lܺO!Owww##uu#w!w#uXuuu#ww!!w#uuX####uXuuXXXxxqkv``C9ͩ9(p###uuwwuu#w!7!#####u#####uuu#u#uuu#uuuuuu#u###########uuu#u#uu#u#u#u##u#######uu#!OOto.HtPP| ZZy{c3hhy@l?2.hB1tHܜH..P2PܜH!ܒN?2lܜ1HH?B7B?yd:GT:۹G!}O!?B}!#X#!!>GwO̹?lݹ!!###w#uuuuuXuuw#uuuuuwwuu#uXuuXXXXuuX7xqk *``̈́ͩͩͩ9̈́ \7###u#uwww!!w#w##uuu#u#ww#uuuuuuu#uuuu#uuu#uu#############u#uu#uu#u#u####u#######uuu#u u#!!!tPP["|iiP |[[Fc?21Ü1li1P2ll1liO!OtH1to.l11úHlBÜ!wdy{fgd>xG}O#Oh!O!!dFdd}ú!!Ow#uX#w#uuuuXuuXuuuuuuuXuuu#uXuuXXXX7xk\vȾ*`CCͩ``ͩ9Cpq#u####ww!w}!w#!####uuuuw#uuuuuuu#uuuuuuuuuuu#######u#u###u#uu#uu#uu#u#u#u##u######u u#!.12Z[ i |1hd3Y@Ül}?!BwwH??l2l"[12t??ld2112ݒܶHHÜú}Bی۹!d>>&7u!O!!}O#!B]]ùù!!##uXu#uuuuuuuXuu##uuu#uuuXXXuXXXXuX7qke*C((ͩͩͩ99( Rw###ww#wwXwOwuuw#######u##uu###uuuu#uuuu#u#u#uuuuuuuuu#uuu#u#u#uu#uu#u####u########u!!u!.P2Z$iZ PP !tB!y%d# .! #1221HH222H.H1HBBddBÜ}}Bd-F>dOO!XuO!X#!!O!d]d1OO!uuuuXuuXuuu#uXuuuuuXuuuuu#XuuXXuXXXXuLfjھ*ͩC````9** u#ww!w##Xu#wuuu##u##u#u####u##uuu#uuu#u#uuuuu#uu#uuu#u##u#u#uuuuuu#u##uu##uu#######u!O.ˊ"Z$$ ޶l?O#!Od1# !Ü!tH?iN12iP2OHH!.!2H1l???Bddd}B}}w&&OO## w!O3dG&BBBB!Ow#Xu#uuuuuuuXXuuuww#uXuuuXuuuXXXuuu7qfe ```ͩ`ͩ``''7u!w!!!#uuw##w!wwuuuuu#uuuuu###uuuuuuu#uuu#uu#uuuu#uu#u###u#u#wuuu#uuu#u#u#u########uu#u !O.Ptފ||[Z[ii"ilN %??!u# !XB?O .22[lil2P[!!Xu.Hlt2llldܜBd7333B7>&>]&w##OO #OOd?!!7̹Bù}wXuuuuXuuuuuuXXXuuuuuuuXXuXuXXXXXu7 `9`````9``MM)7!!w!w#u###Xww7uuwuuuuuuu#u#uuuu#u#u#uuu#uuuuu#uuu#uuuuuuuu#uuu#uuuu#u#####u#uu# u#uuຒ1[""2ꊊ[i2?ùBy!!# X#ݹ!1112l@a[[2N[[.H .?i22B1dBBd]d?d&7OO!OBuuu1}BB!OBdBBB7#uuXXXXXuXXXuuuuuuuuuXuXuXXXXXXu*`ͩ((```C`9`* ёNju######ww!w#w#u##uuu#u#u#uuuu#uu#uu#u#uuu#uuuu#uuuuuuuu#u#u#uu#u#u#uuuuuuu#####u#uu!t.H2PN NNޒ1li@@ihH3dX!?.!BP2lܱ[[y2212N2l11.O1HH2h1tÜdddBBB}]}{>>&!!Bd!O!O!OO7&d?dd#uuuuXuXuXuXuXXuuuuuuuuuuuuuuXuXuXXuxڦ``C``````````(C```MDIGu!###ww!ww!uu##uwuu#uu#uuu#u#uu#uuuuuuuuuuu#u#uuu#u#u#uuuuuuu#uuuuuuuu#u#uu##########u OHtHiN2N޵iil1tN[d3l2ܜt#ut2P1H÷222Nl2!1Ht݀HH1tHBBdlB}>B}>FO>&!!{}!Xuu!!!O!!]F?BBd?>}wuuXuXuuuXuuuu#uuuuuXuXuXuuXuuuɭ `C``````* IɋO!www!!!7!#7#uu#uwu#uu#uu#uuu#uuuuuuuuu#u#uuuuuu#uu#uuuuuu#uuu#u#u###############耀!OO2ii1illtH?2?llï{N?i?21P{@?Pܜiy@H1Hli?lli.??HH?HHBB۹Bd>۹O싌uuu#ù!u###!##u!Od3B&Bd>7#uuXuXuuuuuXuu####uuuuuuuuuuXuXuDC`C(C````````Dpwu!wwB!!!7!w!wuO!##uuwuu#uuuuu#uuu#uuuuuuu#uu#uuuu#u#uuuuu#u#uuuuuu#uuuuuuu############!!!ti"iP2Nlllܺllù?ܜܷ12N[2?dP2l21lh{yhH211HH?BB}BBBO}}G}7}]3&wu#!#!1B!O!XXuuuwOd}&>!###Xu#uuuuuuuw#w#uuXuuuuuuXuuuuuu#wC̈́ͩ`````````*```Cpڑ#uuu!uwww!ww##u#}7#uu#uuuuu#uuuuu#uu#u#u#uu#uuuuu#u#uuuu#u#u#uu#uuuuuu#uuuXuuuuuu######u!!!!OOt2?NN[ll??B?!B!Hl[[i@{H2ii2iܵlyYyy@XޜP2[?HllB?B}w}}}}7}7]7}>B>Onj##Xu#uOwX#uOۻB7OB}&>>̹7w##w#u#u#u##w#uuu##u#uuXuuuuuuuuXuu #ɑMC̈́`((CC`C``*CDek7wX#X##wwww###u#u#w##u#u#uu#uuuu#uuuuu#uuuuu#uuuuuuuuu#uuuuuu#uuuuuu#uu#uu#u#########OOO!!Ot22lNh???2??d!l??ݺH iPNN1tHl|li?2ya%%Pl?222i?l?llB!!!!!!O}w}B}}7w%dwu#w!7X!XuO#u!uuX7Od&!O!!O!Ow###uu##uu#uuuuuuuuuuXuuuuuC``C*CDvQɌuu#Ҁ!w!!!####wX!!uuw#uuuuuu#uuuuuuu#uuuuuuuuuuuuuuuuuuuuuuu#uu#uuuuuuu#u#w#w##耀!HO!liii[?[?l?h@cldOÜH?."P1ݒ|2[[N ?t%ذH1?22l?d??dùu#!w!O}}}###!wXu##uXuu##!OH#u###!O!d7O!Bd>OO!!!!##!!#wu#uuuuuuXuuuuuuuuuXuuuuuuuuu##u##xM`(`(CC``C`juɋu#u##!!!u u##u}!w!!u##uuu#wuuuuuuuuwuuu#w#####w##uu##u#uu##uuu###uu#uu####!!!!7!##XO.H..B?i[i@?33{3?!i1NP ?P[il.12l}!ïFt2"iNll1ddBHOF1u}1!?]BdwB##uuuw##uuu7!!!B!!OOOB!wO&O!u### u####w###uuuuuuuuuuuuuuuuuuuuuuuuuuu#uuXX#\jM ```DC(``CCMv)uu#uw#ww#! u uuu!w#w77Xu#uuuuuuuuuuuuuu##uuuu#u#u##w#u#u###uuuuu#uuuuuuuuw#!##!O!###u..PtH12i?[3dط%%2%2l NP[i.iail1h{h3!}h?YZ?12HBBH#OuB!Xuuuwuu#!OOOO #!H!!!!OBBO####7OB!!#!!u####uu#uuuuuuuuuuuuuuuuuuuuuuuuuuu##uXQ)jI ` `CC`CCp#uu#w#u##Ot݀ u uuwwuuwwuuuu##uuuuuuuuuuuuw#uuuuw####u###u#u#uu#uuuuuu#uXuwwu!Ot!#!##!tt121lllllllhcBOOB1yZlll2P?[?[%%{dùd񷊜2lh?dB}}OOHBdBBO!O}wwXuuXuuuu#w!!!#!OO!O!OO!uOB!O}#u!!OO!!!!!Ot!!!!##u#u#uuuuuuuuuuuuuuuuuuuu#uuuuu#u##uuu)DpCCC```ʡCCCpewuuu### ݺHO #u##u#uuuu##u##uuuuuuuw!!wuu#w###uuuu#uu#u####uu#uuuuwuuu!#OtBBH݀!#!݀tN"l1llÜ?ilB!ÜB1H?yy12ili2"ܜ[yYaYYy]d1?[llB}}}O!!!OOO!#}?ùu##X!uuXuuu#u###uu#X#!!#O Xu#!u!?##!!!O#u#!!OOOO!!!w!u##uu#uuuuuuuuuuuuuuuuuuuuuuuuu#uuuu#uwunjqe'DCC`` CC}Ɍ##w##u tHw#wu#uuu#uwuuuuuuwuuuuuuuu#!!7w##w##uuuu#u##u#u#u#u#uu#u#####HHOHHH݀t2.o?2??2l[[lܜ1!t!O!1?HH??NN[[2ޒ[?il2%cY%Y%%cF???d}}OXuO!HB!B#!#uXwwwuuuXuwww#wuXXXu!uuO?}3d#77!!!OOO!!!w####uuu#uuuuuuuuuuuuuuuuuuuuuuu##uXuuXuu#uɑ\MCCCC` `DCC\qqxuXu#Xu# o.HHtt!#!! uwu#####wu#Xuuuu#uuuuuuuu##7wuu#uuuuu##w#u###u#u##uuu### uOtt.tHH݀!.t1P"Z"2@@{[ܷ[?ܺtB!Ht?ay1 Ҝ@y2li$$?P???@dFFc?BÜ}}!!!!7!X#!}F{#??w!u#X#X#u#uuu####uuuXXXXu##!! !!!!#}B}Buuuu##!!!!!O!!!!w#wu#uu#uuuuuuuuuuuuuuuuuuuuuuuu#u###uuuX #uXQveIDMj\ekuuu uutP!#uuu#u##ww#u#Xwwuu#uuuu#uuuu#u#uu#uww#####w#uuu#####u#u### .H1.݀tHot1.H؍ity@?yHOOt1!tH?N1tҜ2lii?"i!BdB}Od?B}!wwwww#wX!?hB?}u###Xu #Xu#!#XuXuuX# ### #XO!!OOBuX##!!!O!!!w!#wu#uuuuuuuXuuuuuuuuuuuuuuuuuuuuuuuu Xuuuuw## u P޶t 7O!#uXuuuu#w!w#u#uwuuuuuuuu#uuuu##uOww#uuuu####u#u##uu##!!.1121.tt2i2"@ZZ2???hhܷ.OOt!tBi2hi.HҜlNl@%%YBOd?cֹ}}O!!O}##Xww!B۹Od?!OO#XXu###uX#!uXu#uXғXu X! !Ht۹!wB!u!!!#!O!!!!!w#w###uuuuuuuuuuuuuuuuu#uuuXuuuuuuuuuuuu#uuuuuu uuuuuɋɋɋwuuuuXu!H1ފ.!!O!u##uX#uuX#wXBw}uw}uXu#uuuuu#u7X#!!!!!w#u##u##uw#u#u##...222Pt P1[?[2?2?2Ht! P12߷@ilh?dF?Fc!w!O!#uu#u#X!#!!OlBB}!!O!#Xu!#!!#Xu#!uu##uuuuuu!!!tH##!OOO}O!B!!#u##w!!!!!!!ww##uXuuuuuuuuuuuuuuuuuuuuuu#uuuuuu#u#uuu#uuuuuuuuuuu#u#u#####u##Ɍu##u 12PP.###!###wX##7uwWuɹw7w###u#uuwuuuuuuw####www#XXX#! o1P22. tPtoH?iP11lܜH1?Bl{adO[iHt ?{[?alNil?yhF?yY?d!##!w!!uwuwuu}}}B!w!w#uu#!!##uu!!!#u###uuut!!!.HBO!!#OO!wO}7u#####u#u##!!!!!w##ww##uuXuuuuuuuuuuuuuuuuuuuuuuuuuuu#uuu###u#u##u #uuuuuuuuu#uXu#u!HPNi޶.!uu}wu#!u#wX#wɹ7u}Ow####u#}u#wwu#w#w#uuuuuuuw!!u .o.21tHot.t1. Hl?[{1B÷ú?u򷜺???il1[??i?ôFlֲcFOB!##w!7!##u!!}!!OwuX#uXu!O!!#!O!u#####u !!!OtHHOO!!#!!!!7!7̹OOuuuu##耀w!w#w##uuuuXuuuuuu#uuuuuuuuuuuuuuuuuuuuuuuuuu#uuuuu# u uuuu#u#.HP22!uuu!OuXw!7u#7uu#u7xwɌ77Ow####w}!wwu!#ww!w#uuuuuw#X!..."2P2Ho.lHtNotP"%߉lhF?ldB2hlB! !dh?c2i2?dlidH2߷ii@2ldd{⯴%F!!!OO!##!O!OH!}!}O#u#X##!OOH!!Ouu uu## uX #.tO!!!!!!!!!!w!www!OO!#####!!!!!!w#w##uuuuuuuuuuuuuuuuuuuuuuuuuuu##uuu#u#uuuuuuuu##uu #uu#####uuuuuuu.Pފ2B#uwwuuw#wuw!#wwxww#wuu###uu#uu!wuuww7w#u#!!t H2Ht2N21t?h P܍@HhB?HddFy?߯{?l@22ld?@@ii@?hܯyhF}?dBù!Oݹ}úBO##7uuuuuX!!OO## uuu##u # !Ott!O!!!O#wuu##!!!!##uuuuu uXuuuXXuuuuu#u#uuuuuu#uuuuuu#uuu#u#u#u#u##uuu# uu#u#u##uuuuuu HPù#uuX uu#77#XXuw#X#xwx7Gw#uuuu#uu#u!Xw####w##u#Xuݺ?ttHP1P2PP122?2[[2Z@t?y{ùtO!!!uHuFFl?B?B?Ü@l{%ycddBBFyd{دdB!!BB?tO!!!!#uuuu!!!!!!#X uu!# tH#!!!!!###uuuuu##uuu###u Xu Xu XXXXuuuuuuuu#uuuuuuuuuu#u#u#uu##u#uuuuuu### uu##uw#w##uu#uu oo||"˶!w77#uu u!w##uuuuu!#7ɹ7}}#uuuu #}#u7w!O!ww#uuu X 1Pt2tP H.tH1|H1lccB!!u!#?l]{F?Bܴ?2?l@[lBOhhlBBl?dHd1O!!##uuu## !OOO!Xu!!!!!OHH!!w!#w#uw#uuuuuXuu#uXuXXXXXXXXXXuuuuuuuuuuuuuuuuuuuuuuuu####uu#uuuu#uuu###uu u####uu#u o.||| ww#w#wu#X#uwwu#wuuɌɌWwx###uu##OOw#X!w!ww!w# !ܒPPPHt.H21ttPt2221B?ad}B!!!!!O?ya]c?hdB1?[i@[[?lldBBdd}OdF{lHtBOXuX!úHtt t!#######!# X݀O!!ݹ!#uu###uuuuuuuuuuuXuXXuXuuXuuuuuXuuuuuuuuuuuuuuu#u#Xuuu#u##uuuuu#uuuuuuu#uuu# u uXw##ɋ#uu.o X7!x!#uuu#u##uwwu7w####77}Guuw#!#!u##Ou!!# u .i1tHt. 1tot2.HH2.HBO}BOOttl??hB?BlB?11!2@l??l?[lllFh?O!liO1lHyd#!Ҁ!!!t݀ #t.!!#!t! #!u##!7###u#####uuuuuuuuuuXuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu#u#u####u#u#uu#u#u#u#uuu#uu#uuu#u&#u##HPPX#uu!ww7w#u##uuu##wuw#!#uuuw7w7g7!uu##!#!!݀u21 2H1l21 .t2?Pl?h!OG苋 u1BHB1?HtHt2?[@[?B1lHlô{@ܺOO?hÜ1FyH!O!!X!ݺ2tt1!OO#OO.O#uu#######uuuXuuuuuXuuuuuXuuuuuuuuuuuuuuuuu#w####u#uu#u#uuuuuuuu#uuuuu u u#u##7###!1P1.u !uwu#uuuu#uu#u#wuu7#uu#!77ww7}#OXOH!H!݀ . ຒ2@1޵. HtP@[NPilصlhHHBOO##!1h?lh?OBBÜÜlli1tHl1l211??Fcc???h{1ttH1?H?l!?BO!t11݊t!tOO#!! !t######uuuuuuuuuuuuuuuuuXuuXuuuuuuuuuuuuuuuuuuuuuuuu###uu#uu#u#uuuu#uu#uu#uuuu uu!}wu#!.tPP..݀###u#uu### uuuu##uuuu7Xw!7ww!ɹXddBBHO!!!.oPP궷i1H.?2H .N.122$iY؜tdhO!Ol?lyyhdh!1h?[2tN2hl?2ܴ??h%c33Bܴܻ?[OXHlB!HHHOON22l2111tX!!OOO#1Ot#uu##uuuuuuuuuuuuXuXXXXuuuuuuuuuuuuuuuuuuuu#u#!!!7!##uu#uuuuuuuuu#uu#uu#uuuuuu#uX#u7##u!.H21!!# uuuu#w#uu#uu##Xuuuuu7!wwww7!7!wBBOtH!tܵt[[1.11?.1tHt[2$a%ya??#?dOX##td?lܒ?dh?hdÜ12Nl[iliݺ1?3>hFdôh@h.l?lHúO.hllHt.t1H1HH!!!OO!HHHúu##uuuuuuuuuuuuuuXuXXXXXuXuuXuuuuuuuuuuuXuu#uuu#w!###uuuuu#uu#u#uu#uu#uuuu# uuuu##}#### t11PP2PH!!u#uu#uwu# uuu#u#Xuww!w#u#!!tuB!!!!OHt!H212ll2HHi1@N P12@܉?ܺ??cyaH1!.!!t11.uBd]?ܻl1Hl1Hdi i?1i[@l11ÜO!BB]]]cFyt !t! 1OlHHtt1!t..Hl??Nܜ.?HO!!OO!!úu##uuuuuuuuuuuXuXXXuXuuuuuXuuuuuuuuu#u###!####uuuuuu#uu#uuuuuuuuuuuuuuuXuww######!t1111l21O!# ######w# #uuu#u##uu#u7B!wuuu#wÀ!.1!!!u!!t!tH111?귰2@2H?1t.?yN?ܺBB?hlh}1t.HH..Où?3{d?}1?1?i??22?ܜ?O_FF3F?d{{lHH !ùH!21tP1.12?H1!!OHH.tO# uu uuX##uuXuuuuXXXXXuXuuuuuuuuuuuuuXuu###!u#u#u#uuuu#uuuuu#u#u#u#u#uuuuuuuwuu#!t12ޜܒ!!!#Xuuw##!u#u# uu#X#wuu#O7wuu#uO.HO!t!Ҁ!tt21.2PHN?2t1l1iH11!!u!B#B.lt lydBBÜ?hhHO1.1H21ܶ11l?ii?]d>]3HBOt#tlúOt .H2[i2ܺ 21t. HOOtO!# uuuXXXXuuuuuuuuXXXXuuuuuuuuuuXuuuuuuuuu#uw#ww###uuuuuuuuuu#uuuuuuuuuu###u#uuuuuuuXu###!.ll22l2PHO!#uuuu#!!!uuuuuuuuuuu#u#w#uuw#uuuu##.HHt!!uutHH1?X? HtH2tH22.!?tw#wiB h?BBd}#!!ud1d2it2[@2i???2B3Fd>}}w&dHOHHli!!2?ÀO1tt.t1.tÒú݀ H1!t!tHú!u#uXuXXXXuuuuuuXuuuXXuuuuuuuuuuuuuuuuuuu########uuuuuuuu#uuuuuuuuuuuu#u#uuuuuuuuuuuuX!tH221݀uu#O!#uu##uuuuuuuu#uu##uuw#u##!.HHHt!!!HHHlttl?i?ti1 ll2HH!...ݹ}O!}}.u1 %YF3Y!BXXtHݺ2lh?hh?dBdO}̹}ܴlB??[d 1u 21li?l1?Hitt.tt! t! Ot!!!uuuXuXXXuuuuuuuuXuXuuuuuuuuuuuuuuuuuuuuu#####u#uuu##uu#u#u#u#uuu#uuuuuuu#uu##uuu t12N21Ht!O##!!!!#u##uuu #uuu!uuww#uwwu###!!݀ !tHtH1HHHll.2H.tl2?.tB.B?Hi1 }!# À#y%ydw#!O!!1OH.H 1d[{ylh@l}}!Bù#?BB1B2BOH2t!H ݺtݺ.1B!. t!.HH!ttttt.Ot!# uuXXXXuuuXuuuuXuuuXuuXuuuXuuuuuuu#uuuu#u#u##uuuu#u#uuuuuuuu#uu#uuuu##u#uuuuuu u#!t11lHt!#!!!OOO##uu#uuuuuuuu#uu#wwww###!!!݀#耀OH1tHHHlHhtHHlyi@ܜt1ܒݒahBBOO!!wu!uuuc_}Ot!O!tt1H!H2y%?{ùO}}O!!?ҀB?21!HuÀHt.tO#utt1tt.!tú!!!!#uuuuuuuuuuuuXuXuuuuuuuuuuuuuu#u#uu#uuuuu#u#uuuuuuuuu#uu#uu#uu#uu#uu#u#uuXu1111H!uXuuu###u#u#uu uuuuuuuu####uuw##!!OtttO!###!ttttH.tHoHHH12?l2ll2!ih!{@}!www#u?}wd3uOB}BO#HltBlF{c¯]?}O12OOÜd t#1?htu!Ht .t!ݹOX#!O.tHttt út!! uuuuuuuuuuuXuuXXuXuuuuuuXuuuuuuuuuuuuuuuuuuuuuuuuuu#uu#uuuuuu#uuu#uuuu##uuuu!111P1t!!!####uX #u# uuuuuuuuu#7}7#u####OHHtO!###1.O.H.tt.l2H?ҀX?H11l2i1i.!!wO!###XuX!#uw#uGB7uO}O!##!!lHô[B]#yd}BBll2?2HH?dOX 1Ҁ1uݺHO#!B!H.t.HHHttHdt###uuuu#uuuuuuXXuuuuXuuuuuuuuuu#uuuuuuuuuuuuuuuuuuuuuu#u#uu#u#uuuuuuuuuuuu###u#u!.1ttHtt. #!wu!##uuuuuuuuu uuu uuuu}wu#w#OOHO!!###tBHHtHt2H.iõ!.HH?[À?H݀daa?[#wuuw!###X#u!!#Xu7GG>g77Gu###!#uҀ!12H?dB!#}}GB!}BF??1PHHBBl, ,uúO!!!!!!uut݀.t11ttttB!!uuuuu###uuuuuuuuuuXuXuuuuuXuuXu#u#uuuuuuuuuuuuuuuu#uu#uuuu#uuuu#u#uuuuuuu#u##uuw1HtHHH.O#!###uuuuX Xuuuuuuu#uuwOwuuu###!OO!wu tH1.tt121H1t܀H!H2H?HO?{1?1!? uXu#uuX!X}uw}wwwX}OO##OH?B3FOB!7!u7!OB}?ddciHP2??BH#,XX!! B躺݀#!!OHOOt.!!݀Xt1.Ot!HO!O!uuu## XXuXXXuuXuuuuuuuuuuuXuuuuuuXuuuuuuuu##uuuuuuuu###u###uuuuuuuuuu#u#uuuuuu###u#!ܜt!O!݀ݺ݀####uuuuu##uuXwuwuuuuu#!#w!OÀ!uO# ҀHN2tP2Òl tH1X.t@htt ! uu##uXu!uu!!uuuwO7wwuw##OwuuuuulttB!d?d}}?11l?21 .Hu !t!Xݹ݀##!#! u!݀tt.tt.ttHHHt!!!u uuuuXuXuuuuXuuuuuuuuuuuuuuuuuuuuuu##uuuuuuuuuuu#uuuu#u##uuuuuuuuuuuuuuuuuuuuuu#!HBBO!!!#X# .###uuu#u#uu#uuu#u7u#77#uuuw!!!!O#u#?Ҁ ..t oi..HH@t1 tlݜOtu# #uu!XuX uuuXXu#茌uw#!#utOhO!Ow3dhh3B}ùBܻNl222llt.2 !!X!X!#Ot! u#####uX !# !H1tt...ttHH1BHOtO!u#u # u# uXuuuXuuuuuuuuuuuuuuuuuuuuuuuuXuuuu#uuuuuXuuuuuuu#u##u#uu#uu#uuuuuuuuuu#uuuuuu###tHtOO!耀 !###uuuu###u#uuwuwuw#w!uX #ww#!!uu!##O!BOt?21t" . .i.{tPt 11t,tH!h! OH!2ݺ!!# uXOX##uuuuXu### !1Ot. !&!FlBd??ddBBl222ll? .1!!X!O# uu##X#u ! #!O1ݺt!ttHHBBHHO݀ u!!!uu##uu#uuuuuuuuuXuuXuuuuuuuuuuuuuuu#uuuuuuuuuu#uuu#u#u##u#uuuuuuu#u#uuuuuuuuu!!H݀!## Ottt!##uuuuuuu###uu##wwwuwx!O######u#uuX!!Ot݀t2NP.H.l[2.tP2!1lOyܺXuÀw!#uuwu!XҌXuXX#!##X tH1?2{3O}?hdH}??t?1܊N?Hܜ?1122O!XX#XX##uuuuXuu!OHB1t!ttHHHtHHtOO!!!!!uu!!!!u ## ##uuuuuuXuuuuuXuuuXuuuuuuuuuuu#uuuuuXuu#uuuu#u#uuuuuuuuuuuuuuuuu#u#u#u#u##!!OOHOOO!!!OtHHO!#u#uuu#uu#w#uuuuX#wuwuuu##u##uuXuu#!X !!ttH?P2|P?@H. tH. tNÜ1Hût1XHܜw##wuuuXuXXuXuuuXuXO!H111?N21@l[BuB%Fd?û?ܜ1l?lii..tܒt! u Xu###XuuXu#!OO!!OOtO.!H.OtHHHttO!!耀u耀# ##uu#uuuuuuuuuuuuXuuXuXuXuX#uuuuuuuuuuuu#uu#uuuuu#uuuuuuuuuuu#uu#uu#uu##!!OOOO!!! Oú!uuuu#uw#w#uu#wwwuuu##u#uu#u !!Ht Ht.[."ZH.PtN1వ.aHdÜtXһl#uX#uuuuwOwh}wuuXu#uuX!t..1oPlZZo?NltBBy??Bl?lll[[.ÜúHú݀݀Xuuuuuuu#uuOO!!OtHHtHtHHHtO!!!#######!####u#uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu#u#uuuuuuuuuuuuuuuuuuuuuuuuuuu#u##!!O#!###!Bù݀X XuuuXuuuuwwwuuXww7u##w#wwu###u #!uOtH[2 tNPto2.N1tPl%1t#th݀uwuXuu##uwwuuuu##!tot 1t2%1lhyll?{yllܜdܴ?l?l2?N?i[t1?2?. H݀X uu##XX#XO!!!O!t!!tHtOttO!!!uu#u#u ###uɌuuXuuXuuuuuuuuuuuuuuuuuuuuuuuuuu#uuuuuuuu#uuu#uuuuuuuuuu#u#uuuu#uuuuu#O# #u#!!B!#wuuuuuuuu#uwuuu####w!wuuuu##uXuu!t!tÒttH1itZtްNP2oN22H12hH???û@ut#uuw#uu#uX}!uuu#tBܜ11 @a2F@c{B{lÜ?lldllll2li?ih212Ht?.. #uX茋##u####!Ot!!!.O.!ttOt!!## #!!!#!!##uuuuuuuuuuuuuuuuuuuuuuuu#uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu#uu#u##uuu!##!!!O!!!#u XXuXuuuuuuu!u#uwuw#uuu!!###uXu!uܜ.ö21yiNPP t.H122[l!tlHll?t uX#X#w!O#O!u#uu!l@2ܵ..Ni?2dlF1lhl@??[?lliiiht B1111t܀tuX#uuu####!!O!!OtO!O!!!######!!#####uuu#uuuuuuuuuuuuuuuuuuuuuu#u##u#uuuuuu#uuuuuuuuuuuuuuuuuuuuuuuuu##uuuu#uuuuuuuu#!###!!O!!#uuuuuuuu#uuuu#wwuuu##wuuwX####!uuu## #u !ttot.ගt H.2l.PtN?$1%[2i21À!! !O!! uuO#O!]}!OXXuOoiޜOҺ&?OBBB?lN{[?ܜ?ii?iihhhlHtݒ21Ht2HH2ݺuX###!!!!!!!!!! u##u uw!u # ###w##uuuuuuuuuuuuuu#uu#####uuuuuuuXuuuuuuuuuuuuuuuuuuuuuuuuu#u#uuu#u#u#uuuu##!!!Ot!!#uuuuuuuuuu#uuwwu#w}!##!###uuuu##u#! !.121ݒi?@l22112H[ia XOtl ݀uX!!dOu!!!!#!# 耀.lylPފwOww!GOܴlhhh22l?[[[[i?i[Ht1HtH..22Hu###!#uu #!!!###uuX uuu #w!!耀!!#w###uuuXuuuuuuuuuu##########u#uuuuuuuuuuuuuuuuuuuuuuuuuuuu#u##uuuuuu#u####耀#!!OtOtO!!####uuu#uuuuuuuuuuw##7Xw!#!!# uuuw##uX!#.o12.ݒ?.l?12tHt.tOO XҀ!X!#X !OOttB݀!# ![[{il!!BHܷahl2Ò2???i?Nii?[[h1OttHt22Nܵ..XXXuu###!uu#!݀# uXuXuuuuu#!O!O!!O!!!!w###uuuuuuuuuuuuu##w#####uuXuuuuuuuuuuuuuuuuuuuuuuuuuu#u#u#uuu#u#uuu#!!!O!##u#uuuuuuuuuuu#wuu7O#wX!u #!!uuuuuu##u! !o..P.õhl12t1Üt.1tH1t t2 ú !.ôl!1!!!!݀u #.u.l?yyYطcFd̹dBdd{@a222l?2?i?i["[[iihhiHtlttl?Po1 XXXuu####u Xu u#!#u XuXuuu#u!OtOO!!!!!#####uuuuuuuuuuuu##!###uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu#u#u#uuu#uuuuu####!!!!O!!#uuuuuuuuuuuuuuuuuuuuu#uu##7#w!# uuu##Xw!w!u oo? ܜH!}ÜHHt.OB#!du1X!? H,!!Hݹt1OHݺtXtHla133BOBÀHilh{h2lܜl2Nl?2[[Z@ hlBH1.t.t u uXuuu#uuuuu#XXXX Xu ## #XuuuuXuuw!OOt!!!##uuuuuuuuuuuuuuuuuuu##!!!##u#uuuuuuuuuuuuuuuuuuuuuuuuuu#u#uuuuu#uuuu#u##!OO!OO!!!#u u uXuuuuuuuuuuuuuu###!!u uu#uuuw!!.12P1tt.u!!#XO!Ou?}?u?.!#Ü1!!݀!Olt l2h2HHi{y{H?!HB1.l?l?i߷i22i @@@i [@htNHt22ot"iN݀ uu#uuuu###u#uuuXXuuXuX# # XXXuuuu#wOt!!w###uuu#u#u#uuuuuuu##!!7!##u#uuuuuuuuuuuuuuuuuuuuuuuu###u###uuuuuuuu!!!!OOOOtOO!!!uuXuuuuu#uuuuuuuuu#uw7wu7w!}u!uuuu!#!!1.À!!!H!X.B!!À!݀11O t!Htݜ12ݺtܜh{dB!hB1l@[2@h@{@NN iNN[i{hhht...tް2" . u#uuuuuuuuuuuuu XXuXXXXuuww!w!w##uu#uuuu#uuuuuXuuuuXuuuuu##!!!!!#uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuwu#u#ww!!!!OttOOOO!uuuuuXXuuuuuuuuuuuuuuu#XXwO!O!w}OX## ##Xu.u.úÜ! u1!݀..!H.1H t!1!. t !t1P2 NH?H[c!Ohl?d3BBO?dl[[[@@@[ |2l@߉h[hߊ t..ttt.1o.PN1#uuuuuXuXXXuXuXuuu!##u#uuu#uuuuuuuuuuuuuuuu#!!u#uuuuuuuuuXuuuuuuuuuXuuuuuu#u##u#uuuuuu#!OOOOOOOO!##uuuuXuuuuuuuuuXuuuuuXwuwBw۹!}#!!#uuuuu [N.H݀X..11ݜ12!ݒO l1HHt.l.thÒPi.t2y?OOOd̹B?Üܻ@@[[@߷" ["[ [i Z{@@߯h31ݒHHtH.P݀ #uuXXuXXuXuuXuu####uuuuuuuuuuuuuuuuu##!!###u#u#uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu#uu# #!!!!!!!!!##uuuuuuuuuuuuuuuuuuuu#u#uu!w#̹w#w#Xt1?22@P..݀HN121݀l.݀H !y21...N2111H.212ߴFFdd]O7!BBÜBl[@iii[$ ""[@@@@@333333h?ll.H1l. [Ò.wuuXXXXuXuuu######uuXuuuuuuuuuuuuu#u##u#u#uuuuuuuuuuuuuuuuuuuuuuu#uuuuuuuu#u## ##!!!!!!!##Xuuuuuuuuuuuuuuuuuuu#uXwuuwuO#!#!!X# #!O#t.2Pli2t ҺHHtN?[.Һ?112.?H2H! 212.1HHH1HP.1H??%dtBOO!B̹#Bl?i?2?i[|[[ Z{@@@h3h21t2ll@HP|?.1##uuXXXXXXXuuXuXXuuu######uuuuuuuuuuuuuu#u####uuu#uu#uuXuuuuuuuuuuuuuuuuu##uu#u##uuuu#耀!!O!!!###Xuuu#u#uuuuuu#uuu#u#uwuuw#u###u##u# 2 HHHu!11O2..21?ܒt12 l2܀H[ݜҀ12P21Htޒt2OOtd?ز@X#H?7!!!HH?212?[@@@[N[i{@2i[i2HHll[?N.uuuXXXXuXuXuXuu######uuuuuuuuuuuuuu#u#u#u#####u##uuuuuuuuuuuuuuuuuuuuuuu#u#uu#uu#uuu u ##!!OO!!##uuuuuuu#uuuuu#uu####u##uwwu!u HH1.1[,2H112?.i.t.. 1ݺhH2t.ݜ.2l 2PiݒlO!!!{lcdOBBBO!!!OBl2?ܜlliiii2ih?ܵ?ttH, ҀH@[22.!!!wuuuuuXXXXuuuXXuuu#####u#uuuuuuuuuuuuuuuuuu#u#######u####uu#uuuuuuuuuuuu#u#u#uu##uu#u#uuuu###!!!O!!#uuuuuuuuuuuuuuu#u####uwu#!u##!!u݀.Ü1Hú 2݀ta!l1?.tݺlܜݺtH,# HX?N[[2iN2l{yBBdttOB?ihl2ll2?l[[l22l2lh[?d?紴t݀.݀t1O .!11.!!w#uuuuuXXXXuuXXuuuu###uuuuuuuuuuuuuuuuuu############u#uuuuuuuuXuuuuu#uuu#uuu####u##uu##uu!!!OO!!###uuuuuuuuuuuuu#uu#u####u!uuwuu!#tuútt?ttuH 2t2?11!ti??t?!H!.?1t1 NN2P2B?yOHB??O!!OOtO@ii[i[?i?l22?i???dddϻdd݀ttHtt.Hl !.P1ú݀!wuXXuu#u#uuuuuuuXuu!!###uuuuuuuuuuuuuuuuuuuuuu###uuuuuuuuuuuuuuu#uuu#uuuuu#uu#u#!!!݀!!!#u#uuuuuuuuuuuuuuuuuuuuuuwwww!w##uu l 2..Òl1݀ t.ݵ{t@1hl. ?.o .iú1.l.1@?i1HaN.t!B!?O#1HtdlBOHBt!!!!괯h@[iiiii?????d???l .l ttH .Hú.HOO!#uuu#uuuuu##uuu####uuuuuu##uuuuu#uuuuuXuuuuuuuuu#uuu#u#uuuuuuuuu#u#uuuu#u#uuuuuu!!!!!!##uuuuu#uuuuuuuuuuuuuuu#u#u#!ww##u##u!.!Àt. ?aH.t?ݜX?Ó2À1 2l t1t õlPiPޜZ@y[H!dyylO1dttB@@i??Ni?["[iidddd!1!1H1!.OH1..ݹ!!!wuuu######u##u#uuuuuuuuXuuuuuuuuXuuuuuuu##uuuu#uuuuuuuuuuuuu#uu#u#uuuu#u#uuu#!!!w##u uuuuuuuuuuuuuuuuuuuuu####w####uu u!!!ݺlô.XHu 1ÒOH!t.it2l.1X1l2!,ݜHllúHl[PPtl2${B]llBBHtHOH1??i??N??N2ll?i@@h?dddddddddÒl! O1HtHttt!!!uuuX####!!!!!!!##uuuuuuuuuuuuuuuuuuuuXuuuuuuu###u#uuu#uuuuuuu#uuuuuuuu#uuuu###!!!!!݀#u uuXuuuu#uuuuuuuuuuuuuuuuuu#u#uu#u#####u##uXu###! Ot! ut!1. H1HO1@l.À t ݜtH?l1t.$a@N"tt...1Blܜ?!OttHÒ2ܒH1ꜜ2ll212?@߉?紴?dddd?HOt!OtO XuOu #.t!!!####Xu###!!!!!w#uuuuuuuuuuuuuuuuuuuuuuuu###uuuu#uuuuuuuuu#uuuuu#uuuu#u耀!!!!!!݀݀uuXuuuuuuuuuuuuuuuuuuuuuuuu#uu#u#u#uuuXuu#!!ùݹݺ}t݀#HtuҺݺX?H1Ol2t HHÀ.1@ݜ12?2P?1@{h22.o.H?HBHlHttlHO݀OH211tܶ2?l2ii[i[$@hh[]h?ddl?ddddddd! H݀!OtHO!# ###uuXuu####uuuuuuuXuuuuuuuuuuuuuuuuuu##u#u#uuuuuuuuuuuuu#uuuuu#u#uu#!!!## ݀#uuXuuuuuuuuuuuuuuuuuu#uuuuuuuu####u#u#uu#uuu#w!wuu##t#ݺ ,#1!tX!t.H1H!lúXX!1?tXi%?@@.P?[@{@HPNt1[H.!OHtHtH?ll22N2112?i[Z%i??l?dddddddddd!HúB1!11ttHt݀ X ##uuuuuu#########uuuuuuuuuuuuuuuuuuuXuuuuu##uuuu#uuuuuuuuuu#uuuuuuu#uuuuu#u## ! ݺ݀#uXuuuuuuuuXuuuuuuuuuuu#uuu##u##u#u#u###w#!!w#}B!X #t.XH X!ttH!O .݀ltNtݺ1!22{l.212222Ò귍Ni@l1H1t1?l?2l21111l1i[[$a%@hi?l???dddddddddd1H! #!!!!!!OO#!!####uuuuuuu###uuuuuuXuXuuuuuuuuuuXuuuXuuuuu#uu#uuuu#uuuuuuuu#u#u#uu#u#uuu####u u݀!݀!#uuXuuuuuuuuuuuuuuuuuuu#uuuuu#u#####u#uuuu###OO!!!X!!u!H!.. ݊H1ܶt1[Àt݀1Ptil122..?ltt@?al1N@y?$@HH1HH@l?d1N܊i222 Zh[h???dlddddddddd!!!BHO!!!HO!# #!!#Xuuuuuu#########XuuXXuXuuXuuuuu#uuuuuuuuuu#uuu#uuuuuu#u#uuuu#uu##u#uuuu#!! Xw!}Ow#wuuuuuuuuuuuuuXuuuuuuu################uuu#wuXuu#!HO!!!݀t 11..o.PފN"i.iit2o1tHltܺti%@2À o[@2i2{[1l1lHOHd%{?l?llN?[[l2[h[@@Z߉h@hd?ddldddd??#!!OBOO !#HHOH!O!#uuu#u#######uuuuuXuuuuuuuuuuuuuXuXuuuuu#uu#uuuuuuuuuu#u##u#uuuuu#u#uu###!#uu!!wuuuuuuuuuuu#uuuuuuuuuuuu#u#uu#u#####u#uuuuuuuuu#u!Ot ,X.1otN"|˵1tHP.y2ttHOH!HÒ1N2t݀ !H1lHy?ܷldtBH!td?l??ܺBll2߉@Ni[[i?2li[߱ayy@]hldddlddddl?1t ,Xݺtt!!u!!##uuuuu#u########u##uuuuuuuuuuuuXuuuuuuuXuuuuuuuuuuuuuuuuuuuuuu#uuuuuuuuu##!!u u!w!##uuuuuuuuuuuuu#uuuuXuuuuuuuu#u#u##uuuu#uu#uuuu!t!!!tO1.ot޶P Z N N.tt2o.2. 2l1NH tHX lH2l@N귒?@i2{hhdBBOtO!?lO1BHú.??i޴2HHHl߱a$@3dddd????2iltl2úttu !!!###uuuu#u#u#uu##u#u##uuuuuuuuuuuuuuuXuuuX##uuuuuuuuu##uuuuuuu#uuuu#uuuu#u###!uu#!####uuuuuuuuuuuuuuXuuuuuu##u##uu#uuu#uuuuu#!tO.OttO!݀ .HÒ.޶P2P NtN.N@@l ,1?tݒ22t2?2[?1i[NHN2.HH2lt?BÀO!!HOH?HO!tH1PH1iN%aayy@]h?ddd??.to oPl21to..o.t.!O!#uuuu#uuuuuuuuuuu uu #uuu#uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu#u##uuuu#uu#u##uu#########uuuuuuuuuuuuuuuu#u##u##u#u##u#uu#uuuuuuX ###!OOOHO!2iPiNZN.H?Nt,2t .?Ht?tt22Í P11HiY2Hܒlt!tOO !OHOl?HBH12l܊11N??aY%aayhldddld?PPޜ.oPPPP2.t.!!###uuuuuuuu#u# uuuuuuu#uuuuuuuuuuuuuuuuuuu#u####XuXuuuuuuuuuuuuuuuuuuuu##u#uu##uuuuu #!!w#####uuuuuuXuu#uuu#u##u######u##u#u#u#uuuuu#耀!!tttttP2|[Z߰2oHtltlH 1. 11i2P2l2$2.1[?Ht#X#OtB!!ÜÒ11122111112?i?߱yߍ߷ϴddBddddd1P12@ iÒPlPÒ.t!!!########uu#######uuuuu#uuu#uuuuuuuuuu#u#######uuuuuuu#uuuuuuuuuuu##uu#uu#####u##!!!!!!!!###uuuuuuuuuuuuuuu##u#u#u##u##u####u###!!!OOO!ttHoPNi[[lt.H1..Ptl,t.to2ޒ..tyil@B1ii"i޶i%%lܴ# O!?uO݀OO!OBÜ1B11Ò1HH12?[hi[??ddBBBBddd?...Ò.22...H121tt. #u##########uuX uuu#uuuuuuuuuuuuuu#u###!!!uuuuuuuuuuuuuuuu#u##u######!!OOO!!!!#uuu#uu#uuuuuuu#uu#u#######u##u#######!##!!OHHtttt..HlPNit..Ot[tHt HPN$tt?.HlZ"Nް..|N[݀tBOtHdl!O!#OOOHB11111tH22??lh[hhdBBddlH11!O!!.Ü1211 ###uu###u##uuuuuuXuuuuuuXuu##uu#!!OuuXXuuuu##uuuuuuuuuuuuuuu#######uu#!!!OO!!!!###u#uu#uuuuuuuu#u########!!O!!!O !t1NiNlP2..t2!tiltNt tH1ݰ22 1HHO1P?|NPi?2HtO!h?####!OOOOOOHBBHú11l?lNlܒi?lih?ϴBBddBd??!##!!!}OB.11.1H!uuu####u#uuuuuuuuuuuuuuuuuuu#w7!u耀!!!O!####u#uuuuuuuuuuuuu#uuuu####u##u##!!!#w!!!!##u##uuuuuuu#uuuuu#uu#u###### ####u!###u!!!! O!!t!1út.H2t!2ll ݜ..tH1.|NHi2it1H?|ii"H.Hto.t!! OBdOO!!!OtOHtHHHH?@lh2h?dBdd?##H!OH!..!H1H!!݀u uu uu########u#u#uuXuuuuuuu#u#!w#u##!!!O!!!!##uuu#uuuuuu###uu######u#耀w#!!!w#uuuu#u#uuu#u#uu#u#uu #u######X!# #X#!!!!OOtH.tH11.O.Ҁõd?2t1H?.1 ݺH.2?Y?tHtҊޅlP221tHHt!HOd?H!OO!!!!OOOOùH?ll2?iii[1B?绻dBddd3Ou,###!!OO!# ݀ tHHO!!O!###uuuu XX##u#u# u#u#uuuuuuuuuuuu#uuuw##uu##O!!OOOOO!!!!!!uuuu####X###u #u####u####w!!Oݹ!uuuuu#uuuuuu#uuuuuuu#u#####uuXu!!݀tH!OHtHt݀ttÒ11!!Oi2X1ܺ ?t21 ?@1H"i2Nt21.HOtBOOOO!!!!7OOOOtBBúHHH1HHÒ2ܻܵhF33Bd3O2t#Ot!! ݀!!!!!!!!O!#!#!!uX##u#u#uuuuuuuXuuXuu#w###uOO!!!!OO!!OO!!!!u u # u uuuuu#u######!OO!!uuuuu#uu#uuuu#uuuu#uuu## Ot1O!OH!t.tݺtu! ݀Haylltt݀.2HH?HHHHl[2P|lP.1H!݀!tBtH!!BOOOO!!OOOHHHt1l?lll]FBBBBBBddl?.t??HtH ! .ú.!#uu!! #!!!!!!uXuXuuuuuuuuuuuuu##wuuu## 耀!OOtO!OOOO !tt!!݀#######u###!!uuu#u#uuuuuuuuu#u#uuu# u#耀#u###!!!!OtO!X݀!tHtB!X XÜO t,,Ht iܵliN l.1222.Pl1Ht!#OBHt!OOOOOO!OOHBHtHBHHB12?ll]]?BBBddl?i2oo .ttt݀!uuu#!!!!!!O!!#uu #XXXuuuuuuuuuu##uuXXu uu!!!!!OOOO!OOH!# .H1HH11Ht####u###u# uu!w# uuu###uu#uu#uuuu#uuu#uuuu#u! # #!!!!! O!!.HHHH!u!!H21OXttH?1XݺtútBl?i1N21P1tHH!!!!!tOOOOHHOOOOO!OOOOBHOtHH11B1H1BB?h3??dBBBBBddd??d ݒo.N2.o .# !!XX!#!!!O!!!!!uuX u##XuuuXuXuuuuuuuuuwuu#uuuuuuXX#BHOtH!!OtOOO!!OO耀 tHl111tO##uu##uuu#!uuu##uuuu#uuu#uuu#uuuu# uu!####!!!ttttO.t!!.HÒH121d1}#XBlyiX1li tll.111Ht1i[ltHHt!!!O!!!OO!OOOOOO!ld1ttHOtdddBBBBBd?dddd o1Ht! XuuXuO1B1!uXu#u##uXXu XXXX X##u#苋ɌX X # ݻlHO!tOHOOO!!!#X!.HHHttP?"ޒHH!##u##!u!Ow#uu#####uuuuuuuuu#u###uuu#u#! !!!!O#OO#ut[!# Oh?B!XBXlO!Ê[".?ޒ1"22|P2HHH!!!O!OBOOOOOO!OtBBBBHBBB紴d>>BBddddddH.! tt11O#Xu!OH11H!u u##X#!!uX!X݀wwu##ww#,XOHl2BHHHtùOOO!!!t.!tXҀ1??lNPoPH!!uu#!!!#uu##uuuuuuuuu#u#uuuu uu#!!##! #耺BXXO#!.oHiމi?H uB1d?!!?OÀҀ1 121i2P.!!!O ##!7OBBBHOO!!1BBBBHHOBdddBBBBddddddddd..tt 1221.1Ht!O!##!tO!uu!!!!!!tO!u H÷?t XOғXuu#uuw#X y{dHO!O!!!!!!OO!݀!t111N2. .!#u#u#OO!!w#####uuuuuuuuuuuuuuu!!!#u##!耀u#!O,21|Hld[BBO!#O! O!Xtt2P$ 2NNliiN21HO!!Ou#u#!BHOOOOO!OOOOO!OOBBHtOOOtBBddd?ddBBBBBdd>ddd> .lt..HHܺt!O!#!! u !!!!u #O1i2?tt1HoouX#u X#u@?1H݀u!!!!!O݀݀ !tt..HH2iHt!!#uuu#OHHOO!!!!#u##u#u#uuuu##uuu##OO!! u###!O!!HOt܀t1[|$#OH@?.!!!! O#!2! .tN2N2?N"HH!!!####!BHOOOOO!OOOOO!!!OOBHOtHHHOOOBBdddddBBBBddddddd1. ot.ttot.tt݀!݀u# u X XH! # u u@[H2[?"P. .11BH!!!O!!!#O!OtOOt!tÒt|OOOu#uOBB!!#######u#uuuuu#!O#####!O!Ҁi1.H$"P??HH!O#1!t!H?O!!OB.111"i212[2HOOOO!###XXXu#!!!!OOOOOOOO!O7!!!7O!!OtOOHBO!BBBBBdd>dBBBdBB>>>|?oott.tt.݀u X X##OH݀ X .?lYy?$P|ZZ.PPH. .!u u OtO݀!!!1B11ttt2Nit#u#u#OBHO!!u######uu##uuuuu#!w#uu u##!O!!!݀tttot"Nt.X!HuX B!H!XH!Xt.H12@?"P22l@H12!!O!##uXX#!OOOOOOOOOOO!!O!OOOOBBOOBBBdBBBBBBBBdBBddZaZtP[N.o.ttu XX #!.O.!tt. t.t.2%Z"||Z$$"PP1l! !t, !!#O.!#!!O!t11.."ZiN!##!耀!OO!!!!#u######u##u####uu Xuu## #u #!t!!!.tt.it2t!O!u!!!O1tt?y߷N2ili2?l121.O#!##u!!Odl?dBBBBtOOOOO!O!7!!!!OOHHtHOtOddddddd>B&Bddddddd P[Zt.l P.!! uX t1?dO#...o.t.?2HttHlaNi@.$$Z˶o. .X u !.t1HHt!X X !tOHܒtt21N1?P1OO耀!OO#u##u#########u####uuuu##u uuu#!OHO.tt12.H|1t tB!#!uX1t!H?tHNl??2l["NiN2H1HHO##!B??BBBùOOOOO7!!!!#OtHOHddddd>BBBBBBBddddBdddd@P.H2[@t..tt..݀uu !?lB݀Ol21Ptt1H.ttN$PZN|?t.H ݀HH݀tO!OOH?@N.HH..ttHHO!O!!#!!###uuuu u####u######uuuuuuuu#uu!OOBHHHH2NN. #!BOOH!t tݵt!HHHHN@[i?굵lt.tt݀##OHBBBB1l?1BHBOOOO!!!!!!OOOtHBHBBBBB>BBBBBd?ddddddd1ttt..ooott݀ uuûi1?!!!!!.t2ii2HHHtHt....t궵2?i.H1H1t.݀! tHHHH.. ݒt!!OtPyl otoHtOOOO###uuuu######u#u#耀!!uuuuuuuuu# !!.OtOHttHH2| i1. H!tdB?!BhHHtlttNlttH?l2li21H.tHHO!#!BdlBBBBHO!!!##!!OOOHBBHHBBBBBBBBBddddd>dd.Ht. ݀tt!#uuu u!!݀ ,X##!HݺHXot!.tt.H2@H2HHHOHt11ܜ.t12l..HtH1HtH1ttY , 1.꒶?!!OOO!#!uuuu######u#!O!#uuuuu##### !!.ttOt1H.H .P22t.!#!OôHH1!t .[2tHtt2?[2ܒH22HHHtO!!#####!OB??BBOOOO!#!OO!!OOO!OttHBBHBBBBBBBBBBdddddu !X !tt݀uuu!wXXu!!tHBOt!2Ot..NB!OtBtOOÜ2y@i.2i?1t?[PHP1t1tt[tNtttt1.t!!# #! u#######uuu#!!!!#uuuu######!!OttttO1HoH1H.݀OOO!O!!O!Ohltt.tttl?21l2il112H.tt!###!21lll?lBHBOOOOO!!!!OOOOOtOHHHBBBHBB&BBBB&BBddd?d>d X##!!!##uu#!!d݀!X!uuB# #.tttHO!OBHHHH.H.1l2221HtotHHO!dtOPܒ .HP1Ht ## !uuuu#u###!!O!wuuuuuu#### #Otttútt2tt݀!OHOB#!lH!!XOtt2.to2l޵NtHt2l.HtH!u#uuu!tBlll2l2lOOO!OOO7O!OOOOO!tOHBBBBBHBBBBBBBBd?ddddXXuX####!##uwu#!O!#t#!##Ou u !!1HtH!tHHHH111ܶH..HHÒHH1t!!tܺ.11lH11H# #!!!#XXuuuu#######!!!OXu#uuu#u###ݺO.tt1.!,11. X#!!!t?2!Bݒl  1[@[2Nt.t2HHݒB!#Xuuuu##uOHBlllllN?ll2ܴBHH!O!OO!O!O!OOtHHHBldBBBBBBB&B>d?ddd紴#u##########uu#OO!O耀uuOO!## !tHtO.Ot1H1tttH.1Hút..ttiH1dHX#o...tHt.u!t.tOO#XXu##u###!!7!#uuuu##u#u###Ot.ttútt! #tOO!##!XHB??ttt.ol[iltH.ꒀ.Ni݀! Xuu#!!OH1l?l2221BBBBBO!OO!!OOHHBBB??dBBB>>Bd?dduXXu7X#u##OO!!!!##!#w# !tHHHHHtlt2?tH....t..o..1?݀!HҀ!tH212tHH2HHuHHtO!#Xuu####!#Xu###u#######耀t.!.t !ݺ݀OOO!!!!!!iP2XtiZ[޵$tt1ܒ..1lit?.HOttt!#X#uuu#!OHB?l2ܶܶ121HHHHHHHHOtt!OHOO!OOO!OBBBlBBBB>>?3d>>d33uuu##XXu#X u####uu#u tt!!!OOOO!O#ݺHHtOHtH!tH.ttÀ.1Hli?iN2Hܴ!!O#!#tHl.Xt!OBtHHHHO!u u#X##u########uu####Xu!t!!.tú u!!##!!!!7#tu! H!H. HP?1H귱i2t1tH11H.tP2HttOt!##uuut!H1Nl222ފ?211HtH1lN1111HO!OO!!BBB>d?>BBdBddd?ddd&3uuuuuu## u Xuu####uu#u .HBúOOO!!# !H1Hu!H.!tH!ttH1!!tO?{ö?hld1O!##7OOO t.!##!!tBÒ.ttO.!!##uuuu#uuuu#uu###u###uuuX# X t݀!..tt!uu###O!X#X!#!Oݜ.l.Hi11H1HHHNlP..t.OO!!###!!tH2l2lN[Nފ11Hލii2HHOOOOOBddBBddd?dddddu#uu## u# XXuuuuuu##.1BHHHOHO!#uX!ttHtO!tOHtyHt!꺒hFܰX#!!7u!tttBO#!!OOHtt!!u#######uuu#u#####u###uu #u #!.ttt݀! !!!!B!tO1 uX[OltH1iiHH.HPHHt2Pt.O!######O!HHl2?2222H|iN?{H[11HOOOO>dd??dBBBdddd?dd??ddd3uuu## u# #XuuXuuu !tHHHtOt!Ot! H!11HtttOttOtl?lhlBt!#OÜִ ###!! HH!OHtH1HHHt!#!!####u##u##u#####uuuu u!!!OO. u# 耀!!!OO!O!OOl2tlN?2lH[t1N2i[t !!u###OtO???11212[i?@hl.N"@N?2HOdddd>ddddBBdddd??dluu#u!u!#u XuuXXXuuuH11H!!.11t!ݒ1HHH!!HOt2tlldhhHl_!! !X!#O݀tHH#!#t11tH.!!!!!## uuuuuu#u####uu# # #!!!!!!! !tOO.O!###!#uݜ݀Ht?HHtH.NtHHHtt݀#u!#OB2l22iiiN"i??ti?l1BtBBBdd>dd??ddddddddd?dl?duu##!!O!uuu XuXXuu耀ݺP2ܒtH1B.lBHt!HOt1???@yhiyhشBdF3c_#X.݀X!!O!!O.tH!݀!t.t.t!!O!!!!#!####uuu#u#### u## #!!!!!!## .11 !!O#OXH?a2tHllN?Ho2ޒoH@?H!!!O!OOBlhli21Ni[ill?HꜜܜHOO!7!B>ddd>dd?ddd?d???l?ϻdd3uuuu!OHH!uu Xu#!OOt121l?l.HH22l2Ht#tHH1BHd{{hد{h<tttt݀ u!BBOO! ݀t. !!!O!!!!!!!!!#uuu#u#u####u!# #!!!!!OO!耀.1H1HO #Xtuú 11HHt .t[lPtH!tO!OOOOOHB?@?iilllli2??HBBdH1}OOO!!O!ddd>ddd?d>d??紴d?3uu#躺}ú#uu#!úH11222@[?i1[1Ot1l!dHdBBdBd?t.#!ù!OOBB21.H Ht.1t !O݀# u!!!OOOO!!##uuu####uu u! u#!!OOO!7#.2222!t݀!OO!O.1ݶ?H1 Hi1tHH.H.2HH#!OHtOOOl{[ih@߰ll1HBBBBO&Bddddd?dBd?ϻ??ddddd>d3##u#u#B#X.# u.t!HútHll1BHlHlHHtHllO?Hllt?HO1BHd}Ocd>OݒNHHH݀!O}O#!Bt.t2Pt21t.!!O!#O!!OtHHO!###uuuu#######!Oݹ!##t1P2lt.!t #!1 ݀ ݒtt1ll1iiHPt2ttPHHH݀!#HtH!̀!HNiN[@N@@@l2BBBBBBB!OOBB>dddddd??d紴3dhddd3du###!!!O!!!!݀XݺHHHtHt.HHtt21HH!t!1l?O1BHÜ?l?BB!O#!OB贷1H1t!uu###!O1lt1H2HO!# !!!OH!#uuuu######u##XuOOO!#u##1P22t.݀ OX!!uX tHݵltNH1t..12P.H.!!tHBlÀ!!HH?NNiit22" BBBBBBOOOBd?d?d?ddddd3d?3d3>>>u#!u# u!݀O!tHtttO..ttHt!...Ht!tHtHtH11td?1hX!Oddu!#O#OOHH|? uu,X!12[YPt1tOO!!!# ttHHO!耀##uuuu##u##uu uuO!!!uX u #!Ot1Ò1t݀ u#! H Ҁt2i2.t.tHHݒ2ltÀ!tBHOHHH12N"ilNl1N$@"il2BBBBBBOBBddddddddd??ddl紴hd>d3dd>d:<>>玌uu#u##ݺt!OH궜11HtOO!OBBHHOH݀!!Ott!1dúHthlh!d3%5%5_%t1t.uXXu##tH1Hl?11ҒNÜ1t!uu XX#!t1Ht!!OO!u#uuuu####u#uuu##u #!!!u#u#ttot1!!!u u!!!H.H1[?2H1t.t?N?.?lt11H !1HHt.ltH122N|@lꊵ N[N"[ ldBBBBHHBd?d?dddd?d?dd???ϴdddd>dd>]:™XXXuuu XXu!!H1HHÒOttOHtO!X !ttH!2 2{B%%3?3{5Y_Y{! #ÜP11P!!Xݜo?2P#####uu tHHHH.OOOtOO!#uuu##### # uu !!!w#u##!tiitHú!!#OHO# !ÒPPiiHHt11 t?HO1!11HtHHBHH?lN""|NN2H2[2|[1Bdddd?dBBd???ddddd??ddd?ddd>dd:Jd>:J:duuu#####!OO!OHt1tHH1 t. ! !݀#X#!1!B33&>T33h݀###!ݺ.oo.H.!ݺ!##!ttlB.!ttO! #Xuu! !1ú!!݌!Ҁ12.P.t..1NP1.t.NPPPPl1tPHHH2[21t.ttH t1?lP2tH1tH1[NN[N2Nld?ddddHBl?ddd???dddd?d?dBB>>ddd>>>3]3uXuuuuu###uuw7OO!!Hú2P22.11H1ttttt!tt݀!t!t!Ü1ú]B73d>BG>> !#!O. o21ú}!݀tX,!!!tBt!tttO! XX u#u#####!຺! uOH%2.t22PފPo2P1Ht122NH1PN1Ht..HtҒ2?O22lN2li2"N""i2[iil?dddd?ddd?dddddld?dBBdd>d:3>uuuuuuuuuuuuuu!!#tt?i?211t!1!!OÜlwddO>&777d>>ddBX Xu!!݀u .2[i11B!uu?{.܀OtOOH1H݀t݀ u#u##uu#u#!....݀u !221Pt2.lt2Hꍉ|2"2HNްN[|"˶.l22P11tHtHt11to[No2lll1[NiiN|"i ?Pް[illܴ??dddd???d?l?d??dddddldddBdd>3::uuuuuuuuuuuuuu#!OtO11lilPl22Ni?1܊Btt!tܺBBB3dB#}G7>3dBBtXuu###!!!X ..1ܷ[u!!O!ݺ H1õ1 tHt!u u!!݀#u # ##!O..ҀHttN@P21i?lHHN2[[@iiiNP222Z|"Z[[Zi2NN2ii2H21H.2121PtOh??l[[[[i222i2?2lldddddddd???ddd???d?dd>dd3uuuuuuuuuuu#uOtH2lii??@2ܒHHt!!HBH}d?d?dd۹}O7>B>dOuXuXu#!O!݀ݒܶPuBBBXuOu #1HH!t11ou u!!!!##uuuu#!!t... .HHlZlti  1@t굊NNi"޵P Z Z"2HP?l2lO t܊?lHiii1lN?ll2꒒2갵ll??1lldldl?d??3??dddd?紴?ddddd>>>d><J:uuuuuXuu#uuu####耀!H1??1t?HdHllHtHt!utdBddۻ?ddBdBwOwdwXu####!2[{ ? HuXOwu!݀HH.t.X .t!O!#uuuu!O!o.o .1H.HHi[1 ! !ܜ?? ya$al"aN|ˊ"212N["ll2HHtHHH,.l܍i???2H2222P21?lll2HHddlddl??3???ddd?ddddddBBdddd癙™:ęXuuuXuuuu#!u!!OHl???l2i?HtH!!BBd}dhhBOBO#!O!!u#tÜ2l2h??w#u#uu!Hݺ1l2HH.. uݹO!##uuu#!!t.....22?N21tt݀X!!1h2l@12221N[[|Z Z"2HiNi2l1lHtt11l@2i?N2222l11l2llBHBBBldl??紴3???ddddd?ddd?ddd>B&BBd癙Jf>::<uuXuuuuXu#!BlHl11y%?3?l1!躹&!}BOBddOuOO!#WwOOu!.O.. !#uO!!u###OHtt2tHt.݀t!##uXuuu!!O!t...P.!1PttOlܵ%1.12i?"NP|$ "Z$ߊl22l2꒒t12HtHꊵ2??l22?N2ll܊l1BBBd?l??3hl???ddd??dddddBBBdBB&̹d3J<dŽnn:uuuXuuXuuuuu#!OOHHHl?h%{dB?c[1ݺO!!!wOwO1}}hOÜ uuXXXXu #ݹHH121u u!!!HHt221t!.t.t!u####!OttH1t궶2P21H$Z1t! B#uH# t2iN@ZZ$|" [it1Niii2l212.lll?NN?l22l?2l2BBBBB33?ddd?ddd???ddddddBB̹d:JJĎ:nuu#u#!OHH11BBHB1dhl{aOO3@OOBHO#!!wOO!!O#d}#!wOuuXXXuu###!t݀H ݀! tO!O!!ݺú21Hto!O!u#uXX#!!OtHH..2.?@2i1 t !H[@{ܺ.t!.1.tN"Z [ Z$[ [ "2ܵ޷Nii1HHHt2NNll?2222?22l2N?ldBBBddd?h333ϻd>dddd???dddd>&33ϙJJd>&dd3ώ<B&dJ:<:J<d33:JT:Tϙ!!!O!! #!OtÒ11HHO1BHddBO#B3BBadܜO!݀w###uuXXw#u#uuu####OOtt݀ Xui?2P2HHÀ.Htoo!OHO!w! !HHH222tP.HutO!uOO?t P?[2"߉Pi "NiN2l[?l[[ [N21l@{߉["222?221111dll?hh3h]]33紴?ldd>>d>B&dd3333:::T::JTY####!!OOOOOO1tݹttHtH?BOO!!O!Oh!B1dܺݺ!!#uXu#ɹX#Xu7w##uu #!!OOHHHOú݀u#t!t2l2P11tHttH1HtHOO#!7!HO.HފP1H.11..HOO1OuO OOt12Z1PoNꍷ2N2lll2?@iN21Ptt1?i[@Z߉Z@|iN11211l2dl?hl?]ϻ3ϴ3??dddddd>ddB>d333:::T3J>YTuu##t1HÒHH11úH!XXuXO!!B[?HlHX#!u#u#uXXXXuXuuu#XXt11Bt݀!! ݺl#uHH.t?꜒.tttOHB##!݀!!!tHoPt.tú.݀OH1H!!tt [NPi2. @l2l?lil2lߍ$Z[2l1tHHHH?i[߉ [[l1111ꜜ2?lll?dd?33h33333333ϴ????l?d>dd>>dd>d]]::ϕ]####O.t1HÒt.O1H1?l2h? ݀#O!!O[?2ܜX#w#w#!wwwu###uuuuX!.H1P11HHHO݀ݺ.݀ O!ݺHXܶ1t.tOHO!!!!#!!!O!!.HtP|"|l11Ot11݀!#H1i 2l.P|2[l??l??lli[a$߉Z[[i?21HHHl?i[ZZ[l22?2BHB22?i33333]]333333????dddddddd>d>>>>d3:T]Fuu## #!.ttHHHHHtO.BÜ11H!!!XOHHH.#!##!u!uuuuuuuXXut22.!݀!..!ݺt!!1Hݒ.21l1t...ttHHtO!!#!OOO!!.P˰ |1HO.tÜi# !...i .NaZ[ll???d?lld܊@@@$$iNi21Ò1ܴ[@Z|l2221HHH1ll??iihh33333333333333dddddddd>>dddd3:5F#!##!tݺtHHHOOOtOlBtB1Ü1OOO#!OB!!OHH2 OX##u!u!O!#u## t2t !HݜH!!tttܒ1.tH21HHBO#!##!Ottt!.t1NP..!tH!!tOHHto..˰$$H1t2?Z $Z[??lll?iyy$$$$Zi?221?hi?Z|l2ܶ1úHHH1l?hhϴϻ:3dddd?ddddd>ddddd33:T53_Fu#! !HO.tttOttOO#HdBOOd?H1BHO!d!!OH222!u!1!!uXOO#!Ot.t..ttH!ݺBttBÀl2l111HH1úHO#O#!ttO.ttP[|޶otO! !.BH!.tHO1??P..޵|N[@ZN߉2Nll?[%$$$Zl2l?2lݜÒ12?Ni"ܜ11112hdϻ33ϴ?dddd?ddd>ddd>>>d3ϻ]3:F;TTT53F5#!!!H!ttttOOOOOOO!HB1!l{h#OOHtOOH1lNÀ.Bl?OHly u !OHOtÒú..tHÜú.OݺH11l2.HÒ1ttO!##!!!t!ݺ..tN|N22PH.tt!Ot!ttttt!OO12lފN2NN2?ll?122B2hߍ[ill??l1ú2lhll?N"22211l1ldl?ihihhhi????ddddd>d?B>>>>d>dϴ]T:K:_FFFF!!!!HOtttOO!O!O!!OOO1Hl!B!OHBHHtH.ܷ?t?u1ݺHtHH1ܵ2HHl!!!ݜl?Ütt.t!tHÒO..!#!Ott.|Pt.. !OHtOO!tHOt![@2112P11BHBH?iiNi??lÒB1HHúÜHH?l?11111útHH1?l????ll?ldBB>ddddBBB&BBBBBBBB>>>dd>>ddd>d::::T3d>d ( (!(")%*&+'*'*))))+*+*+()&*%)$-+-+-+.,.,/-/-/-.,.,/-/-0.0.1/1-.+.)0*2 ,3",4#-7#.8$/7"+9$-:%,<'.>'/?(0>'->'-=#.<"-8 -6+5*5*4+4+3-3-3-3-1/1/1/1/0/0/0/0/0/0/0/0/0/1 02!13"23"22!11 00//1/1,0*.(,'+%*$) &%$"!!""! !  !!$#" !#$%&%%%%%%%% $ $%&&% $ " !  "#$%&%%%%%%%%--,,,+++,,,,,, ,,+++,,---,-. / /.-,........!0!0!0!0!0!0!0!.#/#-#-#-",",",",$.$.$.$.$.$.$.$.!+!+!+!+!+!+!+!+#-$.%/&0(2) 3*!4*!2( /( -( -',),),(+(+(*(**++,,-,-/.-.(,(-*/,1,1+0*/).(-',',&+%*$)$)"(#-!-",",%-%-&,&,$(%)&)&)'(()*)*)4"04"05#15#16$07%1:&1:&1?)5?)5@)3A*4A*2B+3B+3C,4E+6E+6G,5H-6I.7J/8M/7M/7O06O06P17Q28T49W7^:j=:j=:j=:m<8n=9n=8n=8pA;pA;oC:oD;nF:nH;mI;mI;gF7gF7hG8iH9jI:jI:kJ;kJ;lKgI>fH>eG=dF>cE=bDjH?kI@kI@lJAmKBnLCoMDpNEpNDuOFrNBnLBiK@hJ?hL@jLBmLCkHBnICqHDmFAf@=_>9]<7\=8\=;^?=aB@bCAbCA`A?]><[<:_@>^?=\=;Z;9X97U64T53R44R46P37N15M04O13P24S36T47O/0O/0S10U32X44Z66\97\:8R65M32J0/I/.M1.N2/M1.K/,P3/P3/R51S62V72W83Y:5X;7Q95O:7P;8P;8R:8R:8S:6T;7U<7V=8Y>7Z?8]@:^A;_B<^B>`DC^DE_EF^DE]CD[ABX>?W=>Z@AZ@AZ@AY?@Y?@X>?X>?V>>O<8N<8O=9O=9Q>:Q>:S>9S>9R>7UA:ZC;^G?cJCdKDeLEeMCbJ@cK?eMAfNBgOCfNBfNBeMAgOCgOChPDiQEiQEhPDgOCfPBcN;bP:cQ=cQ=cPAbO@aMB`LA[G@ZF?YDAXC@WBAXCBYCEYCE\BE\BE[AD[ADZ@CY?BX>AX>AW=@W=@W=@W=@W=@W=@W=@W=@X9>X9>Y:?Y:?Y:?Y:?[;@[;@Z7=Y6qPAtSDvUFwVGvUFvUFuTEtSDrQBpO@nM>lK'/?(0>'->'/=#.<"-8 -6+5*5*4+4+3-3-3-3-1/1/1/1/0/0/0/0/0/0/0/0/0/0/1 02!12!11 00/0//1.0+/*.(,&*$)$) &%#"!!""! !!  !!$#" !#$%&%%%%%%%% $%&''&% " "!!#$%&&%%%%%%%%,,,,,+++,,,,,, ,,+++,,---,-. / /.-,........ / / / / / / / -#/#-#-#-",",",",$.$.$.$.$.$.$.$.!+!+!+!+!+!+!+!+#-$.%/&0'1) 3) 3*!2( /( -( -( -*-),),),)+*,+,+,+,,-.-,-)-).*/*/+0*/*/).',',',&+%*$)$)#)#+!-!+",$,%-%+&,%)%)&)'*'(()*)+*3!/3!/4"05#17%18&2;'2;'2?)5?)5A*4A*4B+3B+3C,4C,4E+6F,7H-6I.7J/8K09N08N08O06O06P17Q28T49W79qBkN>jM=iLeG?dF>cE=bDjH?kI@kI@lJAmKBnLCoMDpNEpNDtNErNBoMCkMBjLAiMAjLBmLCjGAoJDtKGqJEkEBbA<_>9\=8]><_@>aB@cDBcDBaB@^?=\=;\=;\=;[<:Z;9Y:8X97X97V88T68R59P37O26P24Q35S36T47P01Q12T21U32X44Y55Z75Z86R63L21I/.H.-L0-L0-K/,I-*N1-O2.P3/R51U61W83X94X;7Q95P;8P;8P;8S;9S;9T;7T;7U<7V=8Y>7Z?8\?9^A;^A;^B>`DC^DC^DE^DC]CD[A@Y?@W=X>?X>=W=>V>:Q>:R?;S>9S>9S?8UA:[D<_H@bIBdKDeLEeMCcKAdL@eMAgOCgOCgOCfNBfNBfNBgOChPDiQEiQEhPDgOCfOAdOAW=@W=@W=@W=@W=@W=@W=@W=@W=@W=@U8$/=%2?%2@&1B&2B'0E'/E'/I*0H)/J*/N+1R/3W48]9;a>nL@nL@nL@nL@nL@mK?kI=iG;gE9fD8dB6bB7`E>^E@\E?YE>VB;R?8O>6M<4 ( (!(")%*&+'*'*))**,+,++(*'+&*%-+-+-+.,.,/-/-/-/-/-/-0.0.1/1/2 0/+1+2*3+4 ,5!-6 ,7!-8!+:#-;$.?%0@&/A'0@&/@&/=#.<"-8 -6+5*5*4+5,3-3-3-3-1/1/1/1//././././././././.0/1 01 01 01 00//..0.0*.)-'+&*$)#( &%#"!"##!!"!  "!$#" !#$%&%%%%%%%%&'())('$$##$%&''&&&&&&&&++++++++,,,,,, ,,+++,,---,-. / /.-,...............,".",",",#-#-#-#-$.$.$.$.$.$.$.$.",",",",",",",",$.$.%/&0'1(2(2) 1( /( -( -( -*-*-*-*-, .+-,-,-,-+,-,+,+/*/).(-(-).*/*/',',&+&+%*%*$)#)"*!+!+",$,%-%+%+&*&*'(()())*+*+*2 .3!/4".6$0:&2<(4=)4>*5@+4@+4B+5B+5C,4C,4F,5F,5G,5H-6H-6I.7L.6N08N08O19P17P17R27S38U5:X8=]:>_;=g>9k>9o>:o>:p?:p?:tE=tE=rF=rG>pHkN>iLeG=dFcE=gEkI@kI@lJAmKBnLCoMDpNEpNDsMDrNBqOEnPEmODkOCkMClKBjGApKEvMIuNIoIFfE@a@;]>9_@>`A?bCAdECdECbCA`A?_@>[<:[<:[<:[<:[<:\=;\=;[==W9;U87Z?8\?9]@:]@:]A=_C@^EA^DC^EA]CB[B>Y?>X?;Y?>Y@=X?;W=:V<;U=;P=9O=9P=9Q>:Q>:R?;S>9T?:W@:XA;[D<^G?bIBdKDeLEeMCdLBeMAfNBgOChPDhPDgOCfNBfNBgOChPDiQEiQEhPDgOCfOAfQ@fQ>fQ@eP?dN@bL>`J?^H=\E?[D>ZB@YA?X@@X@@Y@CY@CX>AX>AX>AW=@W=@V:V>:R=8P;6M:4I81G6/ ( (!(")%*&+'*'*****,+,+,)*'+&*%-+-+-+.,.,/-/-/-/-0.0.0.1/2 02 02 01+1+2*3+4+5,5+7,8 -<"-=#.?%0@&/A'0A&/@&/>$/=#.9!.7,6+6+5,5,3-3-3-3-1/1/1/1//./././././././..-/.0/0/0/0//..--/-/)-(,&*%)#("'%$#"""#$"!"!! ""$#" !#$%&%%%%%%%%'()**)('&$%&&'((%%%%%%%'***+++,,,,,,,, ,,+++,,---,-. / /.-,........,,,,,,,*".",",",#-#-#-#-$.$.$.$.$.$.$.$.",",",",",",",",$.$.%/%/&0'1'1(0( /( -( -( -+ .+ .+ .,!/-!/-!/-.-.,-+,,+*+-1*/(-',&+',).*/&+&+&+&+%*%*%*$*#+!+!+",$,%+%+&,'+'+())*)**+,+,)2 .3!/4".7%1;'3=)4?+6@,7A,5A,5C,6C,4D-5D-5G-6G-6H-6I.7I.7J/8M/7O19O19P38Q28Q28S38T49V6;Y9>^;?`<>i=9l?:p?;q@;q@;rAnM>nM>nM>nM>nM>nM>nM>oO@lO?lO?jM=iL>hK=hK=gJeG=eG?fE>fD;fD;eC:eC:eC:gEkI@kI@lJAmKBnLCoMDpNEpNDrLCrNBqOEpRGoQFmQElNDmLCkHBpKEuLHsLGmGDeD?bA<_@;aB?bCAdECeFDeFDeFDdECcDB^?=^?=^?=]><]><]><]><]=>Z<>X;?X9>V77Y>7[>8\?9\?9\A:_C?]D@^EA^EA]D@\C?ZA=Y@:W>:V=9V=9U<8T<8P=9P>:Q>:Q>:R?;S@_G=]F>]D?[D>Z@?X@>X>?W??X>AY?BVU;>U;>U;>U;>U;>U;>U;>U;>U;>U;>U;>U;>U;>U8".@$0A%1B&2C%/A&/>$/=#.9!.8 -6+6+5,6 -3-3-3-3-1/1/1/1/.-.-.-.-.-.-.-.--,-,.-/./..--,-,,.+-(,'+%)$(!&!&$#"""#$%""#""!#"$#" !#$%&%%%%%%%%()****)((((()))*&&&&&&&&())*++,,,,,,,, ,,+++,,---,-. / /.-,........,,,,,,,*!-!+!+",#-$.$.$.$.$.$.$.$.$.$.$.#-#-#-#-#-#-#-#-$.$.%/%/%/&0&0&.&-&+',( -*-+ .,!/,!/."0."0. /-.,-,--,+,-1+0(-&+&+&+(-).%*%*%*%*&+&+&+%+$,",$,%-&,&,',(,),),)**+,)-*-*-*3!/4".8$0:&2<(3?+6A+7B-6C,6C,6D-5D-5G-6G.4H/5H/5I.7J/8L.6N08O19P2:Q28R39S29S38T49U5:Y6:\9=_<@a=?i=9l?:m@;q@;rAtJ>rJ>pK;oK;oK;oN=nMpO>pO>pO>pO>pO>pO>pO>pQ?oP>oP>nO=mM>kKjJ=mM@lL?lLAkK@jI@hG>hG>gF=fD;eC:dB9dB9eC:fD;gEbAeCAfDBgEChFDiGEiGEiGEiGEfDBeCAdB@b@>a?=_=;^<:\=;\>@\=B[=?Z<>Z:=X8;W78V67Z89Y76Z66Z66Y64Y64[54X53U64P20L.,K-+K-+K-+I+)G)'F(&G)'H*(J,*M/-O1/Q31P41N64M85M85O:7R:8S;9U<8U<8V=8V=8Y>7Y>7Z=7[>8[>8Z?8^B>\C>]D?]D?]D?\C>[B=ZA9W>9V=8V=8U<7U<7T;6S;7R=:Q>:Q>:R?;T?:W?;YBdM=fOAgP@hQCgP@gPBfO?eN@fO?gPBhQAhQCgP@fOAeN>gPBgPBhNAeN@fK@aI=aF=]D=_C?\C>\@?X>=X;=V<=X;=W=>T:=T:=T:=T:=T:=T:=U;>U;>T:=T:=T:=T:=T:=T:=T:=T:=W:>V9=U8".B$0C%1D&2C%/C%/@$0>$/:"/8 -7,7,6 -6 -3-3-3-3-1/1/1/1/.-.-.-.-.-.-.-.-,+,+-,.-.--,,+,++-*,'+&*$(#' % %##"!"#%&#"##"!##$#" !#$%&%%%%%%%%(()**)(((((((((($$$$$$$$'(()*+,,,,,,,, ,,+++,,---,-. / /.-,........,,,,,,,* , *!+",#-$.%/%/$.$.$.$.$.$.$.$.#-#-#-#-#-#-#-#-%/%/%/%/%/%/%/%-$+%*%*&+),*-+ .+ .-!/-!/. /-.-.-./.,/,0*/).',&+&+&+&+$)$)%*%*&+&+',',&.$.&.'-'-(.)-)-*-*+*++,-*.+.+.)5#/6$09%1;'2=)4?+6A,5B-6D-7D-5E.6E.6H/5H/5I06I06J/8K09M/7O19P2:Q3;R39S4:T49T49U5:V6;Z7;]:>`=Ad=>j>;k>9l?:nA;rAuD=vE>xIAwH>uI>tJ>qJ;pK;nJ:nJ:nMnN?lL=lL?kK>nNAmM@mMBlLAkJAiH?iH?hG>eC:eC:dB9dB9dB9eC:gEe?eFAgECgEChFDiGEjHFkIGlJHlJHkIGjHFhFDeCAb@>`><^<:\:9^>A]?A]?A]?A]=@\<=Z:;Y:8\:9[98\88\97\97[86]76[86X96T73P1/N0.O0.M/-K-+I+)E'%F(&G)'H*(J,*K-+L.,L0-K31J52K63M85P86R:8T;7T;7W>9W>9Y>7Y>7Z=7Z=7Z=7Y>7]B;\C<]D?]D=]D?\C<[B=[B;V=8V=6U<7U<5T;6T;4S:5R;5R=8R?;R?;S@cHAdI@bK=cLfO?fO?fO?eN>eN>dM=eN>fO?gP@gP@fO?eN>dM=gM@gM@gLAgLAeJ?cH?aF?`E>_C?]A>[?>Y=U;>U;>S9$/:"/8 -7,7,6 -7!.3-3-3-3-1/1/1/1/-,-,-,-,-,-,-,-,+*,+-,-,-,-,,++**,*,'+%)#'"& %$""!!"#%&####""$#$#" !#$%&%%%%%%%%'())))('((((('''########&'')*+,-,,,,,, ,,+++,,---,-. / /.-,........-------++ *!+",#-$.%/&0$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.%/%/%/$.$.$.$.$,")#*#*%,(-).*/*/,0,0-0. 1. 1. 101/!2+/*/*/).(-&+$)#($)$)$)%*&+',',',(.(.).*/*/+/,/,/,+-,-,.+/+0,0*0*:&2:&1;'2<(3?)5@+4B+5B+5E.6E.6H.7H/5J/6J/6K05K05M/7M/7N08O19Q28R39S4:T5;U5:U5:X59Y6:[8<^;?b>@e>?j>;k>8m@:nA;sB=uD=vE>wF?wH>wH>uI>sI;pI:oJ:mJ7mJ7pLqP?pO>oN=nMjH>eC:dB9cA8cA8dB9eC:gEfE@fGBhGBjGCjGCkHDlIEnKGoLHpMInKGlIEjGChEAeB>b?;`=9^<:]=>^>A_?B`@A`@A_?@_=>^<;^::^;9`:9`:9`:9`:7`:7^;7^=8X94V42R30T20Q2/O0-L-*G(&G(&F(&G)'G))H**H**H,+I1/H30I41K63O75P86R95S:6W>9W>9Y>7X=6Y<6Y<6Y<6X=6\A:[C9\C<]E;]D=]E;\C<[C9U<5U=3T;4T<2S:3S;1R92Q:2S>9S>;S>;T?bG>aJeN>dM=cLfO?gP@gP@fO?eN>dM?eJ?fJ?gJBgJBfIAeHBcF@bEA`B@^@>\>>Y;;W99W99V8:U8:R8;S9U;>V$/:"/9!.8 -7,7!.7!.3-3-3-3-1/1/1/1/-,-,-,-,-,-,-,-,*)+*,+-,-,,++**)*,)+&*%)#'!%$$""!!"$%&##$##"$#$#" !#$%&%%%%%%%%&'())('&((('''&&!!!!!!!!&&'(*+,-,,,,,, ,,+++,,---,-. / /.-,........-------++) *",#-%/&0&0$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.%/%/%/$.$.$.#-#-!)!(")$+',(-).*/+/+/-0-0. 1/!22!30"3*.).*/*/).&+#(!&#($)$)%*&+',',(-)/)/*/+0+/,0-0-.-,-*-*.+0,0,0*1+;'2;'2<(3=)4?*3?*3A*4A*2E.6F/7H/5I06J/6K07K05K05N08N08O19P38R39S4:T5;T5:V6;V69X59Y6:\9=^<=b>@f@?j?9l?9m@:oBwF?xH>wH>wH>tH;sI;pI:nI9lI6lI6oK;oK;pLsO?sO?tP@tP@tP@tP@tP@tP@tP@tP@sR?sR?rQ@qP?pO>oN=nM>nM>pNBpNBoMAnL@mKAlJ@kI?kI?eC:dB9cA8cA8dB9eC:fD;gE<_=>^>A`@AaABbBCaABa?>`>=^;9^;9a;:a;:b<9b<9c=:c=:a>:\;6Y62V50U31U31R0.N/,G(&G(&F(&F(&F((F((F((E)(G/-F1.H30I41M53O75R95R95W>9W>9Y>7X=6Y<6Y<6X;5W<5\A8[C9\D:]E;]E;]E;\D:[C9U=3T<2T<2S;1S;1R:0R:0Q:2U=9S>;T?9Y>7Y>7Z?8\A:`C=aF=bH;aJ:bK;cLfO?fO?fO?fO?eN>dM?eH@eH@fICgJDfICeHBdGCcFB_A?^@>[==Y;;W99V88V8:U8:T7;S9V(4>(4>)2>)2?(2@)3A*2B+3G-6G.4I.5J/6J/4K05N16N16P17P17Q28Q28S29S38T49T49U28V37W37Y57[79_;=c>g<6j=7mA8pD;vE>xG@xH>yI?yJ@xJ=uIvQ?wR@wR@vQ?tQ>tS@sR?sR?rQ>rQ@qP?qP?qP?rQBpO@nL@lJ>jHc@?a?@b@AcA@cA@d@@d@@b<;b<;b<9b<9c;9c;9c<7b=7`;5^;5_:4[82X51S2-O-+L*(G(&G(&F((G))G*,G*,H+-F,-J20H30H30I41L42M53P73P73W>9W>9Y>7Y>7Z=7Z=7Z=7Y>7\A8[C9\D:]E;]E;\D:[C9ZB8V>4V>4U=3U=3T<2T<2S;1R;3T<8R=:U=;U=;U=;U=;W>:W>:V:6W;7X=6Z?8]@:_B<`C=`E<^C8]F8_H:aJeN@gPBhQChQChQCgPBfOAeN@dM?cL>cK?eHBfICfIEfIEeHDdGCbDBaCA\><[=;Z<V)2?*3@)3A*2A*2A*2F-3F-3H-4I.3K05L16O27O27P17P17Q28Q28S38S38T49T47V37V37X46Y57[79^:>g<6j=7mA8pD;vE>xH>yI?yI?zL?yK>uIwR@wR@wR@vQ?vQ?vS@tS@sR?sR?rQ@rQ@qP?qP?rQBpO@nL@lJ>jH=^>?`>?a?>a?>b@?d@@eB@d>=d>;d>;d>;e=;e>9e>9e>9b;6a<6a:5^93[52U2.Q.,N,*J('H)'G))G))G*,G*,G*,F,-H0.G2/G2/I41L42N64Q84R95W>9W>9Y>7Y>7Z=7Z=7Z=7Y>7\A:[C9\C<]E;]D=\D:[B;ZB8W>7V>4V=6U=3U<5T<2T;4T;4T<8R=:T<:U=;U=;V>:W>:W;7W;7Y>7Z?8]@:_B<`C=aD<_D9^G9_H:aJeN@fOAgPBiRDiRDhQCgPBfOAeN@dM?cK?cHAdGCeGEeHDdFDcECaCA`B@\><[=;Y;;X::W99W99X::W;:S9U;>U;>T:=T:=S9'1@)3B+5C,4B+3B(1A(.E*1F+2I,1K.3M05O26P37Q48P17P17R27R27S38S38V37V37W37W35X46Y57]67`9:c<=e==g<6j>5mA8qEyI?yI=zL?yK>uJ:sI9qJ9pK8pM9pM9qL9sM:sM:sM:tN;uOxR?yS@yS@xR?wR?wT@wT@vS?vS?uR?uR?tP@tP@tP@sO?qM?nJhF=gEb@?a?>_=<^<;`<e?:g>:g>:g>8f=7d=6d;5`92]61X2/S0.P.,L*)J+)I++H*,G*.G*.G*.E+,E-+D/,F1.I41M53P86R95S:6W>9W>9Y>7Y>7Z=7Z=7Z=7Y>7[@9ZA:[B=\C<\C>[B;ZA9W>7W>9V=6V=8U<5U<7T;6S;7T<:T<:U=;V<;W=;X<8X<8Z=7\?9_@;`AZ>=X<;W;:V:9W;:X<;X<;U;>U;>T:=T:=T:=S9'1A*4D-5D-5C,4B)/A(.D)0E*/H+0K.3M04P37Q48R59P17P17R27R27S38S38V37V37X46X46X46Y57]67`9:b;zJ>zL?yKxR?yS@zTAzTAyS@yS@yTAxUAwT@wT@vS@vS@uQAuQAuQAsO?qM?oK=mI=lHhF=gEiG>mKBnLCnLCoMDpNErPGrPGsQGwQHuQEqOEmODmODlPDnPFqPGpMGrMGsJFqJEoIFkJEjIDjIDmJDpKEqLFrMGsNHtOIuPJuPJuPJuPJtOIrMGpKEmHBjE?iC@dA?a?>_=<];:^;9`=;e?>gA>gA>gA>hA8e<6b93_62[4/W10T1/N,+L-+L,/J,.H+/G*.G*.E+.C++B-*F1.I41O75Q97T;7U<8V=8V=8X=6X=6Y<6Y<6Y<6X=6Z>:Y@;ZA<[B=[B=ZA9W>9W>9V=8V=8U<7U<7U<8S;9S;9T<:U=;V<;W=;Z>;Y=9Y=9[>8]@:_@;`AaI?bJ@bJ@cKAcKAcKAcKAbJ@aI?`H>_G=^F<^E>[B>\BA_CB]CB_CB\BA]A@Z@?Z>=W=W=@VT:=R8;R8;Q7:T:=T:=S97k?4nB7rF;wG=yI=zJ>zJ>{M>zL=wLxR?yS@{UB{UB{UBzTAzTAzV@zV@yTAyTAxS@xS@wR@wR@vQAuP@sN>pK;oIiG>iG>iG>jH?kI@nLCoMDoMDqOFrPGsQHsQHtRHxRIvRFsQGoQFnPEmQEnPFqPGpMGrMGsJFqJEoIFkJEjIDjIDpKEqJCrKDsLEtMFuNGvOHwPIvOHwPIwPIvOHtMFqJCnG@kF@fCAd@@a><_<:^;9`=;e?iA?iB=jA=jA=jA;jA;jA;jA;lA:k@9h=6c:4_62[4/X21U20Q/.O0.N.1K-/I,0G*/D).D*-A))A,)E0-J52P86R:8T;7U<8V=8V=8X=6X=6Y<6Y<6Y<6X=6Y=9X?;Y@:W>:W>:V=9V=9U<8U<8T;7T;7S98S98T:9U;:Y==[?<[?<[>:\?;]>9^?:_@;`AW?=W=:X>=Y?@Y?BW=@V'/@)1B+3D-5F-3E,2E*1D)0E*/F+0I,0K.2N/4P16Q35R46Q16Q16R27R27U26U26V37V45Z68Z68[45\56]67_89b::d;7i>7l@5oC8rF;xH{K?{K?{M>zL=wL;uL:rL9qL9qN8rO9tN;tN;tN;uOxR?yS@zTA|VC|VC|VC{UB{UB{WA{WAzUBzUByTAyTAxSAxSAwRBuP@sN>qLa>jC>kB>kB>kB:X>=Y@X?;W==[?<\@=]@<]@<^?:_@;`A<`A\C>Y@;X?:W>9V=8U<7T;6T;6S:6S;;T<Z@AZ@CY?BX>AVT:=T:=T:=T:=S97l@5oC8sG{K={K=|N?{M>wL;uL:sM8rN8rO9rO9tN9uO:uO:uO:vP;vP;wQzT?{U@|VA}WB}WB|VA{U@|XB|XB{WA{WAzUBzUByTByTBwR@vQ?tO?qLpKBmKBlJAkI@kI@lJAmKBnLCpNEpNEqOFrPGsQHtRIuSJvTJzTKyUIvTJrTIqSHoSGnPFpOFpMGrMGsJFqJEoIFkJEjIDjIBqLFrKDsLEtMFuNGvOHwPIwPIwPIyRKzSLzSLyRKvOHrKDoJDiCBfBBfCAeB@f@?f@?e?X>=X>?W=]?=^@>^A=^A=_@;_@;bAZA=ZA=Y@:V=9U<8T;7S:6R95R95P88P:=S>=S>=R=9U@;X@>[AB[ADZ@CY?BX>AX>AW=@W=@T:=T:=S9|N?{M>xM=uL:sM:rN8sO9sO9sO9uO:uO:vP;vP;wQzT?|VA}WB}WB}WB|VA|VA|XB|XB|XB{WA{VCzUBzUCyTBwR@vQ?tO?qLpL@nLBmKAlJ@lJ@mKBnLCnLCqOFqOFrPGsQGtRHuSIvTJxTH{UJzTGyUIvTHtTGpSEpPEoODrMErMErKDqJCoJDlICjIBjIBqLDsLEsLEtMFuNGvPGwPIxRIxRIySJ{UL|VMzTKwQHsMDqJCiC@gDBgD@gD@hB?gA>fA;e@:iB;iB;jA;jA;jB:jB:lA:lA:mB9k@7h;5c81]4.Z3.Y30W42W54T45R23N02J-1H+0D).C),B**C.+I1/N64Q97Q97R95Q84U<8U<7W;7W;7W;7W;7X;7W;7U;:V<;W=>X>=X>?W=\@=]A>^A=^A=_B<_B<`A<`A<`A<_B<^B>\C>[B>ZA=Y@:W>:X?;X?;W>:V=9U<8T;7S:6S98O77N98R::Q<;T<'/?(0?(0@)1@)1A*2B+3E,2F-3G.4G.4I.3I.3L/3M04N15O26Q35Q27S29S29S29T3:T3:U5:U5:W48Y6:Z7;[8<\:;];<^<;^<=`<{M=~O?P@~N@|N?zO?yN>xO=uO:tP:tP8sO9sO9sO9tP:tP:tP:uO:uO:{U@{U@}T@~UA~UAVBVB~XCZGZG}XE|WDzUCyTBxSAwR@zUEyTDwQDuOBsM@sM@sMBsM@oK=oK;pL>pL>pL@pKBqLCqLCvQHvQHwRIxTHyUGzVH{WG{WG{VF}VG}WJ}WJ{WIzVHyUIxTHsNErMDpKBoJAlJAmKBlKBnLCrMDrLCrLCrLCsMDuODwQHxRG}WL}WL~VJWKXL~VJxQBsM@nI@nIAnIAnIAnIAmH@mG>lF=mE;nF:V<;U<8U;:W>:Y?>ZA=W==ZA=\C?[?;[?;\A:\A:]B;]B;^C<^C<`G@^E>\C>Y@;X?:X?:X?:Y@;X?;X?;W==W?;Y?>X@X>=W=>T:;T:;S9:S9:S9?`A?`>_=>d=>h>?nC=rG>wL<|N>P>P>~O?~N@|NAzO?xO=xO;uO8tP8tP:sP:tP:tP:uQ;uQ;vP;vP;{U@{U@~UA~UAVBVBWC~XCZGZG~YF|WDzUCyTBxSAwR@zUEyTDwQDuOBsM@sM@sMBsM@rN>rOrN>qMAqMAqLCqLCuPGvQHwSGxTFyUGzVF{XE|WE|UD}VE~WH~WH|WG{VFzTGySFsOCrNBoMAmK?mKAmKAmMBnLBsNEsMDsMDsMDtNCvPExRGySHYLWK~WHWIXJVH|RBvO@qK@pKBoJAnI@nI@mI=nH=nH=nF:oG;sI;tJ:V=9U<8U<8V=9X?;Y@Y@;Y@;Y@9ZA:ZA:[B;[B;\C<_F?^E>\C:W>:W=:W>:X?;X?;Y@[B>[B>Y@=W=@_?@`>=b?=b?=b?=b>>`<<^<;\:9X89W78U79T68R46P24O05N15I03G13F02E/1E/1D.0C-/C-/C-/C-/C-/C-/C-/C-/C-/C-/C-/D.0F02G13H24H24G13G13%(%(&(')(')(+(,(1)1)3)4*6+7,: +9",:"07!.6 -4+2*1)2*2*0*0*/*/*/*/*- *- *0.0.0.1/1/2 02 02 00.1/2 03!14"25#35#36$43!13!12 01/1/0./-/-0.0.0./-/-.,.,-++*+*+*+*+*+*+*+*)()()()()()()()()+)+*,*,*,(*')&($&$&#%#%"$"$!##''&%$##"""""""""&&&&&&&&''&&&()*)*+,--,++,,,- .". . .........-+**+-.,,--..//.. .!/!/"0$0"0!/ / / / / / / / / / / / / / / --+!,!,"-"-$.$.%-&.'/(0)0(/'.&-).).).).).).).).',(-).*/+0+0*/).(-(-).).*/*/*/+0,1,1,1,1,1,1,1,0,0, ., ., .+-+-,-,-0/0/0./-/-0.1/1/2 .2 .2 ,3!-5!-6".6"-7#.7"+8#,:#-;$.<%-=&.@&/@&/@)1A*2B+3C,4F-3G.4I.5I.5I.3I.3L/3M04O05P16Q35Q27R18R1:S29S29T3:T3:U5:U5:X8;X8;Y9_=>f>?i?@oD>tI@xM=}O?Q?R@P@P@}O@{P@yP>yPpJ?sKAtL@sI=tJ>uK=uK=vK;vK;uJ:sI;qF=oD;kC;h@8d=6b;4_:4\95W53W53T53R42P22M//J-/H+-G-,G-,I/.J0/L21M32N43O54O54P65R87T:9U;:U;:U;:U;:W>:V=9U<8T;7T;7U<8V=9V=9V=9U<8T;7T;7R95R95Q84P73Q76P65P65Q76S98U;:W>:Y@]D=[B;ZA:Y@9Y@9Y@;Y@;V=9V=9V<;W==W>:W>:W>:X?;X?;Y@ZA=Y?>X>=T:;T:;S9:S9:R8;Q7:Q7:P7:M55K65K57K57K57K57K58K58M6?`>=b?=c??c??a?>`>=_=>^<=W7:W7:U79S57Q27P16N15K14L36I35H24G13E/1D.0C-/B,.C-/C-/C-/C-/C-/C-/C-/C-/D.0E/1G13H24H24H24G13G13%(%(&(')(')(+(+(/)1)3)4*6+7,: +8!+9#08"/6 -5,2*2*3+3+0*0*/*/*/*/*- *- *0.0.0.1/1/2 02 02 02 02 03!13!14"25#35#36$44"24"23!12 00./-.,.,0./-/-/-.,-+-+-+*)*)*)*)*)*)*)*))()()()()()()()()+)+*,*,*,(*')&($&$&#%#%"$"$!## (('&&%$$########&&&&&&&&''&&&()*)*+---,,,,,-- .".!/ ........ /-+))+-/,,--..//.. .!/!/"0$0"0!/ / / / / / / / / / / / / / / --+!,!,"-"-$.$.&.'/(0)1*1)0(/'.*/*/*/*/*/*/*/*/',(-).+0+0+0*/*/(-(-(-).).).).).+0+0+0+0+0+0+0+/.!2-!/-!/, .+-*,+,*+0/0/1/0.0.1/1/1/2 .3!/3!-3!-6".7#/7#.7#.7"+8#,9",:#-;$,<%-?%.@&/A*2A*2B+3C,4F-3G.4I.5I.5I.3I.3L/3M04O05P16Q35Q27R18R1:S29S29T3:T3:U5:U5:X8;Y9\<=]=>^>?`>=h@AkB@qF@uK?|N?R?R>S?Q?QA~PA|Q@{P?zQ=wR8wR8vP9uQ9wQ:xR;yS}W@}W@WAWAXBXBYCZC[F\FZG}XE{VCzUByTBxSAyTDxSCwRBuP@uOBuOBuOBvQAzUCzUCyTDxSCvPCuODtNEtNEvPGwQHxRGySFzUE{VF|WE|WE~WFXGXGYHXI~WH{UHzTGwSEvRDtPDqOCpNDqOEqOErPFwRIwRIxRIxRIySH|TJ~VJWK]QYLWJVIWIXJVHUH{SIvQHtNErLAqK@sM@vNBxPDvL@vL>wM?wM=xM=xM=wL8d=6b=7b=7[84Y75V75T53Q33O11L/1K.0J.-H.-I/.K10L21M32N43N43P65P65R87S98T:9U;:U;:U;:V=9V=9U<8T;7T;7T;7T;7T;7U<8U<8T;7S:6S:6R95Q84Q84P65P65P65P65Q76S98U<8V=9X?:X?:X?8Y@9ZA:ZA:ZA:[B;]D=\C<[B;ZA:ZA:Y@9Y@;Y@;U<8U<8V<;W==X>=Y?>Y?>W>:X?;X?;X?;Y@[B>[B>[B>[B>[B>[B>[B>\C>\C>]D@]D@\C?[B>Z@?Y?>U;=a>>c??b@?a?>`>?]=>W7:V69T68S57Q27O05M04K14N58K57J46H24F02D.0C-/B,.C-/C-/C-/C-/C-/C-/C-/C-/E/1F02G13H24H24H24G13F02%(%(%(&)'')(+(+(.(0(2(3)5*6+7 *7 *9#08"/6 -5,2*2*3+3+0*0*/*/*/*/*- *- *0.0.0.1/1/2 02 02 03!13!13!14"24"24"25#35#34"24"23!12 00./-.,.,/-/-/-.,-+-+-+,**)*)*)*)*)*)*)*)('('('('('('('(')+)+*,*,*,(*')&($&$&#%#%"$"$!## ('''&&&&$$$$$$$$&&&&&&&&''&&&()**+,-..-,,-- . .!/#/!/ ........ /-+))+-/,,--..//.. .!/!/"0$0"0!/ / / / / / / / / / / / / / / --+!,!,"-"-$.$.&.'/(0)1*1)0(/'.*/*/*/*/*/*/*/*/(-).*/+0,1,1+0*/).).).).).(-(-(-).).).).).).).)-.!2-!/-!/, .+-*,+,*+0/0/1/2 02 01/1/1/3!/3!/3!-4".7#/7#/7#.8$/8#,8#,:#-;$.<%-=&.@&/@&/D*3D*3E+4F,5G.4H/5J/6J/6K.3K.3M.3N/4O05P16Q35Q27S29V3:V3:V3:W4:X5;X5;X5;[8<[8<\:;];<^<=_=>`>=b>>iABmDBrGAwMA~PAS@T@UAR@R@QA}RA|Q>{RW>X?X?Y@Y@ZAZA[B[D\G\F[E~ZD|WDzUByTAyTAyTBxSAwRBvQAuP@vQAwQDwRB|WE|WE{VFyTDxREwQFvPGuOFwQHxRIySHzTG{VF|WG}XF}XEYHYIZJZJZIYH~YI}XH{UHyUGxTHvRFtRFtRFuSGuSGzVJzVJzTI{UJ}UK~VLXLXM^QZNVKWIXKXLWKVKVJ{UJyQGvNDuMCwOC{QE}SE{OB{OBzNAzO?|N?|N>}O?{P@uK?sI=pE9X?:X?8X?8Y@9ZA:ZA:ZA:[C9[C9[C9[C9[B;ZA:ZA:W>:X>=Y?>Z@?Z@?X?;X?;X?;Y@]D@]D@]D@]D@]D@]D@]D@]D@]D?]D?^EA^EA^EA\C?[A@Z@?W=>V<=V<=T:;S9=a?>a?@a?@^>?]=>V69U79T5:R38O26N15M05J/4N58K57J46H24F02D.0C-/B,.C-/C-/C-/C-/C-/C-/C-/C-/F02F02G13H24H24G13F02E/1%(%(%(&)''(()(+(-'.(1(3)5*6+7 *7 *9#07!.6 -4+2*1)2*2*0*0*/*/*/*/*- *- */.0.0.1/1/2 02 02 03!13!13!13!13!13!13!13!13!13!12 01/1/0./-/-/-.,.,-+-+,*,*,*)()()()()()()()(('('('('('('('(')+)+*,*,*,(*')&($&$&#%#%"$"$!##&&&&&&&&%%%%%%%%&&&&&&&&''&&&()**+-...----- .!/!/#/"0 .........-+**+-.,,--..//.. .!/!/"0$0"0!/ / / / / / / / / / / / / / / --+!,!,"-"-$.$.'/(0)1*2+2*1)0(/+0+0+0+0+0+0+0+0(-).+0,1,1,1+0+0+0*/*/*/).).(-(-(-(-(-(-(-(-(-(,,0, ., ., .+-+-,-,-0/0/2 03!13!12 01/1/3!/4"04".5#/7#/8$08$/8$/9$-9$-;$.<%/=&.>'/A'0B(1D*3D*3E+4F,5G.4H/5J/6K07K.3K.3M.3N/4O05P16Q35R25W4:W4;X5`>?a?>b>>kCCnEAtIByM@QAU@W@W@S?SARBS@}S=|T;{S9{S9yQ8zR9{S:}U<~V=X?Y@Y@Y@Y@ZAZA[B[B\C]C]E]G\F~ZD|WD{VCzUByTAyTBxSAwRBvQAvQAwRBxRExSC|WE{VC{VDzUEySFxRExRGwQHySJzTIzTG{UH}XH~YG~YFZG[K\L\L]M]L\KZKZJYL~XK{WKzVJzVJxVJyWKyWK|XL|XL}WL}WLWMYMZO[N]QZOXKXLZOZOXMWKWL~VJ|TJzRFzRF}SE~TFUG~RE}RB|QA~P@~P@~P@QARBzNAwMArH8_<8\;6W85U64S53R42R44N21O32O32P43P43Q54Q54R65S76S76S76S76T87V:9X<;Y=:W>:W>:W>:V=9T;7S:6R95S:6S:6S:6S:6S:6S:6S:6S:6Q76Q76P65P65Q76R87T;7U<8W>9W>9W>7X?8X?8Y@9Y@9ZA:ZB8ZB8[C9\D:\C<[B;ZA9X?:X?;X?;X>=Y?>Y?>Y?>X?;Y@[B>[B>^EA^EA^EA^EA^EA^EA^EA^EA^E@^E@_FB_FB_FB]D@\BA[A@Z@AY?@X>?V<=U;>S9M6=`>?^>?]=>]=>U79T68S49Q48O26M04L/4J/4L36I35H24G13E/1D.0C-/B,.C-/C-/C-/C-/C-/C-/C-/C-/E/1F02F02G13F02E/1D.0C-/#(#(%(&)''(()(+(-'-'0'1(3)4*6)7 *8"/6 -4+3*1)0(1)1)0*0*/*/*/*/*- *- */././.0/0/1 01 01 01 01 01 01 01 01 01 01 02 01/1/1/1/1/1/0..,.,.,-+-+,*,*+))()()()()()()()('&'&'&'&'&'&'&'&)+)+*,*,*,(*')&($&$&#%#%"$"$!##%%%&&&&&&&&&&&&&&&&&&&&&''&&&()**+-.//.--. . .!/!/$0"0 ........,,,,,,,,,,--..//.. .!/!/"0$0"0!/ / / / / / / / / / / / / / / --+!,!,"-"-$.$.'/(0)1*2+2*1)0(/,0,0,0,0,0,0,0,0)-*.,0-1.2.2-1,0,1,1,1+0*/).).).(-(-(-(-(-(-(-(,+/+-+-+-, ., .-.-./.0/3!14"24"23!11/0.4"04"04".5#/7#/8$08$/9%0:%.;&/=&0>'1?(0@)1C)2C)2D*3E+4G,5H-6I.5J/6M/7M/7L-3L-3M.3N/4P05Q16R25R25Y6\7>]9=]9=]9=]9;^:<_;;`<>d>=mDBqF@vJAzO?S@V?WAWAT@T@SATA~T>}U<|T:|U8{Q8|R9}S:U8]<7X94V74U63T73T64Q52Q52Q52R63R63R63S74S74T85S74S74S74T85V:7X<9Y=:X?;Y@9W>7X?8X?8Y@9Y@9Y@9X@6YA5[C9\D:\D:[C9ZA:Y@9ZA[B>\C?^EA^EA^EA^EA^EA^EA^EA^EA^E@_FA`GC`GC_FB^EA]CB\BA\BC[ABZ@AX>?VT:=R9]=>\'1?(2@)1A*2D*3D*3E+4E+4G,5H-6I.5J/6M/7M/7L-3L-3M.3N/4P05Q16R25T15[6=[6=\7>\7>]8?]9=^:>^:<]9;^:<^::_;;`<>e?>nECrG@wK@}O?S?W?W@XAT>T@T@S?T=~T;~U9}T8}Q6~R7S:V:W>Z>ZA\@Y@\?[A]@]B^A^C^C^D]E\F[E}YC|XBzUBzUBxSAxSAwR@vQ?wRBxSCyTDzUCzTAzTAzSBzSBzSD{SG{SI{SI}UK~VJWKYJZI\I\I\J_N`ObPbP`P_O^N^M^O^N\O[N[M[M\P]Q[O[OZMYMZN[N]P\QZMXMYN\Q^S^SXNVJVHYKYKXKWJWGVFUEVFUCSAR@R@S?TCVDTE}QDwK>pF8lB6h@4h@6hB9fA8b@7_<6[:5X72V74V74U84S53S74S74S74S74S74T85T85T85S74S74R63T85V:7X<9Z>;Y@7W>7X?8X?8Y@9YA7X@6YA5[C9\D:]E;\D:ZA:Y@9[B=[B=ZA:W>:Y@[B>\C?\C?_FB_FB_FB_FB_FB_FB_FB_FB_FA_FA`GC`GC`GC_FB]CB\BA^DE]CD[ABZ@AX>AVT5:S6:Q48P37L16K05J/4H/3E/1E/1E/1D.0D.0D.0D.0C-/C-/C-/C-/C-/C-/C-/C-/C-/D.0D.0E/1E/1D.0B,.@*,?)+ & &"'"'%&%&''('-(-(/(/(2)2)4(4(4+4+3*3*1)1)0(0(.(.(-(-(-(-(+(+(*+*+*+*+*+*+*+*+*+*+,-,-,-,-*+,+/-/-/-/-/-/-/-/-/-/-/-.,.,-+-+,**)*)*)*)*)*))()(('('('('('('('('*,(*'))+,.+-')#%$&$&#%#%"$"$!##%%%%%%%%%%%%%%%%((((((((((())**++++,,---.. . . . .". . ........,,,,,,,,,,,,,,,,.. . . . .". .!/ / / / / / / / / / / / / / / -!0!.#.#.#.#.$.$.'/(0*2+3,3+2)0(/,0.0.0-/-/-/,.,./1/1/1/1/1/1/1-1- 2- 2,1,1+0+0*/*/&+&+&+&+&+(-).+/,0, ., .-!/-!/."0/!0/!03"23"23!13!12 02 01/1/0,1-3!-5#/8$08$08$/7#.8#,9$-;$.=&0?(0A*2D*3E+4F+4F+4G,5H-6K-5L.6N/7N/7M.4N/5P05Q16T17U28V37V37Z5T=~T;~U7V8S6T7U;W:X>[>]B^@aE`BaD`A`C`@_B_B\B[A}YA{W?{W?{W?}YC}YC}XE|WDzUBxS@wR@xSAyTBzUCyS@|S?}TB~TD~TF}SE|RF{QE}SG~THUIXJZJ]K^L_K_L_L`M`M`ObPaQbQ`O_N^N]M[N[N[N\O]P]P]Q]Q^P]P^Q]OeX_T[O\Q`U`TZNUJZL\L]M\MZKXHUESAVDVEVEWCVBS>Q>Q=SC|QAvK;pF6lB4h@4g?3f@5kF=gE:T;7R95P73T;7T;7S:6R95R95S:6T;7T;7V<;V<;V<;V<;V<;V<;V=9V=9V=8V=8U<5V=6W>7Y@9ZA:\D:[C9[C7[C7[C7[C7[C7[C9[C9Y@9ZA:[B=[B=ZA9\C?]D@^EA_FB_FB^EA]D@\C?_FB_FB`GC`GCaHDaHDbIEbIE_FA`GBaHDbIEbIEaHD`FE_ED`FG^DE\BC\BC\BEZ@CVR<>S=@S=@R;AP9?L5;H17F/7F/7F/7G08F18F39H5;I6zL?P>U?Y?Z?[@[BYBV@T=TwL7]<5Z<4Z;6Z;6Y<8Y<8Y<8Y<8Y<8Y<8Y<8X;7X;7X;7Y<8Y<8Y<8Y<8Y<8Y=:X?;X?;X?;W>:U<8S:6R95U<8T;7S:6R95R95S:6T;7U<8V<;V<;V<;V<;V<;V<;V=9V=9V=8V=8U<5V=6W>7Y@9ZA:\D:\D8\D8\D8\D8\D8\D8\D:\D:[B;[B;\C>\C>\C>ZAS=?T>AT>AR;AP9?L5;H17F/7F/7F/7F18E28F39G4:I6lE@qF?uI>{M>R@V?[?\A]B\DZAW@T=T:V9Y9Z8V8V8X:Y;[=]>^?`@aAaAbAa@a?a?b?`@^B\B[A~Z@}YA}YA~ZB~ZB}YC}YC{VCzUBzUBzUBzUC{VC}T@}T>~UAVDUE~TD}SE}SE~TFUGVHXH[I]I_K`JbLaLaNaNaNaNaPbP_O`O^M]L\M]N^N_O_P_P^P_Q^Q`P^P_QaS_Q^QbThZj]hYfX_P`PaQ`N_M^L[J[G^K^I_J_J]H\FZDYDSATAS@|Q@yN=uK;oH9mE9iC6gC7eC9dB8a@7`?6_>5]?7\=8\=8\=8\=8\=8\=8\=8\=8Z;6Z;6Y:5Y:5Y:5Y:5Y:5X;7W;8V=9W>:W>:W>:V=9U<8T;7U<8T;7S:6R95R95S:6T;7U<8V<;V<;V<;V<;V<;V<;V=9V=9V=8V=8U<5V=6W>7Y@9ZA:\D:^F:^G9^G9^G9^F:^F:^F:^F:]E;]E;^E>^E>]D=\C<[B=ZA<\C?]D@^EA_FB_FB^EA]D@\C?^EA_FB_FB`GC`GCaHDaHDaHD_FA`GBaHDbIEbIEaHD`FE_ED`FG^DE\BC\BC]CF\BEX>AS:=Q99O:9P:S=?T>@U?BV@CR;AP9?L5;H17F/7F/7F/7F18E28D39G4:H5;I6:I6:I49H38I36I36J46J46M47N58N66O56U79U79T68T68T5:S49R59R59P38M27L18I06H/5F-3E+4E,2D.1D.0D.0D.0D.0D.0D.0D.0C-/C-/B,.B,.B,.B,.C-/C-/I35H24H24G13F02E/1D.0D.0 & &!'!'#&#&&'''*'*',&.'1(1(1&2'4+4+3*3*1)1)0(0(/)/).).).).),),))+)+)+)+)+)+)+)+)+)++-+-+-+-)+*+,+-+-+-+-+-+-+-+.,.,.,-+-+,*,*+)+*+**))((''&'&&%'&'&'&'&'&'&'&'&*,(*%'$&$&%'&(&($&$&#%#%"$"$!##%%%%%%%%''''''''********)))**++,+++,,---.. . . . .". .!/ / / / / / / /,,,,,,,,,,,,,,,,.. . . . .". .!/ / / / / / / / / / / / / / / -!0!.#.#.#.#.$.$.)1)1)1)1*1*1*1+1-/.//0/0/00101011212121212121202/ 3.!3.!3- 2,1,1,1+0- 2,1*/).(-(-(-)-,0, ., .-!/-!/."0/!0/!03"23"23!13!12 02 01/1/0,1-3!-5#/8$08$08$/7#.:%.:%.<%/=&0?(0@)1C)2C)2H*4H*4I+5J,6L-5M.6N/7N/7Q07Q07T17U28V39W4:Y59Y59]6;^7<^7<^7<_8;`9<`9:`9:`9:b<;d>=c=;hB?mFAsHAxI?}M?S?Y?\>]@^A^CZBXAV5\>6\=8\=8\=8\=8\=8\=8\=8[<7Z;6Z;6Z;6Y:5Y:5Y:5X;5V:7T;7U<8V=9W>:W>:W>:W>:V=9U<8T;7S:6S:6T;7U<8V=9V<;V<;V<;V<;V<;V<;V=9V=9V=8V=8U<5V=6W>7Y@9ZA:\D:`H<`I;`I;`I;`H<`H<`H<`H<^F<_G=`G@`G@_F?^E>]D?\C>\C?]D@^EA_FB_FB^EA]D@\C?^EA^EA^EA_FB`GC`GC`GCaHD_FA`GBaHDbIEbIEaHD`FE_ED_EF]CD\BC\BC^DG]CFY?BT;>Q99O:9Q;=R<>S=?U?AV@CWADR;AP9?L5;H17F/7F/7F/7F18D17C28G4:H5;H59H59H38H38I36I36J46K57N58O69O77Q78U8:V8:U79T68S49Q48P37O26K05J/4I06G.4F-3E,2D*3D+1D.1D.0C-/C-/C-/D.0E/1F02E/1D.0B,.A+-A+-B,.D.0E/1I35H24H24G13F02F02E/1E/1&&!'!'#&#&&''')&*',&,&.'/(1&1&4+4+3*3*1)1)0(0(0*0*/*/*/*/*- *- *)+)+)+)+)+)+)+)+)+)++-+-+-+-)+*+,+-+-+-+-+-+-+-+.,-+-+,*,*+)+)+)+*+**))(('&%%$%$'&'&'&'&'&'&'&'&(*')%'#%"$#%%'&($&$&#%#%"$"$!##%%%%%%%%))))))))++++++++)**++,,,+++,,---.. . . . .". .!/ / / / / / / /,,,,,,,,,,,,,,,,.. . . . .". .!/ / / / / / / / / / / / / / / -!0!.#.#.#.#.$.$.)1)1)1)1*1*1*1+1-/.//0/00112122312121212121212020!4.!3.!3.!3- 2,1,1,1.!3- 2+0*/).).).*.,0, ., .-!/-!/."0/!0/!03"23"23!13!12 02 01/1/0,1-3!-5#/8$08$08$/7#.;&/;&/=&0>'1>'/?(0B(1B(1H*4H*4J*5K+6L-5M.6O.7O.7T18T18U28V39X3:Y4;Z6:Z6:^7:_6:_6:`7;a8>f>~O?U>Y?\>]@^A^C\AY@X>Y_?`?a@b@b@c@d@c?c?c>c>b?`B`D_E^D^D]C\D\D~ZD~ZD~ZD~ZD}XE|WD|WD|VCVBWAWDWDWGWGUHTGTGUHWGYH[J]J`JaKdObNcNbMaNaN`M`MaO`N^N^N_N`OaRbSaS`SbRbRbSbSbRcSiZgVfUdTdRcQ^M\J_L`L_K^J^J]J]J]HaLaKaLaI`H^F]E[EYEUA~QjH9\=8\=8[<7Z;6Z;6Y:5X;5V:7T;7T;7U<8V=9W>:X?;Y@7Y@9ZA:\D:aJaI?aI?`G@_F?^E>]D?\C?]D@^EA_FB_FB^EA]D@\C?]D@^EA^EA^EA_FB`GC`GC`GC_FA`GBaHDbIEbIEaHD`FE_ED_EF]CD\BC]CD^DG^DGZ@CV=@R::Q<;R<>S=?T>@U?AV@CV@CR;AP9?L5;H17F/7F/7F/7F18D17C28D39E4:H59H59G48F37H46H46J46K57L68N8:Q99R89V9;V8:U6;S49Q48P37N16L16I.5I.5G.4F-3C,4B+3B+3A*0D.1C-/B,.B,.C-/D.0F02H24G13F02D.0C-/C-/D.0F02G13H24H24H24G13G13G13F02F02&&!'!'#&#&&'&'(&)&+%,&-&.'0%1&4+4+3*3*1)1)0(0(0*0*/*/*/*/*- *- *)+)+)+)+)+)+)+)+)+)++-+-+-+-)+*+,+-+-+-+-+-+-+-+-+-+-+,*+)+)+)*(,++**))('&%$$#$#&%&%&%&%&%&%&%&%%'&(&($&"$!##%%'$&$&#%#%"$"$!##%%%%%%%%******** , ,!, , , , ,,***+,,,-+++,,---.. . . . .". .--------,,,,,,,,,,,,,,,,.. . . . .". .!/ / / / / / / / / / / / / / / -!0!.#.#.#.#.$.$.*2)1)1(0)0*1*1,2-/.//0011223233 4232323232323231 30!4/"4/"4.!3.!3- 2- 2,1.!3- 2+0*/*/+0+0,0,0, ., .-!/-!/."0/!0/!03"23"23!13!12 02 01/1/0,1-3!-5#/8$08$08$/7#.;&/<'0=&0>'1>'/?(0A'0C(1H*4H*4J*5K+6L-5M.6O.7O.7U29U29V39W4:Y4;Z5<[7;[7;_6:`7;`7;a8]>^?]@\A[B[?[=]<_<_<^?^?^?_@_@aAbAcBcAc@d@d@c?c>c>c@aCaEaGaG`F_E^F]E~ZD[E[E[EZG~YF|WD}WBWAXBXEXEXGXHVIUHTGUHXHZI\I^K`JaKdPcOdOcNbOaN`M`MaOaO_O_O`OaPcTcUaTbUcSdTcTdUdTdTdRcRcRdSdQcPaN_LaM`L_K^J]J^I_J_JbLbLbJbJaI_G\E\D\FWC}P;wJ5tG4sH5uL:xN>sL=rM=qM?oK?jH>fD:`@5^=4]<5[<7[<7[<7[<7[<7[<7[<7_@;_@;^?:]>9\=8[<7Z;6Y<6W;8U<8T;7T;7U<8W>:X?;Y@:V=9U<8T;7T;7U<8V=9W>:V<;V<;V<;V<;V<;V<;V=9V=9V=8V=8U<5V=6W>7Y@9ZA:\D:aJ`H>aI?aI?aHA_F?^E>]D=\C?]D@^EA_FB_FB^EA]D@\C?]D@]D@]D@^EA^EA_FB_FB`GC_FA`GBaHDbIEbIEaHD`FE_ED_EF]CD\BC]CD_EH_EH[ADW>AU==S>=S=?T>@T>@T>@U?BU?BR;AP9?L5;H17F/7F/7F/7F18C06B17C28E4:G48G48F37F37G35H46J46K57M79O9;R::S9:U8:U79T5:S49Q48O26L16L16H-4H-4F-3F-3C,4B+3B+3B+1D.1C-/B,.A+-B,.D.0G13I35H24H24G13F02F02G13H24H24H24H24H24H24H24H24H24H24&&''"&#&&'&''%)&+%,&-&.'.%0%4+4+3*3*1)1)0(0(1+1+0 +0 +0 +0 +.!+.!+)+)+)+)+)+)+)+)+)+)++-+-+-+-)+*+.-/-/-/-/-/-/-/--+,*,*,*+)+)*(*(,++**)('&%%$#"#"&%&%&%&%&%&%&%&%"$$&')&(#% "!##%$&$&#%#%"$"$!##%%%%%%%%********!-"-#-"-"-!-!-!-*+++,,--+++,,---.. . . . .". .,,,,,,,,,,,,,,,,,,,,,,,,.. . . . .". .!/ / / / / / / / / / / / / / / -!0!.#.#.#.#.$.$.+3*2(0'/(/)0+2-3,..//001123 43 44!5232323232323231 31"5/"4/"4.!3.!3- 2- 2- 2- 2,1+0+0+0,1.!3.!2,0, ., .-!/-!/."0/!0/!03"23"23!13!12 02 01/1/0,1-3!-5#/8$08$08$/7#.<'0<'0=&0>'1>'/?(0A'0B'0H*4I)4J*5K+6L-5M.6O.7O.7V3:V3:X3:Y4;Z5<[6=\8<\8<`7;`7;`7;a8>h@>g?=g?=h@>lE@qHBsG>xJ=}N[>\?]B_C_A_>_<_:a@`@`@bAbAbAdBeBc@d@d?e?d>d>e>d>aCbFcGdHbH`F_E]C[C[C\F]G\F[E}XE}WBXBXBXEYFYHXHVIVIUHUHXHZI\I^KaKbJeQdPdPbNbMaL`M_L`O`O_O_OaPbQdSdTdTcTcTdUdUeVeUeUcPcQeQeQeQeQdPcOcObN`M_L_JaLbMcMcNdOeMeMcJaH_F_G^HZCS?zM8wJ7tI6uL:vL7_>9_>9_>9_>9_>9_>9_>9dC>cB=bA9^=8[<7Y=:V=9U<8T;7T;7V=9X?;Y@:V=9U<8T;7T;7U<8V=9W>:V<;V<;V<;V<;V<;V<;V=9V=9V=8V=8U<5V=6W>7Y@9ZA:\D:aJ]D=\C?]D@^EA_FB_FB^EA]D@\C?\C?]D@]D@^EA^EA_FB_FB_FB_FA`GBaHDbIEbIEaHD`FE_ED_EF]CD\BC^DE_EH_EH\BEX?BW??U@?U?AT>@T>@S=?S=@S=@R;AP9?L5;H17F/7F/7F/7F18C06B17C28D39E58E58F37E26G35H46J46L68N8:O9;Q<;S;;S6:T5:R59Q48P38O27M27L16G.4F-3F,5F,5C,4C,4C,6C,4D.1C-/A+-@*,B,.E/1H24J46I35I35J46J46J46J46I35I35H24H24H24H24H24H24I35I35 ( &!'!'#(#&&'''''(%+&+%-&-&.'.'3+3+3*2*1)1)0(0(1+1+0 +0 +0 +0 +0 +.!+*+)+*+)+*+)+*+)+*+)+,-+-,-+-*+*+.-/-/-/-/-/-/-/--+,*,*+)+)*(*(*(,++**)('&%$##" !$%$'$'$'$'$'$'$'""&')%)#%" "#$&"&#%!%"$ $!##%%'%'%'% - + - + - + -!-"-"-#-"-"-"-!-!-*++,,---+++,,---.. . . . . . .++++++++,,,,,,,,,,,,,,,,.. . . . . . . / / / / / / / / / / / / / / / -#0#.#.#.#.$.$.$.+3*2(0(/(/)0+2-3,..//001233 44!54!5232323232323231 31"50#5/"4/"4.!3.!3- 2- 2,1,1+0+0,1- 2/"40#4, ., ,, .-!--!//!./!0/!.3"23#03!13!/2 02 .1/1-0,1-3!/5#/8#28$08$07#.<&2<'0>'1>'1>'1>'/A'2A'0H*4H*4I+5J,4L-5M.6N/7O.5T3:V39W4:X5;Y6h@>g?=iB=lE@pIBrG@uI>{M=S[=]<^=Z;\<_AaCaCa@`;]9a?a?a?a?cBcBdBeBc@d@d@d?e?d>d>c>bBbDdFdHdHbF`D^D[A\D]E^F]E[E}YC}WBY@ZAZD[EZGZFXGWGVFXFXG[G\I`JaKbJfOfQdPdObMaL`M_L`O`OaO`P`PcRdTeUdTcTdUdUeVeVfVfVfTgUgVhTfRdPcObNfReQcPbObOdOeOgQfQgOhPgMeLcHbIaG^E[DW@Q;|M9zK9xK8vK:rH8qJ;rL?rN@nL@jJ=fF;dC:bA:`A`A9\=8[>:Y=9W;8V:7V:7W;8Y=:X?;W>:V=9U<8U<8U<8U<8V=9W=9XA9ZA<[D<`H<_I;`I;`I;`I;`H<`H<`H<_G;`H<`H>aI?`G@_F?_D=\C>\C?]D@^EA_FB_FB^EA]D@\C?\C?\C?]D@]D@^EA^EA_FB_FB_FA`GBaHDbIEbIEaHD`FE_ED^DC]CB\BC^DE`FG`FG]CDYAAYAAWBAVA@U?AT>@S=?R<>R(5='3=%2=%2>&3@)3C+8F,7E+4F+2G,3H-2K.3L/4M05N/4P16R25S36U58V69X89[9:\:;^7:_89a:;c<=d=>d>=d>=d>=c=^@a@a>^=_>bAcAcAb>`<^9_<^;^:_:_d?b?c?c?b>a>a>a>`=`>aAaAaDbEcFcFdIaFaG`F_E^D]F\E]C\A]B_EbGbHbH`G_H[E[DZD\E\F_H`JcJeMeMeNfNeMcKbLaKbObObObQbQcQbQbReUdWdWeXeVfWfVfVfWfUfUfUdRdRcRdRdSeTeTfSeSgRgQgQdLfNgNiNjOiKfKeGdHbE]BW?S=P;O>~O?yKaE:_B:]@8]?7[>6\>6]@8aC;bE=cE=bE=aC;_B:_A9^A9_A9_@;]>9[<7Y<8W:6W:6X;7Y<8Z>:U96V:7X<;Y==X>=W=:X?;W>:V=9T<8T=7U=9UA:ZB>YE>aJD_KB`IA`J?_I>^H;^F:^F:`H<`H[B>[B>]D@]D@]D@]D@]D@]D@]D@]D@]D@]D@]CB\BA\BA[A@[A@YA?YA?WB?WB?WBAU@?S>=Q<;P:(5='4>&3>&3?'4A)6C+8D-7E+4E,2G,1H-2I.3J/4M04N15Q35Q35R46T68W78X89Y9:\:;^78_89a:;c<=d>=d>=d>=d>;d>;e?X>_Aa@a>`a?`>_>`>`?a?bBbBcCdDcFdGbGbGaF`E`F_E_E^C\A^A`CaDbEbEaF`E^D^D\E]F^G`IbKdJeMeLfNfNeMdLbLaKbObObObObQbQbQbQeWeWdWeXeVfWfVfVeWeWeUeUdSdScRcRdTeTfUfSfTgRhRhRfNgMhMiNjLjLhKgIhIfFbC\@W?S>Q?RA}M?wK>rJ>oK?mM@iK@dH<`E:_C8^A9\?7[>6[>6]@8_B:aDbE=`C;_B:_B:^A9^A9_>9^=8Z;6Y:5X96Y:7Y<8Z=9V:7W;8Y==Y?>X>=X>?W=;Z>;X?;Y@:V=9T<8T<8R=8T?:VA[B>[B>]D@]D@]D@]D@]D@]D@]D@]D@]D@]D@\C?\C?[B>[B>[B>YA=YA?WB?WB?WB?U@?T?>R=(5='4>&3?'4@(5A)6E+6F,7F+4G,3H-2I.3L/4M05N15N15Q35R46T47U58W78Y9:\:;\:;_89a9:c;;d<>f>>f>R=Y>_@a?b=be>d@c?b@a?a?b?a@b@cAcAcCdDdDdDcFcFcHbGbGaFaGaF^C_B`CaDaDaDaF`E`F`F^G^G_HaJcLeKdLdKeMfNeMdLbLaKbObObObObQbQbQbQeWeWeUfVeVfWfVfVfUfUeUeUdSdSdSdSeUfUfTfTgUhShShSiRiPhMhMiLjMkMlNpNnLhIdF^C[AYCXCQ@}O?vL>qK>mK?hK=dH:`D8`D9_C8]A6[?4[?4\@5^B7`D9eI>dH=dH=cG9_>9[<7Z;6Y:5Y:5Y<8Y<8W;8X<9Z>=[?>Z@?Y?>Y?>X>=Z<:[=;[=;[=;[?<\@=ZA=ZA=X?;X?;U=9T<8R=8R=8S>9S>9XC>YD?YE>ZF=]F>^H=`H<`H<`H[B>[B>]D@]D@]D@]D@]D@]D@]D@]D@]D@\C?\C?\C?[B>ZA=ZA=YA=YA?WB?WB?WB?VA@T?>R=>f>>f>kD?mF?nG@nG@oHArKDrLAyN>U>\AaAc>c>c>e?eAeAeAe?d=bb=a;a:aqLeI>eI>eI>cG9\=8[<7Z;6Z;6X;7X;7X<9Y=:[?>\@?Z@?Z@?Y?>Y?>\><\><\><]?=\@=]A>[B>[B>Y@:U=9R=8Q<7Q<7P;6T?:U@;VB;XD;]F>^H=aI=bJ>`H[B>[B>\C?\C?\C?\C?\C?\C?\C?\C?\C?\C?\C?[B>[B>ZA=ZA=X@WB?WB?WB?WBAU@?T?>S>=O9;M79I36F03E/2E/2F/5F16D/8C/8E09E09E07E07F/5F/5J15J15K26M47P69Q78R89R9>g?=g?=g?=f>jC>kD=kD=lE>mF?nH?oI@rLCtL@}O?V?^AcAd>d=g?f>g@g@f@f@e>e?e@d?c=cf>g@g@gBfAeAd@c@d@eAeAeCdBdBdBdDdDdGdGeHeHeJeJeJeJcFcFcFbEbEbEbGcHcIcIaJaJaJbKcLeKbJcJdLeMeMeMdNcMcPcPcPcPcRcRcRcReUeUeUfVeUfVfVfVeTfUeSfTfUfUgThThViWhWjVjVkVjVkToWnSkPjMkOoQsUwV{VzUwRtQpOlMjKiN`G[D~T>tN;oL9jK9eH6cF6dH3Z>3[?4\@5cGfJ?eI>dH=bF;aE:a@9`?8^@8]?7\=8Z;6X;7W:6X<8Y=9[?<\@=Z@?Z@?Y?>Y?>\><\><]?=]?=]A>]A>\C?\C?ZA=ZA=X@9Q<7P;6O:5R=8S>9UA:XD;\E=_I>bJ>cK?aI=aI=cH?cH?bEA`C?^@>\@=^B?\C?\C?\C?\C?\C?\C?\C?]D@]D@]D@\C?\C?[B>[B>[B>\C?\C?\C?\C?\C?\C?\C?\C?\C?[B>[B>ZA=ZA=Y@WB?WB?XC@WBAVA@U@?T?>P:&3?'4A)6B+5E+6F,7F,7E+4H-4H-4K.3L/4M05N16P16Q27T47T47U58W7:[9:\:;];<_;;a9:b::d<>g?=g?=g?=g@;lE@lE@kD=kD=lE>mF?oI@pH@tLByM@Q?X?`@eAe>e=h@h@g?hAgAg?g@hAfAe@d>d=dg>hAhAhCgBfBeAdAeAfBfBeCeCeCdBdDdDdGdGdGeHeJfKfKfKgJfIeHdGcFdGdIeJdJcIaJ`IaJaJcLdJaIbIdLeMfNeMdNdNdQdQdQdQdSdSdSdSeUeUeUfVeUfVfVfTeTfSeSfTfUgVhUhUjVjVkWkVlWlUmVmTqVoRnQmOoQrRvVyW|V}V|UyTwTsPqRpQiKbHX?wQ:pM7lK8hI5dG7eI=cG<_C8\@5Z>3Y=2Z>3[?4_C8aE:cGfJ?eI>dH=bF;a@9a@9_A9^@8]>9Z;6W:6V95W;7X<8Z>;[?Y?>X>=\><\><]?=]?=]A>]A>[B>\C?ZA=ZA=YA=YA=U@;S>9Q<7P;6R=8S>9UA:XD;]F>_I>cK?dL@aI=aI=cH?bG>bEA`C?]?=[?<^B?\C?\C?\C?\C?\C?\C?\C?]D@]D@]D@\C?\C?[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>ZA=Y@VA>WB?XC@XCBWBAVA@U@?P:&3?'4C)4E+6G+7G,5G,5F+4J,4K-5L/4M05O06P17Q27Q27T47U58X59Y6:[9:];<_;=_;;b:;d:;f=;g>i@>h?;h?;oFBnE?mD>lC=mE=nF>pH@qI?wMA|N>R2Y=1Y=1Z>2[?3^B6aE9eI=gK?fJ>eI=dH:Y@:[=;[=;\><\><\@=\@=[B>[B>ZA=[B>ZB>ZB>WB=VA9R=8S>9T?:VB;XD;]F>`J?cK?dL@aI=aI=cH?bG>aD@_B>\>;^B?\C?\C?\C?\C?\C?\C?\C?]D@]D@]D@\C?\C?[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>ZA=ZA=ZA=Y@WB?XC@YDCXCBWBAVA@P:&3?(2D*5F,7H-6H-6G,5F+4K-5K-5L/4M05O06P17Q27Q27T47U58X59Z7;[9:];<_;=b;i@lDpH@sH?xM=}N:S:[e;d9k?k@i@h@h@i@jBkCkCiAg?f=e=feI=bA8bA8aC;`B:^@8[=5W:4U82U95V:6X<8Y=9X?;X?;W>:V=9[=;[=;[=;\><[?<\@=ZA=ZA=ZA=[B>[C?\D@YD?WB=U@;T?:T?:U@;WCaD@^A=\>[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>[B>ZA=ZA=Y@WB?YDAYDCXCBWBAWBAQ;=N8:K58H25F03F03G06G27G29E28D/6B-4A,3A,3C,4D-5D*3D+1F,5G.4J/8K07L1:L39L37J47I36I36H25H25G14G14G14G14F03E/2D.1C-0B,/A+.D-5D-5D-5D-5D-3D-3F-3F-3E,0D+/C*-B),A(+>(*?''?&)B)-B)-B)-B),B**B*(B*(B*&',',(,(,)-)-+,+,-*.+0,1-2 ,3!-3!-4".5#/4".4".3!-2 ,1+1+0*4".4".3!-3!-2 ,2 ,1+1+/./././././././.0//.-,,++*+*,+-,/-0.0.1/1/2 02 02 01/1/0.0./-/-.,.,+**)&'#$!"  !' &&$#### "#&'('&%#$$%&''((()**)(())**++,,---------...//00.........--,,+++++++++++++++++++**+,--..,,--.. / /"1"1"1"1"1"1"1"1 / /!0!0"1"1#2#0#/#-#-$.&.'/'/'/'.'.)/)/*0*0-1-1-/.0.0/11 32!42!43"53"53"52!42!41 31 302023"53"52!42!41 31 30202/1021 33"53"53"52!42!33!/3!-5!-6".6".7#/8"/9#0:"0:"0:"0;#1="1>#2>#2=%3:$1:$19#09#0:"0;#0=%2>&3B(3C)4E)5F+4H-6I.7M/7M/7O08O08O06P17Q07R18R27R27X59X59Z6:[7;\8:]9;`9<`9:`67d87g;:i=:l@=mA>mA>mBrG>tI@vJ?{M=O8T7];d?kAj=i;l>m@mBmDnEnEmEmCmClBj?i=h>h=h>i>j>j=i?h>g@f?f?f?iCiChBgAeAd@c?c?a?b@dDeEfFeEdGcFjMiLiLhKgJfIfKeJfLfLeNeNeNeNeNfLfNfMfNfNfNfNfPfPfSeReRdQeTfUhWiXiWiWhUiViVjWiWjVfSgRgRhShSjUiUjVkWkUlVnVoWpVqWrVvYtUrSqPsRwT{XX}TQ}Q|P{O{O{P{RyQsMgE[;yQ7qM3pM7oO:hK;eI;cG9`D6^B4]A3]A3]A3]A3^B4_C5aE7cG9eI;fJ9W>9W>9Y;9X:8V86U75U96X<9ZA=\C?ZA=ZA=YA=YA=WB=WB=WB=WB=U@;U@;VB;XD;\E=_I>cK?eMAcK?cK?dI@cH?cFBbEAaCA`DAY=:W>:X?;Y@[B>[B>[B>ZA=Y@:W>:X?;X?;X?;Y@Y@*+?*)>(*<&);%(;%(;%'<'&=(%?*'@+(',','+(,(,)-*++,.+.+0,1-2 ,3!-4".4".5#/5#/4".3!-3!-2 ,2 ,1+4".4".3!-3!-2 ,2 ,1+1+/././././././././..-,++**)+*+*,+/-/-0.0.1/1/2 02 01/1/0.0./-/-.,.,+**)&'$%!" ! &%%#"""# "$%'''&%$$$%&''''()**)('())**+++--------,---.///.........---,,+++++++++++++++++++,,,,---,--.. / / /"1"1"1"1"1"1"1"1 / /!0!0"1"1#2#0#/#-#-$.&.'/'/'/'.'.)/)/*0*0-1-1-/.0.0/11 32!42!43"53"53"53"52!42!41 31 3023"53"52!42!41 31 30202/1021 33"53"53"52!42!33!/3!-6".6".7#/7#/8"/9#0:"0:"0;#1;#1>#2>#2>#2?$3<$2:$19#09#0;#0<$1=%2>'1B(3C)2E*3F+4H-6J/8M/7M/7O08O08O06P17Q07R18R27R27W48X59Z6:[7;\8:]9;`9;l@=mA>mBoD=oD=pE>qF=sH?uJAwK>O;Q9V8^n?nAnCnEoDnDnDmCmBj?i=g=i=i>j>k>k>i?i?g@g@f?f?jDjDiChBfBeAd@c?b@cAdDeEfFfFdGcFiLiLiLhKgJfIfKfKeKeKdMdMdMdMdMeKfNfMfNfNfNfNfPfPfSeReRdQeTfUhWiXiWiWiViVjWjUiUjVgRgRhSiSiTjUjVlUlVmUmUoUpVqUrVrUuVtSsRsPuRxT{W~XTRR~Q~Q}P}O~PzPtLiE^>}V9uP6rN6oO:hK;eI;bF8_C5]A3]A3]A3^B4]A3^B4_C5aE7cG9eI;fJ9W>9W>9Y;9W97V86U75U96X<9Y@<[B>ZA=ZA=YA=YA=WB=WB=WB=WB=U@;U@;UA:WC:[D<^H=bJ>dL@dL@cK?dI@cH?cFBbEAaCA`DAZ>;Y@ZA=ZA=Y@:W>:Y@[B>[B>ZA=ZA=ZA=ZA=ZA=ZA=ZA=YA=]EC[FC\GD[FCZEDYDCWBAVA@V@BS=?P:=L69I36H25G06F16E07D17D/6D/6C.5C.5C,4C,4D*5D*5D*5E+6F*6F*6G+9F,7J17H25H25H25H25I36I36I36J47J47K58K58J47I36H25G14I/8G-6E+4E+4E.4F/5D-3A*0D.1C-0C-/A-.?+,>*+>*)=)*;');$*;$*;%(<&(=('?*)@+(&+','+(,(,)-*+*+/,/,1-2 .3!-4".5#/5#/5#/5#/5#/4".4".3!-3!-3!-4".4".3!-3!-2 ,2 ,1+1+/./././././././..--,+**))(*)*)+*.,.,/-/-0.0.1/1/1/1/0.0./-/-.,.,+**)&'%&"# !"!%$$"!!!"#$%&''&&$$%%&&''&'())('&((())**++++++++++++,---............-,,,+++++++++++++++++.----,,,---.. / /!0"1"1"1"1"1"1"1"1 / /!0!0"1"1#2#0#/#-#-$.&.'/'/'/'.'.)/)/*0*0-1-1-/.0.0/11 32!42!43"54#63"53"52!42!41 31 31 34!54!53 43 4232312120112234!54!54!53 43 35 /6".6".6".8"/9#09#09#0:"0;#1="1="1>#2?$3@$3?$3<$1<$1;#0;#0;#0=%2@&1A'2D(4D)2G)3I+3K-5L.6M/7N08O08O08P/6Q07Q07R18T17T17X48X48Y59Z6:]69^7:_8;a9:a86d85g;8j>;lA;mBuJAwMA{M>R=U9[:c>j?o@o>no@pCqCpEpEoEoCnAm@j?i=h;i;j=j=l?l?k>k>i?i?h>h>kCjBjDhBgAf@eAd@b@cAdBfDfFfFeEeEiLiLhKhKgJgJfKfKeKeKdMdMdMdMdMeKfNfMfNfNfNfNfPfPfSeReRdQeTfUhWiXiUjViViVjUkVjVkTiTiTjTkUkVmUmVlVnVnUnUoVpWqVrVsTsUtTvSvSxU{U|V}WUUSSPPPQ{OuMmGcB[?zU;uQ9qN:hK;dH:aE7^B4\@2\@2^B4_C5^B4_C5`D6aE7cG9dH:eI;fJ3Y=2Y>5Y>5Y>7Y>7W>7W>7W>9W>9W97V86U75U75U96W;8X?;ZA=ZA=ZA=YA=YA=WB=WB=WB=WB=T?:T?:T@9UA8ZC;\F;`H:W>:ZA=ZA=ZA=[B>[B>\C?\C?\C?ZA=ZA=ZA=ZA=ZA=ZA=ZA=YA=^FD\GD\GD\GD[FEYDCWBAVA@V@BT>@Q;>N8;K58I36H17G27F16E26E05E05D/6D/6D-7D-7F,7F,7F,9E+8F*8F*8F*9D*5H/5F03G14G14H25I36J47J47K58K58L69L69L69J47I36H25J09G-6E+4F,5F/5F/5D-3B+1C/1B.0B./@..>,,=++=+)<**<',;&+:%*:&(:&'<('=)(>*)&+&+&*'+(,(,)**+/,/,1-2 .3!-4".5#/5#/5#/4".4".4".4".4".4".4".4".4".3!-3!-2 ,2 ,1+1+/./././././././.-,,+*))()()(*)*)-+-+.,.,/-/-0.0.1/1/0.0./-/-.,.,+**)'(%&$%"# $#$## !   !$$%&&&'&%%%%&&&&&'())('&((())***++++++++***++,,,........ /..--,,,++++++++++++++++/ /..-,++-... /!0!0!0"1"1"1"1"1"1"1"1 / /!0!0"1"1#2#0#/#-#-$.&.'/'/'/'.'.)/)/*0*0-1-1-/.0.0/11 32!42!43"54#64#64#63"52!42!42!41 34!54!53 43 4232312120112234!54!54!53 43 36!06".6".7#/8"/9#09#0:$1;#1;#1="1>#2>#2?$3@$3@%4?%2=%2<$1<$1<$1>'1A'2B(3D)2E*3H*2I+3K-5M/7N08N08O08O08P/6Q07Q07R18T17T17X48X48Y59Z6:]69^7:_8;`89c76e96h<9j>;mBpEtI@wLCzPDQBU?Z<`>iBoCqAr?q>q?sArCsErGqDpDpDoBn@k@k>im@m@l?l?j@j@i?i?lDkCkEiChBgAfBeAcAdBeCfDgGgGfFeEhKhKhKhKgJgJgLgLdJdJcLcLcLcLcLdJfNfMfNfNfNfNfPfPfSeReRdQeTfUhWiXjVjViVjWjUkVkTlUkVlUlVmWnVoWoXnVqWpWqXsWrWsWtUuTtTvSxU{U}W}W|W|U~VTSSPPPP~PyNqKiFaEZAyS7W>7W>7V=8V=8V86V86U75U75U96W;8W>:Y@9S>9S?8T@7XA9[E:^F:_G;dL@cK?dI@cH?cFBbEAaCA`DA]A>[B>ZA=ZA=Y@:X?;X?;X?;X?;X?;X?;W>:W>:ZA=[B>[B>\C?\C?]D@]D@]D@[B>[B>[B>[B>[B>[B>[B>ZB>^FD\GD]HE\GD[FEZEDXCBWBAV@BT>@R,,;++;,):**;(,<'.;&+:&(:&(;'(<('=)(%*&+&*&*'+(,)*)*.+/,0,1-3!-4".4".5#/3!-3!-3!-3!-4".4".4".4".4".4".3!-3!-2 ,2 ,1+1+/./././././././.-,,+*))()()(*)*),*,*-+-+.,.,/-/-1/1/0.0./-/-.,.,+*+*()&'%&#$!%!%$## !   !%&'''())((((''''''))))''(())**++++++++++))**++,,........ / / /..--,++++++++++++++++0!0 /.--,,... /!0!0!0"1"1"1"1"1"1"1"1"1 / /!0!0"1"1#2#0#/#-#-$.&.'/'/'/'.'.)/)/*0*0-1-1-/.0.0/11 32!42!43"55$74#64#64#63"52!42!42!44!54!53 43 4232312120112234!54!54!53 43 36!07#/8"/9#09#0:$1;#1;#1="1>#2>#2?$3@$3A%4A%4@%4@&3>&3=%2=%2@&1A'2C'3D)2E*3E*3H*2J,4M.4N/5O06P17P/8P/8P/6Q07S07T18T17T17W37W37Z38[49\58]69_6:_78d87g:7i<7l?:nAk>l=m=m=o@o@m@m@l?l?j@j@mElDlDkCjDhBhBgAc?d@fDgEgEgEfFfFgJgJgJgJhKhKhMhMeKeKdMdMdMdMdMeKfNfMfNfNfNfNfPfPfSeReRdQeTfUhWiXjVkUkUlVkVlWlUlUnWnWnXoWpXqYqZpXsZsXtYtYsYuYuWuUuUwUzW}XZX~W}V|T|R~R~R~PNNPS{QrMlJeJ_F|VAtQ>iL:eJ9aF5]B1\A0^C2aF5cH7bG6cH7cH7dI8eJ9fK:gL;gL;iI7W>7V=6V=8V86V86V86W97W;8X<9X?;Y@9S>9S?8T@7W@8YC8]E9^F:cK?bJ>cH?bG>bEAaD@`B@_C@\@=ZA=Y@:W>:V=9W>:W>:W>:W>:W>:W>:X?;X?;ZA=[B>[B>\C?\C?]D@]D@]D@]D@]D@]D@]D@]D@]D@]D@\D@]EC\GD\GD\GD[FEYDCWBAVA@V@BU?AT>AR..<,,:,+:,):**<)-<'.;&+:&(:&(;'(<('<('%*%*%)&*&*'+())*-*-*/+0,1+2 ,3!-4".1+1+2 ,2 ,2 ,3!-3!-3!-4".4".3!-3!-2 ,2 ,1+1+/./././././././..--,+**))(*)*)+*+)+),*,*-+-+.,.,1/1/0.0./-/-.,.,,++*()'(&'%&#'#'%$$"!!!"''&&'()*))((''&&()*++*)()***+,,,++++++++)***++,,........!0 / / /.---++++++++++++++++/ / /....-. / /!0!0"1"1"1"1"1"1"1"1"1"1"1 / /!0!0"1"1#2#0#/#-#-$.&.'/'/'/'.'.)/)/*0*0-1-1-/.0.0/11 32!42!43"55$75$75$74#64#63"53"52!44!54!53 43 4232312120112234!54!54!53 43 37"17#/8"/9#0:$1:$1;#1<$2>#2>#2>#2?$3A%4A%4A%4B&5A'4?'4>&3>&3A'2B(3D)2E*3E*3F+4I+3J,4M.4O06P17P17P/8P/8P/6Q07S07T18T17T17V26W37Z38[49\58]69_6:`68d87g:7j=8l?:oB=pC>pC=qD>pD;qEkFqGuFvBv@v@xCxDxHwHvIuHtEtEsFrDpBo@m@n?o?o?pApAnAnAm@m@kAkAnFmEmElDkEiCiChBd@eAfDgEhFhFgGfFfIfIgJgJhKhKiNiNfLfLeNeNeNeNeNfLfNfMfNfNfNfNfPfPfSeReRdQeTfUhWiVkWkUkUlVlWlWlUmVpYpYpXqYrZs[s\rZv]v[v[vZvZvXvVvVwUyV|WZŁZŁZŀYŀY|U}U~TSQPPRV}QsNmLhMaIXDwR@mNjJ=fH=dF;cE:cE:bF;bF;]B9\A8\A8[@7X?8W>7V=6V=6W97W97X:8Y;9Y=:Z>;Y@aF=`C?_B>_A?]A>Y=:W>:W>:W>:V=9V=9V=9V=9V=9V=9V=9V=9W>:W>:X?;X?;ZA=ZA=ZA=[B>[B>\C?\C?\C?^EA^EA^EA^EA^EA^EA^EA]EA\DB[FC[FC[FCZEDXCBVA@U@?V@BV@BU?BT>AS=@P:=N7=L7..;-,:,+:,)9+*=*.=(/<'.:%*:&(:&';'(<('$)%*%)&*&*'+()(),),).*/+0*1+2 ,2 ,/)/)0*0*1+2 ,2 ,3!-4".4".3!-3!-2 ,2 ,1+1+/././././././././..-,++**)+*+*,+*(*(+)+),*,*-+-+1/1/0.0./-/-.,.,,++*)*()'(&'$($( &%%#"""#('&&&()+)))('&&&)*+,,+*)+++,,--.--------**++,,--........!0!0 / /...-++++++++++++++++... / / / /!0 / / /!0!0"1"1#2"1"1"1"1"1"1"1"1 / /!0!0"1"1#2#0#/#-#-$.&.'/'/'/'.'.)/)/*0*0-1-1-/.0.0/11 32!42!43"56%85$75$74#64#63"53"53"54!54!53 43 4232312120112234!54!54!53 43 37"19#09#09#0;#1;#1<$2<$2>#2?$3@$3@$3A%4A%4D%5B&5B(5@(5A'2A'2A'2C)4E*3F+4H*2H*2I+3K-5N/5O06P17Q28P/8P/8R/6S07S07T18U07U07X16X16Y27Z38\37]48^59`68e96g:5j=8m@;oBqD>pD;qEhMjO>jO>mM@lL?hK=fI;eGeI>^C8]B7]B9[@7X?8W>7V=6U<5X:8X:8Y;9[=;[?<[?^A=]?=[?:W>:X?;X?;Y@[B>[B>^EA^EA^EA^EA^EA^EA^EA]EA[CAYDAYDAYDAXCBVA@T?>S>=V@BV@BV@CV@CU?BR..;-,:,+8-)9+*>+1=*0;(.:'+9&(9''9'':(($)#)%)%)&*&*')())(+(,)-*/)0*1+1+.(.(/)/)0*1+2 ,2 ,4".4".3!-3!-2 ,2 ,1+1+/./././././././.0//.-,,++*+*,+-,)()(*(*)+)+*,*,+1/0/0././-.-.,-,,++(+*())('(&'%)"& &$"####&'&%&'*+*))('&&%*),+-*+(,*,+-,.-++++++++)))**+++,,.,.,.,!0!.!0 - /,.++)+)+)+)+)+)+)+)-+., /!."1"/ / -!0!."1"/#2#2"1"1"1"1"1"1"1"1 / /!0!0"1"1#2#0"/#-#-$.$.'/'/'/'.'.(/)/*0*0+1-1-/.0.0/11 32!43 44!47$77$76#66#65"55"54!44!44!44!43 43 3232212110111234!44!54!43 45 38!19#09#0:$1;#1<$2<$2<$2>#2?$3?$3@&3A%3B&4B&4B&4C)6@)3A'2A'2B(3C)2E*3F+2H*2H*2J,4K.3N/5O06P17R18P/6R/6R/5S06S06T17U07U15X16X16Y27Z38[47\58^59^67e98g;8j=:lA;oB=qD>qD>qE{OBUEYI[G[@dBnFuHwDw@v?y@{C|D|EzExFwEvDvEwFvFtDrAr@rAsAsCp@qBpCoBoBmCmClBoEoGnFmGlFkEiEiEdBeCgEhFhHhHhHfIeHfKfKgLhMiNiNjPiOiOhQhQhQhQhQgQfNeNeNeNeNfNePfPfSeReRdQeRfShWiVjWkXkXlWlWmVmVmUr[sZrZtZt[uZtZuYy]z[y[yYxXxXxXxV|Y}Z~YZŁZƃYȅ[ȅ[ǃ\ǃ\DŽZɄZʆYˇXˉYɉYň[TsLkJhKbKZG{TCqP?lM;eH8aD2aD4dG5hMjOjOiL7V=6U<5W;7X<9Z<:[?<\@=[B>[B>[B>X?;W?;W?;U@;U@;U@;U@;U@;WB=VB;XA;XA9XA9ZD9]E;^F:^F<]E;^C:]B;\A:[?;\?;Z>;Q84Q97R87S98T:9U;:U;:U;:T:9T:9U;:V<;W==X?;X?;X?:X?;Y@;Y@ZB@ZB@ZB@WBAU@?S>=R<>U?AV@BWADWADV@BS=?P:=N:I.?J-?J...<,,;++:,+:*+>+/=*0;(.:'+9&(9&(9'':((%+#+%*%*%*%*%(&(''(')()(,','-(-(1+1+1+1+1+1+1+1+2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,-,-,-,-,-,-,-,-,1 00//..-,++**)*),+*+,+*+,+*+,+*+.-,-.-+,-,*+,+,+.+/).*+(*&(%'$$%"#!%!% $ %$$&'))))))))))))))))(*), + -!,,*,*,*,*&&'' ( (!)!) ( ( (!)!)"*"*"*!+!+!-!+!-!+!-!+$0#-!- *+ * , +,)+(*')''%(&)'*(,*,*,*,* - +!.!,"/"-#0#0!0!0!0!0"1"1"1"1... / /!0!0!.#0"-*))",%/'1&.&.'/(/)0)0*1+1/10100111122425 18#47"38!37 27 06/7/6/5 13!13 33!13 33!13 33!1112 03 34"25"56$46#69$5:#3<$4<$4=%5?'5@(6@(5A)6?'4?'4?'4?(2A'2A'2A'2A'2A'2A'2B&2C(1C(1C(1E'1E'/J+3J+1K,2K,2M,3M-2N.3N.3R/3S/3S/3T04T04U15U15U13V24V24V24V24X46Z68_8;`9:b89d;9j>=kB>oD>pE>pE>oD;oC8rF9yK<~P@SCVCVCU?\@mKuKq@o:{@€D|@FE@}>{p>uEtFsFqDoElEkDjCsKsMqKoJmHkFiFgGfHfHfJgKfLfLgMgMeKdJdJdJeKgMiOiRjSjSjSjSjSjSjSiShSgSfRfReQePcOdOfQfQfQfQgQhRgTgTgWhXiYkXmXoXpYpXsZsXrVrUtXvZz^|\[YY[~[~\~\~\\\ZZYăYƅ[dž\ˊbˊbʅ[ǀT̂U։[Ջ\ωXŅW~RwMpKlKfK\D}T@{TCuP>nJ:gF3fE4iJ6mP>qU@oTAoT?qTBqU@qTBqR>pQ?oP_G=^E>\C7W>7Z?8X?:V>U==T<Z>=Y@;ZA:ZA<[B;]D?^E>^E@_F?_FA`G@`GBaHA`GB_F?]D?\C>\@=]?=\@?Z@?X@@T>@Q;=O;=T@BS?AQ=>O;).=(-;&+9%'8$&8$&8$&9%'#+#+#*#*%*%*%(%(''''(')()&*','-(1+1+1+1+1+1+1+1+2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,-,-,-,-,-,-,-,-,1 00//..--,+*+**)*+*+*+*+*+*+*+*+,-,-,-+,+,*+*+,).*.(-',&+'*&(%(%#$#$"&!%!% $ %'(**************(*()) *!+!+", * * * * * * * * & %!&!&"'"'#(#("'"'"'#(#($)$)$*!+!+!+!+!+!+!+!+#-",!+ *)) *!+ *)))((''%&&''(((******** + +!,!,"-"-#.#."1"1"1!0!0!0!0!0.. / /!0!0"1"/!0 -*)*!,%/'1&.&.'/'/)0)0*1+1/10111114242405 19"28!19!19!18 .8 .9-7-5 13!13!13!13!13!13!13!12 02 03!14"25#36$47%59$5:#3<$4<$4=%5?'5@(6@(5A)6?'4?'4?(2?(2?(0?(0?(0?(0A'2A'2B'0C(1C(1C(1F(0F(0J+1K,2K,2L-3M-2N.3N.3P-1S/1S/1S/1T02T02U13U13U13V24V24V24W35X46[79]9;`9:c;qF=qE:sG:yK<|N>R?T?VAU>\@mKwMsAs<}AÁE}?FB?~:}9|:|<|>w>x?yAx@vBu?r?q=uEtDrFqEnGlEjFkFqKpJoJnIlIkHiIhHfJfJeKfLfNfNfPfPdMcLcLcLdMfOhQiRjSjSjSjSjSjSjSiSgSgSfRfReQdPdPcOfQfQfQfQhRhRhRhUgWfXiYjXlZnWpYpVt[tWrWsUtXvYyZ{ZWUWW~[~[~\~\Ł^Ā][XWÄXąYņZʉ_͊_·[̂UӅW܋\ڌ\҈WɅVRvMrJmLgJ]DU?|SAvO>pI8jG4iF3jK7oP:W?;X@WB=WB=VC=VC=VC=VC=UD=VC_F?^E>]D=[B;X?8W>7W>7X?8XA;V>>S=?R<>Q;=R9Z;@Z=?[?;ZA:ZA:[B;]D=^E>^E>_F?_F?_F?`G@`G@`G@^E>]D=^C<]@<]?=^@>]A@Z@AW>AS=?R<>T@BU?AU?AYAA\BA\C?\@=W=*,=)+;')9%'8$&8$&8$&9%'#+#+#*#*%*%*%(%(&&''(')()&*',','0*0*0*0*0*0*0*0*2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,.-.-.-.-.-.-.-.-0/0//..--,,+,++*,+,+,+,+,+,+,+,+.-.-.--,-,,+,+,),(,&,&,&,(+'*'*'%&%&$(#'#'"&"'!))++++++++++++++)+) * * *!+!+!+ * * * * * * * *&&'' ( (!)!) ( ( (!)!)"*"*"*!+!+!+!+!+!+!+!+#-",!+))) * * * * *)((('&&&''(()******** + +!,!,"-"-#.#.#2#2"1!0 / /.. / /!0!0"1"1"1#0!0, +**!,%/&0&.&.'/'/)0)0*1+1/1121111425 35 15 19"29"2:"29!18 .8 .:.7-5 13!13!13!13!13!13!13!12 02 03!14"25#36$47%59$5:#3<$4<$2=%3?'5@(6@(5A)6?(2?(2?(2?(2?(0?(0?(0?(0A'0B'0B'0C(1F(0F(0G)1G)1K,2K,2L,1M-2M-2N.3P-1Q.2S/1S/1S/1T02T02U13U13U13V24V24V24W35Y57[79]9;a:;d<=f<=f<=h?=l@=oD>qF?rG>uI>vJ=yKT@V?\@mIxNyEy?ƀDĂF~@HDA=;=@B{BzA{CyAwCv@tAs?uEuEtGrEnGmFkGkFnHmGmHlGlIkHiIiIfJfJeKeKeMeMeOeOdMcLcLcLdMfOhQiRjSjSjSjSjSjSjSiShSgSfRfReQeQeQeQfQfQgRgRhShSjTiVgWgYhYjXlZnWpYpVv]uYtYvXvZwZz[{ZWUWW[[~[~[ǃ`Ƃ_Ł\YÂXĄXŅYƆXʇZϋ\ҊZԈWډZ_܎]ӉXɅVRxNsKoNhK_FWA{R>vP=rL9mJ6lI5kL7oP;oS=qW@rXAtXBuYCwXCwXCwWBvVAwXCtU@oS=nRiN=fK:`F7_E6]C6\A6YA7X@6Y@9Y@9X?:W>:V=9U<8V>:X@\D@XC>XC>WD>WD>WD>WD>VE>WD=[D>\C<[B;ZA:[B;\C<^E>_F?^E>]D=\CQ;=R9[?;ZA:ZA:[B;]D=^E>^E>_F?^E>_F?`G@`G@_F?^E>]D=^C<]@:]@<^A=^B?\BA[ABX@@W??Z@CY?@]?AaABeCBcA?a>*,=)+;')9%'8$&8$&8$&9%'#+#+#*#*%*%*%(%(&&&&'&(')&)&+&,'0*0*0*0*0*0*0*0*1+1+1+1+1+1+1+1+.-.-.-.-.-.-.-.-0/0//./..--,-,,+-,-,-,-,-,-,-,-,.-.-.--,-,,+,+,)+'+%+%,&-)-)-*-*'('(&*%)$($($)"*+--------------+ * * *!+!+!+!+!+ * * * * * * * *&&'' ( (!)!) ( ( (!)!)"*"*"*!+!+!+!+!+!+!+!+",!+ *)(() *!+ * *))(((&'''()))******** + +!,!,"-"-#.#.$3#2"1!0 /-,, / /!0!0"1"1#2#0 /, + + +"-$.&0&.&.'/'/)0)0*1+102121122425 35 16!2:#39"2:"29!19!/8 .:.8 .6!04"24"24"24"24"24"24"22 03!14"25#36$47%58&6:%4;#3<$4<$2=%3?'5@(5@(5A)6>'1>'1>'1>'/>'/>'/>'/@&/A&/B'0B'0C(1F(0G)1H*2H+0K,2L-3M-2M-2N.3O/4Q.2Q.2S/1S/1S/1T02T02U13U13U13W35W35W35X46Y57\8:^:?f<=f<=g=>k?>nB?rGAtIByMDxLAxJ=yKTBV?\>mI{N}J~DʃEŃFBHFC@>@CED~D}E{ByDwAuBuAvFuEtGsFoHmFkGlGkEkEkFkFkHkHjJjJgKgKeKeKeMdLdNdNdMcLcLcLdMfOhQiRjSjSjSjSjSjSjSiShSgSfRfRfRfRfRfRfQfQgRhSiTjUkUkXhXgXiZjYmYoXpXqWx]w[wZy[yZy\{\|[XVXX\\\\Ȅaǃ^Ƃ[ƃYƃXDŽWȅXɇW͇VӋYٍ[܌[]a_ӉXɅTPxNsKoNjLaGYC{R>yPnR=nQ?mP>hM_F?^E>]D=\CQ;=P:^E>_F?_F?_F?`G@`G@`G@^E>]D=^C<\A:^A;_D=`D@^EA]CB^BA^BA`BD]=>_;=d=>f<=d87e77n7:p-4m*3a*/Y,/R/3O26L16J/4M4:K4:H59E58F37G06K-5J,4G-6C.5C.5B-4C.3D/4F16G35J68K79M9:N:;O;*,=)+;')9%'8$&8$&8$&9%'#+#+#*#*%*%*%(%(%%&&'&'&(%)&+&+&/)/)/)/)/)/)/)/)1+1+1+1+1+1+1+1+/./././././././.0/0//././..-.-.--,-,-,-,-,-,-,-,.-.-.--,-,,+,+,)*&+%+%,&-).*.+.+()()'+&*&*%)%*#+ ,,,,,,,,,,,,,,,,",",",!+!+!+!+!+ * * * * * * * *&&'' ( (!)!) ( ( (!)!)"*"*"*!+!+!+!+!+!+!+!+",!+)((())!+!+!+ * *))('''())) ********* + +!,!,"-"-#.#.#2#2"1 /.-,+ / / /!0!0"1"1"/., + +!,"-$.%/&.&.'/'/)0)0*1+10223223 35 36!46!26!2:#3:#3;#3:"2:"09!/; /8 .7 06!06!06!06!06!06!06!05 /5 /6!07"18#29$3:%4;&5;#3>#2>#2?$3A'4B(5B(5C)4@&1@&1@&/@&/@&/@'-@'-@'-A&/B'0D&.F(0G)1H*2J+1J+1M,3M-2M-2N.3Q.2Q.2Q.2R/3S/1S/1S/1T02T02U13U13U13W35W35W35X46Z68\8:^:f=Af<>h;>i=>k?>nB?sFAuHB{LDzKAxJ=xJ;{L<P>TBW@]?lG{LɀK̂E˄DƅEDIGC@?ADHGF~F|CyDyBwCvBvFvFuHsFpHoGmHlGjDjDkFkFkHlIkKkKgKgKeKeKdLcKcMbLdMcLcLcLdMfOhQiRjSjSjSjSjSjSjSiShRgRhShShShShShSfQgRhSiTjUkVlWmZiYiZj[l[nZpZqZrYz_z^z]{^|]|\|]|[XVXX\\\\ƅ_ƅ_ǃ\DŽZDŽYɅXˇZΈWшUٌXߏZ[_b^ՉWȄSPxNsKqOkMbHZA{R<{RoPkN8XA;\E?^GA[G@[G@ZG@ZG@ZG@ZG@YH@ZG@]F>]D=\C<[B;[B;[B;\C<]D=_F?_F?^E>^E>\C<[B;ZA:XA;U=;S>=R=bG>cH?cH?cH?bG>`E<_D;_D;`Ek9:j76u=>EH;E3>~.7k-2\/2T15N15J/4N5;J5*,=)+;')9%'8$&8$&8$&9%'#+#+#*#*%*%*%(%(%%%%&%'&'$(%*%+&/)/)/)/)/)/)/)/)0*0*0*0*0*0*0*0*/./././././././././././././././..-.-.-.-.-.-.-.-.-.-.--,-,,+,+,)+',&,&-'.*.*.+.+)*()'+&*&*%)%*$*".!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.#-#-",",",!+!+!+ * * * * * * * *&&'' ( (!)!) ( ( (!)!)"*"*"*!+!+!+!+!+!+!+!+!+ *)(''()",!+!+!+ *)))'(()) * * ********* + +!,!,"-"-#.#.!0!0 / /.-,,-... /!0!0!.-+!,!,"-"-$.$.&.&.'/'/)0)0*1+11 323223 36!46!46!27"3;$4:#3;#3;#3:"09!/; /9!/8!17"17"17"17"17"17"17"16!06!07"18#29$3:%4;&5<%5;#1>#2>#2?%2A'4B(5B(3C)4?%0?%.?%.?%.?&,?&,?&,?&,A&/A&/E'/F(0H*2I+3K,2L-3M-2N.3N.3O/4Q.2R/3R/3R/3S/1S/1S/1T02T02U13U13U13X46X46X46Y57Z68]9;_;=b;>e;?f<@h;>j=@l@AoCBrEBsFAzKEyJ@xI?xJ={K=QAUEXA_@mCzIʁJσE̓BȄCÆEIHDA@BFJHH~F|CxCxAwCvBwGvFuHtGqIoGmHnHkEkElGlGlIlIlLlLgKgKeKdJcKbJbLaKdMcLcLcLdMfOhQiRjSjSjSjSjSjSjSjShRgRhShSiTiTiTiTgRgRhSjUkVmXnYnZlZkZl[o[q]q\s\tY{_|^}_~_~^~^}^~\YWY[]]€]€]ń^ń\DŽZȃYɅX͆XψZӉX׊TޏWZZ]`\ԈVǃR}NvLrJpNkMbHZA|T;}U<V@}X>|X@wXuZ=x]B|^B`GbFaHaHzZEuVBrS?oPjM;gJ:cF8_C7^B6\A6[@7[@9\A:[B;\C9W>9W@:YB<\E?^GA]IB]IB\IB\IB\IB\IB[JB\IB^G?^E>\C<[B;ZA:[B;\C<\C<_F?_F?`G@_F?^E>\C<[B;YB=R=:S;;R:8R89R87S9:S98U8:U98W9;Y;;[=?\><[@9\A8\A8]B9_D;`E<`EaF=bGdI@dIBcGCdEBeCAeAAf>>m?AuCDt>>v<;KK[`XcHU=E|59f47X46P16I06N4=K6=I6*,=)+;')9%'8$&8$&8$&9%'#+#+#*#*%*%*%(%($$%%&%'&'$(%*%*%.(.(.(.(.(.(.(.(0*0*0*0*0*0*0*0*0/0/0/0/0/0/0/0//././.0/0/0/0/0//-/-/-/-/-/-/-/-/-/-/-.,.,-+-+-)-)-'-'-'.*.*.+.+()()'+&*&*%)%*#)#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/$.$.#-#-",!+!+ * * * * * * * * *(())** + +*** + +!,!,!,!+!+!+!+!+!+!+!+!+ *)'''((",",!+!+ * * *)((()) * *!+******** + +!,!,"-"-#.#......---,,,-... --+!,"-"-"-$.#-&.&.'/'/)0)0*1+11 33 43 33 36!46!47"37"3;$4;$4;#3;#3:"0:"0g:?ixH>zJ>~M?QBUFXAa?l@yFʂGτC̃?ɅDƉHˆHHDAACGLIH~F|BxBw@vBvBwGxGvItGqIpHoInHmGmGmHmHmJmJlLlLhLgKeKdJcKaIaK`JeMdLdLdLeMgOiQjRkSkSkSkSkSkSkSjShRhRiSiSiTjUjUkVfRfRhTiUkWmYnZo[n\o]o^q]r_s^u_u[|a}`aa`€`~]~[[Y[[]]]]ă]ă[ƃYȃY͆XЈXԊ[،Z܍TUYXZ^ZӇSĂP}MvKrIoMjLaGZA~T<W=ZA]B]C{\?wXhK;eH:^B6^B6]A6\@5[@7\A8]B;^C\C<[B;ZA:ZA:[B;[B;_F?`G@aHAaHA`G@]D=[B;YB>]?=[@9\A8\A8]B9_D;`E<`EdM?dM?dL@eJAdIBdE@eD?gA@kB@vHH}KJwA?u;9MLbcgpS^BI7:g56X65Q48K28N4=L5?J5>F5;D58A55@44B44F37F16F16E05F24G35I57J68M9:N:;P<;Q=:Q>:O<8N;7L87J65I54H43F23E12E13D02B.0A-/A,1@+0>*,=)+;')9%'8$&8$&8$&9%'#+#+#*#*%*%*%(%($$$$&%&%'$'$*%*%.(.(.(.(.(.(.(.(0*0*0*0*0*0*0*0*0/0/0/0/0/0/0/0//././.0/0/0/1 01 0/-/-/-/-/-/-/-/-/-/-/-.,.,-+-+-).*.(.(.(.*.*-*-*()()&*&*%)%)$)$)&.$0$0$0$0$0$0$0$0$0$0$0$0$0$0$0%/$.$.#-",!+!+ * * * * * * * * *(())** + +*** + +!,!,!,!+!+!+!+!+!+!+!+!+ *(''''(",",",!+!+ * *)(()) * *!+!+******** + +!,!,"-"-#.#.----....++,,---,,+!,"-#.#.#-#-&.&.'/'/)0)0*1+11 33 43 34!46!47"57"37"3;$4;$4<$4;#3;#1:"0j=@m@CpBDqCCsCArB>uF@uFzJ>N@RCVGXBa>k>yBˁD΃@̃>ɆBNJG‰FEBAACGLJHF{AxBv?vBvAyHxGvItGrJpHoInHoIoIoJnInKmJlLlLhLgKeKdJbJaI`J`JeMdLdLdLeMgOiQjRkSkSkSkSkSkSkSkShRhRiSiSiTjUkVkVfRgShTjVlXnZo[p\o]p^q]s_s^u_v^v]}b~`bbaÁ_~]\[Y[[]]][ÂZłXǂX˄XΆVӉX،[ݍZߏTTXVY]ZЇRÁO}NuJqJnLiKaGZ@U}`@aDcDcGdI_I|\GxWDuVBsTBqR@mM>gJ:_B4]A5]A6\@5\?7\A8^C<_D=W>7X?8Y@9[B;[D<[D<[D<[D<_KB_KB^LB^LB^LB^LB]LB^LB^G?^E>]D=[B;ZA:ZA:[B;[B;`G@`G@aHAaHA`G@^E>\C:U=9U<8T;7V=9U<8W;8W;8Y;9[=;]?=^A=[@9\A8\A8]B9_D;`E<`EgM@eN>fOAeN@fK@dI@cF@bC>fC?mFAzNKOKs@O3?M3>J3;G48C55C54B43F35G27F16F24F24H46I57J67N:;O;:P<;Q==R?;Q>:P=9R?;Q>:P=9N;7L87J65I54H43F23E12E13D02B.0A-/A,1@+0>*,=)+;')9%'8$&8$&8$&9%'!)!)")")%*%*&)&)'''')()(*'*'-(-(.(.(/)/)0*0*1+1+2 ,2 ,2 ,1+1+0*0*0*0/0/0/0/0/0/0/0/2!12!12!12!12!12!12!12!11/3/3/3/3/3/3/3/3/2.0,/+/+/+/+0*/+/)/).(.*-),),)()()'+'+'+'+',',%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-!+!+!+!+!+!+!+!+!+!+ * *))((**++,,--------- -)))(('''!+!+ * *))(())))))))) * *!+!+",",", + +**))(())))))))........,,,,,,,*,* +!,"-#.%/%/(0(0(0)1*1+2+2,22!43 43 33 3424240407 08!1:"2;#3;#1:"0; /8 .:$1:$1;%2;%2<&3<&3='4='49#09#08"/8"/9#0;%2<&3>&4@&3A%3A%1A%1A%1A%1A&/A&/A&/A&-A&-A&-A&+A&+A&+A&+E(-F'-G(.H)/J)0K+0L,1L,1Q.4R/3S/3T02T02U13W03W01W.2W.2X/3X/3Y04Y04Z15Z15\37[26[26[26\37^59`7;a8m?Bm?Bo>Ap@@sCAvFB{JE|LB~LC~LAN@RCXJ^Fb=n=}EІG҇Cχ?ʇALjCŌIGB@‰DGIKDD|C{AyCyByEzExGxFvHtFrIrIqKqKqKpJoJnImJlIkKjJjNiMeKbHaI_G_I_IeLeLeLeLfMhOjQkRmTmTlSlSkRkRjQiQgQgQhRhRiSiSiTiTiUjVkWmYo[p]q^s_r`sat`uau`wav_v^}cbdb~^~\€^Ă_ZX[[^^„]Ã]ń\DŽZȄW̃VчVًZߏ^]\Y[\ZV؈S·S~N|MuJpImJhIcF^D^B]?]@aAeGgFeFb@|_?|_=~_@dBfGfEaC]A}[B{[D{[FzZExWDsT@pQ?lO?fI;dG9aC8]A5\@5\@5\?7\A8X?8X?8X?8Y@9YB:\E=^G?_H@_KB_KB^LB]KA]KA\J@[J@[I?_H@`G@`G@_F?_F?_F?_F?_F?cJCcJCbIBbIBaHAaHAaHA_H@[D>YE>XD=XD=YB`C?`C=aD<`D9`D9_C8`D9aE:cGfJ?fJ?gK@gK@hLAhLAgM@gM>gMdM?cK?eJ?eJAeH@dF>hE?kF@nE?qD>sDN0:J17G14F23G34G35H46I57J68K79M9:N:;N:;Q=>Q=*,=)+;')9%'7#%6"$5!#!)"*")#*%*&+&)&)'''')()(*'*'-(-(.(.(/)/)0*0*1+1+2 ,2 ,2 ,1+1+0*0*0*0/0/0/0/0/0/0/0/2!12!12!12!12!12!12!12!13/3/3/3/3/3/3/3/3/2.1-/+/+/+0,0*/+/)/).(.*-),),))*)*(,(,(,(,(-(-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-%-!+!+!+!+!+!+!+!+!+!+ * *))((***++,,---------)))(('''!+ * *))((())))))))) * * *!+!+",", + +**))(())))))))........,,,,,,,*,* +!,"-#.%/%/(0(0(0)1*1+2+2,21 32322225 35 35 15 18!19"2;#3<$4<$2;#1&3A%3A%3A%1A%1A%1A&/A&/A&/A&-A&-A&-A&+A&+A&+A&+C&+F'-F'-G(.H)/J*/K+0L,1L,/Q.2R/3S/1S/1T02T02W01W01W.2W.2X/3X/3Y04Y04Z15Z15\37[26[26[26\37^59`7;b8l>Am?Ao??p@>sC?vGA|KD~NDNCPBQBTCYH^Dd>q>ƀEԉH׊D҈?͉BɊCnjHÊE‡A@‰DFHID~C|C{@yBxAxDzDwEwEvHvHtKsJqKqKoIoInInImJlIkKkKiMgKdJbH`H_G_I_IeLdKdKdKeLgNiPjQlSlSlSkRkRjQjQiPhQgQgQhRhRiShSiTjVjVlXmYn[p]q^r_r`s_t`t_v`w_v^w]}acc`~\~[€]ă]ZY[‚\^„_„]„[ąZDŽYɅXχW֊Yގ[`_ZYZ[[ލVՈT̆SN}NvLrJnKkJgJcGaD`@aCdCiIkHiHgCa?~b=b@eAgFgDbB_A^C^E~^G}]F{[FyYDuVBsTBlL=hK;eH:bE7_C7]A5]A6\A8[@7Y@9Y@9ZA:ZC;]F>_H@`IA`LC`LC^LB^LB]KA]KA[J@\J@`IAaHAaHA`G@`G@_F?_F?_F?bIBbIBbIBaHA`G@`G@`G@^G?ZC;XD;XD=WC:YB_D=aD@aD>aD@aD>bF;aE:aE:aE:aE:bF;dH=eI>fJ?fJ?gK@gK@hLAhLAiMBiMAiM?gMdM?dL@cK?cKAeJAdG?fH@iHAjH?mG>mE;nC:t@5=793p92`:1S:3N;5P::Q>:R?;R?;S@:S@:Q>:Q>:P=9O<8N:9M98L87K76I56G34E13C/1B.0A-/A,1A,1>*,>*,<(*;')9%'7#%6"$5!#"*"*")#*%*&+&)'*'''')()(*'*'-(-(.(.(/)/)0*0*1+1+2 ,2 ,2 ,1+1+0*0*0*0/0/0/0/0/0/0/0/2!12!12!12!12!12!12!12!140404040404040403/2.1-0,/+/+0,1+/+/)/).(.*-),),)*+*+)-)-)-)-).).%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+!+!+!+!+!+!+!+!+!+!+ * *))(()**++,,,,,,,,,,,)))((''' * * *))(('(((((((())) *!+!+!+", + +**))((''''''''........-------+,* +!,"-#.%/%/(0(0(0)1*1+2+2,2/11211225 36!46!27"39"2:#3<$4=%5=%3<$2="1&3>&3;#0;#0:"/9!.:"/;#0=%2>&3A%3C%1C%1C%1C%/C%/C%/C%-D&.D&.D',D',D',D'+D'+D'+F'-F'-H(-I).J*/K+0N+/N+/R.2R.0R.0S/1V/0V/0V/0W01W.2X.2Y/3Y/3Z04Z04[15[15]37\26\26\26]37_59a7;b8Ap@@p@>qA=uD?xG@~LCODRESETCVCZG]AiAu@ʄF؍IڍEՋ@ЌC̎EȍGċD‡Aˆ?ÈBCFG~C~C{Bz?xAx@wBxBuCvDwIxJvMtKqKpJmGmGmHmHmJlIkKkKgKfJcI`F_G^F^H^HdKcJcJcJdKfMhOiPlSkRkRjQjQiPiPiPgPhQhQiRhRiShShSkWkWlXmZn\o]p^r_r^s_t`t_v`w`w_w^}bccÁa]~[€]ń^Ā[[[‚\^„_]Å\ąZɆY·YԊY܎]acb[Z\][ڍWшUȆT~NzMtJqKoKoNlNkMfFeCfFkGnLpKoLnHeAd>dAhBiFiDeCbBaEaFaHaH_H~^G|\GyZErS?pQ?kN>gJ:dG9bE7`D8^D7\A8ZB8ZB8[C9\F;^H=`J?bLAaMBaMB_MA_MA^L@^L@\L?]K?bKCbIBbIBaHAaHA`G@`G@`G@aHA`G@`G@`G@_F?^E>^E>]F>YB:WC8WC:WC8YB:YC8ZA:ZB8]D=^FhJ?hJ?hJ?iK@iK@jLAjLAkMBjNBiM?hN?hNAeN@eMAcMBcLDdKDbIBeJAfIAgI?iG=jF:hD8kA5m7-l5.a9/W;0Q=6P>:UR4:Q>:R?9R?9S@:S@:R?;Q>:Q>:O<8N:9M98M98L87J67I56F24D02B.0A-/A,1A,1=)+=)+<(*:&(9%'7#%6"$5!#"*#+#*#*&+','*'*'''')()(*'*'-(-(.(.(/)/)0*0*1+1+2 ,2 ,2 ,1+1+0*0*0*0/0/0/0/0/0/0/0/2!12!12!12!12!12!12!13!14040404040404040403/1-0,0,0,1-1+/+/)/).(.*-),),)+,+,*.*.*.*.*/*/%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+!+!+!+!+!+!+!+!+!+!+ * *))(()))*+++,,,,,,,,,)))((''' *)))('''''''''''()) * *!+!+!+ + +**))((''''''''........-------+,* +!,"-#.%/%/(0(0(0)1*1+2+2,2.00111225 36!47"38#4:#3;$4=%5>&6>&4=%3>#2="1;#0;#0<$1<$1=%2=%2>&3>&3<$1;#0:"/:"/:"/;#0<$1?%2A%1C%1C%1C%/C%/C%/C%-C%-D&.D',D',D',D'+D'+D'+D'+F'-F'-H(-I).J*/K+0N+/N+/Q-/R.0R.0S/1U./V/0V/0W/0X.2X.2Y/3Y/3Z04Z04[15[15]37\26\26\26]37_59a7;d7:f8:k;;o??p@>p@yI?NCRDUGXGXEYD[F_@nCzDΉHۑJߑGڎBԏDАHȎEŌEĊAÉ@ĉCCEE~C~C|Bz?w@v>vAv@tBvDwIyKxOvMrLpJmGmGmHlGlIlIkKkKfJdHaG`F^F^F^H^HcJbIbIbIcJeLgNhOkRkRkRjQjQiPiPiPiQhQhQiRhRiSiSiTlXlXlYn[n\o]p^q^r^s\t^v_w_x_x`x]}aaĂbÁ_\\Â\ń^Ā[Â\Â\‚\„_Å`^Å\Ƈ\ˈ[ҋ]ۏ^acee[\^^ߒ\،ZΈWŇXzLvKrHpIoKrNpPpPhGjGkInJqMrLrMrKjDjBhBkDlGlFhDeAcCdEbFbFbFaE_F~^GyZEwXCrVAnR=jM;gJ8cH7bF8_D9\D:]E;]E;^H=`J?bLAdNCcODbNCaOC`NB`NB_MA^NA_MAdMEeLEdKDcJCbIBaHAaHA`G@_F?_F?_F?^E>^E>]D=]D=\E=WA6VB7VB7WC8ZD9ZD9\D:\D:_G=aI?fKBiNEjMEiLDfIAdH=hJ?gI>fH=fH=gI>hJ?iK@jLAjLAjLAjLAkMBkMBlNClNCmODjN@jN@iOBhMBfNDdNCdMEdMEdKDdKDfKDgJBfH>fF;eC9gA6i>7f>6_A9ZA:TA;S?>U;>X9?Y3>X2?T3>Q3=P5:Q>:R?9R?9S@:S@:S@&6>&4=%3>#2="1;#0;#0<$1<$1=%2=%2>&3>&3=%2<$1;#0:"/:"/:"/;#0>$1C%1D$/D$/D$/D$/D%-D%-D%-F'-F'-F'-F',F',F',F(*F(*G',G',H(-I).L)-M*.N+/N+/Q-/Q-/S,-T-.T-.U./V..W/0X.2X.2Y/3Y/3Z04Z04[15[15]37\26\26\26]37_59a7;d7:f88k;7o?;pA;rA|J?O@SBWDYDZE[E^HaAqD~EҋIޔKHܐBՐCёGʎFnjFƊBƊBƋEÊEEED~C|Bz?w@v>u@v@sAuCxI{LyPwNtMrKnHnHnImHmJlIkKkKeIdHaG_E^F^F_I_IcJbIbIbIcJeLgNhOlSlSkRkRjQjQiPiPjRjRjRjSjTjTjTjUmYnZmZn[n\o]o^p^r[s\t^v_w_x`xay^~bbƁbƁ`€]\ă]ƅ_Ł\Â\Á^Ã_Å``^Ć]ȉ^΋^׏_bbcdd^_aaڑ^Ӌ[ȆVVsGqGnDnGpLrOrPrPlInIpMsLsNtKsMtKoHnElEnEoIpGmGjDdAcCcDbC`D_C`D`D~`F|^Fz[FvWBpT?kO:hK9eJ9aG:_G;_G;_G;`J=bL?eOBfPCdQCdQCcQCbPBbPBaOA`PA`NBgPHgNGfMFeLEdKDbIBbIBaHA_F?_F?^E>^E>]D=]D=\C<[D_B>[B>X@@VY6=W1:R?;R?9R?9S@:TA;TA:TA;TA=S@&3>&3>&3=%2;#0:"/9!.:"/;#0=#.C%/D$/D$/D$/D%-D%-D%-D%-F'-F'-F',F',F',F',F(*F(*G',G',H(-I).L)-M*.N+/N,-P,.Q-/S,-S,-T-.U./V..V..X.2X.2Y/3Y/3Z04Z04[15[15]37\26\26\26]37_59a7;d7:e85k<6o@:qB:sB;uE;zH=}L>O>T@VAYBZD\DaIeErDDӌJIFܐBՐCёGɍEǍDȌDɍEȍGƍHHHFE~D{@xAw>v@v@tBvDxIzKxOwNvOuNqKqKpKoJnKlIkKjJeIdHaG`F_G`H`JaKdKcJcJcJdKfMhOiPmTmTmTlSkRkRkRjQmTlTlTmUlUlVlVlVo[o[n[o\o]o]o^p^r[s\t]u_x`yazaz`}bÁaǂcƁ`€]€]ă]ƅ_Ł\ă]Ă_Å`Å`‡_‡_ć[ˌ`юaڒbdca^_^ܗ`ܕ_ْ^Ԍ\ɅVS}PpEoFnFqJsOvRuStQrMtOwQwPuNtLuLuLtKrIpGqHsJsJpHmEgBeBdAbA`?`A`A`CbFaG}_Ez\DtXBpT>lP:iN;cIbL?dNAgQDhREfSEfSEdRDdRDcQCcQCaQBbPBiRJiPIhOHgNGeLEdKDbIBbIB_F?_F?^E>^E>]D=]D=]D=[E:WA6VC5WD6YF8]G:_IdL@fNBjODlQFmQFmQFkODjNCmODlNClNCkMBlNCmODoQFpRGmODmODnPEnPEoQFoQFpRGpRGlPDlPDkPEjOFhOHgNGgNIgNIeLGhLHiLHjKFkJCkI@kF>jE?Z;9Z<W=>V[6>[6>X2=T3TA=TA=S@=P<;P<;O;:P<=N:;K79H46E13C/1B-2B-2>*,>*,=)+=)+<(*<(*;');')$,$,$+%,',(-(+),'''')()(*'*'-(-(.(.(/)/)0*0*1+1+2 ,2 ,2 ,1+1+0*0*0*0/0/0/0/0/0/0/0/2!12!12!12!12!12!12!13!16!27 27 27 27 27 27 27 261504/3.2-2-3.3-1+/)/).(.*-),),))*)*(,(,(,(,(-(-&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*%+#+!+!+!+!+!+!+!+!+!+ * *))(()**++,,,,,,,,,,*+))(('''(((''&&%$$$$$$$$''(())) * + +**))(())))))))........ / / / / / / / -,* +!,"-#.%/%/(0(0(0)1*1+2+2,21 32322225 35 35 15 18!19"2;#3<$4<$2;#1$/>$/?%0?%0@&1@&1@&1?%0=#.<"-;!,;!,<"-=!-C%/D$/D$/D$/D%-D%-D%+D%+G(.G(.G(-G(-G)+G)+G)+G)+G',G',J'+K(,L)-M*.O+-O+-R+.R+,S,-S,-U--U--U--V..X.2X.2Y/3Y/3Z04Z04[15[15]37\26\26\26]37_59a7;d7:e85k<6p?:rA:sC9vF:{J<~M>O>Q>T?W@X@^CdIiGrBBӍHIEې?ԏAҐDɍDǍDɍEˏGːJɐK‹KKHFE|AxAx?wAv@vDvDwHxIxNxNxQxQuOtNsNqLoLmJjJiIeIdHbHaGaIaIbLbLeLdKdKdKeLgNiPjQoVnUnUmTmTlSlSlSoVoVnVoWnWnXnXnXp\p\o\o\o]n]n]p^r[s\t]v`xayaza{a~cŀaǂcǂaÁ^[Ã]dž`Ƃ_Ă_Ă_Å`Å`‡_‡_ň\ΏcԒbݕcdc^YYِYՒ]Տ\ϋZɅV}OvJsGpGqGsJvOyU{WxUvSyT|UW~UzPwMwLxMyMwKtHtHuJtJrHpHkFiDfAdAb?a@aBaDcFcGbH}_Ey[CuW?oS;kP;dJ;bJ>bJ>cK?dNAfPChREjTGgTFgTFeSEeSEdRDdRDbRCcQCkTLkRKjQJhOHfMFdKDcJCbIB`G@`G@_F?_F?^E>^E>]D=\F;WA6VC5XE7[H:_IBYV7=P7=L7UBXE>VC?UB>TA=S@=Q=O;*,>*,>*,=)+$,$,%,%,&-(-),),''''(()(*'*'+(-(-(-(.).)/*/*0 +1+2 ,2 ,2 ,1+1+0*0*0*0 -0 -0/0 -0/0 -0/0 -2!12"/2!12"/2!12"/2!13!/6!26!07 26!07 26!07 26!07 25 /4/2,2-2,3.3-1+/)/+.*.*-),),+()(+'+'+',',',',&+%*&+%*&+%*&+%*&+%*&+%*&+%*&+%+#+!+!-!+!-!+!-!+!- + ,*+)**))**++,,,,,,,,,,+)+(*')'*()'(&'%$$$$$$$$'''(())* + +**))(())))))))........ / / / / / / / -,* +!,"-#.%/%/(0(0(0)1)1*2+2+22!43 43 33 3224240407 08!19"2;#3;#1:"09!/:.=#0=#0>$1>$1?%2?%0@&1@&1@&1?%0>$/<"-< ,;!,=!-=!-C%/D$/D$/D$/D%-D%-D%-D%+G(.G(.G(-H(-H(-H(+H(+H(+G',G',J'+K(,L)-M*.O+/O+-R+.R+.R+.S,/T,-U-.U-.V./X.2X.2Y/3Y/3Z04Z04[15[15]37\26\26\26]37_59a7;d7:e85k;7o@:rB8tD8wF8{J;N=M;QԋFߓGCڎ@ӎAяEɍDǍDɍD̐G͓J˒KƌLKJJF~DzBxBwAwCwEwEwGwHwKxNyPyPyPxOuOsLoJnHkHjIfHfGdHcGaGcHcKeLeLfLeLeLfMhOjQkRpWoVoVnUnUmTmTmTpWoWoWpXoXoYoYoYq\p\q]p]p]o]n]o]q]r^s^u`x_z`|_|^~aÁaŃaŃ`Â\‚\ą\Ɔ`Ã`Ã`ĄaĄ`ĆaŅ_Ƈ^LJ[Ӑcٓbߕddb]XUԌZύ]͊]ɆYSvKoDkAsItJvN{RVW}SyOVY\W}TzPyO{PzOxLvJuIvKvKtJsHoInHiDgAc@b?bAbCcDcFbF`D|\CxX?sU;pQeK>fL?fOAhQCiSEkUGhUFfUEfUEeTDeTDdSCcSCdRDjVKkUJiSHhRGgOEeMCcKAcJC`G@`G@`G@_F?^G?]F>]F>]F>XB7WD6[E8^H;aK>cM@fNBgOCiQEhPDhPDhPDkPElQFmRGmRGoSEnRDnRDmQCnRDpSErUGsVHoRDoRDoRDrRErRGsSHsSHrTInRGlQFlQHlQHkPIjOHjNJjNJiLHkLGnMHpMGrMEsLErLCnKEgKJ`JL_FJ]CF^?D^>Ca8VC=VC=WD>VE=XE>WFTA=S?>R>=Q==P<=M9:I56F23D01C/1B.0@,.@,.@,.@,.?+-?+-?+-?+-%.%.%-%-%-&-&+&+&'&'&''''%'%'%(%+(+(+(+(+(+(+(-(.)/*0*1+1+2 ,2 ,2 ,1+1+1-1+1-1+1-1+3!/3!-3!/3!-3!/3!-3!/3!-3!/3!-5 /3!-5 /3!-5 /3!-4.2 ,4.1+3-0*2,2,3-2,0./--+,*+**+),)-)-(,'.&-&-%,$,"*$,"*$,"*$,"*&.$,%-#+$,"*#+#+",", . , . ,.,!0--)*(**((((((((,,++**)),*,*,*,*)(*(*''$%%%$#"!!!"#$&'()********(((((((( / / / / / / / /.-,,-.!0"/%2&0&0&0&0&0&0&0'1'1(2(2) 3) 3, 4, 4.2021 21 22!33 34"24"26!06!07"18!19#09#0:$1;#1;#1;#1<$2<$2=%3=%2@&3@&3A%3A%3@$0@$0A#-?$-@",@",B$0D&2F(2H*4I)4H)1H'0G&/J)0J)0J)0L)/L)/L)/L)/L)/M*0L)/M(/L'.M(/N)0R*2S,1T+1T+1U,2U,2W,3W,3X-4X-4Y/3Z04Z04[15[15\26\26\26]37]37]37]37_59a7;d:>e;=f:;j<W?Z>aAhFnBp7|9׉?ێ@ܐBےEҎEȈ@ˌEȌDƍ@ǎAȏBŋBBBEHE}E|C{E|F|HyGyGzJzK{LzN{O{OzNyMwKuIqHoEmFkEjGjFhGgHeIeHcGdGgKhKgKhLiMkOmQnRqUrVrWsXsXsXrWpVoWnWnWoXoYpZq[r\r\q\q\p\o[o[o[n]l`m`o^s\w\}\\^_^]\‚\ą\Ƈ\lj`a…fƇfLJddž`̇`ӊa؎aڍ_ސ`ccb]݊X׆W͆\Ʌ^Â\ySrMnHpJuMuKvLxM|NNNOQVWVS}R|P{O{NzMzM{MyKxJvHuFsGqIqIpJnHkEhDeBcBhGfGcDbFaF]ByU;sQ8pL\H?XB7[E:_G=bLAfPEiSHjTIkUJiSHgSHgSHgSHgSHfRGfRGfSEfSBhS@hS@iTAiTCjSCmSDmSDnRFoSGoSGpRGqSIqSItSJrTJoTKlTJkSGjRFlQHmRIoSHoSHlPEmQEnPEpPEoOBoMAmK?kK@hKGfJGbHGaED_CB]??[==Z<TA=S@:Q>:R?;O;:L87H43F21E10E10E10?--?-->,,=++<**;)):((:((#.#.%-%-%-%-&+&+&'&'&'&''%'%'%'%*(*(*(*(*(*(+(+(.)/*0*0*1+1+2 ,2 ,1+1+1+1+1+1+1+1+3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-2 ,2 ,2 ,1+1+0*0*0*3/2.0./--+,*+,*+)-)-(.(.&-&-&-$,$,",",",",",",",$.#-#-",",!+!+!+".". . . . ...0/-+****((((((((,++**)))++++++++))***('$&$$#"!!!""#$&'((********(((((((( / / / / / / / / /.--. /!0"/&2&0&0&0&0&0&0&0'1'1'1(2(2) 3) 3, 4- 2.2011 21 22!33!14"26!06!07"17"19#09#0:$1:$1;#3;#3<$4<$4=%3?$3@&3@&3A%3A%3C%1B$0B$.A#-A#-@",B$0C%1E'1F(2H(3H(3G&/G&/J)0J)0L)0L)0M(/M(/M(/M(/M*0L)/M(/L'.M(/N)0R*2S+3T+3T+3U,4U,4W,5W,5X-6X-4Y.5Y/3Y/3Z04Z04[15[15[15]37]37]37]37_59a7;d:>e;?f9nAZ>`=hCm>o2}7ތBޑCܐBْDҎGɉBʋFƌCŌ?Ŏ>ǎAĊ@@@GJG~E{E{E|F{HzHzH{K{K|M|M}N}N}N{LzKwHsGqEoGnFkEkEjHiGgHfGeFfFhLiLhKiLiMkOmQnRqUqUrWsXsXsXqWpVpYpYpYpYpZq[r\r\q[q[p[q\q\q\p\o^kblan^r\wZ|YZ\^]]]\Å\Ƈ\ƈ_‡eÈhƇfƆbȄ]ͅ]։_܎``````ݍ\؇X҅YɄ]Á^}ZvSrPqNtOwOwMyL|L~LNLNQXYZXVTR~R~Q~Q}P}O{MzKyJxKtJtLrLpJmGiCeBc@gGeEcEcEcG_C}X=xR;sN_G=]F>ZF=ZF=ZH>ZI?\J@^H=`H>cKAeMCfPEgQFgQFgQFgSHgSHfTHfTHgUIgUIfVIfVGgVDgVBgVBgVBhUDhUDjUDlUEnTGnTGpTIpTIrTJrTJuTMsUMpULmUKkSGjRFlQFlQFnRFoSGmQCnRDpSEpSEqQBoO@nN?kN@lNFjMGgKGeIEbFB`D@\C?[B>X@;TA;UBXJ=VI9TF9WD>VC?UB>TA=S@:Q>:Q>:O<8M:6J73H51F3/E2.E2.@.,@..?-->,,=++<**;));))#.#.%-%-%-%-&+&+&'&'&'&''%'%'%'%*(*(*(*(*(*(+(+(.).)/)0*1+1+1+2 ,1+1+1+1+1+1+1+1+3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-2 ,2 ,2 ,1+1+0*0*0*1/0.0./--+,*+,*+)-(,'.'.&-%,%,$,"* * * * * * * *#-#-#-",",!+!+ *".". . . . .../.,+)))*********+++**))(++++++++()**)('$%"""!!  "#$$&&'(********)))))))) / / / / / / / /!0!0 / / /!0#2$1&2&0&0&0&0&0&0&0&0'1'1(2(2) 3) 3+3,1.2011 21 22!33!13!16!06!07"17"19#09#0:$1:$1;#3="3>#2>#2?$3@$3A%3A%3D&2C%1D$1C#0C#.B"-B"-B"-A#-B$.E%0F&1F'/F'/G&/F%.L)0L)0L)/L)/M(/M(/M)-M)-N)0M(/M(/L'.M(/N)0R*2S+3T+3T+3V+4V+4W,5W,5X-6X-4X-4X.2X.2Y/3Y/3Z04Z04Z04]37]37]37]37_59a7;d:>e;?f9nA\=a=hBn=p3Ձ9GGݑCאBόEȉBNjEĊAË@>ČAŠ@?@GJG~E{E{E|F|F|H|H}K}K~N~NOP~O}N{LyJuIsGqIpHlFlFkIjHhIgHfGgGiMjMiLiLiMkOmQnRpTqUrWsXtYtYrXqWr[r[r[s\r\s]s]s]pZpZp[q\r]r]r^q`k`lan]r[vY{XZ\^^^^‚^Ą^Ƈ^ƈaNjgƊhƇdń^ȃZφ]׍`ߑcca`ݏ^ً[ԈWфV˂UX{UuQsNsNvPxQzRzP|OOPQPRS\]][YWUWUTTR~P~O}N{OxOwNvOsLpJlFgDeBhHgGfHfHeIbF]A|X@wR@uQCtPBpPAnQAkQ@hQ?eS?jXDhWCfWBfWBfUAgVBhWCiXDfWDgXEhWGhWGjTFhRDgOCfNBaI?`H>^H=[G<[G>[I?[J@]KAdNCeMAgOChPDgQDfPCeOBeOBfSEgTFfTFgUGhVHiWIiYJiYIiXFiXDjXDjXDjWFjWFlWFmVFoUHoUHqUJqUJrVKrVKtVNsVNqVMnVLlTHkSGlQFlQFlREmSFoSEpTFqTFrUGqTDpSCqQBnQCoQGnQIlOIjMGgLEeJCbIDaHC^E@]D@[C?YA=T?;TA;UBZI?YK>XJ=VH;UGVC=UB8O<6O<6N;5L93J71H5/F3-D1-C/.B./A-.@,-?+,>*+=)*=)*#.#.%-%-%-%-&+&+&'&'&'&''%'%'%'%*(*(*(*(*(*(+(+(-(.)/)0*0*1+1+1+1+1+1+1+1+1+1+1+3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-2 ,2 ,2 ,1+1+0*0*0*1/0.0./--++*+,*+(,(,'.&-&-%,%,#+ * * * * * * * *#-",",",!+ * * *".". . . . .../.,*))))********+***)(((********(()))(&##!!!!   ##$%%&''********)))))))) / / / / / / / /"1"1!0!0"1#2$3%2&2&0&0&0&0&0&0&0&0&0&0'1(2(2(2+3,1-1/0011 21 22 03!16!06!07"17"19#09#0:$1;#1="3="3?#2?#2@$3@$2A%3C$3D&2E%2E%2D$/D#.D#.D#.C"-B"-B$.D$/D$/E&.E&.F%.F%,L)0L)0L)/L)/M(/M(/M)-M)-N)0M(/M(/L'.M(/N)0R*2S+3T+3T+3V+4V+4W,5W,5X-6X-4W-1W-1W-1X.2X.2Y/3Y/3Z04]37]37]37]37_59a7;d:>e;?f9LIܐBՍAΌBȉBĉC?=]I@]KA^LB^L@fPEhPDiQEjRFiSFhREgQDfPCgTFgTFgUGiWIjXJkYKk[Ll\Ll[Il[GlZFlZFlYHkXGmXGmXGnWIpVIrVKrVKsWLsWLsVNtWOpXNoWMmUIkSGlQFlQFmSFmSFqUGqUGsVHtWItWGsVFtTEqTFoSGoSHnRGlPEjOFiNEhMDeMCbIBaHA^GA\E?XD=VB;T?:T?:V>=R=:S>;T?:TA;UBYH>ZI?YK>XJ=WIVC=UB"1>"1A"2A"2B#2B#2C$3D$1F&3F$2F%0F%0G#/F",F",D#,C#.C#.C$,D%-E$-F%.G&-G&-L)0L)/M(/M(/M)-M)-O(-O(-N*.M)-M)-L(,O(-P).S*0T+1T+1T+1V+2V+2Y,3Y,3Z-4Z-4Y,1Y,1Y,1Z-2Z-2[.3[.3\/4_27_27_27_27a49c6;f9>g:?f9x8BMIڎBӋ?̊@Ĉ@A=;;>?@BEHG~E|C|C|E|EIIJLMMPPQQ~O|MyLvIsKrJqJpInLmKlLkKjJjJmPlOkNkNjNkOmQnRpTqUrWtYuZv[tZtZu^v_w`xav`u_t^s]pZpZp[r]s^t_t`tcoanap\t\wYzY}[]aacÂdłeƄdƄaƅ_Lj_ƅ[ŅYɆYϋ\ؒaߗgiۑ`ُ^ՋZχWʄSQ~O}PxLtIqHtIyPUVUTTTWXYZ[^_][ZXVXWVUSR~QRRUVT|SxOrLnHlGkHlIlLlLiKfHcG`H{XEzVFvUDpSAnS@mT@kU@iWAm[El\El\El\ElZDkYCjXBiXDjYGkZHlYHlYHmWIlUGlREkQDfK@cK?bJ@aK@_K@^L@_MCaMBfPEiQEjRFlTHkUHkUHkUHjTGhUGiVHiWIjXJkYKm[Mm]Nm]Mn]Kn\Hn\Hm[GlYHlYHmXGmXGnWInWIqVKqVKrWLrWLrWNsXOpXNnXMlVIkUHkSGkSGnTGnTGpVGqWHsWItXJvYIuXHtWGsVFoSEoSEnRFnRFmQEkQDkPEjODdLBdLBaK@_I>]F>[DYIXE>XE>WD=VC"1@!1A"2A"1B#2C#2D$1D$1G%3G&1I%1H$0H$.G#-G#-F",F%0D$/D%-D%-E$-F%.H'.H'.L)/L)/M(/M(/M)-M)-O(-O(-N*.M)-M)-L(,O(-P).S*0T+1T+1T+1V+2V+2Y,3Y,3Z-4Z-4Z-2Z-2Z-2[.3[.3\/4\/4\/4_27_27_27_27a49c6;f9>g:=f:;i=?ELH،@ϊ=ɉ?†>@=::>@BBGHG~E|C|C|E|EIIJJKKNNRRP|MyLwJtLsKrKrKpNoMnNmMlLlLnQmPlOkNkOkOlPmQoSqUrWtYv[w\v\u[u^v_xaybwau_s]q[r\r\r]r]s^t_t`sbqcpar^u]xZ{\~]_bc€făgƃfƄdƄbȄ_ȅZDžUʆWΊYב`ܖcffԌZҊXχWʄSŁRO|O}OwHvGxJzMQUVUTTVWYZ[_^][[YYWWXXUTRSTUXWVU|QxOtKqKlGoLoOnNjLeGcGbG}ZGyXGuVDqTBoTAmWBmXClZDn^Gn^Gn^Gn^Gn\FlZDkYCjXBlZFkZHlYHnYHnWIlUGlREkQDhMBgLAfKBcKAbLAaMBbNEcODgQDiQEkSGmUInXKnXKnXKnXKkXJkXJkYKlZLm[Mn\Nm]Nn^Np]Lo]Io]In\HmZIlYHmXGmXGmVHmVHnVJnVJqVKoWKrWNpXNmWLlVKlVIkUHlTHmUIpVIqWJpVGqWHtXJuYKvYIvYIuXHuXHpUBpUBpUDpUDpUDpUDoUFoUFjPCgPBfOAcM?`J=^H;]G:\F;]F@[C?ZB@X@WD=VCsAx@ۆEGIݎCӉ>Ή>LJ?<<@CBDGJG~E|C|C|C|CHHIIJJKNQQ~O|MyLvIsKrJsLsLqOpNoOnNmMmMoRnQmPlOkOkOlPmQoSqUrWuZv[w\w]v\u^v_xaybwau_r\pZt^t^s^s^s^t_s_s_tcsau_w]x]|]~`bcd€hĂhƃhȃdȃbȃ\˄V̆RЊV֐\ݖbߘdܖbؒ^̆SɆRȄSŃSÀSQ}Q}NvEzHORTTTTTTWY[\]__^\\ZZYZ[ZWUTVWYXXWUS{QxPvPnIqNqQoOiKdFbFaF}ZGyXGuVDqTBpUBnXCp[Fo]Go_Hp`Iq_Iq_Ir]HoZEmXClWBkYElZFnYFnYFnWGnTEmQElPDjNBhNAgLAdL@cMBbNCcODdPEjTGlUGmVHoXJoYKoYKoYKnXJn[Ln[Lm\Lm\Ln]Mn]Mm]Mm]Mp]Lp^Jo]Im[GlYHkXGlWFlWFkUGkUGlVIlVInVJmWJoWMnXMkUJiUJkUHkUHlVInXKqZLr[MpVGqWHsYJtZKv[Jv[JuZIuZGtXCuYDuYDuYDtYFuZGuZItZIoUDlUCkTDiRBgPBeN@bL>aK>`G@_FA]D@YBWD=VC7O<5N;4M:3M:3M:3M:4K63K65J54I43H32G21F10F10#.#.%-%-%-%-&+&+&'&'&'&''%'%'%'%*(*(*(*(*(*(+(+(,','-'.(.(/)/)0*1+1+1+1+1+1+1+1+3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-2 ,2 ,2 ,1+1+0*0*0*0//./..-*+)*),'+&+$*$,#+#+"* * *",",",",",",",",!+!+ * *))((".". . . . ...-,*('''((((((((())((''&&&&&&&&&&&''('& $ !#!"#$%%%&&%%%%$$******** + + + + + + + + / / / / / / / /"1!0 / /!0"1#2$1&2&0&0&0&0&0&0&0$.$.%/%/&0&0'1)1*/+/././/0/01/1/6!06!07"17"19#09#0:$1;#1@!0A!0B"1B"1D"0D"0E#1E$/J&2J&2J$/J$/I#.I#.J"+H#+J&0G&/F%.E$+F%,H'.L)0M*0M(/M)-O(-O(-O(-O(+O(+O(+P).O(-O(-N',P'-Q(.S*0T+1U*1U*1X+2X+2Y,3Y,3[,4[,2[.1\/2\/2]03]03^14^14^14_25_25_25_25a47c69f9\@`>euB{@ߊIHHًAч>͉@Ƈ@=@???BEDFIJI~E{E|C|E|EHHHIIJJKQQ~O{LyLvIsKrJtMtMrPqOpPoOnNmMoRoRmPlOkOkOlPmQoSqUrWuZw\x]w]w]t]v_xaybwau_q[oYu_u_t_t_s^s^r^r^udvcv`y^z^}_ad}df€hłhɄgȃdɃaʂZΆTшQ֍Vܕ_dߘdؒ^ҌXłNĂNĂPĂRSQ~O}NuB}GPUURSSSSUWY[^ž`ž`__][[Y[^[XUUUYZUTTTTR{QyQoIrMtQpPiKcEaE`EzZEwXFsVDpUBoVBpZEr]Hr`Jp`Ip`Ir`Jr`Jr]Hp[FnXCmWBmXEkYEnYFmXEoUFmSDmQEkOCjNBjNBhMBeMAeMCeODdPEdQCmVHnWIoXJpYKoYKoYKnXJmWIp]Np]No^Nn]Mn]Mn]Mm]Mn]Kp^Jo]In\Hm[GlYHjWFkVEkVEjTFkUGkUHkUHlVIjWImWLkWLhTIhTIjTGkUHlVIoYLr[Ms\NoUFpVGrXItZKv[Jv[JuZIuZGw[Ex\Dx\Fy]Gy]Gy^Iy^Iz_JsZDrYEqXDmVDkTBiR@fQ>eOAaI?`G@^E@[B;XA;XA9XA9VB9VB9UA8TB8TB8UC9UD:VE;VE;YF?YF?XE>WD=VC7O<5M:3L92M:3N;4O<6L74L76K65J54I43H32G21G21!,!,$,$,%-%-',',()()()())')')')')')')')')')'*'*'.).).(.(.(0*1+2 ,1+1+1+1+1+1+1+1+0*1+1+2 ,3!-4".4".5#/4".3!-2 ,1+1+2 ,3!-4".5#/5#/4".3!-2 ,1+0*0*-,+,*+*+)*)*'+'+%*$*$,!+!+ * * *!+!+ * *))((&&&&&&&& , ,,,,,,,***))(('(((((((())((''&&((((((((&&&&&&&$$###$%%%'''''''' + + + + + + + + + + + + + + + +!0"1"1#2#2$3$3$3#2#2#2#2#2#2#2#0#/#-#-$.$.%/%/%/",#-&0'1(2'1&0'/).*.,--.-..//-0.4.5 /5 /6!07!.8"/8"/9!/B#2C#2C#0D$1E#1F$2F%0F%0H$0H$.I#.I#.I$,I$,K#,I$,I&-G&-I&-J'.J'.K(.L'.L'.P(0P).P).P),Q(,Q(,Q(,Q)*P'+P'+P'+Q(,Q(,R)-S)-S)-X+0X+0X)/X)/X)/Z+1[,2\-3\.1]/1]/1^02^02_13_13_13`24`24`24`24b46d68g9;h:|FЀC݊Fۇ?Ԅ=ф>ΈBʊCŋBBCC@?@BCFH~H}H{EyDyCzD{D}E~FGIIIHIN~N|LyIwIwIuLvMxPxPvSuRtSsRrQrQqTpSpSoRnRmQmQmQoSqUrWuZw\x]w]w]ybybxaw`u_u_t^t^s]t^s^s^t_u`t`t`vexdyb{`|`}_~a}afgeāfǂcʃc̈́aφ[ӊUܑW`bߖ_֏YωŬRȅQƄPŃQƒPQ‚RÃSÄQćPÈNŠQ‹STUVUTUY\_Ý_Ğ`à`ġa `_][[YZ_]\[\\ZWWSOPRTS}SySvRtQqQoPjKaE|]AxYDuYDuYDtYDt[Es]Ft`HsaIvdLvdLweMvdLwcKv`Iv]Gr\Er]Hp^Hq\IoZGqWFpVEpTFoSEpTHkOCeK>bK=eMAgQDeRDdQClUGmVFoXHqZJp[Jp[Jp[Jp[Jq^Mq^Mp_Mp_Mp_Mp_Mo`Mp_MsaMs^Kq\IoZGlYHlYHmZImZIkXIkXIjWIjWIiVHhVHhTIhTIhTIhTIiVHiVHlVIlVImWImWIr[Kt]Mx^Oy_Py_Nx^Mx]Lw\IsWAvX>y[Cy]E{_G{_Iz`Iz`Iz`Ix_Iv]GsZFnXClVAjT?iRBiNCgLCaHA]E;ZA:WA6U?4U?4ZF=YEFӃDֆAӃ<π;́=ʅBȉDÊECDEECDDEGJ}J{HyFxExCxEyCzD|D~EFGGF~FN}M{KyIxJwIvMvMyQyQwTvSuTtSsRrQqTqTpSpSnRnRmQmQpTqUrWuZw\x]w]w]xaxaw`v_u_t^s]s]t^t^s^t_t_u`t`uavexdyb{`}``a~bgeeƁdɂb̆bҋaԌ\ޑY[`a\֍VψRʄPʇSȆRDžSDžSDžSȆTʈVɊUȊQNjOnjRōTŽUVUVUUY[]Ý^Ğ_Ğ_Ţbáaßa_^\]\]\YX[[YVVRPORSS~RzRwQsNqNnMhI`D{\@xYDtYDtYDsZDr\Er^Fr`HsaIucKvdLvdLxdLxbKwaJw^Ht^Gr]Hp^Hq\IpYGqWFpVEpTFpTFoSGkOCgK?dJ=eMAfPCfPCfPBlUEmVFoXHqZJq\Kr]Lq\Kq\Kq^Mq^Mp_Mp_Mp_Mp_Mo`Mp_MsaMt_Lq\IoZGlYHlYHmZIn[JkXIjWHjWIhVHhVHgUGgUIgUIgUIhTIhUGiVHkUHlVIlVHmWIpYIr[Kv\Mw]Nx^Mx^Mx]Lw\IxZBy[A{]C}_E|`H|`H|`Hz`Gy_Hx^Gu\FsZDqXBmW@lVAkTBlREiNCdLB_G=\D:YA7X@6V@5[Dw[Cu[DtZCs[Cr\Dr^Eq`FraGtcIudJxdKxdKycKzbJz`Ix_Is]Hq\Gr\Gq[FrYErWDrUErUEpSElPBhL@fL?eN@eOAfPBeOAkTDlUEoXHqZJr]Ls^Mt_Nt_Nq^Mq^Mp_Mp_Mp_Mp_Mo`Mp_MsaMt_Lr]Jq\In[JmZImZIn[JiXHiXHiWIgWHgWHfVGfVIeUHfTHgUIgUGhVHiVHjWIlVHlVHlWFnYHpYIr[Kv\Kw]Lw]Lw\I|^F~_C~`DaEaG}bG|aF{`Ew]Dw]Dv\Et\DrZBqYApWApWCpVGnTGjODeJ?aF;\D8ZB6XB5[E:ZD9VB9T@7S?6S?6T@9T@9M:4N;5N;7M:4L95J71H51G4.J73K82K84L93M:6N;5O<8O<6P84O73N62M51L40K3/J2.J2. + +"*#+$,$,%*&+()()()())')')')')')')')')')'*'*'.).).(.(.(0*1+2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,3!-3!-3!-3!-4".3!-2 ,1+1+2 ,3!-4".4".4".3!-2 ,1+0*/).)*+)*(*(*')&(%*%*"*"*",!+ +*** *)))('''%%%%%%%%++++++++)))((''&(((((((())((''&&(((((((('''''''%'%%&&'''(((((((( + + + + + + + + + + + + + + + + /!0!0"1"1#2#2#2"1"1"1"1"1"1"1"/#/#-#-$.$.%/%/%/$.$.%/&0&0&0'1(0*/+/-.././/00.1/3-4.4.5 /6 -7!.7!.8 -@$0@$0C%1C%/D&0D&0E'/F'/D%-E$+E$+E$+G$*G$*G$*G$*I&-I&-I&,J'-K&-L'.N',N',P),P),Q(,Q(,R(*R(*R(*R(*P()P()Q')R(*R(*S)+U(+U(+X*-X*-W),W),Y(,[*.\+/],/],/^..^.._//_//`00`00`00c33c33c33d44f66h88j::l<:l<8o@8rC9sE6tF6wJ5}O8R;S9Y=^>a9j9xAւDׄB{7y5w7y:}@BBCBE{GxGvGvGxFyGwIvItGsErDrDtEtCxFyE{F}F}F}F|E}G~L}L|K{JzK{L{Q{Q|S{RzVxTwUvTvTuSsVsVrUrUpTpToSoSqUrVsXuZv[w\v\u[u^u^t]t]s]s]s]s]v`v`u`vavawbvbvbwexdzc~bbcdegăeĂbɃ_ъ`ؒadddbc`[َW҉TψT̆S̆S͇TωUӌX֏Yْ\۔\֕UՕUԗXӗYϗZ̖ZǕZÕZė\˜\Ù]ě]Ŝ^Ŝ\Ŝ\ĝ\ßa a c aßaßaßaßa\[YX›Zě[XUWUPPTTTS|PxPqKlGiHeD~_@y\>x\Dv^Fu]Er\Dq]Dr^Eq`FraGsbHtcIwcJycK|dL{cK{aJzbJs]Fq\Gr\GsZFsXEsXEsVFsVFpSEnQCkMBiMAgM@fOAfOAeOAjSClUEoXHr[Ks^Mu`OvaPvaPq^Mq^Mp_Mp_Mp_Mp_Mo`Mp_MsaMt_Ls^Kr]Jo\Kn[JmZIl[IiXHgWGgWHgWHfVGcVFcUHcUHeUHfTHfTFgUGiVHiVHkUGlVHjUDkVEnWGpYItZIu[Jv\Kx]HbJbFcGcGcIaG|aF{`Ew[Cv\Cv\Eu[Dt\Ds[CsZDsZFtZKrXKnTGiOBeJ?bG<^F:]E9[E:ZD9XA9UA8T@7T@7UA:U@;N;7N:9N:9M98K76H43F21D0/G32H43I54K76L87N:9O;:Q<9N62N62M51L40K3/J2.I1-I1-* +"*"*#+$,%*%*()()()())')')')')')')')')')'*'*'.).).(.(.(0*1+2 ,3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-3!-2 ,2 ,2 ,2 ,4".3!-2 ,1+1+2 ,3!-4".3!-3!-2 ,1+0*/).(-()*(*(*')%(%(%*$)"*"*!, + +***)))('''&%%%%%%%%********)((''&&&(((((((())((''&&(((((((((((((((&(&&''((((((((((( + + + + + + + + + + + + + + + + / / /!0!0"1"1#2!0!0!0!0!0!0!0!.#/#-#-$.$.%/%/%/%/$.%/%/%/&0'1)1*/,0.//0/0011/1/3-3-3-4.5,6 -6 -8 ->$/>$-?$-@%.A&/A&-A&-D&.C&+D%+D%+D%*E%*E%*E%(G$(I&,J%,J%,K&-K'+L(,N',N',Q(,Q(,R(*R(*R(*R(*R()R()Q')Q')Q')R(*T'*U(+U(+U(+X*-W),X'+X'+Y(,Z)-\).]+.],/]--]--^..^.._//_//`00c33c33c33c33e55g77j::k;9m<7p@6rD7sE5rG4wJ5}O8R;V<\>`>d}?y>wBtDqEoDoDqDrEpFoEnDnDnDpCqDsDyJ{I|J~IJJ~I~H}K|K{J{J{L|M}S}S}T|S{WzVyWwUwUvTtWtWsVsVqUqUpTpTrVsWtYuZv[v[u[u[t]t]t]t]s]s]t^t^wawavawbwbxcwcwcyfze|eefdffÆgƅeDžb͈_֐_ߘbfgdbb_\ܑZ׎YӌX̅Q͆R·SшS׋WېYߒZ[ߚYޛWۜYٜ[՛\Қ]͙]ʘ]ʜ`Ȝ_Ȝ_Ȝ_Ȝ_Ȝ]Ȝ]Ɲ]_acbž`ž`ş`ş`ĝ\ÜYěYƝ[ɡ\ˠ\ȝXŚV–WVSRTUUU}QxNpJkFgFdCaB{^@z`Gx`Hw_Gt^Fs_Fs_FraGsbHtcIudJxdKzdL|dL}cL}aK{aJt[Er\Et[EsZDtYFuXFvVGvVGsSDpSCoRDlPBiOBfOAgPBgPBlUEmVDpYGs\Ju`MvaNwbOwbOq_Kq_Kp_Kp_Kp_Kp_Ko`Kp_Ks^Kt]Ks^Kr]Jo\Kn[Jl[IkZHhWGgWGgWHdWGcVFbVFbVHbTGdTGeUHfTFfTFgUGhVHiVGiVGjUDjUDkVEmXGpYGr[Is\Jv]GcKcGdHcGbHaG}_Gz^Fw[Cw[Cv\Ev\Ev[Fv[Fu\Fu\Hx]LuYKrVHmQChNAeK>bJ>aI=]E;[E:YB:W@8T@9T@9UA:U@;P<;O;%+?$+@%,@%,B%*B%*C$)C$)C$)C$)C%'D$'I&,J%,J%,K&-K'+L(,N',N'*Q(,Q(,R(*R(*R(*R(*R()R()Q')Q')Q')R(*T'*U(+U(+U(+W),W),X'+X'+X'+Y(,\).]+.\,,]--]--]--^.._//_//_//a11a11a11b22d44f66h88j:8m<7p@6rD7sE5rG4uK5}O8R;W=]?b@f=p?}CفAӀ:x4v5s6r9t^F<[DO;=L8:I57E13B.0@,.B.0B.0D02E13G35I57K79L68K31L3/K2.J1-I0,H/+G.*F-))*!)"*"*#+$)$)()()()())')')')')')')')')')'*'*'.).).(.(.(0*1+2 ,4".4".4".4".4".4".4".4".4".4".4".3!-2 ,1+1+1+4".3!-2 ,1+1+2 ,3!-4".3!-2 ,1+0*/).(-','()')')&(%($'")!("*"*!, ++***(((''&&%$$$$$$$$))))))))('''&&%%(((((((())((''&&(((((((()))))))') ( (!)!)"*"*"*!)!)!)!)!)!)!)) + + + + + + + + + + + + + + + +.. / /!0!0!0"1 / / / / / / / -#/#-#-$.$.%/%/%/&0%/$.$.$.&0'1+3+0-1/0/001012 02 02,2,3-3-5,5,5,6 ,8!+8!)9"*9"*:#)<#)=$(=$(@%*@%*B%)B%)B%'B%'B%'C%'I&,J%,J&*K'+M&+N',N'*N'*Q(,Q)*R(*R(*R()R()T()T()Q'(Q'(Q'(R()T()U)*V(*V(*W)+V(*W&)W&)Y'*Z(+\*-]+.]+,]+,^,-^,-_-._-._-.`./a/0a/0a/0b01c12f45h67i76m<5p@6rD7sE5rG4uK5}O8R;U;\>a>h=tAՁE݄BՂ<|7y9s8r:qYB:W@:U>8R>7R=8N:;N9>L7).<',@+0A,1B-2C.3E05F16G27I35J20J1,J1,I0+G.)F-(F-(E,')))!)"*"*#+$)&+(+(+(+()))))))*)*'*)*'*'*'*'*'.).)-(-(-(/*0 +1!,4".4".4".4".4".4".4".4".5#/4".4".3!-2 .1+1-0*4".3",4 ,1+1+2 ,3!-4".2 ,2 ,1+0*/).(-),)')&)&(%($'$'!(!("*"*!* ) +(**((''&&%%$&&&&&&&))))))))(''&&%%%(((((((())((''&&(((((((()''''''' ( ( (!)"*"*"*#+!)!)!)!)!)!)!)!)!+ + + + + + + + + + + + + + + +,.. / /!0!0"1 / / / / / / / /"/"-#/$.$.%/%/%/&0%/$.#-$.%/*2+ 1+0-1/001011 22 02 02.2,2,3-4+5,5,6 ,7 *7 (8!)8!)9"(9"(<#)<#'?&,@%*@%*@%*@&)@&)@&)B%)G',J%,J&*K'+K'+N',N',N'*Q(,Q(,Q(,R(,R(*R(*R(*R(*Q')Q'(Q')R()T'*U)*U(+U)*W),V(*U'*U')X'+Y(+Z)-[*-\+.\+.\+.],/],/^-0^-0_//_//_//_//`00a11d44f66g75m<7p@6rD7sE6rG6wJ5}O8S9S7Z9a;j;xAՅH܉EՆA;z=u;q:qb>d@iCnHrLuLuIvJxIyJzKzJyJxIzKzKzK{L}PRWXVV~W}X|W{VzUyWvXvXvYuXtXsWsWrVtXtXuZv[v[uZsYs[v^u^v_u_v`vcwdwdxexcxcydzezczczfyf{h}ffhg‡gƇdʊfόb֏cݖbcdefgeb^_[ۋVԇQڏXڏVܐVޒXY[\\^^`^ߢ_۠^՞^ў]Ӡaџ`Ξ`͝_Ξ`ϟaѡaϣdˣhȤjȤjɢgɢgȢdȢcȢaƟ\Ǡ[ʢ\ѧ]ի_֪_ӨZϣXȘVĔVSPQTRS}PwMnHjDiGiJjJjLgLgK|gJzeHxdIxdIyeJyeJ{gL{gL|gL~fL~dK|`H|^Fy]Gt\Dr\Et[Et[Ev[Fw[FyZHyZHwXFyZHy\LvYIpUDmRAlRCnTCr\Gs]Fu_Hv`IvbJvaLvaLu`Kq_Iq_Ip`Ip_Kp_Kp_Ko`Kp_KnYHoZIp[Jp[JmZIkXGgVFeTDgVFfVFeUFeUFbUEbUE`TFaSFaSFcSFdTEdTEfTFfTFhUFhUFn[JoZImXGmVFnWEoXFsYHuZGy[C{[B|\C}]D}]D|\Ez\DyZE|`J|`Jz`Iy^Ix]Hw\Gv[Hv[Hu[JtZKqWHoUFkTFkTFkTFkSGdLBaK@^G?ZC;V?9T=7Q=6P;6M79K79I57F24C/1>*,:&(8$&?+-@+0A,1B-2C.3C04E05E13I11I1/H0.G/-F.,E-)D,(D,(*******!)#+$+$+$+$+&+&+'+,+,),+-*-*.+.+.++(+(,(,(- )- ).!*.!*3",5!,5!,5!,5!,5!,5!-5!-5 /5 /5 /5 /5 15 /5 15 /4 +4 )5+4 +5!,5!,5!-5!-2 ,2 ,0 -0 -/,/,/.,-(+%,%*")")#*%,&-")")")!(!)' ( ('&&%'&&&')))))**&''()**+''&&%%% $&&&&&&&&$$%&&'((&&''&&&''%%%%%## &!&"'"'#(#($)$)%*$)#(!&!&!&"'!'' ( (!)!)"*"*"*!)!) ( (''&(+-,,,. /!0 / / / / / / / / /-!0!."/"/$0$0$.$.'-'-(.(.*/*/+/+/.0.0/0/0111/2.2.2,3-4-5.5,5+3&3$4%5&5&6'7 (7 &5&:!'<#)<#);"(;"(=$*@%*E&,I&,I&,J'-J'-L'.L'.L(,P).P).P).Q(.Q(.Q(.Q(.R'.P&*P&(P&*P&(P&*P&(P&*P&(P#(Q$'R%*S&)U(-V),W*/W*/U+/V,0V,.W-/X.0Y/1Z02[12W-.W-.Y/0Z01\31]42_64a52k;7m>8o@8pA7rD5vI6}O8S8[:`8d6m7{?ΉHЊDȃ>|>y?u=sb>b>c?eAhDkFmGsLvOyRyRxPvLwOyQxOyOyOyOzP|R~UVWWV~X}W|V{U{UxWxWxZxZwYvXuWtVvZuYsZrYrYsZs[t\y`yawcvcudugugugyjygyeydzc|c}e~g}j|l~jihÈjˋhэf҉`׊\ݏ^cikigmi`XRߊQRߍQVUUWY[[^_ac_۠\מ[֟\ԡ_פcӢ`͝]ǚYǙ[ɝ^͡bФe˟b̠c΢eͤfͣgˣfȢdǡcʤe˦bΧbЪaЩ^ЦZΥV͡VП]̙ZƔWTUSRQUwOmGiEkKnPnPkMjK|gHydEydE{fI}hK|gJ{fI}eK}eK~dK}cJ}aK{_I{\Gx\FqW@rZBt\Dv^Fx^Gw]Fw[FvZEz^I|`K`L}^JyZFvWCvWCuYCt\@s^?u`CxcFxeGyeJwfJwfLtcItbJrbIqaJo`Im^Gm^Im\JlYJlYJlYJkXIkXIkXIkXJjWIbOA`N@_M?^L>^L>^L>_M?_O@]M@\NA^QA`SCdTEgUGjWHkXImXGmXGmVFpVGrXGu[Jy^M{`M}^I~^G}]F|\EzZCyYDwXCvWCw[Fw[Fx]Hx]Jx]Jx]Jv[Ju[JpYKnXJlVHjTFgQDeOBcM@bLA`J?\H?ZF?XD=UA:R>7P;6N94M85L76J54G21D.0A+->*+=)*<**<)+=*,=*,>+-<,-?,0?,0@+2A*2A*0A*0A+.A+-A+-A+-********#,#,$,$,$,$,&,'+,--+-+.,-*.+.+.++(,),(- ),!)-"*-"(.!(3",5!,5!,5!,5!,5!,5!-5!-5 /5 /5 15 15 15 15 15 /5+5 )5 )5 )5!,5!,5!-5!-1+1+0 -/,.-.-,-*,',$+#*#*#*#*$+%,")")")!(!( ' ' ('''&('''))****,,'''()***((''&&%%&&&&&&&&%%&&&&''%%&&%%&&%%####"" &!&"'"'#(#($)$)%*$)#(!&!&!&"'!'!' ( ( (!)!)"*"*!)!) ( (''&(+-,,,- /!0 / / / / / / / ///00"/"/$0$0$.$.'-'-).).*.*.+/+/.0.0/0/0111/2.2.2,3-4-5.5,5+3&3$4%5&5&6'7 (7 (6'8!):#+:#+8!)8!):#+?&,E&,F&+I&,I&,J'-J'-L'.L'.M%-M%-M%-M%-N%-N%-N%-N%+P%,P&*P&*P&*P&*P&*P&*P&*O%)P&*P&*Q'+R(,S)-T*.T*.T+1T+1U,0V-1W.2X/3Y12Y12V..V..X00Y11[31\42^64_62h;8l<8o@:pA9qC6vH8~N8S8X5]3b1j2x;ƇDʇAs:p:n;k:e6a5^5]6Y5~X4~X4}[6~^8`:b>b>b>c?eAgCkFlGpJsMvPvPtNsMtNvOxPyPyPyPzQ|S~UVWWVV~U}T}T{UzW{Z{Z|[z\y[wYvXvZvZsZsZsZsZt^u\zazawawdtfugshuixjxizgzdzc|c}e~g|j|l}jggņg͉dӌb։[ۋZ\bkmigje^XTRUUTTUUXXZ]abc_ۢ]֠Zנ]֤_إcԥaР^˞]ʞ_̠aͤdѥfΡ`ϢaТdФeͤfˣfȡfƠb˥fͧfϪfѫdҫ`Ҩ\ЧXҤYҟ^͙]ǓWUUTTSSwNmGiGlKnOmQlM~iJ{gFydEydE}fGhI~fJ}eI~dK~dKcKcK}aK{_I{\Gw[EqW@qYAs[Ct\Dv\Ev\Ew[Ew[E|`J~bLbMaL}]HzZEzZEz\Dw`AvbAwcBxdCwdDwdFtcEsbFsbHr`Hp`Go_Hl]Fk\Gj[FiZGkXIkXJjWIiVHiVHhUGgTFgTFaN@`M?_L>^K=^K=_L>`M?_M?\L?[M@]P@`SCdTEgWHkXIlYJnYHmXGpVGqWHtYHw\Ky^M|_M}^I~^G}]F|\EzZEyYDwXDwXDtXCuYDuZGv[Hv[JuZItYHrXInXJkXJiVHgTFdPEbNC`LA`LA\H?[G>YE>WC7P;6O:5O75N64J52G2/E0/C.-@,+?+*=++=++=*,=*,;+,;+,;+.;*0<'0<&2<'0<'.<'.<',<(*<(*********#,#,$,$,$,$,&,'+*-,+,+-,-*.+.+.+,),),(- )- ).!*.!(1")5!*6!*6 ,6 ,6 ,6 ,6 -6 -6/6/6/6/6161616/6 ,6!*6 ,6 ,4 +4 +4 ,4 ,0,/+.+.+-,,+*+)+$)#+$,$,$,$,#+"*"*"*"*!)!) ( ( ( ( ((')((())****,,''(())**))((''&&&&&&&&&&''&&&&%%$$%%$$%%%%####"" &!&"'"'#(#($)$)%*$)#(!&!&!&"'!'!''' (!)!)!)"*!)!) ( (''&(+,++,-. / / / / / / / / ///!0!0"/"/$0$0&.&.'-'-).).*.*.+/+/././/0/01/1/2.2,2,3-4+5,5,5+4'4%4%5&5&6'6'6'6'8!):#+:#+8!)7 (9"*>%+D%+E%*F&+F&+I&,I&,J'-J'-I$+I$+K#+K#+K#+K#+L#+L#)P%,P&*P&*P&*P&*P&*P&*P&*Q'+Q'+Q'+Q'+Q'+R(,R(,R(,T+/T+/U,0V-1W.2X/3Y12Y12V..V..X0.Y1/[31\42^64_62h;8l<8n?9o@6qC6uG7~N8S8T3Z2`1f0s8@ł>|:t9q9n5k5j7g6b5^2]4\5Y5Y4Y5}[6~^7`9b>b>b>c?d@fBjEkFmGpJsMtNrLqKrLuNxPxOxOxOzQ{R}T~UWWVV~U~U~U}W}Z}\~]~]}]{[z\y[w[w[u\t[t[u\u]v]{`{`xbxcvewfvhvhyjyizgzd{c|c~e~g{i|j}hhfņëcӊaՈZ܌[_emmhedc^XWWZZXWXY\\]^bed`ۢ]ס[٢_ئa٦dզbԤbУ`ϣbϣbΥeѥfҥdҥdѥfΥeͤfʢdǡcƠb̦gΨgѪgӭfԬdԪ^ӨZԦ[Ӡ_Κ^ȔZVXWVW|RtNlFhFjIlMlPkL~iJ{gFxcDxcD}fG~gH~fJ|dHeLeLcKcK}aK{_Iz[Fw[EqW@pX@qW@rXAsYBu[Dw[Ex\F`KcNePdOaL~^I~^I~`H{dEydEydEydEwdFubDs_Dr^EraGq_Go_Hm\HkZFjYGgXEfWDkXIjWIiVHhUGgTFeRDdQCdQC_L>_L>^K=]J<]J<^K=_L>_M?[K>[M@]P@_RBeUFgWHkXImZKnYHnYHrXIrXIuZIw\Ky^M{^L}^I}]F|\G{[FyZExYDxYEwXDrUCrUCsXEsXEsXGsXGpVEnWGlVHiVHhUGfSEcODaMB`LA_K@ZF=YE+-=*,:*+9)*9),8'-8#,8".8#,8#*8#*8#(8$&8$&))))))))#,#,$,$,$,$,&,'+*-,+,+-,-*.+.+.+,)- *- )- ).!*/"+/")1")6"+7"+7!-7!-7!-7!-7!.7!.7 07 07 07 07 27 27 27 06 ,6!*6 ,6 ,4 +4 +4 ,4 ,.*.*-*,),++*)*(,#)"*$,%-%-$,"*!)"*"*"*!)!) ( ( (!)!))(*))())****,,(((())))*)))((''&&&&&&&&(('&&%$$#$$$##$$%%####"" &!&"'"'#(#($)$)%*$)#(!&!&!&"'!' &'' ( (!)!)!)!)!) ( (''&(*,+++-. / / / / / / / / ///!0!0"/"/$0$.&.&.'-'-).).*.*.+/+/././/0/01/1/2,2,2,3-4+5,5,5+5(5&5&5&5&5&5&5&6'8!):#+9"*7 (6'8!)<#)C$*D$)E%*E%*H%+H%+I&,I&,I$+I$+K#+K#+K#+K#+L#+L#)O$+O%)O%)O%)O%)O%)O%)O%)Q'+Q'+Q'+Q'+Q'+P&*P&*P&*S*.S*.T+/U,0V-1W/0X01Y12V..V..X0.Y1/[31\42^64_62g:5l=7n?9o@6pB5uG7|N7S7T3Z2`1f0q6}=;z8s8p9k5i3i5f5b5^2]6\5Z6Z5~Z6]7_8a:c>b>b>b>d@gBiDjElFoIsMsMrLqKrLuNwOxOxOxOyP{R}T~UWWVVVVV~X}Z}\~]~]}]{[z\y[y]x\v]u\u\v]v^w]|`|`zaydxdxgwiwizjzi{g{f|e}d~f~g|h|g~hgeƆc͈aш]ԆX܌[agnmhgca]ZZ[^^][]\^_`aeed`ܣ^آ\٤`ڨc֥b֧cեcӦcҦeѥdΥeΥcթhԨgѨhΧf̤fȢcƠaş`˥fͦeЩfӫeիcթ`է\ե]ӡb͛`ƓZXYYXZxNrLjGhFhJkMjOkL~iJ{gFydEydE}fGhI~fJ}eIeLeLdLcK}aKz^Hz[FvZDqW@oW?pV?pV?qW@tZCx\Fz^H}^IbMePePbM`K_JaI|bGydEydEydGxcFuaFs_Fq]EsaIr`Jp^Jn]IkZHiXFgXEgVFlYKlYKjWIhUGgTFeRDcPBcPB]J<]J<\I;[H:\I;]J<^K=^L>[K>ZL?\O?_RBeUFhXIlYJmZKoZIoZIsYJtZKv[Jw\Kx]Lz]K{\G|\E{[FzZEyZExYDxYEuYDrUCrUCrWDsXEsXGrWFpVEnWGjTFhUGfSEeRDcODaMB`LA_K@YE9R=8M53M53J52I41G21F10D0/C/.A//@..?,.=*,9)*8()7'*6%+6"+7!-7"+7")7")7"'7#%7#%))))))))#,#,$,$,$,$,&,'+*-,+,+-,-*.+.+.+/*/*/)0 *1!+1!+1")3"*6"+7"+7"+7"+7!-7!-7!-7!-7!.7!.7 07 07 07 07 27 07!.7!-7!-6 ,4 ,3+3+3+.*.*,+,++*+*(+'+"(!)#+$,$,#+!) ("*"*"*!)!) ( ( (!)!))(*))())****,,))))((((*)))((''&&&&&&&&(('&&%$$#$$$##$$%%####"" &!&"'"'#(#($)$)%*$)#(!&!&!&"'!' &&&'' ( (!)!)!) ( (''&(*)(()*+, - - - - - - - - / /!.!.#/#/$.$.&.&,(-(-)-)-+.+.+.+.././/./.1/1/2,2,2*3+4+5,5+5+5(5&5&5&5&5&5&5&6'8!):#+9"*6'5&7 (;"(A$)B#(D$)D$)E%*E%*H%+H%+J%,J%,J%,J%,L$,L$,L$,M$*O$+O%)O%)O%)O%)O%)O%)O%)Q'+Q'+Q'+P&*P&*P&*P&*P&*R)-S*.T+/U,0V./W/0X01X00V..V..X0.Y1/[4/\50^72_62f;5i<6k>8l@5pB5tF6|N7S7U4\4c5h3q8|>~c=c=c=d>f@gAiBlEpItLuMtLtLuMwOwOwNwNwNxOzQ|S}TVVWWWWWY{X|Y}Z}Z{[zZy[xZ{^z]x]w\w^x_x`y_~_}_{azcyezfyhyhzj{i|g|f}e~dfg}f}efeÄcʆaχ_҈[ՄU݋Yaglkigba^[ZZ]_a_``a`bdegeߦaۢ_ء^ڥaܪe֥b֧c֦dԧdӨdҧcФcͤb֭kӬgѪgͨd˥dǤbŢ`Ơ_ɣbˤaϧbӨcרbק_֦\ԣ^ԢeΛbŒ[WVWXXtMpJkHiGhJjLiNkLjK|hGzfEzfE~gHiJhI~gHfKfKdLcK}aIz^FyZEuYCpV=pV=oUuYAx\Dz^Fz\D~`HcLeNcL`I_IaI{aFzbF{cGydIxcHv`Ht`Gs_Gu`Kr`Lq_Ko\Kl[KkZJiXHiWImZLlYKkXJiVHgTFeRDdQCcPB[H:ZG9ZG9ZG9ZG9\I;]J<]K=\L?[M@]P@`SCdTEgWHkXIlYJnYHoZIsYJtZKv[Jw\Kw\Kx[IxYEyYDxYDxYDwXDwXDuXFuXFsVDsXEtYHtYHsYJsYJrXIoXHiSEgTFfSEdQCcODbNCaMB`LAZF=ZF=YE>WC9O75N64K63J52H32G21E10E10A//@..?,.=*,9)*7'(5%(4#)7#,7#.7#,7$*7$*7$(7$&7$&((((((((#,#,$,$,$,$,&,'+*-*+,+-,-*.+.+.+/*0 +0 *1!+1!+2",2#*3"*8#,8#,8#,8#,8".8".8".8".8"/8"/8!18!18!18!18!38!18"/8".7!-6 ,4 ,3+2*2*.*.*,+,++*+*),'+#)!)"*#+#+"*!)!)"*"*"*!)!) ( ( ( ( ((')((())****,,**))((''))((''&&&&&&&&&&''&&&&%%$$%%$$%%%%####"" &!&"'"'#(#($)$)%*$)#(!&!&!&"'!'%&&&' ( ( (!)!) ( (''&&))((()+, - - - - - - - - / -!.!.#/#-$.$,&,&,(-(,)-)-+.+.+.+.././/./.1/1-2,2,2*3+4+5,5+5 )6)6'6'5&5&4%4%4%7 (9"*:#+9"*6'4%6':!'@#(A"'C#(C#(D$)D$)G$*G$*J%,J%,J%,J%,L$,L$,L$,L%*M$*N$(N$(N$(N$(N$(N$(N$(O%)O%)O%)P&*P&*P&*P&*P&*R)-R)-S*.T,-U-.V./W//W//V..V.,X0.Y1/[4/\50^72_60e:4h;5k?6l@5oA4tF6{M6S6V5^6e7h6p7{<|c=c=c=c=e?g@hAkDpHtLuMtLtLvNyPwNwNwNwNxOzQ|S}TVVWWXXXX|W|Y}Z}Z|\zZy[xZ|_{^y^y^y`y`yaz``~^}`|c{d{g{i|i|j|i}g|f~efff~fddÄeȆc͈aш_ԇYىXZaffedda`][Z[]]bbcbcdeffecۥ_ء^ע^٧bܫf٨eةe֩f֩fժfԩeӨdШc֯jӮhѬf̩eɦbȥaǤbƣ_ʣ`ͥ`ҧcըd٨c٧`ئ_ץ`Ԣg̛cÑ\VTRR~SrKpKlIjJiKiLjOlMlL~jI{gF|hGiJkLjKiJgLgLeMcK|`Hy]ExYDvWBpTXD=VB;U@;T?:Q97P86M85K63I43G21E10D0/@..?-->+-<)+8()6&'5%(4#)7#,7#.7#,7$*7$*7$(7$&7$&((((((((#,#,$,$,$,$,&,&+)-)+*++,+*,+,+,+0 +0 +0 *1!+2!+3",3"*4#+8#*9"*9"*9"*9",9",9!.9!.9!.9!.9!/9!/9!19!19!19!19#08"/7!.6 -4 ,3+2,1+/-/--.-.,-,-),(,$*",!+ * *!+",",",",",!+!+ * * *'''&('''))****,,***)('''((''&&%%&&&&&&&&%%&&&&''%%&&%%&&%%####"" &!&"'"'#(#($)$)%*$)#(!&!&!&"'!'%%&&''' (!)!) ( (''&&)(''()+, - - - - - - - -!-!-".",#-#-&.&,','+),),*-*++,+,+.+..-.-/./.1-1-2,2*2*3+4*5+5+5 )7 *7 (6'5&5&4%3$3$7 (9"*:#+8!)5&4%5&9 &?"'@!&A"'A"'C#(C#(D$)D$)G$*G$*H#*H#*H#*H#*J"*J#(M$*M$(M$(M$(M$(M$(M$(M$(L#'L#'M$(N%)O&*P'+P'+Q(,R*+R*+S+,T,-U-.V..W//W//V.,V.,X0.Y2-[4/\50^70_60e:4g<5i>5j@4mA4qF5zM8R8U5^6e9h5o7w:y;v8s;o9i4f2f3g7d7c6_7`8`9c;dhi?mCqGtIsHsHvJwNwNwNvMvMxOyP{R|SVVWWXYYZ~YZ\]~\}[{[zZ}`}`z^z^z_z_{a|`~^_~_}b|e|h}j}j}h}g~g}f~efffdcƒdDžc͇cш_Ո\ֈX]`dea^]]]\[ZZ[]_ddedeffggߪfާdأ_ՠ\Ԣ]إcܫh߮kݮjۮjڭiحhحhحh֮hհiѯgϭe̪cʨaȧ`ɦbɧ`ͦaШcժfثgݬgݫfީeۨfԡhʛeZSP~N{OyOrJpKmJlLjLjMkPmNnNlI}iF}iFkKlLlLjJiKhJfKdI|aFy^CxZBvX@oS;pTWC,,=*,<)+8()7'(6&)5$*5!*5!,5!*5"(5"(5"&5"$5"$((((((((#,#,$,$,$,$,&,&+)-)+)+*,+*,+,+,+0 +0 +1!+1!+3",3",4#+6"+9"*9"*9"*9"*9",9",9!.9!.9!.9!.9!/9!/9!19!19!19!19#09#08"/6 -4 ,2*1+1+/-/-./-.-.,-*-).%-", *)) *",#-",",",!+!+ * * *'&&%'&&&))****,,+**)(''&''&&%%% $&&&&&&&&$$%&&'((&&''&&&'%%####""!&!&"'"'#(#($)$)%*$)#(!&!&!&"'!'%%%&&'' (!)!) ( (''&&'(''()*+ - - - - - - - -!-!-",",#-#-&,&,'+'+),),*+*++,+,+.+,.-.-/./,1-1+2*2*2*3*4*5+5+5 )7 (7 (6'5&5&4%3$3$7 (9"*:#+8!)5&3$4%8%?"'@!&@!&A"'B"'C#(C#(D$)D!'D!'E 'E 'E 'E 'G'G %M$*M$(M$(M$(M$(M$(M$(M$(K"&K"&L#'M$(O&*P'+Q(,R)-Q)*R*+S+,T,-U--V..V..W/-V.,V/*X1,Y2-[4/\50^70^70e:3g<5i>5j@4mA4qF5zM8R8T3\7c7f5k5t9w:t7p:k8f3c1d3e5c5b5`8a9b;di=i=j=ef_L>_L>_L>_L>VC5UB4UB4VC5WD6YF8[H:\JqR>oS>pSApSAoTAoTAmRAlRAnTEnTElUElUEjSEiSEhUGhUGgTFgTFfRGeQFeQFdPEcOFbNE`LE]IBZF?WC,,=++<)+;(*8()7'(6&)6%+3(3*3(3 &3 &3 $3 "3 "&&''(())((!)"*#+$,'-',&+&)'*'*))))+*+*2"-2"-4#-5$.8$/9%0:&/:&/=&.?&,>$->$-=#,<"+;!,;!,;!.;!.<"/<"/$>$>$>$@ %@ %C &C &D!'E"(G")G#'H!&I"%I"%J#&J#&K$'K$'K$'M&)M&)N'*N'*O(+O(+P),P),Q)*R**R**S++T,,U--V.,W/-W/-X1,Y2-[4-\5.^70_81`92c81f;2i>5kA5mC5rG6yL7Q7U4]8d:h9n:v=w=t9o9k8f3b0d3e5d6c6dg>g>h>h>j@lAnCrFsGsGsGsGtKuLvMwNyP{R|S|S}T~UWYZZZZ\\\\\\^^}^}^|`|`}aced`^`~b}d}e}g~g~e~eecegjf`Ƃ_̈́a҈aՊ`؊\ڈXڇU^[ZVVWXZݎUޏVޏVX[^acbceffޤeۤd٤bڧeܫhޫi٨eӢ_ҡ^צcݮjݮj߰l߳lnnm޲k۱iձgҰfѯeЮdήcήcϭeϭcѫdҪb֬dܭglkߨgإfʛc_VM{IyKwJuIqIpInHmHkImLoNrPnLoJpMqNoMnLmMlLgIgIfIeH~cH}bG}_E|^Dy^Cx]By[AxZ@y[A{]C~^E_F`GdKiPmTmUlTiQgQkUjSgP|bKw^HsZDoUDlUChQAgP@cM@aK>`J?aK@`LAaMB]J<]J<\I;\I;\I;\I;[H:[H:VC5VC5WD6XE7YF8[H:\I;\J<`PC_QDaTDcVFfVGfVGhUFhUFhSBhSBlRClRCnSBoTCpUDpUBmP>lP;iL:hK9iL:kP=nSBqVEmSDmSDmSDkTDkTFkTFjTFjTFiVHhUGgTFfSEdPEcODaMBaMBaMDbNEcOHbNG`LE]IBYD?WB=V>+-<)+8()6&'4$'3"(3"*3",4#+4#)4#)4$'5%&5%&&&''(())((!)"*#+$,'-',&+'*'*(+))**+*+*1!,2"-3",4#-7#.8$/9%.;&-<%->%+>$-=#,=#,=#,=#.<"-;!.;!.;!.;!.; /; /$>$>$>$@ %@ %B%C &D!'D!'F!(F"&H!&H!$I"%I"%J#&J#&K$'K$'M&)M&)M&)N'*N'*O(+O(+P)*Q)*Q))R**S++T,,U-+V.,V/*W0+X1,Y2+Z3,\5.^70_81_90b:0g<3j?6lB6mC5pG5wM7}Q8S5\9c;f9m;v?y@uh?h?h?j@j@k@lAnCqErFtHtHtHtHtJuLvMxOyP{R|S}T~UVXY[[ZZ]]]]]]__``}a}a}a~bdc``b~d}e~e}g~gfdcccghfʈeч`ԉa؋a܎`_^\]ZXWVWXYޏTݑUޒVX[`cdbcefgݦfܦf٦eکg۬hݬiةeӢ_Ѣ^֧c۬hܭiޯk޲kmn߳l޲k۱iزiճiԲhӱgҰfѱdұdѰcԮcԬd֬dجeܫhڧeסaѝaZWO}IzGxGxHvHvKtKrJnHmHnIoLqMoJpKqNqNpNoMnNmMhJhJfIeHdI}bG~`F}_E{`E{`E{]C{]C{]C|^D_F`GaHdKhOlSnVnVlTlSnVmVhQ|bKw\GqXBnUAlRAfO=eN>bK=_I<^H;^H=\H=]I>[H:[H:[H:\I;\I;\I;\I;\I;ZG9ZG9[H:[H:]J<^K=_L>_M?_OB_QDaTDbUEeUFfVGgTEgTEhSBhSBkQBlRCnSBnSBoTCoTCmP>lP;jM;iL:hM:kP=nSBoUDlRCjSCjSCjSCjSEjSEiSEiSEiVHiVHhUGfSEdPEcODbNCaMBaMDaMDaMF`LE^JC\HAYD?XC>X@>W?=R=:P;8L76I43F21E10A//@..?,.=*,8()6&'5%(4#)4#+4#-4#+4#)4#)4$'4$%4$%&&''(())((!)"*#+$,'-',%,%*%*&+()**+*,+0 +1!,3",6"-8".9#/:%.:%,;$,=$*=$*>%+>%+>%+>$-?%.;!,;!,;!.;!.;!.;!.;!.9!/<$29"27 05.2.2.2020//..,.+-*.*.)/(/", ,!-!- ,+*)".".!- ,+*))&&&%'&&&*))'''**('''&%%%&% # " " #%&$$$$%%%%%%%%%%%%%&&'%&&&&%! !# $"& % % %!&!&"'"'"'#(#(#(#(#(#(#("("( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('&%$$%&'((( ) )!*!*!*#+%+%+&,',(,),),+.+,-,-*.*.*.*-(+*+*.+.+/*/*1+1+3*3*3(3(4(4(4&4&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&7$; %;!$= $= $= $= $>$>$?$@ %@ %@ %C &C &D!'D!%E!%E!#F"$F"$G#%G#%H$&H$&J&(K')K')L(*L(*M)+M)+O()Q)*Q))R*(S+)T,*U-+V.,V/*W0+W0)X1*Z3,\6-]7.^8/_90d<2g?5iA5kC7kD5pG5vL6|P7R4[7b:f8lkk?k?l@l@mAmAnAnAqCrDtFvGvGvGuIuKvMwNyPzQ|S}T~U~UWXZ[\[[^^^^````a`a`~_`ccac~c~d}d|f|f}feecccfhhגkݐfߐeddeed[YWVWWZXޒTޔUWZ]acd`begiiިhܩh۫iڭjܬj֩fҢ`Ϣ_Ӧbثg٭fۯhݱj߳lk߳jݱh۱gڴkٵkٵiֵhֵhմeմeԳdײdծcիcթb֥bӠ_͚[ǕXPLH{F{F{G{IzJ|OzNvLrJoGnGoJpJpIqIqLrMrMrMpNoMiJhIgIfHdGdGbFbFcGbFaEaE`DaEaFaFbGdIgMkQnTpVqWsZsYoWiQ|bIu[DpU@lS=jQ=hN=dM=bK;_H:\F8[E8[E8[E8YF8ZG9ZG9[H:\I;]J<]J<^K=]J<^K=_L>`M?aN@bOAbOAaOA^NA^PC_RBaTDdTEeUFfSDfSDgRAhSBkQBkQBmRAmRAnSBnSBlQ>kP=iN;hM:iN=kP?lRCnTElRCjSCjSEiSEiSFiSFiSFiSFjWIiVHhUGfSEeQFcODbNCaMBaMD`LC^JC\HAZF?YE>YD?YD?ZB@YA?T?+-:*+8()6&)5$*3$+3#-3$+3$)3$)3$'3%%3%%&&''(())((!)"*#+$,'-',%,&+&+&+)** +,+,+0 +1!,4 +5!,7!-8".9$-;$,<#)<#)=$*>%+?&,?&,@&/@&/>$/>$/>$1=#0=#0=#0<"/$>$?$?$?$?$B%B%B%B#D $D "E!#E!#F"$F"$G#%G#%J&(J&(J&(K')L(*L(*L(*M))P((P((Q)'R*(S+)T,*U.)V/*V/(W0)X1*Y2+[5,]7.^8/^8/e=3g?5jB6jC4kD5mG4sJ4xN5~Q4X7_8c7jm>mAmAnBoCpDrErErDsEuGvHxIxIwHvJvLwNxOzQ{R}T~UVVXY[\]\\````bbbbdcca``~b~bdd~d}f|f|f}f}fgec`bgk̍jߔlhhiiigfZYXWXXYWTTW]`cdfbcgikkޫjݬjܬlڭl٬kըeѤaУ`Ӧb֩eجeڮgݱj߳jk߳j޲iݱh۳kڴi۵jڶhڶh׶eֵdصdֲdԯaѪ_Ѧaѡ_Μ]ǕVSLKGIKOOPTR{OvJrGpEoFpGpIqIrMsNsNsNqOpNjKjKgIfHeHeHeIeIgKgKfJeIdHdHbGbGbGdIfLjPnTrXtZu[u[rWkP}aIu[BpV?mSeN_L>^K=_L>`M?aN@bOAbOAbOAaOA^NA]OB_RB`SCdTEdTEeRCeRChSBhSBkQBkQBlQ@mRAmRAmRAlQ>kP=jO#(?$)?$)@%,A&-B'0B'0B'0B'0A%1@$0@$2?#1>"0="18 0614/3.1-1-1/1/-.,-*.(,(,(,'-&-#-"0#1$2#1"0-,,,,,+++(%%%%''''*))'''**'&&%% $ $ $'% # ! ! #%' "##$%&&'%%%%%%%%$%%%$%%%"##$ %$#" % % %!&!&"'"'"'"'"'"'"'"'"'"'!'"( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (('&%%&'(((( ) )!*!*"*%+&+&*'+'+(,)*)*-,-*.*.*.(.(.(-(-*+*.).)/*/*1 *1 *3*3(3(3(4&4&4&4&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5$; %;!$;!$;!$= $= $= $= $>$>$?$?$>#>#@#@!C#C!D "D "E!#E!#F"$F"$I%'J&(J&(J&(K')L(*L(*L((O''P(&Q)'R*(S,'T-(U.)U.)V/(V/(W1(Y3*[5,\6-]7,^8-c=2e?4hB5hC3jC4lF3rI5wM4}P3X6^6`4g8p>u?r?n=i:c5a1c3e6d7d8d8e9e8h:j;n=pnS>nU?nUAlRAhQ?fO?cL`M?`M?]J<^K=`M?aN@bOAaN@`M?^L>^NA]OB_RB`SCdTEdTEeRCeRCiTCiTClRClRCmRAmRAmRAmRAlQ@lQ@kP?jO>iO@iO@jPAhQAgPBgPBfPCfPCdQCdQCdPEdPEhUGhUGgTFeRDcODbNCaMB`LA^JA[G>XD=UA:T@9UA:XC>YD?ZB@YA?U@=R=:N98K65H43F21E33E33C02A.0=-.;+,9),8'-5&-5%/4%,3$)3$)2#&1##1##&&''(())((!)"*#+$,'-%,%-& ,& ,'!-* ++!,, ,-,2"-3!-6"-7#.:"/;#0<%/?%.?$+@%*@%*@%*@%,A&-A&/A&/A&/A&/@$0?#/>"0=!/=!/; /6.4/3.1,0,0,1/1/,-+,)-'+'+'+&,%.#/!/"0"0!/ .-,+++****(&$$%'(((*))'''**&&&% $ $ $ #&% # " " #%&$$$$%%%%%%%%%%%%$$ $%#$$% !##%!& %"! % % %!&!&"'"'"'"'"'"'"'"'"'"'!'"( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (('&%%&'(((( ) )!*!*"*%+&+&*'+'+(,)*)*-*-*.*.*.(.(.(.(-*+*.).)/*/*1 *1 *3(3(3(3(4&4&4&4&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5$:!%;!$;!$;!$= $= $= $= $>$=#>#>#="=">!>B"B C!C!D "D "E!#E!#I%'I%'I%'J&(J&(K')K')L((O''O'%P(&Q)'R+&S,'T-(T-(U.'V/(W1(X2)Z4+\6-]7,]7,`:/c=2e?2fA1hA2kE2qH4wM5|P3V5Z5\2a4l:o^H:]J<]J<^K=_L>`M?`M?aN@\I;^K=`M?aN@bOA`M?^K=\J<^NA^PC_RBaTDdTEeUFfSDfSDkVEkVEnTEmSDnSBnSBmRAmRAlQ@lQ@lQ@kP?jPAiO@gP@gP@fOAfOAeOBeOBcPBcPBcODcODgTFfSEeRDcPBbNC`LA_K@^J?[G>YE7T@9VAX@>W?=S>;P;8N98K65H43G32G55F44D13B/1>./<,-;+.:)/6'.5%/4%,4%*2#(2#&1##0""&&''(())((!)"*#+$,'-%,& .$!,& ,'!-* ++!,, ,. -3#.5#/8$/9%0<$1=%2@&1@&/B'.A&+A&+A&+A&-@%,@%,@%,>#,="+< ,;+:*9)8*6*5-3.2-1,/-0.0.1/+,*+(,'+&*&*%-%.!--+****+)))****(%#$%'())*))'''**&%%% $ $ # # $ $ $ $ $ $ $ $%%%%$$$$%%%%%%%% # $ $%#$$$#$"#$$## % % %!&!&"'"'"'!&!&!&!&!&!&!& &"( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (''&%%&''''' ( (!)!)")%+&+&*'+(+),)*)*-*-*.*.*.(.(0(.(-(+(.).)/)/)1 *1 *3(3(3 &3 &4&4&4$4$5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5$:!%:!$;!$;!$;!$;!$= $= $=#=#=#<"<!<!; =A!AB B C!C!D "D "H$&I%'I%'J&(J&(K')K')K''O''O'%P(&Q)'R+&S,'T-&T-&U.'U.'V0'X2)Z4)[5*\6+]7,\6)_9,b`M?`M?`M?aN@aN@aN@aN@^K=`M?bOAdQCcPBaN@_L>\J<_OB_QDaTDbUEeUFfVGgTEgTEnYHmXGpVGoUFoTCoTCnSBnSBlQ@lQ@kQ@kQ@jPAiO@fOAfOAeOAeOAeOBeOBcODcODcODcODeRDdQCcPBaN@`LA^J?]I>\H=WC:VB9T@9R>7R>7S?8T?:U@;T<:T<:P;8O:7M87L76I54I54H66G55F35D13?/0=-.<,/;*06'.4'03&-2&*0$(/#%."".""&%''(())((!)"*#+$,%-%,& ,& *'!+( ++!*, *-!+.!+5$.8$/9%0;&/=%2@&1A'2B'0E'/F'/E&.D%-B$.B$.A#-?$-:*:*8+6)5(2'1'0&3.1-0,/+/---..//+,)+')$($*$*%+$-)(($ %$'&(')')(*(##$%'())()(&&&((%$$# # " " " "# #$$# # "'$&#$ ! # %#%#%#%% # # $ $##$$&%! !# $"& $ $ %!%!&"&"'"&!&!%!&!%!&!%!&!%"( '"( '"( '"( '"( '"( '"( '"( '!( '&%%& '!( ' ' '!(!(")")")%*&*&*'+(+)*)*)(-*-*.*.(.(.(0(.(-(-(.).(0)0)1 *1 (3(3 &3 &3 &4&4$4$4$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$5$:!%;!$;!$;!$= $= $= $= $=#=#<"<"<!; ::@!@@!A A B !B !D "H$&H$&I%'I%'J&(J&(K')K''M'&N(%P((P*'R*(R-'S,'S.(T-(T/'V/(W2)Y3*Z5,\6-\8,Y5)\8*`<.c>.d?-iC0qH4vL4{O4T6W6W0\0e4i4h2e6c3^0_1d4h9jaN?dQBfSDeRCcPA`M>]L<`PA_RBaTCcVEfVFfVFgVFhUDmZIoZIoXHnWGoUDnTCnTCnTCkQ@lS?jSAiR@hQ?gP@fO?dO>dN@dN@dN@dNAbOAbOAbNCbOAdQCcPBdNA`M?_K@]I>\H=[G7R>7S?8S>9T?:P;8P;8O:9N98M87L76J65I54I77H66F35D13B/1>./>+-<,/7(/4'.5&-2&*2#&/#%0""-!!&%'(()))))!*!*"-#.#.$,%&& $("&,#(/$*0#*2#*3"*7#,9$-;$.>$-@&1B'0C(1F&1L&3N%3K%2J$1H$2D"0B"1@!08*6)4*2)1+.*.*.,,*,,---.,-+,*+'*'*%)$(#'"'%$$""$"$"$"&$&$&$&$&&&%%$$#%&$"""$%######## ! ! ! ! ! ! ! ! ! #"$! "#    "#&&&&$$$$$$"##$##!%!#!%!#!%!#!%!#!%!#!%!#!%!#!%!#!% #"&!$#'"%$(#&#'"%#'"%#'"%#'"%#&"%!$ # #!$"%#&#&#&#&#&#&#&#&#&(+(+)+)+)+)+*+*)-*-(.).(0)0)1 *1 *1 *1 *1 *1 *3*3(3(3(5!*5"(5"(5"&5"&5"&5"&6"$5"5"5"5"5"5"5"5"4!5"5"6 #7!$8"%8"%;"&7 :!:!;"=#>$>$? %;!;!;!;!;!;!;!;!=#=!?$@ #A!$B"%C#&E"&G%&G%&H&%H&%J&&J&&J&&K(&K''L)'N'(M*(Q+*P-)R,)Q.*V0-T1+W2,V4+Y4,X6-[6.Y7-Z8,[:+\;,`<,e@.iC0oF4rG4zM6}O5S5Y5_4e3j1n4c/d3e5f5g6i9i9i;l=l=l=l=m=n=n=n=r@sAtBuCxGyH{I{I}M}M~M~M}N}N}N}N|P}QUWXXYX]]_``acbabcdghiilkighhikorroifff|acefˍfהinpokkhdb_]]^^^\ޗYٓWӑTϖS֟\ejljijhijlmlݲmݲnجkԨgѤcҥdתiۮkݰlݱjۯh߳jmlkhignllpsspokgزaװa۱eٯeЩ^ȣ\[_a^XTVXRQ{NzNxNtLnFiBlIkGiHkJoNrQqQpPlMkLkLjKjKkLkLlMnOnMmNlMiJfGcDaBbFdHgLiNgMdJaG_D{]Ay`B{`C{aF|bG|dJ}eK~fLv^Fs]Er\Eo[CnZBlX@kVAhVBeS?dSAdSAdSAdSAdSAdSAdSAfUCfUCfUCfUCfUCfUCfUCfUCdUBeXEh[Hj]Jl]JiZGdUBbQ=hWCiWCjXDmXEmXElWDkTBjSAjU@iU=hS>fQ]G<\F;WC:UA8Q>7Q>7R?8R?8P=7M:6O;:N:9M9:K78I56G34F23E12B./C/0D01D01C/0@..>*+<)+<,/:+0:)/7(+7'*4%(4$'2#&&$&''((())!*!*"+#,%/%,)'+ $,!%/#'1"'2!'4!'3 &9"*9"*="+?$-C%/F(2I)4K*5N%5N#4M"3K"2G 2D0@/=.7*3)2+.*.,,+*+*+*++,,-,-*-),'*&*%)%)#(!& %$#$""""""""$$$$$$$$&&%%$$$#%$"! !""!!!!!!!!           !""!  !   !&&&&$$$$$$"##$##!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#"$"$#%#%$&$&#%#%#%#%#%#%#%#%$&#%"$"$"$"$#%$&$&$&$&$&$&$&$&$&(+(+)+)+)+)+*)*),'-(-'.(/(0)0)0)3*3*3*3*3(3(3(3(5"(5"(5"&5"&5"&5"&5"$6"$5!5!5!5!5!5!5!5!6 "6 "6 "6 "7!#7!#7!#9 #;"<"<"<"=#=#=#=#;!;!;!;!;!;!;!;!<#<#>$? %@"$A#%C#&C#&F$%F$%G%$G%$I%%I%%J'%J'%K''L((L((M))O,*P-+P-+Q.*S0,S0,T1+U2,V3-W4.X6-X6,X8-Y9*[:+]<)d?-gB/nE3pG3xK8yL5P4U3[0c/g-k0d/e3f3g6g6h7i9i9k;l=l=m>n?o@o@q@sAu@uCvDxEyF{I|J}M}M~M~M~O~O}N}N|P~RSUXYYY]]``cccbdccdhiijmljhiiikmqolfbeecehƌgЏgږgkkkhheda]\__`^]ߛZؗWѕV͗WѠ]ܩgjmjkljikjm޲kܱmڲmڭlתiӦeԧdثhܯk޲k޲kݱhikljikimjmptsplje۲b۲bܳdرbѪ]ȤX[]^\YVWYTT|QyPwQrLmHgEhGgFfHhHlNnNlOjKgKgHfJgHgKhJiMjLkLkIjKhIfGcD_C~_BaEcFdIfJeJdHaF`Dz_Dz`Ez`E{aF{cI|dJ|dJ}eKt^Fs]Eq]Ep\DnZBlX@iWAiWAeT@eT@eT@eT@eT@eT@eT@eT@fUAfUAfUAfUAfUAfUAfUAeVAeVAeYCh\Fj^Hk\GhYDcT?`QbO@cPAcPAcPAeMAeMAeMAdL@aK@_I>]G<\F;WC:T@7Q>7P=6R?8R?8N=6K95N:9M9:L89J67H45F23E12D01A-.B./C/0C/0C/0A-.?+,=++>+-;+.:*-9),7'*6&)4$'4$'&%&''(((' (")#*$+%,(.(+0!(2"%3#&4$'6#'7"'7 &6%>#*>#*A"*B#+F%.I(1O+5R,9M$4M"3K 3H1C.>,;+9*5*2*1*-),*+*)*()*++-)-*.)-(,%*$)$)"("(!'&%$#########&&&&&&&&&%%%$###%$"!!!!"!!!!!!!!          !"##"! !  !''''%%%%$$"##$##!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#"$"$#%#%$&$&#%#%#%#%#%#%#%#%%'$&#%"$"$#%$&%'%'%'%'%'%'%'%'%')+)+)+)+))))*)*),','-&.'.'/(/&0'4 +5+5+5+5 )5 )5 '5 '6!(6!(6!&6!&6"$6"$6"$6"$5!5!5!5!5!5!5!5!7!#7!#7!#7!#6 "6 "6 "8"<#=#=#=#<"<"<"<"<"<"<"<"<"<"<"<"<#<#>$? %@"$A#%C#&C#&E#$E#$F$#F$#H$$H$$I&$I&$K''L((L)'M*(O,*P-+P-)Q.*Q.*R/)S0*T1+U3*V4+W5,W5+W7,W7(Y8)\;(b=+fA.lC1nE1vI6wJ3{L0Q/W,^*d)g,e0f2g3g4i5i5i7k8k8l;n`QdS?gUAhVBiWCiWCkVCjU@hV@hV>gU=eS;cQ;bP:aO;`N:aO;aO;aN=bO>bO@cPAcPAcPAeMAeMAeMAdL@aK@_I>]G<\F;VB9S?6O<5O<5Q>7P=6M<5J84K76K78I56H45F23E12D01C/0?+,@,-A-.B./B./B./A-.@..?,.=-.<,-:*+8()7'(6&'5%&'''&&''( (!(")&+',*,+-,+6"+8#(:%*<%+?&,?&,@%,A#+E&.E$-F",F",I#.L&1Q)4S*8L#3K"2H1B->*:(7(4'3)1)/(,(+)*)'('**,+-)-)-(,&*$)"'!'!' &%%$$#########&&&&&&&&%%%$$##"$##"!!!!!!!!!!!!          !"##"! !      !''''%%%#$$"##$##!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#"$"$#%#%$&$&$&$&$&$&$&$&$&$&%'$&#%"$"$#%$&%'%'%'%'%'%'%'%'%')+)+)+)+))))*)*',','-&.'.'/(/&1&5+5+5+5+5 )5 )5 '5 '6!(6!&6!&6!&6"$6"$6"$6"$5!5!5!5!5!5!5!5!9#%8"$8"$7!#6 "5!5!6 >!%>$>$=#<";!;!: <"<"<"<"<"<"<"<"<#<#>$? %@"$A#%C#&C#$D"#E#$E#"E#"G##G##H%#H%#K''L((L)'M*(O,*P-+P-)Q.*P-'Q.(Q.(R/)T2)U3*U3*V4*U5*V6)X7([:)`=*e@-iC0mD2tI6wJ3yL/~P.V*])c(h+f/g1h4h4i5j6k7k7l9m:o;q?tBvDyHyFxCyDyDzE{H{H|I|I~L~L~MNNNQQSTVX[[[[^^`aabdcfdefijklmkljihiimkiecacÉdNjg͏jԓkڕkeddgefhgfdcaddfeca]ܟ\ҝ[ҡ^٧b߭fknpqmmnkmݳkٱkذk޲qݰoܯlۮkܯkޱm߳lkklkjjmqtrptwzvoi߹fݹeܷf޹h޹iصdѬ^ȧZYYXWWYUSXWTzSvPqLiF~dC{`C{`E|aFeJfLfLaG{]CxX?xX?yW>zX?}[B^E`HdKcGdGcG~cF~`Fz_Dy[Av[@z\Bw\Ay[Av[@y[Cy^C}_G|aF|bG|bG|bG|bGzbHzbHxcHxcHu_Gs_Fr^Fq]Em[CkYAjXBjXBhWChWChWChWChWChWChWChWChWChWChWChWChWChWChWCgXChYDg[Ei]Gi]GiZEfWBcT?`QfT@hVBjXDjXDlWDlWBiW?hV>gU=fTbO@cPAcPAeOAeMAeMAeMAdL@aK@_I>]G<\F;UA8R>5O<5O<5P=6P=6L;4J84I54I56H45G34E12D01C/0C/0>*+>*+@,-A-.B./C/0D01C11A.0>./=-.<,-:*+8()7'(7'()))(()'(!)#*&))++--,/!.2 ,:#+?$+A&-E'/G)1I*2J)2J)2M)3M'2M%0L$/L".M#/O#0O%3K"2G 2C.>*9(7'5&3&2(0(/*+)+))('*'*(,(,(,(,&+$)"' %%%$$$###$$$$$$$$&&&&&&&&%$$##"""####"!! !!!!!!!!!!!!!!!! !"#$$#"! !!!!!! ((&&&&$$$""#"# # #!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!!!!""""####$$$$$$$$$$$$$$$$$$$$&&%%$$####$$%%&&&&&&&&&&&&&&&&&&)+)+))))*)*),',',',&.'.'1&1&2'2'6!*6!*6!*6!*6!*6!*6!(6!(6!&6!&6!&6"$6"$6"$6"$6"$5!5!5!5!5!5!5!5!9#%8"$8"$7!#6 "5!5!6 >!#> "> "=!< ;;:=!=!=!=!=!=!=!=!<#<#> "?!#@"$A#%C#$C#$D"#E#"E#"E#"G$"G$"H%#H%#K(&L)'L)'M*(O,(P-)P-)Q.*P-'P-'Q/&R0'S1(T2)U3)U3)U5*S6(W7(Z9(_<)d?-iC0mD2uJ7wJ3zM0~P.W+^*f+j-i/j2j4l5l5m8n8n8n9p:rqW>sWAu[By]Gz`G|bG{cG{cG{cGzbHzbHxcHxcHt`Gt`Gs_Go]Em[ClZBkYCjXBiYBiYBiYBiYBiYBiYBiYBiYBiYBiYBiYBiYBiYBiYBiYBhYBiZCh\Di]Ei]Ej[DgXAeV?cT=cShV@jXBkYClZDnYDmXCkW?kW?jV>hTdN@eOAeOAeOAeMAeMAeMAdL@aK@_I>]G<\F;UA8R>5O<5O<5P=6P=6L;4J84I54I54H43G32F21E10E10D0/?+*?+*@,+A-,C/.D0/F21F44B/1@01?/0=-.;+,:*+9)*8()-,,++**($+'**,-,/!.3#.5#/8$/?$-C%-F'/H)1J)2K*3M)3M)3N(3P(3P&2O%1N"/M!.L -J .G!0D0@,:(7'5&3&2&1)/(.*+)*))('*'*(,(,(,'+$)"' %$########$$$$$$$$&&&&&&&&$$$#"""!"####" !!!!!!!!!!!!!!!!!"#$$#"! !""""! &&&&&$$""""""# # #!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!!!!""""####$$$$%%%%%%%%%%%%%%%%&&%%$$####$$%%&&&&&&&&&&&&&&&&&&)+)+))))*)*',','-'.(/(/&2'3(3(3(6!*6!*6!*6!*6!*6!(6!(6!&6!&6!&6"$6"$6"$6"$6"$6"$5!5!5!5!5!5!5!5!7!#7!#7!#7!#6 "6 "6 "8"<!=!=!=!< < < < =!=!=!=!=!=!=!=!<#<!> "?!#@"$A##C#$C$"E#"E#"F$#F$"H%#H%#I&$I&$K(&L)'L)'M*(O,(P-)P-)Q.(P-'P-'Q/&R0'S1(T2)U3)T4)U5*T6+W7*Y9*^=,c@-hC1kE2tK9uK5yK1}Q.W-`,h-n1l2m2n3m5n6o6p9q9q9rmU=nT=nV>qW@s[Cw]Fx`FzbHzbFzbFzbF{cIydIydIxdIuaHt`Gq_Gp^Fn\DlZBkYCkYCk[Dk[Dk[Dk[Dk[Dk[Dk[Dk[DjZCjZCjZCjZCjZCjZCjZCiZCj[Dh\Di]Ej^Fk\Ej[DiZChYBhXAiYBlZDm[En\Fn\Fp[FoZElX@kW?jV>iU=gR=eP;dOdN@eOAeOAeOAeMAeMAeMAdL@aK@_I>]G<\F;VB9S?6O<5O<5Q>7P=6M<5J92J65J65J65I54H43H43G32G32B.-B.-B.-B.-D0/F21G32H64D22A12@01?/0=-.;+,:*+:*+0...,++ )&-),-.1!.4".7&0:&1=&0B'0E&.G&/G&/G&/F%.G#-F",J$/K%0O'2O'2O%1M#/J ,G,E 1?/;+7(5&3&3)2*1+0+/-,,+,*+(+'*'+(.&-%,$+!(&$$$$$$$%%%%%%%%%%$$$$$$$$$###""!!""#$#" !!!!!!!!"""""""""#$$$$#" !"##"! '''%%%%#"!!"" ! ! !"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"!"!#"#"$#$#%$%$&%&%&%&%&%&%&%&%&&&&%%$$$$%%&&&&''''''''''''''''*)*)*)*),',',',&0)0)2'3(3(4!'5 '6!(8!+8!+8!)8!)8!)8!)8!)8!'7 &7!$7!$7!$7!#7!#7!#7!#5!5!5!5!5!5!5!5!6 "6 "6 "6 "7!#7!#7!#9 #; < < < =!=!=!=!> "> "> "> "> "> "> "> "<!<!> "?!!@""A##C#$C$"F$#F$"G%#G%#I&$I&"J'#J'#K(&L)'L)%M*&O,(P-)P-'Q.(Q.(Q/&R0'S1(T2(U3)V4*U5*V5,T6+X8+Z:+^=,dA.hC1lF3pG5rH2vH.zN+U+`-i0o2o3o3o3q6r7r7s9t:t:v=w>z@|D~FGHGGGG~F~G~GG}G}G~HLMNOQSUYZ[\]]^___aabbdeefhighffffijnlÓkȓiϔjטlmkeݓbgikib\Y\bhknoooojhiigebaߪdܫfޭhlsvvrqqpnmlݵmܴn޶qst߷q۳mٱiٲg۴i۴gݶgikkosvxtsrrmgڻa׷b׹c׸eַdԵcϳ`ί_ʭ_å\¤\]ZVRRSSRzQuOrMmJ~fDxaBtYDrWDoTAoTAqTBpSAmP>jM;gH6eF4dC2cB1eD3jI8qM=rQ@pUBmWBpWCnXCoVBkU>kR>hR;jQ;hR;kRpX@q[Cu]Ew_Ex`FyaEwbExcFydIzeJzeJzfKuaHsbHr`Hp^Fm]Dl\Ck[DjZCl\El\El\El\El\El\El\El\Ek[Dk[Dk[Dk[Dk[Dk[Dk[Dj[Dj[Dh\Dj^Fk_Gm^Gm^Gm^Gl]Fm]Fn^Gp^Hq_Iq_Ip^Hr]Hq\GmW@mW@lV?jT=hR=gQeN@fOAfOAfOAeMAeMAeMAdL@aK@_I>]G<\F;WC:T@7Q>7P=6R?8R?8N=6K:3L87L87L87K76K76K76J65J65E10E10D0/D0/E10G32I54I75E33C33A11@00>..=--<,,;++01///.,!**/+-0 -4".8$0:&1=(1?(2C(1E'/F'/D%-B#+@!)>&=%E!+G#-L&1N(3N(3M%0I!,E,A!0=.9*4'3&2&2*3,1,0,--,-+,+,(+(,'-&-&-%,#*'%####$$$$$%%%%%%%%$$$$$$$$$##""!!!!"$$$" !!!!!!!!"""""""""#$%%$#" !#$$#! ''%%%%##!!!" ! ! !"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"!"!#"#"$#$#%$%$&%&%&%&%&%&%&%&%''&&%%$$$$%%&&''''''''''''''''''*)*)*)*',',',&,&1 *1 (3(4 )4!'5"(6!(7")8!+8!+8!)8!)8!)8!'8!'8!'7!$7!$7!$7!#7!#7!#7!#7!#5!5!5!5!5!5!5!5!4 5!5!6 "7!#8"$8"$;"%9;;< =!> "> "?!#> "> "> "> "> "> "> "> "<!<!> ?!!@""A##C$"C$"G%#G%#H&$H&$J'#J'#J'#K($K(&L)%L)%M*&O,(P-'P-'Q/&Q/&R0'R0'S1'T2(U3)V4*V6+T6,U7,X8-Z:+_>/cB1iD2lE4mD2oD1rF-xK*S*_,i0o2q3r2r4s5s5t6u7u7w:w:y<{=}A~BDDFFFGGGF~G|E}G~HJKNOPSUY[\\^^^__`abbbcdefghggedefijolŔk˕iԗkܜnolgbgilhb[Y\dߡhmnqpqojijihdccfޭhiouwurpponmm޶n޶n޶pstp۳kرfرfڳfٲcܶeiikmsvxsrooj޿eغ`ָbָbַdҶbϳ`ͱ^̯_ˮ`æZŧ^Ħ^ZUPQTQ}PxOtNpNmK}fFw_CqVCnSBjO>iN=kN>kN>iLgQeN@fOAfOAfOAeMAeMAeMAdL@aK@_I>]G<\F;WC:UA8Q>7Q>7R?8R?8O>7L;4N;7N:9M98M98M98M98L87L87H43G32E10E10E10G32I54J86F44C33B22@00?//=--<,,;++441//.!.$-*/."06&3;)5?+7?)5>'1<%/=#,(;(:*7*4)1'0&.&/)/*-+++++*+)+'+'+'+!(!* )(&%$#&&&&&&&&%%%%%%%%%%$$##""###""!!                 !!    !!##"""!!!  "#$##"%%%%#### ! !!"$#$#$!# #"#"#"#"#"#"#"#"#"#"#"$#$#%$%$&%&#&!&!&!&!&!&!&!(#(#(#(#(#(#(#&#$"$"$"$"$"$"$"$"#!#!#!$"$"%#%#&$*',','-(-(.(/(0)5!*5!*6!*6!(6!(6!(6!&6!&9"*;!*;!*: ):!'9 &9 &9 $9 $9 $9 #9 #9 #9!!9!!9!!5!5!5!5!5!5!5!5!6 "6 "6 "6 "6 "6 "6 "8"<!==========> > ?!!?!!?!!=! =! ?!!?!!@" @" B#!B#!F$"F$"G&!H'"J'#K($L)#L)#N+'M*&M*&L)#M*$N+%P-'Q/&R0'S1'S1'T2(T2(U3'U3'T4)T6,S7+U7,X8)[:+^=,d?/f?.h?-mB/uI0{N-U,^-i2r4q2r1u3w5y8y8y:y9z:{;}=~>ABCCHIJLLKIJHIJLMPQTWYZZ\[ZY\\^^^^__bddeghhhddeehkqĘqȗnКn۞qqokgbhhhe`\XXڙ_ܟfmnnlnnnllkhca`ެc߰hmrsrqoݳkݳk޴j߸mqsrq߷qss޶nذhԭbӬaӬ_ܵf޸gjhijpqqooljfܽcٻa׹cҷ`β^˯[ɭZȮZɮ]̯a̯c˫bƥ^¡\\WVSVUzSvOqNjHxaAp[>hO;fL=cI:cI:eI;fJmSDiTCfQ@cN=aL;`K8`K8aL7bM8cN9dP8gS;jV=nZAq]Ds_Dr]Bs^At_Bu`CuaFuaFt`Eq`Dq`Fp_En^Em]Dl\Cj\BiZCiZCl\Ck[BjZAiY@jZAl\Cn^Eo_Fp`Go_Fm]Dl\Cl\Cl\Cl\Cl^Dk]Cj^Dl`FnbHqcIqcIqcIqcIscJscJtbJsaIsaIr`Ht`Hs_Gq[DpZCnXAkU>hR=fP;dM;cL:dM;eNbK=fNBeMAeMAdL@bLAaK@aK@`J?^JA]I@ZG@XE>VC7S@ > ?!!?!!?!!=! =! ?!!?!@" @" B#!B# F$"F% G&!H'"J'#K("L)#L)#N+'M*&M*$L)#M*$N+%P.%Q/&R0&S1'S1'S1'T2&T2&U3'T4'T6,S7,U7,V9+Z:+^=,b>.e@0f?.lC/rH0zO/U.^-h1q3s2u0w2z5{6{6{8{7}9<=>ABCDGIJKKLKJJJKMOPQSWYZZ\[YX\\^^^^__bddeghhgedeehjoŘoɘoћoܟrsqmjggiifd`[]ڜaޡhlonmnppnnlhfa`ެc߰hmqsrqpݵm۵lܶmosutrsvs߷oڳhװeװcرb޸g߹hg߹d߹dgkonlnlkg۽cٻaָbҷ`β^ʮZǭYǭYȭ\ʭ]˫^ɩ^ť\â][XVRT~SyRuPpOjJwbCq\AjQ=fL=bH9aG8cG9dH:bF8aE7]@2`C5fF9fF9eE8fF9iG;iL>jPChRDhRDhSBgRAeP?dOo[Bp\Ar]@s^Au`CubDvbGuaFsbFraEraGqaGp`Go_Fm_El^Dk\Ek\El\Ck[BjZAjZAjZAl\Cm]Do_Fp`Go_Fn^El\Cl\Cl\Cm]Dl^Dl^Dk_EmaGocIrdJrdJrdJrdJueLueLucKtbJsaIr`Ht`Hs_GpZCoYBmW@kU>hR=fP;dM;cL:cL:dM;fO?fO?fOAeN@dM?cL>eMAeMAdL@dL@cMBbLAbLAbLA_KB^JA[HAYF?WD=TA:RA:Q@9TA=TA=TA=S@ > ?!?!?!=!=!?!?!@" @#B# B# F$"F% G&!H' J'!K("L)#L*!N+%M*$M*$L)#M+"N,#P.%Q/&R0&R0&R0$S1%T2&T2&T3$T4'S7,R7,S7+U8*Z:+]<-b>0e@0f?.lC/rH0yN.T-^.h3q3w3y1{3}7~88~99;=>?BCDDFIJKKLKJLLMPQRRTVXYYZXYXYY[[]]]^bdfgghhgfefgij—mÖlɘmЛoۡqrsomkhhjhfebcܠdilommoqrrrokhc_ݭa߱fjprss޹rܷp۷mܸnpuutrxwuq۵jٳhڵgݸhjjh߻e޺ddiljilllhݾdٻaշaӵ_ͱ]ʮZǫXǫXƫZȫ[ǧZǥ[ţ[Ģ[Ğ]YTRQ}QvPsNpNkKydEs_DjT?eN>aG8^D5_E6`F7aE7`D6^A3bE7fI;hK=jJ=jJ=jJ=iL>gM@gPBiRDkTFlUEkTDjSAiS>gQr_As`BubDvcEwcHtcGtcGsbFscIrbHrbIpbHn`Fm_Ek_Gl]Fk[Bk[AjZ@jZ@k[Al\Bm]Cn^Dp`Fo_En^Dm]Cl\Bl\Bm]Cm_Dn`EmbFodHqfJtfKtfKtfKseJxhNwgMwfLveKudJsbHt`Gt`Gq[DqXBpWAmT>jQ=hO;fL;eK:dJ9eK:fL=gM>hNAgM@fL?fL?cK?cK?dL@dL@cMBdNCdNCdNC`LC_KB\IBZG@XE>VC > ?!?!?!=!=!?!?!@#@#B# B#F% F% G&H' J'!K("L*!L*!N+%M*$M*$L)#M+"N,#P.%Q/%Q/%R0&R0$S1%S1%T2&T3$S3&R6+Q6-S7,T8,W:,\<-`?0c?1d?/iC0qG/wN0U-^.h3p2{6|357:::<;;=>?@CCGILMNMNNPPPQTTUVWZZZZYYXYY[[]]]^bdfggfhgeegik•k•kÔhɖkΚkٟooqnnmggijiiijgjnollorttsrnicݬ`ޮb߱djmsrߺsܺrضnضnٷm߻oturrwxvo۵jڵgܷgkllllgfhihgklli޿eܽcֶaӵ_б^˯[ȬYǫXƩYƩYŤWŤWţYţ\ş^ZTP~P{OuOrOpNkLzgIuaHmVDgP@bH9]C4]C4_E6`D6`D6aD6dG9hK=lOAoOBnNAmM@jM?eK>dL@fOAiRDkTDlUCmWBmW@lV?mW?oYAp[@q\?r]>r]@q\?taCubDvcExeGveIveIudHteHrbHrbHpbHoaGn`Fm_Ej^Fj^Dk[Bk[Ak[Al\Bl\Bm]Cn^Dn^DqaGp`Fn^Dm]Cm]Cm]Cn^Dm_DoaFncGpeIrgKugLugLugLtfKyiOyiOyhNwfLveKtcIuaHv`HsZDrYCpWAnU?kR>hO;fL;eK:dJ9eK:eKbJ>cK?cK?cMBdNCeODeOD`LC_KB]JC[HAZG@XE>VE>UD=UBWD>WD>XE?WD>UB > ?!?!?!=!=!?"?"@#@#B#B#F% F%G&H' J(K) L*!L*!N+%M*$M+"L*!M+"N,#P.$Q/%Q/%Q/#Q/#R0$R1"S2#S2#S3&Q4,Q6-R6+S7+W:,[;._>/c?1d?/iC0qG/vM/~T,^-h2p27568;<;=99<=>?AAGJLNONPOQQRRTUUWXZ\\[YXWYYYY[[[]dffggfhghghj•kĕiÔhÓeǔe͘f؜hjkjkkfgighjjljkonmmprtturok߯eۭbݯb߱dilq߻qݻsۺsմmյlֶkܻnstqovxs޺nڶjٵgܹhlnqstolhhhgkllig޿eظcֶaԴaϰ]̭[ʫYɪZȩYƥVȤXȤZȣ\Š\YTQ~P{OtNqNpPlM{hJwcJnWEiRBaJ:]F6_E6`F7aG8`F7dH:fJdJ=eK>gM>kQ@oVBrYCsZDu]Ew_Ex`DybCybBxaBu`AvcEwdFveGwfHxgKxgKvgJufIqaGoaFoaGn`Fk_Ei]Ci]Eh\Bl\Cm]Cm]Cn^Do_Eo_Eo_Eo_EqaGp`Fo_En^Dm]Cm]Cn^Dn`EpbGodHqfJrgKugLvhMugLugLyiOyiOyhNxgMveKudJwcJwaIu\FuZEsXCpU@nS@kP=iN=hMfJ>gK?fL?aI=aI=bJ>bJ>bLAcMBcMBdNC`LC_KB]JC\IBZG@YF?WF?VE>UBXE?XE?XE?ZGAYF@WD>TA;Q>8O<6L93J92H62E61D50D50C4/C4/C4/C4/"*")"*#+&,(.+ 1,!2,0*.(+%(%&$%%'%&#%"#!# !"!# #"&"%"'#'$)%)&+&*'()()((''&&%$%#$%)%)$*"(!'%$%''''''''(((((((&%########""!!    ! !!                               !"""#$%&&%$ % % $ $ $ $!"!""# %!%!%#"!&$&$&$&$&$&$&$&$&$&$&$'%(&(&(&)%'!' ' ' ' ' ' ' ' ' ' ' ' ' ' & %!$!$!$!$!$!$!$!%"%"%"&#'$'$'$)%.(/(/(0)2'3(3 &3 &8#*8#*9"(9"(9#&9#&;"&;"& > ?!?!?!=!=!?"?"@#@#B#B#F%F%G&H' J(K) L*!L*!N+%M*$M+"L*!M+"N,#P.$Q/%P."Q/#Q/#Q/#R1"S2#S2#R2%Q4,P5,R5-S7+V8-Y<.^=.b>0c>.hB/oF0vM/~T,^-h2o/857;<<>=8:;iN=hMXE?YF@YF@[HBZGAXE?UB8O<6M<5J84G83F72E61D50D50E61E61$)$'$)%*(,*.- 1.!2- 2+0)-'+$("&!'!%%)$&"&!#$"%#")"'#*$)$,%+&.(-(+'(%&$%#&"%"%"%&*&*$*#)!'%&%&&&&&'''(((((((&$""""""""""!!    !                                   !"#"#$&&&%%!&!&!%!%"%"%"#"## $!%!%!$##"&$&$&$&$&$&$&$&$&$'%'%'%(&(&)')%' ''''''''''''''&%$$$$$$$% &!&!&!'"'"(#)#-'.'.%/&1&2'3%3%6!&6!&7 &7 &9 $9 $9 $9 $!>!?"?"?"=!=!?"?"@#@#B#B#F%F%G&H' J(K) L*!L*!N,#M+"M+"L*!M+!N,"P.$Q/%P."P."Q0!Q0!R1"R1"R1 R2%P5,N6,P5,R6*V8-X;-^=.b>0c>.hB/oF0uL.}S+],g1o/957:;;=<9;<=@ABEJMOQSTTSSSUUUUVX^``__][ZZZ\\^^^`dffggfhemhgfdcđdœb̘fқc۞efgfgheefeffijnnommnptrrsqomܲjٯe۰bܱb޲gݶi޸oܺpۺsڼtָpչoغq߿rxwwutxxuo߻mlmruurplllqmmjkjjji߼hݺhظeմcѰ_Ϯ_ͬ]Ѯ]Ϫ\̦[ɣ\ğ[YVTVTyRtRqRoQ{jNxfNnYDjUBgP>fO=gP>hQ?hN=gMhMYF?YF?YF?WD=VC7O>7M;7I:5G83F72E61F72G83H94")")$)%*(,+/. /0"11 201./+,')"&#"%+#)$( $%###$($(%)%)%*',(-)-)*'($%"#!$!$"%#&'+%*%+") '%&% % %&&&'''(((((((&$"""""""""!!    !  "  !                             !"#"#%&&&&#!%!%"#"#"#"#"#"!# $!%!%!$#! &"&"&$&"&$&"&$&"&$'#'%($(&)%)')%' ''''''''''''''&%!$!$!$!$!$!$!$!%"&#&#'$'$(%(%)%,&-&-$.%0%1&2$3%6!(6!&7 &7 &9 $9 $9 $9 $;"(;"(!> ?"?!?">!>!?"?"@#@#B#B$F%F%G&H' I(J) L*!L*!N,#M+"M+"L*!M+!N,"P.$Q/%P.$P."P."Q/#Q/#R0$R1"R2%P4)O4+Q5*R6*U8*X;+]=._>-b>.fA.mG0tM.{T-\.g3o172478;;;<iS>mT@mT@kR>iPoTAtWEwZHwZHuZIpTFnTEnRDlRAlRAlS?mT@nU?oW?rZ@v^ByaE{dE{dEybBvbAyfHxgIyhJ{jL{jN{jNyjMyjMyjMwiNvhMugLtfKseJrdJrdIqbErcFteHvgJvgJvgJteHsdGsdGrcFpaDo`Cn_Bo`Co`CoaDn`CmbDodFqfHtfItfItfItfIrcFrcFsdGteHveKwfLxgMzfM{bL{`Ky^Iv[FtYDqVAoTAnS@mR?kP=gL;dH:bF8aE9aE9aG:bG<`HXE>XE>R?8R?8S@9TA:VCYF?XE>XE>WD=UB;TA:S@9R?8Q>8N<8K<7I:5G83F72G83H94I:5# 1# 1&/( /- 10"15#18#25,5,3-0*+)&%!$" $#"   ! !$#&%(')&*'*')&,+,+)*'(&'$%"&"&%*#)#* (&$#$((((((((''''(((&$"""""""""""""""   # ! # !$"              !!"$%% %!"! # $!$!%"%"% ########&!&!&#&!&#&!&#&!&#&!&#&!&#&!&#&!(!(!(!(!(!(!(!(!(!' &%%&' '!&#%"# # # %"'$(%(%(%(%(%(%(%(%(%+%-&-&.'.%/&1&1$4&4&5$6%6%7 &7!$8!'6'6'8'6%8'6%8%6 #3254 8"7"!:!$;##;!"=! = "=! = "=! = "=! >!#>"!>!#=! = "< <!< ?!!> > =<;;:========= > > ?!?!@"@"A#F(F(F(F(F(F(H'H'I'J(J(K) K) L*!L*!L*!M+"M+!N,"O-#P.$Q/%R0&R0&P/&Q0'P3%R5%S6$U9$X9%Z9&dC0hE1lF/qJ-wO,W/a4k/}./5317=?;>@CFHHINNNOQRTUTVXWYXX[``_]]_``^^^^]]]]aabbbaa`dgĕiǖkȕjʕk͘nҚiܜ_\`egjhjec`bgkkgdhnonllljlopplg߱fݱhݳkݳkذhկfձgٷmܼqܼo޾quwzzzzyysnkjiisqnkkpssqrsokgghggh߽fܹeصaԱ]Ԯ[ްbݭa٩_ѢZțXTQSMRT|SvQqM~nM|kMwbGv^FrZBnV>mSlVAnXCjV>jV>iW?jX@m\Bo^DraGtcGraEsbDudFwfHxgIyhJyhJziKxgIwhKwhKvgJvgJvgJvgJufIwhIuhHuhHtgGsfFreEreEreEqdDqdDqdDqdDqdDqdDqdDqdDk^>m`@qdDuhHvhKvhKtfIseHugLugLtfKtfKtdKtdKscJtbJ|fO}dN{cKx`Ht\DqYAoW?mU=mU=lT]F>\H?]F>ZF=XD;WCXC>YD?YD?XC>XC>WB=U@;S>9R=8Q<7O<6O=9L=8J;6I:5G83E61C4/C4/ !3"!1$ 1( /- 12"/7"19#0: -7,6,2*.('$$# !!! ! !!"# $!'#)%+%+%+%+%,++*()'(&'%&#'"&$*#)"* (&%##((((((((''(((((&$"""""""!!!!!!!!########                     !!"$%% %! ##$$% % % ########&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!(!(!(!(!(!(!(!(!(!' &%%&' (!'"%$$##"$#%$'&('('('('('('('('*%,%-&-&-&.%.%1&1&3%3%4#5$5$6%6 #7 &6'6)6'6'6'6'6%6%4!4!5"5"5!5!6 "8 =! > > > > > > > ?!!?!!?!!> > ===> > > =<;;;========> > ?!?!@"@"@"A#F(F(F(F(F(F(F(F(I'J(J(J(K) K) L*!L*!L*!M+"N,#O-$P.%Q/&R0'R0'Q/&R0&R2%T5#S6$U9$X9$Y:%bB-fC-kG/qJ-wN.X2b7l21084257:;oUhS>jU@lWBnYDhV@hV@hXAiYBk[Dn^Go`IqcIraEsbDtcEudFwfHxgIxgIyhJxgIxgIxgIxgIxgIwfHwfHwfHxiJviIuhHtgGsfFreEqdDpcCqdDqdDqdDqdDqdDqdDqdDqdDnaApcCsfFviIwiLvhKtfIseHugLtfKtfLseKseKrdJrcLscL{eN|cMzaKw_Gu]CrZ@pX>oW=pX>nV>jQ;fM9bH7^D5[A4Z?4[>6[>8[>8\?9[@9\A:\A:]B;\C<]D=\E=\E=\E=[DXC>YD?YD?YD?XC>WB=VA9Q<7P;6O<6O=9L=8K<7I:5G83F72D50D50 !3"!1$ 1( /- 12"/7"19#0;!.9!.8 .3+0*)&&%"#   !#"#$%%"&#)%*&+%+%+%+%+*+*()'(&'%&#'#'$*#)"*!)'&%$********(((((((&$"""""""!!!!!!!!######## ! ! ! ! ! ! !                 !!"$%%!%! ##$$% % % ########&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!(!(!(!(!(!(!(!(!(!' &%%&' (!'"&!&!&!&!'")$*%)$)$)$)$)$)$)$)$,%,%,%-&0%0%0#1$1#2$3"3"4!5"7"7$6'6'6'6'6%6%6%6%6 #6 #6 "5!5!4 46=! > > > > > > > ?!!?!!?!!> > ===> > ==<<;;========> ?!?!?!@"A#A#A#F(F(F(F(F(F(F(F(I'I'I'J(K) K) K) L*!L*!L*!M+"N,#O-$P.%Q/&R0'Q/&R0&R2%T5#S6$U9$X9$Y:%`@+eB,jF.qJ-xO/Y3c8m334Ś<:7878=>BEGHIIIJJJMNRRVUYYZZY\``_]]]^^[[[[\\\\]]^_^``_bĔdʖg͗iϗhљj֜nܞkfaeikkljffdfjlnkknstspqqoprrpkgްeڰhذjذjկhӯeҰfִjظk޾qstwz{z{{xsokighqpnmoqsrqoqolhiiljhe޼c޼c߻efccݬ`֨]΢[ĜWVWXXWU{QuMqJmI}fG{aFw]BtZ?sY>tZ?w]By_Dz`Ex^Cw]Bx^C{aF|bG{aFx`FsZDpZCmW@lV?kW?lX@o[Cp\DiW?iW?hX?iY@jZAm]Dn`FoaFraEraCsbDtcEudFveGwfHwfHxgIxgIxgIxgIxgIyhJyhJyhJzkLyjKwhIvgHteFrcDpaBpaBrcDrcDrcDrcDrcDrcDrcDrcDsdEteFwhIxiJxiLwhKufIteHueKueKueLtdKtdKscJscLsaKzaM{`Ky^Ix^Gv\CtZAsY@rX?sYBrXAnS>jOXC>YD?YD?ZE@WB=WB=U@;T?:R=8Q<7P;6N;5O=9L=8K<7J;6H94G83E61E61 !3"!1$ 1( /- 12"/7"19#0=#0;#0:"05!-2,+(('$%!!  !#"##$&#'$*&+',&,&+%+%*)*)()'(&'%&$($(%*$*#+"*('&&)+++++++**)))((&""""""""        "$$## " " " ! ! ! ! ! ! !                 !!"$%%!%! ##$$% % % $$$$$$$$&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!(!(!(!(!(!(!(!(!(!' &%%&' (!&!&!&!&!'"(#(#)$)$)$)$)$)$)$)$)$+$,%,%-&/$0%0#0#0"0 2!2!3 3 6!6!5&5&5&5&5$5$5$5"5"5"5!5!5!5!5 7=! > > > > > > > ?!!?!!?!!> > =======<<<<> > > > > > > > ?!?!?!@"@"A#A#B$E'E'E'E'E'E'E'E'H&I'I'J(J(K) K) K) L*!L*!M+"N,#O-$P.%Q/&Q/&Q/&R0&R2%T5#S6$U9$X9$Y:%^>)c@*jF.rK.yP0Z4d9m336ɞ@ƛ?<<:8=@BEGIIJHHIILNQQVXYYZZY\__^]\\]^[[[[\\\\\]^^``a`Ócɕe͘fҘhՙg؜jޠonkhilmmlliihhjkmllpturopqrrsrpkg߱fܲjٱkزkֱjֲhճi׷lظm߿rttvxzzzzytqmjihqppopssrpmoomklmmlie߽dfkmffdڬ_ѥ\ǟYVXWVUR|QxMsJnJhI~dIz`Ew]Bw]By_D|bG~dI~dI|bGy_Dz`E|bG~dI}cH{cGv^Fs]Fq[DpZCo[Cp\Dr^Fs_GlZBlZBjZAjZAk[Bm]Dm_EoaFraEraCraCraCraCtcEudFveGxgIyhJyhJyhJziKziKziKziK|mN{lMyjKwhIteFrcDpaBo`ArcDrcDrcDrcDrcDrcDrcDrcDwhIxiJyjKyjKxiLwhKufIteHueKtdJtdKtdKscJrbIrbKsaKx_Kx]Jy]Hw\Gw[Eu[BuYAtZAuYCsYBqTBlQ>iL>cG9_A6\@5X;3X;5Y<6Y<6Y>7Y>7X?8X?8X?8XA9YB:YB:VB9UA8T@7S?6VAXC>YD?YD?YD?VA9Q<7P;6O:5M:4N<8L=8K<7J;6H94G83F72F72 !3"!1$ 1( /- 12"/7"19#0>$1<$1;#16".3-,))(%& %$"!!" ! !(%)&,(-)-'-',&+%)()()()(&'&'&)%)%*%*#+#+"*!)((!+!+!+!+!+!+!+!+))(('&&%""""""""!!!!!!!!##" ! !                     !!"$%%!%! ##$$% % % $$$$$$$$&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!(!(!(!(!(!(!(!(!(!' &%%&' (!% &!&!'"(#(#(#(#(#(#(#(#(#(#(#(#+$+"-".#.#/$0"1#1 1 1 245 5 5 5&5&5$5$5$5$5"5"2334 6! 7"!7"!:""=! > > > > > > > ?!!?!!?!!> > ===<<<<====> > > > > > > > ?!@"@"A#A#B$B$B$E'E'E'E'E'E'E'E'H&H&H&I'I'J(J(K) K) K) L*!M+"N,#O-$P.%P.%Q/&R0&R2%T5#S6$U9$X9$Y:%]=(c@*jF.sL/zQ1Z4d9l214ǜ@ǜ@>?>;@CEFFHHJHHJKMNPPUWYXZY[\^^\[Z[[\ZZZ[\]]]]^^`aa”cĔcȔbΖcҙdיfڛfiopolmnonmmjkkkkjlllotspmnotttrqmi޲iߴoܴo۵nڵn۶oڸpںoںostuvvxz{yxuromkjqpsstturmklmpopnolieehlnigeܱbө]ȢYVXQQOM}OzNuJpJjJfH|cEzaC{bD}dFhJjLiK~eG{bD{bD}dFfH~eG|dHyaIv`Hv`Hu_Gt`GuaHuaHvbIq`Fp_En^Dm]Cn^Do_EoaFpbGsbFraCq`Bq`Bq`BraCtcEudFyhJyhJziKziK{jL|kM|kM|kM}nO|mN{lMxiJvgHteFrcDqbCteFteFteFteFteFteFteFteFyjKyjKyjKyjKxiLwhKufIteHtdJtdJtdKscJrbIrbIrbKt_Jv[HwZHxYEvZEwXCuYCvX@tX@vWBsWAsTBnQ?lL?dG9bB7]?5X;3W<5W<5X=6X=6Y>7W>7W>7V?7W@8W@8VB9UA8T@7R>5Q=4U@;VAXC>XC>U@;T?:S>9R=8P;6O:5M83L93M;7M;7L:6K95J84I73I73H62 !3"!1$ 1( /- 12"/7"19#0?%2<$1;#17#/3-,))(%&!& %#"!" !*'+(-).*.(-',&+%)()()()(('&'&)&)'+%*%,#+#+"*"* *",",",",",",",", * *)('&&%""""""""""""""""$#""                       !!"$%%!%! ##$$% % % % % % % % % % % &!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!(!(!(!(!(!(!(!(!(!' &%%&' (!$% '"(#(#(#(#'"(#(#(#(#(#(#(#("*!+"-"-".#/"0"0 1 1 1245 5 6!4#4%4#4#4#4#4!4!1234 6! 7"!8#";#!=! > > > > > > > ?!!?!!?!!> > ===;;<<==> > ?!!?!!?!!?!!?!!?!!?!!?!@"@"@"A#B$B$B$C%D&D&D&D&D&D&D&D&G%H&H&H&I'J(J(J(J(K) L*!M+"N,#O-$P.%P.%Q/&R0&R2%T5#S6$U9$X9$Y:%]=(dA+kG/tM0zQ1Z4b7j0~-/Ø<ę=qR@oO@kK>fF;bA8]?7X;5W<5W<5X=6X=6W>7W>7W@8V?7W@8UA8UA8UA8T@7R>5Q=6T?:T?:T?:U@;U@;VA9R=8Q<7O:5N94L72K82L95K95J84J84I73H62H62H62 !3"!1$ 1( /- 12"/7"19#0>$1<$1;#16".3-,))(%& %$"""#!""#+(,).*/+/).(,&,&)')')'(')()()*'*'+&+%,%,%,#+#+#+%.%.%.%.%.%.%.%."+"+!* )(&%%""""""""$$$$$$$$$$#"     ! ! ! ! ! ! ! !                     !!"$% %!%! ##$$% % % % % % % % % % % &!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!(!(!(!(!(!(!(!(!(!' &%%&' (!%&(!)"*#)"(!(!(!(!(!(!(!(!(!(!,!,!- - /!/!0!1 1 245 67 7 6!4#4#4#4#4!4!4!4!3345 5 6! 7"9!=! > > > > > > > ?!?!?!> > ===;;;<=> > > ?!?!?!?!?!?!?!?"@"A#A#A#B$B$C%C%D&D&D&D&D&D&D&D&G%G%H&H&I'I'I'J(J(J(K) L*!M+"N,#O-$P.%Q/&R0&R2%T5#S6$U9$X9$Y:%_?*eB,lH0uN1{R2Y3a6h.{-/;;:;<jJ=fF;a@7\>6X;5X<8V=8W>9W>9X?:X?:W@:V?9UA:VB;VB;TA:S@9Q>7P=6R=8R=8R=8S>9S>9T?:T?:T?:S>9S>9R=8P;6N94M83L72J71J73I73H62H62H62G51G51G51 !3"!1$ 1( /- 12"/7"19#0>$1;#0:"06".3-,)('$%""!!#!%$%%&,)-*/+/+/).(-',&)')')')')()()*)*'+'+&-%,%,%,$,$,%.%.%.%.%.%.%.%.#,"+!* )(&%%""""""""%%%%%%%%%$#"     ! ! ! ! ! ! ! !                     !!"$% %"%# ##$$% % % % % % % % % % % &!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!(!(!(!(!(!(!(!(!(!' &%%&' (!%&(!*#*#*#(!' (!(!(!(!(!(!(!(,!,!,- . /01 225 57 7 8!8!6!4#4#4!4!4!4!4 6 "6! 5 5 5 5 46=!> > > > > > > ?!?!?!> > ===:;;<=> > ?!?!?!?!?!?!?!?!?"@"A#A#B$B$C%C%C%D&D&D&D&D&D&D&D&G%G%G%H&H&I'I'J(J(J(K) L*!M+"N,#O-$O-$Q/&R0&R2%T5#S6$U9$X9$Y:%_?*fC-mI1uN1{R2Y3`5g-{-09:79<;GFGFGFHIIKNNQQSUVUWWXXXZVWUTSTTUWWXZ[]^\^^abƖe͙gӜf՜eԗ`י^ݛ_`bfnrpnljjjijdhlnmjlmwyywtqrtqprsrpppܵpسmײl׵nڹrٻr׹pԶmݿvܿsݽrݽprtwvpppqqqppqty{}{yuhegkprqnmkgdccfea``۵`ֲ^Ѯ]ʪ_ƨ`\WPLOMzIsHkFhF~eF~fDfGkIoPsQmNiG|cDzb@|cD~fD~eF}fFhI}hI~iJ~iJ}jJ}jJ|iI|iIoN~nM{lKyjIxiHwhGwjHwjHxhGvfEscBqa@p`?rbAueDvfEyiHzjI{kJ|lK}mLoNpOpOoQoQnP~mO~mO}lN|kM|kM{jL{jL{jL{jL{jL{jL{jL{jLxgIxgIwfHveGveIwfJwfJxgKtcItcIsaIsaIr`Hr`Hq_It^IsXGuUFtTErSAqR>oPiI>eD;a@9\=8Y<8X<8W>9W>9X?:W@:XA;XA;UA:UA:VB;UB;UB;S@9R?8Q>7Q<7Q<7Q<7R=8R=8S>9S>9S>9S>9R=8Q<7P;6N94L72K61K61H51G51G51G51G51F40F40F40 2#"2&"3( /)-,)4.9#0>$1;#09!/4 ,0*)&%$!"$#  ! $%&()'$(%+',(-',&,&+%,(-),*,*,*,**+)*'+'+'-'-&-&-&-&-$+$+$+$+$+$+$+$+#*#*")")!(!( ' '!)!) ('&%$$$$$$$$$$""##"   ""!!                            !!""#"""!!!#$% % % % $$###$$% % &!&!'"'"&!&!&!'"'"(#(#(#(!(!(!(!(!(!(!(!' ' ' ' ' ' ' ' ********,!,!,!,!,!,!,!,!+,-. 01 1 233455687 7"5"4!4!3 3224 445 5 6!6!9!:;<<= = >!>!>!>!= = <<;;= = = = = = = = = = = = = = = = B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$E#E#F$F$G%G%H&H&K) K) J(K) L*!N,#O-$Q/&R0'S1'T4'V7%W:(Y=(]>)^?*^>)c@*jF.tM0|S3Z4^3a*s&274688BCEHIKJHIKMMMOPQSUVY[\ZWXQQOOPRTUTUVWXZ[[Z[_Ɣc̘fќh֝hٞf۝dfghhinonmlmkjjijmqronoorqttusrrqstrqpߴp޶q۴o۶rܷs۹rڹrغrغr׻qwut߿tutvutsrqqrstxyy{zvrojfhhmpnlnllnpmjdcb޹`ܸ`۸dطfӳfͱh^XRNL}KwFoDnGkGiGgCiGmIrPvRrPpLmKjFiGiEkIlJoMpOpOoNoNmLlK~kJpNsQvStQ}oLzlIylIzmJ{kIyiGvfDtdBtdBvfDyiG{kI|lJ|lJ}mK~nLoMpNqOrQqSqSpRoQoQnPmOmOoQoQpRpRnPmO~kM}jL{hJzgIyfHxeGvbGuaFt`Et`EuaHuaHvbJvbJuaIs_Gr]Hq[FtYHtWGrUEpSAnR=kO:iM8hL7kN:W>:W>:W>:W?;X@YD?WB=XC>XE?XE?VC=SB;P?8O<6Q<7R=8T?:U@;U@;T?:R=8Q<7P;6O:5M83L72K61L72L72M83J73K84K84K84J73H51F3/E2. 2#"2&"3( /*..+6!0:$1=#0:"/7-1)-''$%$"# %#! ! $%&'('$(%+',(-',&,&+%,(-).*-+-+,*++)*)+'+'-'-'-&-&-&-&-&-&-&-&-&-&-&-#*#*#*")")!(!(!("*"*!) ('&%$$$$$$$$$""##"!  """!!                            !!""#"""!!!#$% % % % $$###$$% % &!&!'"'"&!&!&!'"'"(#(#(#(!(!(!(!(!(!(!(!' ' ' ' ' ' ' ' ********,!,!,!,!,!,!,!,!,,-.01 22335566877!5"4!4!3322445 5 6!6!6!9!:<<= = >!>!>!>!>!= = <<;;= = = = = = = = = = = = = = = = B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$E#E#F$F$G%G%H&H&K) K) J(K) L*!N,#O-$Q/&R0'S1'T4'V7%W:(Y=(]>)^?*_?*dA+jF.sL/{R2Y3]2a*p(39488:AAEFIJIGKHJKLNPSSUXZZZXUVOOOOQTWXUUWXZ\]\[\Đ`Ȕb͘dқeכeٜeߞffhhgfjjghhkjkkjhlpoonmnqquvwuutrsqqqݵpݵpܵrٴpڵqٶrطrٸq׹qֺqֺqvۿuܿsܿstvuttsqqqstt{{zxwurpmjhimnnmpopopnhcb`޻aݻbۻfعgҵgβi`ZUQONyIsEoHlHiEhDjFnJsOvRqMpLoKnJmImInJpKqLqLqNqLqMpJoKoIrNuNwRuNqL|nGznH{oIzjFyiGvfDtdBtdBvfDyiGzjH~nL~nL~nLoMoMpNpNpNpPpRpRpRoQoQoQoQpRpRqSpRoQmOlN}jL{hJzgIyfHwdFuaFs_Dr^Cq]Br^Er^Es_Gt`Hs_Gr^Fq\Gq[FsWIrVHrUEoTCmP>jO:iM8gL7kNfJ>eG=bF;aC;_B:X@YD?XC>WD>WD>VC=TC!>!?">!>!= = <<;;= = = = = = = = = = = = = = = = B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$E#E#F$F$G%G%H&H&K) K) J(K) L*!N,#O-$Q/&R0'S1'T4'V7%W:(Y=(]>)^?*_?*dA+iE-rK.zQ1X2]2`+m'4:5877?@CDHIIHKHJKMOPSVXXYYYWTSMNOQSWY[VWX[]`a`^Ő^ȓa͕dїeՙeךdؙchfhgfegfddglnonmilmllknnppvyzwvuppp޳oܴo۴q۴q۴sٳrٳr״pֵp׶qշqչpչpھtٽsڼsڼs߽stvvssrrsvww{zvtrrqrnjhjmmmrsrtsngbb`߽cݾdݽhڻiӶjͳia[VSTQ}MvKoFmGkEjDlFoItNwQqKqKsMtNtNtNsMtMtMuMsNtLsMsKsMrJvOxOyRxNtMrH}qI}qIzjFyiEwgCueAueAwgCyiEzjFqMqMqMpLpLoKoKoMoOpRpRpRpRqSqSqSqSqSrTqSpRoQmO~kMzgIyfHxeGubDs_Dp\Ao[@nZ?mY@nZAp\Dq]Eq]Eq]Ep[FpZEqWHpVGpUDmSBkP=iPXC@XEAWD@UB>SA=R@8R=8S>9T?:T?:S>9R=8R=8P;6O:5M83L72K61L72L72M83K63K63K63K63J52H30F1.E0-1! 0%!2*"1/"34$1:%4<&39,4)/%)!& # $##$!& %###!%$%%&'$(%+',(-',&,&+%.)/*/+0,0,/+,,+++,*,*.*.(.(.(.(.*.*.*.*.*.*.*.*.'+'+&*&*%)%)%)$(%,#+#+!) (''&%%%%%%%%!"#$#"! !!!                        !!""#"""!!!#$% % % % $$###$$% % &!&!'"'"&!&!&!'"'"(#(#(#(!(!(!(!(!(!(!(!' ' ' ' ' ' ' ' ********,!,!,!,!,!,!,!--./0125 5557889987!5"4 4 33225 5 5 6!6!7"7":#; = = = >!?"?"?">!>!= = <<;;= = = = = = = = >!>!>!>!>!>!>!>!B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$E#E#F$F$G%G%H&H&K) K) J(K) L*!N,#O-$Q/&R0'S1'T4'V7%W:(Y=(]>)^?*`@+dA+iE-qJ-yP0W1\1`+i'~4:6:87=@@BCGHHIGJLMPTWXWXXVVSQPOPQSUXZ[WXZ]`cedǑbˑ_ΔdЖdԘd֙cטbטbߞffgfedfeffjprrpnlmnljjnooqx{}{wvm޳n۰lدmٲoڳr۴sٳrزqֳqղnԳnӵoӶpԸoչpؼs׻qغqٻrܼqtvutqqqtvww}ytrpqruqlhgjnnqqtvtpjfb޿bݾcܾdݿiؼiҷj̱j_[URTS}OwLpGnHmGlFnHqKuOwQrLtNwQzT{U{UySyRwPxPwOvNvNvNwOxPzQ{R|R{QyOwMuKtJ|mF{kGyiExhDxhDyiE{kG|lHtPsOsOrNpLoK~nJ~nLoOoQoQpRqSrTrTsUrTrTrTrTqSoQmOlNzgIyfHwdFtaCq]BnZ?lX=kWlX@nZBo[Co[CnYDoXFmVFlUEmSDiR@jP?fP;gN:dN9hO;eNR@

    * This class tests all the public methods in H5CompoundDS class. *

    * The test file contains the following objects. * *

     * 
     * 
     *         /dataset_byte            Dataset {50, 10}
     *         /dataset_comp            Dataset {50, 10}
     *         /dataset_enum            Dataset {50, 10}
     *         /dataset_float           Dataset {50, 10}
     *         /dataset_image           Dataset {50, 10}
     *         /dataset_int             Dataset {50, 10}
     *         /dataset_str             Dataset {50, 10}
     *         /g0                      Group
     *         /g0/dataset_comp         Dataset {50, 10}
     *         /g0/dataset_int          Dataset {50, 10}
     *         /g0/datatype_float       Type
     *         /g0/datatype_int         Type
     *         /g0/datatype_str         Type
     *         /g0/g00                  Group
     *         /g0/g00/dataset_float    Dataset {50, 10}
     *         /g0_attr                 Group
     * 
     * 
    * *@author Peter Cao, The HDF Group */ public class H5BugFixTest extends TestCase { private static final int NLOOPS = 10; private static final H5File H5FILE = new H5File(); private H5File testFile = null; /** * @param arg0 */ public H5BugFixTest(final String arg0) { super(arg0); } private static void collectGarbage() { try { System.gc(); Thread.sleep(100); System.runFinalization(); Thread.sleep(100); } catch (final Exception ex) { ex.printStackTrace(); } } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); testFile = (H5File) H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * The following program fails because dataset.init() does not reset the * selection of dataspace. *

    * The bug appears on hdf-java 2.4 beta04 or earlier version. It is fixed at * later version. * *

         * 1)  read the table cell (using dataset selection to select only that row of the table)
         *           2)  re-initialize the Dataset
         *           3)  call 'Dataset.clearData()'
         *           4)  call 'Dataset.getData()'
         *           5)  change the correct column/row **
         *           6)  call 'Dataset.write()'
         *           7)  close the file
         *           8)  reopen the file and read the table cell as in step 1
         *           9)  assert that the value has been changed and is correct
         *           This sequence of actions works correctly on the hdf-java library built for
         *           64-bit solaris that we received in August 2006.  On the latest (beta-d), This
         *           fails when attempting to change the value of the 1st and 4th rows (however, it
         *           works for the 0th row).
         * 
    *

    */ public final void testBug847() throws Exception { Vector data = null; final H5CompoundDS dset = (H5CompoundDS) testFile .get(H5TestFile.NAME_DATASET_COMPOUND); assertNotNull(dset); for (int loop = 0; loop < NLOOPS; loop++) { // read the whole dataset by default dset.init(); try { data = (Vector) dset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(data.size() > 0); // check the data values int[] ints = (int[]) data.get(0); float[] floats = (float[]) data.get(1); String[] strs = (String[]) data.get(2); assertNotNull(ints); assertNotNull(floats); assertNotNull(strs); for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(H5TestFile.DATA_INT[i], ints[i]); assertEquals(H5TestFile.DATA_FLOAT[i], floats[i], Float.MIN_VALUE); assertTrue(H5TestFile.DATA_STR[i].equals(strs[i])); } final int rank = dset.getRank(); final long[] dims = dset.getDims(); final long[] start = dset.getStartDims(); final long[] count = dset.getSelectedDims(); final int[] selectedIndex = dset.getSelectedIndex(); // read data row by row for (int i = 0; i < rank; i++) { start[i] = 0; count[i] = 1; } final int nrows = dset.getHeight(); for (int i = 0; i < nrows; i++) { dset.clearData(); dset.init(); // select one row only for (int j = 0; j < rank; j++) { count[j] = 1; } // select different rows start[0] = i; try { data = (Vector) dset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } ints = (int[]) data.get(0); floats = (float[]) data.get(1); strs = (String[]) data.get(2); assertNotNull(ints); assertNotNull(floats); assertNotNull(strs); assertEquals(H5TestFile.DATA_INT[i], ints[0]); assertEquals(H5TestFile.DATA_FLOAT[i], floats[0], Float.MIN_VALUE); assertTrue(H5TestFile.DATA_STR[i].equals(strs[0])); } // for (int i=0; i * The bug appears on hdf-java 2.4 beta05 or earlier version. It is fixed at * later version. * *

         * while (true) {
         *     H5File file = new H5File(H5TestFile.NAME_FILE_H5, H5File.READ);
         *     //file.open();
         *     file.get("/Table0");
         *     file.get("/Group0");
         * 
         *     int n = H5.H5Fget_obj_count(file.getFID(), HDF5Constants.H5F_OBJ_ALL);
         *     if (n > 1)
         *         System.out.println("*** Possible memory leak!!!");
         * 
         *     file.close();
         * }
         * 
    */ public final void testBug863() throws Exception { int nObjs = 0; // number of object left open Dataset dset = null; final String dnames[] = { H5TestFile.NAME_DATASET_CHAR, H5TestFile.NAME_DATASET_COMPOUND, H5TestFile.NAME_DATASET_COMPOUND_SUB, H5TestFile.NAME_DATASET_ENUM, H5TestFile.NAME_DATASET_FLOAT, H5TestFile.NAME_DATASET_IMAGE, H5TestFile.NAME_DATASET_INT, H5TestFile.NAME_DATASET_STR, H5TestFile.NAME_DATASET_INT_SUB, H5TestFile.NAME_DATASET_FLOAT_SUB_SUB }; // test two open options: open full tree or open individual object only for (int openOption = 0; openOption < 2; openOption++) { for (int i = 0; i < NLOOPS; i++) { nObjs = 0; final H5File file = new H5File(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); if (openOption == 0) { try { file.open(); // opent the full tree } catch (final Exception ex) { fail("file.open() failed. " + ex); } } try { // datasets for (int j = 0; j < dnames.length; j++) { dset = (Dataset) file.get(dnames[j]); dset.init(); final Object data = dset.getData(); dset.write(data); dset.getMetadata(); } // groups file.get(H5TestFile.NAME_GROUP); file.get(H5TestFile.NAME_GROUP_ATTR); file.get(H5TestFile.NAME_GROUP_SUB); // datatypes file.get(H5TestFile.NAME_DATATYPE_INT); file.get(H5TestFile.NAME_DATATYPE_FLOAT); file.get(H5TestFile.NAME_DATATYPE_STR); } catch (final Exception ex) { fail("file.get() failed. " + ex); } try { nObjs = H5.H5Fget_obj_count(file.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } assertTrue(nObjs <= 1); // file id should be the only this left // open } // for (int i=0; i * * @version 1.3.0 9/21/2006 * @author Peter X. Cao * */ public class TestH5Object { private final static String FILE_NAME = "TestH5Object.h5"; private final static String FILE_NAME2 = "../../TestH5Obejct2.h5"; private final static String NAME_GROUP = "/g0"; private final static String NAME_GROUP_ATTR = "/g0_attr"; private final static String NAME_GROUP_SUB = "/g0/g00"; private final static String NAME_DATASET_INT = "/dataset_int"; private final static String NAME_DATASET_FLOAT = "/dataset_float"; private final static String NAME_DATASET_CHAR = "/dataset_byte"; private final static String NAME_DATASET_STR = "/dataset_str"; private final static String NAME_DATASET_ENUM = "/dataset_enum"; private final static String NAME_DATASET_ATTR = "/dataset_with_attr"; private final static String NAME_DATASET_COMPOUND = "/comp_dataset"; private final static String NAME_DATASET_SUB = "/g0/dataset_int"; private final static String NAME_DATASET_SUB_SUB = "/g0/g00/dataset_float"; private final static H5File H5FILE = new H5File(); private final static long DIM1 = 50; private final static long DIM2 = 10; private final static long[] DIMs = {DIM1, DIM2}; private final static long[] CHUNKs = {DIM1/2, DIM2/2}; // private final static int RANK = 2; private final static int STR_LEN = 20; private final static int DIM_SIZE = (int)(DIM1*DIM2);; /* testing data */ private final static int[] DATA_INT = new int[DIM_SIZE]; private final static float[] DATA_FLOAT = new float[DIM_SIZE]; private final static byte[] DATA_BYTE = new byte[DIM_SIZE]; private final static String[] DATA_STR = new String[DIM_SIZE]; private final static int[] DATA_ENUM = new int[DIM_SIZE]; private final static Vector DATA_COMP = new Vector(3); private static PrintStream out = null; /** * Constructs an instance of TestH5Object. * @param out_stream the out stream for printing the test results. */ public TestH5Object(final PrintStream print_stream) { if (print_stream == null) { out = System.out; } else { out = print_stream; } for (int i = 0; i < DIM_SIZE; i++) { DATA_INT[i] = i; DATA_FLOAT[i] = i + i/100.0f; DATA_BYTE[i] = (byte)Math.IEEEremainder(i, 127); DATA_STR[i] = "str" + i; DATA_ENUM[i] = (int)Math.IEEEremainder(i, 2); } DATA_COMP.add(0, DATA_INT); DATA_COMP.add(1, DATA_FLOAT); DATA_COMP.add(2, DATA_STR); } private static final void passed(final String message) { out.println("PASSED:\t"+message); } private static final void failed(final String message, final Exception err, final H5File file) { out.println("FAILED***:\t"+message +"--"+err); try { file.close(); } catch (final Exception ex) {} } /** * Check if all the data values of two data buffers are the same * @param buf1 the first buffer to compare * @param buf2 the second buffer to compare * @return true if all the values equal; otherwise, returns false. */ private static final boolean dataEquals(final Object buf1, final Object buf2) { // array cannot be null if ((buf1 == null) || (buf2==null)) { return false; } // must be array if (!buf1.getClass().isArray() || !buf2.getClass().isArray()) { return false; } // must be the same kind of array final String cname = buf1.getClass().getName(); if (!cname.equals(buf2.getClass().getName())) { return false; } // must have the same size final int n = Array.getLength(buf1); if (n != Array.getLength(buf2)) { return false; } if (cname.equals("[I")) { final int[] data1 = (int[])buf1; final int[] data2 = (int[])buf2; for (int i = 0; i < n; i++) { if (data1[i] != data2[i]) { return false; } } } else if (cname.equals("[F")) { final float[] data1 = (float[])buf1; final float[] data2 = (float[])buf2; for (int i = 0; i < n; i++) { if (data1[i] != data2[i]) { return false; } } } else if (cname.equals("[B")) { final byte[] data1 = (byte[])buf1; final byte[] data2 = (byte[])buf2; for (int i = 0; i < n; i++) { if (data1[i] != data2[i]) { return false; } } } else if (cname.equals("[Ljava.lang.String;")) { final String[] data1 = (String[])buf1; final String[] data2 = (String[])buf2; for (int i = 0; i < n; i++) { if (!data1[i].equals(data2[i])) { return false; } } } else { return false; } return true; } /** * Create a test file. * * @param fname the name of the file to open * @return true if successful; otherwise returns false */ private static final H5File create_test_file(final String fname, String message) { H5File file=null; Group g0, g1, g00; message += "\tCreate a test file: "+fname; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); } catch (final Exception ex) { failed(message, ex, file); return null; } // create groups try { g0 = file.createGroup(NAME_GROUP, null); g1 = file.createGroup(NAME_GROUP_ATTR, null); g00 = file.createGroup(NAME_GROUP_SUB, null); final long[] attrDims = {1}; final String attrName = "Test attribute"; final String[] attrValue = {"Test for group attribute"}; final Datatype attrType = new H5Datatype(Datatype.CLASS_STRING, attrValue[0].length()+1, -1, -1); final Attribute attr = new Attribute(attrName, attrType, attrDims); attr.setValue(attrValue); g1.writeMetadata(attr); } catch (final Exception ex) { failed(message, ex, file); return null; } // create datasets try { file.createScalarDS(NAME_DATASET_INT, null, new H5Datatype(Datatype.CLASS_INTEGER, -1, -1, -1), DIMs, null, CHUNKs, 9, DATA_INT); file.createScalarDS(NAME_DATASET_FLOAT, null, new H5Datatype(Datatype.CLASS_FLOAT, -1, -1, -1), DIMs, null, CHUNKs, 9, DATA_FLOAT); file.createScalarDS(NAME_DATASET_CHAR, null, new H5Datatype(Datatype.CLASS_CHAR, -1, -1, -1), DIMs, null, CHUNKs, 9, DATA_BYTE); file.createScalarDS(NAME_DATASET_STR, null, new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1), DIMs, null, CHUNKs, 9, DATA_STR); file.createScalarDS(NAME_DATASET_ENUM, null, new H5Datatype(Datatype.CLASS_ENUM, -1, -1, -1), DIMs, null, CHUNKs, 9, DATA_ENUM); file.createScalarDS(NAME_DATASET_SUB, g0, new H5Datatype(Datatype.CLASS_INTEGER, -1, -1, -1), DIMs, null, CHUNKs, 9, DATA_INT); file.createScalarDS(NAME_DATASET_SUB_SUB, g00, new H5Datatype(Datatype.CLASS_FLOAT, -1, -1, -1), DIMs, null, CHUNKs, 9, DATA_FLOAT); file.createImage(NAME_DATASET_ATTR, null, new H5Datatype(Datatype.CLASS_INTEGER, 1, -1, -1), DIMs, null, CHUNKs, 9, 1, -1, DATA_BYTE); final Datatype[] mdtypes = {new H5Datatype(Datatype.CLASS_INTEGER, -1, -1, -1), new H5Datatype(Datatype.CLASS_FLOAT, -1, -1, -1), new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1)}; final String[] mnames = {"int", "float", "string"}; file.createCompoundDS(NAME_DATASET_COMPOUND, null, DIMs, null, CHUNKs, 9, mnames, mdtypes, null, DATA_COMP); } catch (final Exception ex) { failed(message, ex, file); return null; } try { file.close(); } catch (final Exception ex) {} return file; } /** * Test H5File create() function. * * @param fname the name of the file to create * @return zero if successful; otherwise returns one */ private int test_H5File_create(final String fname) { H5File file = null; String message = ""; message = "Create a new file -- new H5File()"; try { file = new H5File(fname, H5File.CREATE); file.open(); file.close(); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); message = "Create a new file -- H5File.create()"; try { file = (H5File)H5FILE.createFile(fname, FileFormat.FILE_CREATE_DELETE); file.open(); file.close(); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); message = "Create a new file -- H5File.createInstance()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); file.close(); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File open() function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5File_open(final String fname) { H5File file = null; String message = ""; message = "Testing open file with read/write access"; try { file = new H5File(fname, H5File.CREATE); file.open(); file.close(); } catch (final Exception ex) { failed(message, ex, file); return 1; } message = "Open file with READ-ONLY access -- H5File.createInstance()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.READ); file.close(); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); message = "Open file with WRITE access -- H5File.createInstance()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.WRITE); file.close(); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File open() function with relative file path. * The cwd may be changed at Dataset.read() by H5Dchdir_ext() * to make it work for external datasets. We need to set it * back before the file is closed/opened. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5File_open_relative_path(final String fname) { H5File file = null; String message = ""; message = "H5File open() function with relative file path"; if ((create_test_file(fname, message)) == null) { return 1; } try { // test open/close file and open/close dataset file = new H5File(fname, H5File.READ); Dataset dset = (Dataset)file.get(NAME_DATASET_ATTR); dset.getData(); file.close(); file = new H5File(fname, H5File.READ); dset = (Dataset)file.get(NAME_DATASET_ATTR); dset.getData(); file.close(); // test open file and open multiple datasets file = new H5File(fname, H5File.READ); dset = (Dataset)file.get(NAME_DATASET_ATTR); dset.getData(); dset = (Dataset)file.get(NAME_DATASET_COMPOUND); dset.getData(); dset = (Dataset)file.get(NAME_DATASET_SUB); dset.getData(); file.close(); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File createGroup() function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ @SuppressWarnings("unused") private int test_H5File_createGroup(final String fname) { H5File file = null; String message = ""; file = new H5File(fname); // create groups Group g0 = null; message = "Create a group at root -- H5Group.create()"; try { g0 = file.createGroup("/g0", null); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); Group g00 = null; message = "Create a group with absolute path -- H5Group.create()"; try { g00 = file.createGroup("g0/g00", null); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); Group g01 = null; message = "Create a group at non-root group -- H5Group.create()"; try { g01 = file.createGroup("/g0/g01/", g0); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File createDatatype() function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ @SuppressWarnings("unused") private int test_H5File_createDatatype(final String fname) { H5File file = null; String message = ""; final int N = 5; final int dtype_cls[] = {Datatype.CLASS_INTEGER, Datatype.CLASS_FLOAT, Datatype.CLASS_CHAR, Datatype.CLASS_STRING, Datatype.CLASS_ENUM}; final String dtype_names[] = {"INTEGER", "FLOAT", "CHAR", "STRING", "ENUM"}; final String msgs[] = { "H5File.createDatatype(..., "+dtype_names[0]+")", "H5File.createDatatype(..., "+dtype_names[1]+")", "H5File.createDatatype(..., "+dtype_names[2]+")", "H5File.createDatatype(..., "+dtype_names[3]+")", "H5File.createDatatype(..., "+dtype_names[4]+")"}; message = "Test creating named datatypes"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); } catch (final Exception ex) { failed(message, ex, file); return 1; } // create groups Datatype dtype = null; for (int i = 0; i < N; i++) { message = "Create a named datatype -- "+msgs[i]; try { dtype = file.createDatatype(dtype_cls[i],Datatype.NATIVE, Datatype.NATIVE, Datatype.NATIVE, dtype_names[i]); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); } try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File createScalarDS function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5File_createScalarDS(final String fname) { H5File file = null; String message = ""; Group pgroup = null; final int N = 5; final int dtype_cls[] = {Datatype.CLASS_INTEGER, Datatype.CLASS_FLOAT, Datatype.CLASS_CHAR, Datatype.CLASS_STRING, Datatype.CLASS_ENUM}; final int dtype_sizes[] = {-1, -1, 1, 80, -1}; final String names[] = {"INTEGER", "FLOAT", "CHAR", "STRING", "ENUM"}; message = "Test creating ScalarDS"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } final Object[] all_data = new Object[N]; all_data[0] = DATA_INT; all_data[1] = DATA_FLOAT; all_data[2] = DATA_BYTE; all_data[3] = DATA_STR; all_data[4] = DATA_ENUM; // create groups Datatype dtype = null; Dataset dset = null; Object data_read = null; for (int i = 0; i < N; i++) { message = "Create/read/write a H5ScalarDS -- H5ScalarDS.create ()"; try { dtype = new H5Datatype(dtype_cls[i], dtype_sizes[i], -1, -1); dset = file.createScalarDS(names[i], pgroup, dtype, DIMs, null, CHUNKs, 9, all_data[i]); } catch (final Exception ex) { failed(message, ex, file); return 1; } // test data values try { dset.init(); final long[] selectedDims = dset.getSelectedDims(); final long[] dims = dset.getDims(); final long[] starts = dset.getStartDims(); final int rank = dset.getRank(); // read all data for (int j = 0; j < rank; j++) { starts[j] = 0; selectedDims[j] = dims[j]; } data_read = dset.read(); } catch (final Exception ex) { failed(message, ex, file); return 1; } if ( !dataEquals(all_data[i], data_read) ) { failed(message, new HDF5LibraryException("Incorrect data values in file"), file); return 1; } passed(message); } try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File createLink function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5File_createLink(final String fname) { H5File file = null; String message = ""; Group pgroup = null; message = "Create a hard link -- H5File.createLink()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } final String gname = "Group"; Group grp = null; try { grp = file.createGroup(gname, null); } catch (final Exception ex) { failed(message, ex, file); return 1; } HObject hobj = null; try { hobj = file.createLink(pgroup, "link to "+gname, grp); } catch (final Exception ex) { failed(message, ex, file); return 1; } final long oid[] = grp.getOID(); if (!hobj.equalsOID(oid)) { failed(message, new HDF5LibraryException("link to the wrong object"), file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File createImage function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5File_createImage(final String fname) { H5File file = null; String message = ""; Group pgroup = null; message = "Ceate an image -- H5File.createImage()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } // create groups Datatype dtype = null; Dataset dset = null; Object data_read = null; try { dtype = new H5Datatype(Datatype.CLASS_INTEGER, 1, -1, -1); dset = file.createImage("Image", pgroup, dtype, DIMs, null, CHUNKs, 9, 1, -1, DATA_BYTE); } catch (final Exception ex) { failed(message, ex, file); return 1; } // test data value try { data_read = dset.read(); } catch (final Exception ex) { failed(message, ex, file); return 1; } if (!dataEquals(DATA_BYTE, data_read) ) { failed(message, new HDF5LibraryException("Incorrect data values in file"), file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File createCompoundDS function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5File_createCompoundDS(final String fname) { H5File file = null; String message = ""; Group pgroup = null; message = "Create/read/write a compound dataset -- H5CompoundDS.create()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } final Vector data = new Vector(); data.add(0, DATA_INT); data.add(1, DATA_FLOAT); data.add(2, DATA_STR); // create groups final Datatype[] mdtypes = new H5Datatype[3]; final String[] mnames = {"int", "float", "string"}; Dataset dset = null; try { mdtypes[0] = new H5Datatype(Datatype.CLASS_INTEGER, -1, -1, -1); mdtypes[1] = new H5Datatype(Datatype.CLASS_FLOAT, -1, -1, -1); mdtypes[2] = new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1); dset = file.createCompoundDS("/CompoundDS", pgroup, DIMs, null, CHUNKs, 9, mnames, mdtypes, null, data); } catch (final Exception ex) { failed(message, ex, file); return 1; } // test data values List data_read = null; try { data_read = (List)dset.read(); } catch (final Exception ex) { failed(message, ex, file); return 1; } if ( !dataEquals(DATA_INT, data_read.get(0)) || !dataEquals(DATA_FLOAT, data_read.get(1)) || !dataEquals(DATA_STR, data_read.get(2))) { failed(message, new HDF5LibraryException("Incorrect data values in file"), file); return 1; } // tests for subset final H5CompoundDS compDS = (H5CompoundDS)dset; int rank = compDS.getRank(); try { if (rank <= 0) { compDS.init(); } } catch (final Exception ex) {} rank = compDS.getRank(); // read only one column but all rows compDS.setMemberSelection(false); //unselect all members compDS.selectMember(1); // select the second column try { data_read = (List)dset.read(); } catch (final Exception ex) { failed(message, ex, file); return 1; } if (!dataEquals(DATA_FLOAT, data_read.get(0)) || (data_read.size() != 1)) { failed(message, new HDF5LibraryException("incorrect data values from file"), file); return 1; } // read only one row but all columns compDS.setMemberSelection(true); //select all members, it is default final int nmembers = compDS.getSelectedMemberCount(); final long[] count = compDS.getSelectedDims(); final long[] start = compDS.getStartDims(); for (int i = 0; i < rank; i++) { start[i] = 2; // start the third data point count[i] = 1; // select only one row (the third row) } try { data_read = (List)dset.read(); } catch (final Exception ex) { failed(message, ex, file); return 1; } if (nmembers != compDS.getMemberCount()) { failed(message, new HDF5LibraryException("incorrect members selection"), file); return 1; } for (int i = 0; i < nmembers; i++) { if (Array.getLength(data_read.get(i)) != 1) { failed(message, new HDF5LibraryException("incorrect row selection"), file); return 1; } } // create dataset at non root group Group g0 = null; try { g0 = file.createGroup("/gg0", null); } catch (final Exception ex) { failed(message, ex, file); return 1; } try { mdtypes[0] = new H5Datatype(Datatype.CLASS_INTEGER, -1, -1, -1); mdtypes[1] = new H5Datatype(Datatype.CLASS_FLOAT, -1, -1, -1); mdtypes[2] = new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1); dset = file.createCompoundDS("/g0/CompoundDS/", g0, DIMs, null, CHUNKs, 9, mnames, mdtypes, null, data); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File copy function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5File_copy(final String fname) { H5File file = null; String message = ""; Group pgroup = null; message = "Copy dataset, group and attributes -- H5File.copy()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } final int size = (int) (DIM1*DIM2); final byte[] bdata = new byte[size]; for (int i = 0; i < size; i++) { bdata[i] = (byte)Math.IEEEremainder(i, 127); } Group grp = null; Datatype dtype = null; Dataset dset = null; try { grp = file.createGroup("/Group", null); dtype = new H5Datatype(Datatype.CLASS_INTEGER, 1, -1, -1); dset = file.createImage("Dataset", pgroup, dtype, DIMs, null, CHUNKs, 9, 1, -1, bdata); } catch (final Exception ex) { failed(message, ex, file); return 1; } try { file.copy(dset, grp, null); file.copy(grp, pgroup, "~Group"); } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File getAttribute function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5File_getAttribute(final String fname) { H5File file = null; String message = ""; message = "Read/write attributes from a group/dataset"; if ((create_test_file(fname, message)) == null) { return 1; } try { file = new H5File(fname); final Dataset dset = (Dataset)file.get(NAME_DATASET_ATTR); final int did = dset.open(); List attrs = H5File.getAttribute(did); try { dset.close(did); } catch (final Exception ex2) {} if ((attrs == null) || (attrs.size() < 1)) { failed(message, new HDF5LibraryException("failed to read attributes from dataset"), file); return 1; } attrs.clear(); final Group grp = (Group)file.get(NAME_GROUP_ATTR); final int gid = grp.open(); attrs = H5File.getAttribute(gid); try { grp.close(gid); } catch (final Exception ex2) {} if ((attrs == null) || (attrs.size() < 1)) { failed(message, new HDF5LibraryException("failed to read attributes from group"), file); return 1; } } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5File getHObject() function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5File_getHObject(final String fname) { String message = ""; message = "Get a group for a given path -- H5File.getHObject()"; if ((create_test_file(fname, message)) == null) { return 1; } try { HObject obj = FileFormat.getHObject(fname, NAME_GROUP); if (obj == null) { failed(message, new HDF5Exception("Failed to get a group"), null); return 1; } try { obj.getFileFormat().close(); } catch (final Exception ex2) {} obj = FileFormat.getHObject(fname+"://"+NAME_GROUP_SUB); if (obj == null) { failed(message, new HDF5Exception("Failed to get a group"), null); return 1; } try { obj.getFileFormat().close(); } catch (final Exception ex2) {} } catch (final Exception ex) { failed(message, ex, null); return 1; } passed(message); message = "Get a ScalarDS for a given path -- H5File.getHObject()"; try { HObject obj = FileFormat.getHObject(fname, NAME_DATASET_INT); if (obj == null) { failed(message, new HDF5Exception("Failed to get a dataset"), null); return 1; } try { obj.getFileFormat().close(); } catch (final Exception ex2) {} obj = FileFormat.getHObject(fname+"://"+NAME_DATASET_FLOAT); if (obj == null) { failed(message, new HDF5Exception("Failed to get a dataset"), null); return 1; } try { obj.getFileFormat().close(); } catch (final Exception ex2) {} } catch (final Exception ex) { failed(message, ex, null); return 1; } passed(message); message = "Get a CompoundDS for a given path -- H5File.getHObject()"; try { final HObject obj = FileFormat.getHObject(fname, NAME_DATASET_COMPOUND); if (obj == null) { failed(message, new HDF5Exception("Failed to get a compound dataset"), null); return 1; } try { obj.getFileFormat().close(); } catch (final Exception ex2) {} } catch (final Exception ex) { failed(message, ex, null); return 1; } passed(message); return 0; } /** * Test HObject getFID() function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_HObject_getFID(final String fname) { H5File file = null; String message = ""; int fid = 0; Group pgroup = null; message = "Get file identifier -- Group.getFID(), Dataset.getFID()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); fid = file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) {failed(message, ex, file); return 1; } if (fid != pgroup.getFID()) { failed(message, new HDF5LibraryException("wrong object ID in group"), file); return 1; } Datatype dtype = null; Dataset dset = null; try { dtype = new H5Datatype(Datatype.CLASS_INTEGER, 1, -1, -1); dset = file.createScalarDS("Dataset", pgroup, dtype, DIMs, null, CHUNKs, 9, null); } catch (final Exception ex) { failed(message, ex, file); return 1; } if (fid != dset.getFID()) { failed(message, new HDF5LibraryException("wrong object ID in dataset"), file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test HObject getName() function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_HObject_getName(final String fname) { H5File file = null; String message = ""; int fid = 0; Group pgroup = null; message = "Get object name and path -- Group.getName(), Group.getPath()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); fid = file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } Group grp = null; try { grp = file.createGroup("/Group", null); } catch (final Exception ex) { failed(message, ex, file); return 1; } Group grp2 = null; try { grp2 = file.createGroup("/Group/Group2", grp); } catch (final Exception ex) { failed(message, ex, file); return 1; } if (!grp2.getName().endsWith("Group2")) { failed(message, new HDF5LibraryException("wrong name for the group"), file); return 1; } if (!grp2.getPath().endsWith("/Group/")) { failed(message, new HDF5LibraryException("wrong path for the group"), file); return 1; } if (!grp2.getFullName().endsWith("/Group/Group2")) { failed(message, new HDF5LibraryException("wrong full path for the group"), file); return 1; } Datatype dtype = null; Dataset dset = null; try { dtype = new H5Datatype(Datatype.CLASS_INTEGER, 1, -1, -1); dset = file.createScalarDS("Dataset", pgroup, dtype, DIMs, null, CHUNKs, 9, null); } catch (final Exception ex) { failed(message, ex, file); return 1; } if (!dset.getName().endsWith("Dataset")) { failed(message, new HDF5LibraryException("wrong name for the dataset"), file); return 1; } if (!dset.getPath().endsWith("/")) { failed(message, new HDF5LibraryException("wrong path for the dataset"), file); return 1; } if (!dset.getFullName().endsWith("/Dataset")) { failed(message, new HDF5LibraryException("wrong full path for the dataset"), file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test Group isRoot function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_Group_isRoot(final String fname) { H5File file = null; String message = ""; Group pgroup = null; message = "Check root group -- Group.isRoot()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } if (!pgroup.isRoot()) { failed(message, new HDF5LibraryException("failed to test root group"), file); return 1; } Group grp = null; try { grp = file.createGroup("/Group", null); } catch (final Exception ex) { failed(message, ex, file); return 1; } try { file.close(); } catch (final Exception ex) {} try { grp = (Group)file.get("/Group"); } catch (final Exception ex) { failed(message, ex, file); return 1; } if (grp.isRoot()) { failed(message, new HDF5LibraryException("failed to test non-root group"), file); return 1; } try { grp.getFileFormat().close(); } catch (final Exception ex) {} passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test Group getParent function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_Group_getParent(final String fname) { H5File file = null; String message = ""; Group pgroup = null; message = "Get parent group -- Group.getParent()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } if(pgroup.getParent() != null) { failed(message, new HDF5Exception("the parent of root group is not null"), file); return 1; } // create groups Group g0 = null; try { g0 = file.createGroup("/g0", pgroup); } catch (final Exception ex) { failed(message, ex, file); return 1; } if(g0.getParent() == null) { failed(message, new HDF5Exception("the parent of the group is null"), file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test Dataset byteToString function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_Dataset_byteToString(final String fname) { H5File file = null; String message = ""; Group pgroup = null; message = "Convert byte array to strings -- Dataset.byteToString()"; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } final String[] sdata = new String[(int)DIM1]; for (int i = 0; i < DIM1; i++) { sdata[i] = "str"+i; } // create groups Datatype dtype = null; Dataset dset = null; String[] sdata_read = null; byte[] bdata_read = null; final long[] dims = {DIM1}; byte[] bdata = null; try { dtype = new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1); dset = file.createScalarDS("String", pgroup, dtype, dims, null, null, -1, sdata); } catch (final Exception ex) { failed(message, ex, file); return 1; } // test data values try { dset.setConvertByteToString(false); bdata = dset.readBytes(); bdata_read = (byte[])dset.read(); sdata_read = Dataset.byteToString(bdata_read, STR_LEN); bdata_read = Dataset.stringToByte(sdata, STR_LEN); } catch (final Exception ex) { failed(message, ex, file); return 1; } if ( !dataEquals(bdata, bdata_read) ) { failed(message, new HDF5LibraryException("Incorrect data from stringToByte()"), file); return 1; } if ( !dataEquals(sdata, sdata_read) ) { failed(message, new HDF5LibraryException("Incorrect data from byteToString()"), file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test H5Datatype toNative() function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ @SuppressWarnings("unused") private int test_H5Datatype_toNative(final String fname) { H5File file = null; String message = ""; Group pgroup = null; Datatype dtype = null; int tid=-1, tid2=-1; try { file = (H5File)H5FILE.createInstance(fname, H5File.CREATE); file.open(); pgroup = (Group)file.get("/"); } catch (final Exception ex) { failed(message, ex, file); return 1; } message = "Decode/encode datatypes -- H5Datatype.toNative()"; try { dtype = file.createDatatype(Datatype.CLASS_INTEGER,-1, -1, -1); tid = dtype.toNative(); if (!H5.H5Tequal(tid, HDF5Constants.H5T_NATIVE_INT)) { failed(message, new HDF5Exception("Failed to convert native integer"), file); return 1; } } catch (final Exception ex) { failed(message, ex, file); return 1; } finally { try { H5.H5Tclose(tid); } catch (final Exception ex) {} } try { dtype = file.createDatatype(Datatype.CLASS_FLOAT,-1, -1, -1); tid = dtype.toNative(); if (!H5.H5Tequal(tid, HDF5Constants.H5T_NATIVE_FLOAT)) { failed(message, new HDF5Exception("Failed to convert native float"), file); return 1; } } catch (final Exception ex) { failed(message, ex, file); return 1; } finally { try { H5.H5Tclose(tid); } catch (final Exception ex) {} } try { dtype = file.createDatatype(Datatype.CLASS_CHAR, 1, -1, -1); tid = dtype.toNative(); if (!H5.H5Tequal(tid, HDF5Constants.H5T_NATIVE_CHAR)) { failed(message, new HDF5Exception("Failed to convert native char"), file); return 1; } } catch (final Exception ex) { failed(message, ex, file); return 1; } finally { try { H5.H5Tclose(tid); } catch (final Exception ex) {} } try { dtype = file.createDatatype(Datatype.CLASS_STRING, STR_LEN, -1, -1); tid = dtype.toNative(); tid2 = H5.H5Tcopy(HDF5Constants.H5T_C_S1); H5.H5Tset_size(tid2, STR_LEN); //H5.H5Tset_strpad(tid2, HDF5Constants.H5T_STR_NULLPAD); /* default is not NULL padding */ if (!H5.H5Tequal(tid, tid2)) { failed(message, new HDF5Exception("Failed to convert string"), file); return 1; } } catch (final Exception ex) { failed(message, ex, file); return 1;} finally { try { H5.H5Tclose(tid2); } catch (final Exception ex) {} try { H5.H5Tclose(tid); } catch (final Exception ex) {} } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Gets compound dataset information. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5CompoundDS_init(final String fname) { H5File file = null; String message = ""; message = "Get information from a compound dataset -- H5CompoundDS.init()"; if ((file = create_test_file(fname, message)) == null) { return 1; } try { final CompoundDS obj = (CompoundDS) file.get(NAME_DATASET_COMPOUND); if (obj == null) { failed(message, new HDF5Exception("Failed to get "+NAME_DATASET_COMPOUND), file); return 1; } obj.init(); final int nmembers = obj.getMemberCount(); final String[] mnames = obj.getMemberNames(); if ((nmembers <= 0) || (mnames == null) || (mnames.length != nmembers)) { failed(message, new HDF5Exception("Failed to get information from "+NAME_DATASET_COMPOUND), file); return 1; } try { obj.getFileFormat().close(); } catch (final Exception ex2) {} } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Updates scalar dataset values. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5ScalarDS_write(final String fname) { H5File file = null; String message = ""; message = "Updates scalar dataset values -- H5ScalarDS.write()"; if ((file = create_test_file(fname, message)) == null) { return 1; } final int temp_value = 99999; try { final ScalarDS obj = (ScalarDS) file.get(NAME_DATASET_INT); if (obj == null) { failed(message, new HDF5Exception("Failed to get "+NAME_DATASET_INT), file); return 1; } final int[] data_int1 = (int[])obj.getData(); if (data_int1 == null) { failed(message, new HDF5Exception("Failed to read data from "+NAME_DATASET_INT), file); try { obj.getFileFormat().close(); } catch (final Exception ex2) {} return 1; } data_int1[0] = data_int1[1] = data_int1[2] = data_int1[3] = temp_value; obj.write(); obj.clear(); final int[] data_int2 = (int[])obj.getData(); if (data_int2 == null) { failed(message, new HDF5Exception("Failed to read data from "+NAME_DATASET_INT), file); try { obj.getFileFormat().close(); } catch (final Exception ex2) {} return 1; } if ( !dataEquals(data_int1, data_int2) ) { failed(message, new HDF5LibraryException("Incorrect data values in file"), file); try { obj.getFileFormat().close(); } catch (final Exception ex2) {} return 1; } try { obj.getFileFormat().close(); } catch (final Exception ex2) {} } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Updates compound dataset values. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5CompoundDS_write(final String fname) { H5File file = null; String message = ""; message = "Updates compound dataset values -- H5CompoundDS.write()"; if ((file = create_test_file(fname, message)) == null) { return 1; } final int temp_value = 99999; try { final CompoundDS obj = (CompoundDS) file.get(NAME_DATASET_COMPOUND); if (obj == null) { failed(message, new HDF5Exception("Failed to get "+NAME_DATASET_COMPOUND), file); return 1; } final Vector buf1 = (Vector)obj.getData(); if (buf1 == null) { failed(message, new HDF5Exception("Failed to read data from "+NAME_DATASET_COMPOUND), file); try { obj.getFileFormat().close(); } catch (final Exception ex2) {} return 1; } final int[] data_int1 = (int[])buf1.get(0); data_int1[0] = data_int1[1] = data_int1[2] = data_int1[3] = temp_value; obj.write(); obj.clearData(); final Vector buf2 = (Vector)obj.getData(); if (buf2 == null) { failed(message, new HDF5Exception("Failed to read data from "+NAME_DATASET_COMPOUND), file); try { obj.getFileFormat().close(); } catch (final Exception ex2) {} return 1; } final int[] data_int2 = (int[])buf2.get(0); if ( !dataEquals(data_int1, data_int2) ) { failed(message, new HDF5LibraryException("Incorrect data values in file"), file); try { obj.getFileFormat().close(); } catch (final Exception ex2) {} return 1; } try { obj.getFileFormat().close(); } catch (final Exception ex2) {} } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Updates compound dataset values row by row (bug#847). * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_H5CompoundDS_write_row_by_row(final String fname) { List list = null; final int TEST_INT_VALUE = 999999999; long[] count, start, dims; int rank, nmembers, nrows = 1; H5File file = null; CompoundDS dset; String message = ""; message = "Updates compound dataset values row by row -- H5CompoundDS.write()"; if ((create_test_file(fname, message)) == null) { return 1; } try { for (int rowIdx = 0; rowIdx < nrows; rowIdx++) { // open the test file file = new H5File(fname, H5File.WRITE); file.open(); // retrieve the compound dataset dset = (CompoundDS)file.get(NAME_DATASET_COMPOUND); dset.init(); // get dataspace information rank = dset.getRank(); count = dset.getSelectedDims(); start = dset.getStartDims(); dims = dset.getDims(); nmembers = dset.getMemberCount(); nrows = (int)dims[0]; // select one row only for (int i = 0; i < rank; i++) { count[i] = 1; } // select different rows start[0] = rowIdx; // 1) read the table cell (using dataset selection to select only that row of the table) list = (List)dset.read(); // 2) re-initialize the Dataset dset.init(); // 3) call 'Dataset.clearData()' dset.clearData(); // 4) call 'Dataset.getData()' list = (List)dset.read(); // 5) change the correct column/row **, col0/row0 final int[] read_row_data = (int []) list.get(0); read_row_data[rowIdx] = TEST_INT_VALUE; // 6) call 'Dataset.write()' dset.write(list); // 7) close the file file.close(); // 8) reopen the file and read the table cell as in step 1 file.open(); // 9) assert that the value has been changed and is correct dset = (CompoundDS)file.get(NAME_DATASET_COMPOUND); dset.init(); rank = dset.getRank(); count = dset.getSelectedDims(); start = dset.getStartDims(); dims = dset.getDims(); nmembers = dset.getMemberCount(); for (int i = 0; i < rank; i++) { start[i] = 0; count[i] = 1; } list = (List)dset.read(); final int[] write_row_data = (int[]) list.get(0); if (write_row_data[0] != TEST_INT_VALUE) { failed(message, new HDF5LibraryException("Incorrect data values in file"), file); return 1; } file.close(); } } catch (final Exception ex) { failed(message, ex, file); return 1; } passed(message); return 0; } /** * Test read/re-read String datasets. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ private int test_HDF5ScalarDS_str(final String fname) { H5File file = null; final String message = "Test read/re-read String datasets"; if ((create_test_file(fname, message)) == null) { return 1; } file = new H5File(fname); try { final H5ScalarDS dataset = (H5ScalarDS)file.get(NAME_DATASET_STR); dataset.init(); final long[] start = dataset.getStartDims(); final long[] count = dataset.getSelectedDims(); start[0] = 0; count[0] = 1; dataset.getData(); dataset.init(); dataset.clearData(); dataset.getData(); } catch (final Exception ex ) { failed(message, ex, file); return 1; } passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } /** * Test ***func name*** function. * * @param fname the name of the file to open * @return zero if successful; otherwise returns one */ /* private int test_temp(final String fname) { final H5File file = null; final String message = "***********func name*********"; if ((file = create_test_file(fname, message)) == null) { return 1; } try { } catch (final Exception ex ) { failed(message, ex, file); return 1;} passed(message); try { file.close(); } catch (final Exception ex) {} return 0; } */ /***************************************************************************** * Main routine for the testing. Use "-f" to save the test result to a log file. * If "-f" flag is specified, the test results will printed to System.out. *

    * For example, "test.object.TestH5Object -f test.log" to save the test results * at file test.log. * @param args ****************************************************************************/ public static void main(final String[] args) { PrintStream printStream = null; int numOfFails = 0; final int n = args.length; if ((n > 1) && args[0].equals("-f")) { try { printStream = new PrintStream(new BufferedOutputStream( new FileOutputStream(args[1]))); } catch (final FileNotFoundException ex) { printStream = null; ex.printStackTrace(); } } final TestH5Object test = new TestH5Object(printStream); numOfFails += test.test_H5File_create(FILE_NAME); numOfFails += test.test_H5File_open(FILE_NAME); numOfFails += test.test_H5File_open_relative_path(FILE_NAME2); numOfFails += test.test_H5File_createGroup(FILE_NAME); numOfFails += test.test_H5File_createDatatype(FILE_NAME); numOfFails += test.test_H5File_createLink(FILE_NAME); numOfFails += test.test_H5File_createImage(FILE_NAME); numOfFails += test.test_H5File_createScalarDS(FILE_NAME); numOfFails += test.test_H5File_createCompoundDS(FILE_NAME); numOfFails += test.test_H5File_copy(FILE_NAME); numOfFails += test.test_H5File_getAttribute(FILE_NAME); numOfFails += test.test_H5File_getHObject(FILE_NAME); numOfFails += test.test_HObject_getFID(FILE_NAME); numOfFails += test.test_HObject_getName(FILE_NAME); numOfFails += test.test_Group_isRoot(FILE_NAME); numOfFails += test.test_Group_getParent(FILE_NAME); numOfFails += test.test_Dataset_byteToString(FILE_NAME); numOfFails += test.test_H5Datatype_toNative(FILE_NAME); numOfFails += test.test_H5CompoundDS_init(FILE_NAME); numOfFails += test.test_H5ScalarDS_write(FILE_NAME); numOfFails += test.test_H5CompoundDS_write(FILE_NAME); numOfFails += test.test_H5CompoundDS_write_row_by_row(FILE_NAME); numOfFails += test.test_HDF5ScalarDS_str(FILE_NAME); if (numOfFails <= 0) { TestH5Object.out.println("\nAll tests passed.\n\n"); } else if (numOfFails == 1) { TestH5Object.out.println("\n*** 1 test failed.\n\n"); } else { TestH5Object.out.println("\n*** "+numOfFails+" tests failed.\n\n"); } } } jhdf-2.9/test/object/misc/TestH5Table.sh.in0000644000175000017500000000303412050301057021357 0ustar sylvestresylvestre#!/bin/sh # Set up default variable values if not supplied by the user. # where the new builds exist HDFBLD_HOME=@abs_top_builddir@ export HDFBLD_HOME # where Java is installed (requires jdk1.4.x) JAVAPATH=@JAVABIN@ export JAVAPATH ############################################################################### # DO NOT MODIFY BELOW THIS LINE ############################################################################### rm TestH5Table.class CPATH=".:"$HDFBLD_HOME"/lib/jhdf5.jar:"$HDFBLD_HOME"/lib/jhdfobj.jar:"$HDFBLD_HOME"/lib/jhdf5obj.jar" TEST=/usr/bin/test if [ ! -x /usr/bin/test ] then TEST=`which test` fi if $TEST -z "$CLASSPATH"; then CLASSPATH="" fi CLASSPATH=$CPATH":"$CLASSPATH export CLASSPATH if $TEST -n "$JAVAPATH" ; then PATH=$JAVAPATH":"$PATH export PATH fi if $TEST -e /bin/uname; then os_name=`/bin/uname -s` elif $TEST -e /usr/bin/uname; then os_name=`/usr/bin/uname -s` else os_name=unknown fi case $os_name in SunOS) OS_NAME=solaris ;; Linux) OS_NAME=linux ;; IRIX*) OS_NAME=irix-6.5 ;; OSF1) OS_NAME=alpha ;; AIX) OS_NAME=aix ;; Darwin) OS_NAME=macosx ;; FreeBSD) OS_NAME=freebsd ;; *) echo "Unknown Operating System: HDF-Java may not work correctly" ;; esac $JAVAPATH/javac TestH5Table".java" (cd ../../..; $JAVAPATH/java -Xmx1024M -Djava.library.path=$HDFBLD_HOME"/lib/"$OS_NAME test.object.misc.TestH5Table $*) jhdf-2.9/test/object/misc/TestH5MemoryLeak.sh.in0000644000175000017500000000305312050301057022376 0ustar sylvestresylvestre#!/bin/sh # Set up default variable values if not supplied by the user. # where the new builds exist HDFBLD_HOME=@abs_top_builddir@ export HDFBLD_HOME # where Java is installed (requires jdk1.4.x) JAVAPATH=@JAVABIN@ export JAVAPATH ############################################################################### # DO NOT MODIFY BELOW THIS LINE ############################################################################### rm TestH5MemoryLeak.class CPATH=".:"$HDFBLD_HOME"/lib/jhdf5.jar:"$HDFBLD_HOME"/lib/jhdfobj.jar:"$HDFBLD_HOME"/lib/jhdf5obj.jar" TEST=/usr/bin/test if [ ! -x /usr/bin/test ] then TEST=`which test` fi if $TEST -z "$CLASSPATH"; then CLASSPATH="" fi CLASSPATH=$CPATH":"$CLASSPATH export CLASSPATH if $TEST -n "$JAVAPATH" ; then PATH=$JAVAPATH":"$PATH export PATH fi if $TEST -e /bin/uname; then os_name=`/bin/uname -s` elif $TEST -e /usr/bin/uname; then os_name=`/usr/bin/uname -s` else os_name=unknown fi case $os_name in SunOS) OS_NAME=solaris ;; Linux) OS_NAME=linux ;; IRIX*) OS_NAME=irix-6.5 ;; OSF1) OS_NAME=alpha ;; AIX) OS_NAME=aix ;; Darwin) OS_NAME=macosx ;; FreeBSD) OS_NAME=freebsd ;; *) echo "Unknown Operating System: HDF-Java may not work correctly" ;; esac $JAVAPATH/javac TestH5MemoryLeak".java" (cd ../../..; $JAVAPATH/java -Xmx1024M -Djava.library.path=$HDFBLD_HOME"/lib/"$OS_NAME test.object.misc.TestH5MemoryLeak $*) jhdf-2.9/test/object/misc/Makefile.in0000644000175000017500000000353412050301057020404 0ustar sylvestresylvestre#/**************************************************************************** # * NCSA HDF * # * National Comptational Science Alliance * # * University of Illinois at Urbana-Champaign * # * 605 E. Springfield, Champaign IL 61820 * # * * # * For conditions of distribution and use, see the accompanying * # * hdf-java/COPYING file. * # * * # ****************************************************************************/ TOP = ../../.. DIR = test/object/misc JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ JAVADOC_FLAGS = -version -author SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@:$(TOP)/lib JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ #make this relative to the source root... LIBDIR=$(JH45INSTALLDIR)/lib BINDIR=$(JH45INSTALLDIR)/bin DOCDIR= $(JH45INSTALLDIR)/docs UGDIR= $(JH45INSTALLDIR)/UsersGuide CLASS_DIR=$(TOP)/lib CP="$(CLASSPATH):$(CLASS_DIR):. " CURRENTDIR = . JAR_DIR=$(CLASS_DIR) OUT_DIR=. .SUFFIXES: .java .class .java.class: $(JAVAC) -classpath $(CLASSPATH) $< all: testh4file testh5file chmod u+x runtests.sh testh4file: TestH4File.class chmod u+x testh4file.sh testh5file: TestH5File.class chmod u+x testh5file.sh runtests: all chmod u+x runtests.sh check: all ./TestH5Object.sh check-memory-leak: ./TestH5MemoryLeak.sh clean: $(RM) -f *.class $(RM) -f *.hdf $(RM) -f *.h5 jhdf-2.9/test/object/misc/CMakeLists.txt0000644000175000017500000002416712050543761021116 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_TEST_OBJECT_MISC Java) SET(CMAKE_VERBOSE_MAKEFILE 1) INCLUDE_DIRECTORIES( ${JAVA_NCSA_HDF_HDF4_BINARY_DIR} ${JAVA_NCSA_HDF_HDF5_BINARY_DIR} ${JAVA_NCSA_HDF_OBJECT_BINARY_DIR} ${HDFJAVA_LIB_DIR} ) ########################################################################### # TestH5Object ########################################################################### SET (CMAKE_JAVA_INCLUDE_PATH ${HDFJAVA_OBJECT_JARS}) FILE (WRITE ${PROJECT_BINARY_DIR}/TestH5Object_Manifest.txt "Main-Class: test.object.misc.TestH5Object " ) ADD_JAR (TestH5Object ${PROJECT_BINARY_DIR}/TestH5Object_Manifest.txt TestH5Object.java) GET_TARGET_PROPERTY(TestH5Object_JAR_FILE TestH5Object JAR_FILE) ADD_DEPENDENCIES (TestH5Object ${HDFJAVA_NCSA_H5_LIB_TARGET}) IF (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ";") ELSE (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ":") ENDIF(WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_CLASSPATH ".") FOREACH (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH}) SET(CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}") ENDFOREACH(CMAKE_INCLUDE_PATH) SET (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${TestH5Object_JAR_FILE}") ADD_TEST ( NAME TESTH5OBJECT-object-misc COMMAND "${CMAKE_COMMAND}" -D "TEST_TESTER=${CMAKE_Java_RUNTIME}" -D "TEST_CLASSPATH:STRING=${CMAKE_JAVA_CLASSPATH}" -D "TEST_ARGS:STRING=" -D "TEST_PROGRAM=test.object.misc.TestH5Object" -D "TEST_LIBRARY_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" -D "TEST_FOLDER=${HDFJAVA_TEST_OBJECT_MISC_BINARY_DIR}" -D "TEST_OUTPUT=TestH5Object.out" -D "TEST_EXPECT=0" -D "TEST_REFERENCE=TestH5Object.txt" -D "TEST_SKIP_COMPARE=TRUE" -P "${HDFJAVA_RESOURCES_DIR}/runTest.cmake" ) ########################################################################### # TestH5Table ########################################################################### FILE (WRITE ${PROJECT_BINARY_DIR}/TestH5Table_Manifest.txt "Main-Class: test.object.misc.TestH5Table " ) ADD_JAR (TestH5Table ${PROJECT_BINARY_DIR}/TestH5Table_Manifest.txt TestH5Table.java) GET_TARGET_PROPERTY(TestH5Table_JAR_FILE TestH5Table JAR_FILE) ADD_DEPENDENCIES (TestH5Table ${HDFJAVA_NCSA_H5_LIB_TARGET}) IF (HDFJAVA_TEST_H5TABLE) IF (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ";") ELSE (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ":") ENDIF(WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_CLASSPATH ".") FOREACH (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH}) SET(CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}") ENDFOREACH(CMAKE_INCLUDE_PATH) SET (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${TestH5Table_JAR_FILE}") ADD_TEST ( NAME TESTH5TABLE-object-misc COMMAND "${CMAKE_COMMAND}" -D "TEST_TESTER=${CMAKE_Java_RUNTIME}" -D "TEST_CLASSPATH:STRING=${CMAKE_JAVA_CLASSPATH}" -D "TEST_ARGS:STRING=" -D "TEST_PROGRAM=test.object.misc.TestH5Table" -D "TEST_LIBRARY_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" -D "TEST_FOLDER=${HDFJAVA_TEST_OBJECT_MISC_BINARY_DIR}" -D "TEST_OUTPUT=TestH5Table.out" -D "TEST_EXPECT=0" -D "TEST_REFERENCE=TestH5Table.txt" -D "TEST_SKIP_COMPARE=TRUE" -P "${HDFJAVA_RESOURCES_DIR}/runTest.cmake" ) ENDIF (HDFJAVA_TEST_H5TABLE) ########################################################################### # TestDebugHDF ########################################################################### FILE (WRITE ${PROJECT_BINARY_DIR}/TestDebugHDF_Manifest.txt "Main-Class: test.object.misc.DebugHDF " ) ADD_JAR (TestDebugHDF ${PROJECT_BINARY_DIR}/TestDebugHDF_Manifest.txt DebugHDF.java) GET_TARGET_PROPERTY(TestDebugHDF_JAR_FILE TestDebugHDF JAR_FILE) ADD_DEPENDENCIES (TestDebugHDF ${HDFJAVA_NCSA_H5_LIB_TARGET}) IF (HDFJAVA_TEST_DEBUGHDF) IF (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ";") ELSE (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ":") ENDIF(WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_CLASSPATH ".") FOREACH (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH}) SET(CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}") ENDFOREACH(CMAKE_INCLUDE_PATH) SET (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${TestDebugHDF_JAR_FILE}") ADD_TEST ( NAME TESTDEBUGHDF-object-misc COMMAND "${CMAKE_COMMAND}" -D "TEST_TESTER=${CMAKE_Java_RUNTIME}" -D "TEST_CLASSPATH:STRING=${CMAKE_JAVA_CLASSPATH}" -D "TEST_ARGS:STRING=" -D "TEST_PROGRAM=test.object.misc.DebugHDF" -D "TEST_LIBRARY_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" -D "TEST_FOLDER=${HDFJAVA_TEST_OBJECT_MISC_BINARY_DIR}" -D "TEST_OUTPUT=DebugHDF.out" -D "TEST_EXPECT=0" -D "TEST_REFERENCE=DebugHDF.txt" -D "TEST_SKIP_COMPARE=TRUE" -P "${HDFJAVA_RESOURCES_DIR}/runTest.cmake" ) ENDIF (HDFJAVA_TEST_DEBUGHDF) ########################################################################### # TestH5File ########################################################################### FILE (WRITE ${PROJECT_BINARY_DIR}/TestH5File_Manifest.txt "Main-Class: test.object.misc.TestH5File " ) ADD_JAR (TestH5File ${PROJECT_BINARY_DIR}/TestH5File_Manifest.txt TestH5File.java) GET_TARGET_PROPERTY(TestH5File_JAR_FILE TestH5File JAR_FILE) ADD_DEPENDENCIES (TestH5File ${HDFJAVA_NCSA_H5_LIB_TARGET}) IF (HDFJAVA_TEST_H5FILE) IF (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ";") ELSE (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ":") ENDIF(WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_CLASSPATH ".") FOREACH (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH}) SET(CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}") ENDFOREACH(CMAKE_INCLUDE_PATH) SET (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${TestH5File_JAR_FILE}") ADD_TEST ( NAME TESTH5FILE-object-misc COMMAND "${CMAKE_COMMAND}" -D "TEST_TESTER=${CMAKE_Java_RUNTIME}" -D "TEST_CLASSPATH:STRING=${CMAKE_JAVA_CLASSPATH}" -D "TEST_ARGS:STRING=" -D "TEST_PROGRAM=test.object.misc.TestH5File" -D "TEST_LIBRARY_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" -D "TEST_FOLDER=${HDFJAVA_TEST_OBJECT_MISC_BINARY_DIR}" -D "TEST_OUTPUT=TestH5File.out" -D "TEST_EXPECT=0" -D "TEST_REFERENCE=TestH5File.txt" -D "TEST_SKIP_COMPARE=TRUE" -P "${HDFJAVA_RESOURCES_DIR}/runTest.cmake" ) ENDIF (HDFJAVA_TEST_H5FILE) ########################################################################### # TestH5MemoryLeak ########################################################################### FILE (WRITE ${PROJECT_BINARY_DIR}/TestH5MemoryLeak_Manifest.txt "Main-Class: test.object.misc.TestH5MemoryLeak " ) ADD_JAR (TestH5MemoryLeak ${PROJECT_BINARY_DIR}/TestH5MemoryLeak_Manifest.txt TestH5MemoryLeak.java) GET_TARGET_PROPERTY(TestH5MemoryLeak_JAR_FILE TestH5MemoryLeak JAR_FILE) ADD_DEPENDENCIES (TestH5MemoryLeak ${HDFJAVA_NCSA_H5_LIB_TARGET}) IF (HDFJAVA_TEST_MEMORYLEAK) IF (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ";") ELSE (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ":") ENDIF(WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_CLASSPATH ".") FOREACH (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH}) SET(CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}") ENDFOREACH(CMAKE_INCLUDE_PATH) SET (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${TestH5MemoryLeak_JAR_FILE}") ADD_TEST ( NAME TESTMEMORYLEAK-object-misc COMMAND "${CMAKE_COMMAND}" -D "TEST_TESTER=${CMAKE_Java_RUNTIME}" -D "TEST_CLASSPATH:STRING=${CMAKE_JAVA_CLASSPATH}" -D "TEST_ARGS:STRING=" -D "TEST_PROGRAM=test.object.misc.TestH5MemoryLeak" -D "TEST_LIBRARY_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" -D "TEST_FOLDER=${HDFJAVA_TEST_OBJECT_MISC_BINARY_DIR}" -D "TEST_OUTPUT=TestH5MemoryLeak.out" -D "TEST_EXPECT=0" -D "TEST_REFERENCE=TestH5MemoryLeak.txt" -D "TEST_SKIP_COMPARE=TRUE" -P "${HDFJAVA_RESOURCES_DIR}/runTest.cmake" ) ENDIF (HDFJAVA_TEST_MEMORYLEAK) ########################################################################### # TestH4File ########################################################################### FILE (WRITE ${PROJECT_BINARY_DIR}/TestH4File_Manifest.txt "Main-Class: test.object.misc.TestH4File " ) ADD_JAR (TestH4File ${PROJECT_BINARY_DIR}/TestH4File_Manifest.txt TestH4File.java) GET_TARGET_PROPERTY(TestH4File_JAR_FILE TestH4File JAR_FILE) ADD_DEPENDENCIES (TestH4File ${HDFJAVA_NCSA_H4_LIB_TARGET}) IF (HDFJAVA_TEST_H4FILE) IF (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ";") ELSE (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ":") ENDIF(WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_CLASSPATH ".") FOREACH (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH}) SET(CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}") ENDFOREACH(CMAKE_INCLUDE_PATH) SET (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${TestH4File_JAR_FILE}") ADD_TEST ( NAME TESTH4FILE-object-misc COMMAND "${CMAKE_COMMAND}" -D "TEST_TESTER=${CMAKE_Java_RUNTIME}" -D "TEST_CLASSPATH:STRING=${CMAKE_JAVA_CLASSPATH}" -D "TEST_ARGS:STRING=" -D "TEST_PROGRAM=test.object.misc.TestH4File" -D "TEST_LIBRARY_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" -D "TEST_FOLDER=${HDFJAVA_TEST_OBJECT_MISC_BINARY_DIR}" -D "TEST_OUTPUT=TestH4File.out" -D "TEST_EXPECT=0" -D "TEST_REFERENCE=TestH4File.txt" -D "TEST_SKIP_COMPARE=TRUE" -P "${HDFJAVA_RESOURCES_DIR}/runTest.cmake" ) ENDIF (HDFJAVA_TEST_H4FILE) jhdf-2.9/test/object/misc/DebugHDF.java0000644000175000017500000044145412050301057020561 0ustar sylvestresylvestrepackage test.object.misc; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Array; import java.lang.reflect.Method; import java.text.DecimalFormat; import java.util.Arrays; import java.util.BitSet; import java.util.HashMap; import java.util.List; import java.util.StringTokenizer; import java.util.Vector; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFArray; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.structs.H5O_info_t; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.h4.H4File; import ncsa.hdf.object.h5.H5CompoundDS; import ncsa.hdf.object.h5.H5Datatype; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5Group; import ncsa.hdf.object.h5.H5ScalarDS; public class DebugHDF { public static void main(final String[] args) { try { int[] libversion = {0, 0, 0}; H5.H5get_libversion(libversion); System.out.println(libversion[0]+"."+libversion[1]+"."+libversion[2]); } catch (Exception ex) {ex.printStackTrace();} // try { create_debug_file();} catch(Exception ex) {} // try { createStrDataset( "G:\\temp\\H5DatasetCreate.h5"); } catch(Exception ex) {} // try { createDataset( "E:\\temp\\H5DatasetCreate.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { testchunkchche(); } catch (Exception ex) {ex.printStackTrace();} // try { TestHDFcompound(); } catch (Exception ex) {ex.printStackTrace();} // try { TestHDFdelete( "E:\\temp\\H5DatasetDelete.h5"); } catch(Exception ex) {ex.printStackTrace();}/ // try { TestHDFcomment( "E:\\temp\\H5DatasetComment.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestHDFgenotype( "E:\\temp\\genotypes_chr22_CEU.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestHDFvector( "E:\\temp\\TestVector.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { testSizeof(); } catch(Exception ex) {ex.printStackTrace();} // try { testSDgetchunkinfo("E:\\temp\\MOD021KM.A2006016.0942.hdf"); } catch(Exception ex) {ex.printStackTrace();} // try { testEnum("E:\\temp\\MOD021KM.A2006016.0942.hdf"); } catch(Exception ex) {ex.printStackTrace();} // try { testHDF5OpenClose(); } catch(Exception ex) {ex.printStackTrace();} // try { testHDF5Write("E:\\temp\\TestHDF5Write.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestHDF5Misc("E:\\hdf-files\\TestHDF5Misc.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestHDF5Get("E:\\hdf-files\\TestHDF5Get.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestHDF5Copy("d:\\hdf-files\\hdf5_test.h5", "/arrays/Vdata with mixed types"); } catch(Exception ex) {ex.printStackTrace();} // try { TestHDF5Copy("d:\\hdf-files\\hdf5_test.h5", "/arrays"); } catch(Exception ex) {ex.printStackTrace();} // try { TestHDF5Copy("d:\\hdf-files\\hdf5_test.h5", "/datatypes/H5T_NATIVE_INT"); } catch(Exception ex) {ex.printStackTrace();} // try { testGetObjID(); } catch(Exception ex) {ex.printStackTrace();} // try { testFillValue( "E:\\temp\\TestFillValue.h5"); } catch(Exception ex) {} // try { TestGetOneRow("E:\\hdf-files\\hdf5_test.h5", "/arrays/Vdata with mixed types", 0); } catch(Exception ex) {ex.printStackTrace();} // try { TestGetOneRow("E:\\hdf-files\\HDF5FileDAOTest.h5", "/Group0/1/Table0"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5OpenClose("TestH5Object.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { checkMemory(); } catch(Exception ex) {ex.printStackTrace();} // try { testCompressedStrings("G:\\temp\\test.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { testCreateLongPath("G:\\temp\\test_hdf5_5_group_levels.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5Bug847("d:\\hdf-files\\h5bug847.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5ReadChunk("d:\\hdf-files\\ExampleHDF5.hdf5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5Bug863("d:\\hdf-files\\bug863.h5"); } catch(final Exception ex) {ex.printStackTrace();} // try { checkMemory(); } catch(Exception ex) {ex.printStackTrace();} // try { testConvertFromUnsignedC();} catch(Exception ex) {ex.printStackTrace();} // try { TestH5ReadPerf("d:\\hdf-files\\ushort_8kx8k_fast_order.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5ReadPerf("d:\\hdf-files\\ushort_8kx8k_fast_order.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5WriteFloats("g:\\temp\\t.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5Vlen("g:\\temp\\t.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5Array("g:\\temp\\t.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5DreadNIO("d:\\hdf-files\\ushort_8kx8k_fast_order.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestH5Compound2000Fields("g:\\temp\\h5comp2k.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestMemoryLeakOpenClose("D:\\hdf-files\\SAFNWC_MSG2_TPW__200807281015_CoMd.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { testTofwerkReaderBug1213("D:\\hdf-files\\bug1213_GCxGC_dummyData.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { testTofwerkReaderBug1213("D:\\hdf-files\\bug1213_GCxGC_dummyData_chunk100x200.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { testTofwerkReaderBug1213("G:\\Projects\\Java\\Release\\hdfview_release_test_files\\bug1213_GCxGC_dummyData_chunk10x20.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestMemoryLeak("D:\\hdf-files\\debug_memory_leak.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestBEAttr("G:\\temp\\TestBEAttr.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestVlenRead("d:\\hdf-files\\test_vlen.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { launchBrowser("http://www.armchairgeneral.com/tactics-101-021-intelligence-preparation-of-the-battlefield-in-urban-operations.htm"); } catch(Exception ex) {ex.printStackTrace();} // try { launchBrowser("G:\\Projects\\ERDC\\Data\\Hetereogenous_Objects\\Events_Intel-Report.pdf"); } catch(Exception ex) {ex.printStackTrace();} // try { launchBrowser("G:\\Projects\\ERDC\\Data\\Hetereogenous_Objects\\IPB_URL-Reference.txt"); } catch(Exception ex) {ex.printStackTrace();} // try { launchBrowser("G:\\Projects\\ERDC\\Data\\Hetereogenous_Objects\\Recon_Immersive-Video.avi"); } catch(Exception ex) {ex.printStackTrace();} // try { launchBrowser("G:\\Projects\\ERDC\\Data\\Hetereogenous_Objects\\Situation_Weather-XLS.xls"); } catch(Exception ex) {ex.printStackTrace();} // try { launchBrowser("G:\\Projects\\ERDC\\Data\\Hetereogenous_Objects\\Software_External-Link.txt"); } catch(Exception ex) {ex.printStackTrace();} // try { TestVlen("d:\\hdf-files\\test_vlen.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestPinning("G:\\Projects\\Rosetta\\debug\\test_pinning.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { createDataset("g:\\temp\\testDataset.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { TestVlen("d:\\hdf-files\\test_vlen.h5", FileFormat.WRITE); } catch(Exception ex) {ex.printStackTrace();} // try { TestVlen("d:\\hdf-files\\test_vlen_org.h5", FileFormat.READ); } catch(Exception ex) {ex.printStackTrace();} // try { TestVlen("g:\\temp\\test_vlen.h5", FileFormat.WRITE); } catch(Exception ex) {ex.printStackTrace();} // TestBit64(); // TestBitmask(); // TestBinaryWrite(1, 1); // TestBinaryWrite(9, 1); // TestBinaryWrite(15, 1); // TestBinaryWrite(127, 2); // TestBinaryWrite(2147483647, 2); // TestBinaryWrite(2147483647, 4); // TestBinaryWrite(9123456789123456789L, 8); // // try { TestBug1523("G:\\Projects\\HUGS\\data\\testfile02.h5.corrupt"); } catch(Exception ex) {ex.printStackTrace();} // try { TestBug1523("G:\\Projects\\HUGS\\data\\testfile02.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { createINF("G:\\temp\\inf.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { createNaN_INF("G:\\temp\\nan_inf.h5"); } catch(Exception ex) {ex.printStackTrace();} // try { testStrings("G:\\temp\\strs.h5"); } catch(Exception ex) {ex.printStackTrace();} // testVariableArity("null argument", null); // testVariableArity("no argument"); // testVariableArity("1 argument", 1); // testVariableArity("2 argument", 1,"string"); // testVariableArity("3 argument", 1,"string",2.59); // try { readDatatype(); } catch(Exception ex) {ex.printStackTrace();} // try { readTextFile("G:\\temp\\vlarsizes.txt"); } catch(Exception ex) {ex.printStackTrace();} // try {processa8apis(); } catch (Exception ex) {} // try {convertByte2Long(); } catch (Exception ex) {ex.printStackTrace();} // try {testH5IO("G:\\temp\\test.h5"); } catch (Exception ex) {ex.printStackTrace();} // try {testH5Core("G:\\temp\\test.h5"); } catch (Exception ex) {ex.printStackTrace();} // try {test1Dstrings("G:\\temp\\test.h5"); } catch (Exception ex) {ex.printStackTrace();} // try {testUpdateAttr("G:\\temp\\test.h5"); } catch (Exception ex) {ex.printStackTrace();} // try {testCreateVlenStr("G:\\temp\\test.h5"); } catch (Exception ex) {ex.printStackTrace();} // try {testH5TconvertStr(); } catch (Exception ex) {ex.printStackTrace();} // try {testH5DeleteDS("g:\\temp\\strs.h5"); } catch (Exception ex) {ex.printStackTrace();} // try {testExtendData("g:\\temp\\extended.h5", "dset", 1000, 1500); } catch (Exception ex) {ex.printStackTrace();} // try {createNestedcompound("g:\\temp\\nested_cmp.h5", "dset"); } catch (Exception ex) {ex.printStackTrace();} // try { testH5Vlen("G:\\temp\\str.h5") ; } catch (Exception ex) {ex.printStackTrace();} // try { testH5VlenObj("G:\\temp\\str2.h5") ; } catch (Exception ex) {ex.printStackTrace();} // try { testH5VlenAttr("G:\\temp\\vlen_str_attr.h5") ; } catch (Exception ex) {ex.printStackTrace();} // try {testRefData("g:\\temp\\refs.h5", "refs"); } catch (Exception ex) {ex.printStackTrace();} // try {testH5WriteDouble("g:\\temp\\double.h5"); } catch (Exception ex) {ex.printStackTrace();} // try {testGroupMemoryLeak("G:\\temp\\mem_leak.h5"); } catch (Exception ex) {ex.printStackTrace();} // try { testH5OflushCrash("G:\\temp\\H5Oflush_crash.h5"); } catch (Exception ex) {ex.printStackTrace();} // testPrintData(); //try { testObjReadData("g:\\temp\\dset.h5", "dset"); } catch (Exception ex) {ex.printStackTrace();} //try { testH5FileGet("g:\\temp\\dset.h5", "/dset/"); } catch (Exception ex) {ex.printStackTrace();} // try { // String fname = "g:\\temp\\dset.h5"; // new File(fname).delete(); // clean up existing file // // for (int i=0; i<10; i++) // testCreateDS(fname, "dset"+i); // // } catch (Exception ex) {ex.printStackTrace();} // try { testH5Write2D("g:\\temp\\dset.h5"); } catch (Exception ex) {ex.printStackTrace();} try { testHDF4("g:\\temp\\test_hdf4.hdf"); } catch (Exception ex) {ex.printStackTrace();} } public static void testRefData(String fname, String dname)throws Exception { int size = 10; long dims[] = {size}; long[] maxdims = {HDF5Constants.H5S_UNLIMITED}; byte[][] ref_buf = new byte[2][8]; float data[] = new float[size]; for (int i=0; i"Lon" tid_tmp = H5.H5Tcreate(HDF5Constants.H5T_COMPOUND, 8); H5.H5Tinsert(tid_tmp, "Lon", 0, HDF5Constants.H5T_NATIVE_DOUBLE); int tid_tmp_nested = H5.H5Tcreate(HDF5Constants.H5T_COMPOUND, 8); H5.H5Tinsert(tid_tmp_nested, "location", 0, tid_tmp); H5.H5Dwrite(did, tid_tmp_nested, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, lonData); H5.H5Tclose(tid_tmp_nested); H5.H5Tclose(tid_tmp); // write the second field of the nested compound, "location"->"Lat" tid_tmp = H5.H5Tcreate(HDF5Constants.H5T_COMPOUND, 8); H5.H5Tinsert(tid_tmp, "Lat", 0, HDF5Constants.H5T_NATIVE_DOUBLE); tid_tmp_nested = H5.H5Tcreate(HDF5Constants.H5T_COMPOUND, 8); H5.H5Tinsert(tid_tmp_nested, "location", 0, tid_tmp); H5.H5Dwrite(did, tid_tmp_nested, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, latData); H5.H5Tclose(tid_tmp_nested); H5.H5Tclose(tid_tmp); H5.H5Tclose(tid); H5.H5Tclose(tid_nested); H5.H5Sclose(sid); H5.H5Dclose(did); H5.H5Fclose(fid); } public static void testExtendData(String fname, String dname, int size, int newSize)throws Exception { long dims[] = {size}; long[] maxdims = {HDF5Constants.H5S_UNLIMITED}; long newDims[] = {newSize}; int extended = newSize - size; if (extended<=0) return; // nothing to extended float data[] = new float[size]; for (int i=0; i= 0) && (type_id >= 0) && (dataspace_id >= 0)) dataset_id = H5.H5Dcreate(file_id, dname, type_id, dataspace_id, HDF5Constants.H5P_DEFAULT); } catch (Exception e) { e.printStackTrace(); } // Write the data to the dataset. try { if ((dataset_id >= 0) && (type_id >= 0)) H5.H5DwriteString(dataset_id, type_id, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, strData); } catch (Exception e) { e.printStackTrace(); } // Write the data to the dataset. try { if ((dataset_id >= 0) && (type_id >= 0)) { String[] buf = new String[strData.length]; H5.H5Dread(dataset_id, H5.H5Dget_type(dataset_id), HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, buf); for (int i =0; i= 0) H5.H5Dclose(dataset_id); } catch (Exception e) { e.printStackTrace(); } // Terminate access to the data space. try { if (dataspace_id >= 0) H5.H5Sclose(dataspace_id); } catch (Exception e) { e.printStackTrace(); } // Terminate access to the file type. try { if (type_id >= 0) H5.H5Tclose(type_id); } catch (Exception e) { e.printStackTrace(); } // Close the file. try { if (file_id >= 0) H5.H5Fclose(file_id); } catch (Exception e) { e.printStackTrace(); } } private static void testUpdateAttr(String fname) throws Exception { int data[] = {1,2,3,4,5,6}; long[] dims = {data.length}; String dname = "/dset"; // create a new file and a new dataset H5File file = new H5File(fname, FileFormat.CREATE); Datatype dtype = file.createDatatype(Datatype.CLASS_INTEGER, 4, Datatype.NATIVE, Datatype.NATIVE); Dataset dataset = file.createScalarDS (dname, null, dtype, dims, null, null, 0, data); // create and write an attribute to the dataset long[] attrDims = {2}; int[] attrValue = {0, 10000}; Attribute attr = new Attribute("range", dtype, attrDims); attr.setValue(attrValue); // set the attribute value dataset.writeMetadata(attr); // close the file file.close(); // open the file with read and write access file = new H5File(fname, FileFormat.WRITE); // retrieve the dataset and attribute dataset = (Dataset)file.get(dname); attr = (Attribute)dataset.getMetadata().get(0); // change the attribute value if (attr!=null) { attrValue[0] = 100; attr.setValue(attrValue); dataset.writeMetadata(attr); } // close file resource file.close(); } public static void test1DExtendStrings(String fname) throws Exception { //row count of my dataset int rowCount = 5; //max string length int maxStringLength = 5; //buffer of test data to write String[] data = {"12345","12345","12345","12345","12345"}; byte[][] buffer = new byte[5][5]; for(int i=0; i0) { idx = line.indexOf(' '); idx2 = line.indexOf('('); newAPIs[nNew++] = line.substring(idx+1, idx2+1); } line = in_new18.readLine(); } idx = 0; for (int i=0; i0 || allAPIs[i].indexOf("*op_data")>0) isFunc = 1; line = isFunc+ "\t"+ isNew+ "\t"+ allAPIs[i].substring(0, idx) + "\t" +apiName; out.println(line); } in_new18.close(); in_all18.close(); out.close(); } public static void readTextFile(String fname) throws Exception { BufferedReader in = new BufferedReader(new FileReader(fname)); String line = in.readLine(); StringTokenizer st = new StringTokenizer(line, ",") ; int n = st.countTokens(); PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fname+".out"))); while(st.hasMoreTokens()) { out.print(st.nextToken()); out.println(); } in.close(); out.close(); } public static void writeDatatype() throws Exception{ String fname = "g:\\temp\\t1.h5"; long[] dims0D = {1}; // retrieve an instance of H5File FileFormat fileFormat = FileFormat .getFileFormat(FileFormat.FILE_TYPE_HDF5); if (fileFormat == null) { System.err.println("Cannot find HDF5 FileFormat."); return; } // create a new file with a given file name. H5File testFile = (H5File) fileFormat.create(fname); if (testFile == null) { System.err.println("Failed to create file:" + fname); return; } // open the file and retrieve the root group testFile.open(); H5Group root = (H5Group) ((javax.swing.tree.DefaultMutableTreeNode) testFile .getRootNode()).getUserObject(); /** add an Attribute */ Datatype attrType = testFile.createDatatype( Datatype.CLASS_INTEGER, 4, Datatype.NATIVE, Datatype.NATIVE); Attribute attr = new Attribute("attribut int", attrType,dims0D); int[] attrValue = {15}; // attribute value attr.setValue(attrValue); // set the attribute value root.writeMetadata(attr); // close file resource testFile.close(); } private static void readDatatype() throws Exception { String fname = "g:\\temp\\t1.h5"; // retrieve an instance of H5File FileFormat fileFormat = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); if (fileFormat == null) { System.err.println("Cannot find HDF5 FileFormat."); return; } // open the file with read and write access FileFormat testFile = fileFormat.open(fname, FileFormat.READ); if (testFile == null) { System.err.println("Failed to open file: "+fname); return; } // open the file and retrieve the file structure testFile.open(); Group root = (Group)((javax.swing.tree.DefaultMutableTreeNode)testFile.getRootNode()).getUserObject(); /** read Attribute */ Attribute attr = (Attribute)root.getMetadata().get(0); //System.out.println(attr); attr.getName(); // -> attribute int //System.out.println(attr.getName()); attr.getValue(); // -> [15] //System.out.println(attr.getValue()); attr.getType(); // -> null... // System.out.println(attr.getType()); } private static final void testVariableArity(String desc, Object... args) { System.out.print(desc+":\t"); if (args == null) { System.out.println("null args"); return; } if (args.length == 0) { System.out.println("no argument."); return; } for (int i=0; i=0; i--) { switch (hex[i]) { case 0: sb.append("0000"); break; case 1: sb.append("0001"); break; case 2: sb.append("0010"); break; case 3: sb.append("0011"); break; case 4: sb.append("0100"); break; case 5: sb.append("0101"); break; case 6: sb.append("0110"); break; case 7: sb.append("0111"); break; case 8: sb.append("1000"); break; case 9: sb.append("1001"); break; case 10: sb.append("1010"); break; case 11: sb.append("1011"); break; case 12: sb.append("1100"); break; case 13: sb.append("1101"); break; case 14: sb.append("1110"); break; case 15: sb.append("1111"); break; } } System.out.println(sb); return sb.toString(); } private static final void TestBitmask() { int bmask=0, value = 0; BitSet theMask = new BitSet(8); theMask.set(0); System.out.println(theMask.cardinality()); theMask.set(7); System.out.println(theMask.cardinality()); for (int i=0; i<8; i++) { if (theMask.get(i)) bmask += 1<ArrayElements().. * @param fname the file that contains datasets of int8, int16, int32, int64, * float, and double. * @throws Exception */ private static final void TestPinning(String fname) throws Exception { Object data; String dnames[] = {"bytes", "shorts", "ints", "longs", "floats", "doubles"}; Dataset dsets[] = new Dataset[dnames.length]; H5File h5file = new H5File(fname); // test_pinning.h5 try { h5file.open(); } catch (Exception ex) { ex.printStackTrace(); return; } for (int i=0; i 1 ? selectionCount[1] : 1)}; Object theData = H5Datatype.allocateArray(nativeDatatype, (int)lsize[0]); H5.H5Sselect_hyperslab(fsid, HDF5Constants.H5S_SELECT_SET, selectionStart, selectionStride, selectionCount, null ); H5.H5Dread( did, nativeDatatype, msid, fsid, HDF5Constants.H5P_DEFAULT, theData); H5.H5Tclose(tid); H5.H5Tclose(nativeDatatype); H5.H5Sclose(msid); H5.H5Sclose(fsid); ds.close(did); o = theData; } catch( Exception exc ) { throw new IOException(exc.toString()); } } return o; } private static void testBEAttr(String fname) throws Exception { long[] dims2D = {20, 10}; // retrieve an instance of H5File FileFormat fileFormat = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); if (fileFormat == null) { System.err.println("Cannot find HDF5 FileFormat."); return; } // create a test file. H5File testFile = (H5File)fileFormat.create(fname); if (testFile == null) { System.err.println("Failed to create file:"+fname); return; } testFile.open(); Group root = (Group)((javax.swing.tree.DefaultMutableTreeNode)testFile.getRootNode()).getUserObject(); int[] dataIn = new int[20*10]; for (int i=0; i<20; i++) { for (int j=0; j<10; j++) { dataIn[i*10+j] = i*100+j; } } Datatype dtype = testFile.createDatatype( Datatype.CLASS_INTEGER, 4, Datatype.ORDER_BE, Datatype.NATIVE); Dataset dataset = testFile.createScalarDS ("2D 32-bit integer 20x10", root, dtype, dims2D, null, null, 0, dataIn); testFile.close(); // open the file with read and write access testFile = (H5File)fileFormat.open(fname, FileFormat.WRITE); if (testFile == null) { System.err.println("Failed to open file: "+fname); return; } // open the file and retrieve the file structure testFile.open(); root = (H5Group)((javax.swing.tree.DefaultMutableTreeNode)testFile.getRootNode()).getUserObject(); // retrieve athe dataset "2D 32-bit integer 20x10" dataset = (Dataset)root.getMemberList().get(0); // create 2D 32-bit (4 bytes) integer dataset of 20 by 10 long[] attrDims = {2}; // 1D of size two int[] attrValue = {0, 10000}; // attribute value // create a attribute of 1D integer of size two Attribute attr = new Attribute("data range", dtype, attrDims); attr.setValue(attrValue); // set the attribute value // attach the attribute to the dataset dataset.writeMetadata(attr); // read the attribute into memory List attrList = dataset.getMetadata(); attr = (Attribute)attrList.get(0); // print out attribute value System.out.println( attr.toString() ); System.out.println( attr.toString(" ") ); // close file resource testFile.close(); } private static void testMemoryLeak(String fname) throws Exception { /* a list of objects: char, compound, enum, float32, float64, image, * int16, int32, int64, int8, str, uchar, uint16, uint32, uint8 */ H5File testFile = null; Dataset dset = null; testFile = new H5File(fname, H5File.READ); dset = (Dataset)testFile.get("/char"); System.out.println(dset); testFile.close(); System.out.println("DONE!!!"); } private static void testTofwerkReaderBug1213 (final String filename) throws IOException { Object data = null; String gname = "/TimingData"; String dname = "/TimingData/BufTimes"; //String gname = "/PeakData"; //String dname = "/PeakData/PeakData"; // retrieve an instance of H5File FileFormat h5FileFormat = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); H5File h5File = null; if (h5FileFormat == null) { throw new IOException("Cannot find HDF5 FileFormat."); } try { File file = new File(filename); System.out.println("Can Read?: " + file.canRead()); // open the file with read and write access h5File = (H5File) h5FileFormat.createInstance(file.getPath(), FileFormat.READ); h5File.open(); if (h5File == null) { throw new IOException("Failed to open file: "+file.getPath()); } // open the file and retrieve the file structure Group root = (Group)((javax.swing.tree.DefaultMutableTreeNode)h5File.getRootNode()).getUserObject(); java.util.List rootMembers = root.getMemberList(); java.util.List rootAttributes =root.getMetadata(); Group timingDataGroup = null; for(int i = 0; i < rootMembers.size(); i++) { Group curGrp = (Group)rootMembers.get(i); if (curGrp.getFullName().equals(gname)) { timingDataGroup = curGrp; break; } } java.util.List timingMembers = timingDataGroup.getMemberList(); Dataset dataset = null; for(int i = 0; i < timingMembers.size(); i++) { Dataset curSet = (Dataset)timingMembers.get(i); if (curSet.getFullName().equals(dname)) { dataset = curSet; break; } } dataset.init(); long[] start = dataset.getStartDims(); // the off set of the selection start[0] = 0; start[1] = 0; // crash here data = dataset.read(); h5File.close(); } catch (Exception e) { throw new IOException("Unhandled exception: " + e + ": " + e.getLocalizedMessage()); } System.out.println("Exiting successfully."); } private static void testMemoryLeakOpenClose(String fname) throws Exception { H5File testFile = null; while(true) { testFile = new H5File(fname, H5File.READ); testFile.open(); testFile.getRootNode(); try { Thread.sleep(100); } catch (Exception ex) {;} testFile.close(); } } private static void testH5Compound2000Fields(final String filename) throws Exception { int ncols = 12; FileFormat fileFormat = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); H5File file = (H5File) fileFormat.create(filename); file.open(); Group root = (Group) ((javax.swing.tree.DefaultMutableTreeNode) file.getRootNode()).getUserObject(); int[] memRanks = new int[ncols]; int[][] memDims = new int[ncols][1]; String name = "comp2k"; long[] dims = {32}; String[] memberNames = new String[ncols]; Datatype[] memberDatatypes = new Datatype[ncols]; int[] memberRanks = new int[ncols]; int[][] memberDims = new int[ncols][1]; for (int i = 0; i < ncols; i++) { memberNames[i] = "m"+i; memberDatatypes[i] = new H5Datatype(Datatype.CLASS_INTEGER, 1, -1, -1); memberRanks[i] = 1; memDims[i][0] = 1; } H5CompoundDS dset = null; try { dset = (H5CompoundDS)H5CompoundDS.create( name, root, dims, memberNames, memberDatatypes, memberRanks, memberDims); } catch (final Exception ex) { ex.printStackTrace(); } file.close(); } private static void testH5DreadNIO(final String filename) throws Exception { final String dname = "8kx8k"; final int NLOOPS = 20; final H5File file = new H5File(filename, H5File.READ); file.open(); H5ScalarDS dset = (H5ScalarDS)file.get(dname); dset.init(); int rank = dset.getRank(); long[] dims = dset.getDims(); long[] start = dset.getStartDims(); long[] count = dset.getSelectedDims(); for (int i=0; i *

  1. byte[] int8 = {-1, -128, 127, 0}; *
  2. short[] int16 = {-1, -32768, 32767, 0}; *
  3. int[] int32 = {-1, -2147483648, 2147483647, 0}; * * Expected values *
      *
    • short[] uint8 = {255, 128, 127, 0}; *
    • int[] uint16 = {65535, 32768, 32767, 0}; *
    • long[] uint32 = {4294967295L, 2147483648L, 2147483647, 0}; *
    */ public final static void testConvertFromUnsignedC() { byte[] int8 = {-1, -128, 127, 0}; short[] int16 = {-1, -32768, 32767, 0}; int[] int32 = {-1, -2147483648, 2147483647, 0}; short[] uint8 = {255, 128, 127, 0}; int[] uint16 = {65535, 32768, 32767, 0}; long[] uint32 = {4294967295L, 2147483648L, 2147483647, 0}; short[] expected8 = (short[])Dataset.convertFromUnsignedC(int8, null); if (!(Arrays.equals(expected8, uint8))) { System.out.println("testConvertFromUnsignedC failed."); } int[] expected16 = (int[])Dataset.convertFromUnsignedC(int16, null); if (!(Arrays.equals(expected16, uint16))) { System.out.println("testConvertFromUnsignedC failed."); } long[] expected32 = (long[])Dataset.convertFromUnsignedC(int32, null); if (!(Arrays.equals(expected32, uint32))) { System.out.println("testConvertFromUnsignedC failed."); } } private static void testH5ReadChunk(final String filename) throws Exception { final String dnames[] = { "chunk1000x1000", "chunk100x1000", "chunk1x1000", "chunk50x50", "nochunk"}; final H5File file = new H5File(filename, H5File.READ); file.open(); for (int i=0; i1) { System.out.println("*** Possible memory leak!!!"); } file.close(); } } private static void testH5Bug847(final String filename) throws Exception { List list=null; final int TEST_INT_VALUE = 999999999; long[] count, start, dims; int rank, nmembers, nrows=1; H5File file; CompoundDS dset; String NAME_DATASET_COMPOUND = "/comp_dataset"; // create a test file create_test_file(filename); for (int rowIdx=0; rowIdx 0) { H5.H5Pset_deflate(plist, gzip); } } final int did = H5.H5Dcreate(file.getFID(), "/1D compound Strings", tid, sid, plist); try {H5.H5Pclose(plist);} catch (final Exception ex) {}; try {H5.H5Tclose(tid);} catch (final Exception ex) {}; try {H5.H5Sclose(sid);} catch (final Exception ex) {}; try {H5.H5Dclose(did);} catch (final Exception ex) {}; final H5CompoundDS dset = new H5CompoundDS(file, "1D compound Strings", "/", null); dset.init(); final long selected[] = dset.getSelectedDims(); selected[0] = dims[0]; dset.write(comp_data); // create 1D string compound dataset using hdf-java 2.4 file.createCompoundDS("/1D compound Strings2", null, dims, null, chunks, gzip, mnames, mdtypes, null, comp_data); // create 1D string scalar dataset using using hdf-java 2.3 or 2.4 file.createScalarDS("/1D scalar strings", null, strType, dims, null, chunks, gzip, strs); try { file.close(); } catch (final Exception ex) {} } private static void collectGarbage() { try { System.gc(); Thread.sleep(15); System.runFinalization(); Thread.sleep(15); } catch (final Exception ex){ ex.printStackTrace(); } } public static void checkMemory() throws Exception { final int _SIZE = 5000000; final Object[] array = new Object[_SIZE]; collectGarbage(); long totalMem = Runtime.getRuntime().totalMemory(); for (int i = 0; i < _SIZE; i++) { array[i] = new Object(); } long freeMem = Runtime.getRuntime().freeMemory(); long difference = ( totalMem - freeMem ) / _SIZE; System.out.println( difference + " \tbytes/object" ); collectGarbage(); totalMem = Runtime.getRuntime().totalMemory(); for (int i = 0; i < _SIZE; i++) { array[i] = new String(String.valueOf(i)); } freeMem = Runtime.getRuntime().freeMemory(); difference = ( totalMem - freeMem ) / _SIZE; System.out.println( difference + " \tbytes/String" ); } private static void testH5OpenClose(final String filename) throws Exception { int loop = 1000000; create_test_file(filename); final H5File file = new H5File(filename, H5File.READ); while (loop-- > 0) { file.open(); file.close(); } } private static void testGetOneRow (final String filename, final String objName) throws Exception { List data=null; // Get the source dataset final H5File file = new H5File(filename, H5File.READ); file.open(); final CompoundDS dset = (CompoundDS)file.get(objName); int rank = dset.getRank(); try { if (rank<=0) { dset.init(); } } catch (final Exception ex) {} rank = dset.getRank(); // 1) I read a table from an H5 file; and use the 'select subset' code // to get only one row's worth of data before calling 'getData() final long[] count = dset.getSelectedDims(); final long[] start = dset.getStartDims(); final long[] dims = dset.getDims(); for (int i=0; i:"); printHObject(group); } private static void printHObject (final HObject hObject) throws Exception { if (hObject instanceof Group) { printHObject((Group)hObject); } if (hObject instanceof CompoundDS) { printHObject((CompoundDS)hObject); } if (hObject instanceof Dataset) { printHObject((Dataset)hObject); } } private static void printHObject (final Group group) throws Exception { final List list = group.getMemberList(); if (list == null) { return; } final int n = list.size(); for (int i=0; i= 0) { objects [i] = object; } else { object = null; // Discard the warm up object runGC (); heap1 = usedMemory (); // Take a before heap snapshot } } runGC (); final long heap2 = usedMemory (); // Take an after heap snapshot: final int size = Math.round (((float)(heap2 - heap1))/count); System.out.println ("'before' heap: " + heap1 + ", 'after' heap: " + heap2); System.out.println ("heap delta: " + (heap2 - heap1) + ", {" + objects [0].getClass () + "} size = " + size + " bytes"); for (int i = 0; i < count; ++ i) { objects [i] = null; } objects = null; } private static void runGC () throws Exception { // It helps to call Runtime.gc() // using several method calls: for (int r = 0; r < 4; ++ r) { _runGC (); } } private static void _runGC () throws Exception { long usedMem1 = usedMemory (), usedMem2 = Long.MAX_VALUE; final Runtime s_runtime = Runtime.getRuntime (); for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++ i) { s_runtime.runFinalization (); s_runtime.gc (); Thread.yield (); usedMem2 = usedMem1; usedMem1 = usedMemory (); } } private static long usedMemory () { final Runtime s_runtime = Runtime.getRuntime (); return s_runtime.totalMemory () - s_runtime.freeMemory (); } private static void testHDFvector( final String fileName ) throws Exception { // retrieve an instance of H5File final FileFormat fileFormat = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); if (fileFormat == null) { System.err.println("Cannot find HDF5 FileFormat."); return; } // create a new file with a given file name. final H5File tFile = (H5File)fileFormat.create(fileName); if (tFile == null) { System.err.println("Failed to create file:"+fileName); return; } final FileFormat testFile = fileFormat.open(fileName,FileFormat.WRITE); if(testFile == null){ System.err.println("Failed to open file " + fileName); return; } testFile.open(); final Group root = (Group)((javax.swing.tree.DefaultMutableTreeNode)testFile.getRootNode()).getUserObject(); Vector v = new Vector(); v.addElement(new Float(1.2)); v.addElement(new Float(2.3)); v.addElement(new Float(4.5)); putData(testFile, root, "Vector Dataset",v,true, null); v = getData(root, "Vector Dataset"); System.out.println("first time getData " + v); //adding five more elements tothe vector v.addElement(new Float(4)); v.addElement(new Float(5)); v.addElement(new Float(6)); v.addElement(new Float(7)); final long[] extended_dims = {7}; putData(testFile, root, "Vector Dataset",v,false, extended_dims); System.out.println("After adding four more elements to the vector"); v = getData(root, "Vector Dataset"); System.out.println("Second time getData " + v); testFile.close(); } public static void putData(final FileFormat testFile, final Group root, final String name, final Vector value, final boolean flag, final long[] extended_dims)throws Exception { final int size = value.size(); final long[] dims = {size}; final int dataLen = 0; // set the data values final float[] dataFl = new float[size]; for (int i=0; i"+n); myfile.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } jhdf-2.9/test/object/misc/testh5file.sh.in0000644000175000017500000000132512050301057021350 0ustar sylvestresylvestre#!/bin/sh # Set up default variable values if not supplied by the user. # where the new builds exist HDFBLD_HOME=@abs_top_builddir@ export HDFBLD_HOME # where Java is installed (requires jdk1.4.x) JAVAPATH=@JAVABIN@ export JAVAPATH CLASSPATH=$HDFBLD_HOME"/lib/jh4toh5.jar:"$HDFBLD_HOME"/lib/jhdf.jar:"$HDFBLD_HOME"/lib/jhdf5.jar:"$HDFBLD_HOME"/lib/jhdf5obj.jar:"$HDFBLD_HOME"/lib/jhdfobj.jar:../../.." LD_LIBRARY_PATH=$HDFBLD_HOME"/lib/@JAVATARG@" export CLASSPATH export LD_LIBRARY_PATH #modify to use other files @JAVA@ -Djava.library.path=$LD_LIBRARY_PATH -Dncsa.hdf.hdf5lib.H5.hdf5lib=$HDFBLD_HOME"/lib/@JAVATARG@/libjh4toh5.so" test.object.misc.TestH5File vg_all_test.h5 #check results... jhdf-2.9/test/object/misc/TestH5File.java0000644000175000017500000002531312050301057021115 0ustar sylvestresylvestre /**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package test.object.misc; import java.lang.reflect.Array; import java.util.Enumeration; import java.util.List; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.h5.H5CompoundDS; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5Group; import ncsa.hdf.object.h5.H5ScalarDS; /** * Test object at the ncsa.hdf.object package. *

    * * @version 1.3.0 10/26/2001 * @author Peter X. Cao * */ public class TestH5File { /** * Test tree structure of the HDF5 file. *

    * Tested with a large file (over 700MB, over 800 datasets) at * \\Eirene\sdt\mcgrath\EOS-Data\MODIS\L3\MOD08_E3.A2000337.002.2001037044240.h5 * it takes about 5 seconds to retrieve the tree structure through the network. * Accessing local file can be a lot of faster. */ private static void testTree(String fileName) { H5File h5file = new H5File(fileName, HDF5Constants.H5F_ACC_RDONLY); long t0 = System.currentTimeMillis(); try { h5file.open(); } catch (Exception ex) { System.out.println(ex); } long t = System.currentTimeMillis()-t0; System.out.println("Time of retrieving the tree is "+t); TreeNode root = h5file.getRootNode(); if (root != null) { printNode(root, " "); } try { h5file.close(); } catch (Exception ex) { System.out.println(ex); } } private static void printNode(TreeNode node, String indent) { System.out.println(indent+node); int n = node.getChildCount(); for (int i=0; i * @param args */ public static void main(final String[] args) { boolean is_userfile = false; long retValue = 0; if (args.length > 0) { File tmpFile = new File(args[0]); is_userfile = (tmpFile.exists() && tmpFile.isFile()); } try { H5.H5Eclear();} catch (Exception ex) {} System.out.flush(); System.out.println("\nCheck memory leak (may take 5 to 10 mintues) ..."); try { if (is_userfile) retValue = test_user_file(args[0]); else retValue = test_default_file(); } catch (Throwable err) { retValue=1; } if (retValue <= 0) System.out.println("PASSED:\tcheck memory leak.\n"); else System.out.println("FAILED***:\tcheck memory leak.\n"); } private static final long test_user_file(String fname) throws Exception { H5File testFile = null; MemoryUsage memuse = null; DecimalFormat df = new DecimalFormat("000.00#E0#"); int count = 0; String sumStr="-----"; long KB = 1024, mem0=0, mem1=0, sum=0; if (DEBUG) { System.out.flush(); System.out.println("\n\nNo. of loops\tIncrease\tUsed(KB)\tTotal(KB)\tNo. of open IDs\n"+ "_______________________________________________________________________________\n"); } while(countNSTART) { sum += (mem1-mem0); sumStr = df.format(sum); } if (DEBUG) { System.out.println( df.format(count) + " \t" + sumStr + " \t" + df.format((mem1)) + " \t" + df.format(memuse.getMax() / KB) + " \t" + H5.getOpenIDCount()); } if (sum > 0) break; mem0 = mem1; } testFile = new H5File(fname, FileFormat.READ); testFile.open(); testFile.getRootNode(); try { Thread.sleep(10); } catch (Exception ex) {;} testFile.close(); } return sum; } private static final long test_default_file() { int nObjs = 0; // number of object left open Dataset dset =null; File tmpFile = null; MemoryUsage memuse = null; DecimalFormat df = new DecimalFormat("000.00#E0#"); for (int i=0; iNSTART) { diff = mem1-mem0; sum += diff; if (diff>0) nhigh++; else nhigh=0; sumStr = df.format(sum); } if (DEBUG) { System.out.println( df.format(count) + " \t" + sumStr + " \t" + df.format((mem1)) + " \t" + df.format(memuse.getMax() / KB) + " \t" + H5.getOpenIDCount()); } if ((sum/KB) > 0 || nhigh > 3) break; mem0 = mem1; } tmpFile = null; try { try { tmpFile = createTestFile(); } catch (Exception ex) { sum = 1; tmpFile = null; break; } // test two open options: open full tree or open individual object only for (int openOption=0; openOption<2; openOption++) { nObjs = 0; H5File file = new H5File(NAME_FILE_H5, FileFormat.WRITE); if (openOption == 0) { try { file.open(); // open the full tree } catch (Exception ex) { System.err.println("file.open(). "+ ex); } } try { Group rootGrp = (Group) file.get("/"); // datasets for (int j=0; j 1) { System.err.println("Possible memory leak. Some objects are still open."); } try { file.close(); } catch (Exception ex) { System.err.println("file.close() failed. "+ ex); } } // for (int openOption=0; openOption<2; openOption++) } finally { // delete the testing file if (tmpFile != null) { tmpFile.delete(); } } } // while (true) return sum; } /** * Calls garbage collector */ private static void collectGarbage() { try { System.gc(); Thread.sleep(100); System.runFinalization(); Thread.sleep(100); } catch (final Exception ex){ ex.printStackTrace(); } } /** * Creates an HDF5 test file. *

    * The test file contains the following objects: *

              /dataset_byte            Dataset {50, 10}
              /dataset_comp            Dataset {50, 10}
              /dataset_enum            Dataset {50, 10}
              /dataset_float           Dataset {50, 10}
              /dataset_int             Dataset {50, 10}
              /dataset_image           Dataset {50, 10}
              /dataset_str             Dataset {50, 10}
              /g0                      Group
              /g0/dataset_int          Dataset {50, 10}
              /g0/g00                  Group
              /g0/g00/dataset_float    Dataset {50, 10}
              /g0_attr                 Group
         * 
    * @throws Exception */ private static final File createTestFile() throws Exception { H5File file=null; Group g0, g1, g00; final H5Datatype typeInt = new H5Datatype(Datatype.CLASS_INTEGER, DATATYPE_SIZE, -1, -1); final H5Datatype typeFloat = new H5Datatype(Datatype.CLASS_FLOAT, DATATYPE_SIZE, -1, -1); final H5Datatype typeStr = new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1); final H5Datatype typeStrVlen = new H5Datatype(Datatype.CLASS_STRING, -1, -1, -1); final H5Datatype typeChar = new H5Datatype(Datatype.CLASS_CHAR, 1, -1, -1); final H5Datatype typeEnum = new H5Datatype(Datatype.CLASS_ENUM, DATATYPE_SIZE, -1, -1); file = new H5File(NAME_FILE_H5, FileFormat.CREATE); file.open(); g0 = file.createGroup(NAME_GROUP, null); g1 = file.createGroup(NAME_GROUP_ATTR, null); g00 = file.createGroup(NAME_GROUP_SUB, null); g1.writeMetadata(ATTRIBUTE_STR); g1.writeMetadata(ATTRIBUTE_INT_ARRAY); final Dataset[] dsets = new Dataset[11]; dsets[0] = file.createScalarDS (NAME_DATASET_INT, null, typeInt, DIMs, null, CHUNKs, 9, DATA_INT); dsets[1] = file.createScalarDS (NAME_DATASET_FLOAT, null, typeFloat, DIMs, null, CHUNKs, 9, DATA_FLOAT); dsets[2] = file.createScalarDS (NAME_DATASET_CHAR, null, typeChar, DIMs, null, CHUNKs, 9, DATA_BYTE); dsets[3] = file.createScalarDS (NAME_DATASET_STR, null, typeStr, DIMs, null, CHUNKs, 9, DATA_STR); dsets[4] = file.createScalarDS (NAME_DATASET_ENUM, null, typeEnum, DIMs, null, CHUNKs, 9, DATA_ENUM); dsets[5] = file.createScalarDS (NAME_DATASET_SUB, g0, typeInt, DIMs, null, CHUNKs, 9, DATA_INT); dsets[6] = file.createScalarDS (NAME_DATASET_SUB_SUB, g00, typeFloat, DIMs, null, CHUNKs, 9, DATA_FLOAT); dsets[7] = file.createImage (NAME_DATASET_IMAGE, null, typeInt, DIMs, null, CHUNKs, 9, 1, -1, DATA_BYTE); dsets[8] = file.createCompoundDS(NAME_DATASET_COMPOUND, null, DIMs, null, CHUNKs, 9, COMPOUND_MEMBER_NAMES, COMPOUND_MEMBER_DATATYPES, null, DATA_COMP); dsets[9] = file.createCompoundDS(NAME_DATASET_COMPOUND_SUB, null, DIMs, null, CHUNKs, 9, COMPOUND_MEMBER_NAMES, COMPOUND_MEMBER_DATATYPES, null, DATA_COMP); dsets[10] = file.createScalarDS (NAME_DATASET_STR_VLEN, null, typeStrVlen, DIMs, null, CHUNKs, 9, DATA_STR); for (int i=0; i 1) { System.err.println("Possible memory leak. Some objects are still open." +nObjs); } try { file.close(); } catch (final Exception ex) {} return file; } } jhdf-2.9/test/object/misc/TestH4File.java0000644000175000017500000003266512050301057021124 0ustar sylvestresylvestre /**************************************************************************** * NCSA HDF * * National Comptational Science Alliance * * University of Illinois at Urbana-Champaign * * 605 E. Springfield, Champaign IL 61820 * * * * For conditions of distribution and use, see the accompanying * * hdf-java/COPYING file. * * * ****************************************************************************/ package test.object.misc; import java.lang.reflect.Array; import java.util.Enumeration; import java.util.List; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import ncsa.hdf.hdflib.HDFConstants; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.h4.H4File; import ncsa.hdf.object.h4.H4GRImage; import ncsa.hdf.object.h4.H4Group; import ncsa.hdf.object.h4.H4SDS; import ncsa.hdf.object.h4.H4Vdata; /** * Test object at the ncsa.hdf.object package. *

    * * @version 1.3.0 10/26/2001 * @author Peter X. Cao * */ public class TestH4File { /** * Test tree structure of the HDF4 file. *

    * Tested for regular file: * c:\winnt\profiles\xcao\desktop\hdf_files\amortest000171999.hdf * Tested with a large file (over 700MB, over 800 datasets) at * \\Eirene\sdt\mcgrath\EOS-Data\MODIS\L3\MOD08_E3.A2000337.002.2001037044240.hdf * it takes about 5 seconds to retrieve the tree structure through the network. * Accessing local file can be a lot of faster. */ private static void testTree(String fileName) { H4File h4file = new H4File(fileName, HDFConstants.DFACC_WRITE); long t0 = System.currentTimeMillis(); try { h4file.open(); } catch (Exception ex) { System.out.println(ex); } long t = System.currentTimeMillis()-t0; System.out.println("Time of retrieving the tree is "+t); TreeNode root = h4file.getRootNode(); if (root != null) { printNode(root, " "); } try { h4file.close(); } catch (Exception ex) { System.out.println(ex); } } private static void printNode(TreeNode node, String indent) { System.out.println(indent+node); int n = node.getChildCount(); for (int i=0; i 1) { try { dim1 = Long.parseLong(args[0]); dim2 = Long.parseLong(args[1]); } catch (final Exception ex) { ex.printStackTrace(); System.exit(0); } } try { testTable(dim1, dim2); } catch (final Exception ex) { ex.printStackTrace(); System.exit(0); } } /** * Test the performance of reading a small table data. */ public static final void testTable(final long dim1, final long dim2) throws Exception { int nObjs = 0; // number of object left open Dataset dset =null; long t0=0, t1=0, time=0, nbytes=0, readKBS=0, writeKBS=0; final String dname = "/table"; final String[] COMPOUND_MEMBER_NAMES = {"int32", "float32"}; final H5Datatype[] COMPOUND_MEMBER_DATATYPES = { new H5Datatype(Datatype.CLASS_INTEGER, 4, -1, -1), new H5Datatype(Datatype.CLASS_FLOAT, 4, -1, -1)}; final long DIM1 = dim1; final long DIM2 = dim2; final long[] DIMs = {DIM1, DIM2}; final int DIM_SIZE = (int)(DIM1*DIM2); final int[] DATA_INT = new int[DIM_SIZE]; final float[] DATA_FLOAT = new float[DIM_SIZE]; final Vector DATA_COMP = new Vector(2); for (int i=0; i *

  4. checking the chunk size for the datasets. *
  5. checking details about compression. *
  6. cheking whether the byte array is to be converted to string. *
  7. checking the dimension names. *
  8. checking the dimension sizes. *
  9. checking the rank. *
  10. checking the selected dimensions. *
  11. checking the selected indexes. *
  12. checking the startdims. *
  13. checking the stride. *
  14. checking the width. * */ public final void testMetadataAssociatedWithDataset() { for (int i = 0; i < dsetNames.length; i++) { assertNull(dSets[i].getChunkSize()); assertTrue(dSets[i].getCompression().equals("NONE")); assertTrue(dSets[i].getConvertByteToString()); // by default, // strings are // converted assertNull(dSets[i].getDimNames()); assertTrue(Arrays.equals(dSets[i].getDims(), H5TestFile.DIMs)); if (H5TestFile.NAME_DATASET_STR.equals("/" + dSets[i].getName())) { assertEquals(dSets[i].getHeight(), H5TestFile.DIM2); } else { assertEquals(dSets[i].getHeight(), H5TestFile.DIM1); } assertEquals(dSets[i].getRank(), H5TestFile.RANK); long[] array = new long[2]; if (H5TestFile.NAME_DATASET_STR.equals("/" + dSets[i].getName())) { array[0] = 1; array[1] = 10; } else { array[0] = 50; array[1] = 10; } assertTrue(Arrays.equals(dSets[i].getSelectedDims(), array)); int[] arrayInt = new int[3]; if (H5TestFile.NAME_DATASET_STR.equals("/" + dSets[i].getName())) { arrayInt[0] = 1; arrayInt[1] = 0; arrayInt[2] = 2; } else { arrayInt[0] = 0; arrayInt[1] = 1; arrayInt[2] = 2; } assertTrue(Arrays.equals(dSets[i].getSelectedIndex(), arrayInt)); array[0] = 0; array[1] = 0; assertTrue(Arrays.equals(dSets[i].getStartDims(), array)); array[0] = 1; array[1] = 1; assertTrue(Arrays.equals(dSets[i].getStride(), array)); if (H5TestFile.NAME_DATASET_STR.equals("/" + dSets[i].getName())) { assertEquals(dSets[i].getWidth(), 1); } else { assertEquals(dSets[i].getWidth(), H5TestFile.DIM2); } } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test converting the following unsigned values to signed values. *
      *
    • byte[] int8 = { - 1, - 128, 127, 0}; *
    • short[] int16 = { - 1, - 32768, 32767, 0}; *
    • int[] int32 = { - 1, - 2147483648, 2147483647, 0}; *
    * Expected values *
      *
    • short[] uint8 = {255, 128, 127, 0}; *
    • int[] uint16 = {65535, 32768, 32767, 0}; *
    • long[] uint32 = {4294967295L, 2147483648L, 2147483647, 0}; *
    */ public final void testConvertFromUnsignedC() { byte[] int8 = { -1, -128, 127, 0 }; short[] int16 = { -1, -32768, 32767, 0 }; int[] int32 = { -1, -2147483648, 2147483647, 0 }; short[] uint8 = { 255, 128, 127, 0 }; int[] uint16 = { 65535, 32768, 32767, 0 }; long[] uint32 = { 4294967295L, 2147483648L, 2147483647, 0 }; short[] expected8 = (short[]) Dataset.convertFromUnsignedC(int8, null); assertTrue(Arrays.equals(expected8, uint8)); int[] expected16 = (int[]) Dataset.convertFromUnsignedC(int16, null); assertTrue(Arrays.equals(expected16, uint16)); long[] expected32 = (long[]) Dataset.convertFromUnsignedC(int32, null); assertTrue(Arrays.equals(expected32, uint32)); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/FileFormatTest.java0000644000175000017500000001627412050301057021144 0ustar sylvestresylvestre/** * */ package test.object; import java.util.Enumeration; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.h5.H5File; /** * @author rsinha * */ public class FileFormatTest extends TestCase { private static final H5File H5FILE = new H5File(); private FileFormat testFile = null; /** * @param arg0 */ public FileFormatTest(String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); testFile = H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testFile.open(); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for * {@link ncsa.hdf.object.FileFormat#create(java.lang.String, int)}. *

    * What to test: *

      *
    • Create a file that is already created with option FILE_CREATE_OPEN. *
    • Create a file that is already created and opened with option * FILE_CREATE_DELETE. *
    • Create a file that is already created and not opened with * FILE_CREATE_DELETE. *
    • Create a file that is new with FILE_CREATE_DELETE. *
    • Create a file that is new with FILE_CREATE_OPEN. *
    * */ /* * RUTH - come back and update this with new method, createInstance public * final void testCreateStringInt() { FileFormat f = * FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); * * try { f.create(H5TestFile.NAME_FILE_H5, FileFormat.FILE_CREATE_OPEN); } * catch (Exception ex) { fail("Create Failed " + ex.getMessage()); } try { * f.create(H5TestFile.NAME_FILE_H5, FileFormat.FILE_CREATE_DELETE); } catch * (Exception ex) { ; //Expected to fail. } try { f.create("simpleFile", * FileFormat.FILE_CREATE_DELETE); } catch (Exception ex) { * fail("Create failed " + ex.getMessage()); } try { f.create("testFile", * FileFormat.FILE_CREATE_DELETE); } catch (Exception ex) { * fail("Create failed " + ex.getMessage()); } try { f.create("testFile", * FileFormat.FILE_CREATE_OPEN); } catch (Exception ex) { * fail("Create failed " + ex.getMessage()); } } */ /** * Test method for {@link ncsa.hdf.object.FileFormat#getNumberOfMembers()}. *

    *

      *
    • Test the number of compements. *
    */ public final void testGetNumberOfMembers() { assertEquals(testFile.getNumberOfMembers(), 21); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.FileFormat#getFileFormat(java.lang.String)}. *

    *

      *
    • Test for HDF5. *
    */ public final void testGetFileFormat() { FileFormat f = FileFormat.getFileFormat("HDF5"); assertNotNull(f); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.FileFormat#getFileFormatKeys()}. *

    *

      *
    • current file formats are HDF5, HDF. *
    */ public final void testGetFileFormatKeys() { Enumeration e = FileFormat.getFileFormatKeys(); String keys[] = { "HDF5", "HDF4" }; int pos = 0; while (e.hasMoreElements()) { assertEquals(keys[pos++], e.nextElement()); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.FileFormat#getFID()}. *

    *

      *
    • Make sure the fid is not -1. *
    */ public final void testGetFID() { assertTrue((testFile.getFID() != -1)); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.FileFormat#getInstance(java.lang.String)}. *

    *

      *
    • Open an non existing file. *
    • Open an exisiting file. *
    */ public final void testGetInstance() { H5File f = null; try { f = (H5File) FileFormat.getInstance("test_hdf5.h5"); } catch (Exception ex) { ; } assertNull(f); try { f = (H5File) FileFormat.getInstance(H5TestFile.NAME_FILE_H5); } catch (Exception ex) { fail("getInstance() failed" + ex.getMessage()); } assertNotNull(f); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.FileFormat#getFileFormats()}. *

    *

      *
    • Test that the FileFormat object is formed for HDF5. *
    */ public final void testGetFileFormats() { FileFormat f = FileFormat.getFileFormat("HDF5"); assertNotNull(f); FileFormat f1 = FileFormat.getFileFormat("ALL"); assertNull(f1); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/Makefile.in0000644000175000017500000000317112050301057017446 0ustar sylvestresylvestre#/**************************************************************************** # * NCSA HDF * # * National Comptational Science Alliance * # * University of Illinois at Urbana-Champaign * # * 605 E. Springfield, Champaign IL 61820 * # * * # * For conditions of distribution and use, see the accompanying * # * java-hdf5/COPYING file. * # * * # ****************************************************************************/ TOP = ../.. DIR = test/object SUBDIRS = misc JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@:../../lib/junit.jar JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ JAVA_SRCS = \ AllH5ObjectTests.java \ AttributeTest.java \ CompoundDSTest.java \ DatasetTest.java \ DatatypeTest.java \ DataFormatTest.java \ FileFormatTest.java \ GroupTest.java \ H5BugFixTest.java \ H5CompoundDSTest.java \ H5DatatypeTest.java \ H5FileTest.java \ H5GroupTest.java \ H5ScalarDSTest.java \ H5TestFile.java \ HObjectTest.java \ MetadataTest.java \ ScalarDSTest.java include $(TOP)/config/Rules.mk check: all cp h5ex_d_extern.data $(TOP)/lib/$(DIR) cp h5ex_d_extern.hdf5 $(TOP)/lib/$(DIR) chmod u+x unittests.sh; ./unittests.sh jhdf-2.9/test/object/unittests.sh.in0000644000175000017500000000300612050301057020401 0ustar sylvestresylvestre#!/bin/sh # Set up default variable values if not supplied by the user. # where the new builds exist HDFBLD_HOME=@abs_top_builddir@ export HDFBLD_HOME # where Java is installed (requires jdk1.4.x) JAVAPATH=@JAVABIN@ export JAVAPATH ############################################################################### # DO NOT MODIFY BELOW THIS LINE ############################################################################### CPATH=".:"$HDFBLD_HOME"/lib/jhdf5.jar:"$HDFBLD_HOME"/lib/jhdfobj.jar:"$HDFBLD_HOME"/lib/jhdf5obj.jar:"$HDFBLD_HOME"/lib/junit.jar" TEST=/usr/bin/test if [ ! -x /usr/bin/test ] then TEST=`which test` fi if $TEST -z "$CLASSPATH"; then CLASSPATH="" fi CLASSPATH=$CPATH":"$CLASSPATH export CLASSPATH if $TEST -n "$JAVAPATH" ; then PATH=$JAVAPATH":"$PATH export PATH fi if $TEST -e /bin/uname; then os_name=`/bin/uname -s` elif $TEST -e /usr/bin/uname; then os_name=`/usr/bin/uname -s` else os_name=unknown fi case $os_name in SunOS) OS_NAME=solaris ;; Linux) OS_NAME=linux ;; IRIX*) OS_NAME=irix-6.5 ;; OSF1) OS_NAME=alpha ;; AIX) OS_NAME=aix ;; Darwin) OS_NAME=macosx ;; FreeBSD) OS_NAME=freebsd ;; *) echo "Unknown Operating System: HDF-Java may not work correctly" ;; esac (cd $HDFBLD_HOME/lib; $JAVAPATH/java -Xmx1024M -Djava.library.path=$HDFBLD_HOME"/lib/"$OS_NAME test.object.AllH5ObjectTests) jhdf-2.9/test/object/AllH5ObjectTests.java0000644000175000017500000000326512050301057021327 0ustar sylvestresylvestre/** * */ package test.object; import junit.framework.Test; import junit.framework.TestResult; import junit.framework.TestSuite; import ncsa.hdf.hdf5lib.H5; /** * Test suite for all unit tests of HDF5 objects. * * @author xcao * */ public class AllH5ObjectTests { public static Test suite() { try { H5TestFile.createTestFile(null); } catch (final Exception ex) { System.out.println("*** Unable to create HDF5 test file. " + ex); System.exit(-1); } final TestSuite suite = new TestSuite("Test for hdf-java objects"); // $JUnit-BEGIN$ // ncsa.hdf.object.h5 package suite.addTestSuite(H5CompoundDSTest.class); suite.addTestSuite(H5BugFixTest.class); suite.addTestSuite(H5ScalarDSTest.class); suite.addTestSuite(H5GroupTest.class); suite.addTestSuite(H5DatatypeTest.class); suite.addTestSuite(H5FileTest.class); // ncsa.hdf.object package suite.addTestSuite(CompoundDSTest.class); suite.addTestSuite(DatasetTest.class); suite.addTestSuite(ScalarDSTest.class); suite.addTestSuite(AttributeTest.class); suite.addTestSuite(DatatypeTest.class); suite.addTestSuite(FileFormatTest.class); suite.addTestSuite(GroupTest.class); suite.addTestSuite(HObjectTest.class); // $JUnit-END$ return suite; } public static void main(final String[] args) { TestResult results = junit.textui.TestRunner.run(suite()); if (!results.wasSuccessful()) System.out.println("FAILED***:\tobject unit tests.\n"); try { int openID = H5.getOpenIDCount(); if(openID>0) System.out.println("Number of IDs still open: "+ openID); } catch (Exception ex) { ex.printStackTrace(); } } } jhdf-2.9/test/object/CMakeLists.txt0000644000175000017500000000600012050301057020133 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_TEST_OBJECT Java) SET(CMAKE_VERBOSE_MAKEFILE 1) INCLUDE_DIRECTORIES( ${JAVA_NCSA_HDF_HDF4_BINARY_DIR} ${JAVA_NCSA_HDF_HDF5_BINARY_DIR} ${JAVA_NCSA_HDF_OBJECT_BINARY_DIR} ${HDFJAVA_LIB_DIR} ) SET (HDFJAVA_TEST_OBJECT_SRCS AllH5ObjectTests.java AttributeTest.java CompoundDSTest.java DatasetTest.java DatatypeTest.java DataFormatTest.java FileFormatTest.java GroupTest.java H5BugFixTest.java H5CompoundDSTest.java H5DatatypeTest.java H5FileTest.java H5GroupTest.java H5ScalarDSTest.java H5TestFile.java HObjectTest.java MetadataTest.java ScalarDSTest.java ) FILE (WRITE ${PROJECT_BINARY_DIR}/Manifest.txt "Main-Class: test.object.AllH5ObjectTests " ) SET (CMAKE_JAVA_INCLUDE_PATH "${HDFJAVA_LIB_DIR}/junit.jar;${HDFJAVA_OBJECT_JARS};${HDFJAVA_HDF5_JARS}") ADD_JAR (${HDFJAVA_TEST_OBJECT_LIB_TARGET} ${PROJECT_BINARY_DIR}/Manifest.txt ${HDFJAVA_TEST_OBJECT_SRCS}) GET_TARGET_PROPERTY(${HDFJAVA_TEST_OBJECT_LIB_TARGET}_JAR_FILE ${HDFJAVA_TEST_OBJECT_LIB_TARGET} JAR_FILE) #INSTALL_JAR (${HDFJAVA_TEST_OBJECT_LIB_TARGET} ${HJAVA_INSTALL_DATA_DIR}/tests tests) ADD_DEPENDENCIES (${HDFJAVA_TEST_OBJECT_LIB_TARGET} ${HDFJAVA_NCSA_HDF5_LIB_TARGET} ${HDFJAVA_NCSA_H5_LIB_TARGET}) SET (HDF_JAVA_TEST_FILES h5ex_d_extern.data h5ex_d_extern.hdf5 JUnit-object-interface.txt ) FOREACH (h5_file ${HDF_JAVA_TEST_FILES}) SET (dest "${PROJECT_BINARY_DIR}/${h5_file}") #MESSAGE (STATUS " Copying ${h5_file}") ADD_CUSTOM_COMMAND ( TARGET ${HDFJAVA_TEST_OBJECT_LIB_TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/${h5_file} ${dest} ) ENDFOREACH (h5_file ${HDF_JAVA_TEST_FILES}) IF (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ";") ELSE (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ":") ENDIF(WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_CLASSPATH ".") FOREACH (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH}) SET(CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}") ENDFOREACH(CMAKE_INCLUDE_PATH) SET (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${${HDFJAVA_TEST_OBJECT_LIB_TARGET}_JAR_FILE}") SET (testfilter "OK (153 tests)") ADD_TEST ( NAME JUnit-object-interface COMMAND "${CMAKE_COMMAND}" -D "TEST_TESTER=${CMAKE_Java_RUNTIME}" -D "TEST_CLASSPATH:STRING=${CMAKE_JAVA_CLASSPATH}" -D "TEST_ARGS:STRING=" -D "TEST_PROGRAM=-ea;org.junit.runner.JUnitCore;test.object.AllH5ObjectTests" -D "TEST_LIBRARY_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" -D "TEST_FOLDER=${HDFJAVA_BINARY_DIR}" -D "TEST_OUTPUT=${HDFJAVA_TEST_OBJECT_BINARY_DIR}/JUnit-object-interface.out" -D "TEST_EXPECT=0" -D "TEST_FILTER:STRING=${testfilter}" -D "TEST_REFERENCE=${testfilter}" -D "TEST_SKIP_COMPARE=TRUE" -P "${HDFJAVA_RESOURCES_DIR}/runTest.cmake" ) jhdf-2.9/test/object/ScalarDSTest.java0000644000175000017500000001334212050301057020541 0ustar sylvestresylvestre/** * */ package test.object; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.ScalarDS; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5Group; /** * @author rsinha * */ public class ScalarDSTest extends TestCase { private static final H5File H5FILE = new H5File(); private H5File testFile = null; private H5Group testGroup = null; private ScalarDS intDset = null; private ScalarDS floatDset = null; private ScalarDS charDset = null; private ScalarDS strDset = null; private ScalarDS enumDset = null; private ScalarDS imageDset = null; private ScalarDS imagePalete = null; private ScalarDS ORDset = null; /** * @param arg0 */ public ScalarDSTest(String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); testFile = (H5File) H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.READ); assertNotNull(testFile); testGroup = (H5Group) testFile.get(H5TestFile.NAME_GROUP_ATTR); assertNotNull(testGroup); intDset = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_INT); assertNotNull(intDset); intDset.init(); floatDset = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_FLOAT); assertNotNull(floatDset); floatDset.init(); charDset = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_CHAR); assertNotNull(charDset); charDset.init(); strDset = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_STR); assertNotNull(strDset); strDset.init(); enumDset = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_ENUM); assertNotNull(enumDset); enumDset.init(); imageDset = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_IMAGE); assertNotNull(imageDset); imageDset.init(); ORDset = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_OBJ_REF); assertNotNull(ORDset); ORDset.init(); imagePalete = (ScalarDS) testFile .get(H5TestFile.NAME_DATASET_IMAGE_PALETTE); assertNotNull(imagePalete); imagePalete.init(); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * * What to test: *
      *
    • Test for general functionality *
        *
      • Check for all datasets whether it is an image or not (only image * should return true). *
      • Check for all datasets whether imageDisplay is set (only image should * return true). *
      • Get Image Data Range from image dataset and check if it is valid. *
      • Check the interlace value for the image dataset. *
      • Check if the image is unsigned byte. *
      • Check setting the image to unsigned byte. *
      • Check true color for the image dataset. *
      *
    */ public final void testImageFunctionality() { assertTrue(imageDset.hasAttribute()); assertTrue(imageDset.isImage()); assertTrue(imageDset.isImageDisplay()); assertEquals(imageDset.getInterlace(), -1); assertFalse(imageDset.isTrueColor()); assertFalse(intDset.isImage()); assertFalse(floatDset.isImage()); assertFalse(charDset.isImage()); assertFalse(enumDset.isImage()); assertFalse(imagePalete.isImage()); assertFalse(ORDset.isImage()); assertFalse(intDset.isImageDisplay()); assertFalse(floatDset.isImageDisplay()); assertFalse(charDset.isImageDisplay()); assertFalse(enumDset.isImageDisplay()); assertFalse(imagePalete.isImageDisplay()); assertFalse(ORDset.isImageDisplay()); intDset.setIsImageDisplay(true); assertTrue(intDset.isImageDisplay()); intDset.setIsImageDisplay(false); assertFalse(intDset.isImageDisplay()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * What to test: *
      *
    • Test for general functionality *
        *
      • For all datasets in the file check if it is text. Only string dataset * should return true. *
      *
    */ public final void testIsText() { assertTrue(strDset.isText()); assertFalse(imageDset.isText()); assertFalse(intDset.isText()); assertFalse(floatDset.isText()); assertFalse(charDset.isText()); assertFalse(enumDset.isText()); assertFalse(ORDset.isText()); assertFalse(imagePalete.isText()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/AttributeTest.java0000644000175000017500000002545012050301057021053 0ustar sylvestresylvestre/** * */ package test.object; import java.util.Arrays; import java.util.List; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.h5.H5Datatype; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5Group; /** * @author Rishi R. Sinha * */ public class AttributeTest extends TestCase { private static final H5File H5FILE = new H5File(); private H5File testFile = null; private H5Group testGroup = null; private Attribute strAttr = null; private Attribute arrayIntAttr = null; /** * @param arg0 */ public AttributeTest(String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); testFile = (H5File) H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testGroup = (H5Group) testFile.get(H5TestFile.NAME_GROUP_ATTR); assertNotNull(testGroup); List testAttrs = testGroup.getMetadata(); assertNotNull(testAttrs); strAttr = (Attribute) testAttrs.get(1); assertNotNull(strAttr); arrayIntAttr = (Attribute) testAttrs.get(0); assertNotNull(arrayIntAttr); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for * {@link ncsa.hdf.object.Attribute#Attribute(java.lang.String, ncsa.hdf.object.Datatype, long[])} * . *

    * Here we test: *

      *
    • Creating a new attribute with no value. *
    • Setting the attribute value. *
    * */ public final void testAttributeStringDatatypeLongArray() { long[] attrDims = { 1 }; String attrName = "CLASS"; String[] classValue = { "IMAGE" }; Datatype attrType = new H5Datatype(Datatype.CLASS_STRING, classValue[0] .length() + 1, -1, -1); Attribute attr = new Attribute(attrName, attrType, attrDims); attr.setValue(classValue); assertNotNull(attr); assertEquals(classValue[0], attr.toString("|")); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.Attribute#Attribute(java.lang.String, ncsa.hdf.object.Datatype, long[], java.lang.Object)} * . *

    * Here we test: *

      *
    • Creating a new attribute with a value. *
    */ public final void testAttributeStringDatatypeLongArrayObject() { long[] attrDims = { 1 }; String attrName = "CLASS"; String[] classValue = { "IMAGE" }; Datatype attrType = new H5Datatype(Datatype.CLASS_STRING, classValue[0] .length() + 1, -1, -1); Attribute attr = new Attribute(attrName, attrType, attrDims, classValue); assertNotNull(attr); assertEquals(classValue[0], attr.toString("|")); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Attribute#getValue()}. * * Here we test: *
      *
    • Getting the value for the two attributes (the string attribute and * the int array attribute). *
    */ public final void testGetValue() { assertEquals(((String[]) strAttr.getValue())[0], "String attribute."); assertTrue(Arrays.equals((int[]) arrayIntAttr.getValue(), new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 })); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.Attribute#setValue(java.lang.Object)}. *

    * Here we test: *

      *
    • Setting new value for the two attributes (the string attribute and * the int array attribute). *
    */ public final void testSetValue() { String[] prevValue = (String[]) strAttr.getValue(); strAttr.setValue("Temp String Value"); assertEquals(((String) strAttr.getValue()), "Temp String Value"); strAttr.setValue(prevValue); int[] intPrevValue = (int[]) arrayIntAttr.getValue(); arrayIntAttr.setValue(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }); assertTrue(Arrays.equals((int[]) arrayIntAttr.getValue(), new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 })); arrayIntAttr.setValue(intPrevValue); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Attribute#getName()}. *

    * Here we test: *

      *
    • Getting the names of the two attributes (the string attribute and the * int array attribute). *
    */ public final void testGetName() { assertTrue(strAttr.getName().equals("strAttr")); assertTrue(arrayIntAttr.getName().equals("arrayInt")); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Attribute#getRank()}. *

    * Here we test: *

      *
    • Getting the rank for the two attributes (the string attribute and the * int array attribute). *
    */ public final void testGetRank() { assertEquals(strAttr.getRank(), 1); assertEquals(arrayIntAttr.getRank(), 1); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Attribute#getDataDims()}. *

    * Here we test: *

      *
    • Getting the dimensionalities for the two attributes (the string * attribute and the int array attribute). *
    */ public final void testGetDataDims() { assertEquals(strAttr.getDataDims()[0], 1); assertEquals(arrayIntAttr.getDataDims()[0], 10); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Attribute#getType()}. *

    * Here we test: *

      *
    • Getting the value for the two attributes (the string attribute and * the int array attribute). *
    */ public final void testGetType() { assertTrue(strAttr.getType().getDatatypeDescription().equals( "String, length = 20")); assertTrue(arrayIntAttr.getType().getDatatypeDescription().equals( "32-bit integer")); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Attribute#isUnsigned()}. *

    * Here we test: *

      *
    • Check if the two attributes (the string attribute and the int array * attribute) are unsigned. *
    */ public final void testIsUnsigned() { assertFalse(strAttr.isUnsigned()); assertFalse(arrayIntAttr.isUnsigned()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.Attribute#toString(java.lang.String)}. *

    * Here we test: *

      *
    • the toString method for the two attributes (the string attribute and * the int array attribute). *
    */ public final void testToStringString() { assertTrue(strAttr.toString(",").equals("String attribute.")); assertTrue(arrayIntAttr.toString(",").equals("1,2,3,4,5,6,7,8,9,10")); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/HObjectTest.java0000644000175000017500000003433012050301057020423 0ustar sylvestresylvestre/** * */ package test.object; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.HObject; import ncsa.hdf.object.h5.H5File; /** * @author Rishi R. Sinha * */ public class HObjectTest extends TestCase { private static final H5File H5FILE = new H5File(); private static final String GNAME = H5TestFile.NAME_GROUP; private H5File testFile = null; private HObject testObj = null; private long testOID; /** * @param arg0 */ public HObjectTest(String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); testFile = new H5File(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testObj = testFile.get(GNAME); assertNotNull(testObj); testOID = testObj.getOID()[0]; } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for {@link ncsa.hdf.object.HObject#getFile()}. *

    * What to test: *

      *
    • Make sure file name in object yields same file as filename *
    */ public final void testGetFile() { String fullFileName = testObj.getFile(); if (!fullFileName.endsWith(H5TestFile.NAME_FILE_H5)) { fail("Wrong File"); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#getName()}. *

    * What to test: *

      *
    • For the base group, find the name of the group and test it against * the standard. *
    */ public final void testGetName() { if (!testObj.getName().equals(GNAME.substring(1))) { fail("GetName returns wrong name"); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#getFullName()}. *

    * What to test: *

      *
    • For the base group, find the full name of the group and test it * against the standard. *
    */ public final void testGetFullName() { if (!testObj.getFullName().equals(GNAME)) { fail("GetFullName returns wrong name"); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#getPath()}. * *

    * What to test: *

      *
    • For the base group, find the path of the group and test it against * the standard. *
    */ public final void testGetPath() { if (!testObj.getPath().equals("/")) { fail("GetPath returns wrong path"); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#setName(java.lang.String)} * . *

    * What to test: *

      *
    • Test setting the name to null. It should not be set. *
    • Test setting the name to another existing name in the same group. *
    • Test setting the name to a new name. *
    */ public final void testSetName() { final String newName = "tmpName"; // test set name to null try { testObj.setName(null); } catch (final Exception ex) { ; // Expected - intentional } // set to an existing name try { testObj.setName(H5TestFile.NAME_DATASET_FLOAT); } catch (final Exception ex) { ; // Expected - intentional } try { testObj.setName(newName); } catch (final Exception ex) { fail("setName() failed. " + ex); } // close the file and reopen it try { testFile.close(); testFile.open(); testObj = testFile.get(newName); } catch (final Exception ex) { fail("setName() failed. " + ex); } HObject tmpObj = null; // test the old name try { tmpObj = testFile.get(GNAME); } catch (final Exception ex) { fail("testFile.get(GNAME) failed. " + ex); } assertNull("The dataset should be null because it has been renamed", tmpObj); // set back the original name try { testObj.setName(GNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } // make sure the dataset is OK try { testObj = testFile.get(GNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } assertNotNull(testObj); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#setPath(java.lang.String)} * . *

    * What to test: *

      *
    • Test setting the path to null. It should not be set. *
    • Test setting the path to another existing name in the same group. *
    • Test setting the path to a new name. *
    */ public final void testSetPath() { String path = testObj.getPath(); try { testObj.setPath(null); } catch (Exception e) { ; } if (!path.equals(testObj.getPath())) { fail("testPath changed the path name even though null was passed to it."); } try { testObj.setPath("testPath"); } catch (Exception e) { fail("testPath failed when trying to set it to testPath"); } if (!testObj.getPath().equals("testPath")) { fail("testPath failed when trying to set it to testPath"); } try { testObj.setPath(path); } catch (Exception e) { fail("testPath failed when trying to reset the path to " + path); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#open()}. *

    * What to test: *

      *
    • Open the Group and check that the gid returned is less than 1. *
    */ public final void testOpen() { int gid = -1; for (int loop = 0; loop < 15; loop++) { gid = -1; try { gid = testObj.open(); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(gid > 0); testObj.close(gid); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#close(int)}. *

    * What to test: *

      *
    • Run the tests for opening the group. *
    */ public final void testClose() { testOpen(); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#getFID()}. *

    * What to test: *

      *
    • get the FID for the group and make sure that it is the same as the * FID for the file. *
    */ public final void testGetFID() { assertEquals(testObj.getFID(), testFile.getFID()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#equalsOID(long[])}. *

    * What to test: *

      *
    • Check against null. It should fail. *
    • Check against the OID that we have already extraced. *
    */ public final void testEqualsOID() { assertNotNull(testObj); assertTrue(testObj.equalsOID(new long[] { testOID })); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#getFileFormat()}. *

    * What to test: *

      *
    • For the group, check against null. *
    • For the group, check against the testFile. *
    */ public final void testGetFileFormat() { assertNotNull(testObj.getFileFormat()); assertEquals(testObj.getFileFormat(), testFile); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#getOID()}. *

    * What to test: *

      *
    • Check that OIDlist is not null. *
    • Check that OID[0] is correct. *
    */ public final void testGetOID() { assertNotNull(testObj.getOID()); assertEquals(testObj.getOID()[0], testOID); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#hasAttribute()}. *

    * What to test: *

      *
    • Check for Image dataset which has an attribute. *
    • Check for base group which has no attributes. *
    */ public final void testHasAttribute() { try { assertTrue(testFile.get(H5TestFile.NAME_DATASET_IMAGE) .hasAttribute()); } catch (Exception e) { fail("get() fails."); } assertFalse(testObj.hasAttribute()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.HObject#toString()}. *

    * What to test: *

      *
    • Check for the group. *
    */ public final void testToString() { assertEquals(testObj.toString(), GNAME.substring(1)); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/H5CompoundDSTest.java0000644000175000017500000022464312050301057021325 0ustar sylvestresylvestre/** * */ package test.object; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Array; import java.util.Vector; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.h5.H5CompoundDS; import ncsa.hdf.object.h5.H5Datatype; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5Group; /** * TestCase for H5CompoundDS. *

    * This class tests all the public methods in H5CompoundDS class. *

    * The test file contains the following objects. * *

     * 
     * 
     *         /dataset_byte            Dataset {50, 10}
     *         /dataset_comp            Dataset {50, 10}
     *         /dataset_enum            Dataset {50, 10}
     *         /dataset_float           Dataset {50, 10}
     *         /dataset_image           Dataset {50, 10}
     *         /dataset_int             Dataset {50, 10}
     *         /dataset_str             Dataset {50, 10}
     *         /g0                      Group
     *         /g0/dataset_comp         Dataset {50, 10}
     *         /g0/dataset_int          Dataset {50, 10}
     *         /g0/datatype_float       Type
     *         /g0/datatype_int         Type
     *         /g0/datatype_str         Type
     *         /g0/g00                  Group
     *         /g0/g00/dataset_float    Dataset {50, 10}
     *         /g0_attr                 Group
     * 
     * 
    *

    * We use the following template to test all the methods: *

    * What to test: *

      *
    • Test for boundary conditions *
        *
      • *
      *
    • Test for failure *
        *
      • *
      *
    • Test for success on general functionality *
        *
      • *
      *
    * * @author Peter Cao, The HDF Group */ public class H5CompoundDSTest extends TestCase { private static final H5File H5FILE = new H5File(); private static final int NLOOPS = 10; private static final int TEST_VALUE_INT = Integer.MAX_VALUE; private static final float TEST_VALUE_FLOAT = Float.MAX_VALUE; private static final String TEST_VALUE_STR = "H5CompoundDSTest"; private static final String DNAME = H5TestFile.NAME_DATASET_COMPOUND; private static final String DNAME_SUB = H5TestFile.NAME_DATASET_COMPOUND_SUB; private H5Datatype typeInt = null; private H5Datatype typeFloat = null; private H5Datatype typeStr = null; private H5File testFile = null; private H5CompoundDS testDataset = null; /** * @param arg0 */ public H5CompoundDSTest(final String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); typeInt = new H5Datatype(Datatype.CLASS_INTEGER, H5TestFile.DATATYPE_SIZE, -1, -1); typeFloat = new H5Datatype(Datatype.CLASS_FLOAT, H5TestFile.DATATYPE_SIZE, -1, -1); typeStr = new H5Datatype(Datatype.CLASS_STRING, H5TestFile.STR_LEN, -1, -1); testFile = (H5File) H5FILE.createInstance(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testFile.open(); testDataset = (H5CompoundDS) testFile.get(DNAME); assertNotNull("setUp testFile.get", testDataset); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) {} testFile = null; } } /** * Test method for * {@link ncsa.hdf.object.h5.H5CompoundDS#setName(java.lang.String)}. *

    * What to test: *

      *
    • Test for boundary conditions *
        *
      • Set name to null *
      *
    • Test for failure *
        *
      • Set a name that already exists in file. *
      *
    • Test for general functionality *
        *
      • change the dataset name *
      • close/re-open the file *
      • get the dataset with the new name *
      • failure test: get the dataset with the original name *
      • set the name back to the original name *
      *
    */ public final void testSetName() { final String newName = "tmpName"; // test set name to null try { testDataset.setName(null); } catch (final Exception ex) { ; // Expected - intentional } // set an existing name try { testDataset.setName(DNAME_SUB); } catch (final Exception ex) { ; // Expected - intentional } try { testDataset.setName(newName); } catch (final Exception ex) { fail("setName() failed. " + ex); } // close the file and reopen it try { testFile.close(); testFile.open(); testDataset = (H5CompoundDS) testFile.get(newName); } catch (final Exception ex) { fail("setName() failed. " + ex); } // test the old name H5CompoundDS tmpDset = null; try { tmpDset = (H5CompoundDS) testFile.get(DNAME); } catch (Exception ex) { fail("setName() get(oldname) failed. " + ex); } assertNull("The dataset should be null because it has been renamed", tmpDset); // set back the original name try { testDataset.setName(DNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } // make sure the dataset is OK try { testDataset = (H5CompoundDS) testFile.get(DNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } assertNotNull(testDataset); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5CompoundDS#open()}. *

    * What to test: *

      *
    • open a dataset identifier *
    • get datatype and dataspace identifier for the dataset *
    • Repeat all above *
    */ public final void testOpen() { int did = -1, tid = -1, sid = -1; for (int loop = 0; loop < NLOOPS; loop++) { did = tid = sid = -1; try { did = testDataset.open(); tid = H5.H5Dget_type(did); sid = H5.H5Dget_space(did); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(did > 0); assertTrue(tid > 0); assertTrue(sid > 0); try { H5.H5Tclose(tid); } catch (final Exception ex) {} try { H5.H5Sclose(sid); } catch (final Exception ex) {} try { H5.H5Dclose(did); } catch (final Exception ex) {} } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5CompoundDS#close(int)}. *

    * What to test: *

      *
    • open a dataset identifier *
    • get datatype and dataspace identifier for the dataset *
    • close dataset *
    • failure test for the closed did *
    • Repeat all above *
    */ public final void testClose() { int did = -1, tid = -1, sid = -1; for (int loop = 0; loop < NLOOPS; loop++) { did = tid = sid = -1; try { did = testDataset.open(); tid = H5.H5Dget_type(did); sid = H5.H5Dget_space(did); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(did > 0); assertTrue(tid > 0); assertTrue(sid > 0); try { H5.H5Tclose(tid); } catch (final Exception ex) {} try { H5.H5Sclose(sid); } catch (final Exception ex) {} try { testDataset.close(did); } catch (final Exception ex) { fail("close() failed. " + ex); } // dataset is closed, expect to fail try { tid = H5.H5Dget_type(did); } catch (final Exception ex) { tid = -1; // Expected - intentional } assertTrue(tid < 0); try { sid = H5.H5Dget_space(did); } catch (final Exception ex) { sid = -1; // Expected - intentional } assertTrue(sid < 0); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5CompoundDS#clear()}. *

    * What to test: *

      *
    • Read data/attributes from file *
    • clear the dataet *
    • make sure that the data is empty *
    • make sure that the attribute list is empty *
    */ public final void testClear() { Vector data = null; try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(data.size() > 0); Vector attrs = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("clear() failed. " + ex); } // clear up the dataset testDataset.clear(); assertFalse(data.size() > 0); // attribute is empty try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("clear() failed. " + ex); } assertTrue(attrs.size() <= 0); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5CompoundDS#init()}. *

    * What to test: *

      *
    • call init() *
    • make that the dataspace is correct *
    • make sure that member selection is correct *
    • Repeat all above *
    */ public final void testInit() { for (int loop = 0; loop < NLOOPS; loop++) { try { testFile.close(); } catch (final Exception ex) {} try { testFile.open(); testDataset = (H5CompoundDS) testFile.get(DNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } testDataset.init(); // test the rank final int rank = testDataset.getRank(); assertEquals(H5TestFile.RANK, rank); // test the dimesin sizes final long[] dims = testDataset.getDims(); assertNotNull(dims); for (int i = 0; i < rank; i++) { assertEquals(H5TestFile.DIMs[i], dims[i]); } // start at 0 final long[] start = testDataset.getStartDims(); assertNotNull(start); for (int i = 0; i < rank; i++) { assertEquals(0, start[i]); } // test selection final long[] selectedDims = testDataset.getSelectedDims(); final int[] selectedIndex = testDataset.getSelectedIndex(); assertNotNull(selectedDims); assertNotNull(selectedIndex); if (rank == 1) { assertEquals(0, selectedIndex[0]); assertEquals(dims[0], selectedDims[0]); } else if (rank == 2) { assertEquals(0, selectedIndex[0]); assertEquals(1, selectedIndex[1]); assertEquals(dims[0], selectedDims[0]); assertEquals(dims[1], selectedDims[1]); } else if (rank > 2) { assertEquals(rank - 2, selectedIndex[0]); // columns assertEquals(rank - 1, selectedIndex[1]); // rows assertEquals(rank - 3, selectedIndex[2]); assertEquals(dims[rank - 1], selectedDims[rank - 1]); assertEquals(dims[rank - 2], selectedDims[rank - 2]); } // by default, all members are selected final int nmembers = testDataset.getSelectedMemberCount(); assertTrue(nmembers > 0); for (int i = 0; i < nmembers; i++) { assertTrue(testDataset.isMemberSelected(i)); } // make some change and do another round of test // to make sure that the init() resets the default for (int i = 0; i < rank; i++) { start[i] = 1; selectedDims[0] = 1; } for (int i = 0; i < nmembers; i++) { testDataset.setMemberSelection(false); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open try { testFile.close(); } catch (final Exception ex) {} } // for (int loop=0; loop * What to test: *
      *
    • Read the whole dataset *
    • Repeat all above *
    */ public final void testRead() { Vector data = null; for (int loop = 0; loop < NLOOPS; loop++) { // read the whole dataset by default testDataset.init(); try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(data.size() > 0); // check the data values final int[] ints = (int[]) data.get(0); final float[] floats = (float[]) data.get(1); final String[] strs = (String[]) data.get(2); final long[] longs = (long[]) data.get(3); assertNotNull(ints); assertNotNull(floats); assertNotNull(strs); assertNotNull(longs); for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(H5TestFile.DATA_INT[i], ints[i]); assertEquals(H5TestFile.DATA_FLOAT[i], floats[i], Float.MIN_VALUE); assertTrue(H5TestFile.DATA_STR[i].equals(strs[i])); assertEquals(H5TestFile.DATA_LONG[i], longs[i]); } } // for (int loop=0; loop * What to test: *
      *
    • Read data row by row *
    • Repeat all above *
    */ public final void testReadByRow() { Vector data = null; for (int loop = 0; loop < NLOOPS; loop++) { testDataset.init(); // read data row by row final int nrows = testDataset.getHeight(); for (int i = 0; i < nrows; i++) { testDataset.clearData(); testDataset.init(); final int rank = testDataset.getRank(); final long[] start = testDataset.getStartDims(); final long[] count = testDataset.getSelectedDims(); // select one row only for (int j = 0; j < rank; j++) { count[j] = 1; } // select different rows start[0] = i; try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } final int ints[] = (int[]) data.get(0); final float floats[] = (float[]) data.get(1); final String strs[] = (String[]) data.get(2); assertNotNull(ints); assertNotNull(floats); assertNotNull(strs); final int idx = (int) H5TestFile.DIM2 * i; assertEquals(H5TestFile.DATA_INT[idx], ints[0]); assertEquals(H5TestFile.DATA_FLOAT[idx], floats[0], Float.MIN_VALUE); assertTrue(H5TestFile.DATA_STR[idx].equals(strs[0])); } // for (int i=0; i * What to test: *
      *
    • Read data field bu field *
    • Repeat all above *
    */ public final void testReadByField() { Vector data = null; for (int loop = 0; loop < NLOOPS; loop++) { testDataset.init(); // read field by field final int nmembers = testDataset.getMemberCount(); for (int i = 0; i < nmembers; i++) { testDataset.clearData(); testDataset.init(); testDataset.setMemberSelection(false); testDataset.selectMember(i); try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(data.size() == 1); switch (i) { case 0: final int[] ints = (int[]) data.get(0); assertNotNull(ints); for (int j = 0; j < H5TestFile.DIM_SIZE; j++) { assertEquals(H5TestFile.DATA_INT[j], ints[j]); } break; case 1: final float[] floats = (float[]) data.get(0); assertNotNull(floats); for (int j = 0; j < H5TestFile.DIM_SIZE; j++) { assertEquals(H5TestFile.DATA_FLOAT[j], floats[j], Float.MIN_VALUE); } break; case 2: final String[] strs = (String[]) data.get(0); assertNotNull(strs); for (int j = 0; j < H5TestFile.DIM_SIZE; j++) { assertTrue(H5TestFile.DATA_STR[j].equals(strs[j])); } break; } } // for (int i=0; i * What to test: *
      *
    • Read the whole dataset in a byte buffer *
    • check the data size *
    */ public final void testReadBytes() { byte[] data = null; try { data = (byte[]) testDataset.readBytes(); } catch (final Exception ex) { fail("readBytes() failed. " + ex); } assertNotNull(data); final int n = Array.getLength(data); final int expected = H5TestFile.DIM_SIZE * (4 + 4 + H5TestFile.STR_LEN + 4); assertEquals(expected, n); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5CompoundDS#write(java.lang.Object)}. *

    * What to test: *

      *
    • Read/write the whole dataset *
    • Repeat all above *
    • write the original data back to file *
    */ public final void testWriteObject() { Vector data = null; for (int loop = 0; loop < NLOOPS; loop++) { // read the whole dataset by default testDataset.init(); try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(data.size() > 0); // check the data values int[] ints = (int[]) data.get(0); float[] floats = (float[]) data.get(1); String[] strs = (String[]) data.get(2); assertNotNull(ints); assertNotNull(floats); assertNotNull(strs); for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(H5TestFile.DATA_INT[i], ints[i]); assertEquals(H5TestFile.DATA_FLOAT[i], floats[i], Float.MIN_VALUE); assertTrue(H5TestFile.DATA_STR[i].equals(strs[i])); } // change the data value for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { ints[i] = TEST_VALUE_INT; floats[i] = TEST_VALUE_FLOAT; strs[i] = TEST_VALUE_STR; } // write the data to file try { testDataset.write(data); } catch (final Exception ex) { fail("write() failed. " + ex); } // close the file and reopen it try { testFile.close(); testFile.open(); testDataset = (H5CompoundDS) testFile.get(DNAME); } catch (final Exception ex) { fail("write() failed. " + ex); } // read the data into memory to make sure the data is correct testDataset.init(); testDataset.clearData(); try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(data.size() > 0); // check the data values ints = (int[]) data.get(0); floats = (float[]) data.get(1); strs = (String[]) data.get(2); for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(TEST_VALUE_INT, ints[i]); assertEquals(TEST_VALUE_FLOAT, floats[i], Float.MIN_VALUE); assertTrue(TEST_VALUE_STR.equals(strs[i])); } // write the original data into file try { testDataset.write(H5TestFile.DATA_COMP); } catch (final Exception ex) { fail("write() failed. " + ex); } } // for (int loop=0; loop * What to test: *
      *
    • Read/write data row by row *
    • Repeat all above *
    • write the original data back to file *
    */ public final void testWriteByRow() { Vector data = null; for (int loop = 0; loop < NLOOPS; loop++) { testDataset.init(); final int rank = testDataset.getRank(); final long[] start = testDataset.getStartDims(); final long[] count = testDataset.getSelectedDims(); // read data row by row for (int i = 0; i < rank; i++) { start[i] = 0; count[i] = 1; } final int nrows = testDataset.getHeight(); for (int i = 0; i < nrows; i++) { testDataset.clearData(); testDataset.init(); // select one row only for (int j = 0; j < rank; j++) { count[j] = 1; } // select different rows start[0] = i; try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } final int[] ints = (int[]) data.get(0); final float[] floats = (float[]) data.get(1); final String[] strs = (String[]) data.get(2); assertNotNull(ints); assertNotNull(floats); assertNotNull(strs); assertEquals(H5TestFile.DATA_INT[i], ints[0]); assertEquals(H5TestFile.DATA_FLOAT[i], floats[0], Float.MIN_VALUE); assertTrue(H5TestFile.DATA_STR[i].equals(strs[0])); // change the data value ints[0] = TEST_VALUE_INT; floats[0] = TEST_VALUE_FLOAT; strs[0] = TEST_VALUE_STR; // write data row by row try { testDataset.write(data); } catch (final Exception ex) { fail("write() failed. " + ex); } // check if data is correct testDataset.clearData(); try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertEquals(TEST_VALUE_INT, ints[0]); assertEquals(TEST_VALUE_FLOAT, floats[0], Float.MIN_VALUE); assertTrue(TEST_VALUE_STR.equals(strs[0])); } // for (int i=0; i * What to test: *
      *
    • Read/write data field by field *
    • Repeat all above *
    • write the original data back to file *
    */ public final void testWriteByField() { Vector data = null; for (int loop = 0; loop < NLOOPS; loop++) { testDataset.init(); // read field by field final int nmembers = testDataset.getMemberCount(); for (int i = 0; i < nmembers; i++) { testDataset.clearData(); testDataset.init(); testDataset.setMemberSelection(false); testDataset.selectMember(i); try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(data.size() == 1); // change the data value switch (i) { case 0: final int[] ints = (int[]) data.get(0); assertNotNull(ints); for (int j = 0; j < H5TestFile.DIM_SIZE; j++) { ints[j] = TEST_VALUE_INT; } break; case 1: final float[] floats = (float[]) data.get(0); assertNotNull(floats); for (int j = 0; j < H5TestFile.DIM_SIZE; j++) { floats[j] = TEST_VALUE_FLOAT; } break; case 2: final String[] strs = (String[]) data.get(0); assertNotNull(strs); for (int j = 0; j < H5TestFile.DIM_SIZE; j++) { strs[j] = TEST_VALUE_STR; } break; } // write data field y field try { testDataset.write(data); } catch (final Exception ex) { fail("write() failed. " + ex); } // check if data is correct testDataset.clearData(); try { data = (Vector) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } switch (i) { case 0: final int[] ints = (int[]) data.get(0); assertNotNull(ints); for (int j = 0; j < H5TestFile.DIM_SIZE; j++) { assertEquals(TEST_VALUE_INT, ints[j]); } break; case 1: final float[] floats = (float[]) data.get(0); assertNotNull(floats); for (int j = 0; j < H5TestFile.DIM_SIZE; j++) { assertEquals(TEST_VALUE_FLOAT, floats[j], Float.MIN_VALUE); } break; case 2: final String[] strs = (String[]) data.get(0); assertNotNull(strs); for (int j = 0; j < H5TestFile.DIM_SIZE; j++) { assertTrue(TEST_VALUE_STR.equals(strs[j])); } break; } // write the original data into file testDataset.init(); testDataset.clearData(); try { testDataset.write(H5TestFile.DATA_COMP); } catch (final Exception ex) { fail("write() failed. " + ex); } } // for (int i=0; i * What to test: *
      *
    • Get the datatype object of the dataset *
    */ public final void testGetDatatype() { testDataset.init(); final H5Datatype dtype = (H5Datatype) testDataset.getDatatype(); assertNotNull(dtype); assertEquals(H5Datatype.CLASS_COMPOUND, dtype.getDatatypeClass()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5CompoundDS#isString(int)}. *

    * What to test: *

      *
    • Test a string datatype with isString(int tid) *
    • Test a non-string datatype with isString(int tid) *
    */ public final void testIsString() { assertFalse(testDataset.isString(HDF5Constants.H5T_NATIVE_INT)); assertFalse(testDataset.isString(HDF5Constants.H5T_NATIVE_FLOAT)); assertTrue(testDataset.isString(HDF5Constants.H5T_C_S1)); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5CompoundDS#getSize(int)}. *

    * What to test: *

      *
    • Test a sizes of different defined data types *
    */ public final void testGetSize() { assertEquals(1, testDataset.getSize(HDF5Constants.H5T_NATIVE_INT8)); assertEquals(2, testDataset.getSize(HDF5Constants.H5T_NATIVE_INT16)); assertEquals(4, testDataset.getSize(HDF5Constants.H5T_NATIVE_INT32)); assertEquals(8, testDataset.getSize(HDF5Constants.H5T_NATIVE_INT64)); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5CompoundDS#H5CompoundDS(ncsa.hdf.object.FileFormat, java.lang.String, java.lang.String)} * . *

    * What to test: *

      *
    • Construct an H5CompoundDS object that exits in file *
        *
      • new H5CompoundDS (file, null, fullpath) *
      • new H5CompoundDS (file, fullname, null) *
      • new H5CompoundDS (file, name, path) *
      *
    • Construct an H5CompoundDS object that does not exist in file *
    */ public final void testH5CompoundDSFileFormatStringString() { Vector data = null; final String[] names = { null, DNAME_SUB, DNAME.substring(1) }; final String[] paths = { DNAME_SUB, null, H5TestFile.NAME_GROUP }; final H5File file = (H5File) testDataset.getFileFormat(); assertNotNull(file); // test existing dataset in file for (int idx = 0; idx < names.length; idx++) { H5CompoundDS dset = new H5CompoundDS(file, names[idx], paths[idx]); assertNotNull(dset); // make sure that the data content is correct try { data = (Vector) dset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(data.size() > 0); final int[] ints = (int[]) data.get(0); final float[] floats = (float[]) data.get(1); final String[] strs = (String[]) data.get(2); assertNotNull(ints); assertNotNull(floats); assertNotNull(strs); for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(H5TestFile.DATA_INT[i], ints[i]); assertEquals(H5TestFile.DATA_FLOAT[i], floats[i], Float.MIN_VALUE); assertTrue(H5TestFile.DATA_STR[i].equals(strs[i])); } // check the name and path assertTrue(DNAME_SUB.equals(dset.getFullName())); assertTrue(DNAME_SUB.equals(dset.getPath() + dset.getName())); dset.clear(); dset = null; } // test a non-existing dataset final H5CompoundDS dset = new H5CompoundDS(file, "NO_SUCH_DATASET", "NO_SUCH_PATH"); dset.init(); dset.clearData(); data = null; try { data = (Vector) dset.getData(); } catch (final Exception ex) { data = null; // Expected - intentional } assertNull(data); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5CompoundDS#H5CompoundDS(ncsa.hdf.object.FileFormat, java.lang.String, java.lang.String, long[])} * . *

    * What to test: *

      *
    • Construct an H5CompoundDS object that exits in file *
        *
      • new H5CompoundDS (file, null, fullpath, oid) *
      • new H5CompoundDS (file, fullname, null, oid) *
      • new H5CompoundDS (file, name, path, oid) *
      *
    • Construct an H5CompoundDS object that does not exist in file *
    */ public final void testH5CompoundDSFileFormatStringStringLongArray() { Vector data = null; final String[] names = { null, DNAME_SUB, DNAME.substring(1) }; final String[] paths = { DNAME_SUB, null, H5TestFile.NAME_GROUP }; final H5File file = (H5File) testDataset.getFileFormat(); assertNotNull(file); // test existing dataset in file long[] oid = null; for (int idx = 0; idx < names.length; idx++) { try { final byte[] ref_buf = H5.H5Rcreate(file.getFID(), DNAME_SUB, HDF5Constants.H5R_OBJECT, -1); final long l = HDFNativeData.byteToLong(ref_buf, 0); oid = new long[1]; oid[0] = l; // save the object ID } catch (final HDF5Exception ex) { fail("H5.H5Rcreate() failed. " + ex); } assertNotNull(oid); H5CompoundDS dset = new H5CompoundDS(file, names[idx], paths[idx], oid); assertNotNull(dset); // make sure that the data content is correct try { data = (Vector) dset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(data.size() > 0); final int[] ints = (int[]) data.get(0); final float[] floats = (float[]) data.get(1); final String[] strs = (String[]) data.get(2); assertNotNull(ints); assertNotNull(floats); assertNotNull(strs); for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(H5TestFile.DATA_INT[i], ints[i]); assertEquals(H5TestFile.DATA_FLOAT[i], floats[i], Float.MIN_VALUE); assertTrue(H5TestFile.DATA_STR[i].equals(strs[i])); } // check the name and path assertTrue(DNAME_SUB.equals(dset.getFullName())); assertTrue(DNAME_SUB.equals(dset.getPath() + dset.getName())); dset.clear(); dset = null; } // test a non-existing dataset final H5CompoundDS dset = new H5CompoundDS(file, "NO_SUCH_DATASET", "NO_SUCH_PATH"); dset.init(); dset.clearData(); data = null; try { data = (Vector) dset.getData(); } catch (final Exception ex) { data = null; // Expected - intentional } assertNull(data); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5CompoundDS#getMetadata()}. *

    * What to test: *

      *
    • Get all the attributes *
    • Check the content of the attributes *
    */ public final void testGetMetadata() { Vector attrs = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); final int n = attrs.size(); for (int i = 0; i < n; i++) { final Attribute attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == H5Datatype.CLASS_STRING) { assertTrue(H5TestFile.ATTRIBUTE_STR.getName().equals(attr.getName())); assertTrue(((String[]) H5TestFile.ATTRIBUTE_STR.getValue())[0].equals(((String[]) attr.getValue())[0])); } else if (dtype.getDatatypeClass() == H5Datatype.CLASS_INTEGER) { assertTrue(H5TestFile.ATTRIBUTE_INT_ARRAY.getName().equals(attr.getName())); final int[] expected = (int[]) H5TestFile.ATTRIBUTE_INT_ARRAY.getValue(); assertNotNull(expected); final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < expected.length; j++) { assertEquals(expected[j], ints[j]); } } } // for (int i=0; i * What to test: *
      *
    • Update the value of an existing attribute *
    • Attach a new attribute *
    • Close and re-open file to check if the change is made in file *
    • Restore to the orginal state *
    */ public final void testWriteMetadata() { Vector attrs = null; Attribute attr = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); // update existing attribute int n = attrs.size(); for (int i = 0; i < n; i++) { attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == H5Datatype.CLASS_STRING) { final String[] strs = (String[]) attr.getValue(); strs[0] = TEST_VALUE_STR; } else if (dtype.getDatatypeClass() == H5Datatype.CLASS_INTEGER) { final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < ints.length; j++) { ints[j] = TEST_VALUE_INT; } } try { testDataset.writeMetadata(attr); } catch (final Exception ex) { fail("writeMetadata() failed. " + ex); } } // for (int i=0; i) testDataset.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); n = attrs.size(); Attribute newAttr = null; for (int i = 0; i < n; i++) { attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == H5Datatype.CLASS_STRING) { assertTrue(H5TestFile.ATTRIBUTE_STR.getName().equals(attr.getName())); assertTrue(TEST_VALUE_STR.equals(((String[]) attr.getValue())[0])); } else if (dtype.getDatatypeClass() == H5Datatype.CLASS_INTEGER) { assertTrue(H5TestFile.ATTRIBUTE_INT_ARRAY.getName().equals(attr.getName())); final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < ints.length; j++) { assertEquals(TEST_VALUE_INT, ints[j]); } } else if (dtype.getDatatypeClass() == H5Datatype.CLASS_FLOAT) { newAttr = attr; final float[] floats = (float[]) attr.getValue(); assertEquals(TEST_VALUE_FLOAT, floats[0], Float.MIN_VALUE); } } // for (int i=0; i * What to test: *
      *
    • Remove all existing attributes *
    • Close and reopen file to check if all attribute are removed from file *
    • Restore to the original state *
    */ public final void testRemoveMetadata() { Vector attrs = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); // remove all attributes final int n = attrs.size(); final Object[] arrayAttr = attrs.toArray(); for (int i = 0; i < n; i++) { try { testDataset.removeMetadata(arrayAttr[i]); } catch (final Exception ex) { fail("removeMetadata() failed. " + ex); } } // close the file and reopen it try { testDataset.clear(); testFile.close(); testFile.open(); testDataset = (H5CompoundDS) testFile.get(DNAME); } catch (final Exception ex) { fail("write() failed. " + ex); } attrs = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertFalse(attrs.size() > 0); // restore to the original try { testDataset.writeMetadata(H5TestFile.ATTRIBUTE_STR); testDataset.writeMetadata(H5TestFile.ATTRIBUTE_INT_ARRAY); } catch (final Exception ex) { fail("writeMetadata() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5CompoundDS#create(java.lang.String, ncsa.hdf.object.Group, long[], java.lang.String[], ncsa.hdf.object.Datatype[], int[], java.lang.Object)} * . *

    * Create a simple compound dataset, i.e. compound members can be either a * scalar data or 1D array. * *

         * public static Dataset create(
         *             String name,
         *             Group pgroup,
         *             long[] dims,
         *             String[] memberNames,
         *             Datatype[] memberDatatypes,
         *             int[] memberSizes,
         *             Object data) throws Exception
         * 
    *

    * What to test: *

      *
    • Create new compound datasets *
        *
      • Compound dataset with one field -- an 1D integer array: {int[]} *
      • Compound dataset with one field -- an 1D float array: {float[]} *
      • Compound dataset with one field -- a string: {string} *
      • Compound dataset with three fields {int[], float[], string} *
      *
    • Close and reopen the file *
    • Check the content of the new datasets *
    • Restore to the orginal file (remove the new datasets) *
    */ @SuppressWarnings("unchecked") public final void testCreateStringGroupLongArrayStringArrayDatatypeArrayIntArrayObject() { H5CompoundDS dset = null; H5Group rootGrp = null; Vector compData = new Vector(); final String compIntName = "/compoundInt"; final String compFloatName = "/compoundFloat"; final String compStrName = "/compoundStr"; final String compIntFloatStrName = "compoundIntFloatStr"; final int[] expectedInts = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; final float[] expectedFloats = { .1f, .2f, .3f, .4f, .5f, .6f, .7f, .8f, .9f, .10f }; final String[] expectedStr = { "Str 1", "Str 2", "Str 3", "Str 4", "Str 5" }; final long[] dims = { 5 }; final int[] memberOrders = { 2 }; try { rootGrp = (H5Group) testFile.get("/"); } catch (final Exception ex) { fail("testFile.get(\"/\") failed. " + ex); } // Compound dataset with one field -- an integer array: {int[]} compData.setSize(0); compData.add(expectedInts); try { dset = (H5CompoundDS) H5CompoundDS.create(compIntName, rootGrp, dims, new String[] { "int" }, new H5Datatype[] { typeInt }, memberOrders, compData); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); // Compound dataset with one field -- a float array: {float[} compData.setSize(0); compData.add(expectedFloats); try { dset = (H5CompoundDS) H5CompoundDS.create(compFloatName, rootGrp, dims, new String[] { "float" }, new H5Datatype[] { typeFloat }, memberOrders, compData); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); // Compound dataset with one field -- a string: {string} compData.setSize(0); compData.add(expectedStr); try { dset = (H5CompoundDS) H5CompoundDS.create(compStrName, rootGrp, dims, new String[] { "Str" }, new H5Datatype[] { typeStr }, new int[] { 1 }, compData); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); // Compound dataset with three fields {int, float, string} compData.setSize(0); compData.add(expectedInts); compData.add(expectedFloats); compData.add(expectedStr); try { dset = (H5CompoundDS) H5CompoundDS.create(compIntFloatStrName, rootGrp, dims, new String[] { "int", "float", "Str" }, new H5Datatype[] { typeInt, typeFloat, typeStr }, new int[] { 2, 2, 1 }, compData); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); // close the file and reopen it try { testFile.close(); testFile.open(); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } // check the content of the new compIntName try { dset.clear(); dset = (H5CompoundDS) testFile.get(compIntName); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); compData = null; dset.init(); try { compData = (Vector) dset.getData(); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(compData); int[] ints = (int[]) compData.get(0); for (int i = 0; i < expectedInts.length; i++) { assertEquals(expectedInts[i], ints[i]); } try { testFile.delete(dset); // delete the new datast } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } // check the content of the new compFloatName try { dset.clear(); dset = (H5CompoundDS) testFile.get(compFloatName); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); compData = null; dset.init(); try { compData = (Vector) dset.getData(); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(compData); float[] floats = (float[]) compData.get(0); for (int i = 0; i < expectedFloats.length; i++) { assertEquals(expectedFloats[i], floats[i], Float.MIN_VALUE); } try { testFile.delete(dset); // delete the new datast } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } // check the content of the new compStrName try { dset.clear(); dset = (H5CompoundDS) testFile.get(compStrName); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); compData = null; dset.init(); try { compData = (Vector) dset.getData(); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(compData); String[] strs = (String[]) compData.get(0); for (int i = 0; i < expectedStr.length; i++) { assertTrue(expectedStr[i].equals(strs[i])); } try { testFile.delete(dset); // delete the new datast } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } // check the content of the new compIntFloatStrName try { dset.clear(); dset = (H5CompoundDS) testFile.get(compIntFloatStrName); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); compData = null; dset.init(); try { compData = (Vector) dset.getData(); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(compData); assertTrue(compData.size() >= 3); ints = (int[]) compData.get(0); floats = (float[]) compData.get(1); strs = (String[]) compData.get(2); for (int i = 0; i < expectedInts.length; i++) { assertEquals(expectedInts[i], ints[i]); } for (int i = 0; i < expectedFloats.length; i++) { assertEquals(expectedFloats[i], floats[i], Float.MIN_VALUE); } for (int i = 0; i < expectedStr.length; i++) { assertTrue(expectedStr[i].equals(strs[i])); } try { testFile.delete(dset); // delete the new datast } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5CompoundDS#create(java.lang.String, ncsa.hdf.object.Group, long[], java.lang.String[], ncsa.hdf.object.Datatype[], int[], int[][], java.lang.Object)} * . *

    * Create a simple compound dataset, i.e. compound members can be * multiple-dimensional array. * *

         * public static Dataset create(
         *             String name,
         *             Group pgroup,
         *             long[] dims,
         *             String[] memberNames,
         *             Datatype[] memberDatatypes,
         *             int[] memberRanks,
         *             int[][] memberDims,
         *             Object data) throws Exception
         * 
    *

    * What to test: *

      *
    • Create new compound datasets *
    • Compound dataset with two fields -- {int[][], float[][]} *
    • Close and reopen the file *
    • Check the content of the new datasets *
    • Restore to the orginal file (remove the new dataset) *
    */ @SuppressWarnings("unchecked") public final void testCreateStringGroupLongArrayStringArrayDatatypeArrayIntArrayIntArrayArrayObject() { H5CompoundDS dset = null; H5Group rootGrp = null; Vector compData = new Vector(); final String compName = "/compound--{int[][], float[][]}"; final int[] expectedInts = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; final float[] expectedFloats = { .1f, .2f, .3f, .4f, .5f, .6f, .7f, .8f, .9f, .10f, .11f, .12f }; final long[] dims = { 2 }; final int[] memberRanks = { 2, 2 }; final long[][] memberDims = { { 3, 2 }, { 3, 2 } }; try { rootGrp = (H5Group) testFile.get("/"); } catch (final Exception ex) { fail("testFile.get(\"/\") failed. " + ex); } // create new compound dataset compData.setSize(0); compData.add(expectedInts); compData.add(expectedFloats); try { dset = (H5CompoundDS) H5CompoundDS.create(compName, rootGrp, dims, null, null, 0, new String[] { "int", "float" }, new H5Datatype[] { typeInt, typeFloat }, memberRanks, memberDims, compData); } catch (final Exception ex) { ex.printStackTrace(); fail("H5CompoundDS.create()[float] failed. " + ex); } assertNotNull(dset); // close the file and reopen it try { testFile.close(); testFile.open(); } catch (final Exception ex) { fail("testFile.close-open failed. " + ex); } // check the content of the new dataset try { dset.clear(); dset = (H5CompoundDS) testFile.get(compName); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); compData = null; dset.init(); try { compData = (Vector) dset.getData(); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(compData); assertTrue(compData.size() >= 2); final int[] ints = (int[]) compData.get(0); final float[] floats = (float[]) compData.get(1); for (int i = 0; i < expectedInts.length; i++) { assertEquals(expectedInts[i], ints[i]); } for (int i = 0; i < expectedFloats.length; i++) { assertEquals(expectedFloats[i], floats[i], Float.MIN_VALUE); } try { testFile.delete(dset); // delete the new datast } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5CompoundDS#create(java.lang.String, ncsa.hdf.object.Group, long[], long[], long[], int, java.lang.String[], ncsa.hdf.object.Datatype[], int[], int[][], java.lang.Object)} * . *

    * Create a simple compound dataset with compression options, i.e. compound * members can be multiple-dimensional array. * *

         * public static Dataset create(
         *             String name,
         *             Group pgroup,
         *             long[] dims,
         *             long[] maxdims,
         *             long[] chunks,
         *             int gzip,
         *             String[] memberNames,
         *             Datatype[] memberDatatypes,
         *             int[] memberRanks,
         *             int[][] memberDims,
         *             Object data) throws Exception
         * 
    *

    * What to test: *

      *
    • Create new compound datasets with level-9 gzip compression *
    • Compound dataset with three fields -- {int, float, string} *
    • Close and reopen the file *
    • Check the content of the new datasets *
    • Restore to the orginal file (remove the new dataset) *
    */ @SuppressWarnings("unchecked") public final void testCreateStringGroupLongArrayLongArrayLongArrayIntStringArrayDatatypeArrayIntArrayIntArrayArrayObject() { H5CompoundDS dset = null; H5Group rootGrp = null; Vector compData = new Vector(); final String compName = "/compound compressed with gzip level 9"; final long[] maxdims = { H5TestFile.DIMs[0] * 5, H5TestFile.DIMs[1] * 5 }; try { rootGrp = (H5Group) testFile.get("/"); } catch (final Exception ex) { fail("testFile.get(\"/\") failed. " + ex); } // create new compound dataset compData.setSize(0); compData.add(H5TestFile.DATA_INT); compData.add(H5TestFile.DATA_FLOAT); compData.add(H5TestFile.DATA_STR); try { dset = (H5CompoundDS) H5CompoundDS.create(compName, rootGrp, H5TestFile.DIMs, maxdims, H5TestFile.CHUNKs, 9, new String[] { "int", "float", "str" }, new H5Datatype[] {typeInt, typeFloat, typeStr }, new int[] { 1, 1, 1 }, new long[][] { { 1 }, { 1 }, { 1 } }, compData); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); // close the file and reopen it try { testFile.close(); testFile.open(); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } // check the content of the new dataset try { dset.clear(); dset = (H5CompoundDS) testFile.get(compName); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(dset); compData = null; dset.init(); try { compData = (Vector) dset.getData(); } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } assertNotNull(compData); assertTrue(compData.size() >= 3); final int[] ints = (int[]) compData.get(0); final float[] floats = (float[]) compData.get(1); final String[] strs = (String[]) compData.get(2); for (int i = 0; i < H5TestFile.DATA_INT.length; i++) { assertEquals(H5TestFile.DATA_INT[i], ints[i]); } for (int i = 0; i < H5TestFile.DATA_FLOAT.length; i++) { assertEquals(H5TestFile.DATA_FLOAT[i], floats[i], Float.MIN_VALUE); } for (int i = 0; i < H5TestFile.DATA_STR.length; i++) { assertTrue(H5TestFile.DATA_STR[i].equals(strs[i])); } try { testFile.delete(dset); // delete the new datast } catch (final Exception ex) { fail("H5CompoundDS.create() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5CompoundDS} IsSerializable. */ public final void testIsSerializable() { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oos; try { oos = new ObjectOutputStream(out); oos.writeObject(testDataset); oos.close(); } catch (IOException err) { err.printStackTrace(); fail("ObjectOutputStream failed: " + err); } assertTrue(out.toByteArray().length > 0); } /** * Test method for {@link ncsa.hdf.object.h5.H5CompoundDS} SerializeToDisk. *

    * What to test: *

      *
    • serialize a dataset identifier *
    • deserialize a dataset identifier *
    • open a dataset identifier *
    • get datatype and dataspace identifier for the dataset *
    */ public final void testSerializeToDisk() { try { FileOutputStream fos = new FileOutputStream("temph5cdset.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(testDataset); oos.close(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } H5CompoundDS test = null; try { FileInputStream fis = new FileInputStream("temph5cdset.ser"); ObjectInputStream ois = new ObjectInputStream(fis); test = (ncsa.hdf.object.h5.H5CompoundDS) ois.readObject(); ois.close(); // Clean up the file new File("temph5cdset.ser").delete(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } int did = -1, tid = -1, sid = -1; for (int loop = 0; loop < NLOOPS; loop++) { did = tid = sid = -1; try { did = test.open(); tid = H5.H5Dget_type(did); sid = H5.H5Dget_space(did); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(did > 0); assertTrue(tid > 0); assertTrue(sid > 0); try { H5.H5Tclose(tid); } catch (final Exception ex) {} try { H5.H5Sclose(sid); } catch (final Exception ex) {} try { H5.H5Dclose(did); } catch (final Exception ex) {} } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/H5FileTest.java0000644000175000017500000017400412050301057020164 0ustar sylvestresylvestre/** * */ package test.object; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.List; import javax.swing.tree.DefaultMutableTreeNode; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.structs.H5G_info_t; import ncsa.hdf.hdf5lib.structs.H5L_info_t; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.h5.H5Datatype; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5Group; import ncsa.hdf.object.h5.H5ScalarDS; /** * TestCase for H5File. *

    * This class tests all the public methods in H5ScalarDS class. *

    * The test file contains the following objects. * *

     * 
     * 
     *         /dataset_byte            Dataset {50, 10}
     *         /dataset_comp            Dataset {50, 10}
     *         /dataset_enum            Dataset {50, 10}
     *         /dataset_float           Dataset {50, 10}
     *         /dataset_image           Dataset {50, 10}
     *         /dataset_int             Dataset {50, 10}
     *         /dataset_str             Dataset {50, 10}
     *         /g0                      Group
     *         /g0/dataset_comp         Dataset {50, 10}
     *         /g0/dataset_int          Dataset {50, 10}
     *         /g0/datatype_float       Type
     *         /g0/datatype_int         Type
     *         /g0/datatype_str         Type
     *         /g0/g00                  Group
     *         /g0/g00/dataset_float    Dataset {50, 10}
     *         /g0_attr                 Group
     * 
    *

    * We use the following template to test all the methods: *

    * What to test: *

      *
    • Test for boundary conditions *
        *
      • *
      *
    • Test for failure *
        *
      • *
      *
    • Test for success on general functionality *
        *
      • *
      *
    * * @author Peter Cao, The HDF Group */ public class H5FileTest extends TestCase { private static final H5File H5FILE = new H5File(); private static final int NLOOPS = 10; private static final int TEST_VALUE_INT = Integer.MAX_VALUE; private static final float TEST_VALUE_FLOAT = Float.MAX_VALUE; private static final String TEST_VALUE_STR = "H5ScalarDSTest"; private static final String DNAME = H5TestFile.NAME_DATASET_INT; private static final String DNAME_SUB = H5TestFile.NAME_DATASET_INT_SUB; private H5Datatype typeInt = null; private H5Datatype typeFloat = null; private H5Datatype typeStr = null; private H5File testFile = null; private H5ScalarDS testDataset = null; /** * @param arg0 */ public H5FileTest(final String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); typeInt = new H5Datatype(Datatype.CLASS_INTEGER, H5TestFile.DATATYPE_SIZE, -1, -1); typeFloat = new H5Datatype(Datatype.CLASS_FLOAT, H5TestFile.DATATYPE_SIZE, -1, -1); typeStr = new H5Datatype(Datatype.CLASS_STRING, H5TestFile.STR_LEN, -1, -1); testFile = new H5File(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testFile.open(); testDataset = (H5ScalarDS) testFile.get(DNAME); assertNotNull(testDataset); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for {@link ncsa.hdf.object.h5.H5File#open()}. *

    * What to test: *

      *
    • open a file identifier *
    • check the file content *
    • close the file *
    */ public final void testOpen() { try { testFile.close(); } catch (final Exception ex) { } for (int i = 0; i < NLOOPS; i++) { int nObjs = 0; int fid = -1; final H5File file = new H5File(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); try { fid = file.open(); // open the full tree } catch (final Exception ex) { fail("file.open() failed. " + ex); } assertTrue(fid > 0); // try to get all object in the file try { for (int j = 0; j < H5TestFile.OBJ_NAMES.length; j++) { assertNotNull(file.get(H5TestFile.OBJ_NAMES[j])); } } catch (final Exception ex) { fail("file.get() failed. " + ex); } try { nObjs = H5.H5Fget_obj_count(file.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertTrue(nObjs <= 1); // file id should be the only this left // open. IS THIS BECAUSE THE ONLY THING WE // HAVE DONE IS OPEN THE FILE? try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } } // for (int i=0; i * What to test: *
      *
    • create a file *
    • access the file *
    • close/delete the file *
    */ public final void testCreateString() { final String nameNew = "testH5File.h5"; H5File file = null; try { file = (H5File) H5FILE.createFile(nameNew, FileFormat.FILE_CREATE_DELETE); } catch (final Exception ex) { fail("file.create() failed. " + ex); } int fid = -1; try { fid = file.open(); } catch (final Exception ex) { fail("file.open() failed. " + ex); } assertTrue(fid > 0); try { file.close(); } catch (final Exception ex) { } file.delete(); } /** * Test method for {@link ncsa.hdf.object.h5.H5File#getRootNode()}. *

    * What to test: *

      *
    • get the root node *
    • check the content of the root node *
    */ public final void testGetRootNode() { final javax.swing.tree.TreeNode root = testFile.getRootNode(); assertNotNull(root); assertTrue(root.getChildCount() > 0); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5File#isReadOnly()}. */ public final void testIsReadOnly() { assertFalse(testFile.isReadOnly()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#createGroup(java.lang.String, ncsa.hdf.object.Group)} * . *

    * What to test: *

      *
    • create a file *
    • create a group *
    • access the group *
    • close/delete the file *
    */ public final void testCreateGroup() { final String nameNew = "testH5File.h5"; H5File file = null; try { file = (H5File) H5FILE.createFile(nameNew, FileFormat.FILE_CREATE_DELETE); } catch (final Exception ex) { fail("file.create() failed. " + ex); } int fid = -1; try { fid = file.open(); } catch (final Exception ex) { fail("file.open() failed. " + ex); } assertTrue(fid > 0); Group grp = null; try { grp = file.createGroup("new group", null); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(grp); int gid = -1; try { gid = grp.open(); } catch (final Exception ex) { fail("fgrp.open() failed. " + ex); } assertTrue(gid > 0); grp.close(gid); try { file.close(); } catch (final Exception ex) { } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#createGroup(java.lang.String, ncsa.hdf.object.Group, int)} * . *

    * What to test: *

      *
    • create a file *
    • Sets link creation property list identifier *
    • Sets group creation property list identifier *
    • Check that group is not created when the order of group property list is incorrect. *
    • create a group *
    • create subgroups *
    • Check the new group and subgroup *
    • Check name of ith link in group by creation order. *
    • close/delete the file *
    */ public final void testCreateGroupWithGroupplist() { final String nameNew = "testH5File2.h5"; H5File file = null; int fid = -1; int gcpl = -1; int gid = -1; int lcpl = -1; Group grp = null; Group grp2 = null, grp3 = null; H5G_info_t ginfo; try { file = (H5File) H5FILE.createFile(nameNew, FileFormat.FILE_CREATE_DELETE); } catch (final Exception ex) { fail("file.create() failed. " + ex); } try { fid = file.open(); } catch (final Exception ex) { fail("file.open() failed. " + ex); } assertTrue(fid > 0); try { lcpl = H5.H5Pcreate(HDF5Constants.H5P_LINK_CREATE); //create lcpl if (lcpl >= 0) H5.H5Pset_create_intermediate_group(lcpl, true); } catch (final Exception ex) { fail("H5.H5Pcreate() failed. " + ex); } try { gcpl = H5.H5Pcreate(HDF5Constants.H5P_GROUP_CREATE); //create gcpl if (gcpl >= 0) { H5.H5Pset_link_creation_order(gcpl, HDF5Constants.H5P_CRT_ORDER_TRACKED + HDF5Constants.H5P_CRT_ORDER_INDEXED);//Set link creation order } } catch (final Exception ex) { fail("H5.H5Pcreate() failed. " + ex); } try { grp = file.createGroup("Group1/Group2/Group3", null, gcpl,lcpl); } catch (final Exception ex) { ; //Expected -intentional as the order of gplist is invalid. } assertNull(grp); try { grp = file.createGroup("Group1/Group2/Group3", null, lcpl,gcpl); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(grp); try { gid = grp.open(); } catch (final Exception ex) { fail("grp.open() failed. " + ex); } assertTrue(gid > 0); try { grp2 = file.createGroup("G4", grp); // create subgroups in /Group3 grp3 = file.createGroup("G3", grp); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(grp2); assertNotNull(grp3); try { String name = H5.H5Lget_name_by_idx(gid, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 1, HDF5Constants.H5P_DEFAULT); // Get name of 2nd link assertEquals("G3", name); } catch (final Exception ex) { fail("H5.H5Lget_name_by_idx() failed. " + ex); } grp.close(gid); try { H5.H5Pclose(lcpl); H5.H5Pclose(gcpl); } catch (final Exception ex) { } try { file.close(); } catch (final Exception ex) { } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#createGcpl(int, int, int)} * . *

    * What to test: *

      *
    • create a file *
    • set and create gcpl *
    • Check if gcpl has been created *
    • create group, using the gcpl created. *
    • create subgroups *
    • Check the new group and subgroups *
    • Check name of ith link in group by creation order. *
    • close/delete the file *
    */ public final void testcreateGcpl() { final String nameNew = "test8.h5"; H5File file = null; int fid = -1; int gcpl = -1; int gid = -1; Group grp = null; Group grp2 = null, grp3 = null; H5G_info_t ginfo; try { file = (H5File) H5FILE.createFile(nameNew, FileFormat.FILE_CREATE_DELETE); } catch (final Exception ex) { fail("file.create() failed. " + ex); } try { fid = file.open(); } catch (final Exception ex) { fail("file.open() failed. " + ex); } assertTrue(fid > 0); try { gcpl = file.createGcpl(Group.CRT_ORDER_INDEXED, 5, 3); } catch (final Exception ex) { fail("file.createGcpl() failed. " + ex); } try { grp = file.createGroup("/Group1", null, HDF5Constants.H5P_DEFAULT,gcpl); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(grp); try { gid = grp.open(); } catch (final Exception ex) { fail("grp.open() failed. " + ex); } assertTrue(gid > 0); try { grp2 = file.createGroup("G4", grp); // create subgroups in /Group1 grp3 = file.createGroup("G3", grp); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(grp2); assertNotNull(grp3); try { String name = H5.H5Lget_name_by_idx(gid, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 1, HDF5Constants.H5P_DEFAULT); // Get name of 2nd link assertEquals("G3", name); } catch (final Exception ex) { fail("H5.H5Lget_name_by_idx() failed. " + ex); } grp.close(gid); try { file.close(); } catch (final Exception ex) { } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#createScalarDS(java.lang.String, ncsa.hdf.object.Group, ncsa.hdf.object.Datatype, long[], long[], long[], int, java.lang.Object)} * ,
    * {@link ncsa.hdf.object.h5.H5File#createCompoundDS(java.lang.String, ncsa.hdf.object.Group, long[], java.lang.String[], ncsa.hdf.object.Datatype[], int[], java.lang.Object)} * ,
    * {@link ncsa.hdf.object.h5.H5File#createCompoundDS(java.lang.String, ncsa.hdf.object.Group, long[], long[], long[], int, java.lang.String[], ncsa.hdf.object.Datatype[], int[], java.lang.Object)} * ,
    * {@link ncsa.hdf.object.h5.H5File#createImage(java.lang.String, ncsa.hdf.object.Group, ncsa.hdf.object.Datatype, long[], long[], long[], int, int, int, java.lang.Object)} * ,
    {@link ncsa.hdf.object.h5.H5File#createDatatype(int, int, int, int)},
    * {@link ncsa.hdf.object.h5.H5File#createDatatype(int, int, int, int, java.lang.String)} * ,
    * {@link ncsa.hdf.object.h5.H5File#createLink(ncsa.hdf.object.Group, java.lang.String, ncsa.hdf.object.HObject)} * ,
    {@link ncsa.hdf.object.h5.H5File#get(java.lang.String)},
    * {@link ncsa.hdf.object.h5.H5File#getAttribute(int)},
    * {@link ncsa.hdf.object.h5.H5File#writeAttribute(ncsa.hdf.object.HObject, ncsa.hdf.object.Attribute, boolean)} * . *

    * What to test: *

      *
    • create a file *
    • create a different types of objects *
    • access the objects *
    • close/delete the new file *
    */ public final void testCreateObjects() { final String nameNew = "testH5File.h5"; H5File file = null; try { file = H5TestFile.createTestFile(nameNew); file.open(); } catch (final Exception ex) { fail("H5TestFile.createTestFile() failed. " + ex); } assertNotNull(file); // try to get all object in the file try { for (int j = 0; j < H5TestFile.OBJ_NAMES.length; j++) { assertNotNull(file.get(H5TestFile.OBJ_NAMES[j])); } } catch (final Exception ex) { fail("file.get() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(file.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertTrue(nObjs <= 1); // file id should be the only this left open try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#isThisType(java.lang.String)}. *

    * What to test: *

      *
    • Check an HDF5 file *
    • Check a non HDF5 file *
    */ public final void testIsThisTypeString() { assertTrue(H5FILE.isThisType(H5TestFile.NAME_FILE_H5)); assertFalse(H5FILE.isThisType("No such file")); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#isThisType(ncsa.hdf.object.FileFormat)}. *

    * What to test: *

      *
    • Check an HDF5 file *
    • Check a non HDF5 file *
    */ public final void testIsThisTypeFileFormat() { assertTrue(H5FILE.isThisType(testFile)); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#copy(ncsa.hdf.object.HObject, ncsa.hdf.object.Group)} * . *

    * What to test: *

      *
    • create a new file *
    • copy all the objects (datasts, groups and datatypes) from test file * to the new file *
    • check the content of the new file *
    • close/delete the new file *
    */ public final void testCopyHObjectGroup() { Group root = null; HObject srcObj = null, dstObj = null; final String nameNewFile = "testH5File.h5"; String dstName = null; H5File file = null; try { root = (Group) testFile.get("/"); } catch (final Exception ex) { fail("file.get() failed. " + ex); } assertNotNull(root); final List members = root.getMemberList(); final int n = members.size(); assertTrue(n > 0); try { file = (H5File) H5FILE.createFile(nameNewFile, FileFormat.FILE_CREATE_DELETE); file.open(); } catch (final Exception ex) { fail("file.create() failed. " + ex); } assertNotNull(file); try { root = (Group) file.get("/"); } catch (final Exception ex) { fail("file.get() failed. " + ex); } assertNotNull(root); // copy all the objects to the new file for (int i = 0; i < n; i++) { dstName = null; dstObj = null; srcObj = (HObject) members.get(i); try { dstObj = (HObject) ((DefaultMutableTreeNode) testFile.copy( srcObj, root)).getUserObject(); } catch (final Exception ex) { // image palette probably is copied already if (H5TestFile.NAME_DATASET_IMAGE_PALETTE.equals(srcObj .getFullName())) { continue; } fail("file.copy() failed on " + srcObj.getFullName() + ". " + ex); } assertNotNull(dstObj); dstName = dstObj.getFullName(); // re-open the file to make sure the object is writen to file try { file.close(); file.open(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } try { dstObj = file.get(dstName); } catch (final Exception ex) { fail("file.get() failed on " + dstObj.getFullName() + ". " + ex); } assertNotNull(dstObj); } try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#delete(ncsa.hdf.object.HObject)}. *

    * What to test: *

      *
    • create a new file with all types of objects (datasts, groups and * datatypes) *
    • check the content of the new file *
    • delete all objects *
    • close/re-open the file to check the content of the file *
    • close/delete the new file *
    */ public final void testDeleteHObject() { Group root = null; HObject obj = null; final String nameNewFile = "testH5File.h5"; H5File file = null; try { file = H5TestFile.createTestFile(nameNewFile); file.open(); } catch (final Exception ex) { fail("H5TestFile.createTestFile() failed. " + ex); } assertNotNull(file); try { root = (Group) file.get("/"); } catch (final Exception ex) { fail("file.get() failed. " + ex); } assertNotNull(root); final List members = root.getMemberList(); final int n = members.size(); assertTrue(n > 0); final Object[] objs = members.toArray(); for (int i = 0; i < n; i++) { obj = (HObject) objs[i]; try { file.delete(obj); } catch (final Exception ex) { fail("file.copy() failed on " + obj.getFullName() + ". " + ex); } // re-open the file to make sure the object is writen to file try { file.close(); file.open(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } try { obj = file.get(obj.getFullName()); } catch (final Exception ex) { fail("file.get(getFullName) failed. " + ex); } assertNull(obj); } try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } file.delete(); } /** * Test method for {@link ncsa.hdf.object.h5.H5File#get(java.lang.String)}. *

    * What to test: *

      *
    • ceate a test file *
    • do not call file.open() (without the full tree in memory) *
    • get all types of objects (datasts, groups and datatypes) *
    • get object that does not exitst in file *
    • close and delete the test file *
    */ public final void testGet() { int nObjs = 0; // number of object left open HObject obj = null; final String nameNewFile = "testH5File.h5"; H5File file = null; try { H5TestFile.createTestFile(nameNewFile); } catch (final Exception ex) { fail("H5TestFile.createTestFile() failed. " + ex); } file = new H5File(nameNewFile); // get object that does not exist in file try { obj = file.get("/_INVALID_OBJECT_PATH_SHOULD_RETURN_NULL_"); } catch (final Exception ex) { fail("file.get() failed on invalid path. " + ex); } assertNull(obj); // get all object in file for (int i = 0; i < H5TestFile.OBJ_NAMES.length; i++) { try { obj = file.get(H5TestFile.OBJ_NAMES[i]); } catch (final Exception ex) { fail("file.get(\"" + H5TestFile.OBJ_NAMES[i] + "\" failed. " + ex); } assertNotNull(obj); } try { nObjs = H5.H5Fget_obj_count(file.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } file.delete(); } /** * Test method for {@link ncsa.hdf.object.h5.H5File#get(java.lang.String)}. *

    * What to test: *

      *
    • ceate a test file *
    • call file.open() (with the full tree in memory) *
    • get all types of objects (datasts, groups and datatypes) *
    • get object that does not exitst in file *
    • close and delete the test file *
    */ public final void testGetFromOpen() { int nObjs = 0; // number of object left open HObject obj = null; final String nameNewFile = "testH5File.h5"; H5File file = null; try { H5TestFile.createTestFile(nameNewFile); } catch (final Exception ex) { fail("H5TestFile.createTestFile() failed. " + ex); } file = new H5File(nameNewFile); try { file.open(); } catch (final Exception ex) { fail("file.open failed. " + ex); } // get object that does not exist in file try { obj = file.get("/_INVALID_OBJECT_PATH_SHOULD_RETURN_NULL_"); } catch (final Exception ex) { fail("file.get() failed on invalid path. " + ex); } assertNull(obj); // get all object in file for (int i = 0; i < H5TestFile.OBJ_NAMES.length; i++) { try { obj = file.get(H5TestFile.OBJ_NAMES[i]); } catch (final Exception ex) { fail("file.get(\"" + H5TestFile.OBJ_NAMES[i] + "\" failed. " + ex); } assertNotNull(obj); } try { nObjs = H5.H5Fget_obj_count(file.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#H5File(java.lang.String, int)}. *

    * What to test: *

      *
    • create files with READ, WRITE and CREATE opttions *
    • check access permision of the files *
    • close/delete the new file *
    */ public final void testH5FileStringInt() { Dataset dset = null; final String nameNewFile = "testH5File.h5"; H5File file = null; try { file = H5TestFile.createTestFile(nameNewFile); file.open(); } catch (final Exception ex) { fail("H5TestFile.createTestFile() failed. " + ex); } assertNotNull(file); try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } // make sure the file is read only try { file = new H5File(nameNewFile, FileFormat.READ); file.open(); } catch (final Exception ex) { fail("new H5File(nameNewFile, H5File.READ) failed. " + ex); } assertTrue(file.isReadOnly()); try { dset = (Dataset) file.get(H5TestFile.NAME_DATASET_FLOAT); dset.getData(); } catch (final Exception ex) { fail("file.get() failed. " + ex); } assertNotNull(dset); boolean isWrittenFailed = false; try { dset.write(); } catch (final Exception ex) { isWrittenFailed = true; // Expected. } assertTrue(isWrittenFailed); try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } // make sure the file is read/write try { file = new H5File(nameNewFile, FileFormat.WRITE); file.open(); } catch (final Exception ex) { fail("new H5File(nameNewFile, H5File.READ) failed. " + ex); } try { dset = (Dataset) file.get(H5TestFile.NAME_DATASET_FLOAT); dset.getData(); } catch (final Exception ex) { fail("file.get() failed. " + ex); } assertNotNull(dset); try { dset.write(); } catch (final Exception ex) { fail("file.write() failed. " + ex); } try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } // create a new file try { file = new H5File(nameNewFile, FileFormat.CREATE); file.open(); } catch (final Exception ex) { fail("new H5File(nameNewFile, H5File.READ) failed. " + ex); } try { dset = (Dataset) file.get(H5TestFile.NAME_DATASET_FLOAT); dset.getData(); } catch (final Exception ex) { ; // Expected. The file is empty. } try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } file.delete(); } /** * Test method for {@link ncsa.hdf.object.h5.H5File#open(int)}. *

    * What to test: *

      *
    • open a file with H5F_CLOSE_STRONG file access *
    • check the file content *
    • close the file *
    */ public final void testOpenInt() { try { testFile.close(); } catch (final Exception ex) { } int nObjs = 0; int plist = -1; ; final H5File file = new H5File(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); try { plist = H5.H5Pcreate(HDF5Constants.H5P_FILE_ACCESS); H5.H5Pset_fclose_degree(plist, HDF5Constants.H5F_CLOSE_STRONG); } catch (final Exception ex) { fail("H5.H5Pcreate() failed. " + ex); } try { file.open(plist); // opent the full tree } catch (final Exception ex) { fail("file.open() failed. " + ex); } try { H5.H5Pclose(plist); } catch (final Exception ex) { } // try to get all object in the file try { for (int j = 0; j < H5TestFile.OBJ_NAMES.length; j++) { assertNotNull(file.get(H5TestFile.OBJ_NAMES[j])); } } catch (final Exception ex) { fail("file.get() failed. " + ex); } try { nObjs = H5.H5Fget_obj_count(file.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } assertTrue(nObjs <= 1); // file id should be the only this left open try { testFile.open(); } catch (final Exception ex) { } nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#updateReferenceDataset(ncsa.hdf.object.h5.H5File, ncsa.hdf.object.h5.H5File)} * . *

    * What to test: *

      *
    • create a new file *
    • copy a reference dataset from the test file to the new file *
    • check the content of the dataset in the new file *
    • close/delete the new file *
    */ public final void testUpdateReferenceDataset() { Group root = null; HObject srcObj = null, dstObj = null; final String nameNewFile = "testH5File.h5"; String dstName = null; H5File file = null; try { root = (Group) testFile.get("/"); } catch (final Exception ex) { fail("file.get() failed. " + ex); } assertNotNull(root); final List members = root.getMemberList(); final int n = members.size(); assertTrue(n > 0); try { file = (H5File) H5FILE.createFile(nameNewFile, FileFormat.FILE_CREATE_DELETE); file.open(); } catch (final Exception ex) { fail("file.create() failed. " + ex); } assertNotNull(file); try { root = (Group) file.get("/"); } catch (final Exception ex) { fail("file.get() failed. " + ex); } assertNotNull(root); // copy all the objects to the new file for (int i = 0; i < n; i++) { dstName = null; dstObj = null; srcObj = (HObject) members.get(i); try { dstObj = (HObject) ((DefaultMutableTreeNode) testFile.copy( srcObj, root)).getUserObject(); } catch (final Exception ex) { // image palette probably is copied already if (H5TestFile.NAME_DATASET_IMAGE_PALETTE.equals(srcObj .getFullName())) { continue; } fail("file.copy() failed on " + srcObj.getFullName() + ". " + ex); } assertNotNull(dstObj); dstName = dstObj.getFullName(); // re-open the file to make sure the object is writen to file try { file.close(); file.open(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } try { dstObj = file.get(dstName); } catch (final Exception ex) { fail("file.get() failed on " + dstObj.getFullName() + ". " + ex); } assertNotNull(dstObj); } try { H5File.updateReferenceDataset(testFile, file); } catch (final Exception ex) { fail("H5File.updateReferenceDataset() failed. " + ex); } int[] otype = { 1 }; int obj_type = -1; int did = -1; byte[] read_data = new byte[3920]; HObject obj = null; //Check if the copied dataset containing references, point to correct object type. try { obj = file.get(H5TestFile.OBJ_NAMES[17]); did = H5.H5Dopen(file.getFID(),obj.getName(), HDF5Constants.H5P_DEFAULT); H5.H5Dread(did, HDF5Constants.H5T_STD_REF_OBJ, HDF5Constants.H5S_ALL,HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, read_data); byte rbuf0[]= new byte[8]; int srcPos =0; for (int i = 0; i < 17; i++) { System.arraycopy(read_data, srcPos, rbuf0, 0, 8); srcPos = srcPos + 8; obj_type = H5.H5Rget_obj_type(file.getFID(), HDF5Constants.H5R_OBJECT, rbuf0, otype); assertTrue(obj_type== H5TestFile.OBJ_TYPES[i]); } } catch (final Exception ex) { ex.printStackTrace(); fail("file.get() failed. " + ex); } try{ H5.H5Dclose(did); } catch (final Exception ex) { } try { file.close(); } catch (final Exception ex) { fail("file.close() failed. " + ex); } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#createImageAttributes(ncsa.hdf.object.Dataset, int)} * . */ public final void testCreateImageAttributes() { H5ScalarDS img = null; try { img = (H5ScalarDS) testFile.get(H5TestFile.NAME_DATASET_IMAGE); } catch (final Exception ex) { fail("file.get() failed. " + ex); } assertNotNull(img); assertTrue(img.hasAttribute()); assertTrue(img.isImage()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#setLibBounds(int , int )} * {@link ncsa.hdf.object.h5.H5File#getLibBounds()} */ public final void testSetLibBounds() { int low = HDF5Constants.H5F_LIBVER_LATEST; int high = HDF5Constants.H5F_LIBVER_LATEST; final H5File file = new H5File(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); try{ file.open(); file.setLibBounds(low,high); } catch (final Exception ex) { fail("testFile.setLibBounds() failed. " + ex); } int[] libver = new int[2]; try{ libver = file.getLibBounds(); } catch (final Exception ex) { fail("testFile.getLibBounds() failed. " + ex); } assertEquals(HDF5Constants.H5F_LIBVER_LATEST, libver[0]); assertEquals(HDF5Constants.H5F_LIBVER_LATEST, libver[1]); try{ file.close(); } catch(Exception ex){ } try{ testFile.setLibBounds(-1, -1); } catch (final Exception ex) { fail("testFile.setLibBounds() failed. " + ex); } } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#createLink(ncsa.hdf.object.Group, java.lang.String, ncsa.hdf.object.HObject, int)} * . *

    * What to test: *

      *
    • create a file *
    • create groups *
    • create subgroups and dataset *
    • Create soft link and hard link *
    • Checks the soft link and hard link *
    • Create a soft dangling link *
    • Check the soft dangling link *
    • Retrieve Link information. *
    • Check the link type. *
    • close/delete the file *
    */ public final void testCreateLink() { final String nameNew = "testH5FileLinks1.h5"; H5File file = null; int fid = -1; Group grp1 = null, grp2 = null; Group subgrp1 = null; Dataset d1 = null; try { file = (H5File) H5FILE.createFile(nameNew, FileFormat.FILE_CREATE_DELETE); } catch (final Exception ex) { fail("file.create() failed. " + ex); } try { fid = file.open(); } catch (final Exception ex) { fail("file.open() failed. " + ex); } assertTrue(fid > 0); try { grp1 = file.createGroup("Group1", null); grp2 = file.createGroup("Group2", null); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(grp1); assertNotNull(grp2); try { subgrp1 = file.createGroup("G2", grp1); // create subgroup in Group1 } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(subgrp1); long[] H5dims = { 4, 6}; try{ d1 = file.createScalarDS("DS1", grp1, typeInt, H5dims, null, null,0, null); //create dataset in Group1 } catch (final Exception ex) { fail("file.createScalarDS() failed. " + ex); } assertNotNull(d1); //Create Soft and hard Links HObject obj = null; try{ obj = file.createLink(grp1, "NAME_SOFT_LINK", d1, Group.LINK_TYPE_SOFT); }catch (final Exception ex) { ex.printStackTrace(); fail("file.createLink() failed. " + ex); } assertNotNull(obj); //Check the name of the target object the link points to is correct. String linkTargetObjName = null; try{ linkTargetObjName = H5File.getLinkTargetName(obj); }catch (final Exception ex) { ex.printStackTrace(); fail("file.getLinkInfo() failed. " + ex); } assertEquals(linkTargetObjName,d1.getFullName()); try{ obj = file.createLink(grp2, "NAME_HARD_LINK", grp1,Group.LINK_TYPE_HARD); }catch (final Exception ex) { ex.printStackTrace(); fail("file.createLink() failed. " + ex); } assertNotNull(obj); //Create a Dangling Link to object. Group grplink = new H5Group(null, "DGroup", "/Group1", null); assertNotNull(grplink); try{ obj = file.createLink(grp1, "NAME_SOFT_LINK_DANGLE", grplink, Group.LINK_TYPE_SOFT); }catch (final Exception ex) { ex.printStackTrace(); fail("file.createLink() failed. " + ex); } assertNotNull(obj); //Create the object to which a dangling link is created try { grplink = file.createGroup("DGroup", grp1); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(grplink); //Create a soft dangling Link to object. String a = "D5"; try{ obj = file.createLink(grp1, "SD2", a, Group.LINK_TYPE_SOFT); }catch (final Exception ex) { ex.printStackTrace(); fail("file.createLink() failed. " + ex); } assertNotNull(obj); int gid = -1; try{ gid = grp1.open(); } catch(Exception ex){ fail("grp1.open()failed. " + ex); } H5L_info_t link_info = null; try { link_info = H5.H5Lget_info(gid, "NAME_SOFT_LINK_DANGLE", HDF5Constants.H5P_DEFAULT); } catch (Exception ex) { fail("H5.H5Lget_info: " + ex); } assertFalse("H5Lget_info ",link_info==null); assertTrue("H5Lget_info link type",link_info.type==HDF5Constants.H5L_TYPE_SOFT); assertTrue("Link Address ",link_info.address_val_size>0); try { grp1.close(gid); } catch (final Exception ex) { } try { file.close(); } catch (final Exception ex) { } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#createLink(ncsa.hdf.object.Group, java.lang.String, ncsa.hdf.object.HObject, int)} * . *

    * What to test: *

      *
    • create a file, file1 *
    • create group *
    • create subgroup and dataset *
    • create a second file, file2 *
    • create group in file2 *
    • Create External Links from file2 to dataset in File1 *
    • Checks the external link *
    • Create a dangling external link from file2 to object in file1 *
    • Checks the dangling external link *
    • Retrieve Link information. *
    • Check the link type. *
    • close/delete the files *
    */ public final void testCreateLinkExternal() { final String nameNew = "TESTFILE1.h5"; H5File file1 = null; H5File file2 = null; int fid = -1; Group grp1 = null; Group fgrp1 = null; Group subgrp1 = null; Dataset d1 = null; //Create File1. try { file1 = (H5File) H5FILE.createFile(nameNew, FileFormat.FILE_CREATE_DELETE); } catch (final Exception ex) { fail("file1.create() failed. " + ex); } try { fid = file1.open(); } catch (final Exception ex) { fail("file1.open() failed. " + ex); } assertTrue(fid > 0); try { grp1 = file1.createGroup("Group1", null); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(grp1); try { subgrp1 = file1.createGroup("G2", grp1); // create subgroups in Group1 } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(subgrp1); long[] H5dims = { 4, 6}; try{ d1 = file1.createScalarDS("DS1", grp1, typeInt, H5dims, null, null,0, null); //create dataset in Group1 } catch (final Exception ex) { fail("file.createScalarDS() failed. " + ex); } assertNotNull(d1); //Create File2 try { file2 = (H5File) H5FILE.createFile("TESTExternal.h5", FileFormat.FILE_CREATE_DELETE); } catch (final Exception ex) { fail("file2.create() failed. " + ex); } try { fid = file2.open(); } catch (final Exception ex) { fail("file2.open() failed. " + ex); } assertTrue(fid > 0); try { fgrp1 = file2.createGroup("Group1", null); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(fgrp1); //Create External Links from file2 to dataset in File1. HObject obj = null; try{ obj = file2.createLink(fgrp1, "NAME_EXTERNAL_LINK", d1,Group.LINK_TYPE_EXTERNAL); }catch (final Exception ex) { ex.printStackTrace(); fail("file.createLink() failed. " + ex); } assertNotNull(obj); //Check the name of the target object the link points to is correct. String linkTargetObjName = null; try{ linkTargetObjName = H5File.getLinkTargetName(obj); }catch (final Exception ex) { ex.printStackTrace(); fail("file.getLinkInfo() failed. " + ex); } String d1fullName = d1.getFile() + FileFormat.FILE_OBJ_SEP + d1.getFullName(); assertEquals(d1fullName,linkTargetObjName); //Create a Dangling Link to object. Group grplink = new H5Group(file1, "DGroup", null, null); assertNotNull(grplink); try{ obj = file2.createLink(fgrp1, "GROUP_HARD_LINK_DANGLE", grplink, Group.LINK_TYPE_EXTERNAL); }catch (final Exception ex) { ex.printStackTrace(); fail("file.createLink() failed. " + ex); } assertNotNull(obj); //Create the object to which a dangling link is created try { grplink = file1.createGroup("DGroup", null); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(grplink); //Retrieve Link information int gid = -1; try{ gid = fgrp1.open(); } catch(Exception ex){ fail("fgrp1.open()failed. " + ex); } H5L_info_t link_info = null; try { link_info = H5.H5Lget_info(gid, "GROUP_HARD_LINK_DANGLE", HDF5Constants.H5P_DEFAULT); } catch (Exception ex) { fail("H5.H5Lget_info: " + ex); } assertFalse("H5Lget_info ",link_info==null); assertTrue("H5Lget_info link type",link_info.type==HDF5Constants.H5L_TYPE_EXTERNAL); assertTrue("Link Address ",link_info.address_val_size>0); try { fgrp1.close(gid); } catch (final Exception ex) { } //Close file. try { file1.close(); } catch (final Exception ex) { } try { file2.close(); } catch (final Exception ex) { } file1.delete(); file2.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#getAttribute(int, int, int)}. *

    * What to test: *

      *
    • create a file *
    • create group *
    • create 3 attributes in a group *
    • open group *
    • retrieves attributes in alphabetical or creation order *
    • check the attribute name equals the attribute name retrieved from * list *
    • close group *
    • close/delete the files *
    */ public final void testCreateAttribute() { final String nameNew = "TESTFILEAttr1.h5"; H5File file = null; int fid = -1; Group g1 = null; Dataset d1 = null; try { file = (H5File) H5FILE.createFile(nameNew, FileFormat.FILE_CREATE_DELETE); // Create File1. } catch (final Exception ex) { fail("file1.create() failed. " + ex); } try { fid = file.open(); } catch (final Exception ex) { fail("file1.open() failed. " + ex); } assertTrue(fid > 0); try { g1 = file.createGroup("Group1", null); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(g1); Attribute attr1 = new Attribute("intAttr", new H5Datatype( Datatype.CLASS_INTEGER, 4, -1, -1), new long[] { 10 }, new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); Attribute attr2 = new Attribute("strAttr", new H5Datatype( Datatype.CLASS_STRING, 20, -1, -1), new long[] { 1 }, new String[] { "String attribute." }); Attribute attr3 = new Attribute("floatAttr", new H5Datatype( Datatype.CLASS_FLOAT, 4, -1, -1), new long[] { 2 }, new float[] { 2, 4 }); try { g1.writeMetadata(attr1); g1.writeMetadata(attr2); g1.writeMetadata(attr3); } catch (final Exception ex) { fail("g1.writeMetadata() failed. " + ex); } int gid = -1; try { gid = g1.open(); } catch (Exception ex) { fail("g1.open()failed. " + ex); } List attributeList = null; try { attributeList = H5File .getAttribute(gid, HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC);//Retrieve attributes in increasing creation order. assertEquals(attr2.getName(), attributeList.get(1).toString()); } catch (final Exception ex) { fail("file.getAttribute() failed. " + ex); } try { attributeList = H5File.getAttribute(gid); //Retrieve attributes in increasing alphabetical order. assertEquals(attr2.getName(), attributeList.get(2).toString()); } catch (final Exception ex) { fail("file.getAttribute() failed. " + ex); } try { g1.close(gid); } catch (final Exception ex) { } try { file.close(); // Close file. } catch (final Exception ex) { } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#createDatatype(int, int, int, int, java.lang.String)}. * {@link ncsa.hdf.object.h5.H5Datatype#hasAttribute()}. *

    * What to test: *

      *
    • create a file *
    • open file *
    • create Datatype *
    • create attribute in Datatype. *
    • check for attribute in datatype. *
    • close/delete the file *
    */ public final void testDatatypehasAttribute() { final String nameNew = "testH5FileDatatype.h5"; H5File file = null; int fid = -1; Datatype d1 = null; try { file = (H5File) H5FILE.createFile(nameNew, FileFormat.FILE_CREATE_DELETE); // Create File } catch (final Exception ex) { fail("file.create() failed. " + ex); } try { fid = file.open(); } catch (final Exception ex) { fail("file.open() failed. " + ex); } assertTrue(fid > 0); try { d1 = file.createDatatype(Datatype.CLASS_INTEGER, 4, Datatype.ORDER_LE, Datatype.SIGN_NONE, "NATIVE_INT"); //create Datatype. } catch (final Exception ex) { fail("file.createDatatype() failed. " + ex); } assertNotNull(d1); Attribute attr1 = new Attribute("strAttr", new H5Datatype( Datatype.CLASS_STRING, 20, -1, -1), new long[] { 1 }, new String[] { "String attribute." }); try { d1.writeMetadata(attr1); } catch (final Exception ex) { fail("d1.writeMetadata() failed. " + ex); } assertEquals(true, d1.hasAttribute()); try { file.close(); } catch (final Exception ex) { } file.delete(); } /** * Test method for * {@link ncsa.hdf.object.h5.H5File#renameAttribute(HObject, java.lang.String, java.lang.String)}. *

    * What to test: *

      *
    • create a file *
    • open file *
    • create group and datatype *
    • create attribute in the group and datatype. *
    • rename the attribute. *
    • close/delete the file *
    */ public final void testrenameAttribute() { final String nameNew = "testAttrName.h5"; H5File file = null; int fid = -1; Group g1 = null; Datatype d1 = null; try { file = (H5File) H5FILE.createFile(nameNew, FileFormat.FILE_CREATE_DELETE); // Create File } catch (final Exception ex) { fail("file.create() failed. " + ex); } try { fid = file.open(); } catch (final Exception ex) { fail("file.open() failed. " + ex); } assertTrue(fid > 0); try { g1 = file.createGroup("G1", null); } catch (final Exception ex) { fail("file.createGroup() failed. " + ex); } assertNotNull(g1); try { d1 = file.createDatatype(Datatype.CLASS_INTEGER, 4, Datatype.ORDER_LE, Datatype.SIGN_NONE, "NATIVE_INT"); } catch (final Exception ex) { fail("file.createDatatype() failed. " + ex); } assertNotNull(d1); Attribute attr1 = new Attribute("strAttr", new H5Datatype( Datatype.CLASS_STRING, 20, -1, -1), new long[] { 1 }, new String[] { "String attribute." }); try { g1.writeMetadata(attr1); } catch (final Exception ex) { fail("g1.writeMetadata() failed. " + ex); } try { d1.writeMetadata(attr1); } catch (final Exception ex) { fail("d1.writeMetadata() failed. " + ex); } try{ file.renameAttribute(g1, "strAttr", "GroupAttribute"); file.renameAttribute(d1, attr1.getName(), "DatatypeAttribute"); }catch (final Exception ex) { ex.printStackTrace(); fail("file.changeAttrName() failed. " + ex); } try { file.close(); } catch (final Exception ex) { } file.delete(); } /** * Test method for {@link ncsa.hdf.object.h5.H5File} IsSerializable. */ public final void testIsSerializable() { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oos; try { oos = new ObjectOutputStream(out); oos.writeObject(testFile); oos.close(); } catch (IOException err) { err.printStackTrace(); fail("ObjectOutputStream failed: " + err); } assertTrue(out.toByteArray().length > 0); } /** * Test method for {@link ncsa.hdf.object.h5.H5File} SerializeToDisk. *

    * What to test: *

      *
    • serialize a dataset identifier *
    • deserialize a dataset identifier *
    • open a file identifier *
    • check the file content *
    • close the file *
    */ public final void testSerializeToDisk() { try { FileOutputStream fos = new FileOutputStream("temph5file.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(testFile); oos.close(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } H5File test = null; try { FileInputStream fis = new FileInputStream("temph5file.ser"); ObjectInputStream ois = new ObjectInputStream(fis); test = (ncsa.hdf.object.h5.H5File) ois.readObject(); ois.close(); // Clean up the file new File("temph5file.ser").delete(); /* xcao: no need to test lib version. it is tested at the hdf5lib level String tver = test.getLibversion(); String H5ver = "HDF5 " + H5.LIB_VERSION[0] + "." + H5.LIB_VERSION[1] + "." + H5.LIB_VERSION[2]; assertEquals("H5.LIB_VERSION", tver, H5ver); */ } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } // try to get all object in the file try { for (int j = 0; j < H5TestFile.OBJ_NAMES.length; j++) { assertNotNull(test.get(H5TestFile.OBJ_NAMES[j])); } } catch (final Exception ex) { fail("test.get() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(test.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertTrue(nObjs <= 1); // file id should be the only this left // open. IS THIS BECAUSE THE ONLY THING WE // HAVE DONE IS OPEN THE FILE? try { test.close(); } catch (final Exception ex) { fail("test.close() failed. " + ex); } } } jhdf-2.9/test/object/DataFormatTest.java0000644000175000017500000001553012050301057021130 0ustar sylvestresylvestre/** * */ package test.object; import java.util.List; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.DataFormat; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.h5.H5Datatype; import ncsa.hdf.object.h5.H5File; /** * @author rsinha * */ public class DataFormatTest extends TestCase { private static final H5File H5FILE = new H5File(); private H5File testFile = null; private DataFormat testGroup = null; /** * @param arg0 */ public DataFormatTest(String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); testFile = (H5File) H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testGroup = testFile.get(H5TestFile.NAME_GROUP_ATTR); assertNotNull(testGroup); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for {@link ncsa.hdf.object.DataFormat#getFile()}. *
      *
    • Test if the file name is correct *
    */ public final void testGetFile() { if (!testGroup.getFile().equals(H5TestFile.NAME_FILE_H5)) { fail("getFile() fails."); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.DataFormat#getMetadata()}. *
      *
    • Reading the attributes *
    • Checking the values of attributes *
    */ public final void testGetMetadata() { Attribute strAttr = null; Attribute arrayIntAttr = null; List mdataList = null; try { mdataList = testGroup.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } strAttr = (Attribute) mdataList.get(0); arrayIntAttr = (Attribute) mdataList.get(1); String[] value = (String[]) strAttr.getValue(); if (!value[0].equals("String attribute.")) { fail("getMdata() failed."); } int[] intValue = (int[]) arrayIntAttr.getValue(); long[] dims = arrayIntAttr.getDataDims(); for (int i = 0; i < dims[0]; i++) { if (intValue[i] != i + 1) { fail("getValue() failed"); } } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.DataFormat#writeMetadata(java.lang.Object)}. *
      *
    • Writing new attributes *
    • Checking that the new attributes are written in file *
    */ public final void testWriteMetadata() { long[] attrDims = { 1 }; String attrName = "CLASS"; String[] classValue = { "IMAGE" }; Datatype attrType = new H5Datatype(Datatype.CLASS_STRING, classValue[0] .length() + 1, -1, -1); Attribute attr = new Attribute(attrName, attrType, attrDims); assertNotNull(testGroup); assertNotNull(attr); attr.setValue(classValue); try { testGroup.writeMetadata(attr); } catch (Exception ex) { fail("writeMetadata() failed " + ex.getMessage()); } List mdataList = null; try { mdataList = testGroup.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertEquals(3, mdataList.size()); Attribute strAttr = null; Attribute arrayIntAttr = null; strAttr = (Attribute) mdataList.get(0); arrayIntAttr = (Attribute) mdataList.get(1); String[] value = (String[]) strAttr.getValue(); if (!value[0].equals("String attribute.")) { fail("writeMdata() failed."); } int[] intValue = (int[]) arrayIntAttr.getValue(); long[] dims = arrayIntAttr.getDataDims(); for (int i = 0; i < dims[0]; i++) { if (intValue[i] != i + 1) { fail("writeValue() failed"); } } strAttr = (Attribute) mdataList.get(2); value = (String[]) strAttr.getValue(); if (!value[0].equals("IMAGE")) { fail("writeMetadata() failed."); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.DataFormat#removeMetadata(java.lang.Object)}. *
      *
    • Remove an attribute *
    */ public final void testRemoveMetadata() { List mdataList = null; try { mdataList = testGroup.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex.getMessage()); } Attribute strAttr = (Attribute) mdataList.get(2); try { testGroup.removeMetadata(strAttr); } catch (Exception e) { fail("removeMetadata() failed " + e.getMessage()); } assertEquals(2, mdataList.size()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/H5TestFile.java0000644000175000017500000003156312050301057020166 0ustar sylvestresylvestre/** * */ package test.object; import java.util.Vector; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.h5.H5Datatype; import ncsa.hdf.object.h5.H5File; /** * Creates an HDF5 file for unit tests. * * @author xcao * */ public class H5TestFile { public final static String NAME_FILE_H5 = "TestHDF5.h5"; public final static String NAME_GROUP = "/g0"; public final static String NAME_GROUP_ATTR = "/g0_attr"; public final static String NAME_GROUP_SUB = NAME_GROUP + "/g00"; public final static String NAME_DATASET_INT = "/dataset_int"; public final static String NAME_DATASET_FLOAT = "/dataset_float"; public final static String NAME_DATASET_CHAR = "/dataset_byte"; public final static String NAME_DATASET_STR = "/dataset_str"; public final static String NAME_DATASET_ENUM = "/dataset_enum"; public final static String NAME_DATASET_IMAGE = "/dataset_image"; public final static String NAME_DATASET_IMAGE_PALETTE = "/wave_palete"; public final static String NAME_DATASET_OBJ_REF = "/dataset_obj_ref"; public final static String NAME_DATASET_COMPOUND = "/dataset_comp"; public final static String NAME_DATASET_INT_SUB = NAME_GROUP + "/dataset_int"; public final static String NAME_DATASET_FLOAT_SUB_SUB = NAME_GROUP_SUB + "/dataset_float"; public final static String NAME_DATASET_COMPOUND_SUB = NAME_GROUP + "/dataset_comp"; public final static String NAME_DATATYPE_INT = NAME_GROUP + "/datatype_int"; public final static String NAME_DATATYPE_UINT = NAME_GROUP + "/datatype_uint"; public final static String NAME_DATATYPE_FLOAT = NAME_GROUP + "/datatype_float"; public final static String NAME_DATATYPE_STR = NAME_GROUP + "/datatype_str"; public final static String NAME_HARD_LINK_TO_IMAGE = "a_link_to_the_image"; public final static String OBJ_NAMES[] = { NAME_GROUP, NAME_GROUP_ATTR, NAME_GROUP_SUB, NAME_DATASET_INT, NAME_DATASET_FLOAT, NAME_DATASET_CHAR, NAME_DATASET_STR, NAME_DATASET_ENUM, NAME_DATASET_IMAGE, NAME_DATASET_COMPOUND, NAME_DATASET_INT_SUB, NAME_DATASET_FLOAT_SUB_SUB, NAME_DATASET_COMPOUND_SUB, NAME_DATATYPE_INT, NAME_DATATYPE_UINT, NAME_DATATYPE_FLOAT, NAME_DATATYPE_STR, NAME_DATASET_OBJ_REF }; public final static int OBJ_TYPES[] = { HDF5Constants.H5O_TYPE_GROUP, HDF5Constants.H5O_TYPE_GROUP, HDF5Constants.H5O_TYPE_GROUP, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_DATASET, HDF5Constants.H5O_TYPE_NAMED_DATATYPE, HDF5Constants.H5O_TYPE_NAMED_DATATYPE, HDF5Constants.H5O_TYPE_NAMED_DATATYPE, HDF5Constants.H5O_TYPE_NAMED_DATATYPE, HDF5Constants.H5O_TYPE_DATASET }; // data space information public final static int DATATYPE_SIZE = 4; public final static int RANK = 2; public final static long DIM1 = 50; public final static long DIM2 = 10; public static final long DIM3 = 20; public final static long[] DIMs = { DIM1, DIM2 }; public final static long[] CHUNKs = { DIM1 / 2, DIM2 / 2 }; public final static int STR_LEN = 20; public final static int DIM_SIZE = (int) (DIM1 * DIM2);; /* testing data */ public final static int[] DATA_INT = new int[DIM_SIZE]; public final static long[] DATA_LONG = new long[DIM_SIZE]; public final static float[] DATA_FLOAT = new float[DIM_SIZE]; public final static byte[] DATA_BYTE = new byte[DIM_SIZE]; public final static String[] DATA_STR = new String[DIM_SIZE]; public final static int[] DATA_ENUM = new int[DIM_SIZE]; public final static Vector DATA_COMP = new Vector(3); public final static byte[] DATA_PALETTE = createWavePalette(); // compound names and datatypes public final static String[] COMPOUND_MEMBER_NAMES = { "int32", "float32", "string", "uint32" }; public final static H5Datatype[] COMPOUND_MEMBER_DATATYPES = { new H5Datatype(Datatype.CLASS_INTEGER, DATATYPE_SIZE, -1, -1), new H5Datatype(Datatype.CLASS_FLOAT, DATATYPE_SIZE, -1, -1), new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1), new H5Datatype(Datatype.CLASS_INTEGER, DATATYPE_SIZE, -1, Datatype.SIGN_NONE) }; // attributes public final static Attribute ATTRIBUTE_STR = new Attribute("strAttr", new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1), new long[] { 1 }, new String[] { "String attribute." }); public final static Attribute ATTRIBUTE_INT_ARRAY = new Attribute( "arrayInt", new H5Datatype(Datatype.CLASS_INTEGER, DATATYPE_SIZE, -1, -1), new long[] { 10 }, new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); /** * Creates an HDF5 test file. *

    * The test file contains the following objects: * *

         * /dataset_byte            Dataset {50, 10}
         *           /dataset_comp            Dataset {50, 10}
         *           /dataset_enum            Dataset {50, 10}
         *           /dataset_float           Dataset {50, 10}
         *           /dataset_int             Dataset {50, 10}
         *           /dataset_image           Dataset {50, 10}
         *           /dataset_str             Dataset {50, 10}
         *           /g0                      Group
         *           /g0/dataset_int          Dataset {50, 10}
         *           /g0/g00                  Group
         *           /g0/g00/dataset_float    Dataset {50, 10}
         *           /g0_attr                 Group
         * 
    * * @throws Exception */ public static final H5File createTestFile(String fileName) throws Exception { H5File file = null; Group g0, g1, g00; final Dataset[] dsets = new Dataset[11]; if ((fileName == null) || (fileName.length() < 1)) { fileName = NAME_FILE_H5; } final H5Datatype typeInt = new H5Datatype(Datatype.CLASS_INTEGER, DATATYPE_SIZE, -1, -1); final H5Datatype typeByte = new H5Datatype(Datatype.CLASS_INTEGER, 1, -1, Datatype.SIGN_NONE); final H5Datatype typeFloat = new H5Datatype(Datatype.CLASS_FLOAT, DATATYPE_SIZE, -1, -1); final H5Datatype typeStr = new H5Datatype(Datatype.CLASS_STRING, STR_LEN, -1, -1); final H5Datatype typeChar = new H5Datatype(Datatype.CLASS_CHAR, 1, -1, -1); final H5Datatype typeEnum = new H5Datatype(Datatype.CLASS_ENUM, DATATYPE_SIZE, -1, -1); final H5Datatype typeRef = new H5Datatype(Datatype.CLASS_REFERENCE, -1, -1, -1); for (int i = 0; i < DIM_SIZE; i++) { DATA_INT[i] = i; DATA_LONG[i] = i; DATA_FLOAT[i] = i + i / 100.0f; DATA_BYTE[i] = (byte) Math.IEEEremainder(i, 127); DATA_STR[i] = "str" + i; DATA_ENUM[i] = (int) Math.IEEEremainder(i, 2); } DATA_COMP.add(0, DATA_INT); DATA_COMP.add(1, DATA_FLOAT); DATA_COMP.add(2, DATA_STR); DATA_COMP.add(3, DATA_LONG); file = new H5File(fileName, FileFormat.CREATE); file.open(); g0 = file.createGroup(NAME_GROUP, null); g1 = file.createGroup(NAME_GROUP_ATTR, null); g00 = file.createGroup(NAME_GROUP_SUB, null); g1.writeMetadata(ATTRIBUTE_STR); g1.writeMetadata(ATTRIBUTE_INT_ARRAY); dsets[0] = file.createScalarDS(NAME_DATASET_INT, null, typeInt, DIMs, null, CHUNKs, 9, DATA_INT); dsets[1] = file.createScalarDS(NAME_DATASET_FLOAT, null, typeFloat, DIMs, null, CHUNKs, 9, DATA_FLOAT); dsets[2] = file.createScalarDS(NAME_DATASET_CHAR, null, typeChar, DIMs, null, CHUNKs, 9, DATA_BYTE); dsets[3] = file.createScalarDS(NAME_DATASET_STR, null, typeStr, DIMs, null, CHUNKs, 9, DATA_STR); dsets[4] = file.createScalarDS(NAME_DATASET_ENUM, null, typeEnum, DIMs, null, CHUNKs, 9, DATA_ENUM); dsets[5] = file.createScalarDS(NAME_DATASET_INT_SUB, g0, typeInt, DIMs, null, CHUNKs, 9, DATA_INT); dsets[6] = file.createScalarDS(NAME_DATASET_FLOAT_SUB_SUB, g00, typeFloat, DIMs, null, CHUNKs, 9, DATA_FLOAT); dsets[7] = file.createImage(NAME_DATASET_IMAGE, null, typeByte, DIMs, null, CHUNKs, 9, 1, -1, DATA_BYTE); dsets[8] = file.createCompoundDS(NAME_DATASET_COMPOUND, null, DIMs, null, CHUNKs, 9, COMPOUND_MEMBER_NAMES, COMPOUND_MEMBER_DATATYPES, null, DATA_COMP); dsets[9] = file.createCompoundDS(NAME_DATASET_COMPOUND_SUB, null, DIMs, null, CHUNKs, 9, COMPOUND_MEMBER_NAMES, COMPOUND_MEMBER_DATATYPES, null, DATA_COMP); dsets[10] = file.createScalarDS(NAME_DATASET_OBJ_REF, null, typeRef, DIMs, null, CHUNKs, 9, null); // attach attributes to all datasets for (int i = 0; i < dsets.length; i++) { dsets[i].writeMetadata(ATTRIBUTE_STR); dsets[i].writeMetadata(ATTRIBUTE_INT_ARRAY); } // create a wave palette and attach it to the image final Dataset pal = file.createScalarDS(NAME_DATASET_IMAGE_PALETTE, null, typeByte, new long[] { 256, 3 }, null, null, -1, DATA_PALETTE); long[] oid = pal.getOID(); final Vector attrs = (Vector) dsets[7].getMetadata(); final int n = attrs.size(); for (int i = 0; i < n; i++) { final Attribute attr = (Attribute) attrs.get(i); if ("PALETTE".equals(attr.getName())) { attr.setValue(oid); dsets[7].writeMetadata(attr); } } Datatype dtype = file.createDatatype(Datatype.CLASS_INTEGER, DATATYPE_SIZE, -1, -1, NAME_DATATYPE_INT); dtype.writeMetadata(ATTRIBUTE_STR); dtype.writeMetadata(ATTRIBUTE_INT_ARRAY); dtype = file.createDatatype(Datatype.CLASS_INTEGER, DATATYPE_SIZE, -1, Datatype.SIGN_NONE, NAME_DATATYPE_UINT); dtype.writeMetadata(ATTRIBUTE_STR); dtype.writeMetadata(ATTRIBUTE_INT_ARRAY); dtype = file.createDatatype(Datatype.CLASS_FLOAT, DATATYPE_SIZE, -1, -1, NAME_DATATYPE_FLOAT); dtype.writeMetadata(ATTRIBUTE_STR); dtype.writeMetadata(ATTRIBUTE_INT_ARRAY); dtype = file.createDatatype(Datatype.CLASS_STRING, STR_LEN, -1, -1, NAME_DATATYPE_STR); dtype.writeMetadata(ATTRIBUTE_STR); dtype.writeMetadata(ATTRIBUTE_INT_ARRAY); file.createLink(g0, NAME_HARD_LINK_TO_IMAGE, dsets[7]); try { file.close(); } catch (final Exception ex) { } // write object refs to the ref dataset file.open(); final long[] refs = new long[DIM_SIZE]; // for (int i = 0; i < OBJ_NAMES.length; i++) { --//This gives CORE DUMP when OBJ_NAMES = NAME_DATASET_OBJ_REF, as it enters an infinite loop. for (int i = 0; i < OBJ_NAMES.length-1; i++) { oid = file.get(OBJ_NAMES[i]).getOID(); refs[i] = oid[0]; } dsets[10].write(refs); try { file.close(); } catch (final Exception ex) { } return file; } /** * Creates the wave palette of the indexed 256-color table. *

    * The palette values are stored in a two-dimensional byte array and arrange * by color components of red, green and blue. palette[][] = byte[3][256], * where, palette[0][], palette[1][] and palette[2][] are the red, green and * blue components respectively. * * @return the wave palette in the form of byte[3][256] */ private static final byte[] createWavePalette() { final byte[] p = new byte[768]; // 256*3 for (int i = 1; i < 255; i++) { p[3 * i] = (byte) ((Math.sin(((double) i / 40 - 3.2)) + 1) * 128); p[3 * i + 1] = (byte) ((1 - Math.sin((i / 2.55 - 3.1))) * 70 + 30); p[3 * i + 2] = (byte) ((1 - Math.sin(((double) i / 40 - 3.1))) * 128); } p[0] = p[1] = p[2] = 0; p[765] = p[766] = p[767] = (byte) 255; return p; } } jhdf-2.9/test/object/MetadataTest.java0000644000175000017500000000747712050301057020641 0ustar sylvestresylvestre/** * */ package test.object; import java.util.List; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Metadata; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5Group; /** * @author Rishi R. Sinha This has to be removed because both the methods tested * here are actually abstract methods and should be tested elsewhere. * */ public class MetadataTest extends TestCase { private static final H5File H5FILE = new H5File(); private H5File testFile = null; private H5Group testGroup = null; private Metadata strAttr = null; private Metadata arrayIntAttr = null; /** * @param arg0 */ public MetadataTest(String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); testFile = (H5File) H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testGroup = (H5Group) testFile.get(H5TestFile.NAME_GROUP_ATTR); assertNotNull(testGroup); List testAttrs = testGroup.getMetadata(); assertNotNull(testAttrs); strAttr = (Attribute) testAttrs.get(0); assertNotNull(strAttr); arrayIntAttr = (Attribute) testAttrs.get(1); assertNotNull(arrayIntAttr); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); // make sure all objects are closed final int fid = testFile.getFID(); if (fid > 0) { int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(fid, HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for {@link ncsa.hdf.object.Metadata#getValue()}. */ public final void testGetValue() { String[] value = (String[]) strAttr.getValue(); if (!value[0].equals("String attribute.")) { fail("getValue() fails."); } int[] intValue = (int[]) arrayIntAttr.getValue(); for (int i = 0; i < 10; i++) { if (intValue[i] != i + 1) { fail("getValue() fails"); } } } /** * Test method for * {@link ncsa.hdf.object.Metadata#setValue(java.lang.Object)}. */ public final void testSetValue() { String[] tempValue = { "Temp String Value" }; String[] prevValue = (String[]) strAttr.getValue(); strAttr.setValue(tempValue); String[] value = (String[]) strAttr.getValue(); if (!value[0].equals("Temp String Value")) { fail("setValue() fails."); } strAttr.setValue(prevValue); int[] tempIntArray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] intPrevValue = (int[]) arrayIntAttr.getValue(); arrayIntAttr.setValue(tempIntArray); int[] intValue = (int[]) arrayIntAttr.getValue(); for (int i = 0; i < 10; i++) { if (intValue[i] != i) { fail("getValue() fails"); } } arrayIntAttr.setValue(intPrevValue); } } jhdf-2.9/test/object/H5DatatypeTest.java0000644000175000017500000006073212050301057021062 0ustar sylvestresylvestre/** * */ package test.object; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Vector; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.h5.H5Datatype; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5ScalarDS; /** * TestCase for H5Datatype. *

    * This class tests all the public methods in H5ScalarDS class. *

    * The test file contains the following objects. * *

     * 
     * 
     *         /dataset_byte            Dataset {50, 10}
     *         /dataset_comp            Dataset {50, 10}
     *         /dataset_enum            Dataset {50, 10}
     *         /dataset_float           Dataset {50, 10}
     *         /dataset_image           Dataset {50, 10}
     *         /dataset_int             Dataset {50, 10}
     *         /dataset_str             Dataset {50, 10}
     *         /g0                      Group
     *         /g0/dataset_comp         Dataset {50, 10}
     *         /g0/dataset_int          Dataset {50, 10}
     *         /g0/datatype_float       Type
     *         /g0/datatype_int         Type
     *         /g0/datatype_str         Type
     *         /g0/g00                  Group
     *         /g0/g00/dataset_float    Dataset {50, 10}
     *         /g0_attr                 Group
     * 
    *

    * We use the following template to test all the methods: *

    * What to test: *

      *
    • Test for boundary conditions *
        *
      • *
      *
    • Test for failure *
        *
      • *
      *
    • Test for success on general functionality *
        *
      • *
      *
    * * @author Peter Cao, The HDF Group */ public class H5DatatypeTest extends TestCase { private static final H5File H5FILE = new H5File(); private static final int NLOOPS = 10; private static final int TEST_VALUE_INT = Integer.MAX_VALUE; private static final float TEST_VALUE_FLOAT = Float.MAX_VALUE; private static final String TEST_VALUE_STR = "Test"; private static final String TNAME = H5TestFile.NAME_DATATYPE_INT; private H5Datatype typeInt = null; private H5Datatype typeUInt = null; private H5Datatype typeFloat = null; private H5Datatype typeStr = null; private H5File testFile = null; private H5Datatype testDatatype = null; /** * @param arg0 */ public H5DatatypeTest(final String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); typeInt = new H5Datatype(Datatype.CLASS_INTEGER, H5TestFile.DATATYPE_SIZE, -1, -1); typeUInt = new H5Datatype(Datatype.CLASS_INTEGER, H5TestFile.DATATYPE_SIZE, -1, Datatype.SIGN_NONE); typeFloat = new H5Datatype(Datatype.CLASS_FLOAT, H5TestFile.DATATYPE_SIZE, -1, -1); typeStr = new H5Datatype(Datatype.CLASS_STRING, H5TestFile.STR_LEN, -1, -1); testFile = (H5File) H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testFile.open(); testDatatype = (H5Datatype) testFile.get(TNAME); assertNotNull(testDatatype); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for {@link ncsa.hdf.object.h5.H5Datatype#open()}. *

    * What to test: *

      *
    • Open a datatype identifier *
    • Check the class and size of the datatype *
    • Close the datatype *
    • Repeat all above *
    */ public final void testOpen() { int tid = -1, tclass = -1, tsize = -1; for (int loop = 0; loop < NLOOPS; loop++) { tid = tclass = tsize = -1; try { tid = testDatatype.open(); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(tid > 0); try { tclass = H5.H5Tget_class(tid); tsize = H5.H5Tget_size(tid); } catch (final Exception ex) { fail("open() failed. " + ex); } assertEquals(4, tsize); assertEquals(HDF5Constants.H5T_INTEGER, tclass); try { H5.H5Tclose(tid); } catch (final Exception ex) { } } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Datatype#close(int)}. *

    * What to test: *

      *
    • Open a datatype identifier *
    • Check the class and size of the datatype *
    • Close the datatype *
    • Access the closed datatype (expect to fail) *
    • Repeat all above *
    */ public final void testClose() { int tid = -1, tclass = -1, tsize = -1; for (int loop = 0; loop < NLOOPS; loop++) { tid = tclass = tsize = -1; try { tid = testDatatype.open(); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(tid > 0); try { tclass = H5.H5Tget_class(tid); tsize = H5.H5Tget_size(tid); } catch (final Exception ex) { fail("open() failed. " + ex); } assertEquals(4, tsize); assertEquals(HDF5Constants.H5T_INTEGER, tclass); try { H5.H5Tclose(tid); } catch (final Exception ex) { } try { tclass = H5.H5Tget_class(tid); } catch (final Exception ex) { ; // Expected - intentional } } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Datatype#toNative()}. *

    * What to test: *

      *
    • Create integer, float and string datatypes in memory *
    • Call toNative() to get datatype identifiers *
    • Check the classes and sizes of the datatypes from toNative() *
    */ public final void testToNative() { int tid = -1, tclass = -1, tsize = -1; // test integer datatype try { tid = typeInt.toNative(); } catch (final Exception ex) { fail("testToNative() failed. " + ex); } try { tclass = H5.H5Tget_class(tid); tsize = H5.H5Tget_size(tid); } catch (final Exception ex) { fail("open() failed. " + ex); } assertEquals(4, tsize); assertEquals(HDF5Constants.H5T_INTEGER, tclass); try { H5.H5Tclose(tid); } catch (final Exception ex) { } // test float datatype try { tid = typeFloat.toNative(); } catch (final Exception ex) { fail("testToNative() failed. " + ex); } try { tclass = H5.H5Tget_class(tid); tsize = H5.H5Tget_size(tid); } catch (final Exception ex) { fail("open() failed. " + ex); } assertEquals(4, tsize); assertEquals(HDF5Constants.H5T_FLOAT, tclass); try { H5.H5Tclose(tid); } catch (final Exception ex) { } // test String datatype try { tid = typeStr.toNative(); } catch (final Exception ex) { fail("testToNative() failed. " + ex); } try { tclass = H5.H5Tget_class(tid); tsize = H5.H5Tget_size(tid); } catch (final Exception ex) { fail("open() failed. " + ex); } assertEquals(H5TestFile.STR_LEN, tsize); assertEquals(HDF5Constants.H5T_STRING, tclass); try { H5.H5Tclose(tid); } catch (final Exception ex) { } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Datatype#fromNative(int)}. *

    * What to test: *

      *
    • Create empty datatype object in memory *
    • Test faillure on the class and size of the datatype *
    • Open datatype identifier from file *
    • Call fromNative(int tid) to fill the datatype object *
    • Check the class and size of the datatype *
    */ public final void testFromNative() { int tid = -1; final H5Datatype type = new H5Datatype(-1); assertFalse(Datatype.CLASS_INTEGER == type.getDatatypeClass()); assertFalse(type.getDatatypeSize() == 4); try { tid = H5.H5Topen(testFile.getFID(), TNAME); } catch (final Exception ex) { fail("H5Topen() failed. " + ex); } assertTrue(tid > 0); type.fromNative(tid); assertTrue(Datatype.CLASS_INTEGER == type.getDatatypeClass()); assertTrue(type.getDatatypeSize() == 4); try { H5.H5Tclose(tid); } catch (final Exception ex) { } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Datatype#isUnsigned()}. *

    * What to test: *

      *
    • Check unsigned integer datatype *
    • check signed integer datatype *
    • Check non-integer datatype *
    */ public final void testIsUnsigned() { assertFalse(typeInt.isUnsigned()); assertFalse(typeFloat.isUnsigned()); assertFalse(typeStr.isUnsigned()); assertTrue(typeUInt.isUnsigned()); } /** * Test method for {@link ncsa.hdf.object.h5.H5Datatype#getMetadata()}. *

    * What to test: *

      *
    • Get all the attributes *
    • Check the content of the attributes *
    */ public final void testGetMetadata() { Vector attrs = null; try { attrs = (Vector) testDatatype.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); final int n = attrs.size(); for (int i = 0; i < n; i++) { final Attribute attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == Datatype.CLASS_STRING) { assertTrue(H5TestFile.ATTRIBUTE_STR.getName().equals( attr.getName())); assertTrue(((String[]) H5TestFile.ATTRIBUTE_STR.getValue())[0] .equals(((String[]) attr.getValue())[0])); } else if (dtype.getDatatypeClass() == Datatype.CLASS_INTEGER) { assertTrue(H5TestFile.ATTRIBUTE_INT_ARRAY.getName().equals( attr.getName())); final int[] expected = (int[]) H5TestFile.ATTRIBUTE_INT_ARRAY .getValue(); assertNotNull(expected); final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < expected.length; j++) { assertEquals(expected[j], ints[j]); } } } // for (int i=0; i * What to test: *
      *
    • Update the value of an existing attribute *
    • Attach a new attribute *
    • Close and re-open file to check if the change is made in file *
    • Restore to the orginal state *
    */ public final void testWriteMetadata() { Vector attrs = null; Attribute attr = null; try { attrs = (Vector) testDatatype.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); // update existing attribute int n = attrs.size(); for (int i = 0; i < n; i++) { attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == Datatype.CLASS_STRING) { final String[] strs = (String[]) attr.getValue(); strs[0] = TEST_VALUE_STR; } else if (dtype.getDatatypeClass() == Datatype.CLASS_INTEGER) { final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < ints.length; j++) { ints[j] = TEST_VALUE_INT; } } try { testDatatype.writeMetadata(attr); } catch (final Exception ex) { fail("writeMetadata() failed. " + ex); } } // for (int i=0; i 0); n = attrs.size(); Attribute newAttr = null; for (int i = 0; i < n; i++) { attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == Datatype.CLASS_STRING) { assertTrue(H5TestFile.ATTRIBUTE_STR.getName().equals( attr.getName())); assertTrue(TEST_VALUE_STR .equals(((String[]) attr.getValue())[0])); } else if (dtype.getDatatypeClass() == Datatype.CLASS_INTEGER) { assertTrue(H5TestFile.ATTRIBUTE_INT_ARRAY.getName().equals( attr.getName())); final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < ints.length; j++) { assertEquals(TEST_VALUE_INT, ints[j]); } } else if (dtype.getDatatypeClass() == Datatype.CLASS_FLOAT) { newAttr = attr; final float[] floats = (float[]) attr.getValue(); assertEquals(TEST_VALUE_FLOAT, floats[0], Float.MIN_VALUE); } } // for (int i=0; i * What to test: *
      *
    • Remove all existing attributes *
    • Close and reopen file to check if all attribute are removed from file *
    • Restore to the orginal state *
    */ public final void testRemoveMetadata() { Vector attrs = null; try { attrs = (Vector) testDatatype.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); // remove all attributes final int n = attrs.size(); final Object[] arrayAttr = attrs.toArray(); for (int i = 0; i < n; i++) { try { testDatatype.removeMetadata(arrayAttr[i]); } catch (final Exception ex) { fail("removeMetadata() failed. " + ex); } } // close the file and reopen it try { testFile.close(); testFile.open(); testDatatype = (H5Datatype) testFile.get(TNAME); } catch (final Exception ex) { fail("write() failed. " + ex); } attrs = null; try { attrs = (Vector) testDatatype.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertFalse(attrs.size() > 0); // restor to the original try { testDatatype.writeMetadata(H5TestFile.ATTRIBUTE_STR); testDatatype.writeMetadata(H5TestFile.ATTRIBUTE_INT_ARRAY); } catch (final Exception ex) { fail("writeMetadata() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Datatype} IsSerializable. */ public final void testIsSerializable() { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oos; try { oos = new ObjectOutputStream(out); oos.writeObject(testDatatype); oos.close(); } catch (IOException err) { err.printStackTrace(); fail("ObjectOutputStream failed: " + err); } assertTrue(out.toByteArray().length > 0); } /** * Test method for {@link ncsa.hdf.object.h5.H5Datatype} SerializeToDisk. *

    * What to test: *

      *
    • serialize a dataset identifier *
    • deserialize a dataset identifier *
    • Open a datatype identifier *
    • Check the class and size of the datatype *
    • Close the datatype *
    */ public final void testSerializeToDisk() { try { FileOutputStream fos = new FileOutputStream("temph5dtype.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(testDatatype); oos.close(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } H5Datatype test = null; try { FileInputStream fis = new FileInputStream("temph5dtype.ser"); ObjectInputStream ois = new ObjectInputStream(fis); test = (ncsa.hdf.object.h5.H5Datatype) ois.readObject(); ois.close(); // Clean up the file new File("temph5dtype.ser").delete(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } int tid = -1, tclass = -1, tsize = -1; for (int loop = 0; loop < NLOOPS; loop++) { tid = tclass = tsize = -1; try { tid = test.open(); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(tid > 0); try { tclass = H5.H5Tget_class(tid); tsize = H5.H5Tget_size(tid); } catch (final Exception ex) { fail("open() failed. " + ex); } assertEquals(4, tsize); assertEquals(HDF5Constants.H5T_INTEGER, tclass); try { H5.H5Tclose(tid); } catch (final Exception ex) { } } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/GroupTest.java0000644000175000017500000002066012050301057020202 0ustar sylvestresylvestre/** * */ package test.object; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.HObject; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5Group; /** * @author Rishi R Sinha * */ public class GroupTest extends TestCase { private H5File testFile = null; private Group testGroup = null; /** * @param arg0 */ public GroupTest(String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); H5File H5FILE = new H5File(); testFile = (H5File) H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testGroup = (Group) testFile.get(H5TestFile.NAME_GROUP); assertNotNull(testGroup); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for {@link ncsa.hdf.object.Group#clear()}. *

    * What to test: *

      *
    • For the root group clear the list. *
    * */ public void testClear() { testGroup.clear(); assertEquals(testGroup.getMemberList().size(), 0); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.Group#addToMemberList(ncsa.hdf.object.HObject)}. *

    * What to test: *

      *
    • Test for boundary conditions *
        *
      • Add null to the member list. *
      *
    • Test for failure *
        *
      • Add an already existing object to the list. *
      *
    • Test for general functionality *
        *
      • add a group to it. *
      *
    */ public void testAddToMemberList() { int previous_size = testGroup.getMemberList().size(); testGroup.addToMemberList(null); assertEquals(testGroup.getMemberList().size(), previous_size); Group tmp = new H5Group(testFile, "tmp", "/grp0/", testGroup); testGroup.addToMemberList((HObject) testGroup.getMemberList().get(0)); if (testGroup.getMemberList().size() != previous_size) { fail("addToMemberList adds an existing member to the member list."); } testGroup.addToMemberList(tmp); if (!testGroup.getMemberList().get(previous_size).equals(tmp)) { fail("Add to member list does not add to the end."); } if (testGroup.getMemberList().size() != previous_size + 1) { fail("Add to member list not working."); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.Group#removeFromMemberList(ncsa.hdf.object.HObject)} * . *

    * What to test: *

      *
    • Test for boundary conditions *
        *
      • Remove a null from the member list. *
      *
    • Test for failure *
        *
      • Remove a non existing object to the list. *
      *
    • Test for general functionality *
        *
      • Remove a group from it. *
      *
    */ public void testRemoveFromMemberList() { int previous_size = testGroup.getMemberList().size(); List memberList = testGroup.getMemberList(); testGroup.removeFromMemberList(null); if (testGroup.getMemberList().size() != previous_size) { fail("removeFromMemberList removes a null from the member list."); } Group tmp = new H5Group(testFile, "tmp", "/grp0/", testGroup); testGroup.removeFromMemberList(tmp); if (testGroup.getMemberList().size() != previous_size) { fail("removeFromMemberList removes a non existing member from the member list."); } Iterator it = memberList.iterator(); HObject obj = (HObject) it.next(); testGroup.removeFromMemberList(obj); if (memberList.size() != previous_size - 1) { fail("The Number of members in list should be " + (previous_size - 1)); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Group#getMemberList()}. *

    *

      *
    • testing the member list for the root group. *
        */ public void testGetMemberList() { String objs[] = { "a_link_to_the_image", "dataset_comp", "dataset_int", "datatype_float", "datatype_int", "datatype_str", "datatype_uint", "g00" }; List memberList = testGroup.getMemberList(); Iterator it = memberList.iterator(); int position = 0; while (it.hasNext()) { HObject obj = (HObject) it.next(); assertEquals(objs[position++], obj.getName()); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Group#getParent()}. *

        *

          *
        • Test to get the parent of group g0. *
        */ public void testGetParent() { assertEquals(testGroup.getParent().getName(), "/"); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Group#isRoot()}. * *
          *
        • Test for not root. *
        */ public void testIsRoot() { assertFalse(testGroup.isRoot()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.Group#getNumberOfMembersInFile()}. * *
          *
        • Test for the number of members in the file. *
            */ public void testGetNumberOfMembersInFile() { assertEquals(testGroup.getNumberOfMembersInFile(), 8); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/DatatypeTest.java0000644000175000017500000003353412050301057020665 0ustar sylvestresylvestre/** * */ package test.object; import junit.framework.TestCase; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.h5.H5Datatype; /** * @author rsinha * */ public class DatatypeTest extends TestCase { private Datatype[] baseTypes = null; private int[] classes = { Datatype.CLASS_BITFIELD, Datatype.CLASS_CHAR, Datatype.CLASS_COMPOUND, Datatype.CLASS_ENUM, Datatype.CLASS_FLOAT, Datatype.CLASS_INTEGER, Datatype.CLASS_NO_CLASS, Datatype.CLASS_OPAQUE, Datatype.CLASS_REFERENCE, Datatype.CLASS_STRING, Datatype.CLASS_VLEN }; private int[] signs = { Datatype.SIGN_2, Datatype.SIGN_NONE, Datatype.NSGN }; private int[] orders = { Datatype.ORDER_BE, Datatype.ORDER_LE, Datatype.ORDER_NONE, Datatype.ORDER_VAX }; private int n_classes = 11; private int n_signs = 3; private int n_orders = 4; private int[] sizes = { 32, 64, 8, 16 }; private String[] descriptions = { "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "8-bit character", "8-bit unsigned character", "8-bit character", "8-bit character", "8-bit unsigned character", "8-bit character", "8-bit character", "8-bit unsigned character", "8-bit character", "8-bit character", "8-bit unsigned character", "8-bit character", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "enum (0=1 1=2 )", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit floating-point", "32-bit integer", "32-bit integer", "64-bit integer", "32-bit integer", "32-bit unsigned integer", "32-bit unsigned integer", "64-bit unsigned integer", "32-bit unsigned integer", "32-bit integer", "32-bit integer", "64-bit integer", "32-bit integer", "32-bit integer", "32-bit integer", "64-bit integer", "32-bit integer", "32-bit unsigned integer", "32-bit unsigned integer", "64-bit unsigned integer", "32-bit unsigned integer", "32-bit integer", "32-bit integer", "64-bit integer", "32-bit integer", "32-bit integer", "32-bit integer", "64-bit integer", "32-bit integer", "32-bit unsigned integer", "32-bit unsigned integer", "64-bit unsigned integer", "32-bit unsigned integer", "32-bit integer", "32-bit integer", "64-bit integer", "32-bit integer", "32-bit integer", "32-bit integer", "64-bit integer", "32-bit integer", "32-bit unsigned integer", "32-bit unsigned integer", "64-bit unsigned integer", "32-bit unsigned integer", "32-bit integer", "32-bit integer", "64-bit integer", "32-bit integer", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Object reference", "Object reference", "Object reference", "Object reference", "Object reference", "Object reference", "Object reference", "Object reference", "Object reference", "Object reference", "Object reference", "Object reference", "String, length = 32", "String, length = 32", "String, length = 32", "String, length = 32", "String, length = 32", "String, length = 32", "String, length = 32", "String, length = 32", "String, length = 32", "String, length = 32", "String, length = 32", "String, length = 32", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown" }; /** * @param arg0 */ public DatatypeTest(String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); baseTypes = new Datatype[n_orders * n_signs * (n_classes + 4)]; int counter = 0; for (int i = 0; i < n_classes; i++) { for (int j = 0; j < n_orders; j++) { for (int k = 0; k < n_signs; k++) { int n_sizes; switch (classes[i]) { case Datatype.CLASS_INTEGER: n_sizes = 4; break; case Datatype.CLASS_FLOAT: n_sizes = 2; break; default: n_sizes = 1; break; } for (int l = 0; l < n_sizes; l++) { baseTypes[counter++] = new H5Datatype(classes[i], sizes[l], orders[j], signs[k]); assertNotNull(baseTypes[i]); } } } } } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); } /** * Test method for {@link ncsa.hdf.object.Datatype#getDatatypeClass()}. *

            * We test for every combination of class, size and possible signs. */ public final void testGetDatatypeClass() { int counter = 0; for (int i = 0; i < n_classes; i++) { for (int j = 0; j < n_orders; j++) { for (int k = 0; k < n_signs; k++) { int n_sizes; switch (classes[i]) { case Datatype.CLASS_INTEGER: n_sizes = 4; break; case Datatype.CLASS_FLOAT: n_sizes = 2; break; default: n_sizes = 1; break; } for (int l = 0; l < n_sizes; l++) { assertEquals(baseTypes[counter++].getDatatypeClass(), classes[i]); } } } } } /** * Test method for {@link ncsa.hdf.object.Datatype#getDatatypeSize()}. *

            * We test for every combination of class, size and possible signs. */ public final void testGetDatatypeSize() { int counter = 0; for (int i = 0; i < n_classes; i++) { for (int j = 0; j < n_orders; j++) { for (int k = 0; k < n_signs; k++) { int n_sizes; switch (classes[i]) { case Datatype.CLASS_INTEGER: n_sizes = 4; break; case Datatype.CLASS_FLOAT: n_sizes = 2; break; default: n_sizes = 1; break; } for (int l = 0; l < n_sizes; l++) { assertEquals(baseTypes[counter++].getDatatypeSize(), sizes[l]); } } } } } /** * Test method for {@link ncsa.hdf.object.Datatype#getDatatypeOrder()}. *

            * We test for every combination of class, size and possible signs. */ public final void testGetDatatypeOrder() { int counter = 0; for (int i = 0; i < n_classes; i++) { for (int j = 0; j < n_orders; j++) { for (int k = 0; k < n_signs; k++) { int n_sizes; switch (classes[i]) { case Datatype.CLASS_INTEGER: n_sizes = 4; break; case Datatype.CLASS_FLOAT: n_sizes = 2; break; default: n_sizes = 1; break; } for (int l = 0; l < n_sizes; l++) { assertEquals(baseTypes[counter++].getDatatypeOrder(), orders[j]); } } } } } /** * Test method for {@link ncsa.hdf.object.Datatype#getDatatypeSign()}. *

            * We test for every combination of class, size and possible signs. */ public final void testGetDatatypeSign() { int counter = 0; for (int i = 0; i < n_classes; i++) { for (int j = 0; j < n_orders; j++) { for (int k = 0; k < n_signs; k++) { int n_sizes; switch (classes[i]) { case Datatype.CLASS_INTEGER: n_sizes = 4; break; case Datatype.CLASS_FLOAT: n_sizes = 2; break; default: n_sizes = 1; break; } for (int l = 0; l < n_sizes; l++) { assertEquals(baseTypes[counter++].getDatatypeSign(), signs[k]); } } } } } /** * Test method for * {@link ncsa.hdf.object.Datatype#setEnumMembers(java.lang.String)}. *

            * create a new enum data type set it to two different values and check it. */ public final void testSetEnumMembers() { Datatype ed = new H5Datatype(Datatype.CLASS_ENUM, 2, Datatype.ORDER_NONE, Datatype.NSGN); ed.setEnumMembers("low=20, high=40"); assertEquals(ed.getEnumMembers(), "low=20, high=40"); } /** * Test method for {@link ncsa.hdf.object.Datatype#getEnumMembers()}. *

            * look at {@link ncsa.hdf.object.Datatype#setEnumMembers(java.lang.String)}. */ public final void testGetEnumMembers() { testSetEnumMembers(); } /** * Test method for {@link ncsa.hdf.object.Datatype#getDatatypeDescription()} * . RISHI SINHA - THE METHOD CALLED IS ONE FOR H5 WHICH OVERRIDES THE BASE * CALL. *

            * We test for every combination of class, size and possible signs. */ public final void testGetDatatypeDescription() { int counter = 0; for (int i = 0; i < n_classes; i++) { for (int j = 0; j < n_orders; j++) { for (int k = 0; k < n_signs; k++) { int n_sizes; switch (classes[i]) { case Datatype.CLASS_INTEGER: n_sizes = 4; break; case Datatype.CLASS_FLOAT: n_sizes = 2; break; default: n_sizes = 1; break; } for (int l = 0; l < n_sizes; l++) { assertEquals(baseTypes[counter] .getDatatypeDescription(), descriptions[counter]); } } } } } /** * ABSTRACT METHOD Test method for * {@link ncsa.hdf.object.Datatype#isUnsigned()}. *

            * We test for every combination of class, size and possible signs. */ public final void testIsUnsigned() { int counter = 0; for (int i = 0; i < n_classes; i++) { for (int j = 0; j < n_orders; j++) { for (int k = 0; k < n_signs; k++) { int n_sizes; switch (classes[i]) { case Datatype.CLASS_INTEGER: n_sizes = 4; break; case Datatype.CLASS_FLOAT: n_sizes = 2; break; default: n_sizes = 1; break; } for (int l = 0; l < n_sizes; l++) { boolean isSigned = baseTypes[counter++].isUnsigned(); if (isSigned && (signs[k] != Datatype.SIGN_NONE)) { fail("isUnsigned Failed."); } } } } } } } jhdf-2.9/test/object/CompoundDSTest.java0000644000175000017500000001530512050301057021121 0ustar sylvestresylvestre/** * */ package test.object; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.CompoundDS; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.h5.H5File; /** * @author rsinha * */ public class CompoundDSTest extends TestCase { private static final H5File H5FILE = new H5File(); private H5File testFile = null; private CompoundDS testDS = null; /** * @param arg0 */ public CompoundDSTest(String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); testFile = (H5File) H5FILE.createInstance(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testDS = (CompoundDS) testFile.get(H5TestFile.NAME_DATASET_COMPOUND); assertNotNull(testDS); testDS.init(); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * For the Compund Dataset in the Test File, we are checking *

              *
            • geting the memberCount. *
            • the names of each member in the dataset. *
            • the types of each member in the dataset. *
            • the orders of each member in the dataset. *
            • the dims of each member in the dataset. *
            */ public final void testFieldsHaveCorrectNameTypeOrderAndDims() { int correctMemberCount = H5TestFile.COMPOUND_MEMBER_NAMES.length; assertEquals(testDS.getMemberCount(), correctMemberCount); String[] names = testDS.getMemberNames(); for (int i = 0; i < correctMemberCount; i++) { if (!names[i].equals(H5TestFile.COMPOUND_MEMBER_NAMES[i])) { fail("Member Name at position " + i + "should be " + H5TestFile.COMPOUND_MEMBER_NAMES[i] + ", while getMemberNames returns " + names[i]); } } Datatype[] types = testDS.getMemberTypes(); for (int i = 0; i < correctMemberCount; i++) { if (!types[i].getDatatypeDescription().equals( H5TestFile.COMPOUND_MEMBER_DATATYPES[i] .getDatatypeDescription())) { fail("Member Type at position " + i + "should be " + H5TestFile.COMPOUND_MEMBER_DATATYPES[i] .getDatatypeDescription() + ", while getMemberTypes returns " + types[i].getDatatypeDescription()); } } int[] orders = testDS.getMemberOrders(); for (int i = 0; i < correctMemberCount; i++) { if (orders[i] != 1) { fail("Member Order at position " + i + "should be " + 1 + ", while getMemberOrders returns " + orders[i]); } } for (int i = 0; i < correctMemberCount; i++) { assertNull(testDS.getMemeberDims(i)); // all scalar data } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * For the Compund Dataset in the Test File, we are checking *
              *
            • Geting the selectMemberCount method on the default selection. *
            • setting ths member selection so that no member is selected. *
            • setting the member selection so that all members are exlplicitly * selected. *
            • Adding one member at a time and checking if the addition is working * properly. *
            */ public final void testSelectionDeselectionCountWorks() { if (testDS.getSelectedMemberCount() != H5TestFile.COMPOUND_MEMBER_NAMES.length) { fail("Right after init getSelectedMemberCount returns" + testDS.getSelectedMemberCount() + ", when it should return " + H5TestFile.COMPOUND_MEMBER_NAMES.length); } testDS.setMemberSelection(false); assertEquals(testDS.getSelectedMemberCount(), 0); testDS.setMemberSelection(true); assertEquals(testDS.getSelectedMemberCount(), H5TestFile.COMPOUND_MEMBER_NAMES.length); testDS.setMemberSelection(false); assertEquals(testDS.getSelectedMemberCount(), 0); for (int i = 0; i < testDS.getMemberCount(); i++) { testDS.selectMember(i); int[] orders = testDS.getSelectedMemberOrders(); Datatype[] types = testDS.getMemberTypes(); for (int j = 0; j <= i; j++) { if (!testDS.isMemberSelected(j)) { fail("Member " + j + "was selected while isMemberSelected says it wasnt."); } if (orders[j] != 1) { fail("Member Order at position " + j + "should be " + 1 + ", while getMemberOrders returns " + orders[j]); } if (!types[j].getDatatypeDescription().equals( H5TestFile.COMPOUND_MEMBER_DATATYPES[j] .getDatatypeDescription())) { fail("Member Type at position " + i + "should be " + H5TestFile.COMPOUND_MEMBER_DATATYPES[j] .getDatatypeDescription() + ", while getMemberTypes returns " + types[j].getDatatypeDescription()); } } } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/h5ex_d_extern.hdf50000644000175000017500000000267012050301057020715 0ustar sylvestresylvestreHDF  `TREEpHEAPXDS1H (0pASJPHEAP Ph5ex_d_extern.dataSNOD jhdf-2.9/test/object/H5GroupTest.java0000644000175000017500000010147312050301057020401 0ustar sylvestresylvestre/** * */ package test.object; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Vector; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.structs.H5G_info_t; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.h5.H5Datatype; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5Group; /** * @author xcao * */ public class H5GroupTest extends TestCase { private static final H5File H5FILE = new H5File(); private static final int NLOOPS = 5; private static final int TEST_VALUE_INT = Integer.MAX_VALUE; private static final float TEST_VALUE_FLOAT = Float.MAX_VALUE; private static final String TEST_VALUE_STR = "H5GroupTest"; private static final String GNAME = H5TestFile.NAME_GROUP_ATTR; private static final String GNAME_SUB = H5TestFile.NAME_GROUP_SUB; private H5Datatype typeInt = null; private H5Datatype typeFloat = null; private H5Datatype typeStr = null; private H5File testFile = null; private H5Group testGroup = null; /** * @param arg0 */ public H5GroupTest(final String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); testFile = (H5File) H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); typeInt = new H5Datatype(Datatype.CLASS_INTEGER, H5TestFile.DATATYPE_SIZE, -1, -1); typeFloat = new H5Datatype(Datatype.CLASS_FLOAT, H5TestFile.DATATYPE_SIZE, -1, -1); typeStr = new H5Datatype(Datatype.CLASS_STRING, H5TestFile.STR_LEN, -1, -1); testGroup = (H5Group) testFile.get(GNAME); assertNotNull(testGroup); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for * {@link ncsa.hdf.object.h5.H5Group#setName(java.lang.String)}. *

            * What to test: *

              *
            • Test for boundary conditions *
                *
              • Set name to null *
              *
            • Test for failure *
                *
              • Set a name that already exists in file. *
              *
            • Test for general functionality *
                *
              • change the dataset name *
              • close/re-open the file *
              • get the dataset with the new name *
              • failure test: get the dataset with the original name *
              • set the name back to the original name *
              *
            */ public final void testSetName() { final String newName = "tmpName"; // test set name to null try { testGroup.setName(null); } catch (final Exception ex) { ; // Expected - intentional } // set to an existing name try { testGroup.setName(H5TestFile.NAME_DATASET_FLOAT); } catch (final Exception ex) { ; // Expected - intentional } try { testGroup.setName(newName); } catch (final Exception ex) { fail("setName() failed. " + ex); } // close the file and reopen it try { testFile.close(); testFile.open(); testGroup = (H5Group) testFile.get(newName); } catch (final Exception ex) { fail("setName() failed. " + ex); } // test the old name H5Group tmpDset = null; try { tmpDset = (H5Group) testFile.get(GNAME); } catch (final Exception ex) { fail("setName() get(oldname) failed. " + ex); } assertNull("The dataset should be null because it has been renamed", tmpDset); // set back the original name try { testGroup.setName(GNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } // make sure the dataset is OK try { testGroup = (H5Group) testFile.get(GNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } assertNotNull(testGroup); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5Group#setPath(java.lang.String)}. */ public final void testSetPath() { final String newPath = "tmpName"; try { testGroup.setPath(newPath); } catch (final Exception ex) { fail("setPath() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Group#open()}. *

            * What to test: *

              *
            • open a group identifier *
            • Check if gid is valid *
            • Close the group *
            • Repeat all above *
            */ public final void testOpen() { int gid = -1; for (int loop = 0; loop < NLOOPS; loop++) { gid = -1; try { gid = testGroup.open(); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(gid > 0); testGroup.close(gid); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Group#close(int)}. *

            * What to test: *

              *
            • open a group identifier *
            • Check if gid is valid *
            • Close the group *
            • Repeat all above *
            */ public final void testClose() { testOpen(); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Group#clear()}. *

            * What to test: *

              *
            • Read attributes from file *
            • clear the group *
            • make sure that the attribute list is empty *
            */ public final void testClear() { Vector attrs = null; try { attrs = (Vector) testGroup.getMetadata(); } catch (final Exception ex) { fail("clear() failed. " + ex); } assertTrue(attrs.size() > 0); // clear up the dataset testGroup.clear(); // attribute is empty try { attrs = (Vector) testGroup.getMetadata(); } catch (final Exception ex) { fail("clear() failed. " + ex); } assertTrue(attrs.size() <= 0); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5Group#H5Group(ncsa.hdf.object.FileFormat, java.lang.String, java.lang.String, ncsa.hdf.object.Group)} * . *

            * What to test: *

              *
            • Construct an H5Group object that exits in file *
                *
              • new H5Group (file, null, fullpath, pgroup) *
              • new H5Group (file, fullname, null, pgroup) *
              • new H5Group (file, name, path, pgroup) *
              *
            • Construct an H5Group object that does not exist in file *
            */ public final void testH5GroupFileFormatStringStringGroup() { Group pgroup = null; final String[] names = { null, GNAME_SUB, GNAME_SUB.substring(4) }; final String[] paths = { GNAME_SUB, null, H5TestFile.NAME_GROUP }; final H5File file = (H5File) testGroup.getFileFormat(); assertNotNull(file); try { pgroup = (Group) testFile.get(H5TestFile.NAME_GROUP); } catch (final Exception ex) { fail("testFile.get() failed. " + ex); } assertNotNull(pgroup); for (int idx = 0; idx < names.length; idx++) { final H5Group grp = new H5Group(file, names[idx], paths[idx], pgroup); final int gid = grp.open(); assertTrue(gid > 0); grp.close(gid); } final H5Group grp = new H5Group(file, "NO_SUCH_DATASET", "NO_SUCH_PATH", pgroup); final int gid = grp.open(); assertTrue(gid <= 0); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5Group#H5Group(ncsa.hdf.object.FileFormat, java.lang.String, java.lang.String, ncsa.hdf.object.Group, long[])} * . *

            * What to test: *

              *
            • Construct an H5Group object that exits in file *
                *
              • new H5Group (file, null, fullpath, pgroup, oid) *
              • new H5Group (file, fullname, null, pgroup, oid) *
              • new H5Group (file, name, path, pgroup, oid) *
              *
            • Construct an H5Group object that does not exist in file *
            */ public final void testH5GroupFileFormatStringStringGroupLongArray() { // RISHI SINHA Why are we testing a deprecated API. Group pgroup = null; final String[] names = { null, GNAME_SUB, GNAME_SUB.substring(4) }; final String[] paths = { GNAME_SUB, null, H5TestFile.NAME_GROUP }; final H5File file = (H5File) testGroup.getFileFormat(); // RISHI SINHA // Why // recreating // these objects // as we have // these objects // in this class // already. assertNotNull(file); try { pgroup = (Group) testFile.get(H5TestFile.NAME_GROUP); } catch (final Exception ex) { fail("testFile.get() failed. " + ex); } assertNotNull(pgroup); long[] oid = null; for (int idx = 0; idx < names.length; idx++) { try { final byte[] ref_buf = H5.H5Rcreate(file.getFID(), GNAME_SUB, HDF5Constants.H5R_OBJECT, -1); final long l = HDFNativeData.byteToLong(ref_buf, 0); oid = new long[1]; oid[0] = l; // save the object ID } catch (final HDF5Exception ex) { fail("H5.H5Rcreate() failed. " + ex); } assertNotNull(oid); final H5Group grp = new H5Group(file, names[idx], paths[idx], pgroup, oid); final int gid = grp.open(); assertTrue(gid > 0); grp.close(gid); } // test a non-existing dataset final H5Group grp = new H5Group(file, "NO_SUCH_DATASET", "NO_SUCH_PATH", pgroup, null); final int gid = grp.open(); assertTrue(gid <= 0); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Group#getMetadata()}. *

            * Cases tested: *

              *
            • Get all the attributes *
            • Check the content of the attributes *
            */ public final void testGetMetadata() { Vector attrs = null; try { attrs = (Vector) testGroup.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); final int n = attrs.size(); for (int i = 0; i < n; i++) { final Attribute attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == Datatype.CLASS_STRING) { assertTrue(H5TestFile.ATTRIBUTE_STR.getName().equals( attr.getName())); assertTrue(((String[]) H5TestFile.ATTRIBUTE_STR.getValue())[0] .equals(((String[]) attr.getValue())[0])); } else if (dtype.getDatatypeClass() == Datatype.CLASS_INTEGER) { assertTrue(H5TestFile.ATTRIBUTE_INT_ARRAY.getName().equals( attr.getName())); final int[] expected = (int[]) H5TestFile.ATTRIBUTE_INT_ARRAY .getValue(); assertNotNull(expected); final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < expected.length; j++) { assertEquals(expected[j], ints[j]); } } } // for (int i=0; i * What to test: *
              *
            • Update the value of an existing attribute *
            • Attach a new attribute *
            • Close and re-open file to check if the change is made in file *
            • Restore to the orginal state *
            */ public final void testWriteMetadata() { Vector attrs = null; Attribute attr = null; try { attrs = (Vector) testGroup.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); // update existing attribute int n = attrs.size(); for (int i = 0; i < n; i++) { attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == Datatype.CLASS_STRING) { final String[] strs = (String[]) attr.getValue(); strs[0] = TEST_VALUE_STR; } else if (dtype.getDatatypeClass() == Datatype.CLASS_INTEGER) { final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < ints.length; j++) { ints[j] = TEST_VALUE_INT; } } try { testGroup.writeMetadata(attr); } catch (final Exception ex) { fail("writeMetadata() failed. " + ex); } } // for (int i=0; i 0); n = attrs.size(); Attribute newAttr = null; for (int i = 0; i < n; i++) { attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == Datatype.CLASS_STRING) { assertTrue(H5TestFile.ATTRIBUTE_STR.getName().equals( attr.getName())); assertTrue(TEST_VALUE_STR .equals(((String[]) attr.getValue())[0])); } else if (dtype.getDatatypeClass() == Datatype.CLASS_INTEGER) { assertTrue(H5TestFile.ATTRIBUTE_INT_ARRAY.getName().equals( attr.getName())); final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < ints.length; j++) { assertEquals(TEST_VALUE_INT, ints[j]); } } else if (dtype.getDatatypeClass() == Datatype.CLASS_FLOAT) { newAttr = attr; final float[] floats = (float[]) attr.getValue(); assertEquals(TEST_VALUE_FLOAT, floats[0], Float.MIN_VALUE); } } // for (int i=0; i * What to test: *
              *
            • Remove all existing attributes *
            • Close and reopen file to check if all attribute are removed from file *
            • Restore to the orginal state *
            */ public final void testRemoveMetadata() { Vector attrs = null; try { attrs = (Vector) testGroup.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); // remove all attributes final int n = attrs.size(); final Object[] arrayAttr = attrs.toArray(); for (int i = 0; i < n; i++) { try { testGroup.removeMetadata(arrayAttr[i]); } catch (final Exception ex) { fail("removeMetadata() failed. " + ex); } } // close the file and reopen it try { testGroup.clear(); testFile.close(); testFile.open(); testGroup = (H5Group) testFile.get(GNAME); } catch (final Exception ex) { fail("write() failed. " + ex); } attrs = null; try { attrs = (Vector) testGroup.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertFalse(attrs.size() > 0); // restor to the original try { testGroup.writeMetadata(H5TestFile.ATTRIBUTE_STR); testGroup.writeMetadata(H5TestFile.ATTRIBUTE_INT_ARRAY); } catch (final Exception ex) { fail("writeMetadata() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5Group#create(java.lang.String, ncsa.hdf.object.Group)} * . *

            * What to test: *

              *
            • Create a new group *
            • Close and reopen the file *
            • Check the new group *
            • Restore to the orginal file (remove the new group) *
            */ public final void testCreate() { Group grp = null; final String nameNew = "/tmpH5Group"; try { final Group rootGrp = (Group) testFile.get("/"); grp = H5Group.create(nameNew, rootGrp); } catch (final Exception ex) { fail("H5Group.create failed. " + ex); } assertNotNull(grp); try { testFile.close(); testFile.open(); } catch (final Exception ex) { fail("testFile.get() failed. " + ex); } try { grp = (Group) testFile.get(nameNew); } catch (final Exception ex) { fail("testFile.get() failed. " + ex); } assertNotNull(grp); try { testFile.delete(grp); // delete the new datast } catch (final Exception ex) { fail("testFile.delete() failed. " + ex); } try { testFile.close(); testFile.open(); } catch (final Exception ex) { fail("testFile.get() failed. " + ex); } grp = null; try { grp = (Group) testFile.get(nameNew); } catch (final Exception ex) { fail("testFile.get(deleted_newname) failed. " + ex); } assertNull(grp); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5Group#create(java.lang.String, ncsa.hdf.object.Group, int)} * . *

            * What to test: *

              *
            • Sets group creation property list identifier *
            • Sets link storage and creation order *
            • Check that group is not created when the order of group property list is incorrect. *
            • Create a new group *
            • Create subgroups *
            • Close and reopen the file *
            • Check the new group and subgroup *
            • Check name of ith link in group by creation order and storage type *
            • Restore to the original file (remove the new group) *
            */ public final void testCreateWithGroupplist() { Group grp = null; final String nameNew = "/Group1"; int gcpl = -1; int gid = -1; H5G_info_t ginfo; Group grp2 = null, grp3 = null; try { gcpl = H5.H5Pcreate(HDF5Constants.H5P_GROUP_CREATE); if (gcpl >= 0) { H5.H5Pset_link_creation_order(gcpl, HDF5Constants.H5P_CRT_ORDER_TRACKED + HDF5Constants.H5P_CRT_ORDER_INDEXED); // Set link creation order. H5.H5Pset_link_phase_change(gcpl, 3, 2); // Set link storage. } } catch (final Exception ex) { fail("H5.H5Pcreate() failed. " + ex); } try { final Group rootGrp = (Group) testFile.get("/"); grp = H5Group.create(nameNew, rootGrp, gcpl); } catch (final Exception ex) { ; //Expected -intentional as the order of gplist is invalid. } assertNull(grp); try { final Group rootGrp = (Group) testFile.get("/"); grp = H5Group.create(nameNew, rootGrp, HDF5Constants.H5P_DEFAULT, gcpl); } catch (final Exception ex) { ex.printStackTrace(); fail("H5Group.create failed. " + ex); } assertNotNull(grp); try { grp2 = H5Group.create("G5", grp); // create subgroups grp3 = H5Group.create("G3", grp); } catch (final Exception ex) { fail("H5Group.create failed. " + ex); } assertNotNull(grp2); assertNotNull(grp3); try { H5.H5Pclose(gcpl); } catch (final Exception ex) { } try { testFile.close(); // Close and reopen file. testFile.open(); } catch (final Exception ex) { fail("testFile.close() failed. " + ex); } grp = null; try { grp = (Group) testFile.get(nameNew); } catch (final Exception ex) { fail("testFile.get() failed. " + ex); } assertNotNull(grp); try { gid = grp.open(); } catch (final Exception ex) { fail("grp.open() failed. " + ex); } assertTrue(gid > 0); try { ginfo = H5.H5Gget_info(gid); // Get group info. String name = H5.H5Lget_name_by_idx(gid, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 1, HDF5Constants.H5P_DEFAULT); // Get name of ith link. assertEquals("G3", name); assertEquals(HDF5Constants.H5G_STORAGE_TYPE_COMPACT, ginfo.storage_type); } catch (final Exception ex) { fail("H5.H5Lget_name_by_idx() failed. " + ex); } grp.close(gid); try { testFile.delete(grp); // delete the new group } catch (final Exception ex) { fail("testFile.delete() failed. " + ex); } try { testFile.close(); // Close and reopen file. testFile.open(); } catch (final Exception ex) { fail("testFile.get() failed. " + ex); } grp = null; try { grp = (Group) testFile.get(nameNew); } catch (final Exception ex) { fail("testFile.get(deleted_newgroup) failed. " + ex); } assertNull(grp); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5Group} IsSerializable. */ public final void testIsSerializable() { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oos; try { oos = new ObjectOutputStream(out); oos.writeObject(testGroup); oos.close(); } catch (IOException err) { err.printStackTrace(); fail("ObjectOutputStream failed: " + err); } assertTrue(out.toByteArray().length > 0); } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS} SerializeToDisk. *

            * What to test: *

              *
            • serialize a group identifier *
            • deserialize a group identifier *
            • open a group identifier *
            • Check if gid is valid *
            • Close the group *
            */ public final void testSerializeToDisk() { try { FileOutputStream fos = new FileOutputStream("temph5grp.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(testGroup); oos.close(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } H5Group test = null; try { FileInputStream fis = new FileInputStream("temph5grp.ser"); ObjectInputStream ois = new ObjectInputStream(fis); test = (ncsa.hdf.object.h5.H5Group) ois.readObject(); ois.close(); // Clean up the file new File("temph5grp.ser").delete(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } int gid = -1; for (int loop = 0; loop < NLOOPS; loop++) { gid = -1; try { gid = test.open(); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(gid > 0); test.close(gid); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/object/H5ScalarDSTest.java0000644000175000017500000016540112050301057020742 0ustar sylvestresylvestre/** * */ package test.object; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Array; import java.util.Vector; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.object.Attribute; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.Datatype; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.Group; import ncsa.hdf.object.ScalarDS; import ncsa.hdf.object.h5.H5Datatype; import ncsa.hdf.object.h5.H5File; import ncsa.hdf.object.h5.H5ScalarDS; /** * TestCase for H5ScalarDS. *

            * This class tests all the public methods in H5ScalarDS class. *

            * The test file contains the following objects. * *

             * 
             * 
             *         /dataset_byte            Dataset {50, 10}
             *         /dataset_comp            Dataset {50, 10}
             *         /dataset_enum            Dataset {50, 10}
             *         /dataset_float           Dataset {50, 10}
             *         /dataset_image           Dataset {50, 10}
             *         /dataset_int             Dataset {50, 10}
             *         /dataset_str             Dataset {50, 10}
             *         /g0                      Group
             *         /g0/dataset_comp         Dataset {50, 10}
             *         /g0/dataset_int          Dataset {50, 10}
             *         /g0/datatype_float       Type
             *         /g0/datatype_int         Type
             *         /g0/datatype_str         Type
             *         /g0/g00                  Group
             *         /g0/g00/dataset_float    Dataset {50, 10}
             *         /g0_attr                 Group
             * 
            *

            * We use the following template to test all the methods: *

            * What to test: *

              *
            • Test for boundary conditions *
                *
              • *
              *
            • Test for failure *
                *
              • *
              *
            • Test for success on general functionality *
                *
              • *
              *
            * * @author Peter Cao, The HDF Group */ public class H5ScalarDSTest extends TestCase { private static final H5File H5FILE = new H5File(); private static final int NLOOPS = 10; private static final int TEST_VALUE_INT = Integer.MAX_VALUE; private static final float TEST_VALUE_FLOAT = Float.MAX_VALUE; private static final String TEST_VALUE_STR = "H5ScalarDSTest"; private static final String DNAME = H5TestFile.NAME_DATASET_INT; private static final String DNAME_SUB = H5TestFile.NAME_DATASET_INT_SUB; private H5Datatype typeInt = null; private H5Datatype typeFloat = null; private H5Datatype typeStr = null; private H5File testFile = null; private H5ScalarDS testDataset = null; /** * @param arg0 */ public H5ScalarDSTest(final String arg0) { super(arg0); } /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); typeInt = new H5Datatype(Datatype.CLASS_INTEGER, H5TestFile.DATATYPE_SIZE, -1, -1); typeFloat = new H5Datatype(Datatype.CLASS_FLOAT, H5TestFile.DATATYPE_SIZE, -1, -1); typeStr = new H5Datatype(Datatype.CLASS_STRING, H5TestFile.STR_LEN, -1, -1); testFile = (H5File) H5FILE.open(H5TestFile.NAME_FILE_H5, FileFormat.WRITE); assertNotNull(testFile); testFile.open(); testDataset = (H5ScalarDS) testFile.get(DNAME); assertNotNull(testDataset); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); if (testFile != null) { try { testFile.close(); } catch (final Exception ex) { } testFile = null; } } /** * Test method for * {@link ncsa.hdf.object.h5.H5ScalarDS#setName(java.lang.String)}. *

            * What to test: *

              *
            • Test for boundary conditions *
                *
              • Set name to null *
              *
            • Test for failure *
                *
              • Set a name that already exists in file. *
              *
            • Test for general functionality *
                *
              • change the dataset name *
              • close/re-open the file *
              • get the dataset with the new name *
              • failure test: get the dataset with the original name *
              • set the name back to the original name *
              *
            */ public final void testSetName() { final String newName = "tmpName"; // test set name to null try { testDataset.setName(null); } catch (final Exception ex) { ; // Expected - intentional } // set to an existing name try { testDataset.setName(H5TestFile.NAME_DATASET_FLOAT); } catch (final Exception ex) { ; // Expected - intentional } try { testDataset.setName(newName); } catch (final Exception ex) { fail("setName() failed. " + ex); } // close the file and reopen it try { testFile.close(); testFile.open(); testDataset = (H5ScalarDS) testFile.get(newName); } catch (final Exception ex) { fail("setName() failed. " + ex); } // test the old name H5ScalarDS tmpDset = null; try { tmpDset = (H5ScalarDS) testFile.get(DNAME); } catch (final Exception ex) { fail("setName() get(oldname) failed. " + ex); } assertNull("The dataset should be null because it has been renamed", tmpDset); // set back the original name try { testDataset.setName(DNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } // make sure the dataset is OK try { testDataset = (H5ScalarDS) testFile.get(DNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } assertNotNull(testDataset); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS#open()}. *

            * What to test: *

              *
            • open a dataset identifier *
            • get datatype and dataspace identifier for the dataset *
            • Repeat all above *
            */ public final void testOpen() { int did = -1, tid = -1, sid = -1; for (int loop = 0; loop < NLOOPS; loop++) { did = tid = sid = -1; try { did = testDataset.open(); tid = H5.H5Dget_type(did); sid = H5.H5Dget_space(did); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(did > 0); assertTrue(tid > 0); assertTrue(sid > 0); try { H5.H5Tclose(tid); } catch (final Exception ex) { } try { H5.H5Sclose(sid); } catch (final Exception ex) { } try { H5.H5Dclose(did); } catch (final Exception ex) { } } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS#close(int)}. *

            * What to test: *

              *
            • open a dataset identifier *
            • get datatype and dataspace identifier for the dataset *
            • close dataset *
            • failure test for the closed did *
            • Repeat all above *
            */ public final void testClose() { int did = -1, tid = -1, sid = -1; for (int loop = 0; loop < NLOOPS; loop++) { did = tid = sid = -1; try { did = testDataset.open(); tid = H5.H5Dget_type(did); sid = H5.H5Dget_space(did); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(did > 0); assertTrue(tid > 0); assertTrue(sid > 0); try { H5.H5Tclose(tid); } catch (final Exception ex) { } try { H5.H5Sclose(sid); } catch (final Exception ex) { } try { testDataset.close(did); } catch (final Exception ex) { fail("close() failed. " + ex); } // dataset is closed, expect to fail try { tid = H5.H5Dget_type(did); } catch (final Exception ex) { tid = -1; // Expected - intentional } assertTrue(tid < 0); try { sid = H5.H5Dget_space(did); } catch (final Exception ex) { sid = -1; // Expected - intentional } assertTrue(sid < 0); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS#clear()}. *

            * What to test: *

              *
            • Read data/attributes from file *
            • clear the dataet *
            • make sure that the data is empty *
            • make sure that the attribute list is empty *
            */ public final void testClear() { Object data = null; try { data = testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertTrue(Array.getLength(data) > 0); Vector attrs = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("clear() failed. " + ex); } // clear up the dataset testDataset.clear(); // attribute is empty try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("clear() failed. " + ex); } assertTrue(attrs.size() <= 0); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS#init()}. *

            * What to test: *

              *
            • call init() *
            • Select a subset *
            • Repeat all above *
            */ public final void testInit() { for (int loop = 0; loop < NLOOPS; loop++) { try { testFile.close(); } catch (final Exception ex) { } try { testFile.open(); testDataset = (H5ScalarDS) testFile.get(DNAME); } catch (final Exception ex) { fail("setName() failed. " + ex); } testDataset.init(); // test the rank final int rank = testDataset.getRank(); assertEquals(H5TestFile.RANK, rank); // test the dimesin sizes final long[] dims = testDataset.getDims(); assertNotNull(dims); for (int i = 0; i < rank; i++) { assertEquals(H5TestFile.DIMs[i], dims[i]); } // start at 0 final long[] start = testDataset.getStartDims(); assertNotNull(start); for (int i = 0; i < rank; i++) { assertEquals(0, start[i]); } // test selection final long[] selectedDims = testDataset.getSelectedDims(); final int[] selectedIndex = testDataset.getSelectedIndex(); assertNotNull(selectedDims); assertNotNull(selectedIndex); if (rank == 1) { assertEquals(0, selectedIndex[0]); assertEquals(dims[0], selectedDims[0]); } else if (rank == 2) { assertEquals(0, selectedIndex[0]); assertEquals(1, selectedIndex[1]); assertEquals(dims[0], selectedDims[0]); assertEquals(dims[1], selectedDims[1]); } else if (rank > 2) { assertEquals(rank - 2, selectedIndex[0]); // columns assertEquals(rank - 1, selectedIndex[1]); // rows assertEquals(rank - 3, selectedIndex[2]); assertEquals(dims[rank - 1], selectedDims[rank - 1]); assertEquals(dims[rank - 2], selectedDims[rank - 2]); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open try { testFile.close(); } catch (final Exception ex) { } } // for (int loop=0; loop * What to test: *
              *
            • Read the whole dataset of the test dataset *
            • read a subset of the test dataset *
            • Repeat all above *
            • Read all types scalar datasets * *
            */ public final void testRead() { for (int loop = 0; loop < NLOOPS; loop++) { testDataset.init(); int[] ints = null; // read the whole dataset try { ints = (int[]) testDataset.getData(); } catch (final Exception ex) { fail("testDataset.getData() failed. " + ex); } assertNotNull(ints); // check the data content for (int i = 0; i < ints.length; i++) { assertEquals(H5TestFile.DATA_INT[i], ints[i]); } } // for (int loop=0; loop * What to test: *
              *
            • Read an external dataset *
            */ public final void testReadExt() { Dataset dset = null; H5File file = null; try { file = new H5File("test/object/h5ex_d_extern.hdf5"); dset = (Dataset)file.get("/DS1"); } catch (Exception ex) {;} assertNotNull(dset); try { dset.read(); } catch (Exception ex) { fail("Failed to read data form an external dataset."); } try { if (file!=null) file.close(); } catch (Exception ex) {;} } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS#read()}. *

            * What to test: *

              *
            • Read data row by row *
            • Repeat all above *
            */ public final void testReadByRow() { int[] data = null; for (int loop = 0; loop < NLOOPS; loop++) { testDataset.init(); // read data row by row final int nrows = testDataset.getHeight(); for (int i = 0; i < nrows; i++) { testDataset.clearData(); testDataset.init(); final int rank = testDataset.getRank(); final long[] start = testDataset.getStartDims(); final long[] count = testDataset.getSelectedDims(); // select one row only for (int j = 0; j < rank; j++) { count[j] = 1; } // select different rows start[0] = i; try { data = (int[]) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); final int idx = (int) H5TestFile.DIM2 * i; assertEquals(H5TestFile.DATA_INT[idx], data[0]); } // for (int i=0; i * What to test: *
              *
            • Read the whole dataset in a byte buffer *
            • check the data size *
            */ public final void testReadBytes() { byte[] data = null; try { data = testDataset.readBytes(); } catch (final Exception ex) { fail("readBytes() failed. " + ex); } assertNotNull(data); final int n = Array.getLength(data); final int expected = H5TestFile.DIM_SIZE * 4; assertEquals(expected, n); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5ScalarDS#write(java.lang.Object)}. *

            * What to test: *

              *
            • Read/write the whole dataset *
            • Repeat all above *
            • write the original data back to file *
            */ public final void testWriteObject() { int[] data = null; for (int loop = 0; loop < NLOOPS; loop++) { // read the whole dataset by default testDataset.init(); try { data = (int[]) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertEquals(H5TestFile.DIM_SIZE, Array.getLength(data)); // change the data value for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { data[i] = TEST_VALUE_INT; } // write the data to file try { testDataset.write(data); } catch (final Exception ex) { fail("write() failed. " + ex); } // close the file and reopen it try { testFile.close(); testFile.open(); testDataset = (H5ScalarDS) testFile.get(DNAME); } catch (final Exception ex) { fail("write() failed. " + ex); } // read the data into memory to make sure the data is correct testDataset.init(); testDataset.clearData(); try { data = (int[]) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertEquals(H5TestFile.DIM_SIZE, Array.getLength(data)); // check the data values for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(TEST_VALUE_INT, data[i]); } // write the original data into file try { testDataset.write(H5TestFile.DATA_INT); } catch (final Exception ex) { fail("write() failed. " + ex); } } // for (int loop=0; loop * What to test: *
              *
            • Read/write a subset of dataset *
            • Repeat all above *
            • write the original data back to file *
            */ public final void testWriteSubset() { int[] data = null; for (int loop = 0; loop < NLOOPS; loop++) { // read the whole dataset by default testDataset.init(); // write a subset: the first half of the dataset final int rank = testDataset.getRank(); final long[] dims = testDataset.getDims(); long[] count = testDataset.getSelectedDims(); // select the first 1/2 of the datast long size = 1; for (int j = 0; j < rank; j++) { count[j] = dims[j] / 2; size *= count[j]; } data = new int[(int) size]; for (int j = 0; j < size; j++) { data[j] = TEST_VALUE_INT; } // write the data to file try { testDataset.write(data); } catch (final Exception ex) { fail("write() failed. " + ex); } // close the file and reopen it try { testFile.close(); testFile.open(); testDataset = (H5ScalarDS) testFile.get(DNAME); } catch (final Exception ex) { fail("write() failed. " + ex); } // read the data into memory to make sure the data is correct testDataset.init(); testDataset.clearData(); // select the first 1/2 of the datast count = testDataset.getSelectedDims(); for (int j = 0; j < rank; j++) { count[j] = dims[j] / 2; } try { data = (int[]) testDataset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); assertEquals(size, Array.getLength(data)); // check the data values for (int i = 0; i < size; i++) { assertEquals(TEST_VALUE_INT, data[i]); } // write the original data into file for (int j = 0; j < rank; j++) { count[j] = dims[j]; } try { testDataset.write(H5TestFile.DATA_INT); } catch (final Exception ex) { fail("write() failed. " + ex); } } // for (int loop=0; loop * What to test: *
              *
            • Read/write a subset of null strings *
            • Repeat all above *
            • write the original data back to file *
            */ public final void testReadWriteNullStr() { String[] data = null; String[] nullStrs = null; H5ScalarDS dset = null; try { dset = (H5ScalarDS) testFile.get(H5TestFile.NAME_DATASET_STR); dset.init(); } catch (Exception ex) { dset = null; } assertNotNull(dset); try { data = (String[]) dset.getData(); } catch (Exception ex) { data = null; } assertNotNull(data); assertTrue(data.length > 0); nullStrs = new String[data.length]; for (int i = 0; i < data.length; i++) nullStrs[i] = null; // write null strings try { dset.write(nullStrs); } catch (Exception ex) { fail("Write null strings failed. " + ex); } // read null strings try { dset.clearData(); nullStrs = (String[]) dset.read(); } catch (Exception ex) { fail("Read null strings failed. " + ex); nullStrs = null; } assertNotNull(nullStrs); // make sure all the strings are empty for (int i = 0; i < data.length; i++) { assertNotNull(nullStrs[i]); assertTrue(nullStrs[i].length() == 0); } // restore to the original state try { dset.write(data); } catch (Exception ex) { fail("Write null strings failed. " + ex); } // read data back and check it is to the original state try { dset.clearData(); nullStrs = (String[]) dset.read(); } catch (Exception ex) { fail("Read null strings failed. " + ex); nullStrs = null; } assertNotNull(nullStrs); for (int i = 0; i < data.length; i++) assertTrue(data[i].equals(nullStrs[i])); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5ScalarDS#copy(ncsa.hdf.object.Group, java.lang.String, long[], java.lang.Object)} * . *

            * What to test: *

              *
            • Copy all scalar datasets to a new file *
            • Check the content of new datasts *
            • Repeat all above *
            */ public final void testCopy() { int nObjs = 0; Dataset dset = null, dsetNew = null; H5File tmpFile = null; final String DNAMES[] = { H5TestFile.NAME_DATASET_CHAR, H5TestFile.NAME_DATASET_ENUM, H5TestFile.NAME_DATASET_FLOAT, H5TestFile.NAME_DATASET_IMAGE, H5TestFile.NAME_DATASET_INT, H5TestFile.NAME_DATASET_STR }; try { testFile.close(); } catch (final Exception ex) { ; } for (int loop = 0; loop < NLOOPS; loop++) { tmpFile = new H5File("H5ScalarDS_testCopy.h5", FileFormat.CREATE); try { // test two open options: open full tree or open individual // object only for (int openOption = 0; openOption < 2; openOption++) { nObjs = 0; if (openOption == 0) { try { testFile.open(); // opent the full tree } catch (final Exception ex) { System.err.println("file.open(). " + ex); } } try { final Group rootGrp = (Group) tmpFile.get("/"); // datasets for (int j = 0; j < DNAMES.length; j++) { dset = (Dataset) testFile.get(DNAMES[j]); dset.init(); final Object data = dset.getData(); dset.write(data); dset.getMetadata(); // copy data into a new datast if (dset instanceof ScalarDS) { dsetNew = dset.copy(rootGrp, DNAMES[j] + "_copy" + openOption, H5TestFile.DIMs, data); assertNotNull(dsetNew); final Object dataCopy = dsetNew.getData(); final int size = Array.getLength(data); for (int k = 0; k < size; k++) { assertEquals(Array.get(data, k), Array.get( dataCopy, k)); } } } } catch (final Exception ex) { fail("file.get(). " + ex); } nObjs = 0; try { nObjs = H5.H5Fget_obj_count(tmpFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { ; } if (nObjs > 1) { fail("Possible memory leak. Some objects are still open."); } try { tmpFile.close(); } catch (final Exception ex) { System.err.println("file.close() failed. " + ex); } } // for (int openOption=0; openOption<2; openOption++) } finally { // delete the testing file if (tmpFile != null) { tmpFile.delete(); } } } // for (int loop=0; loop * What to test: *
              *
            • Get datatype *
            • Check the class and size of the datatype *
            */ public final void testGetDatatype() { H5Datatype dtype = null; try { dtype = (H5Datatype) testDataset.getDatatype(); } catch (final Exception ex) { fail("testDataset.getDatatype() failed. " + ex); } assertNotNull(dtype); assertEquals(Datatype.CLASS_INTEGER, dtype.getDatatypeClass()); assertEquals(H5TestFile.DATATYPE_SIZE, dtype.getDatatypeSize()); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS#getPalette()}. *

            * What to test: *

              *
            • Get the palette from an image *
            • Check the content of the palette *
            */ public final void testGetPalette() { ScalarDS img = null; try { img = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_IMAGE); } catch (final Exception ex) { fail("testFile.get failed. " + ex); } assertNotNull(img); final byte[][] pal = img.getPalette(); assertNotNull(pal); for (int i = 0; i < 256; i++) { assertEquals(H5TestFile.DATA_PALETTE[i * 3], pal[0][i]); assertEquals(H5TestFile.DATA_PALETTE[i * 3 + 1], pal[1][i]); assertEquals(H5TestFile.DATA_PALETTE[i * 3 + 2], pal[2][i]); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS#readPalette(int)}. *

            * What to test: *

              *
            • Get the palette from an image *
            • Check the content of the palette *
            */ public final void testReadPalette() { ScalarDS img = null; try { img = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_IMAGE); } catch (final Exception ex) { fail("testFile.get failed. " + ex); } assertNotNull(img); final byte[][] pal = img.readPalette(0); assertNotNull(pal); for (int i = 0; i < 256; i++) { assertEquals(H5TestFile.DATA_PALETTE[i * 3], pal[0][i]); assertEquals(H5TestFile.DATA_PALETTE[i * 3 + 1], pal[1][i]); assertEquals(H5TestFile.DATA_PALETTE[i * 3 + 2], pal[2][i]); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS#getPaletteRefs()}. *

            * What to test: *

              *
            • Get an array of palette references from an image *
            • Check the content of the palette references *
            */ public final void testGetPaletteRefs() { ScalarDS img = null; try { img = (ScalarDS) testFile.get(H5TestFile.NAME_DATASET_IMAGE); } catch (final Exception ex) { fail("testFile.get failed. " + ex); } assertNotNull(img); final byte[] refs = img.getPaletteRefs(); assertNotNull(refs); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5ScalarDS#H5ScalarDS(ncsa.hdf.object.FileFormat, java.lang.String, java.lang.String)} * . *

            * What to test: *

              *
            • Construct an H5ScalarDS object that exits in file *
                *
              • new H5ScalarDS (file, null, fullpath) *
              • new H5ScalarDS (file, fullname, null) *
              • new H5ScalarDS (file, name, path) *
              *
            • Construct an H5ScalarDS object that does not exist in file *
            */ public final void testH5ScalarDSFileFormatStringString() { int[] data = null; final String[] names = { null, DNAME_SUB, DNAME.substring(1) }; final String[] paths = { DNAME_SUB, null, H5TestFile.NAME_GROUP }; final H5File file = (H5File) testDataset.getFileFormat(); assertNotNull(file); // test existing dataset in file for (int idx = 0; idx < names.length; idx++) { H5ScalarDS dset = new H5ScalarDS(file, names[idx], paths[idx]); assertNotNull(dset); // make sure that the data content is correct try { data = (int[]) dset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(H5TestFile.DATA_INT[i], data[i]); } // check the name and path assertTrue(DNAME_SUB.equals(dset.getFullName())); assertTrue(DNAME_SUB.equals(dset.getPath() + dset.getName())); dset.clear(); dset = null; } // test a non-existing dataset final H5ScalarDS dset = new H5ScalarDS(file, "NO_SUCH_DATASET", "NO_SUCH_PATH"); dset.init(); dset.clearData(); data = null; try { data = (int[]) dset.getData(); } catch (final Exception ex) { data = null; // Expected - intentional } assertNull(data); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5ScalarDS#H5ScalarDS(ncsa.hdf.object.FileFormat, java.lang.String, java.lang.String, long[])} * . *

            * What to test: *

              *
            • Construct an H5ScalarDS object that exits in file *
                *
              • new H5ScalarDS (file, null, fullpath, oid) *
              • new H5ScalarDS (file, fullname, null, oid) *
              • new H5ScalarDS (file, name, path, oid) *
              *
            • Construct an H5ScalarDS object that does not exist in file *
            */ public final void testH5ScalarDSFileFormatStringStringLongArray() { int[] data = null; final String[] names = { null, DNAME_SUB, DNAME.substring(1) }; final String[] paths = { DNAME_SUB, null, H5TestFile.NAME_GROUP }; final H5File file = (H5File) testDataset.getFileFormat(); assertNotNull(file); // test existing dataset in file long[] oid = null; for (int idx = 0; idx < names.length; idx++) { try { final byte[] ref_buf = H5.H5Rcreate(file.getFID(), DNAME_SUB, HDF5Constants.H5R_OBJECT, -1); final long l = HDFNativeData.byteToLong(ref_buf, 0); oid = new long[1]; oid[0] = l; // save the object ID } catch (final HDF5Exception ex) { fail("H5.H5Rcreate() failed. " + ex); } assertNotNull(oid); H5ScalarDS dset = new H5ScalarDS(file, names[idx], paths[idx], oid); assertNotNull(dset); // make sure that the data content is correct try { data = (int[]) dset.getData(); } catch (final Exception ex) { fail("getData() failed. " + ex); } assertNotNull(data); for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(H5TestFile.DATA_INT[i], data[i]); } // check the name and path assertTrue(DNAME_SUB.equals(dset.getFullName())); assertTrue(DNAME_SUB.equals(dset.getPath() + dset.getName())); dset.clear(); dset = null; } // test a non-existing dataset final H5ScalarDS dset = new H5ScalarDS(file, "NO_SUCH_DATASET", "NO_SUCH_PATH", null); dset.init(); dset.clearData(); data = null; try { data = (int[]) dset.getData(); } catch (final Exception ex) { data = null; // Expected - intentional } assertNull(data); int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS#getMetadata()}. *

            * What to test: *

              *
            • Get all the attributes *
            • Check the content of the attributes *
            */ public final void testGetMetadata() { Vector attrs = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); final int n = attrs.size(); for (int i = 0; i < n; i++) { final Attribute attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == Datatype.CLASS_STRING) { assertTrue(H5TestFile.ATTRIBUTE_STR.getName().equals( attr.getName())); assertTrue(((String[]) H5TestFile.ATTRIBUTE_STR.getValue())[0] .equals(((String[]) attr.getValue())[0])); } else if (dtype.getDatatypeClass() == Datatype.CLASS_INTEGER) { assertTrue(H5TestFile.ATTRIBUTE_INT_ARRAY.getName().equals( attr.getName())); final int[] expected = (int[]) H5TestFile.ATTRIBUTE_INT_ARRAY .getValue(); assertNotNull(expected); final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < expected.length; j++) { assertEquals(expected[j], ints[j]); } } } // for (int i=0; i * What to test: *
              *
            • Update the value of an existing attribute *
            • Attach a new attribute *
            • Close and re-open file to check if the change is made in file *
            • Restore to the orginal state *
            */ public final void testWriteMetadata() { Vector attrs = null; Attribute attr = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); // update existing attribute int n = attrs.size(); for (int i = 0; i < n; i++) { attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == Datatype.CLASS_STRING) { final String[] strs = (String[]) attr.getValue(); strs[0] = TEST_VALUE_STR; } else if (dtype.getDatatypeClass() == Datatype.CLASS_INTEGER) { final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < ints.length; j++) { ints[j] = TEST_VALUE_INT; } } try { testDataset.writeMetadata(attr); } catch (final Exception ex) { fail("writeMetadata() failed. " + ex); } } // for (int i=0; i 0); n = attrs.size(); Attribute newAttr = null; for (int i = 0; i < n; i++) { attr = (Attribute) attrs.get(i); final H5Datatype dtype = (H5Datatype) attr.getType(); if (dtype.getDatatypeClass() == Datatype.CLASS_STRING) { assertTrue(H5TestFile.ATTRIBUTE_STR.getName().equals( attr.getName())); assertTrue(TEST_VALUE_STR .equals(((String[]) attr.getValue())[0])); } else if (dtype.getDatatypeClass() == Datatype.CLASS_INTEGER) { assertTrue(H5TestFile.ATTRIBUTE_INT_ARRAY.getName().equals( attr.getName())); final int[] ints = (int[]) attr.getValue(); assertNotNull(ints); for (int j = 0; j < ints.length; j++) { assertEquals(TEST_VALUE_INT, ints[j]); } } else if (dtype.getDatatypeClass() == Datatype.CLASS_FLOAT) { newAttr = attr; final float[] floats = (float[]) attr.getValue(); assertEquals(TEST_VALUE_FLOAT, floats[0], Float.MIN_VALUE); } } // for (int i=0; i * What to test: *
              *
            • Remove all existing attributes *
            • Close and reopen file to check if all attribute are removed from file *
            • Restore to the orginal state *
            */ public final void testRemoveMetadata() { Vector attrs = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertTrue(attrs.size() > 0); // remove all attributes final int n = attrs.size(); final Object[] arrayAttr = attrs.toArray(); for (int i = 0; i < n; i++) { try { testDataset.removeMetadata(arrayAttr[i]); } catch (final Exception ex) { fail("removeMetadata() failed. " + ex); } } // close the file and reopen it try { testDataset.clear(); testFile.close(); testFile.open(); testDataset = (H5ScalarDS) testFile.get(DNAME); } catch (final Exception ex) { fail("write() failed. " + ex); } attrs = null; try { attrs = (Vector) testDataset.getMetadata(); } catch (final Exception ex) { fail("getMetadata() failed. " + ex); } assertNotNull(attrs); assertFalse(attrs.size() > 0); // restor to the original try { testDataset.writeMetadata(H5TestFile.ATTRIBUTE_STR); testDataset.writeMetadata(H5TestFile.ATTRIBUTE_INT_ARRAY); } catch (final Exception ex) { fail("writeMetadata() failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for * {@link ncsa.hdf.object.h5.H5ScalarDS#create(java.lang.String, ncsa.hdf.object.Group, ncsa.hdf.object.Datatype, long[], long[], long[], int, java.lang.Object)} * . *

            * What to test: *

              *
            • Create a new dataset of 32-bit float with level-9 gzip compression *
            • Close and reopen the file *
            • Check the content of the new dataset *
            • Restore to the orginal file (remove the new dataset) *
            */ public final void testCreate() { ScalarDS dset = null; final String nameNew = "/tmpH5ScalarDS"; float[] data = null; final H5Datatype typeFloat = new H5Datatype(Datatype.CLASS_FLOAT, 4, -1, -1); try { final Group rootGrp = (Group) testFile.get("/"); dset = H5ScalarDS.create(nameNew, rootGrp, typeFloat, H5TestFile.DIMs, null, H5TestFile.CHUNKs, 9, H5TestFile.DATA_FLOAT); } catch (final Exception ex) { fail("H5ScalarDS.create() failed. " + ex); } // check the data content try { data = (float[]) dset.getData(); } catch (final Exception ex) { fail("dset.getData() failed. " + ex); } assertNotNull(data); for (int i = 0; i < H5TestFile.DIM_SIZE; i++) { assertEquals(H5TestFile.DATA_FLOAT[i], data[i], Float.MIN_VALUE); } try { testFile.delete(dset); // delete the new datast } catch (final Exception ex) { fail("testFile.delete failed. " + ex); } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS} IsSerializable. */ public final void testIsSerializable() { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oos; try { oos = new ObjectOutputStream(out); oos.writeObject(testDataset); oos.close(); } catch (IOException err) { err.printStackTrace(); fail("ObjectOutputStream failed: " + err); } assertTrue(out.toByteArray().length > 0); } /** * Test method for {@link ncsa.hdf.object.h5.H5ScalarDS} SerializeToDisk. *

            * What to test: *

              *
            • serialize a dataset identifier *
            • deserialize a dataset identifier *
            • open a dataset identifier *
            • get datatype and dataspace identifier for the dataset *
            */ public final void testSerializeToDisk() { try { FileOutputStream fos = new FileOutputStream("temph5dset.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(testDataset); oos.close(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } H5ScalarDS test = null; try { FileInputStream fis = new FileInputStream("temph5dset.ser"); ObjectInputStream ois = new ObjectInputStream(fis); test = (ncsa.hdf.object.h5.H5ScalarDS) ois.readObject(); ois.close(); // Clean up the file new File("temph5dset.ser").delete(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } int did = -1, tid = -1, sid = -1; for (int loop = 0; loop < NLOOPS; loop++) { did = tid = sid = -1; try { did = test.open(); tid = H5.H5Dget_type(did); sid = H5.H5Dget_space(did); } catch (final Exception ex) { fail("open() failed. " + ex); } assertTrue(did > 0); assertTrue(tid > 0); assertTrue(sid > 0); try { H5.H5Tclose(tid); } catch (final Exception ex) { } try { H5.H5Sclose(sid); } catch (final Exception ex) { } try { H5.H5Dclose(did); } catch (final Exception ex) { } } int nObjs = 0; try { nObjs = H5.H5Fget_obj_count(testFile.getFID(), HDF5Constants.H5F_OBJ_ALL); } catch (final Exception ex) { fail("H5.H5Fget_obj_count() failed. " + ex); } assertEquals(1, nObjs); // file id should be the only one left open } } jhdf-2.9/test/Makefile.in0000644000175000017500000000265412050301060016177 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = .. DIR = test #SUBDIRS = hdf5lib object uitest SUBDIRS = hdf5lib object JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@ JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ include $(TOP)/config/Rules.mk check: (cd hdf5lib; $(MAKE) check;) (cd object; $(MAKE) check;) (cd object/misc; $(MAKE) check) # (cd uitest; $(MAKE) check;) jhdf-2.9/test/CMakeLists.txt0000644000175000017500000000051212050301060016661 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_TEST) ADD_SUBDIRECTORY(${HDFJAVA_TEST_SOURCE_DIR}/hdf5lib hdf5lib) ADD_SUBDIRECTORY(${HDFJAVA_TEST_SOURCE_DIR}/object object) ADD_SUBDIRECTORY(${HDFJAVA_TEST_SOURCE_DIR}/object/misc object/misc) ADD_SUBDIRECTORY(${HDFJAVA_TEST_SOURCE_DIR}/uitest uitest) jhdf-2.9/test/hdf5lib/0000755000175000017500000000000012051203651015450 5ustar sylvestresylvestrejhdf-2.9/test/hdf5lib/TestH5Lbasic.java0000644000175000017500000003516612050301057020556 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.callbacks.H5L_iterate_cb; import ncsa.hdf.hdf5lib.callbacks.H5L_iterate_t; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5L_info_t; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Lbasic { private static final String H5_FILE = "test/hdf5lib/h5ex_g_iterate.hdf"; int H5fid = -1; @Before public void openH5file() throws HDF5LibraryException, NullPointerException { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Fopen: openH5file: " + err); } } @After public void closeH5file() throws HDF5LibraryException { if (H5fid > 0) { try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } } @Test public void testH5Lexists() { boolean link_exists = false; try { link_exists = H5.H5Lexists(H5fid, "None", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } assertFalse("H5Lexists ",link_exists); try { link_exists = H5.H5Lexists(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } assertTrue("H5Lexists ",link_exists); try { link_exists = H5.H5Lexists(H5fid, "G1/DS2", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } assertTrue("H5Lexists ",link_exists); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_info_not_exist() throws Throwable { H5.H5Lget_info(H5fid, "None", HDF5Constants.H5P_DEFAULT); } @Test public void testH5Lget_info_dataset() { H5L_info_t link_info = null; try { link_info = H5.H5Lget_info(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info: " + err); } assertFalse("H5Lget_info ",link_info==null); assertTrue("H5Lget_info link type",link_info.type==HDF5Constants.H5L_TYPE_HARD); } @Test public void testH5Lget_info_hardlink() { H5L_info_t link_info = null; try { link_info = H5.H5Lget_info(H5fid, "L1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info: " + err); } assertFalse("H5Lget_info ",link_info==null); assertTrue("H5Lget_info link type",link_info.type==HDF5Constants.H5L_TYPE_HARD); assertTrue("Link Address ",link_info.address_val_size>0); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_info_by_idx_name_not_exist_name() throws Throwable { H5.H5Lget_info_by_idx(H5fid, "None", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_info_by_idx_name_not_exist_create() throws Throwable { H5.H5Lget_info_by_idx(H5fid, "None", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_info_by_idx_not_exist_name() throws Throwable { H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 5, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_info_by_idx_not_exist_create() throws Throwable { H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 5, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Lget_info_by_idx_n0() { H5L_info_t link_info = null; H5L_info_t link_info2 = null; try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("H5Lget_info_by_idx ",link_info==null); assertTrue("H5Lget_info_by_idx link type",link_info.type==HDF5Constants.H5L_TYPE_HARD); try { link_info2 = H5.H5Lget_info(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info: " + err); } assertTrue("Link Address ",link_info.address_val_size==link_info2.address_val_size); } @Test public void testH5Lget_info_by_idx_n3() { H5L_info_t link_info = null; H5L_info_t link_info2 = null; try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 3, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("H5Lget_info_by_idx ",link_info==null); assertTrue("H5Lget_info_by_idx link type",link_info.type==HDF5Constants.H5L_TYPE_HARD); try { link_info2 = H5.H5Lget_info(H5fid, "L1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info: " + err); } assertTrue("Link Address ",link_info.address_val_size==link_info2.address_val_size); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_name_by_idx_not_exist() throws Throwable { H5.H5Lget_name_by_idx(H5fid, "None", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Lget_name_by_idx_n0() { String link_name = null; try { link_name = H5.H5Lget_name_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_name_by_idx: " + err); } assertFalse("H5Lget_name_by_idx ",link_name==null); assertTrue("Link Name ",link_name.compareTo("DS1")==0); } @Test public void testH5Lget_name_by_idx_n3() { String link_name = null; try { link_name = H5.H5Lget_name_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 3, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_name_by_idx: " + err); } assertFalse("H5Lget_name_by_idx ",link_name==null); assertTrue("Link Name ",link_name.compareTo("L1")==0); } @Test public void testH5Lvisit() { class idata { public String link_name = null; public int link_type = -1; idata(String name, int type) { this.link_name = name; this.link_type = type; } } class H5L_iter_data implements H5L_iterate_t { public ArrayList iterdata = new ArrayList(); } H5L_iterate_t iter_data = new H5L_iter_data(); class H5L_iter_callback implements H5L_iterate_cb { public int callback(int group, String name, H5L_info_t info, H5L_iterate_t op_data) { idata id = new idata(name, info.type); ((H5L_iter_data)op_data).iterdata.add(id); return 0; } } H5L_iterate_cb iter_cb = new H5L_iter_callback(); try { H5.H5Lvisit(H5fid, HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, iter_cb, iter_data); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lvisit: " + err); } assertFalse("H5Lvisit ",((H5L_iter_data)iter_data).iterdata.isEmpty()); assertTrue("H5Lvisit "+((H5L_iter_data)iter_data).iterdata.size(),((H5L_iter_data)iter_data).iterdata.size()==5); assertTrue("H5Lvisit "+(((H5L_iter_data)iter_data).iterdata.get(0)).link_name,(((H5L_iter_data)iter_data).iterdata.get(0)).link_name.compareToIgnoreCase("DS1")==0); assertTrue("H5Lvisit "+(((H5L_iter_data)iter_data).iterdata.get(1)).link_name,(((H5L_iter_data)iter_data).iterdata.get(1)).link_name.compareToIgnoreCase("DT1")==0); assertTrue("H5Lvisit "+(((H5L_iter_data)iter_data).iterdata.get(2)).link_name,(((H5L_iter_data)iter_data).iterdata.get(2)).link_name.compareToIgnoreCase("G1")==0); assertTrue("H5Lvisit "+(((H5L_iter_data)iter_data).iterdata.get(3)).link_name,(((H5L_iter_data)iter_data).iterdata.get(3)).link_name.compareToIgnoreCase("G1/DS2")==0); assertTrue("H5Lvisit "+(((H5L_iter_data)iter_data).iterdata.get(4)).link_name,(((H5L_iter_data)iter_data).iterdata.get(4)).link_name.compareToIgnoreCase("L1")==0); } @Test public void testH5Lvisit_by_name() { class idata { public String link_name = null; public int link_type = -1; idata(String name, int type) { this.link_name = name; this.link_type = type; } } class H5L_iter_data implements H5L_iterate_t { public ArrayList iterdata = new ArrayList(); } H5L_iterate_t iter_data = new H5L_iter_data(); class H5L_iter_callback implements H5L_iterate_cb { public int callback(int group, String name, H5L_info_t info, H5L_iterate_t op_data) { idata id = new idata(name, info.type); ((H5L_iter_data)op_data).iterdata.add(id); return 0; } } H5L_iterate_cb iter_cb = new H5L_iter_callback(); try { H5.H5Lvisit_by_name(H5fid, "G1", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, iter_cb, iter_data, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lvisit_by_name: " + err); } assertFalse("H5Lvisit_by_name ",((H5L_iter_data)iter_data).iterdata.isEmpty()); assertTrue("H5Lvisit_by_name "+((H5L_iter_data)iter_data).iterdata.size(),((H5L_iter_data)iter_data).iterdata.size()==1); assertTrue("H5Lvisit_by_name "+(((H5L_iter_data)iter_data).iterdata.get(0)).link_name,(((H5L_iter_data)iter_data).iterdata.get(0)).link_name.compareToIgnoreCase("DS2")==0); } @Test public void testH5Literate() { class idata { public String link_name = null; public int link_type = -1; idata(String name, int type) { this.link_name = name; this.link_type = type; } } class H5L_iter_data implements H5L_iterate_t { public ArrayList iterdata = new ArrayList(); } H5L_iterate_t iter_data = new H5L_iter_data(); class H5L_iter_callback implements H5L_iterate_cb { public int callback(int group, String name, H5L_info_t info, H5L_iterate_t op_data) { idata id = new idata(name, info.type); ((H5L_iter_data)op_data).iterdata.add(id); return 0; } } H5L_iterate_cb iter_cb = new H5L_iter_callback(); try { H5.H5Literate(H5fid, HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0L, iter_cb, iter_data); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Literate: " + err); } assertFalse("H5Literate ",((H5L_iter_data)iter_data).iterdata.isEmpty()); assertTrue("H5Literate "+((H5L_iter_data)iter_data).iterdata.size(),((H5L_iter_data)iter_data).iterdata.size()==4); assertTrue("H5Literate "+(((H5L_iter_data)iter_data).iterdata.get(0)).link_name,(((H5L_iter_data)iter_data).iterdata.get(0)).link_name.compareToIgnoreCase("DS1")==0); assertTrue("H5Literate "+(((H5L_iter_data)iter_data).iterdata.get(1)).link_name,(((H5L_iter_data)iter_data).iterdata.get(1)).link_name.compareToIgnoreCase("DT1")==0); assertTrue("H5Literate "+((idata)((H5L_iter_data)iter_data).iterdata.get(2)).link_name,(((H5L_iter_data)iter_data).iterdata.get(2)).link_name.compareToIgnoreCase("G1")==0); assertTrue("H5Literate "+((idata)((H5L_iter_data)iter_data).iterdata.get(3)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(3)).link_name.compareToIgnoreCase("L1")==0); } @Test public void testH5Literate_by_name() { class idata { public String link_name = null; public int link_type = -1; idata(String name, int type) { this.link_name = name; this.link_type = type; } } class H5L_iter_data implements H5L_iterate_t { public ArrayList iterdata = new ArrayList(); } H5L_iterate_t iter_data = new H5L_iter_data(); class H5L_iter_callback implements H5L_iterate_cb { public int callback(int group, String name, H5L_info_t info, H5L_iterate_t op_data) { idata id = new idata(name, info.type); ((H5L_iter_data)op_data).iterdata.add(id); return 0; } } H5L_iterate_cb iter_cb = new H5L_iter_callback(); try { H5.H5Literate_by_name(H5fid, "G1", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0L, iter_cb, iter_data, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Literate_by_name: " + err); } assertFalse("H5Literate_by_name ",((H5L_iter_data)iter_data).iterdata.isEmpty()); assertTrue("H5Literate_by_name "+((H5L_iter_data)iter_data).iterdata.size(),((H5L_iter_data)iter_data).iterdata.size()==1); assertTrue("H5Literate_by_name "+((idata)((H5L_iter_data)iter_data).iterdata.get(0)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(0)).link_name.compareToIgnoreCase("DS2")==0); } } jhdf-2.9/test/hdf5lib/TestH5Ocreate.java0000644000175000017500000004524112050301057020736 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.util.ArrayList; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.callbacks.H5O_iterate_cb; import ncsa.hdf.hdf5lib.callbacks.H5O_iterate_t; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5O_info_t; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Ocreate { private static final String H5_EXTFILE = "test/hdf5lib/h5ex_g_iterate.hdf"; private static final String H5_FILE = "test.h5"; private static final int DIM_X = 4; private static final int DIM_Y = 6; int H5fcpl = -1; int H5fid = -1; int H5dsid = -1; int H5did1 = -1; int H5did2 = -1; int H5gcpl = -1; int H5gid = -1; long[] H5dims = { DIM_X, DIM_Y }; private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try { file.delete(); } catch (Exception e) { e.printStackTrace(); } } } private final int _createDataset(int fid, int dsid, String name, int dapl) { int did = -1; try { did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5O._createDataset: ",did > 0); return did; } private final int _createGroup(int fid, String name) { int gid = -1; try { H5gcpl = HDF5Constants.H5P_DEFAULT; gid = H5.H5Gcreate(fid, name, HDF5Constants.H5P_DEFAULT, H5gcpl, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gcreate: " + err); } assertTrue("TestH5O._createGroup: ",gid > 0); return gid; } private final void _createHardLink(int fid, int cid, String curname, int did, String dstname, int lcpl, int lapl) { boolean link_exists = false; try { H5.H5Lcreate_hard(cid, curname, did, dstname, lcpl, lapl); H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_LOCAL); link_exists = H5.H5Lexists(did, dstname, lapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lcreate_hard: " + err); } assertTrue("TestH5O._createHardLink ", link_exists); } private final void _createSoftLink(int fid, String curname, int did, String dstname, int lcpl, int lapl) { boolean link_exists = false; try { H5.H5Lcreate_soft(curname, did, dstname, lcpl, lapl); H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_LOCAL); link_exists = H5.H5Lexists(did, dstname, lapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lcreate_soft: " + err); } assertTrue("TestH5O._createSoftLink ", link_exists); } private final void _createExternalLink(int fid, String ext_filename, String curname, int did, String dstname, int lcpl, int lapl) { boolean link_exists = false; try { H5.H5Lcreate_external(ext_filename, curname, did, dstname, lcpl, lapl); H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_LOCAL); link_exists = H5.H5Lexists(did, dstname, lapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lcreate_external: " + err); } assertTrue("TestH5O._createExternalLink ", link_exists); } @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fcpl = H5.H5Pcreate(HDF5Constants.H5P_FILE_CREATE); H5.H5Pset_link_creation_order(H5fcpl, HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, H5fcpl, HDF5Constants.H5P_DEFAULT); H5dsid = H5.H5Screate_simple(2, H5dims, null); H5did1 = _createDataset(H5fid, H5dsid, "DS1", HDF5Constants.H5P_DEFAULT); H5gid = _createGroup(H5fid, "/G1"); H5did2 = _createDataset(H5gid, H5dsid, "DS2", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("TestH5O.createH5file: " + err); } assertTrue("TestH5O.createH5file: H5.H5Fcreate: ",H5fid > 0); assertTrue("TestH5O.createH5file: H5.H5Screate_simple: ",H5dsid > 0); assertTrue("TestH5O.createH5file: H5.H5Gcreate: ",H5gid > 0); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5gid > 0) try {H5.H5Gclose(H5gid);} catch (Exception ex) {} if (H5gcpl > 0) try {H5.H5Pclose(H5gcpl);} catch (Exception ex) {} if (H5did2 > 0) try {H5.H5Dclose(H5did2);} catch (Exception ex) {} if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5did1 > 0) try {H5.H5Dclose(H5did1);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} if (H5fcpl > 0) try {H5.H5Pclose(H5fcpl);} catch (Exception ex) {} _deleteFile(H5_FILE); } @Test(expected = HDF5LibraryException.class) public void testH5Ocopy_cur_not_exists() throws Throwable { H5.H5Ocopy(H5fid, "None", H5fid, "DS1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Ocopy() { try { H5.H5Ocopy(H5fid, "DS1", H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "CPY1", HDF5Constants.H5P_DEFAULT); assertTrue("testH5Ocopy:H5Lexists ",link_exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ocopy: " + err); } } @Test(expected = HDF5LibraryException.class) public void testH5Ocopy_dst_link_exists() throws Throwable { _createHardLink(H5fid, H5fid, "/G1/DS2", H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Ocopy(H5fid, "CPY1", H5fid, "/G1/DS2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Oget_info_by_idx_n0_create() { H5O_info_t obj_info = null; try { int order = H5.H5Pget_link_creation_order(H5fcpl); assertTrue("creation order :"+order, order == HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info_by_idx_n0:H5Pget_link_creation_order " + err); } try { obj_info = H5.H5Oget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info_by_idx: " + err); } assertFalse("H5Oget_info_by_idx ", obj_info==null); assertTrue("H5Oget_info_by_idx link type", obj_info.type==HDF5Constants.H5O_TYPE_DATASET); } @Test public void testH5Oget_info_by_idx_n1_create() { H5O_info_t obj_info = null; try { int order = H5.H5Pget_link_creation_order(H5fcpl); assertTrue("creation order :"+order, order == HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info_by_idx_n1:H5Pget_link_creation_order " + err); } try { obj_info = H5.H5Oget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 1, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info_by_idx: " + err); } assertFalse("H5Oget_info_by_idx ", obj_info==null); assertTrue("H5Oget_info_by_idx link type", obj_info.type==HDF5Constants.H5O_TYPE_GROUP); } @Test public void testH5Oget_info_softlink() { H5O_info_t obj_info = null; _createSoftLink(H5fid, "/G1/DS2", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { obj_info = H5.H5Oget_info_by_name(H5fid, "L1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ", obj_info==null); assertTrue("H5Oget_info link type", obj_info.type==HDF5Constants.H5O_TYPE_DATASET); assertTrue("Link Address ", obj_info.addr>0); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_softlink_dangle() throws Throwable { _createSoftLink(H5fid, "DS3", H5fid, "L2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Oget_info_by_name(H5fid, "L2", HDF5Constants.H5P_DEFAULT); } @Test public void testH5Oget_info_externallink() { H5O_info_t obj_info = null; _createExternalLink(H5fid, H5_EXTFILE, "DT1", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { obj_info = H5.H5Oget_info_by_name(H5fid, "L1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ", obj_info==null); assertTrue("H5Oget_info link type", obj_info.type==HDF5Constants.H5O_TYPE_NAMED_DATATYPE); assertTrue("Link Address ", obj_info.addr>0); } @Test public void testH5Olink() { int oid = -1; H5O_info_t obj_info = null; H5O_info_t dst_obj_info = null; try { oid = H5.H5Oopen(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); obj_info = H5.H5Oget_info(oid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } try { H5.H5Olink(oid, H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Olink: " + err); } try {H5.H5Oclose(oid);} catch (Exception ex) {} assertFalse("H5Oget_info ", obj_info==null); assertTrue("H5Oget_info object type", obj_info.type==HDF5Constants.H5O_TYPE_DATASET); try { dst_obj_info = H5.H5Oget_info_by_name(H5fid, "CPY1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info_by_name: " + err); } assertFalse("H5Oget_info ", dst_obj_info==null); assertTrue("H5Oget_info object type", dst_obj_info.type==HDF5Constants.H5O_TYPE_DATASET); } @Test public void testH5Ovisit_create() { try { int order = H5.H5Pget_link_creation_order(H5fcpl); assertTrue("creation order :"+order, order == HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ovisit_create:H5Pget_link_creation_order " + err); } _createHardLink(H5fid, H5fid, "/G1/DS2", H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); _createExternalLink(H5fid, H5_EXTFILE, "DT1", H5fid, "LE", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); _createSoftLink(H5fid, "/G1/DS2", H5fid, "LS", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); class idata { public String link_name = null; public int link_type = -1; idata(String name, int type) { this.link_name = name; this.link_type = type; } } class H5O_iter_data implements H5O_iterate_t { public ArrayList iterdata = new ArrayList(); } H5O_iterate_t iter_data = new H5O_iter_data(); class H5O_iter_callback implements H5O_iterate_cb { public int callback(int group, String name, H5O_info_t info, H5O_iterate_t op_data) { idata id = new idata(name, info.type); ((H5O_iter_data)op_data).iterdata.add(id); return 0; } } H5O_iterate_cb iter_cb = new H5O_iter_callback(); try { H5.H5Ovisit(H5fid, HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, iter_cb, iter_data); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ovisit: " + err); } assertFalse("H5Ovisit ", ((H5O_iter_data)iter_data).iterdata.isEmpty()); assertTrue("H5Ovisit "+((H5O_iter_data)iter_data).iterdata.size(), ((H5O_iter_data)iter_data).iterdata.size()==4); assertTrue("H5Ovisit "+((idata)((H5O_iter_data)iter_data).iterdata.get(0)).link_name, ((idata)((H5O_iter_data)iter_data).iterdata.get(0)).link_name.compareToIgnoreCase(".")==0); assertTrue("H5Ovisit "+((idata)((H5O_iter_data)iter_data).iterdata.get(1)).link_name, ((idata)((H5O_iter_data)iter_data).iterdata.get(1)).link_name.compareToIgnoreCase("DS1")==0); assertTrue("H5Ovisit "+((idata)((H5O_iter_data)iter_data).iterdata.get(2)).link_name, ((idata)((H5O_iter_data)iter_data).iterdata.get(2)).link_name.compareToIgnoreCase("G1")==0); assertTrue("H5Ovisit "+((idata)((H5O_iter_data)iter_data).iterdata.get(3)).link_name, ((idata)((H5O_iter_data)iter_data).iterdata.get(3)).link_name.compareToIgnoreCase("G1/DS2")==0); } @Test public void testH5Ocomment() { int oid = -1; String obj_comment = null; try { oid = H5.H5Oopen(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); H5.H5Oset_comment(oid, "Test Comment"); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oset_comment: " + err); } try { obj_comment = H5.H5Oget_comment(oid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_comment: " + err); } try {H5.H5Oclose(oid);} catch (Exception ex) {} assertFalse("H5Oget_comment: ", obj_comment==null); assertTrue("H5Oget_comment: ", obj_comment.compareTo("Test Comment")==0); } @Test public void testH5Ocomment_clear() { int oid = -1; String obj_comment = null; try { oid = H5.H5Oopen(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); H5.H5Oset_comment(oid, "Test Comment"); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oset_comment: " + err); } try { obj_comment = H5.H5Oget_comment(oid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_comment: " + err); } assertFalse("H5Oget_comment: ", obj_comment==null); assertTrue("H5Oget_comment: ", obj_comment.compareTo("Test Comment")==0); try { H5.H5Oset_comment(oid, null); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oset_comment: " + err); } try { obj_comment = H5.H5Oget_comment(oid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_comment: " + err); } try {H5.H5Oclose(oid);} catch (Exception ex) {} assertTrue("H5Oget_comment: ", obj_comment==null); } @Test public void testH5Ocomment_by_name() { String obj_comment = null; try { H5.H5Oset_comment_by_name(H5fid, "DS1", "Test Comment", HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oset_comment_by_name: " + err); } try { obj_comment = H5.H5Oget_comment_by_name(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_comment_by_name: " + err); } assertFalse("H5Oget_comment_by_name: ", obj_comment==null); assertTrue("H5Oget_comment_by_name: ", obj_comment.compareTo("Test Comment")==0); } @Test public void testH5Ocomment_by_name_clear() { String obj_comment = null; try { H5.H5Oset_comment_by_name(H5fid, "DS1", "Test Comment", HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oset_comment_by_name: " + err); } try { obj_comment = H5.H5Oget_comment_by_name(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_comment_by_name: " + err); } assertFalse("H5Oget_comment_by_name: ", obj_comment==null); assertTrue("H5Oget_comment_by_name: ", obj_comment.compareTo("Test Comment")==0); try { H5.H5Oset_comment_by_name(H5fid, "DS1", null, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oset_comment_by_name: " + err); } try { obj_comment = H5.H5Oget_comment_by_name(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_comment_by_name: " + err); } assertTrue("H5Oget_comment_by_name: ", obj_comment==null); } } jhdf-2.9/test/hdf5lib/TestH5Lparams.java0000644000175000017500000001542512050301057020754 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertTrue; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.Before; import org.junit.Test; public class TestH5Lparams { @Before public void checkOpenIDs() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_val_invalid() throws Throwable { H5.H5Lget_val(-1, "Bogus", null, -1); } @Test(expected = NullPointerException.class) public void testH5Lget_val_null() throws Throwable { H5.H5Lget_val(-1, null, null, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lexists_invalid() throws Throwable { H5.H5Lexists(-1, "Bogus", -1); } @Test(expected = NullPointerException.class) public void testH5Lexists_null() throws Throwable { H5.H5Lexists(-1, null, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_info_invalid() throws Throwable { H5.H5Lget_info(-1, "Bogus", -1); } @Test(expected = NullPointerException.class) public void testH5Lget_info_null() throws Throwable { H5.H5Lget_info(-1, null, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_info_by_idx_invalid() throws Throwable { H5.H5Lget_info_by_idx(-1, "Bogus", -1, -1, -1L, -1); } @Test(expected = NullPointerException.class) public void testH5Lget_info_by_idx_null() throws Throwable { H5.H5Lget_info_by_idx(-1, null, 0, 0, 0L, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_name_by_idx_invalid() throws Throwable { H5.H5Lget_name_by_idx(-1, "Bogus", -1, -1, -1L, -1); } @Test(expected = NullPointerException.class) public void testH5Lget_name_by_idx_null() throws Throwable { H5.H5Lget_name_by_idx(-1, null, 0, 0, 0L, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lcreate_hard_invalid() throws Throwable { H5.H5Lcreate_hard(-1, "Bogus", -1, "Bogus", -1, -1); } @Test(expected = NullPointerException.class) public void testH5Lcreate_hard_null_current() throws Throwable { H5.H5Lcreate_hard(-1, null, 0, "Bogus", 0, 0); } @Test(expected = NullPointerException.class) public void testH5Lcreate_hard_null_dest() throws Throwable { H5.H5Lcreate_hard(-1, "Bogus", 0, null, 0, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Ldelete_invalid() throws Throwable { H5.H5Ldelete(-1, "Bogus", -1); } @Test(expected = NullPointerException.class) public void testH5Ldelete_null() throws Throwable { H5.H5Ldelete(-1, null, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lcreate_soft_invalid() throws Throwable { H5.H5Lcreate_soft( "Bogus", -1, "Bogus", -1, -1); } @Test(expected = NullPointerException.class) public void testH5Lcreate_soft_null_current() throws Throwable { H5.H5Lcreate_soft(null, 0, "Bogus", 0, 0); } @Test(expected = NullPointerException.class) public void testH5Lcreate_soft_null_dest() throws Throwable { H5.H5Lcreate_soft("Bogus", 0, null, 0, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lcreate_external_invalid() throws Throwable { H5.H5Lcreate_external("PathToFile", "Bogus", -1, "Bogus", -1, -1); } @Test(expected = NullPointerException.class) public void testH5Lcreate_external_null_file() throws Throwable { H5.H5Lcreate_external(null, "Bogus", 0, "Bogus", 0, 0); } @Test(expected = NullPointerException.class) public void testH5Lcreate_external_null_current() throws Throwable { H5.H5Lcreate_external("PathToFile", null, 0, "Bogus", 0, 0); } @Test(expected = NullPointerException.class) public void testH5Lcreate_external_null_dest() throws Throwable { H5.H5Lcreate_external("PathToFile", "Bogus", 0, null, 0, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lcopy_invalid() throws Throwable { H5.H5Lcopy(-1, "Bogus", -1, "Bogus", -1, -1); } @Test(expected = NullPointerException.class) public void testH5Lcopy_null_current() throws Throwable { H5.H5Lcopy(-1, null, 0, "Bogus", 0, 0); } @Test(expected = NullPointerException.class) public void testH5Lcopy_null_dest() throws Throwable { H5.H5Lcopy(-1, "Bogus", 0, null, 0, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lmove_invalid() throws Throwable { H5.H5Lmove(-1, "Bogus", -1, "Bogus", -1, -1); } @Test(expected = NullPointerException.class) public void testH5Lmove_null_current() throws Throwable { H5.H5Lmove(-1, null, 0, "Bogus", 0, 0); } @Test(expected = NullPointerException.class) public void testH5Lmove_null_dest() throws Throwable { H5.H5Lmove(-1, "Bogus", 0, null, 0, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_val_by_idx_invalid() throws Throwable { H5.H5Lget_val_by_idx(-1, "Bogus", -1, -1, -1L, null, -1); } @Test(expected = NullPointerException.class) public void testH5Lget_val_by_idx_null() throws Throwable { H5.H5Lget_val_by_idx(-1, null, 0, 0, 0L, null, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Ldelete_by_idx_invalid() throws Throwable { H5.H5Ldelete_by_idx(-1, "Bogus", -1, -1, -1L, -1); } @Test(expected = NullPointerException.class) public void testH5Ldelete_by_idx_null() throws Throwable { H5.H5Ldelete_by_idx(-1, null, 0, 0, 0L, 0); } @Test(expected = NullPointerException.class) public void testH5Lvisit_null() throws Throwable { H5.H5Lvisit(-1, -1, -1, null, null); } @Test(expected = NullPointerException.class) public void testH5Lvisit_by_name_nullname() throws Throwable { H5.H5Lvisit_by_name(-1, null, -1, -1, null, null, -1); } @Test(expected = NullPointerException.class) public void testH5Lvisit_by_name_null() throws Throwable { H5.H5Lvisit_by_name(-1, "Bogus", -1, -1, null, null, -1); } @Test(expected = NullPointerException.class) public void testH5Literate_null() throws Throwable { H5.H5Literate(-1, -1, -1, -1, null, null); } @Test(expected = NullPointerException.class) public void testH5Literate_by_name_nullname() throws Throwable { H5.H5Literate_by_name(-1, null, -1, -1, -1, null, null, -1); } @Test(expected = NullPointerException.class) public void testH5Literate_by_name_null() throws Throwable { H5.H5Literate_by_name(-1, "Bogus", -1, -1, -1, null, null, -1); } } jhdf-2.9/test/hdf5lib/TestH5Pfapl.java0000644000175000017500000015201512050301057020414 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.text.DecimalFormat; import java.text.NumberFormat; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5AC_cache_config_t; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Pfapl { private static final String H5_FILE = "test.h5"; private static final String H5_LOG_FILE = "test.log"; private static final String H5_FAMILY_FILE = "test%05d"; private static final String H5_MULTI_FILE = "testmulti"; private static char MULTI_LETTERS[] = {'X','s','b','r','g','l','o'}; private static final int DIM_X = 4; private static final int DIM_Y = 6; private static final int DIMF_X = 12; private static final int DIMF_Y = 18; int H5fid = -1; int H5dsid = -1; int H5did = -1; int H5Fdsid = -1; int H5Fdid = -1; long[] H5dims = { DIM_X, DIM_Y }; int fapl_id = -1; int plapl_id = -1; int dapl_id = -1; int multi_dxplid = -1; int plist_id = -1; int btplist_id = -1; long[] H5Fdims = { DIMF_X, DIMF_Y }; double windchillF[][] = {{36.0, 31.0, 25.0, 19.0, 13.0, 7.0, 1.0, -5.0, -11.0, -16.0, -22.0, -28.0, -34.0, -40.0, -46.0, -52.0, -57.0, -63.0}, {34.0, 27.0, 21.0, 15.0, 9.0, 3.0, -4.0, -10.0, -16.0, -22.0, -28.0, -35.0, -41.0, -47.0, -53.0, -59.0, -66.0, -72.0}, {32.0, 25.0, 19.0, 13.0, 6.0, 0.0, -7.0, -13.0, -19.0, -26.0, -32.0, -39.0, -45.0, -51.0, -58.0, -64.0, -71.0, -77.0}, {30.0, 24.0, 17.0, 11.0, 4.0, -2.0, -9.0, -15.0, -22.0, -29.0, -35.0, -42.0, -48.0, -55.0, -61.0, -68.0, -74.0, -81.0}, {29.0, 23.0, 16.0, 9.0, 3.0, -4.0, -11.0, -17.0, -24.0, -31.0, -37.0, -44.0, -51.0, -58.0, -64.0, -71.0, -78.0, -84.0}, {28.0, 22.0, 15.0, 8.0, 1.0, -5.0, -12.0, -19.0, -26.0, -33.0, -39.0, -46.0, -53.0, -60.0, -67.0, -73.0, -80.0, -87.0}, {28.0, 21.0, 14.0, 7.0, 0.0, -7.0, -14.0, -21.0, -27.0, -34.0, -41.0, -48.0, -55.0, -62.0, -69.0, -76.0, -82.0, -89.0}, {27.0, 20.0, 13.0, 6.0, -1.0, -8.0, -15.0, -22.0, -29.0, -36.0, -43.0, -50.0, -57.0, -64.0, -71.0, -78.0, -84.0, -91.0}, {26.0, 19.0, 12.0, 5.0, -2.0, -9.0, -16.0, -23.0, -30.0, -37.0, -44.0, -51.0, -58.0, -65.0, -72.0, -79.0, -86.0, -93.0}, {26.0, 19.0, 12.0, 4.0, -3.0, -10.0, -17.0, -24.0, -31.0, -38.0, -45.0, -52.0, -60.0, -67.0, -74.0, -81.0, -88.0, -95.0}, {25.0, 18.0, 11.0, 4.0, -3.0, -11.0, -18.0, -25.0, -32.0, -39.0, -46.0, -54.0, -61.0, -68.0, -75.0, -82.0, -89.0, -97.0}, {25.0, 17.0, 10.0, 3.0, -4.0, -11.0, -19.0, -26.0, -33.0, -40.0, -48.0, -55.0, -62.0, -69.0, -76.0, -84.0, -91.0, -98.0} }; private final void _deleteFile(String filename) { File file = null; try { file = new File(filename); } catch (Throwable err) {} if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } private final void _deleteLogFile() { File file = null; try { file = new File(H5_LOG_FILE); } catch (Throwable err) {} if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } private final void _deleteFamilyFile() { File file = null; for(int indx = 0; ;indx++) { java.text.DecimalFormat myFormat = new java.text.DecimalFormat("00000"); try { file = new File("test"+myFormat.format(new Integer(indx))+".h5"); } catch (Throwable err) {} if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } else return; } } private final void _deleteMultiFile() { File file = null; for(int indx = 1;indx<7;indx++) { try { file = new File(H5_MULTI_FILE+"-"+MULTI_LETTERS[indx]+".h5"); } catch (Throwable err) {} if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } } private final int _createDataset(int fid, int dsid, String name, int dapl) { int did = -1; try { did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D._createDataset: ", did > 0); return did; } private final void _createFloatDataset() { try { H5Fdsid = H5.H5Screate_simple(2, H5Fdims, null); H5Fdid = H5.H5Dcreate(H5fid, "dsfloat", HDF5Constants.H5T_NATIVE_FLOAT, H5Fdsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D._createFloatDataset: ", H5Fdid > 0); try { H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); } } private final void _createH5multiFileDS() { try { H5did = _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } assertTrue("TestH5D.createH5file: _createDataset: ", H5did > 0); try { H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); } } private final void _createH5File(int fapl) { try { H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, fapl); H5dsid = H5.H5Screate_simple(2, H5dims, null); H5did = _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } assertTrue("TestH5D.createH5file: H5.H5Fcreate: ", H5fid > 0); assertTrue("TestH5D.createH5file: H5.H5Screate_simple: ", H5dsid > 0); assertTrue("TestH5D.createH5file: _createDataset: ", H5did > 0); try { H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); } } private final void _createH5familyFile(int fapl) { try { H5fid = H5.H5Fcreate(H5_FAMILY_FILE+".h5", HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, fapl); H5dsid = H5.H5Screate_simple(2, H5dims, null); H5did = _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } assertTrue("TestH5D.createH5file: H5.H5Fcreate: ", H5fid > 0); assertTrue("TestH5D.createH5file: H5.H5Screate_simple: ", H5dsid > 0); assertTrue("TestH5D.createH5file: _createDataset: ", H5did > 0); try { H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); } } private final void _createH5multiFile(int fapl) { try { H5fid = H5.H5Fcreate(H5_MULTI_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, fapl); H5dsid = H5.H5Screate_simple(2, H5dims, null); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } assertTrue("TestH5D.createH5file: H5.H5Fcreate: ", H5fid > 0); assertTrue("TestH5D.createH5file: H5.H5Screate_simple: ", H5dsid > 0); try { H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); } } public void deleteH5file() { _deleteFile(H5_FILE); } public void deleteH5familyfile() { _deleteFamilyFile(); } public void deleteH5multifile() { _deleteMultiFile(); } @Before public void createFileAccess() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { fapl_id = H5.H5Pcreate(HDF5Constants.H5P_FILE_ACCESS); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createFileAccess: " + err); } assertTrue(fapl_id > 0); try { plapl_id = H5.H5Pcreate(HDF5Constants.H5P_LINK_ACCESS); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createFileAccess: " + err); } assertTrue(plapl_id > 0); try { multi_dxplid = H5.H5Pcreate(HDF5Constants.H5P_DATASET_XFER); plist_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_XFER); btplist_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_XFER); dapl_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_ACCESS); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createFileAccess: " + err); } assertTrue(multi_dxplid > 0); assertTrue(plist_id > 0); assertTrue(btplist_id > 0); assertTrue(dapl_id > 0); } @After public void deleteFileAccess() throws HDF5LibraryException { if (fapl_id > 0) try {H5.H5Pclose(fapl_id);} catch (Exception ex) {} if (plapl_id > 0) try {H5.H5Pclose(plapl_id);} catch (Exception ex) {} if (dapl_id > 0) try {H5.H5Pclose(dapl_id);} catch (Exception ex) {} if (plist_id > 0) try {H5.H5Pclose(plist_id);} catch (Exception ex) {} if (btplist_id > 0) try {H5.H5Pclose(btplist_id);} catch (Exception ex) {} if (multi_dxplid > 0) try {H5.H5Pclose(multi_dxplid);} catch (Exception ex) {} if (H5Fdsid > 0) try {H5.H5Sclose(H5Fdsid);} catch (Exception ex) {} if (H5Fdid > 0) try {H5.H5Dclose(H5Fdid);} catch (Exception ex) {} if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5did > 0) try {H5.H5Dclose(H5did);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } @Test public void testH5Pget_libver_bounds() { int ret_val = -1; int[] libver = new int[2]; try { ret_val = H5.H5Pget_libver_bounds(fapl_id, libver); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_libver_bounds: " + err); } assertTrue("testH5Pget_libver_bounds", ret_val >= 0); // Check the Earliest Version if the library assertEquals(HDF5Constants.H5F_LIBVER_EARLIEST, libver[0]); // Check the Latest Version if the library assertEquals(HDF5Constants.H5F_LIBVER_LATEST, libver[1]); } @Test public void testH5Pset_libver_bounds() { int ret_val = -1; int low = HDF5Constants.H5F_LIBVER_EARLIEST; int high = HDF5Constants.H5F_LIBVER_LATEST; int[] libver = new int[2]; try { ret_val = H5.H5Pset_libver_bounds(fapl_id, low, high); H5.H5Pget_libver_bounds(fapl_id, libver); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_libver_bounds: " + err); } assertTrue("testH5Pset_libver_bounds", ret_val >= 0); // Check the Earliest Version if the library assertEquals(HDF5Constants.H5F_LIBVER_EARLIEST, libver[0]); // Check the Latest Version if the library assertEquals(HDF5Constants.H5F_LIBVER_LATEST, libver[1]); } @Test(expected = HDF5LibraryException.class) public void testH5Pset_elink_fapl_NegativeID() throws Throwable { H5.H5Pset_elink_fapl(-1, fapl_id ); } @Test public void testH5Pset_elink_fapl() { int ret_val = -1; try { ret_val = H5.H5Pset_elink_fapl(plapl_id, fapl_id ); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_elink_fapl: " + err); } assertTrue("H5Pset_elink_fapl", ret_val >= 0); } @Test public void testH5Pget_elink_fapl() { int ret_val_id = -1; try { ret_val_id = H5.H5Pget_elink_fapl(plapl_id); assertTrue("H5Pget_elink_fapl", ret_val_id >= 0); assertEquals(HDF5Constants.H5P_DEFAULT, ret_val_id ); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_elink_fapl: " + err); } finally { if (ret_val_id > 0) try {H5.H5Pclose(ret_val_id);} catch (Exception ex) {} } } @Test public void testH5P_elink_fapl() { int ret_val_id = -1; try { H5.H5Pset_elink_fapl(plapl_id, fapl_id ); ret_val_id = H5.H5Pget_elink_fapl(plapl_id); assertTrue("H5P_elink_fapl", ret_val_id >= 0); } catch (Throwable err) { err.printStackTrace(); fail("H5P_elink_fapl: " + err); } finally { if (ret_val_id > 0) try {H5.H5Pclose(ret_val_id);} catch (Exception ex) {} } } @Test public void testH5P_elink_file_cache_size() { int elink_fapl_id = -1; int efc_size = 0; try { H5.H5Pset_elink_fapl(plapl_id, fapl_id ); elink_fapl_id = H5.H5Pget_elink_fapl(plapl_id); assertTrue("H5P_elink_file_cache_size", elink_fapl_id >= 0); try { efc_size = H5.H5Pget_elink_file_cache_size(elink_fapl_id); assertTrue("H5P_elink_file_cache_size default", efc_size == 0); } catch (UnsupportedOperationException err) { System.out.println(err.getMessage()); } try { efc_size = 8; H5.H5Pset_elink_file_cache_size(elink_fapl_id, efc_size); efc_size = H5.H5Pget_elink_file_cache_size(elink_fapl_id); assertTrue("H5P_elink_file_cache_size 8", efc_size == 8); } catch (UnsupportedOperationException err) { System.out.println(err.getMessage()); } } catch (Throwable err) { err.printStackTrace(); fail("H5P_elink_file_cache_size: " + err); } finally { if (elink_fapl_id > 0) try {H5.H5Pclose(elink_fapl_id);} catch (Exception ex) {} } } @Test public void testH5P_btree_ratios() { double[] left = {0.1}; double[] middle = {0.5}; double[] right = {0.7}; try { H5.H5Pset_btree_ratios(plist_id, left[0], middle[0], right[0]); H5.H5Pget_btree_ratios(plist_id, left, middle, right); assertTrue("H5P_btree_ratios", left[0] == 0.1); } catch (Throwable err) { err.printStackTrace(); fail("H5P_btree_ratios: " + err); } } @Test public void testH5P_edc_check() { int ret_val_id = -1; try { ret_val_id = H5.H5Pget_edc_check(plist_id); assertTrue("H5P_edc_check", ret_val_id == HDF5Constants.H5Z_ENABLE_EDC); H5.H5Pset_edc_check(plist_id, HDF5Constants.H5Z_DISABLE_EDC); ret_val_id = H5.H5Pget_edc_check(plist_id); assertTrue("H5P_edc_check", ret_val_id == HDF5Constants.H5Z_DISABLE_EDC); } catch (Throwable err) { err.printStackTrace(); fail("H5P_edc_check: " + err); } } @Test public void testH5P_fclose_degree() { int ret_val_id = -1; try { ret_val_id = H5.H5Pget_fclose_degree(fapl_id); assertTrue("H5Pget_fclose_degree default", ret_val_id == HDF5Constants.H5F_CLOSE_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5P_fclose_degree: default " + err); } try { H5.H5Pset_fclose_degree(fapl_id, HDF5Constants.H5F_CLOSE_STRONG); ret_val_id = H5.H5Pget_fclose_degree(fapl_id); assertTrue("H5Pget_fclose_degree", ret_val_id == HDF5Constants.H5F_CLOSE_STRONG); } catch (Throwable err) { err.printStackTrace(); fail("H5P_fclose_degree: H5F_CLOSE_STRONG " + err); } try { H5.H5Pset_fclose_degree(fapl_id, HDF5Constants.H5F_CLOSE_SEMI); ret_val_id = H5.H5Pget_fclose_degree(fapl_id); assertTrue("H5Pget_fclose_degree", ret_val_id == HDF5Constants.H5F_CLOSE_SEMI); } catch (Throwable err) { err.printStackTrace(); fail("H5P_fclose_degree: H5F_CLOSE_SEMI " + err); } } @Test public void testH5P_alignment() { long[] align = {0,0}; try { H5.H5Pget_alignment(fapl_id, align); assertTrue("H5P_alignment threshold default", align[0] == 1); assertTrue("H5P_alignment alignment default", align[1] == 1); } catch (Throwable err) { err.printStackTrace(); fail("H5P_alignment: default " + err); } try { align[0] = 1024; align[1] = 2048; H5.H5Pset_alignment(fapl_id, align[0], align[1]); H5.H5Pget_alignment(fapl_id, align); assertTrue("H5P_alignment threshold", align[0] == 1024); assertTrue("H5P_alignment alignment", align[1] == 2048); } catch (Throwable err) { err.printStackTrace(); fail("H5P_alignment: " + err); } } @Test public void testH5P_meta_block_size() { long meta_size = 0; try { meta_size = H5.H5Pget_meta_block_size(fapl_id); assertTrue("H5P_meta_block_size default", meta_size == 2048); } catch (Throwable err) { err.printStackTrace(); fail("H5P_meta_block_size: default " + err); } try { meta_size = 4096; H5.H5Pset_meta_block_size(fapl_id, meta_size); meta_size = H5.H5Pget_meta_block_size(fapl_id); assertTrue("H5P_meta_block_size 4096", meta_size == 4096); } catch (Throwable err) { err.printStackTrace(); fail("H5P_meta_block_size: " + err); } } @Test public void testH5P_small_data_block_size() { long[] align = {0}; try { H5.H5Pget_small_data_block_size(fapl_id, align); assertTrue("H5P_small_data_block_size default", align[0] == 2048); } catch (Throwable err) { err.printStackTrace(); fail("H5P_small_data_block_size: default " + err); } try { align[0] = 4096; H5.H5Pset_small_data_block_size(fapl_id, align[0]); H5.H5Pget_small_data_block_size(fapl_id, align); assertTrue("H5P_small_data_block_size 4096", align[0] == 4096); } catch (Throwable err) { err.printStackTrace(); fail("H5P_small_data_block_size: " + err); } } @Test public void testH5P_hyper_vector_size() { long[] align = {0}; try { H5.H5Pget_hyper_vector_size(plist_id, align); assertTrue("H5P_hyper_vector_size default", align[0] == 1024); } catch (Throwable err) { err.printStackTrace(); fail("H5P_hyper_vector_size: default " + err); } try { align[0] = 4096; H5.H5Pset_hyper_vector_size(plist_id, align[0]); H5.H5Pget_hyper_vector_size(plist_id, align); assertTrue("H5P_hyper_vector_size 4096", align[0] == 4096); } catch (Throwable err) { err.printStackTrace(); fail("H5P_hyper_vector_size: " + err); } } @Test public void testH5P_cache() { long[] rdcc_nelmts = {0}; long[] rdcc_nbytes = {0}; double[] rdcc_w0 = {0}; try { H5.H5Pget_cache(fapl_id, null, rdcc_nelmts, rdcc_nbytes, rdcc_w0); assertTrue("H5P_cache default", rdcc_nelmts[0] == 521); assertTrue("H5P_cache default", rdcc_nbytes[0] == (1024*1024)); assertTrue("H5P_cache default", rdcc_w0[0] == 0.75); } catch (Throwable err) { err.printStackTrace(); fail("H5P_cache: default " + err); } try { rdcc_nelmts[0] = 4096; H5.H5Pset_cache(fapl_id, 0, rdcc_nelmts[0], rdcc_nbytes[0], rdcc_w0[0]); H5.H5Pget_cache(fapl_id, null, rdcc_nelmts, rdcc_nbytes, rdcc_w0); assertTrue("H5P_cache 4096", rdcc_nelmts[0] == 4096); } catch (Throwable err) { err.printStackTrace(); fail("H5P_cache: " + err); } } @Test public void testH5P_chunk_cache() { long[] rdcc_nslots = {0}; long[] rdcc_nbytes = {0}; double[] rdcc_w0 = {0}; try { H5.H5Pget_chunk_cache(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0); assertTrue("H5P_chunk_cache default", rdcc_nslots[0] == 521); assertTrue("H5P_chunk_cache default", rdcc_nbytes[0] == (1024*1024)); assertTrue("H5P_chunk_cache default", rdcc_w0[0] == 0.75); } catch (Throwable err) { err.printStackTrace(); fail("H5P_chunk_cache: default " + err); } try { rdcc_nslots[0] = 4096; H5.H5Pset_chunk_cache(dapl_id, rdcc_nslots[0], rdcc_nbytes[0], rdcc_w0[0]); H5.H5Pget_chunk_cache(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0); assertTrue("H5P_chunk_cache 4096", rdcc_nslots[0] == 4096); } catch (Throwable err) { err.printStackTrace(); fail("H5P_chunk_cache: " + err); } } @Test public void testH5P_sieve_buf_size() { long buf_size = 0; try { buf_size = H5.H5Pget_sieve_buf_size(fapl_id); assertTrue("H5P_sieve_buf_size default", buf_size == (64*1024)); } catch (Throwable err) { err.printStackTrace(); fail("H5P_sieve_buf_size: default " + err); } try { buf_size = 4096; H5.H5Pset_sieve_buf_size(fapl_id, buf_size); buf_size = H5.H5Pget_sieve_buf_size(fapl_id); assertTrue("H5P_sieve_buf_size 4096", buf_size == 4096); } catch (Throwable err) { err.printStackTrace(); fail("H5P_sieve_buf_size: " + err); } } @Test public void testH5P_gc_references() { boolean ret_val_id = false; try { H5.H5Pset_gc_references(fapl_id, true); ret_val_id = H5.H5Pget_gcreferences(fapl_id); assertTrue("H5P_gc_references", ret_val_id); } catch (Throwable err) { err.printStackTrace(); fail("H5P_gc_references: " + err); } } @Test public void testH5Pget_mdc_config() { H5AC_cache_config_t cache_config = null; try { cache_config = H5.H5Pget_mdc_config(fapl_id); assertTrue("H5Pget_mdc_config", cache_config.version==HDF5Constants.H5AC_CURR_CACHE_CONFIG_VERSION); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_mdc_config: " + err); } } @Test public void testH5Pset_mdc_config() { H5AC_cache_config_t cache_config = null; try { cache_config = H5.H5Pget_mdc_config(fapl_id); assertTrue("H5Pset_mdc_config", cache_config.version==HDF5Constants.H5AC_CURR_CACHE_CONFIG_VERSION); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_mdc_config: " + err); } try { cache_config.decr_mode = HDF5Constants.H5C_decr_off; H5.H5Pset_mdc_config(fapl_id, cache_config); cache_config = H5.H5Pget_mdc_config(fapl_id); assertTrue("H5Pset_mdc_config", cache_config.version==HDF5Constants.H5AC_CURR_CACHE_CONFIG_VERSION); assertTrue("H5Pset_mdc_config", cache_config.decr_mode==HDF5Constants.H5C_decr_off); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_mdc_config: " + err); } } @Test public void testH5P_fapl_core() { if (HDF5Constants.H5FD_CORE < 0) return; try { H5.H5Pset_fapl_core(fapl_id, 4096, false); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: core = "+ driver_type, HDF5Constants.H5FD_CORE==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_core: " + err); } try { long[] increment = {-1}; boolean[] backingstore = {true}; H5.H5Pget_fapl_core(fapl_id, increment, backingstore); assertTrue("H5Pget_fapl_core: increment="+increment[0], increment[0]==4096); assertTrue("H5Pget_fapl_core: backingstore="+backingstore[0], !backingstore[0]); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fapl_core: " + err); } } @Test public void testH5P_fapl_family() { if (HDF5Constants.H5FD_FAMILY < 0) return; try { H5.H5Pset_fapl_family(fapl_id, 1024, HDF5Constants.H5P_DEFAULT); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: family = "+ driver_type, HDF5Constants.H5FD_FAMILY==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_family: " + err); } try { long[] member_size = {0}; int[] member_fapl = {-1}; H5.H5Pget_fapl_family(fapl_id, member_size, member_fapl); assertTrue("H5Pget_fapl_family: member_size="+member_size[0], member_size[0]==1024); assertTrue("H5Pget_fapl_family: member_fapl ", H5.H5P_equal(member_fapl[0], HDF5Constants.H5P_FILE_ACCESS_DEFAULT)); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fapl_family: " + err); } _createH5familyFile(fapl_id); deleteH5familyfile(); } @Test public void testH5P_family_offset() { if (HDF5Constants.H5FD_FAMILY < 0) return; try { H5.H5Pset_fapl_family(fapl_id, 1024, HDF5Constants.H5P_DEFAULT); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: family = "+ driver_type, HDF5Constants.H5FD_FAMILY==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_family: " + err); } _createH5familyFile(fapl_id); long family_offset = 512; try { H5.H5Pset_family_offset(fapl_id, family_offset); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fapl_family: " + err); } try { long offset = H5.H5Pget_family_offset(fapl_id); assertTrue("H5Pget_fapl_family: offset="+offset, offset==family_offset); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fapl_family: " + err); } deleteH5familyfile(); } @Test public void testH5Pset_fapl_sec2() { if (HDF5Constants.H5FD_SEC2 < 0) return; try { H5.H5Pset_fapl_sec2(fapl_id); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: sec2 = "+ driver_type, HDF5Constants.H5FD_SEC2==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_sec2: " + err); } _createH5File(fapl_id); deleteH5file(); } @Test public void testH5Pset_fapl_stdio() { if (HDF5Constants.H5FD_STDIO < 0) return; try { H5.H5Pset_fapl_stdio(fapl_id); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: stdio = "+ driver_type, HDF5Constants.H5FD_STDIO==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_stdio: " + err); } _createH5File(fapl_id); deleteH5file(); } @Test public void testH5Pset_fapl_log() { if (HDF5Constants.H5FD_LOG < 0) return; try { long log_flags = HDF5Constants.H5FD_LOG_LOC_IO; H5.H5Pset_fapl_log(fapl_id, H5_LOG_FILE, log_flags, 1024); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: log = "+ driver_type, HDF5Constants.H5FD_LOG==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_log: " + err); } _createH5File(fapl_id); deleteH5file(); _deleteLogFile(); } @Test public void testH5P_fapl_muti_nulls() { if (HDF5Constants.H5FD_MULTI < 0) return; int[] member_map = null; int[] member_fapl = null; String[] member_name = null; long[] member_addr = null; try { H5.H5Pset_fapl_multi(fapl_id, member_map, member_fapl, member_name, member_addr, true); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: muti = "+ driver_type, HDF5Constants.H5FD_MULTI==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_muti: " + err); } try { boolean relax = H5.H5Pget_fapl_multi(fapl_id, member_map, member_fapl, member_name, member_addr); assertTrue("H5Pget_fapl_muti: relax ", relax); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fapl_muti: " + err); } _createH5multiFile(fapl_id); deleteH5multifile(); } @Test public void testH5P_fapl_muti_defaults() { if (HDF5Constants.H5FD_MULTI < 0) return; long HADDRMAX = HDF5Constants.H5FD_DEFAULT_HADDR_SIZE; int[] member_map = null; int[] member_fapl = null; String[] member_name = null; long[] member_addr = null; try { H5.H5Pset_fapl_multi(fapl_id, member_map, member_fapl, member_name, member_addr, true); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: muti = "+ driver_type, HDF5Constants.H5FD_MULTI==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_muti: " + err); } try { member_map = new int[HDF5Constants.H5FD_MEM_NTYPES]; member_fapl = new int[HDF5Constants.H5FD_MEM_NTYPES]; member_name = new String[HDF5Constants.H5FD_MEM_NTYPES]; member_addr = new long[HDF5Constants.H5FD_MEM_NTYPES]; boolean relax = H5.H5Pget_fapl_multi(fapl_id, member_map, member_fapl, member_name, member_addr); assertTrue("H5Pget_fapl_muti: relax ", relax); assertTrue("H5Pget_fapl_muti: member_map="+member_map[HDF5Constants.H5FD_MEM_DEFAULT], member_map[HDF5Constants.H5FD_MEM_DEFAULT] == HDF5Constants.H5FD_MEM_DEFAULT); assertTrue("H5Pget_fapl_muti: member_fapl ", H5.H5P_equal(member_fapl[HDF5Constants.H5FD_MEM_DEFAULT], HDF5Constants.H5P_FILE_ACCESS_DEFAULT)); assertTrue("H5Pget_fapl_muti: member_name="+member_name[HDF5Constants.H5FD_MEM_DEFAULT], member_name[HDF5Constants.H5FD_MEM_DEFAULT].compareTo("%s-X.h5")==0); assertTrue("H5Pget_fapl_muti: member_name="+member_name[HDF5Constants.H5FD_MEM_SUPER], member_name[HDF5Constants.H5FD_MEM_SUPER].compareTo("%s-s.h5")==0); assertTrue("H5Pget_fapl_muti: member_name="+member_name[HDF5Constants.H5FD_MEM_BTREE], member_name[HDF5Constants.H5FD_MEM_BTREE].compareTo("%s-b.h5")==0); assertTrue("H5Pget_fapl_muti: member_name="+member_name[HDF5Constants.H5FD_MEM_DRAW], member_name[HDF5Constants.H5FD_MEM_DRAW].compareTo("%s-r.h5")==0); assertTrue("H5Pget_fapl_muti: member_addr="+member_addr[HDF5Constants.H5FD_MEM_DEFAULT], member_addr[HDF5Constants.H5FD_MEM_DEFAULT] == 0); assertTrue("H5Pget_fapl_muti: member_addr="+member_addr[HDF5Constants.H5FD_MEM_SUPER], member_addr[HDF5Constants.H5FD_MEM_SUPER] == 0); assertTrue("H5Pget_fapl_muti: member_addr="+member_addr[HDF5Constants.H5FD_MEM_BTREE]+"<>"+HADDRMAX, member_addr[HDF5Constants.H5FD_MEM_BTREE] == HADDRMAX); assertTrue("H5Pget_fapl_muti: member_addr="+member_addr[HDF5Constants.H5FD_MEM_DRAW], member_addr[HDF5Constants.H5FD_MEM_DRAW] == (HADDRMAX-1)); assertTrue("H5Pget_fapl_muti: member_addr="+member_addr[HDF5Constants.H5FD_MEM_GHEAP], member_addr[HDF5Constants.H5FD_MEM_GHEAP] == (HADDRMAX-1)); assertTrue("H5Pget_fapl_muti: member_addr="+member_addr[HDF5Constants.H5FD_MEM_LHEAP], member_addr[HDF5Constants.H5FD_MEM_LHEAP] == (HADDRMAX-1)); assertTrue("H5Pget_fapl_muti: member_addr="+member_addr[HDF5Constants.H5FD_MEM_OHDR], member_addr[HDF5Constants.H5FD_MEM_OHDR] == (HADDRMAX-2)); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fapl_muti: " + err); } _createH5multiFile(fapl_id); _createH5multiFileDS(); deleteH5multifile(); } @Test public void testH5P_fapl_muti() { if (HDF5Constants.H5FD_MULTI < 0) return; long HADDRMAX = HDF5Constants.H5FD_DEFAULT_HADDR_SIZE; int[] member_map = new int[HDF5Constants.H5FD_MEM_NTYPES]; int[] member_fapl = new int[HDF5Constants.H5FD_MEM_NTYPES]; String[] member_name = new String[HDF5Constants.H5FD_MEM_NTYPES]; long[] member_addr = new long[HDF5Constants.H5FD_MEM_NTYPES]; for(int mt=HDF5Constants.H5FD_MEM_DEFAULT; mt= HADDRMAX/4 || file_size <= HADDRMAX/2); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_muti:H5Fget_filesize " + err); } _createH5multiFileDS(); deleteH5multifile(); File file = new File(H5_MULTI_FILE+"-super.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } file = new File(H5_MULTI_FILE+"-btree.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } file = new File(H5_MULTI_FILE+"-draw.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } file = new File(H5_MULTI_FILE+"-gheap.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } } @Test public void testH5P_fapl_split() { if (HDF5Constants.H5FD_MULTI < 0) return; try { H5.H5Pset_fapl_split(fapl_id, "-meta.h5", HDF5Constants.H5P_DEFAULT, "-raw.h5", HDF5Constants.H5P_DEFAULT); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: split = "+ driver_type, HDF5Constants.H5FD_MULTI==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_split: " + err); } try { int[] member_map = new int[HDF5Constants.H5FD_MEM_NTYPES]; int[] member_fapl = new int[HDF5Constants.H5FD_MEM_NTYPES]; String[] member_name = new String[HDF5Constants.H5FD_MEM_NTYPES]; long[] member_addr = new long[HDF5Constants.H5FD_MEM_NTYPES]; boolean relax = H5.H5Pget_fapl_multi(fapl_id, member_map, member_fapl, member_name, member_addr); assertTrue("H5Pget_fapl_multi: relax ", relax); assertTrue("H5Pget_fapl_multi: member_name="+member_name[HDF5Constants.H5FD_MEM_SUPER], member_name[HDF5Constants.H5FD_MEM_SUPER].compareTo("%s-meta.h5")==0); assertTrue("H5Pget_fapl_multi: member_name="+member_name[HDF5Constants.H5FD_MEM_DRAW], member_name[HDF5Constants.H5FD_MEM_DRAW].compareTo("%s-raw.h5")==0); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fapl_split: " + err); } _createH5multiFile(fapl_id); deleteH5multifile(); File file = new File(H5_MULTI_FILE+"-meta.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } file = new File(H5_MULTI_FILE+"-raw.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } } @Test public void testH5P_fapl_direct() { if (HDF5Constants.H5FD_DIRECT < 0) return; try { H5.H5Pset_fapl_direct(fapl_id, 1024, 4096, 8*4096); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: direct = "+ driver_type, HDF5Constants.H5FD_DIRECT==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_direct: " + err); } try { long[] params = {-1, -1, -1}; H5.H5Pget_fapl_direct(fapl_id, params); assertTrue("H5Pget_fapl_direct: alignment="+params[0], params[0]==1024); assertTrue("H5Pget_fapl_direct: block_size="+params[1], params[1]==4096); assertTrue("H5Pget_fapl_direct: cbuf_size="+params[2], params[2]==8*4096); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fapl_direct: " + err); } _createH5File(fapl_id); deleteH5file(); } @Test public void testH5Pset_fapl_windows() { if (HDF5Constants.H5FD_WINDOWS < 0) return; try { H5.H5Pset_fapl_windows(fapl_id); int driver_type = H5.H5Pget_driver(fapl_id); assertTrue("H5Pget_driver: windows = "+ driver_type, HDF5Constants.H5FD_WINDOWS==driver_type); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_fapl_windows: " + err); } _createH5File(fapl_id); deleteH5file(); } @Test public void testH5Pmulti_transform() { if (HDF5Constants.H5FD_MULTI < 0) return; String f_to_c = "(5/9.0)*(x-32)"; double windchillFread[][] = new double[DIMF_X][DIMF_Y]; double windchillC; NumberFormat formatter = new DecimalFormat("#0.000"); long HADDRMAX = HDF5Constants.H5FD_DEFAULT_HADDR_SIZE; int[] member_map = new int[HDF5Constants.H5FD_MEM_NTYPES]; int[] member_fapl = new int[HDF5Constants.H5FD_MEM_NTYPES]; String[] member_name = new String[HDF5Constants.H5FD_MEM_NTYPES]; long[] member_addr = new long[HDF5Constants.H5FD_MEM_NTYPES]; int[] member_dxpl = new int[HDF5Constants.H5FD_MEM_NTYPES]; try { H5.H5Pset_data_transform(plist_id, f_to_c); H5.H5Pset_btree_ratios(btplist_id, 0.1, 0.5, 0.7); } catch (Throwable err) { err.printStackTrace(); fail("H5Pdata_transform: " + err); } for(int mt=HDF5Constants.H5FD_MEM_DEFAULT; mt= HADDRMAX/4 || file_size <= HADDRMAX/2); _createH5multiFileDS(); _createFloatDataset(); } catch (Throwable err) { err.printStackTrace(); fail("H5Pdata_transform: " + err); } try { H5.H5Dwrite(H5Fdid, HDF5Constants.H5T_NATIVE_DOUBLE, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, member_dxpl[HDF5Constants.H5FD_MEM_DRAW], windchillF); H5.H5Dread(H5Fdid, HDF5Constants.H5T_NATIVE_DOUBLE, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, windchillFread); } catch (Throwable err) { err.printStackTrace(); fail("H5Pdata_transform: " + err); } for(int row = 0; row < DIMF_X; row++) { for(int col = 0; col < DIMF_Y; col++) { windchillC = (5/9.0)*(windchillF[row][col]-32); String Cstr = formatter.format(windchillC); String Fread = formatter.format(windchillFread[row][col]); assertTrue("H5Pdata_transform: <"+row+","+col+">"+Fread+"="+Cstr, Fread.compareTo(Cstr)==0); } } deleteH5multifile(); File file = new File(H5_MULTI_FILE+"-super.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } file = new File(H5_MULTI_FILE+"-btree.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } file = new File(H5_MULTI_FILE+"-draw.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } file = new File(H5_MULTI_FILE+"-gheap.h5"); if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } } } jhdf-2.9/test/hdf5lib/TestH5.java0000644000175000017500000001522712050301057017434 0ustar sylvestresylvestre/** * */ package test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import org.junit.Test; /** * @author xcao * */ public class TestH5 { /** * Test method for {@link ncsa.hdf.hdf5lib.H5#J2C(int)}. */ @Test public void testJ2C() { int H5F_ACC_RDONLY = 0x0000; int H5F_ACC_RDWR = 0x0001; int H5F_ACC_TRUNC = 0x0002; int H5F_ACC_EXCL = 0x0004; int H5F_ACC_DEBUG = 0x0008; int H5F_ACC_CREAT = 0x0010; int H5F_OBJ_FILE = 0x0001; int H5F_OBJ_DATASET = 0x0002; int H5F_OBJ_GROUP = 0x0004; int H5F_OBJ_DATATYPE = 0x0008; int H5F_OBJ_ATTR = 0x0010; int H5F_OBJ_ALL = H5F_OBJ_FILE | H5F_OBJ_DATASET | H5F_OBJ_GROUP | H5F_OBJ_DATATYPE | H5F_OBJ_ATTR; int H5F_OBJ_LOCAL = 0x0020; int definedValues[] = { H5F_ACC_RDONLY, H5F_ACC_RDWR, H5F_ACC_TRUNC, H5F_ACC_EXCL, H5F_ACC_DEBUG, H5F_ACC_CREAT, H5F_OBJ_FILE, H5F_OBJ_DATASET, H5F_OBJ_GROUP, H5F_OBJ_DATATYPE, H5F_OBJ_ATTR, H5F_OBJ_ALL, H5F_OBJ_LOCAL }; int j2cValues[] = { HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5F_ACC_EXCL, HDF5Constants.H5F_ACC_DEBUG, HDF5Constants.H5F_ACC_CREAT, HDF5Constants.H5F_OBJ_FILE, HDF5Constants.H5F_OBJ_DATASET, HDF5Constants.H5F_OBJ_GROUP, HDF5Constants.H5F_OBJ_DATATYPE, HDF5Constants.H5F_OBJ_ATTR, HDF5Constants.H5F_OBJ_ALL, HDF5Constants.H5F_OBJ_LOCAL }; for (int i = 0; i < definedValues.length; i++) { assertEquals(definedValues[i], j2cValues[i]); } assertFalse(H5F_ACC_RDONLY == HDF5Constants.H5F_ACC_RDWR); assertFalse(H5F_OBJ_FILE == HDF5Constants.H5F_OBJ_GROUP); } /** * Test method for {@link ncsa.hdf.hdf5lib.H5#H5error_off()}. */ @Test public void testH5error_off() { try { H5.H5error_off(); } catch (Throwable err) { fail("H5.H5error_off failed: " + err); } } /** * Test method for {@link ncsa.hdf.hdf5lib.H5#H5open()}. */ @Test public void testH5open() { try { H5.H5open(); } catch (Throwable err) { fail("H5.H5open failed: " + err); } } /** * Test method for {@link ncsa.hdf.hdf5lib.H5#H5garbage_collect()}. */ @Test public void testH5garbage_collect() { try { H5.H5garbage_collect(); } catch (Throwable err) { fail("H5.H5garbage_collect failed: " + err); } } /** * Test method for * {@link ncsa.hdf.hdf5lib.H5#H5set_free_list_limits(int, int, int, int, int, int)} * . */ @Test public void testH5set_free_list_limits() { int reg_global_lim = 1; int reg_list_lim = 1; int arr_global_lim = 1; int arr_list_lim = 1; int blk_global_lim = 1; int blk_list_lim = 1; try { H5.H5set_free_list_limits(reg_global_lim, reg_list_lim, arr_global_lim, arr_list_lim, blk_global_lim, blk_list_lim); } catch (Throwable err) { fail("H5.H5set_free_list_limits failed: " + err); } } /** * Test method for {@link ncsa.hdf.hdf5lib.H5#H5get_libversion(int[])}. */ @Test public void testH5get_libversion() { int libversion[] = { 0, 0, 0 }; try { H5.H5get_libversion(libversion); } catch (Throwable err) { fail("H5.H5get_libversion: " + err); } for (int i = 0; i < 3; i++) assertEquals(libversion[i], H5.LIB_VERSION[i]); for (int i = 0; i < 3; i++) assertFalse(libversion[i] == 0); } /** * Test method for * {@link ncsa.hdf.hdf5lib.H5#H5check_version(int, int, int)}. */ @Test public void testH5check_version() { int majnum = 1, minnum = 8, relnum = 10; try { H5.H5check_version(majnum, minnum, relnum); } catch (Throwable err) { fail("H5.H5check_version failed: " + err); } try { H5.H5check_version(-1, 0, 0); } catch (Throwable err) { fail("H5.H5check_version failed: " + err); } } @Test public void testIsSerializable() { H5 test = new H5(); ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oos; try { oos = new ObjectOutputStream(out); oos.writeObject(test); oos.close(); } catch (IOException err) { err.printStackTrace(); fail("ObjectOutputStream failed: " + err); } assertTrue(out.toByteArray().length > 0); } @SuppressWarnings("static-access") @Test public void serializeToDisk() { try { H5 test = new H5(); FileOutputStream fos = new FileOutputStream("temph5.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(test); oos.close(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } try { FileInputStream fis = new FileInputStream("temph5.ser"); ObjectInputStream ois = new ObjectInputStream(fis); H5 test = (ncsa.hdf.hdf5lib.H5) ois.readObject(); ois.close(); assertTrue("H5.LIB_VERSION[0]", test.LIB_VERSION[0]==H5.LIB_VERSION[0]); assertTrue("H5.LIB_VERSION[1]", test.LIB_VERSION[1]==H5.LIB_VERSION[1]); assertTrue("H5.LIB_VERSION[2]", test.LIB_VERSION[2]==H5.LIB_VERSION[2]); // Clean up the file new File("temph5.ser").delete(); } catch (Exception ex) { fail("Exception thrown during test: " + ex.toString()); } } } jhdf-2.9/test/hdf5lib/TestH5Sbasic.java0000644000175000017500000001571212050301057020560 0ustar sylvestresylvestre/** * */ package test.hdf5lib; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class TestH5Sbasic { @Before public void checkOpenIDs() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); } @Test(expected = HDF5LibraryException.class) public void testH5Sclose_invalid() throws Throwable { H5.H5Sclose(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Screate_invalid() throws Throwable { H5.H5Screate(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Sget_simple_extent_type_invalid() throws Throwable { H5.H5Sget_simple_extent_type(-1); } @Test public void testH5Screate_scalar() { int sid = -1; int class_type = -1; try { sid = H5.H5Screate(HDF5Constants.H5S_SCALAR); assertTrue("H5.H5Screate_scalar",sid > 0); class_type = H5.H5Sget_simple_extent_type(sid); assertTrue("H5.H5Screate_scalar: type",class_type == HDF5Constants.H5S_SCALAR); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate: " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Screate_null() { int sid = -1; int class_type = -1; try { sid = H5.H5Screate(HDF5Constants.H5S_NULL); assertTrue("H5.H5Screate_null", sid > 0); class_type = H5.H5Sget_simple_extent_type(sid); assertTrue("H5.H5Screate_null: type", class_type == HDF5Constants.H5S_NULL); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate: " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test(expected = NullPointerException.class) public void testH5Screate_simple_dims_null() throws Throwable { H5.H5Screate_simple(2, (long[])null, null); } @Test(expected = IllegalArgumentException.class) public void testH5Screate_simple_rank_invalid() throws Throwable { long dims[] = {5, 5}; H5.H5Screate_simple(-1, dims, null); } @Test(expected = IllegalArgumentException.class) public void testH5Screate_simple_dims_invalid() throws Throwable { long dims[] = {2, 2}; H5.H5Screate_simple(5, dims, null); } @Test(expected = HDF5LibraryException.class) public void testH5Screate_simple_dims_exceed() throws Throwable { long dims[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29,30,31,32,33,35}; H5.H5Screate_simple(35, dims, null); } //H5Screate_simple was changed to allow a dim of 0 // @Ignore(expected = HDF5LibraryException.class) // public void testH5Screate_simple_dims_zero() { // long dims[] = {0, 0}; // H5.H5Screate_simple(2, dims, null); // } @Test public void testH5Screate_simple() { int sid = -1; int class_type = -1; int rank = 2; long dims[] = {5, 5}; long maxdims[] = {10, 10}; try { sid = H5.H5Screate_simple(rank, dims, maxdims); assertTrue("H5.H5Screate_simple", sid > 0); class_type = H5.H5Sget_simple_extent_type(sid); assertTrue("H5.H5Screate_simple: type", class_type == HDF5Constants.H5S_SIMPLE); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate_simple: " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Screate_simple_unlimted() { int sid = -1; int class_type = -1; int rank = 2; long dims[] = {5, 5}; long maxdims[] = {HDF5Constants.H5S_UNLIMITED, HDF5Constants.H5S_UNLIMITED}; try { sid = H5.H5Screate_simple(rank, dims, maxdims); assertTrue("H5.H5Screate_simple", sid > 0); class_type = H5.H5Sget_simple_extent_type(sid); assertTrue("H5.H5Screate_simple: type", class_type == HDF5Constants.H5S_SIMPLE); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate_simple: " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Screate_simple_unlimted_1d() { int sid = -1; int class_type = -1; int rank = 1; long dims[] = {5}; long maxdims[] = {HDF5Constants.H5S_UNLIMITED}; try { sid = H5.H5Screate_simple(rank, dims, maxdims); assertTrue("H5.H5Screate_simple", sid > 0); class_type = H5.H5Sget_simple_extent_type(sid); assertTrue("H5.H5Screate_simple: type", class_type == HDF5Constants.H5S_SIMPLE); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate_simple: " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Screate_simple_max_default() { int sid = -1; int rank = 2; long dims[] = {5, 5}; try { sid = H5.H5Screate_simple(rank, dims, null); assertTrue("H5.H5Screate_simple_max_default", sid > 0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate_simple: " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Screate_simple_extent() { int sid = -1; int rank = 2; long dims[] = {5, 5}; long maxdims[] = {10, 10}; try { sid = H5.H5Screate(HDF5Constants.H5S_SIMPLE); assertTrue("H5.H5Screate_simple_extent",sid > 0); H5.H5Sset_extent_simple(sid, rank, dims, maxdims); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate: " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test(expected = IllegalArgumentException.class) public void testH5Sencode_invalid() throws Throwable { H5.H5Sencode(-1); } @Test(expected = NullPointerException.class) public void testH5Sdecode_null() throws Throwable { H5.H5Sdecode(null); } } jhdf-2.9/test/hdf5lib/TestH5PData.java0000644000175000017500000001437312050301057020347 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.text.DecimalFormat; import java.text.NumberFormat; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5PData { private static final String H5_FILE = "test.h5"; private static final int DIM_X = 12; private static final int DIM_Y = 18; int H5fid = -1; int H5dsid = -1; int H5did = -1; int plist_id = -1; long[] H5dims = { DIM_X, DIM_Y }; double windchillF[][] = {{36.0, 31.0, 25.0, 19.0, 13.0, 7.0, 1.0, -5.0, -11.0, -16.0, -22.0, -28.0, -34.0, -40.0, -46.0, -52.0, -57.0, -63.0}, {34.0, 27.0, 21.0, 15.0, 9.0, 3.0, -4.0, -10.0, -16.0, -22.0, -28.0, -35.0, -41.0, -47.0, -53.0, -59.0, -66.0, -72.0}, {32.0, 25.0, 19.0, 13.0, 6.0, 0.0, -7.0, -13.0, -19.0, -26.0, -32.0, -39.0, -45.0, -51.0, -58.0, -64.0, -71.0, -77.0}, {30.0, 24.0, 17.0, 11.0, 4.0, -2.0, -9.0, -15.0, -22.0, -29.0, -35.0, -42.0, -48.0, -55.0, -61.0, -68.0, -74.0, -81.0}, {29.0, 23.0, 16.0, 9.0, 3.0, -4.0, -11.0, -17.0, -24.0, -31.0, -37.0, -44.0, -51.0, -58.0, -64.0, -71.0, -78.0, -84.0}, {28.0, 22.0, 15.0, 8.0, 1.0, -5.0, -12.0, -19.0, -26.0, -33.0, -39.0, -46.0, -53.0, -60.0, -67.0, -73.0, -80.0, -87.0}, {28.0, 21.0, 14.0, 7.0, 0.0, -7.0, -14.0, -21.0, -27.0, -34.0, -41.0, -48.0, -55.0, -62.0, -69.0, -76.0, -82.0, -89.0}, {27.0, 20.0, 13.0, 6.0, -1.0, -8.0, -15.0, -22.0, -29.0, -36.0, -43.0, -50.0, -57.0, -64.0, -71.0, -78.0, -84.0, -91.0}, {26.0, 19.0, 12.0, 5.0, -2.0, -9.0, -16.0, -23.0, -30.0, -37.0, -44.0, -51.0, -58.0, -65.0, -72.0, -79.0, -86.0, -93.0}, {26.0, 19.0, 12.0, 4.0, -3.0, -10.0, -17.0, -24.0, -31.0, -38.0, -45.0, -52.0, -60.0, -67.0, -74.0, -81.0, -88.0, -95.0}, {25.0, 18.0, 11.0, 4.0, -3.0, -11.0, -18.0, -25.0, -32.0, -39.0, -46.0, -54.0, -61.0, -68.0, -75.0, -82.0, -89.0, -97.0}, {25.0, 17.0, 10.0, 3.0, -4.0, -11.0, -19.0, -26.0, -33.0, -40.0, -48.0, -55.0, -62.0, -69.0, -76.0, -84.0, -91.0, -98.0} }; private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } private final int _createFloatDataset(int fid, int dsid, String name, int dapl) { int did = -1; try { did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_NATIVE_FLOAT, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D._createFloatDataset: ", did > 0); return did; } @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5dsid = H5.H5Screate_simple(2, H5dims, null); H5did = _createFloatDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); plist_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_XFER); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } assertTrue("TestH5D.createH5file: H5.H5Fcreate: ",H5fid > 0); assertTrue("TestH5D.createH5file: H5.H5Screate_simple: ",H5dsid > 0); assertTrue("TestH5D.createH5file: _createFloatDataset: ",H5did > 0); assertTrue(plist_id > 0); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5did > 0) try {H5.H5Dclose(H5did);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} _deleteFile(H5_FILE); if (plist_id > 0) try {H5.H5Pclose(plist_id);} catch (Exception ex) {} } @Test public void testH5Pdata_transform() { String f_to_c = "(5/9.0)*(x-32)"; double windchillFread[][] = new double[DIM_X][DIM_Y]; double windchillC; NumberFormat formatter = new DecimalFormat("#0.000"); try { H5.H5Pset_data_transform(plist_id, f_to_c); H5.H5Dwrite(H5did, HDF5Constants.H5T_NATIVE_DOUBLE, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, plist_id, windchillF); H5.H5Dread(H5did, HDF5Constants.H5T_NATIVE_DOUBLE, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, windchillFread); } catch (Throwable err) { err.printStackTrace(); fail("H5Pdata_transform: " + err); } for(int row = 0; row < DIM_X; row++) for(int col = 0; col < DIM_Y; col++) { windchillC = (5/9.0)*(windchillF[row][col]-32); String Cstr = formatter.format(windchillC); String Fread = formatter.format(windchillFread[row][col]); assertTrue("H5Pdata_transform: <"+row+","+col+">"+Fread+"="+Cstr, Fread.compareTo(Cstr)==0); } } @Test public void testH5P_buffer() { long default_size = 0; long size = 0; try { default_size = H5.H5Pget_buffer_size(plist_id); H5.H5Pset_buffer_size(plist_id, DIM_X*DIM_Y); size = H5.H5Pget_buffer_size(plist_id); } catch (Throwable err) { err.printStackTrace(); fail("H5P_buffer: " + err); } assertTrue("H5P_buffer default: "+default_size, default_size==1024*1024); assertTrue("H5P_buffer default: "+size, size==DIM_X*DIM_Y); } } jhdf-2.9/test/hdf5lib/TestH5Giterate.java0000644000175000017500000000766212050301057021125 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5G_info_t; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Giterate { private static final String H5_FILE = "test/hdf5lib/h5ex_g_iterate.hdf"; int H5fid = -1; private final int _openGroup(int fid, String name) { int gid = -1; try { gid = H5.H5Gopen(fid, name, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { gid = -1; err.printStackTrace(); fail("H5.H5Gcreate: " + err); } return gid; } @Before public void openH5file() throws HDF5LibraryException, NullPointerException { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Fopen: openH5file: " + err); } } @After public void deleteH5file() throws HDF5LibraryException { if (H5fid > 0) { try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } } @Test public void testH5Gget_obj_info_all() { H5G_info_t info = null; int gid = _openGroup(H5fid, "/"); try { info = H5.H5Gget_info(gid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info: " + err); } try { H5.H5Gclose(gid); } catch (Exception ex) { } assertNotNull(info); assertTrue("number of links is empty", info.nlinks > 0); String objNames[] = new String[(int) info.nlinks]; int objTypes[] = new int[(int) info.nlinks]; int lnkTypes[] = new int[(int) info.nlinks]; long objRefs[] = new long[(int) info.nlinks]; int names_found = 0; try { names_found = H5.H5Gget_obj_info_all(H5fid, "/", objNames, objTypes, lnkTypes, objRefs, HDF5Constants.H5_INDEX_NAME); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_obj_info_all: " + err); } assertTrue("number found[" + names_found + "] different than expected[" + objNames.length + "]", names_found == objNames.length); for (int i = 0; i < objNames.length; i++) { assertNotNull("name #" + i + " does not exist", objNames[i]); assertTrue(objNames[i].length() > 0); if (objTypes[i]==HDF5Constants.H5O_TYPE_GROUP) { assertTrue("Group is index: "+i + " ",i==2); assertTrue("Group is : "+objNames[i] + " ",objNames[i].compareToIgnoreCase("G1")==0); } else if (objTypes[i]==HDF5Constants.H5O_TYPE_DATASET) { assertTrue("Dataset is index: "+i + " ",(i==0)||(i==3)); if(i==0) assertTrue("Dataset is : "+objNames[i] + " ",objNames[i].compareToIgnoreCase("DS1")==0); else assertTrue("Dataset is : "+objNames[i] + " ",objNames[i].compareToIgnoreCase("L1")==0); } else if (objTypes[i]==HDF5Constants.H5O_TYPE_NAMED_DATATYPE) { assertTrue("Datatype is index: "+i + " ",i==1); assertTrue("Datatype is : "+objNames[i] + " ",objNames[i].compareToIgnoreCase("DT1")==0); } else { fail(" Unknown at index: " + i + " " + objNames[i]); } } } } jhdf-2.9/test/hdf5lib/TestH5Fbasic.java0000644000175000017500000001626012050301057020542 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Fbasic { private static final String H5_FILE = "test.h5"; private static final String TXT_FILE = "test.txt"; int H5fid = -1; private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } @Before public void createH5file() throws HDF5LibraryException, NullPointerException { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5fid > 0) { try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } _deleteFile(H5_FILE); } @Test public void testH5Fcreate() { assertTrue(H5fid > 0); } @Test public void testH5Fis_hdf5() { boolean isH5 = false; try { isH5 = H5.H5Fis_hdf5(H5_FILE); } catch (Throwable err) { fail("H5.H5Fis_hdf5 failed on " + H5_FILE + ": " + err); } assertTrue(isH5 == true); } @Test(expected = HDF5LibraryException.class) public void testH5Fcreate_EXCL() throws Throwable { H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_EXCL, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Fopen_read_only() throws Throwable { int fid = -1; try { fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { H5.H5Fclose(fid); } catch (Exception ex) { } // set the file to read-only File file = new File(H5_FILE); if (file.setWritable(false)) { // this should fail. fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); try { H5.H5Fclose(fid); } catch (Exception ex) { } } else { fail("File.setWritable(true) failed."); } } @Test(expected = HDF5LibraryException.class) public void testH5Freopen_closed() throws Throwable { int fid = -1; int fid2 = -1; try { fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { H5.H5Fclose(fid); } catch (Exception ex) { } // should fail because the file was closed. fid2 = H5.H5Freopen(fid); } @Test public void testH5Freopen() { int fid = -1; int fid2 = -1; try { fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { fid2 = H5.H5Freopen(fid); } catch (Throwable err) { fail("H5.H5Freopen: " + err); } assertTrue(fid2 > 0); try { H5.H5Fclose(fid2); } catch (Exception ex) { } try { H5.H5Fclose(fid); } catch (Exception ex) { } } @Test public void testH5Fclose() { int fid = -1; try { fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { H5.H5Fclose(fid); } catch (Throwable err) { fail("H5.H5Fclose: " + err); } } @Test(expected = HDF5LibraryException.class) public void testH5Fclose_twice() throws Throwable { int fid = -1; try { fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { H5.H5Fclose(fid); } catch (Throwable err) { fail("H5.H5Fclose: " + err); } // it should fail since the file was closed. H5.H5Fclose(fid); } @Test public void testH5Fget_freespace() { long freeSpace = 0; try { freeSpace = H5.H5Fget_freespace(H5fid); } catch (Throwable err) { fail("H5.H5Fget_freespace: " + err); } assertEquals(freeSpace, 0); } // TODO add/and delete objects and test freespace @Test public void testH5Fget_filesize() { long fileSize = 0; try { fileSize = H5.H5Fget_filesize(H5fid); } catch (Throwable err) { fail("H5.H5Fget_freespace: " + err); } assertTrue(fileSize > 0); } // TODO add/and delete objects and test freespace @Test public void testH5Fget_mdc_hit_rate() { double rate; try { rate = H5.H5Fget_mdc_hit_rate(H5fid); } catch (Throwable err) { fail("H5.H5Fget_mdc_hit_rate: " + err); } } @Test public void testH5Fget_mdc_size() { int nentries = -1; long cache_sizes[] = new long[3]; try { nentries = H5.H5Fget_mdc_size(H5fid, cache_sizes); } catch (Throwable err) { fail("H5.H5Fget_mdc_size: " + err); } assertTrue("H5.H5Fget_mdc_size #:" + nentries, nentries == 4); } // TODO: test more cases of different cache sizes. @Test public void testH5Freset_mdc_hit_rate_stats() { try { H5.H5Freset_mdc_hit_rate_stats(H5fid); } catch (Throwable err) { fail("H5.H5Freset_mdc_hit_rate_stats: " + err); } } @Test public void testH5Fget_name() { String fname = null; try { fname = H5.H5Fget_name(H5fid); } catch (Throwable err) { fail("H5.H5Fget_name: " + err); } assertNotNull(fname); assertEquals(fname, H5_FILE); } } jhdf-2.9/test/hdf5lib/TestH5Gbasic.java0000644000175000017500000002544212050301057020545 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5G_info_t; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Gbasic { private static final String H5_FILE = "test.h5"; int H5fid = -1; private final int _createGroup(int fid, String name) { int gid = -1; try { gid = H5.H5Gcreate(fid, name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gcreate: " + err); } return gid; } private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } @Before public void createH5file() throws HDF5LibraryException, NullPointerException { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5fid > 0) { try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } _deleteFile(H5_FILE); } @Test(expected = HDF5LibraryException.class) public void testH5Gclose_invalid() throws Throwable { H5.H5Gclose(-1); } @Test(expected = NullPointerException.class) public void testH5Gcreate_null() throws Throwable { int gid = -1; // it should fail because the group name is null gid = H5.H5Gcreate(H5fid, null, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test(expected = HDF5LibraryException.class) public void testH5Gcreate_invalid() throws Throwable { H5.H5Gcreate(-1, "Invalid ID", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Gcreate() { int gid = -1; try { gid = H5.H5Gcreate(H5fid, "/testH5Gcreate", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gcreate: " + err); } assertTrue(gid > 0); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test public void testH5Gclose() { int gid = _createGroup(H5fid, "/testH5Gcreate"); assertTrue(gid > 0); try { H5.H5Gclose(gid); } catch (Throwable err) { fail("H5Gclose: " + err); } } @Test(expected = HDF5LibraryException.class) public void testH5Gcreate_exists() throws Throwable { int gid = _createGroup(H5fid, "/testH5Gcreate"); assertTrue(gid > 0); try {H5.H5Gclose(gid);} catch (Exception ex) {} // it should failed now because the group already exists in file gid = H5.H5Gcreate(H5fid, "/testH5Gcreate", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Gcreate_anon() { int gid = -1; try { gid = H5.H5Gcreate_anon(H5fid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gcreate_anon: " + err); } assertTrue(gid > 0); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test(expected = NullPointerException.class) public void testH5Gopen_null() throws Throwable { int gid = -1; gid = H5.H5Gopen(H5fid, null, HDF5Constants.H5P_DEFAULT); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test(expected = HDF5LibraryException.class) public void testH5Gopen_invalid() throws Throwable { H5.H5Gopen(-1, "Invalid ID", HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Gopen_not_exists() throws Throwable { int gid = -1; gid = H5.H5Gopen(H5fid, "Never_created", HDF5Constants.H5P_DEFAULT); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test public void testH5Gopen() { int gid = _createGroup(H5fid, "/testH5Gcreate"); assertTrue(gid > 0); try {H5.H5Gclose(gid);} catch (Exception ex) {} try { gid = H5.H5Gopen(H5fid, "/testH5Gcreate", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gopen: " + err); } assertTrue(gid > 0); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test(expected = HDF5LibraryException.class) public void testH5Gget_create_plist_invalid() throws Throwable { H5.H5Gget_create_plist(-1); } @Test public void testH5Gget_create_plist() { int pid = -1; int gid = _createGroup(H5fid, "/testH5Gcreate"); assertTrue(gid > 0); try { pid = H5.H5Gget_create_plist(gid); } catch (Throwable err) { try {H5.H5Gclose(gid);} catch (Exception ex) {} err.printStackTrace(); fail("H5.H5Gget_create_plist: " + err); } assertTrue(pid > 0); try {H5.H5Pclose(pid);} catch (Exception ex) {} try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test(expected = HDF5LibraryException.class) public void testH5Gget_info_invalid() throws Throwable { H5.H5Gget_info(-1); } @Test public void testH5Gget_info() { H5G_info_t info = null; int gid = _createGroup(H5fid, "/testH5Gcreate"); assertTrue(gid > 0); try { info = H5.H5Gget_info(gid); } catch (Throwable err) { try {H5.H5Gclose(gid);} catch (Exception ex) {} err.printStackTrace(); fail("H5.H5Gget_info: " + err); } assertNotNull(info); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test(expected = NullPointerException.class) public void testH5Gget_info_by_name_null() throws Throwable { H5.H5Gget_info_by_name(-1, null, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Gget_info_by_name_invalid() throws Throwable { H5.H5Gget_info_by_name(-1, "/testH5Gcreate", HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Gget_info_by_name_not_exists() throws Throwable { H5.H5Gget_info_by_name(H5fid, "/testH5Gcreate", HDF5Constants.H5P_DEFAULT); } @Test public void testH5Gget_info_by_name() { H5G_info_t info = null; int gid = _createGroup(H5fid, "/testH5Gcreate"); assertTrue(gid > 0); try { info = H5.H5Gget_info_by_name(gid, "/testH5Gcreate", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { try {H5.H5Gclose(gid);} catch (Exception ex) {} err.printStackTrace(); fail("H5.H5Gget_info_by_name: " + err); } assertNotNull(info); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test public void testH5Gget_info_by_name_fileid() { H5G_info_t info = null; int gid = _createGroup(H5fid, "/testH5Gcreate"); assertTrue(gid > 0); try {H5.H5Gclose(gid);} catch (Exception ex) {} try { info = H5.H5Gget_info_by_name(H5fid, "/testH5Gcreate", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { try {H5.H5Gclose(gid);} catch (Exception ex) {} err.printStackTrace(); fail("H5.H5Gget_info_by_name: " + err); } assertNotNull(info); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test(expected = NullPointerException.class) public void testH5Gget_info_by_idx_null() throws Throwable { H5.H5Gget_info_by_idx(-1, null, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5_ITER_INC, 1, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Gget_info_by_idx_invalid() throws Throwable { H5.H5Gget_info_by_idx(-1, "/testH5Gcreate", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5_ITER_INC, 1, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Gget_info_by_idx_not_exists() throws Throwable { H5.H5Gget_info_by_idx(H5fid, "/testH5Gcreate", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 1, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Gget_info_by_idx() { H5G_info_t info = null; int gid = _createGroup(H5fid, "/testH5Gcreate"); assertTrue(gid > 0); try { info = H5.H5Gget_info_by_idx(gid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info_by_idx: " + err); } assertNotNull(info); try {H5.H5Gclose(gid);} catch (Exception ex) {} } @Test public void testH5Gget_info_by_idx_fileid() { H5G_info_t info = null; int gid = _createGroup(H5fid, "/testH5Gcreate"); assertTrue(gid > 0); try {H5.H5Gclose(gid);} catch (Exception ex) {} try { info = H5.H5Gget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info_by_idx: " + err); } assertNotNull(info); } } jhdf-2.9/test/hdf5lib/TestH5R.java0000644000175000017500000002515712050301057017561 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5R { private static final String H5_FILE = "testH5R.h5"; private static final int DIM_X = 4; private static final int DIM_Y = 6; int H5fid = -1; int H5dsid = -1; int H5did = -1; int H5gid = -1; int H5did2 = -1; long[] H5dims = { DIM_X, DIM_Y }; private final void _deleteFile(String filename) { File file = null; try { file = new File(filename); } catch (Throwable err) {} if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } private final int _createDataset(int fid, int dsid, String name, int dapl) { int did = -1; try { did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5R._createDataset: ",did > 0); return did; } private final int _createGroup(int fid, String name) { int gid = -1; try { gid = H5.H5Gcreate(fid, name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gcreate: " + err); } assertTrue("TestH5R._createGroup: ",gid > 0); return gid; } @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5dsid = H5.H5Screate_simple(2, H5dims, null); H5gid = _createGroup(H5fid, "Group1"); H5did2 = _createDataset(H5gid, H5dsid, "dset2", HDF5Constants.H5P_DEFAULT); H5did = _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } assertTrue("TestH5D.createH5file: H5.H5Fcreate: ",H5fid > 0); assertTrue("TestH5D.createH5file: H5.H5Screate_simple: ",H5dsid > 0); assertTrue("TestH5D.createH5file: _createDataset: ",H5did > 0); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5did > 0) try {H5.H5Dclose(H5did);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} if (H5gid > 0) try {H5.H5Gclose(H5gid);} catch (Exception ex) {} if (H5did2 > 0) try {H5.H5Dclose(H5did2);} catch (Exception ex) {} _deleteFile(H5_FILE); } @Test public void testH5Rget_name() { int loc_id=H5fid; int ref_type=HDF5Constants.H5R_OBJECT; long ret_val=-1; byte[] ref=null; String[] name= {""}; String objName = "/dset"; try { ref = H5.H5Rcreate(H5fid, objName, ref_type, -1); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Rget_name:H5Rcreate " + err); } try { ret_val = H5.H5Rget_name(loc_id, ref_type, ref, name, 16); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Rget_name: " + err); } assertTrue("testH5Rget_name: H5Rget_name", ret_val>0); assertTrue("The name of the object: ", objName.equals(name[0])); } @Test public void testH5Rget_obj_type2() { int ref_type=HDF5Constants.H5R_OBJECT; byte[] ref=null; String objName = "/dset"; int obj_type = -1;; int[] otype = { 1 }; try { ref = H5.H5Rcreate(H5fid, objName, ref_type, -1); } catch(Throwable err) { err.printStackTrace(); } try { obj_type = H5.H5Rget_obj_type(H5fid, HDF5Constants.H5R_OBJECT, ref, otype); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Rget_obj_type2: " + err); } assertEquals(obj_type, HDF5Constants.H5O_TYPE_DATASET); } @Test public void testH5Rcreate_refobj() { byte[] ref = null; try { ref = H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_OBJECT, -1); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Rcreate: " + err); } assertNotNull(ref); } @Test public void testH5Rcreate_regionrefobj() { byte[] ref = null; try { ref = H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_DATASET_REGION, H5dsid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Rcreate: " + err); } assertNotNull(ref); } @Test public void testH5Rdereference() { byte[] ref1 = null; byte[] ref2 = null; int dataset_id = -1; int group_id = -1; try { //Create reference on dataset ref1 = H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_DATASET_REGION, H5dsid); dataset_id= H5.H5Rdereference(H5fid, HDF5Constants.H5R_DATASET_REGION, ref1); //Create reference on group ref2 = H5.H5Rcreate(H5gid, "/Group1", HDF5Constants.H5R_OBJECT, -1); group_id= H5.H5Rdereference(H5gid, HDF5Constants.H5R_OBJECT, ref2); assertNotNull(ref1); assertNotNull(ref2); assertTrue(dataset_id>=0); assertTrue(group_id>=0); } catch (Throwable err) { err.printStackTrace(); fail("TestH5Rdereference " + err); } finally { try {H5.H5Dclose(dataset_id);} catch (Exception ex) {} try {H5.H5Gclose(group_id);} catch (Exception ex) {} } } @Test public void testH5Rget_region() { byte[] ref = null; int dsid = -1; try { ref = H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_DATASET_REGION, H5dsid); dsid = H5.H5Rget_region(H5fid, HDF5Constants.H5R_DATASET_REGION, ref); assertNotNull(ref); assertTrue(dsid>=0); } catch (Throwable err) { err.printStackTrace(); fail("TestH5Rget_region: " + err); } finally { try {H5.H5Sclose(dsid);} catch (Exception ex) {} } } @Test(expected = IllegalArgumentException.class) public void testH5Rget_name_Invalidreftype() throws Throwable { byte[] ref = null; String[] name= {""}; ref = H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_OBJECT, -1); H5.H5Rget_name(H5fid, HDF5Constants.H5R_DATASET_REGION, ref, name, 16); } @Test(expected = NullPointerException.class) public void testH5Rget_name_NULLreference() throws Throwable { byte[] ref = null; String[] name= {""}; H5.H5Rget_name(H5fid, HDF5Constants.H5R_OBJECT, ref, name, 16); } @Test(expected = HDF5LibraryException.class) public void testH5Rget_obj_type2_Invalidreftype() throws Throwable { byte[] ref = null; int[] otype = { 1 }; ref = H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_OBJECT, -1); H5.H5Rget_obj_type(H5fid, HDF5Constants.H5R_DATASET_REGION, ref, otype); } @Test(expected = HDF5LibraryException.class) public void testH5Rcreate_InvalidObjectName() throws Throwable { H5.H5Rcreate(H5fid, "/GROUPS", HDF5Constants.H5R_OBJECT, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Rcreate_Invalidspace_id() throws Throwable { H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_DATASET_REGION, -1); } @Test(expected = IllegalArgumentException.class) public void testH5Rcreate_Invalidreftype() throws Throwable { H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_BADTYPE, -1); } @Test(expected = IllegalArgumentException.class) public void testH5Rgetregion_Invalidreftype() throws Throwable { byte[] ref = null; ref = H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_OBJECT, H5dsid); H5.H5Rget_region(H5fid, HDF5Constants.H5R_DATASET_REGION, ref); } @Test(expected = IllegalArgumentException.class) public void testH5Rgetregion_Badreferencetype() throws Throwable { byte[] ref = null; ref = H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_OBJECT, H5dsid); H5.H5Rget_region(H5fid, HDF5Constants.H5R_OBJECT, ref); } @Test(expected = NullPointerException.class) public void testH5Rgetregion_Nullreference() throws Throwable { byte[] ref = null; H5.H5Rget_region(H5fid, HDF5Constants.H5R_DATASET_REGION, ref); } @Test(expected = NullPointerException.class) public void testH5Rdereference_Nullreference() throws Throwable { byte[] ref = null; H5.H5Rdereference(H5did2, HDF5Constants.H5R_OBJECT, ref); } @Test(expected = IllegalArgumentException.class) public void testH5Rdereference_Invalidreference() throws Throwable { byte[] ref1 = null; byte[] ref2 = null; ref1 = H5.H5Rcreate(H5fid, "/dset", HDF5Constants.H5R_DATASET_REGION, H5dsid); ref2 = H5.H5Rcreate(H5gid, "/Group1", HDF5Constants.H5R_OBJECT, -1); H5.H5Rdereference(H5gid, HDF5Constants.H5R_OBJECT, ref1); } } jhdf-2.9/test/hdf5lib/TestH5Fparams.java0000644000175000017500000001010412050301057020733 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.Before; import org.junit.Test; public class TestH5Fparams { @Before public void checkOpenIDs() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); } @Test(expected = NullPointerException.class) public void testH5Fcreate_null() throws Throwable { H5.H5Fcreate(null, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test(expected = NullPointerException.class) public void testH5Fopen_null() throws Throwable { H5.H5Fopen(null, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); } @Test(expected = NullPointerException.class) public void testH5Fis_hdf5_null() throws Throwable { H5.H5Fis_hdf5(null); } @Test(expected = NullPointerException.class) public void testH5Fmount_null() throws Throwable { H5.H5Fmount(-1, null, -1, HDF5Constants.H5P_DEFAULT); } @Test(expected = NullPointerException.class) public void testH5Funmount_null() throws Throwable { H5.H5Funmount(-1, null); } @Test public void testH5Fis_hdf5_text() { File txtFile = null; boolean isH5 = false; try { txtFile = new File("test.txt"); if (!txtFile.exists()) txtFile.createNewFile(); isH5 = H5.H5Fis_hdf5("test.txt"); } catch (Throwable err) { fail("H5.H5Fis_hdf5 failed on test.txt: " + err); } assertFalse(isH5); try { txtFile.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } @Test(expected = HDF5LibraryException.class) public void testH5Fclose_negative() throws Throwable { // cannot close a file with negative id. H5.H5Fclose(-1); } @Test public void testH5Fcreate() { int fid = -1; File file = null; try { fid = H5.H5Fcreate("test.h5", HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); if (fid > 0) { H5.H5Fclose(fid); } file = new File("test.h5"); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } if (file.exists()) { try { file.delete(); } catch (SecurityException e) { ;// e.printStackTrace(); } } } @Test public void testH5Fflush_global() { int fid = -1; try { fid = H5.H5Fcreate("test.h5", HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_GLOBAL); } catch (Throwable err) { fail("H5.H5Fflush: " + err); } try { H5.H5Fclose(fid); } catch (Exception ex) { } } @Test public void testH5Fflush_local() { int fid = -1; try { fid = H5.H5Fcreate("test.h5", HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { fail("H5.H5Fflush: " + err); } try { H5.H5Fclose(fid); } catch (Exception ex) { } } } jhdf-2.9/test/hdf5lib/TestAll.java0000644000175000017500000000156312050301057017666 0ustar sylvestresylvestrepackage test.hdf5lib; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses( { TestH5.class, TestH5Eregister.class, TestH5Edefault.class, TestH5E.class, TestH5Fparams.class, TestH5Fbasic.class, TestH5F.class, TestH5Gbasic.class, TestH5G.class, TestH5Giterate.class, TestH5Sbasic.class, TestH5S.class, TestH5Tparams.class, TestH5Tbasic.class, TestH5T.class, TestH5Dparams.class, TestH5D.class, TestH5Dplist.class, TestH5Lparams.class, TestH5Lbasic.class, TestH5Lcreate.class, TestH5R.class, TestH5P.class, TestH5PData.class, TestH5Pfapl.class, TestH5A.class, TestH5Oparams.class, TestH5Obasic.class, TestH5Ocopy.class, TestH5Ocreate.class, TestH5Z.class }) public class TestAll { } jhdf-2.9/test/hdf5lib/junit.sh.in0000755000175000017500000000303212050301057017541 0ustar sylvestresylvestre#!/bin/sh # Set up default variable values if not supplied by the user. # where the new builds exist HDFBLD_HOME=@abs_top_builddir@ export HDFBLD_HOME # where Java is installed (requires jdk1.4.x) JAVAPATH=@JAVABIN@ export JAVAPATH ############################################################################### # DO NOT MODIFY BELOW THIS LINE ############################################################################### CPATH=".:"$HDFBLD_HOME"/lib/jhdf5.jar:"$HDFBLD_HOME"/lib/jhdfobj.jar:"$HDFBLD_HOME"/lib/jhdf5obj.jar:"$HDFBLD_HOME"/lib/junit.jar" TEST=/usr/bin/test if [ ! -x /usr/bin/test ] then TEST=`which test` fi if $TEST -z "$CLASSPATH"; then CLASSPATH="" fi CLASSPATH=$CPATH":"$CLASSPATH export CLASSPATH if $TEST -n "$JAVAPATH" ; then PATH=$JAVAPATH":"$PATH export PATH fi if $TEST -e /bin/uname; then os_name=`/bin/uname -s` elif $TEST -e /usr/bin/uname; then os_name=`/usr/bin/uname -s` else os_name=unknown fi case $os_name in SunOS) OS_NAME=solaris ;; Linux) OS_NAME=linux ;; IRIX*) OS_NAME=irix-6.5 ;; OSF1) OS_NAME=alpha ;; AIX) OS_NAME=aix ;; Darwin) OS_NAME=macosx ;; FreeBSD) OS_NAME=freebsd ;; *) echo "Unknown Operating System: HDF-Java may not work correctly" ;; esac (cd $HDFBLD_HOME/lib; $JAVAPATH/java -Xmx1024M -Djava.library.path=$HDFBLD_HOME"/lib/"$OS_NAME -ea org.junit.runner.JUnitCore test.hdf5lib.TestAll) jhdf-2.9/test/hdf5lib/TestH5Edefault.java0000644000175000017500000004004012050301057021075 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.Before; import org.junit.Test; public class TestH5Edefault { @Before public void H5Eset_default_stack() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { // Clear any active stack messages H5.H5Eclear2(HDF5Constants.H5E_DEFAULT); } catch (HDF5LibraryException err) { err.printStackTrace(); fail("H5Eset_default_stack: " + err); } } @Test(expected = IllegalArgumentException.class) public void testH5Eprint2_invalid_classid() throws Throwable { H5.H5Eprint2(-1, null); } @Test public void testH5Eprint() { try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { } try { H5.H5Eprint2(HDF5Constants.H5E_DEFAULT, null); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eprint: " + err); } } @Test public void testH5Eget_current_stack() { long num_msg = -1; long num_msg_default = -1; int stack_id = -1; int stack_id_default = HDF5Constants.H5E_DEFAULT; try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { //default stack id will be different after exception stack_id_default = HDF5Constants.H5E_DEFAULT; //err.printStackTrace(); //This will clear the error stack } // Verify we have the correct number of messages try { num_msg_default = H5.H5Eget_num(stack_id_default); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eget_current_stack: get_num #:" + num_msg_default, num_msg_default == 2); //Save a copy of the current stack and clears the current stack try { stack_id = H5.H5Eget_current_stack(); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertFalse("H5.H5Eget_current_stack: get_current_stack - " + stack_id, stack_id < 0); assertFalse("H5.H5Eget_current_stack: get_current_stack - " + stack_id, stack_id == stack_id_default); // Verify we have the correct number of messages try { num_msg_default = H5.H5Eget_num(stack_id_default); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eget_current_stack: get_num #:" + num_msg_default, num_msg_default == 0); //Verify the copy has the correct number of messages try { num_msg = H5.H5Eget_num(stack_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eget_current_stack: get_num #:" + num_msg, num_msg == 2); try { H5.H5Eclose_stack(stack_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } } @Test public void testH5Eget_current_stack_pop() { long num_msg = -1; long num_msg_default = -1; int stack_id = -1; try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { //err.printStackTrace(); //This will clear the error stack } // Verify we have the correct number of messages try { num_msg_default = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eget_current_stack: get_num #:" + num_msg_default, num_msg_default == 2); //Save a copy of the current stack and clears the current stack try { stack_id = H5.H5Eget_current_stack(); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertFalse("H5.H5Eget_current_stack: get_current_stack - " + stack_id, stack_id < 0); assertFalse("H5.H5Eget_current_stack: get_current_stack - " + stack_id, stack_id == HDF5Constants.H5E_DEFAULT); // Verify we have the correct number of messages try { num_msg_default = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eget_current_stack: get_num #:" + num_msg_default, num_msg_default == 0); //Verify the copy has the correct number of messages try { num_msg = H5.H5Eget_num(stack_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eget_current_stack: get_num #:" + num_msg, num_msg == 2); //Generate errors on default stack try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { //err.printStackTrace(); //This will clear the error stack } // Verify we have the correct number of messages try { num_msg_default = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eget_current_stack: get_num #:" + num_msg_default, num_msg_default == 2); //Remove one message from the current stack try { H5.H5Epop(HDF5Constants.H5E_DEFAULT, 1); num_msg_default = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eget_current_stack: pop #:" + num_msg_default, num_msg_default == 1); //Verify the copy still has the correct number of messages try { num_msg = H5.H5Eget_num(stack_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eget_current_stack: get_num #:" + num_msg, num_msg == 2); } @Test(expected = IllegalArgumentException.class) public void testH5Eclose_stack_invalid_stackid() throws Throwable { H5.H5Eclose_stack(-1); } @Test(expected = IllegalArgumentException.class) public void testH5Eget_class_name_invalid_classid() throws Throwable { H5.H5Eget_class_name(-1); } @Test(expected = IllegalArgumentException.class) public void testH5Eget_class_name_invalid_classname() throws Throwable { H5.H5Eget_class_name(HDF5Constants.H5E_DEFAULT); } @Test(expected = IllegalArgumentException.class) public void testH5Eclose_msg_invalid_errid() throws Throwable { H5.H5Eclose_msg(-1); } @Test(expected = IllegalArgumentException.class) public void testH5Ecreate_msg_invalid_errid() throws Throwable { H5.H5Ecreate_msg(-1, HDF5Constants.H5E_MAJOR, "null"); } @Test(expected = IllegalArgumentException.class) public void testH5Eget_msg_invalid_msgid() throws Throwable { H5.H5Eget_msg(-1, null); } @Test public void testH5Ecreate_stack() { try { int stack_id = H5.H5Ecreate_stack(); assertTrue("H5.H5Ecreate_stack", stack_id > 0); H5.H5Eclose_stack(stack_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ecreate_stack: " + err); } } @Test(expected = IllegalArgumentException.class) public void testH5Eset_current_stack_invalid_stkid() throws Throwable { H5.H5Eset_current_stack(-1); } @Test public void testH5Eset_current_stack() { long num_msg = -1; int stack_id = -1; try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { //err.printStackTrace(); //This will clear the error stack } // Verify we have the correct number of messages try { num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eset_current_stack: " + err); } assertTrue("H5.H5Eset_current_stack: get_num #:" + num_msg, num_msg == 2); //Save a copy of the current stack try { stack_id = H5.H5Eget_current_stack(); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eset_current_stack: " + err); } assertFalse("H5.H5Eset_current_stack: get_current_stack - " + stack_id, stack_id < 0); assertFalse("H5.H5Eset_current_stack: get_current_stack - " + stack_id, stack_id == HDF5Constants.H5E_DEFAULT); //Verify the copy has the correct number of messages try { num_msg = H5.H5Eget_num(stack_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eset_current_stack: " + err); } assertTrue("H5.H5Eset_current_stack: get_num #:" + num_msg, num_msg == 2); //Generate errors on default stack try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { //err.printStackTrace(); //This will clear the error stack } // Verify we have the correct number of messages try { num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_current_stack: " + err); } assertTrue("H5.H5Eset_current_stack: get_num #:" + num_msg, num_msg == 2); //Remove one message from the current stack try { H5.H5Epop(HDF5Constants.H5E_DEFAULT, 1); num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eset_current_stack: " + err); } assertTrue("H5.H5Eset_current_stack: pop #:" + num_msg, num_msg == 1); //Verify the copy still has the correct number of messages try { num_msg = H5.H5Eget_num(stack_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eset_current_stack: " + err); } assertTrue("H5.H5Eset_current_stack: get_num #:" + num_msg, num_msg == 2); try { H5.H5Eset_current_stack(stack_id); num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eset_current_stack: " + err); } assertTrue("H5.H5Eset_current_stack: get_num - " + num_msg, num_msg == 2); } @Test(expected = IllegalArgumentException.class) public void testH5Epop_invalid_stkid() throws Throwable { H5.H5Epop(-1, 0); } @Test public void testH5Epop() throws Throwable { long num_msg = -1; try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { } try { num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } assertTrue("H5.H5Epop before #:" + num_msg, num_msg == 2); try { H5.H5Epop(HDF5Constants.H5E_DEFAULT, 1); num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } assertTrue("H5.H5Epop after #:" + num_msg, num_msg == 1); } @Test(expected = IllegalArgumentException.class) public void testH5EprintInt_invalid_classid() throws Throwable { H5.H5Eprint2(-1, null); } @Test public void testH5EprintInt() { try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { } try { H5.H5Eprint2(HDF5Constants.H5E_DEFAULT, null); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5EprintInt: " + err); } } @Test public void testH5EclearInt() { try { H5.H5Eclear(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5EclearInt: " + err); } } @Test(expected = IllegalArgumentException.class) public void testH5Eclear2_invalid_stkid() throws Throwable { H5.H5Eclear2(-1); } @Test public void testH5Eclear() { try { H5.H5Eclear2(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eclear2: " + err); } } @Test public void testH5Eclear2_with_msg() { long num_msg = -1; try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { } try { num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eclear2_with_msg: " + err); } assertTrue("H5.H5Eclear2_with_msg before #:" + num_msg, num_msg == 2); try { H5.H5Eclear2(HDF5Constants.H5E_DEFAULT); num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eclear2_with_msg: " + err); } assertTrue("H5.H5Eclear2_with_msg after #:" + num_msg, num_msg == 0); } @Test(expected = IllegalArgumentException.class) public void testH5Eauto_is_v2_invalid_stkid() throws Throwable { H5.H5Eauto_is_v2(-1); } @Test public void testH5Eauto_is_v2() { boolean is_v2 = false; try { is_v2 = H5.H5Eauto_is_v2(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eauto_is_v2: " + err); } assertTrue("H5.H5Eauto_is_v2: ", is_v2); } @Test(expected = IllegalArgumentException.class) public void testH5Eget_num_invalid_stkid() throws Throwable { H5.H5Eget_num(-1); } @Test public void testH5Eget_num() { long num_msg = -1; try { num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_num: " + err); } assertTrue("H5.H5Eget_num #:" + num_msg, num_msg == 0); } @Test public void testH5Eget_num_with_msg() { long num_msg = -1; try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { } try { num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_num_with_msg: " + err); } assertTrue("H5.H5Eget_num_with_msg #:" + num_msg, num_msg > 0); } } jhdf-2.9/test/hdf5lib/Makefile.in0000644000175000017500000000371712050301057017523 0ustar sylvestresylvestre#/**************************************************************************** # * Copyright by The HDF Group. * # * Copyright by the Board of Trustees of the University of Illinois. * # * All rights reserved. * # * * # * This file is part of HDF Java Products. The full HDF Java copyright * # * notice, including terms governing use, modification, and redistribution, * # * is contained in the file, COPYING. COPYING can be found at the root of * # * the source code distribution tree. You can also access it online at * # * http://www.hdfgroup.org/products/licenses.html. If you do not have * # * access to the file, you may request a copy from help@hdfgroup.org. * # ****************************************************************************/ TOP = ../.. DIR = test/hdf5lib SUBDIRS = NULL JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAR = @JAR@ FIND = @FIND@ RM = @RM@ SLEXT=@SLEXT@ JSLEXT=@JSLEXT@ CLASSPATH=@CLASSPATH@:../../lib/junit.jar JH45INSTALLDIR=@JH45INST@ H45INC=@H45INC@ H4INC=@HDF4INC@ H5INC=@HDF5INC@ JAVA_SRCS = \ TestH5.java \ TestH5E.java \ TestH5Edefault.java \ TestH5Eregister.java \ TestH5Fparams.java \ TestH5Fbasic.java \ TestH5F.java \ TestH5Gbasic.java \ TestH5G.java \ TestH5Giterate.java \ TestH5Sbasic.java \ TestH5S.java \ TestH5Tparams.java \ TestH5Tbasic.java \ TestH5T.java \ TestH5Dparams.java \ TestH5Dplist.java \ TestH5D.java \ TestH5Lparams.java \ TestH5Lbasic.java \ TestH5Lcreate.java \ TestH5R.java \ TestH5P.java \ TestH5PData.java \ TestH5Pfapl.java \ TestH5A.java \ TestH5Oparams.java \ TestH5Obasic.java \ TestH5Ocreate.java \ TestH5Ocopy.java \ TestH5Z.java \ TestAll.java check: all cp h5ex_g_iterate.hdf $(TOP)/lib/$(DIR) chmod u+x junit.sh; ./junit.sh include $(TOP)/config/Rules.mk jhdf-2.9/test/hdf5lib/TestH5Tparams.java0000644000175000017500000002605312050301057020763 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertTrue; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.Before; import org.junit.Test; public class TestH5Tparams { @Before public void checkOpenIDs() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); } @Test(expected = HDF5LibraryException.class) public void testH5Tclose_invalid() throws Throwable { H5.H5Tclose(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tcopy_invalid() throws Throwable { H5.H5Tcopy(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tequal_invalid() throws Throwable { H5.H5Tequal(-1, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Tlock_invalid() throws Throwable { H5.H5Tlock(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_class_invalid() throws Throwable { H5.H5Tget_class(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_size_invalid() throws Throwable { H5.H5Tget_size(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_size_long_invalid() throws Throwable { H5.H5Tget_size_long(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_size_invalid() throws Throwable { H5.H5Tset_size(-1, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_order_invalid() throws Throwable { H5.H5Tget_order(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_order_invalid() throws Throwable { H5.H5Tset_order(-1, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_precision_invalid() throws Throwable { H5.H5Tget_precision(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_precision_long_invalid() throws Throwable { H5.H5Tget_precision_long(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_precision_invalid() throws Throwable { H5.H5Tset_precision(-1, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_offset_invalid() throws Throwable { H5.H5Tget_offset(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_offset_invalid() throws Throwable { H5.H5Tset_offset(-1, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tcreate_invalid() throws Throwable { H5.H5Tcreate(-1, 0); } @Test(expected = NullPointerException.class) public void testH5Topen_null() throws Throwable { H5.H5Topen(-1, null, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Topen_invalid() throws Throwable { H5.H5Topen(-1, "Bogus", 0); } @Test(expected = NullPointerException.class) public void testH5Tcommit_null() throws Throwable { H5.H5Tcommit(-1, null, 0, -1, -1, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Tcommit_invalid() throws Throwable { H5.H5Tcommit(-1, "Bogus", -1, -1, -1, -1); } @Test(expected = NullPointerException.class) public void testH5Tget_pad_null() throws Throwable { H5.H5Tget_pad(-1, null); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_pad_invalid() throws Throwable { int[] pad = new int[2]; H5.H5Tget_pad(-1, pad); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_pad_invalid() throws Throwable { H5.H5Tset_pad(-1, -1, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_sign_invalid() throws Throwable { H5.H5Tget_sign(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_sign_invalid() throws Throwable { H5.H5Tset_sign(-1, 0); } @Test(expected = NullPointerException.class) public void testH5Tget_fields_null() throws Throwable { H5.H5Tget_fields(-1, (long[])null); } @Test(expected = IllegalArgumentException.class) public void testH5Tget_fields_length_invalid() throws Throwable { long[] fields = new long[2]; H5.H5Tget_fields(-1, fields); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_fields_invalid() throws Throwable { long[] fields = new long[5]; H5.H5Tget_fields(-1, fields); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_fields_invalid() throws Throwable { H5.H5Tset_fields(-1, -1, -1, -1, -1, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_ebias_invalid() throws Throwable { H5.H5Tget_ebias(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_ebias_long_invalid() throws Throwable { H5.H5Tget_ebias_long(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_ebias_invalid() throws Throwable { H5.H5Tset_ebias(-1, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_norm_invalid() throws Throwable { H5.H5Tget_norm(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_norm_invalid() throws Throwable { H5.H5Tset_norm(-1, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_inpad_invalid() throws Throwable { H5.H5Tget_inpad(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_inpad_invalid() throws Throwable { H5.H5Tset_inpad(-1, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_cset_invalid() throws Throwable { H5.H5Tget_cset(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_cset_invalid() throws Throwable { H5.H5Tset_cset(-1, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_strpad_invalid() throws Throwable { H5.H5Tget_strpad(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_strpad_invalid() throws Throwable { H5.H5Tset_strpad(-1, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_nmembers_invalid() throws Throwable { H5.H5Tget_nmembers(-1); } @Test(expected = NullPointerException.class) public void testH5Tget_member_index_null() throws Throwable { H5.H5Tget_member_index(-1, null); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_member_index_invalid() throws Throwable { H5.H5Tget_member_index(-1, "Bogus"); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_member_type_invalid() throws Throwable { H5.H5Tget_member_type(-1, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_member_class_invalid() throws Throwable { H5.H5Tget_member_class(-1, -1); } @Test(expected = NullPointerException.class) public void testH5Tinsert_null() throws Throwable { H5.H5Tinsert(-1, null, 0, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tinsert_invalid() throws Throwable { H5.H5Tinsert(-1, "Bogus", 0, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Tpack_invalid() throws Throwable { H5.H5Tpack(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tvlen_create_invalid() throws Throwable { H5.H5Tvlen_create(-1); } @Test(expected = NullPointerException.class) public void testH5Tset_tag_null() throws Throwable { H5.H5Tset_tag(-1, null); } @Test(expected = HDF5LibraryException.class) public void testH5Tset_tag_invalid() throws Throwable { H5.H5Tset_tag(-1, "Bogus"); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_super_invalid() throws Throwable { H5.H5Tget_super(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Tenum_create_invalid() throws Throwable { H5.H5Tenum_create(-1); } @Test(expected = NullPointerException.class) public void testH5Tenum_insert_name_null() throws Throwable { H5.H5Tenum_insert(-1, null, (byte[])null); } @Test(expected = NullPointerException.class) public void testH5Tenum_insert_null() throws Throwable { H5.H5Tenum_insert(-1, "bogus", (byte[])null); } @Test(expected = HDF5LibraryException.class) public void testH5Tenum_insert_invalid() throws Throwable { byte[] enumtype = new byte[2]; H5.H5Tenum_insert(-1, "bogus", enumtype); } @Test(expected = IllegalArgumentException.class) public void testH5Tenum_nameof_invalid_size() throws Throwable { H5.H5Tenum_nameof(-1, null, -1); } @Test(expected = NullPointerException.class) public void testH5Tenum_nameof_value_null() throws Throwable { H5.H5Tenum_nameof(-1, null, 1); } @Test(expected = HDF5LibraryException.class) public void testH5Tenum_nameof_invalid() throws Throwable { byte[] btype = new byte[2]; H5.H5Tenum_nameof(-1, btype, 1); } @Test(expected = NullPointerException.class) public void testH5Tenum_valueof_name_null() throws Throwable { H5.H5Tenum_valueof(-1, null, (byte[])null); } @Test(expected = NullPointerException.class) public void testH5Tenum_valueof_null() throws Throwable { H5.H5Tenum_valueof(-1, "bogus", (byte[])null); } @Test(expected = HDF5LibraryException.class) public void testH5Tenum_valueof_invalid() throws Throwable { byte[] btype = new byte[2]; H5.H5Tenum_valueof(-1, "bogus", btype); } @Test(expected = NullPointerException.class) public void testH5Tget_member_value_null() throws Throwable { H5.H5Tget_member_value(-1, -1, (byte[])null); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_member_value_invalid() throws Throwable { byte[] btype = new byte[2]; H5.H5Tget_member_value(-1, -1, btype); } @Test(expected = IllegalArgumentException.class) public void testH5Tarray_create_invalid() throws Throwable { H5.H5Tarray_create(-1, -1, null); } @Test(expected = NullPointerException.class) public void testH5Tarray_create_value_null() throws Throwable { H5.H5Tarray_create(-1, 1, null); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_array_ndims_invalid() throws Throwable { H5.H5Tget_array_ndims(-1); } @Test(expected = NullPointerException.class) public void testH5Tget_array_dims_null() throws Throwable { H5.H5Tget_array_dims(-1, null); } @Test(expected = HDF5LibraryException.class) public void testH5Tget_native_type_invalid() throws Throwable { H5.H5Tget_native_type(-1); } } jhdf-2.9/test/hdf5lib/TestH5F.java0000644000175000017500000002075412050301057017543 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5F { private static final String H5_FILE = "test.h5"; private static final int COUNT_OBJ_FILE = 1; private static final int COUNT_OBJ_DATASET = 0; private static final int COUNT_OBJ_GROUP = 0; private static final int COUNT_OBJ_DATATYPE = 0; private static final int COUNT_OBJ_ATTR = 0; private static final int COUNT_OBJ_ALL = (COUNT_OBJ_FILE + COUNT_OBJ_DATASET + COUNT_OBJ_GROUP + COUNT_OBJ_DATATYPE + COUNT_OBJ_ATTR); private static final int[] OBJ_COUNTS = { COUNT_OBJ_FILE, COUNT_OBJ_DATASET, COUNT_OBJ_GROUP, COUNT_OBJ_DATATYPE, COUNT_OBJ_ATTR, COUNT_OBJ_ALL }; private static final int[] OBJ_TYPES = { HDF5Constants.H5F_OBJ_FILE, HDF5Constants.H5F_OBJ_DATASET, HDF5Constants.H5F_OBJ_GROUP, HDF5Constants.H5F_OBJ_DATATYPE, HDF5Constants.H5F_OBJ_ATTR, HDF5Constants.H5F_OBJ_ALL }; int H5fid = -1; private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } @Before public void createH5file() throws HDF5LibraryException, NullPointerException { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5fid > 0) { try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } _deleteFile(H5_FILE); } @Test public void testH5Fget_create_plist() { int plist = -1; try { plist = H5.H5Fget_create_plist(H5fid); } catch (Throwable err) { fail("H5.H5Fget_create_plist: " + err); } assertTrue(plist > 0); try {H5.H5Pclose(plist);} catch (HDF5LibraryException e) {e.printStackTrace();} } @Test(expected = HDF5LibraryException.class) public void testH5Fget_create_plist_closed() throws Throwable { int fid = -1; try { fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { H5.H5Fclose(fid); } catch (Exception ex) { } // it should fail because the file was closed. H5.H5Fget_create_plist(fid); } @Test public void testH5Fget_access_plist() { int plist = -1; try { plist = H5.H5Fget_access_plist(H5fid); } catch (Throwable err) { fail("H5.H5Fget_access_plist: " + err); } assertTrue(plist > 0); try {H5.H5Pclose(plist);} catch (HDF5LibraryException e) {e.printStackTrace();} } @Test(expected = HDF5LibraryException.class) public void testH5Fget_access_plist_closed() throws Throwable { int fid = -1; try { fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { H5.H5Fclose(fid); } catch (Exception ex) { } // it should fail because the file was closed. H5.H5Fget_access_plist(fid); } @Test public void testH5Fget_intent_rdwr() { int intent = 0; int fid = -1; try { fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { intent = H5.H5Fget_intent(fid); } catch (Throwable err) { fail("H5.H5Fget_intent: " + err); } assertEquals(intent, HDF5Constants.H5F_ACC_RDWR); try { H5.H5Fclose(fid); } catch (Exception ex) { } } @Test public void testH5Fget_intent_rdonly() { int intent = 0; int fid = -1; try { fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { fail("H5.H5Fopen: " + err); } try { intent = H5.H5Fget_intent(fid); } catch (Throwable err) { fail("H5.H5Fget_intent: " + err); } assertEquals(intent, HDF5Constants.H5F_ACC_RDONLY); try { H5.H5Fclose(fid); } catch (Exception ex) { } } @Test public void testH5Fget_obj_count() { long count = -1; for (int i = 0; i < OBJ_TYPES.length; i++) { try { count = H5.H5Fget_obj_count_long(H5fid, OBJ_TYPES[i]); } catch (Throwable err) { fail("H5.H5Fget_obj_count: " + err); } assertEquals(count, OBJ_COUNTS[i]); } } @Test public void testH5Fget_obj_ids() { long count = 0; int max_objs = 100; int[] obj_id_list = new int[max_objs]; int[] open_obj_counts = new int[OBJ_TYPES.length]; for (int i = 0; i < OBJ_TYPES.length; i++) open_obj_counts[i] = 0; open_obj_counts[0] = 1; for (int i = 0; i < OBJ_TYPES.length - 1; i++) open_obj_counts[OBJ_TYPES.length - 1] += open_obj_counts[i]; for (int i = 0; i < OBJ_TYPES.length; i++) { try { count = H5.H5Fget_obj_ids_long(H5fid, OBJ_TYPES[i], max_objs, obj_id_list); } catch (Throwable err) { fail("H5.H5Fget_obj_ids: " + err); } assertEquals(count, open_obj_counts[i]); } } /** * TODO: need to add objects to the file after H5G[D,T]create() functions * are implemented. */ // // @Test // public void testH5Fmount_unmount() { // String file1 = "src.h5"; // String file2 = "dst.h5"; // String group1 = "/G"; // String group2 = "/MOUNTED"; // // _createH5File(file1); // _createH5File(file2); // // int fid1 = _openFile(file1, HDF5Constants.H5F_ACC_RDWR); // assertTrue(fid1 > 0); // // int fid2 = _openFile(file2, HDF5Constants.H5F_ACC_RDWR); // assertTrue(fid2 > 0); // // // create a group at file1 // int gid = _createGroup(fid1, group1); // try { H5.H5Gclose(gid); } catch (Exception ex) {} // // // create a group at file 2 // gid = _createGroup(fid2, group2); // try { H5.H5Gclose(gid); } catch (Exception ex) {} // // // before mount, "/G/MOUNTED" does not exists in file1 // gid = _openGroup(fid1, group1+group2); // assertTrue(gid < 0); // // // Mount file2 under G in the file1 // try { // H5.H5Fmount(fid1, group1, fid2, HDF5Constants.H5P_DEFAULT); // } // catch (Throwable err) { // fail("H5.H5Fmount: "+err); // } // // // now file1 should have group "/G/MOUNTED" // gid = _openGroup(fid1, group1+group2); // assertTrue(gid > 0); // try { H5.H5Gclose(gid); } catch (Exception ex) {} // // // unmount file2 from file1 // try { // H5.H5Funmount(fid1, group1); // } // catch (Throwable err) { // fail("H5.H5Funmount: "+err); // } // // // file2 was unmounted from file1, "/G/MOUNTED" does not exists in file1 // gid = _openGroup(fid1, group1+group2); // assertTrue(gid < 0); // // try { H5.H5Fclose(fid1); } catch (Exception ex) {} // try { H5.H5Fclose(fid2); } catch (Exception ex) {} // // _deleteFile(file1); // _deleteFile(file2); // } } jhdf-2.9/test/hdf5lib/CMakeLists.txt0000644000175000017500000000634212050301057020213 0ustar sylvestresylvestrecmake_minimum_required (VERSION 2.8.6) PROJECT (HDFJAVA_TEST_HDF5LIB Java) SET(CMAKE_VERBOSE_MAKEFILE 1) INCLUDE_DIRECTORIES( ${JAVA_NCSA_HDF_HDF4_BINARY_DIR} ${JAVA_NCSA_HDF_HDF5_BINARY_DIR} ${JAVA_NCSA_HDF_OBJECT_BINARY_DIR} ${HDFJAVA_LIB_DIR} ) SET (HDFJAVA_TEST_HDF5LIB_SRCS TestH5.java TestH5E.java TestH5Edefault.java TestH5Eregister.java TestH5Fparams.java TestH5Fbasic.java TestH5F.java TestH5Gbasic.java TestH5G.java TestH5Giterate.java TestH5Sbasic.java TestH5S.java TestH5Tparams.java TestH5Tbasic.java TestH5T.java TestH5Dparams.java TestH5D.java TestH5Dplist.java TestH5Lparams.java TestH5Lbasic.java TestH5Lcreate.java TestH5R.java TestH5P.java TestH5PData.java TestH5Pfapl.java TestH5A.java TestH5Oparams.java TestH5Obasic.java TestH5Ocreate.java TestH5Ocopy.java TestH5Z.java TestAll.java ) FILE (WRITE ${PROJECT_BINARY_DIR}/Manifest.txt "Main-Class: test.hdf5lib.TestAll " ) SET (CMAKE_JAVA_INCLUDE_PATH "${HDFJAVA_LIB_DIR}/junit.jar;${HDFJAVA_HDF5_JARS}") ADD_JAR (${HDFJAVA_TEST_HDF5_LIB_TARGET} ${PROJECT_BINARY_DIR}/Manifest.txt ${HDFJAVA_TEST_HDF5LIB_SRCS}) GET_TARGET_PROPERTY(${HDFJAVA_TEST_HDF5_LIB_TARGET}_JAR_FILE ${HDFJAVA_TEST_HDF5_LIB_TARGET} JAR_FILE) #INSTALL_JAR (${HDFJAVA_TEST_HDF5_LIB_TARGET} ${HJAVA_INSTALL_DATA_DIR}/tests tests) #GET_TARGET_PROPERTY(${HDFJAVA_TEST_HDF5_LIB_TARGET}_CLASSPATH ${HDFJAVA_TEST_HDF5_LIB_TARGET} CLASSDIR) ADD_DEPENDENCIES (${HDFJAVA_TEST_HDF5_LIB_TARGET} ${HDFJAVA_NCSA_HDF5_LIB_TARGET}) SET (HDF_JAVA_TEST_FILES h5ex_g_iterate.hdf JUnit-interface.txt ) FOREACH (h5_file ${HDF_JAVA_TEST_FILES}) SET (dest "${PROJECT_BINARY_DIR}/${h5_file}") #MESSAGE (STATUS " Copying ${h5_file}") ADD_CUSTOM_COMMAND ( TARGET ${HDFJAVA_TEST_HDF5_LIB_TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/${h5_file} ${dest} ) ENDFOREACH (h5_file ${HDF_JAVA_TEST_FILES}) IF (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ";") ELSE (WIN32 AND NOT CYGWIN) SET(CMAKE_JAVA_INCLUDE_FLAG_SEP ":") ENDIF(WIN32 AND NOT CYGWIN) SET (CMAKE_JAVA_CLASSPATH ".") FOREACH (CMAKE_INCLUDE_PATH ${CMAKE_JAVA_INCLUDE_PATH}) SET(CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${CMAKE_INCLUDE_PATH}") ENDFOREACH(CMAKE_INCLUDE_PATH) SET (CMAKE_JAVA_CLASSPATH "${CMAKE_JAVA_CLASSPATH}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${${HDFJAVA_TEST_HDF5_LIB_TARGET}_JAR_FILE}") SET (testfilter "OK (598 tests)") ADD_TEST ( NAME JUnit-interface COMMAND "${CMAKE_COMMAND}" -D "TEST_TESTER=${CMAKE_Java_RUNTIME}" -D "TEST_CLASSPATH:STRING=${CMAKE_JAVA_CLASSPATH}" -D "TEST_ARGS:STRING=-ea;org.junit.runner.JUnitCore" -D "TEST_PROGRAM=test.hdf5lib.TestAll" -D "TEST_LIBRARY_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" -D "TEST_FOLDER=${HDFJAVA_BINARY_DIR}" -D "TEST_OUTPUT=${HDFJAVA_TEST_HDF5LIB_BINARY_DIR}/JUnit-interface.out" -D "TEST_EXPECT=0" -D "TEST_SKIP_COMPARE=TRUE" -D "TEST_FILTER:STRING=${testfilter}" -D "TEST_REFERENCE=${testfilter}" -P "${HDFJAVA_RESOURCES_DIR}/runTest.cmake" ) jhdf-2.9/test/hdf5lib/TestH5Z.java0000644000175000017500000000742712050301057017571 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.Test; public class TestH5Z { @Test public void testH5Zfilter_avail() { try { int filter_found = H5.H5Zfilter_avail(HDF5Constants.H5Z_FILTER_DEFLATE); assertTrue("H5.H5Zfilter_avail", filter_found > 0); filter_found = H5.H5Zfilter_avail(HDF5Constants.H5Z_FILTER_FLETCHER32); assertTrue("H5.H5Zfilter_avail", filter_found > 0); filter_found = H5.H5Zfilter_avail(HDF5Constants.H5Z_FILTER_NBIT); assertTrue("H5.H5Zfilter_avail", filter_found > 0); filter_found = H5.H5Zfilter_avail(HDF5Constants.H5Z_FILTER_SCALEOFFSET); assertTrue("H5.H5Zfilter_avail", filter_found > 0); filter_found = H5.H5Zfilter_avail(HDF5Constants.H5Z_FILTER_SHUFFLE); assertTrue("H5.H5Zfilter_avail", filter_found > 0); filter_found = H5.H5Zfilter_avail(HDF5Constants.H5Z_FILTER_SZIP); assertTrue("H5.H5Zfilter_avail", filter_found > 0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Zfilter_avail " + err); } } @Test public void testH5Zget_filter_info() { try { int filter_flag = H5.H5Zget_filter_info(HDF5Constants.H5Z_FILTER_DEFLATE); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED) > 0); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED) > 0); filter_flag = H5.H5Zget_filter_info(HDF5Constants.H5Z_FILTER_FLETCHER32); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED) > 0); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED) > 0); filter_flag = H5.H5Zget_filter_info(HDF5Constants.H5Z_FILTER_NBIT); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED) > 0); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED) > 0); filter_flag = H5.H5Zget_filter_info(HDF5Constants.H5Z_FILTER_SCALEOFFSET); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED) > 0); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED) > 0); filter_flag = H5.H5Zget_filter_info(HDF5Constants.H5Z_FILTER_SHUFFLE); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED) > 0); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED) > 0); filter_flag = H5.H5Zget_filter_info(HDF5Constants.H5Z_FILTER_SZIP); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_DECODE_ENABLED) > 0); assertTrue("H5.H5Zget_filter_info", (filter_flag & HDF5Constants.H5Z_FILTER_CONFIG_ENCODE_ENABLED) > 0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Zget_filter_info " + err); } } @Test(expected = HDF5LibraryException.class) public void testH5Zunregister_predefined() throws Throwable { int filter_found = H5.H5Zfilter_avail(HDF5Constants.H5Z_FILTER_SHUFFLE); assertTrue("H5.H5Zfilter_avail", filter_found > 0); H5.H5Zunregister(HDF5Constants.H5Z_FILTER_SHUFFLE); } } jhdf-2.9/test/hdf5lib/TestH5D.java0000644000175000017500000007432312050301057017542 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.HDFNativeData; import ncsa.hdf.hdf5lib.callbacks.H5D_iterate_cb; import ncsa.hdf.hdf5lib.callbacks.H5D_iterate_t; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5D { private static final String H5_FILE = "test.h5"; private static final int DIM_X = 4; private static final int DIM_Y = 6; private static final int RANK = 2; int H5fid = -1; int H5dsid = -1; int H5dtid = -1; int H5did = -1; int H5did0 = -1; int H5dcpl_id = -1; long[] H5dims = { DIM_X, DIM_Y }; // Values for the status of space allocation enum H5D_space_status { H5D_SPACE_STATUS_ERROR(-1), H5D_SPACE_STATUS_NOT_ALLOCATED(0), H5D_SPACE_STATUS_PART_ALLOCATED( 1), H5D_SPACE_STATUS_ALLOCATED(2); private int code; H5D_space_status(int space_status) { this.code = space_status; } public int getCode() { return this.code; } } private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } private final void _createPDataset(int fid, int dsid, String name, int dcpl_val) { try { H5dcpl_id = H5.H5Pcreate(dcpl_val); } catch (Exception err) { err.printStackTrace(); fail("H5.H5Pcreate: " + err); } assertTrue("testH5D._createPDataset: H5.H5Pcreate: ", H5dcpl_id > 0); // Set the allocation time to "early". This way we can be sure // that reading from the dataset immediately after creation will // return the fill value. try { H5.H5Pset_alloc_time(H5dcpl_id, HDF5Constants.H5D_ALLOC_TIME_EARLY); } catch (Exception e) { e.printStackTrace(); } try { H5did0 = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, H5dcpl_id, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D._createPDataset: ", H5did0 > 0); } private final void _createDataset(int fid, int dsid, String name, int dapl) { try { H5did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D._createDataset: ", H5did > 0); } private final void _createVLDataset(int fid, int dsid, String name, int dapl) { try { H5dtid = H5.H5Tcopy(HDF5Constants.H5T_C_S1); H5.H5Tset_size(H5dtid, HDF5Constants.H5T_VARIABLE); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Tcopy: " + err); } assertTrue("TestH5D._createVLDataset: ", H5dtid > 0); try { H5did = H5.H5Dcreate(fid, name, H5dtid, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D._createVLDataset: ", H5did > 0); } private final void _closeH5file() throws HDF5LibraryException { if (H5dcpl_id >= 0) try {H5.H5Pclose(H5dcpl_id);} catch (Exception ex) {} if (H5did0 >= 0) try {H5.H5Dclose(H5did0);} catch (Exception ex) {} if (H5did >= 0) try {H5.H5Dclose(H5did);} catch (Exception ex) {} if (H5dtid > 0) try {H5.H5Tclose(H5dtid);} catch (Exception ex) {} if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } private final void _openH5file(String name, int dapl) { try { H5fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5did = H5.H5Dopen(H5fid, name, dapl); H5dsid = H5.H5Dget_space(H5did); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D._openH5file: " + err); } assertTrue("TestH5D._openH5file: H5.H5Fopen: ",H5fid > 0); assertTrue("TestH5D._openH5file: H5.H5Screate_simple: ",H5dsid > 0); } @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5dsid = H5.H5Screate_simple(RANK, H5dims, null); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } assertTrue("TestH5D.createH5file: H5.H5Fcreate: ",H5fid > 0); assertTrue("TestH5D.createH5file: H5.H5Screate_simple: ",H5dsid > 0); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5dcpl_id >= 0) try {H5.H5Pclose(H5dcpl_id);} catch (Exception ex) {} if (H5did0 >= 0) try {H5.H5Dclose(H5did0);} catch (Exception ex) {} if (H5did >= 0) try {H5.H5Dclose(H5did);} catch (Exception ex) {} if (H5dtid > 0) try {H5.H5Tclose(H5dtid);} catch (Exception ex) {} if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} _deleteFile(H5_FILE); } @Test public void testH5Dcreate() { int dataset_id = -1; try { dataset_id = H5.H5Dcreate(H5fid, "dset", HDF5Constants.H5T_STD_I32BE, H5dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Exception err) { err.printStackTrace(); fail("testH5Dcreate: " + err); } assertTrue(dataset_id > 0); // End access to the dataset and release resources used by it. try { if (dataset_id >= 0) H5.H5Dclose(dataset_id); } catch (Exception err) { err.printStackTrace(); } } @Test public void testH5Dcreate_anon() { int dataset_id = -1; try { dataset_id = H5.H5Dcreate_anon(H5fid, HDF5Constants.H5T_STD_I32BE, H5dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Exception err) { err.printStackTrace(); fail("testH5Dcreate_anon: " + err); } assertTrue(dataset_id > 0); // End access to the dataset and release resources used by it. try { if (dataset_id >= 0) H5.H5Dclose(dataset_id); } catch (Exception err) { err.printStackTrace(); } } @Test public void testH5Dopen() { int dataset_id = -1; _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); try { H5.H5Dclose(H5did); H5did = -1; dataset_id = H5.H5Dopen(H5fid, "dset", HDF5Constants.H5P_DEFAULT); } catch (Exception err) { err.printStackTrace(); fail("testH5Dopen: " + err); } assertTrue("testH5Dopen: ", dataset_id > 0); // End access to the dataset and release resources used by it. try { if (dataset_id >= 0) H5.H5Dclose(dataset_id); } catch (Exception err) { err.printStackTrace(); } } @Test public void testH5Dget_storage_size_empty() { long storage_size = 0; _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); try { storage_size = H5.H5Dget_storage_size(H5did); } catch (Exception err) { err.printStackTrace(); fail("testH5Dget_storage_size: " + err); } assertTrue("testH5Dget_storage_size: ", storage_size == 0); } @Test public void testH5Dget_storage_size() { long storage_size = 0; int[][] dset_data = new int[DIM_X][DIM_Y]; int FILLVAL = 99; _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); // Initialize the dataset. for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) dset_data[indx][jndx] = FILLVAL; try { if (H5did >= 0) H5.H5Dwrite(H5did, HDF5Constants.H5T_NATIVE_INT, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, dset_data[0]); } catch (Exception e) { e.printStackTrace(); } try { storage_size = H5.H5Dget_storage_size(H5did); } catch (Exception err) { err.printStackTrace(); fail("testH5Dget_storage_size: " + err); } assertTrue("testH5Dget_storage_size: "+storage_size, storage_size == DIM_X*DIM_Y*4); } @Test public void testH5Dget_access_plist() { int dapl_id = -1; int pequal = -1; int test_dapl_id = -1; try { test_dapl_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_ACCESS); } catch (Exception err) { err.printStackTrace(); fail("testH5Dget_access_plist: H5.H5Pcreate: " + err); } assertTrue("testH5Dget_access_plist: test_dapl_id: ", test_dapl_id > 0); _createDataset(H5fid, H5dsid, "dset", test_dapl_id); try { dapl_id = H5.H5Dget_access_plist(H5did); assertTrue("testH5Dget_access_plist: dapl_id: ", dapl_id > 0); pequal = H5.H5Pequal(dapl_id, test_dapl_id); } catch (Exception err) { err.printStackTrace(); fail("testH5Dget_access_plist: H5.H5Dget_access_plist: " + err); } // End access to the dataset and release resources used by it. try { if (dapl_id >= 0) H5.H5Pclose(dapl_id); } catch (Exception err) { err.printStackTrace(); } try { if (test_dapl_id >= 0) H5.H5Pclose(test_dapl_id); } catch (Exception err) { err.printStackTrace(); } assertTrue("testH5Dget_access_plist: ", pequal > 0); } @Test public void testH5Dget_space_status() { int[][] write_dset_data = new int[DIM_X][DIM_Y]; int[] space_status = new int[1]; int[] space_status0 = new int[1]; // Initialize the dataset. for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) write_dset_data[indx][jndx] = indx * jndx - jndx; _createPDataset(H5fid, H5dsid, "dset0", HDF5Constants.H5P_DATASET_CREATE); _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); // Retrieve and print space status and storage size for dset0. try { H5.H5Dget_space_status(H5did0, space_status0); } catch (Exception e) { e.printStackTrace(); } assertTrue("testH5Dget_space_status0 - H5.H5Dget_space_status: ", space_status0[0] == H5D_space_status.H5D_SPACE_STATUS_ALLOCATED.getCode()); // Retrieve and print space status and storage size for dset. try { H5.H5Dget_space_status(H5did, space_status); } catch (Exception e) { e.printStackTrace(); } assertFalse("testH5Dget_space_status - H5.H5Dget_space_status: ", space_status[0] == H5D_space_status.H5D_SPACE_STATUS_ALLOCATED.getCode()); // Write the data to the dataset. try { H5.H5Dwrite(H5did, HDF5Constants.H5T_NATIVE_INT, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, write_dset_data); } catch (Exception e) { e.printStackTrace(); } // Retrieve and print space status and storage size for dset. try { H5.H5Dget_space_status(H5did, space_status); } catch (Exception e) { e.printStackTrace(); } assertTrue("testH5Dget_space_status - H5.H5Dget_space_status: ", space_status[0] == H5D_space_status.H5D_SPACE_STATUS_ALLOCATED.getCode()); } @Test(expected = HDF5LibraryException.class) public void testH5Dget_space_closed() throws Throwable { int dataset_id = -1; try { dataset_id = H5.H5Dcreate(H5fid, "dset", HDF5Constants.H5T_STD_I32BE, H5dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D.testH5Dget_space_closed: ", dataset_id > 0); H5.H5Dclose(dataset_id); H5.H5Dget_space(dataset_id); } @Test public void testH5Dget_space() { int dataspace_id = -1; _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); try { dataspace_id = H5.H5Dget_space(H5did); } catch (Exception err) { err.printStackTrace(); fail("H5.H5Dget_space: " + err); } assertTrue("TestH5D.testH5Dget_space: ", dataspace_id > 0); // End access to the dataspace and release resources used by it. try { if (dataspace_id >= 0) H5.H5Sclose(dataspace_id); } catch (Exception err) { err.printStackTrace(); } } @Test(expected = HDF5LibraryException.class) public void testH5Dget_type_closed() throws Throwable { int dataset_id = -1; try { dataset_id = H5.H5Dcreate(H5fid, "dset", HDF5Constants.H5T_STD_I32BE, H5dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D.testH5Dget_type_closed: ", dataset_id > 0); H5.H5Dclose(dataset_id); H5.H5Dget_type(dataset_id); } @Test public void testH5Dget_type() { int datatype_id = -1; _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); try { datatype_id = H5.H5Dget_type(H5did); } catch (Exception err) { err.printStackTrace(); fail("H5.H5Dget_type: " + err); } assertTrue("TestH5D.testH5Dget_type: ", datatype_id > 0); // End access to the datatype and release resources used by it. try { if (datatype_id >= 0) H5.H5Tclose(datatype_id); } catch (Exception err) { err.printStackTrace(); } } @Test public void testH5Dget_offset() { int[][] write_dset_data = new int[DIM_X][DIM_Y]; long dset_address = 0; _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); try { // Test dataset address. Should be undefined. dset_address = H5.H5Dget_offset(H5did); } catch (HDF5LibraryException hdfex) { ; } catch (Exception err) { err.printStackTrace(); fail("H5.H5Dget_offset: " + err); } // Write the data to the dataset. try { H5.H5Dwrite(H5did, HDF5Constants.H5T_NATIVE_INT, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, write_dset_data); } catch (Exception e) { e.printStackTrace(); } try { // Test dataset address. dset_address = H5.H5Dget_offset(H5did); } catch (Exception err) { err.printStackTrace(); fail("H5.H5Dget_offset: " + err); } assertTrue("TestH5D.testH5Dget_offset: ", dset_address > 0); } @Test public void testH5Dfill_null() { int[] buf_data = new int[DIM_X*DIM_Y]; // Initialize memory buffer for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) { buf_data[(indx * DIM_Y) + jndx] = indx * jndx - jndx; } byte[] buf_array = HDFNativeData.intToByte(0, DIM_X*DIM_Y, buf_data); // Fill selection in memory try { H5.H5Dfill(null, HDF5Constants.H5T_NATIVE_UINT, buf_array, HDF5Constants.H5T_NATIVE_UINT, H5dsid); } catch (Exception err) { err.printStackTrace(); fail("H5.H5Dfill: " + err); } buf_data = HDFNativeData.byteToInt(buf_array); // Verify memory buffer the hard way for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) assertTrue("H5.H5Dfill: [" + indx+","+jndx + "] ", buf_data[(indx * DIM_Y) + jndx] == 0); } @Test public void testH5Dfill() { int[] buf_data = new int[DIM_X*DIM_Y]; byte[] fill_value = HDFNativeData.intToByte(254); // Initialize memory buffer for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) { buf_data[(indx * DIM_Y) + jndx] = indx * jndx - jndx; } byte[] buf_array = HDFNativeData.intToByte(0, DIM_X*DIM_Y, buf_data); // Fill selection in memory try { H5.H5Dfill(fill_value, HDF5Constants.H5T_NATIVE_UINT, buf_array, HDF5Constants.H5T_NATIVE_UINT, H5dsid); } catch (Exception err) { err.printStackTrace(); fail("H5.H5Dfill: " + err); } buf_data = HDFNativeData.byteToInt(buf_array); // Verify memory buffer the hard way for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) assertTrue("H5.H5Dfill: [" + indx+","+jndx + "] ", buf_data[(indx * DIM_Y) + jndx] == 254); } @Test public void testH5Diterate() { final int SPACE_RANK = 2; final int SPACE_FILL = 254; class H5D_iter_data implements H5D_iterate_t { public int fill_value; /* The fill value to check */ public long fill_curr_coord; /* Current coordinate to examine */ public long[] fill_coords; /* Pointer to selection's coordinates */ } H5D_iterate_t iter_data = new H5D_iter_data(); class H5D_iter_callback implements H5D_iterate_cb { public int callback(byte[] elem_buf, int elem_id, int ndim, long[] point, H5D_iterate_t op_data) { //Check value in current buffer location int element = HDFNativeData.byteToInt(elem_buf, 0); if(element != ((H5D_iter_data)op_data).fill_value) return -1; //Check number of dimensions if(ndim != SPACE_RANK) return(-1); //Check Coordinates long[] fill_coords = new long[2]; fill_coords[0] = ((H5D_iter_data)op_data).fill_coords[(int) (2 * ((H5D_iter_data)op_data).fill_curr_coord)]; fill_coords[1] = ((H5D_iter_data)op_data).fill_coords[(int) (2 * ((H5D_iter_data)op_data).fill_curr_coord) + 1]; ((H5D_iter_data)op_data).fill_curr_coord++; if(fill_coords[0] != point[0]) return(-1); if(fill_coords[1] != point[1]) return(-1); return(0); } } int[] buf_data = new int[DIM_X*DIM_Y]; byte[] fill_value = HDFNativeData.intToByte(SPACE_FILL); // Initialize memory buffer for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) { buf_data[(indx * DIM_Y) + jndx] = indx * jndx - jndx; } byte[] buf_array = HDFNativeData.intToByte(0, DIM_X*DIM_Y, buf_data); // Fill selection in memory try { H5.H5Dfill(fill_value, HDF5Constants.H5T_NATIVE_UINT, buf_array, HDF5Constants.H5T_NATIVE_UINT, H5dsid); } catch (Exception err) { err.printStackTrace(); fail("H5.H5Diterate: " + err); } // Initialize the iterator structure ((H5D_iter_data)iter_data).fill_value = SPACE_FILL; ((H5D_iter_data)iter_data).fill_curr_coord = 0; // Set the coordinates of the selection ((H5D_iter_data)iter_data).fill_coords = new long[DIM_X*DIM_Y*SPACE_RANK]; /* Coordinates of selection */ for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) { ((H5D_iter_data)iter_data).fill_coords[2*(indx * DIM_Y + jndx)] = indx; ((H5D_iter_data)iter_data).fill_coords[2*(indx * DIM_Y + jndx) + 1] = jndx; } /* end for */ // Iterate through selection, verifying correct data H5D_iterate_cb iter_cb = new H5D_iter_callback(); int op_status = -1; try { op_status = H5.H5Diterate(buf_array, HDF5Constants.H5T_NATIVE_UINT, H5dsid, iter_cb, iter_data); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Diterate: " + err); } assertTrue("H5Diterate ", op_status == 0); } @Test public void testH5Diterate_write() { final int SPACE_RANK = 2; final int SPACE_FILL = 254; class H5D_iter_data implements H5D_iterate_t { public int fill_value; /* The fill value to check */ public long fill_curr_coord; /* Current coordinate to examine */ public long[] fill_coords; /* Pointer to selection's coordinates */ } H5D_iterate_t iter_data = new H5D_iter_data(); class H5D_iter_callback implements H5D_iterate_cb { public int callback(byte[] elem_buf, int elem_id, int ndim, long[] point, H5D_iterate_t op_data) { //Check value in current buffer location int element = HDFNativeData.byteToInt(elem_buf, 0); if(element != ((H5D_iter_data)op_data).fill_value) return -1; //Check number of dimensions if(ndim != SPACE_RANK) return(-1); //Check Coordinates long[] fill_coords = new long[2]; fill_coords[0] = ((H5D_iter_data)op_data).fill_coords[(int) (2 * ((H5D_iter_data)op_data).fill_curr_coord)]; fill_coords[1] = ((H5D_iter_data)op_data).fill_coords[(int) (2 * ((H5D_iter_data)op_data).fill_curr_coord) + 1]; ((H5D_iter_data)op_data).fill_curr_coord++; if(fill_coords[0] != point[0]) return(-1); if(fill_coords[1] != point[1]) return(-1); element -= 128; byte[] new_elembuf = HDFNativeData.intToByte(element); elem_buf[0] = new_elembuf[0]; elem_buf[1] = new_elembuf[1]; elem_buf[2] = new_elembuf[2]; elem_buf[3] = new_elembuf[3]; return(0); } } int[] buf_data = new int[DIM_X*DIM_Y]; byte[] fill_value = HDFNativeData.intToByte(SPACE_FILL); // Initialize memory buffer for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) { buf_data[(indx * DIM_Y) + jndx] = indx * jndx - jndx; } byte[] buf_array = HDFNativeData.intToByte(0, DIM_X*DIM_Y, buf_data); // Fill selection in memory try { H5.H5Dfill(fill_value, HDF5Constants.H5T_NATIVE_UINT, buf_array, HDF5Constants.H5T_NATIVE_UINT, H5dsid); } catch (Exception err) { err.printStackTrace(); fail("H5.H5Diterate: " + err); } // Initialize the iterator structure ((H5D_iter_data)iter_data).fill_value = SPACE_FILL; ((H5D_iter_data)iter_data).fill_curr_coord = 0; // Set the coordinates of the selection ((H5D_iter_data)iter_data).fill_coords = new long[DIM_X*DIM_Y*SPACE_RANK]; /* Coordinates of selection */ for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) { ((H5D_iter_data)iter_data).fill_coords[2*(indx * DIM_Y + jndx)] = indx; ((H5D_iter_data)iter_data).fill_coords[2*(indx * DIM_Y + jndx) + 1] = jndx; } /* end for */ // Iterate through selection, verifying correct data H5D_iterate_cb iter_cb = new H5D_iter_callback(); int op_status = -1; try { op_status = H5.H5Diterate(buf_array, HDF5Constants.H5T_NATIVE_UINT, H5dsid, iter_cb, iter_data); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Diterate: " + err); } assertTrue("H5Diterate ", op_status == 0); buf_data = HDFNativeData.byteToInt(buf_array); // Verify memory buffer the hard way for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) assertTrue("H5.H5Diterate: [" + indx+","+jndx + "] "+buf_data[(indx * DIM_Y) + jndx], buf_data[(indx * DIM_Y) + jndx] == 126); } @Test public void testH5Dvlen_get_buf_size() { String[] str_data = { "Parting", "is such", "sweet", "sorrow.", "Testing", "one", "two", "three.", "Dog,", "man's", "best", "friend.", "Diamonds", "are", "a", "girls!", "S A", "T U R", "D A Y", "night", "That's", "all", "folks", "!!!" }; int[] size = new int[2]; long str_data_bytes = 0; for (int idx = 0; idx < str_data.length; idx++) str_data_bytes += str_data[idx].length() + 1; //Account for terminating null _createVLDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); try { if ((H5did >= 0) && (H5dtid >= 0)) H5.H5DwriteString(H5did, H5dtid, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, str_data); _closeH5file(); _openH5file("dset", HDF5Constants.H5P_DEFAULT); H5dtid = H5.H5Dget_type(H5did); } catch (Exception e) { e.printStackTrace(); } try { H5.H5Dvlen_get_buf_size(H5did, H5dtid, H5dsid, size); } catch (Exception e) { e.printStackTrace(); } assertTrue("H5Dvlen_get_buf_size "+ size[0] + " == " + str_data_bytes, size[0] == str_data_bytes); } @Test public void testH5Dvlen_get_buf_size_long() { String[] str_data = { "Parting", "is such", "sweet", "sorrow.", "Testing", "one", "two", "three.", "Dog,", "man's", "best", "friend.", "Diamonds", "are", "a", "girls!", "S A", "T U R", "D A Y", "night", "That's", "all", "folks", "!!!" }; long vl_size = -1; /* Number of bytes used */ long str_data_bytes = 0; for (int idx = 0; idx < str_data.length; idx++) str_data_bytes += str_data[idx].length() + 1; //Account for terminating null _createVLDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); try { if ((H5did >= 0) && (H5dtid >= 0)) H5.H5DwriteString(H5did, H5dtid, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, str_data); } catch (Exception e) { e.printStackTrace(); } try { vl_size = H5.H5Dvlen_get_buf_size_long(H5did, H5dtid, H5dsid); } catch (Exception e) { e.printStackTrace(); } assertTrue("H5Dvlen_get_buf_size_long " + vl_size + " == " + str_data_bytes, vl_size == str_data_bytes); } @Test(expected = IllegalArgumentException.class) public void testH5Dvlen_read_invalid_buffer() throws Throwable { String[] str_data = { "Parting", "is such", "sweet", "sorrow.", "Testing", "one", "two", "three.", "Dog,", "man's", "best", "friend.", "Diamonds", "are", "a", "girls!", "S A", "T U R", "D A Y", "night", "That's", "all", "folks", "!!!" }; byte[] read_data = new byte[512]; _createVLDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); try { H5.H5DwriteString(H5did, H5dtid, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, str_data); } catch (Exception e) { e.printStackTrace(); } H5.H5Dread(H5did, H5dtid, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, read_data); } } jhdf-2.9/test/hdf5lib/TestH5G.java0000644000175000017500000003614512050301057017545 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5G_info_t; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5G { private static final String H5_FILE = "test.h5"; private static final String H5_FILE2 = "test2.h5"; private static final String[] GROUPS = { "/G1", "/G1/G11", "/G1/G12", "/G1/G11/G111", "/G1/G11/G112", "/G1/G11/G113", "/G1/G11/G114" }; private static final String[] GROUPS2 = { "/G1", "/G1/G14", "/G1/G12", "/G1/G13", "/G1/G11"}; int H5fid = -1; int H5fid2 = -1; private final int _createGroup(int fid, String name) { int gid = -1; try { gid = H5.H5Gcreate(fid, name, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gcreate: " + err); } return gid; } private final int _createGroup2(int fid, String name) { int gid = -1; int gcpl = -1; try{ gcpl = H5.H5Pcreate(HDF5Constants.H5P_GROUP_CREATE); //create gcpl if (gcpl >= 0) { H5.H5Pset_link_creation_order(gcpl, HDF5Constants.H5P_CRT_ORDER_TRACKED + HDF5Constants.H5P_CRT_ORDER_INDEXED);//Set link creation order } } catch (final Exception ex) { fail("H5.H5Pcreate() failed. " + ex); } try { gid = H5.H5Gcreate(fid, name, HDF5Constants.H5P_DEFAULT, gcpl, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gcreate: " + err); } try {H5.H5Pclose(gcpl);} catch (final Exception ex) {} return gid; } private final int _openGroup(int fid, String name) { int gid = -1; try { gid = H5.H5Gopen(fid, name, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { gid = -1; err.printStackTrace(); fail("H5.H5Gopen: " + err); } return gid; } private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } @Before public void createH5file() throws HDF5LibraryException, NullPointerException { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5fid2 = H5.H5Fcreate(H5_FILE2, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); int gid = -1; for (int i = 0; i < GROUPS.length; i++) { gid = _createGroup(H5fid, GROUPS[i]); assertTrue(gid > 0); try {H5.H5Gclose(gid);} catch (Exception ex) {} } for (int i = 0; i < GROUPS2.length; i++) { gid = _createGroup2(H5fid2, GROUPS2[i]); assertTrue(gid > 0); try {H5.H5Gclose(gid);} catch (Exception ex) {} } H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); H5.H5Fflush(H5fid2, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5fid > 0) { try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } if (H5fid2 > 0) { try {H5.H5Fclose(H5fid2);} catch (Exception ex) {} } _deleteFile(H5_FILE); _deleteFile(H5_FILE2); } @Test public void testH5Gopen() { for (int i = 0; i < GROUPS.length; i++) { int gid = _openGroup(H5fid, GROUPS[i]); assertTrue(gid > 0); try { H5.H5Gclose(gid); } catch (Exception ex) { } } } @Test public void testH5Gget_create_plist() { int gid = -1; int pid = -1; for (int i = 0; i < GROUPS.length; i++) { gid = _openGroup(H5fid, GROUPS[i]); assertTrue(gid > 0); try { pid = H5.H5Gget_create_plist(gid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_create_plist: " + err); } assertTrue(pid > 0); try { H5.H5Gclose(gid); } catch (Exception ex) { } } } @Test public void testH5Gget_info() { H5G_info_t info = null; for (int i = 0; i < GROUPS.length; i++) { try { info = H5.H5Gget_info(H5fid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info: " + err); } assertNotNull(info); } } @Test public void testH5Gget_info_by_name() { H5G_info_t info = null; for (int i = 0; i < GROUPS.length; i++) { try { info = H5.H5Gget_info_by_name(H5fid, GROUPS[i], HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info_by_name: " + err); } assertNotNull(info); } } @Test public void testH5Gget_info_by_idx() { H5G_info_t info = null; for (int i = 0; i < 2; i++) { try { info = H5.H5Gget_info_by_idx(H5fid, "/G1", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, i, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info_by_idx: " + err); } assertNotNull(info); } } @Test public void testH5Gget_obj_info_all() { H5G_info_t info = null; int gid = _openGroup(H5fid, GROUPS[0]); try { info = H5.H5Gget_info(gid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info: " + err); } try { H5.H5Gclose(gid); } catch (Exception ex) { } assertNotNull(info); assertTrue("number of links is empty", info.nlinks > 0); String objNames[] = new String[(int) info.nlinks]; int objTypes[] = new int[(int) info.nlinks]; int lnkTypes[] = new int[(int) info.nlinks]; long objRefs[] = new long[(int) info.nlinks]; int names_found = 0; try { names_found = H5.H5Gget_obj_info_all(H5fid, GROUPS[0], objNames, objTypes, lnkTypes, objRefs, HDF5Constants.H5_INDEX_NAME); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_obj_info_all: " + err); } assertTrue("number found[" + names_found + "] different than expected[" + objNames.length + "]", names_found == objNames.length); for (int i = 0; i < objNames.length; i++) { assertNotNull("name #" + i + " does not exist", objNames[i]); assertTrue(objNames[i].length() > 0); } } @Test public void testH5Gget_obj_info_all_gid() { H5G_info_t info = null; int gid = _openGroup(H5fid, GROUPS[0]); try { info = H5.H5Gget_info(gid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info: " + err); } assertNotNull(info); assertTrue("number of links is empty", info.nlinks > 0); String objNames[] = new String[(int) info.nlinks]; long objRefs[] = new long[(int) info.nlinks]; int lnkTypes[] = new int[(int) info.nlinks]; int objTypes[] = new int[(int) info.nlinks]; int names_found = 0; try { names_found = H5.H5Gget_obj_info_all(gid, null, objNames, objTypes, lnkTypes, objRefs, HDF5Constants.H5_INDEX_NAME); } catch (Throwable err) { try { H5.H5Gclose(gid); } catch (Exception ex) { } err.printStackTrace(); fail("H5.H5Gget_obj_info_all: " + err); } try { H5.H5Gclose(gid); } catch (Exception ex) { } assertTrue("number found[" + names_found + "] different than expected[" + objNames.length + "]", names_found == objNames.length); for (int i = 0; i < objNames.length; i++) { assertNotNull("name #" + i + " does not exist", objNames[i]); assertTrue(objNames[i].length() > 0); } } @Test public void testH5Gget_obj_info_all_gid2() { H5G_info_t info = null; int gid = _openGroup(H5fid, GROUPS[1]); try { info = H5.H5Gget_info(gid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info: " + err); } assertNotNull(info); assertTrue("number of links is empty", info.nlinks > 0); String objNames[] = new String[(int) info.nlinks]; long objRefs[] = new long[(int) info.nlinks]; int lnkTypes[] = new int[(int) info.nlinks]; int objTypes[] = new int[(int) info.nlinks]; int names_found = 0; try { names_found = H5.H5Gget_obj_info_all(gid, null, objNames, objTypes, lnkTypes, objRefs, HDF5Constants.H5_INDEX_NAME); } catch (Throwable err) { try { H5.H5Gclose(gid); } catch (Exception ex) { } err.printStackTrace(); fail("H5.H5Gget_obj_info_all: " + err); } try { H5.H5Gclose(gid); } catch (Exception ex) { } assertTrue("number found[" + names_found + "] different than expected[" + objNames.length + "]", names_found == objNames.length); for (int i = 0; i < objNames.length; i++) { assertNotNull("name #" + i + " does not exist", objNames[i]); assertTrue(objNames[i].length() > 0); } } @Test public void testH5Gget_obj_info_max() { int gid = _openGroup(H5fid, GROUPS[0]); int groups_max_size = GROUPS.length + 1; String objNames[] = new String[groups_max_size]; int objTypes[] = new int[groups_max_size]; int lnkTypes[] = new int[groups_max_size]; long objRefs[] = new long[groups_max_size]; int names_found = 0; try { names_found = H5.H5Gget_obj_info_max(gid, objNames, objTypes, lnkTypes, objRefs, groups_max_size); } catch (Throwable err) { try { H5.H5Gclose(gid); } catch (Exception ex) { } err.printStackTrace(); fail("H5.H5Gget_obj_info_max: " + err); } try { H5.H5Gclose(gid); } catch (Exception ex) { } // expected number does not include root group assertTrue("number found[" + names_found + "] different than expected[" + (GROUPS.length - 1) + "]", names_found == (GROUPS.length - 1)); for (int i = 0; i < GROUPS.length-1; i++) { assertNotNull("name #"+i+" does not exist",objNames[i]); assertTrue(objNames[i].length()>0); } } @Test public void testH5Gget_obj_info_max_limit() { int gid = _openGroup(H5fid, GROUPS[0]); int groups_max_size = GROUPS.length - 3; String objNames[] = new String[groups_max_size]; int objTypes[] = new int[groups_max_size]; int lnkTypes[] = new int[groups_max_size]; long objRefs[] = new long[groups_max_size]; int names_found = 0; try { names_found = H5.H5Gget_obj_info_max(gid, objNames, objTypes, lnkTypes, objRefs, groups_max_size); } catch (Throwable err) { try { H5.H5Gclose(gid); } catch (Exception ex) { } err.printStackTrace(); fail("H5.H5Gget_obj_info_max: " + err); } try { H5.H5Gclose(gid); } catch (Exception ex) { } assertTrue("number found[" + names_found + "] different than expected[" + groups_max_size + "]", names_found == groups_max_size); for (int i = 0; i < objNames.length; i++) { assertNotNull("name #" + i + " does not exist", objNames[i]); assertTrue(objNames[i].length() > 0); } } @Test public void testH5Gget_obj_info_all_byIndexType() { H5G_info_t info = null; int gid = _openGroup(H5fid2, GROUPS2[0]); try { info = H5.H5Gget_info(gid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_info: " + err); } try { H5.H5Gclose(gid); } catch (Exception ex) { } assertNotNull(info); assertTrue("number of links is empty", info.nlinks > 0); String objNames[] = new String[(int) info.nlinks]; int objTypes[] = new int[(int) info.nlinks]; int lnkTypes[] = new int[(int) info.nlinks]; long objRefs[] = new long[(int) info.nlinks]; try { H5.H5Gget_obj_info_all(H5fid2, GROUPS2[0], objNames, objTypes, lnkTypes, objRefs, HDF5Constants.H5_INDEX_CRT_ORDER); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_obj_info_all: " + err); } assertEquals("G12",objNames[1]); assertEquals("G13", objNames[2] ); assertEquals("G11", objNames[3] ); try { H5.H5Gget_obj_info_all(H5fid2, GROUPS2[0], objNames, objTypes, lnkTypes, objRefs, HDF5Constants.H5_INDEX_NAME); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gget_obj_info_all: " + err); } assertEquals("G12",objNames[1]); assertEquals("G13", objNames[2] ); assertEquals("G14", objNames[3] ); } } jhdf-2.9/test/hdf5lib/TestH5Dparams.java0000644000175000017500000000713312050301057020741 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertTrue; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.Before; import org.junit.Test; public class TestH5Dparams { @Before public void checkOpenIDs() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); } @Test(expected = HDF5LibraryException.class) public void testH5Dclose_invalid() throws Throwable { H5.H5Dclose(-1); } @Test(expected = NullPointerException.class) public void testH5Dcreate_null() throws Throwable { H5.H5Dcreate(-1, null, 0, 0, 0, 0, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Dcreate_invalid() throws Throwable { H5.H5Dcreate(-1, "Bogus", -1, -1, -1, -1, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Dcreate_anon_invalid() throws Throwable { H5.H5Dcreate_anon(-1, -1, -1, -1, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Dget_access_plist_invalid() throws Throwable { H5.H5Dget_access_plist(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Dget_create_plist_invalid() throws Throwable { H5.H5Dget_create_plist(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Dget_offset_invalid() throws Throwable { H5.H5Dget_offset(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Dget_space_invalid() throws Throwable { H5.H5Dget_space(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Dget_type_invalid() throws Throwable { H5.H5Dget_type(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Dget_space_status_invalid() throws Throwable { int[] status = new int[2]; H5.H5Dget_space_status(-1, status); } @Test(expected = NullPointerException.class) public void testH5Dget_space_status_null() throws Throwable { H5.H5Dget_space_status(-1, null); } @Test(expected = HDF5LibraryException.class) public void testH5Dset_extent_status_invalid() throws Throwable { long[] size = new long[2]; H5.H5Dset_extent(-1, size); } @Test(expected = NullPointerException.class) public void testH5Dset_extent_status_null() throws Throwable { H5.H5Dset_extent(-1, null); } @Test(expected = NullPointerException.class) public void testH5Dopen_null() throws Throwable { H5.H5Dopen(-1, null, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Dopen_invalid() throws Throwable { H5.H5Dopen(-1, "Bogus", 0); } @Test(expected = HDF5LibraryException.class) public void testH5Dvlen_get_buf_size_invalid() throws Throwable { int[] size = new int[2]; H5.H5Dvlen_get_buf_size(-1, -1, -1, size); } @Test(expected = NullPointerException.class) public void testH5Dvlen_get_buf_size_null() throws Throwable { H5.H5Dvlen_get_buf_size(-1, -1, -1, null); } @Test(expected = HDF5LibraryException.class) public void testH5Dvlen_reclaim_invalid() throws Throwable { byte[] buf = new byte[2]; H5.H5Dvlen_reclaim(-1, -1, -1, buf); } @Test(expected = NullPointerException.class) public void testH5Dvlen_reclaim_null() throws Throwable { H5.H5Dvlen_reclaim(-1, -1, -1, null); } @Test(expected = IllegalArgumentException.class) public void testH5Dget_storage_size_invalid() throws Throwable { H5.H5Dget_storage_size(-1); } } jhdf-2.9/test/hdf5lib/TestH5Tbasic.java0000644000175000017500000001035312050301057020555 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.Before; import org.junit.Test; public class TestH5Tbasic { @Before public void checkOpenIDs() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); } @Test public void testH5Tcopy() { int H5strdid = -1; try { H5strdid = H5.H5Tcopy(HDF5Constants.H5T_C_S1); assertTrue("H5.H5Tcopy",H5strdid > 0); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tcopy: " + err); } finally { if (H5strdid >= 0) try {H5.H5Tclose(H5strdid);} catch (Exception ex) {} } } @Test public void testH5Tequal() { int H5strdid = -1; try { H5strdid = H5.H5Tcopy(HDF5Constants.H5T_C_S1); assertTrue("H5.H5Tcopy",H5strdid > 0); boolean teq = H5.H5Tequal(HDF5Constants.H5T_C_S1, H5strdid); assertTrue("H5.H5Tequal",teq); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tequal: " + err); } finally { if (H5strdid >= 0) try {H5.H5Tclose(H5strdid);} catch (Exception ex) {} } } @Test public void testH5Tequal_not() { int H5strdid = -1; try { H5strdid = H5.H5Tcopy(HDF5Constants.H5T_STD_U64LE); assertTrue("H5.H5Tcopy",H5strdid > 0); boolean teq = H5.H5Tequal(HDF5Constants.H5T_IEEE_F32BE, H5strdid); assertFalse("H5.H5Tequal",teq); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tequal_not: " + err); } finally { if (H5strdid >= 0) try {H5.H5Tclose(H5strdid);} catch (Exception ex) {} } } @Test public void testH5Tconvert() { String[] strs = {"a1234","b1234"}; int srcLen = 5; int dstLen = 10; int srcId = -1; int dstId = -1; int dimSize = strs.length; byte[] buf = new byte[dimSize*dstLen]; for (int i=0; i 0); H5.H5Tset_size(H5strdid, (long)5); assertTrue(HDF5Constants.H5T_ORDER_NONE == H5.H5Tget_order(H5strdid)); H5.H5Tset_order(H5strdid, HDF5Constants.H5T_ORDER_NONE); assertTrue(HDF5Constants.H5T_ORDER_NONE == H5.H5Tget_order(H5strdid)); assertTrue(5 == H5.H5Tget_size(H5strdid)); // Variable length string H5.H5Tset_size(H5strdid, HDF5Constants.H5T_VARIABLE); H5.H5Tset_order(H5strdid, HDF5Constants.H5T_ORDER_BE); assertTrue(HDF5Constants.H5T_ORDER_BE == H5.H5Tget_order(H5strdid)); } catch (Throwable err) { err.printStackTrace(); fail("testH5Torder: " + err); } finally { if (H5strdid >= 0) try {H5.H5Tclose(H5strdid);} catch (Exception ex) {} } } } jhdf-2.9/test/hdf5lib/TestH5Eregister.java0000644000175000017500000000302212050301057021274 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import ncsa.hdf.hdf5lib.H5; import org.junit.Before; import org.junit.Test; public class TestH5Eregister { @Before public void checkOpenIDs() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); } @Test(expected = NullPointerException.class) public void testH5Eregister_class_cls_name_null() throws Throwable { H5.H5Eregister_class(null, "libname", "version"); } @Test(expected = NullPointerException.class) public void testH5Eregister_class_lib_name_null() throws Throwable { H5.H5Eregister_class("clsname", null, "version"); } @Test(expected = NullPointerException.class) public void testH5Eregister_class_version_null() throws Throwable { H5.H5Eregister_class("clsname", "libname", null); } @Test(expected = IllegalArgumentException.class) public void testH5Eunregister_class_invalid_classid() throws Throwable { H5.H5Eunregister_class(-1); } @Test public void testH5Eregister_class() { int hdf_java_classid = -1; try { hdf_java_classid = H5.H5Eregister_class("HDF-Java-Error", "hdf-java", "2.5"); } catch (Throwable err) { fail("H5.H5Eregister_class: " + err); } try { H5.H5Eunregister_class(hdf_java_classid); } catch (Throwable err) { fail("H5.H5Eunregister_class: " + err); } } } jhdf-2.9/test/hdf5lib/TestH5Oparams.java0000644000175000017500000000776612050301057020770 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertTrue; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.Before; import org.junit.Test; public class TestH5Oparams { @Before public void checkOpenIDs() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); } @Test(expected = HDF5LibraryException.class) public void testH5Oclose_invalid() throws Throwable { H5.H5Oclose(-1); } @Test(expected = NullPointerException.class) public void testH5Oopen_null() throws Throwable { H5.H5Oopen(-1, null, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Oopen_invalid() throws Throwable { H5.H5Oopen(-1, "Bogus", 0); } @Test(expected = HDF5LibraryException.class) public void testH5Ocopy_invalid() throws Throwable { H5.H5Ocopy(-1, "Bogus", -1, "Bogus", -1, -1); } @Test(expected = NullPointerException.class) public void testH5Ocopy_null_current() throws Throwable { H5.H5Ocopy(-1, null, 0, "Bogus", 0, 0); } @Test(expected = NullPointerException.class) public void testH5Ocopy_null_dest() throws Throwable { H5.H5Ocopy(-1, "Bogus", 0, null, 0, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_invalid() throws Throwable { H5.H5Oget_info(-1); } @Test(expected = NullPointerException.class) public void testH5Oget_info_by_name_null() throws Throwable { H5.H5Oget_info_by_name(-1, null, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_by_name_invalid() throws Throwable { H5.H5Oget_info_by_name(-1, "/testH5Gcreate", HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_by_idx_invalid() throws Throwable { H5.H5Oget_info_by_idx(-1, "Bogus", -1, -1, -1L, -1); } @Test(expected = NullPointerException.class) public void testH5Oget_info_by_idx_null() throws Throwable { H5.H5Oget_info_by_idx(-1, null, 0, 0, 0L, 0); } @Test(expected = HDF5LibraryException.class) public void testH5Olink_invalid() throws Throwable { H5.H5Olink(-1, -1, "Bogus", -1, -1); } @Test(expected = NullPointerException.class) public void testH5Olink_null_dest() throws Throwable { H5.H5Olink(-1, 0, null, 0, 0); } @Test(expected = NullPointerException.class) public void testH5Ovisit_null() throws Throwable { H5.H5Ovisit(-1, -1, -1, null, null); } @Test(expected = NullPointerException.class) public void testH5Ovisit_by_name_nullname() throws Throwable { H5.H5Ovisit_by_name(-1, null, -1, -1, null, null, -1); } @Test(expected = NullPointerException.class) public void testH5Ovisit_by_name_null() throws Throwable { H5.H5Ovisit_by_name(-1, "Bogus", -1, -1, null, null, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Oset_comment_invalid() throws Throwable { H5.H5Oset_comment(-1, "Bogus"); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_comment_invalid() throws Throwable { H5.H5Oget_comment(-1); } @Test(expected = HDF5LibraryException.class) public void testH5Oset_comment_by_name_invalid() throws Throwable { H5.H5Oset_comment_by_name(-1, "Bogus", null, -1); } @Test(expected = NullPointerException.class) public void testH5Oset_comment_by_name_null() throws Throwable { H5.H5Oset_comment_by_name(-1, null, null, -1); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_comment_by_name_invalid() throws Throwable { H5.H5Oget_comment_by_name(-1, "Bogus", -1); } @Test(expected = NullPointerException.class) public void testH5Oget_comment_by_name_null() throws Throwable { H5.H5Oget_comment_by_name(-1, null, -1); } } jhdf-2.9/test/hdf5lib/TestH5A.java0000644000175000017500000007656212050301057017546 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5A_info_t; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5A { private static final String H5_FILE = "test.h5"; private static final int DIM_X = 4; private static final int DIM_Y = 6; int H5fid = -1; int H5dsid = -1; int H5did = -1; long[] H5dims = { DIM_X, DIM_Y }; int type_id = -1; int space_id = -1; int lapl_id = -1; private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } private final int _createDataset(int fid, int dsid, String name, int dapl) { int did = -1; try { did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D._createDataset: ", did > 0); return did; } @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0", H5.getOpenIDCount() == 0); try { H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); assertTrue("TestH5D.createH5file: H5.H5Fcreate: ", H5fid > 0); H5dsid = H5.H5Screate_simple(2, H5dims, null); assertTrue("TestH5D.createH5file: H5.H5Screate_simple: ", H5dsid > 0); H5did = _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); assertTrue("TestH5D.createH5file: _createDataset: ", H5did > 0); space_id = H5.H5Screate(HDF5Constants.H5S_NULL); assertTrue(space_id > 0); lapl_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_ACCESS); assertTrue(lapl_id > 0); type_id = H5.H5Tenum_create(HDF5Constants.H5T_STD_I32LE); assertTrue(type_id > 0); int status = H5.H5Tenum_insert(type_id, "test", 1); assertTrue(status >= 0); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5did > 0) try {H5.H5Dclose(H5did);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} _deleteFile(H5_FILE); if (type_id > 0) try {H5.H5Tclose(type_id);} catch (Exception ex) {} if (space_id > 0) try {H5.H5Sclose(space_id);} catch (Exception ex) {} if (lapl_id > 0) try {H5.H5Pclose(lapl_id);} catch (Exception ex) {} } @Test public void testH5Acreate2() { int attr_id = -1; try { attr_id = H5.H5Acreate(H5did, "dset", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); assertTrue("testH5Acreate2", attr_id >= 0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Acreate2: " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} } } @Test(expected = HDF5LibraryException.class) public void testH5Acreate2_invalidobject() throws Throwable { H5.H5Acreate(H5dsid, "dset", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test(expected = NullPointerException.class) public void testH5Acreate2_nullname() throws Throwable { H5.H5Acreate(H5did, null, type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Aopen() { String attr_name = "dset"; int attribute_id = -1; int attr_id = -1; try { attr_id = H5.H5Acreate(H5did, attr_name, type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); // Opening the existing attribute, attr_name(Created by H5ACreate2) // attached to an object identifier. attribute_id = H5.H5Aopen(H5did, attr_name, HDF5Constants.H5P_DEFAULT); assertTrue("testH5Aopen: H5Aopen", attribute_id >= 0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aopen: " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} if (attribute_id > 0) try {H5.H5Aclose(attribute_id);} catch (Exception ex) {} } } @Test(expected = HDF5LibraryException.class) public void testH5Aopen_invalidname() throws Throwable { H5.H5Aopen(H5did, "attr_name", HDF5Constants.H5P_DEFAULT); } @Test public void testH5Aopen_by_idx() { int loc_id = H5did; String obj_name = "."; int idx_type = HDF5Constants.H5_INDEX_CRT_ORDER; int order = HDF5Constants.H5_ITER_INC; long n = 0; int attr_id = -1; int attribute_id = -1; int aapl_id = HDF5Constants.H5P_DEFAULT; try { attr_id = H5.H5Acreate(H5did, "file", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); // Opening the existing attribute, obj_name(Created by H5ACreate2) // by index, attached to an object identifier. attribute_id = H5.H5Aopen_by_idx(H5did, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT, lapl_id); assertTrue("testH5Aopen_by_idx: H5Aopen_by_idx", attribute_id >= 0); // Negative test- Error should be thrown when H5Aopen_by_idx is // called // with n=5 and we do not have 5 attributes created. try { n = 5; H5.H5Aopen_by_idx(loc_id, obj_name, idx_type, order, n, aapl_id, lapl_id); fail("Negative Test Failed:- Error not Thrown when n is invalid."); } catch (AssertionError err) { fail("H5.H5Aopen_by_idx: " + err); } catch (HDF5LibraryException err) {} // Negative test- Error should be thrown when H5Aopen_by_idx is // called // with an invalid object name(which hasn't been created). try { n = 0; obj_name = "file"; H5.H5Aopen_by_idx(loc_id, obj_name, idx_type, order, n, aapl_id, lapl_id); fail("Negative Test Failed:- Error not Thrown when attribute name is invalid."); } catch (AssertionError err) { fail("H5.H5Aopen_by_idx: " + err); } catch (HDF5LibraryException err) {} } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aopen_by_idx: " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} if (attribute_id > 0) try {H5.H5Aclose(attribute_id);} catch (Exception ex) {} } } @Test public void testH5Acreate_by_name() { String obj_name = "."; String attr_name = "DATASET"; int attribute_id = -1; boolean bool_val = false; try { attribute_id = H5.H5Acreate_by_name(H5fid, obj_name, attr_name, type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); assertTrue("testH5Acreate_by_name: H5Acreate_by_name", attribute_id >= 0); // Check if the name of attribute attached to the object specified // by loc_id and obj_name exists.It should be true. bool_val = H5.H5Aexists_by_name(H5fid, obj_name, attr_name, lapl_id); assertTrue("testH5Acreate_by_name: H5Aexists_by_name", bool_val == true); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Acreate_by_name " + err); } finally { if (attribute_id > 0) try {H5.H5Aclose(attribute_id);} catch (Exception ex) {} } } @Test public void testH5Arename() throws Throwable, HDF5LibraryException, NullPointerException { int loc_id = H5fid; String old_attr_name = "old"; String new_attr_name = "new"; int attr_id = -1; int ret_val = -1; boolean bool_val = false; try { attr_id = H5.H5Acreate(loc_id, old_attr_name, type_id, space_id, HDF5Constants.H5P_DEFAULT, lapl_id); ret_val = H5.H5Arename(loc_id, old_attr_name, new_attr_name); // Check the return value.It should be non negative. assertTrue("testH5Arename: H5Arename", ret_val >= 0); // Check if the new name of attribute attached to the object // specified by loc_id and obj_name exists.It should be true. bool_val = H5.H5Aexists(loc_id, new_attr_name); assertTrue("testH5Arename: H5Aexists", bool_val == true); // Check if the old name of attribute attached to the object // specified by loc_id and obj_name exists. It should equal false. bool_val = H5.H5Aexists(loc_id, old_attr_name); assertEquals(bool_val, false); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Arename " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} } } @Test public void testH5Arename_by_name() { int loc_id = H5fid; String obj_name = "."; String old_attr_name = "old"; String new_attr_name = "new"; int attr_id = -1; int ret_val = -1; boolean bool_val = false; try { attr_id = H5.H5Acreate_by_name(loc_id, obj_name, old_attr_name, type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); ret_val = H5.H5Arename_by_name(loc_id, obj_name, old_attr_name, new_attr_name, lapl_id); // Check the return value.It should be non negative. assertTrue("testH5Arename_by_name: H5Arename_by_name", ret_val >= 0); // Check if the new name of attribute attached to the object // specified by loc_id and obj_name exists.It should be true. bool_val = H5.H5Aexists_by_name(loc_id, obj_name, new_attr_name, lapl_id); assertTrue("testH5Arename_by_name: H5Aexists_by_name", bool_val == true); // Check if the old name of attribute attached to the object // specified by loc_id and obj_name exists. It should equal false. bool_val = H5.H5Aexists_by_name(loc_id, obj_name, old_attr_name, lapl_id); assertEquals(bool_val, false); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Arename_by_name " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} } } @Test public void testH5Aget_name_by_idx() { int loc_id = H5fid; String obj_name = "."; String attr_name = "DATASET1", attr2_name = "DATASET2"; String ret_name = null; int idx_type = HDF5Constants.H5_INDEX_NAME; int order = HDF5Constants.H5_ITER_INC; int n = 0; int attr1_id = -1; int attr2_id = -1; try { attr1_id = H5.H5Acreate_by_name(loc_id, obj_name, attr_name, type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr2_id = H5.H5Acreate_by_name(loc_id, obj_name, attr2_name, type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); // getting the 1st attribute name(n=0). ret_name = H5.H5Aget_name_by_idx(loc_id, obj_name, idx_type, order, n, lapl_id); assertFalse("H5Aget_name_by_idx ", ret_name == null); assertEquals(ret_name, attr_name); // getting the second attribute name(n=1) ret_name = H5.H5Aget_name_by_idx(loc_id, obj_name, idx_type, order, 1, lapl_id); assertFalse("H5Aget_name_by_idx ", ret_name == null); assertEquals(ret_name, attr2_name); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aget_name_by_idx " + err); } finally { if (attr1_id > 0) try {H5.H5Aclose(attr1_id);} catch (Exception ex) {} if (attr2_id > 0) try {H5.H5Aclose(attr2_id);} catch (Exception ex) {} } } @Test public void testH5Aget_storage_size() { int attr_id = -1; long attr_size = -1; try { attr_id = H5.H5Acreate(H5did, "dset", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); attr_size = H5.H5Aget_storage_size(attr_id); assertTrue("The size of attribute is :", attr_size == 0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aget_storage_size: " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} } } @Test public void testH5Aget_info() { H5A_info_t attr_info = null; int attribute_id = -1; int attr_id = -1; try { attr_id = H5.H5Acreate(H5did, "dset", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); attribute_id = H5.H5Aopen(H5did, "dset", HDF5Constants.H5P_DEFAULT); // Calling H5Aget_info with attribute_id returned from H5Aopen. attr_info = H5.H5Aget_info(attribute_id); assertFalse("H5Aget_info ", attr_info == null); assertTrue("Corder_Valid should be false", attr_info.corder_valid == false); assertTrue("Character set used for attribute name", attr_info.cset == HDF5Constants.H5T_CSET_ASCII); assertTrue("Corder ", attr_info.corder == 0); assertEquals(attr_info.data_size, H5.H5Aget_storage_size(attr_id)); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aget_info: " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} if (attribute_id > 0) try {H5.H5Aclose(attribute_id);} catch (Exception ex) {} } } @Test public void testH5Aget_info1() { H5A_info_t attr_info = null; int attribute_id = -1; int attr_id = -1; int order = HDF5Constants.H5_ITER_INC; try { attr_id = H5.H5Acreate(H5did, ".", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); attribute_id = H5.H5Aopen_by_idx(H5did, ".", HDF5Constants.H5_INDEX_CRT_ORDER, order, 0, HDF5Constants.H5P_DEFAULT, lapl_id); // Calling H5Aget_info with attribute_id returned from // H5Aopen_by_idx. attr_info = H5.H5Aget_info(attribute_id); assertFalse("H5Aget_info ", attr_info == null); assertTrue("Corder_Valid should be true", attr_info.corder_valid == true); assertTrue("Character set", attr_info.cset == HDF5Constants.H5T_CSET_ASCII); assertTrue("Corder ", attr_info.corder == 0); assertEquals(attr_info.data_size, H5.H5Aget_storage_size(attr_id)); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aget_info1: " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} if (attribute_id > 0) try {H5.H5Aclose(attribute_id);} catch (Exception ex) {} } } @Test public void testH5Aget_info_by_idx() { int attr_id = -1; int attr2_id = -1;; H5A_info_t attr_info = null; try { attr_id = H5.H5Acreate(H5did, "dset1", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); attr2_id = H5.H5Acreate(H5did, "dataset2", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); //Verify info for 1st attribute, in increasing creation order attr_info = H5.H5Aget_info_by_idx(H5did, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, lapl_id); assertNotNull(attr_info); assertTrue("Corder ", attr_info.corder == 0);//should equal 0 as this is the order of 1st attribute created. assertEquals(attr_info.data_size, H5.H5Aget_storage_size(attr_id)); //Verify info for 2nd attribute, in increasing creation order attr_info = H5.H5Aget_info_by_idx(H5did, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 1, lapl_id); assertNotNull(attr_info); assertTrue("Corder", attr_info.corder == 1); assertEquals(attr_info.data_size, H5.H5Aget_storage_size(attr2_id)); //verify info for 2nd attribute, in decreasing creation order attr_info = H5.H5Aget_info_by_idx(H5did, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_DEC, 0, lapl_id); assertNotNull(attr_info); assertTrue("Corder", attr_info.corder == 1); //should equal 1 as this is the order of 2nd attribute created. //verify info for 1st attribute, in decreasing creation order attr_info = H5.H5Aget_info_by_idx(H5did, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_DEC, 1, lapl_id); assertNotNull(attr_info); assertTrue("Corder", attr_info.corder == 0); //should equal 0 as this is the order of 1st attribute created. //verify info for 1st attribute, in increasing name order attr_info = H5.H5Aget_info_by_idx(H5did, ".", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 1, lapl_id); assertNotNull(attr_info); assertTrue("Corder", attr_info.corder == 0); //should equal 0 as this is the order of 1st attribute created. //verify info for 2nd attribute, in decreasing name order attr_info = H5.H5Aget_info_by_idx(H5did, ".", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_DEC, 1, lapl_id); assertNotNull(attr_info); assertTrue("Corder", attr_info.corder == 1); //should equal 1 as this is the order of 2nd attribute created. } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aget_info_by_idx:" + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} if (attr2_id > 0) try {H5.H5Aclose(attr2_id);} catch (Exception ex) {} } } @Test public void testH5Aget_info_by_name() { int attr_id = -1; H5A_info_t attr_info = null; String obj_name = "."; String attr_name = "DATASET"; try { attr_id = H5.H5Acreate_by_name(H5fid, obj_name, attr_name, type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr_info = H5.H5Aget_info_by_name(H5fid, obj_name, attr_name, lapl_id); assertNotNull(attr_info); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aget_info_by_name:" + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} } } @Test public void testH5Adelete_by_name() { int attr_id = -1; int ret_val = -1; boolean bool_val = false; boolean exists = false; try { attr_id = H5.H5Acreate_by_name(H5fid, ".", "DATASET", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); ret_val = H5.H5Adelete_by_name(H5fid, ".", "DATASET", lapl_id); assertTrue("H5Adelete_by_name", ret_val >= 0); // Check if the Attribute still exists. bool_val = H5.H5Aexists_by_name(H5fid, ".", "DATASET", lapl_id); assertFalse("testH5Adelete_by_name: H5Aexists_by_name", bool_val); exists = H5.H5Aexists(H5fid, "DATASET"); assertFalse("testH5Adelete_by_name: H5Aexists ",exists); // Negative test. Error thrown when we try to delete an attribute // that has already been deleted. try{ ret_val = H5.H5Adelete_by_name(H5fid, ".", "DATASET", lapl_id); fail("Negative Test Failed: Error Not thrown."); } catch (AssertionError err) { fail("H5.H5Adelete_by_name: " + err); } catch (HDF5LibraryException err) {} } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Adelete_by_name " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} } } @Test public void testH5Aexists() { boolean exists = false; int attr_id = -1; int attribute_id = -1; try { exists = H5.H5Aexists(H5fid, "None"); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aexists: " + err); } assertFalse("H5Aexists ", exists); try { attr_id = H5.H5Acreate(H5fid, "dset", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); exists = H5.H5Aexists(H5fid, "dset"); assertTrue("H5Aexists ", exists); attribute_id = H5.H5Acreate_by_name(H5fid, ".", "attribute", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); exists = H5.H5Aexists(H5fid, "attribute"); assertTrue("H5Aexists ", exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aexists: " + err); } finally { if (attr_id > 0) try {H5.H5Aclose(attr_id);} catch (Exception ex) {} if (attribute_id > 0) try {H5.H5Aclose(attribute_id);} catch (Exception ex) {} } } @Test public void testH5Adelete_by_idx_order() { boolean exists = false; int attr1_id = -1; int attr2_id = -1; int attr3_id = -1; int attr4_id = -1; try { attr1_id = H5.H5Acreate_by_name(H5fid, ".", "attribute1", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr2_id = H5.H5Acreate_by_name(H5fid, ".", "attribute2", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr3_id = H5.H5Acreate_by_name(H5fid, ".", "attribute3", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr4_id = H5.H5Acreate_by_name(H5fid, ".", "attribute4", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); H5.H5Adelete_by_idx(H5fid, ".", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 3, lapl_id); exists = H5.H5Aexists(H5fid, "attribute4"); assertFalse("H5Adelete_by_idx: H5Aexists", exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Adelete_by_idx: " + err); } finally { if (attr1_id > 0) try {H5.H5Aclose(attr1_id);} catch (Exception ex) {} if (attr2_id > 0) try {H5.H5Aclose(attr2_id);} catch (Exception ex) {} if (attr3_id > 0) try {H5.H5Aclose(attr3_id);} catch (Exception ex) {} if (attr4_id > 0) try {H5.H5Aclose(attr4_id);} catch (Exception ex) {} } } @Test public void testH5Adelete_by_idx_name1() { boolean exists = false; int attr1_id = -1; int attr2_id = -1; int attr3_id = -1; try { attr1_id = H5.H5Acreate_by_name(H5fid, ".", "attribute1", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr2_id = H5.H5Acreate_by_name(H5fid, ".", "attribute2", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr3_id = H5.H5Acreate_by_name(H5fid, ".", "attribute3", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); H5.H5Adelete_by_idx(H5fid, ".", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 2, lapl_id); exists = H5.H5Aexists(H5fid, "attribute3"); assertFalse("H5Adelete_by_idx: H5Aexists", exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Adelete_by_idx: " + err); } finally { if (attr1_id > 0) try {H5.H5Aclose(attr1_id);} catch (Exception ex) {} if (attr2_id > 0) try {H5.H5Aclose(attr2_id);} catch (Exception ex) {} if (attr3_id > 0) try {H5.H5Aclose(attr3_id);} catch (Exception ex) {} } } @Test public void testH5Adelete_by_idx_name2() { boolean exists = false; int attr1_id = -1; int attr2_id = -1; int attr3_id = -1; int attr4_id = -1; try { attr1_id = H5.H5Acreate_by_name(H5fid, ".", "attribute1", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr2_id = H5.H5Acreate_by_name(H5fid, ".", "attribute2", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr3_id = H5.H5Acreate_by_name(H5fid, ".", "attribute3", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); attr4_id = H5.H5Acreate_by_name(H5fid, ".", "attribute4", type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); H5.H5Adelete_by_idx(H5fid, ".", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_DEC, 3, lapl_id); exists = H5.H5Aexists(H5fid, "attribute1"); assertFalse("H5Adelete_by_idx: H5Aexists", exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Adelete_by_idx: " + err); } finally { if (attr1_id > 0) try {H5.H5Aclose(attr1_id);} catch (Exception ex) {} if (attr2_id > 0) try {H5.H5Aclose(attr2_id);} catch (Exception ex) {} if (attr3_id > 0) try {H5.H5Aclose(attr3_id);} catch (Exception ex) {} if (attr4_id > 0) try {H5.H5Aclose(attr4_id);} catch (Exception ex) {} } } @Test(expected = NullPointerException.class) public void testH5Adelete_by_idx_null() throws Throwable { H5.H5Adelete_by_idx(H5fid, null, HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, lapl_id); } @Test(expected = HDF5LibraryException.class) public void testH5Adelete_by_idx_invalidobject() throws Throwable { H5.H5Adelete_by_idx(H5fid, "invalid", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, lapl_id); } @Test public void testH5Aopen_by_name() { String obj_name = "."; String attr_name = "DATASET"; int attribute_id = -1; int aid = -1; try { attribute_id = H5.H5Acreate_by_name(H5fid, obj_name, attr_name, type_id, space_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, lapl_id); //open Attribute by name if(attribute_id >= 0) { try { aid = H5.H5Aopen_by_name(H5fid, obj_name, attr_name, HDF5Constants.H5P_DEFAULT, lapl_id); assertTrue("testH5Aopen_by_name: ", aid>=0); } catch(Throwable err) { err.printStackTrace(); fail("H5.H5Aopen_by_name " + err); } } } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Aopen_by_name " + err); } finally { if (aid > 0) try {H5.H5Aclose(aid);} catch (Exception ex) {} if (attribute_id > 0) try {H5.H5Aclose(attribute_id);} catch (Exception ex) {} } } } jhdf-2.9/test/hdf5lib/TestH5Ocopy.java0000644000175000017500000002506312050301057020445 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Ocopy { private static final String FILENAME = "testRefsattribute.h5"; private static final int DIM_X = 4; private static final int DIM_Y = 6; int H5fid = -1; int H5dsid = -1; int H5did1 = -1; int H5did2 = -1; int H5gcpl = -1; int H5gid = -1; int H5dsid2 = -1; long[] dims = { 2 }; private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try { file.delete(); } catch (Exception e) { e.printStackTrace(); } } } private final int _createDataset(int fid, int dsid, String name, int dapl) { int did = -1; try { did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5O._createDataset: ",did > 0); return did; } private final int _createGroup(int fid, String name) { int gid = -1; try { H5gcpl = HDF5Constants.H5P_DEFAULT; gid = H5.H5Gcreate(fid, name, HDF5Constants.H5P_DEFAULT, H5gcpl, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gcreate: " + err); } assertTrue("TestH5O._createGroup: ",gid > 0); return gid; } @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fid = H5.H5Fcreate(FILENAME, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5dsid2 = H5.H5Screate(HDF5Constants.H5S_SCALAR); H5did1 = _createDataset(H5fid, H5dsid2, "DS2", HDF5Constants.H5P_DEFAULT); H5dsid = H5.H5Screate_simple(1, dims, null); H5gid = _createGroup(H5fid, "/G1"); H5did2 = _createDataset(H5gid, H5dsid, "DS1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("TestH5O.createH5file: " + err); } assertTrue("TestH5O.createH5file: H5.H5Fcreate: ",H5fid > 0); assertTrue("TestH5O.createH5file: H5.H5Screate_simple: ",H5dsid > 0); assertTrue("TestH5O.createH5file: H5.H5Gcreate: ",H5gid > 0); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5gid > 0) try {H5.H5Gclose(H5gid);} catch (Exception ex) {} if (H5did2 > 0) try {H5.H5Dclose(H5did2);} catch (Exception ex) {} if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5dsid2 > 0) try {H5.H5Sclose(H5dsid2);} catch (Exception ex) {} if (H5did1 > 0) try {H5.H5Dclose(H5did1);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} _deleteFile(FILENAME); } @Test public void testH5OcopyRefsAttr() { int ocp_plist_id = -1; byte rbuf0[]=null , rbuf1[] = null; byte[] dset_data = new byte[16]; int attribute_id = -1; try{ rbuf0 = H5.H5Rcreate(H5fid, "/G1", HDF5Constants.H5R_OBJECT, -1); rbuf1 = H5.H5Rcreate(H5fid, "DS2", HDF5Constants.H5R_OBJECT, -1); //System.arraycopy(rbuf0, 0, dset_data, 0, 8); System.arraycopy(rbuf1, 0, dset_data, 8, 8); attribute_id = H5.H5Acreate(H5did2, "A1", HDF5Constants.H5T_STD_REF_OBJ, H5dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Awrite(attribute_id, HDF5Constants.H5T_STD_REF_OBJ, dset_data); H5.H5Aclose(attribute_id); ocp_plist_id = H5.H5Pcreate(HDF5Constants.H5P_OBJECT_COPY); H5.H5Pset_copy_object(ocp_plist_id, HDF5Constants.H5O_COPY_EXPAND_REFERENCE_FLAG); H5.H5Ocopy(H5fid, ".", H5fid, "CPYREF", ocp_plist_id, HDF5Constants.H5P_DEFAULT); } catch (Exception ex){ fail("testH5OcopyRefsAttr: H5Ocopy failed"); } try{ H5.H5Pclose(ocp_plist_id); } catch (Exception ex){ } } @Test public void testH5OcopyRefsDatasettodiffFile() { int ocp_plist_id = -1; byte rbuf1[] = null; byte[] dset_data = new byte[16]; int dataset_id = -1; try{ rbuf1 = H5.H5Rcreate(H5fid, "DS2", HDF5Constants.H5R_OBJECT, -1); System.arraycopy(rbuf1, 0, dset_data, 8, 8); dataset_id = H5.H5Dcreate(H5fid, "DSREF", HDF5Constants.H5T_STD_REF_OBJ, H5dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Dwrite(dataset_id, HDF5Constants.H5T_STD_REF_OBJ, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, dset_data); H5.H5Dclose(dataset_id); //create new file int H5fid2 = H5.H5Fcreate("copy.h5", HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid2, HDF5Constants.H5F_SCOPE_LOCAL); //create object copy property list id and set the flags. ocp_plist_id = H5.H5Pcreate(HDF5Constants.H5P_OBJECT_COPY); H5.H5Pset_copy_object(ocp_plist_id, HDF5Constants.H5O_COPY_EXPAND_REFERENCE_FLAG); //Perform copy function. H5.H5Ocopy(H5fid, ".", H5fid2, "CPYREFD", ocp_plist_id, HDF5Constants.H5P_DEFAULT); //Close file. H5.H5Fclose(H5fid2); } catch (Exception ex){ ex.printStackTrace(); fail("testH5OcopyRefsDatasettodiffFile: H5Ocopy failed"); } try{ H5.H5Pclose(ocp_plist_id); } catch (Exception ex){ } } @Test public void testH5OcopyRefsDatasettosameFile() { int ocp_plist_id = -1; byte rbuf0[]=null , rbuf1[] = null; byte[] dset_data = new byte[16]; int dataset_id = -1; int[] otype = { 1 }; int obj_type = -1; byte[] read_data = new byte[16]; int did = -1; try{ rbuf0 = H5.H5Rcreate(H5fid, "/G1", HDF5Constants.H5R_OBJECT, -1); rbuf1 = H5.H5Rcreate(H5fid, "DS2", HDF5Constants.H5R_OBJECT, -1); System.arraycopy(rbuf0, 0, dset_data, 0, 8); System.arraycopy(rbuf1, 0, dset_data, 8, 8); //Create a dataset and write object references to it. dataset_id = H5.H5Dcreate(H5fid, "DSREF", HDF5Constants.H5T_STD_REF_OBJ, H5dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Dwrite(dataset_id, HDF5Constants.H5T_STD_REF_OBJ, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, dset_data); //Close the dataset. H5.H5Dclose(dataset_id); ocp_plist_id = H5.H5Pcreate(HDF5Constants.H5P_OBJECT_COPY); H5.H5Pset_copy_object(ocp_plist_id, HDF5Constants.H5O_COPY_EXPAND_REFERENCE_FLAG); //Perform copy function. try{ H5.H5Ocopy(H5fid, "DSREF", H5fid, "CPYREFD", ocp_plist_id, HDF5Constants.H5P_DEFAULT); } catch(Exception ex){ fail("testH5OcopyRefsDatasettosameFile: H5Ocopy failed"); } //Open the dataset that has been copied try { did = H5.H5Dopen(H5fid, "DSREF", HDF5Constants.H5P_DEFAULT); } catch (Exception e) { e.printStackTrace(); } //Read the dataset object references in the read_data buffer. H5.H5Dread(did, HDF5Constants.H5T_STD_REF_OBJ, HDF5Constants.H5S_ALL,HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, read_data); System.arraycopy(read_data, 0, rbuf0, 0, 8); System.arraycopy(read_data, 8, rbuf1, 0, 8); //Get the type of object the reference points to. obj_type = H5.H5Rget_obj_type(H5fid, HDF5Constants.H5R_OBJECT, rbuf1, otype); assertEquals(obj_type, HDF5Constants.H5O_TYPE_DATASET); obj_type = H5.H5Rget_obj_type(H5fid, HDF5Constants.H5R_OBJECT, rbuf0, otype); assertEquals(obj_type, HDF5Constants.H5O_TYPE_GROUP); //close the dataset H5.H5Dclose(did); } catch (Exception ex){ ex.printStackTrace(); } try{ H5.H5Pclose(ocp_plist_id); } catch (Exception ex){ } } @Test public void testH5OcopyInvalidRef() { final int _pid_ = HDF5Constants.H5P_DEFAULT; try { int sid = H5.H5Screate_simple(1, new long[] {1}, null); int did = H5.H5Dcreate(H5fid, "Dataset_with_invalid_Ref", HDF5Constants.H5T_NATIVE_INT, sid, _pid_, _pid_, _pid_); int aid = H5.H5Acreate(did, "Invalid_Ref", HDF5Constants.H5T_STD_REF_OBJ, sid, _pid_, _pid_); H5.H5Awrite(aid, HDF5Constants.H5T_STD_REF_OBJ, new long[]{-1}); H5.H5Dclose(did); H5.H5Aclose(aid); H5.H5Sclose(sid); } catch (Exception ex) {} try { int ocp_plist_id = H5.H5Pcreate(HDF5Constants.H5P_OBJECT_COPY); H5.H5Pset_copy_object(ocp_plist_id, HDF5Constants.H5O_COPY_EXPAND_REFERENCE_FLAG); try { H5.H5Ocopy(H5fid, "/Dataset_with_invalid_Ref", H5fid, "/Dataset_with_invalid_Ref_cp", ocp_plist_id, _pid_); } finally { H5.H5Pclose(ocp_plist_id);} } catch (Exception ex) {} } } jhdf-2.9/test/hdf5lib/TestH5S.java0000644000175000017500000004456112050301057017562 0ustar sylvestresylvestre/** * */ package test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5S { int H5sid = -1; int H5rank = 2; long H5dims[] = {5, 5}; long H5maxdims[] = {10, 10}; @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0", H5.getOpenIDCount()==0); H5sid = H5.H5Screate_simple(H5rank, H5dims, H5maxdims); assertTrue("H5.H5Screate_simple_extent", H5sid > 0); } @After public void deleteH5file() throws HDF5LibraryException { if (H5sid > 0) { try {H5.H5Sclose(H5sid);} catch (Exception ex) {} } } @Test public void testH5Sget_simple_extent_ndims() { int read_rank = -1; try { read_rank = H5.H5Sget_simple_extent_ndims(H5sid); assertTrue("H5.H5Sget_simple_extent_ndims", H5rank == read_rank); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_simple_extent_ndims: " + err); } } @Test public void testH5Sget_simple_extent_dims_null() { int read_rank = -1; try { read_rank = H5.H5Sget_simple_extent_dims(H5sid, null, null); assertTrue("H5.H5Sget_simple_extent_dims", H5rank == read_rank); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_simple_extent_dims: " + err); } } @Test public void testH5Sget_simple_extent_dims() { int read_rank = -1; long dims[] = {5, 5}; long maxdims[] = {10, 10}; try { read_rank = H5.H5Sget_simple_extent_dims(H5sid, dims, maxdims); assertTrue("H5.H5Sget_simple_extent_dims", H5rank == read_rank); assertTrue("H5.H5Sget_simple_extent_dims:dims", H5dims[0] == dims[0]); assertTrue("H5.H5Sget_simple_extent_dims:maxdims", H5maxdims[0] == maxdims[0]); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_simple_extent_dims: " + err); } } @Test public void testH5Sget_simple_extent_npoints() { long num_elements = -1; try { num_elements = H5.H5Sget_simple_extent_npoints(H5sid); assertTrue("H5.H5Sget_simple_extent_npoints", (H5dims[0]*H5dims[1]) == num_elements); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_simple_extent_npoints: " + err); } } @Test public void testH5Sget_simple_extent_type() { int read_type = -1; try { read_type = H5.H5Sget_simple_extent_type(H5sid); assertTrue("H5.H5Sget_simple_extent_type", HDF5Constants.H5S_SIMPLE == read_type); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_simple_extent_type: " + err); } } @Test public void testH5Sis_simple() { boolean result = false; try { result = H5.H5Sis_simple(H5sid); assertTrue("H5.H5Sis_simple", result); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sis_simple: " + err); } } @Test public void testH5Sset_extent_simple() { long num_elements = -1; try { H5.H5Sset_extent_simple(H5sid, H5rank, H5maxdims, H5maxdims); num_elements = H5.H5Sget_simple_extent_npoints(H5sid); assertTrue("H5.H5Sget_simple_extent_npoints", (H5maxdims[0]*H5maxdims[1]) == num_elements); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sset_extent_simple: " + err); } } @Test public void testH5Sget_select_type() { int read_type = -1; try { read_type = H5.H5Sget_select_type(H5sid); assertTrue("H5.H5Sget_select_type", HDF5Constants.H5S_SEL_ALL == read_type); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sset_extent_none: " + err); } } @Test public void testH5Sset_extent_none() { int read_type = -1; try { H5.H5Sset_extent_none(H5sid); read_type = H5.H5Sget_simple_extent_type(H5sid); assertTrue("H5.H5Sget_simple_extent_type: "+read_type, HDF5Constants.H5S_NO_CLASS == read_type); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sset_extent_none: " + err); } } @Test public void testH5Scopy() { int sid = -1; int read_rank = -1; try { sid = H5.H5Scopy(H5sid); assertTrue("H5.H5Sis_simple", sid > 0); read_rank = H5.H5Sget_simple_extent_ndims(sid); assertTrue("H5.H5Screate_simple_extent_ndims", H5rank == read_rank); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Scopy: " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Sextent_copy() { int sid = -1; int class_type = -1; try { sid = H5.H5Screate(HDF5Constants.H5S_NULL); assertTrue("H5.H5Screate_null", sid > 0); H5.H5Sextent_copy(sid, H5sid); class_type = H5.H5Sget_simple_extent_type(sid); assertTrue("H5.H5Screate_null: type", class_type == HDF5Constants.H5S_SIMPLE); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sextent_copy: " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Sextent_equal() { int sid = -1; boolean result = false; try { sid = H5.H5Screate(HDF5Constants.H5S_NULL); assertTrue("H5.H5Screate_null",sid > 0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate: null " + err); } try { result = H5.H5Sextent_equal(sid, H5sid); assertFalse("H5.testH5Sextent_equal",result); H5.H5Sextent_copy(sid, H5sid); result = H5.H5Sextent_equal(sid, H5sid); assertTrue("H5.testH5Sextent_equal", result); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sextent_copy " + err); } finally { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Sencode_decode_null_dataspace() { int sid = -1; int decoded_sid = -1; byte[] null_sbuf = null; boolean result = false; try { sid = H5.H5Screate(HDF5Constants.H5S_NULL); assertTrue("H5.H5Screate_null", sid > 0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate: null " + err); } try { null_sbuf = H5.H5Sencode(sid); assertFalse("H5.testH5Sencode", null_sbuf==null); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sencode " + err); } finally { if(null_sbuf == null) { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } try { decoded_sid = H5.H5Sdecode(null_sbuf); assertTrue("H5.testH5Sdecode", decoded_sid>0); result = H5.H5Sextent_equal(sid, decoded_sid); assertTrue("H5.testH5Sextent_equal", result); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sdecode " + err); } finally { try {H5.H5Sclose(decoded_sid);} catch (Exception ex) {} try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Sencode_decode_scalar_dataspace() { int sid = -1; int decoded_sid = -1; byte[] scalar_sbuf = null; boolean result = false; int iresult = -1; long lresult = -1; try { sid = H5.H5Screate(HDF5Constants.H5S_SCALAR); assertTrue("H5.H5Screate_null", sid > 0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Screate: null " + err); } try { scalar_sbuf = H5.H5Sencode(sid); assertFalse("H5.testH5Sencode", scalar_sbuf==null); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sencode " + err); } finally { if(scalar_sbuf == null) { try {H5.H5Sclose(sid);} catch (Exception ex) {} } } try { decoded_sid = H5.H5Sdecode(scalar_sbuf); assertTrue("H5.testH5Sdecode", decoded_sid>0); result = H5.H5Sextent_equal(sid, decoded_sid); assertTrue("H5.testH5Sextent_equal", result); /* Verify decoded dataspace */ lresult = H5.H5Sget_simple_extent_npoints(decoded_sid); assertTrue("H5.testH5Sget_simple_extent_npoints", lresult==1); iresult = H5.H5Sget_simple_extent_ndims(decoded_sid); assertTrue("H5.testH5Sget_simple_extent_ndims", iresult==0); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sdecode " + err); } finally { try {H5.H5Sclose(decoded_sid);} catch (Exception ex) {} try {H5.H5Sclose(sid);} catch (Exception ex) {} } } @Test public void testH5Sselect_none() { int read_type = -1; try { H5.H5Sselect_none(H5sid); read_type = H5.H5Sget_select_type(H5sid); assertTrue("H5.H5Sget_select_type: "+read_type, HDF5Constants.H5S_SEL_NONE == read_type); H5.H5Sselect_all(H5sid); read_type = H5.H5Sget_select_type(H5sid); assertTrue("H5.H5Sget_select_type: "+read_type, HDF5Constants.H5S_SEL_ALL == read_type); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sset_extent_none: " + err); } } @Test public void testH5Sget_select_npoints() { long coord[][] = {{0,1},{2,4},{5,6}}; /* Coordinates for point selection */ long num_elements = -1; try { H5.H5Sselect_elements(H5sid, HDF5Constants.H5S_SELECT_SET, 3, coord); num_elements = H5.H5Sget_select_npoints(H5sid); assertTrue("H5.H5Sget_select_npoints: "+num_elements, 3 == num_elements); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_select_npoints: " + err); } } @Test(expected = IllegalArgumentException.class) public void testH5Sget_select_elem_pointlist_invalid() throws Throwable { long coord[][] = {{0,1},{2,4},{5,6}}; /* Coordinates for point selection */ long getcoord[] = {-1,-1}; /* Coordinates for get point selection */ try { H5.H5Sselect_elements(H5sid, HDF5Constants.H5S_SELECT_SET, 3, coord); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_select_elem_pointlist: " + err); } H5.H5Sget_select_elem_pointlist(H5sid, 0, 3, getcoord); } @Test public void testH5Sget_select_elem_pointlist() { long coord[][] = {{0,1},{2,3},{4,5}}; /* Coordinates for point selection */ long getcoord[] = {-1,-1,-1,-1,-1,-1}; /* Coordinates for get point selection */ try { H5.H5Sselect_elements(H5sid, HDF5Constants.H5S_SELECT_SET, 3, coord); H5.H5Sget_select_elem_pointlist(H5sid, 0, 3, getcoord); assertTrue("H5.H5Sget_select_elem_pointlist", coord[0][0] == getcoord[0]); assertTrue("H5.H5Sget_select_elem_pointlist", coord[0][1] == getcoord[1]); assertTrue("H5.H5Sget_select_elem_pointlist", coord[1][0] == getcoord[2]); assertTrue("H5.H5Sget_select_elem_pointlist", coord[1][1] == getcoord[3]); assertTrue("H5.H5Sget_select_elem_pointlist", coord[2][0] == getcoord[4]); assertTrue("H5.H5Sget_select_elem_pointlist", coord[2][1] == getcoord[5]); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_select_elem_pointlist: " + err); } } @Test public void testH5Sget_select_bounds() { long lowbounds[] = {-1,-1}; long hibounds[] = {-1,-1}; try { H5.H5Sget_select_bounds(H5sid, lowbounds, hibounds); assertTrue("H5.H5Sget_select_bounds", 0 == lowbounds[0]); assertTrue("H5.H5Sget_select_bounds", 0 == lowbounds[1]); assertTrue("H5.H5Sget_select_bounds", (H5dims[0]-1) == hibounds[0]); assertTrue("H5.H5Sget_select_bounds", (H5dims[1]-1) == hibounds[1]); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_select_bounds: " + err); } } @Test public void testH5Soffset_simple() { long coord[][] = {{2,2},{2,4},{4,2},{4,4}}; /* Coordinates for point selection */ long lowbounds[] = {-1,-1}; long hibounds[] = {-1,-1}; try { H5.H5Sselect_elements(H5sid, HDF5Constants.H5S_SELECT_SET, 4, coord); H5.H5Sget_select_bounds(H5sid, lowbounds, hibounds); assertTrue("H5.H5Sget_select_bounds", 2 == lowbounds[0]); assertTrue("H5.H5Sget_select_bounds", 2 == lowbounds[1]); assertTrue("H5.H5Sget_select_bounds", (H5dims[0]-1) == hibounds[0]); assertTrue("H5.H5Sget_select_bounds", (H5dims[1]-1) == hibounds[1]); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_select_bounds: " + err); } try { long offset[] = {-1,-1}; H5.H5Soffset_simple(H5sid, offset); H5.H5Sget_select_bounds(H5sid, lowbounds, hibounds); assertTrue("H5.H5Sget_select_bounds", 1 == lowbounds[0]); assertTrue("H5.H5Sget_select_bounds", 1 == lowbounds[1]); assertTrue("H5.H5Sget_select_bounds", (H5dims[0]-2) == hibounds[0]); assertTrue("H5.H5Sget_select_bounds", (H5dims[1]-2) == hibounds[1]); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Soffset_simple: " + err); } } @Test public void testH5Sget_select_hyper() { int space1 = -1; long start[] = {0,0}; long stride[] = {1,1}; long count[] = {1,1}; long block[] = {4,4}; long nblocks; // Number of hyperslab blocks long blocks[] = {-1, -1, -1, -1, -1, -1, -1, -1}; // List of blocks try { // Copy "all" selection & space space1 = H5.H5Scopy(H5sid); assertTrue("H5.H5Scopy", H5sid > 0); // 'AND' "all" selection with another hyperslab H5.H5Sselect_hyperslab(space1, HDF5Constants.H5S_SELECT_AND, start, stride, count, block); // Verify that there is only one block nblocks = H5.H5Sget_select_hyper_nblocks(space1); assertTrue("H5Sget_select_hyper_nblocks", nblocks == 1); // Retrieve the block defined H5.H5Sget_select_hyper_blocklist(space1, 0, nblocks, blocks); // Verify that the correct block is defined assertTrue("H5.H5Sget_select_hyper_blocklist", start[0] == blocks[0]); assertTrue("H5.H5Sget_select_hyper_blocklist", start[1] == blocks[1]); assertTrue("H5.H5Sget_select_hyper_blocklist", (block[0]-1) == blocks[2]); assertTrue("H5.H5Sget_select_hyper_blocklist", (block[1]-1) == blocks[3]); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Sget_select_bounds: " + err); } finally { try {H5.H5Sclose(space1);} catch (Exception ex) {} } } @Test public void testH5Sget_select_valid() { int space1 = -1; long start[] = {1,0}; long stride[] = {1,1}; long count[] = {2,3}; long block[] = {1,1}; long offset[] = {0,0}; // Offset of selection try { // Copy "all" selection & space space1 = H5.H5Scopy(H5sid); assertTrue("H5.H5Scopy", H5sid > 0); // 'AND' "all" selection with another hyperslab H5.H5Sselect_hyperslab(space1, HDF5Constants.H5S_SELECT_SET, start, stride, count, block); // Check a valid offset offset[0]=-1; offset[1]=0; H5.H5Soffset_simple(space1, offset); assertTrue("H5Sselect_valid", H5.H5Sselect_valid(space1)); // Check an invalid offset offset[0]=10; offset[1]=0; H5.H5Soffset_simple(space1, offset); assertFalse("H5Sselect_valid", H5.H5Sselect_valid(space1)); /* Reset offset */ offset[0]=0; offset[1]=0; H5.H5Soffset_simple(space1, offset); assertTrue("H5Sselect_valid", H5.H5Sselect_valid(space1)); } catch (Throwable err) { err.printStackTrace(); fail("testH5Sget_select_valid: " + err); } finally { try {H5.H5Sclose(space1);} catch (Exception ex) {} } } } jhdf-2.9/test/hdf5lib/h5ex_g_iterate.hdf0000644000175000017500000000556012050301057021033 0ustar sylvestresylvestreHDF  p `HEAP(G1DS1DT1L1TREE@  `HEAP P TREE  SNOD  ( NHh@  ( NHhSNODDS2jhdf-2.9/test/hdf5lib/TestH5E.java0000644000175000017500000002531712050301057017542 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class TestH5E { int hdf_java_classid = -1; int current_stackid = -1; @Before public void H5Eget_stack_class() { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); hdf_java_classid = -1; try { hdf_java_classid = H5.H5Eregister_class("HDF-Java-Error", "hdf-java", "2.5"); current_stackid = H5.H5Eget_current_stack(); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_stack_class: " + err); } } @After public void H5Erestore_stack_class() { try { H5.H5Eunregister_class(hdf_java_classid); hdf_java_classid = -1; H5.H5Eclose_stack(current_stackid); current_stackid = -1; } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Erestore_stack_class: " + err); } } @Test public void testH5Eget_class_name() { try { String class_name = H5.H5Eget_class_name(hdf_java_classid); assertNotNull("H5.H5Eget_class_name: " + class_name, class_name); assertEquals("H5.H5Eget_class_name: ", "HDF-Java-Error", class_name); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_class_name: " + err); } } @Test public void testH5Eprint2() { try { assertFalse(current_stackid < 0); H5.H5Eprint2(current_stackid, null); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eprint2: " + err); } } @Ignore("Tested with create_msg_major[minor]") public void testH5Eclose_msg() { fail("Not yet implemented"); } @Test(expected = NullPointerException.class) public void testH5Ecreate_msg_name_null() throws Throwable { H5.H5Ecreate_msg(hdf_java_classid, HDF5Constants.H5E_MAJOR, null); } @Test public void testH5Ecreate_msg_major() { try { int err_id = H5.H5Ecreate_msg(hdf_java_classid, HDF5Constants.H5E_MAJOR, "Error in Test"); assertFalse("H5.H5Ecreate_msg_major: " + err_id, err_id < 0); H5.H5Eclose_msg(err_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ecreate_msg_major: " + err); } } @Test public void testH5Ecreate_msg_minor() { try { int err_id = H5.H5Ecreate_msg(hdf_java_classid, HDF5Constants.H5E_MINOR, "Error in Test Function"); assertFalse("H5.H5Ecreate_msg_minor: " + err_id, err_id < 0); H5.H5Eclose_msg(err_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ecreate_msg_minor: " + err); } } @Test public void testH5Eget_msg() { int[] error_msg_type = { HDF5Constants.H5E_MINOR }; int err_id = -1; String msg = null; try { err_id = H5.H5Ecreate_msg(hdf_java_classid, HDF5Constants.H5E_MAJOR, "Error in Test"); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_msg: " + err); } assertFalse("H5.H5Eget_msg: H5Ecreate_msg - " + err_id, err_id < 0); try { msg = H5.H5Eget_msg(err_id, error_msg_type); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_msg: " + err); } assertNotNull("H5.H5Eget_msg: " + msg, msg); assertEquals("H5.H5Eget_msg: ", "Error in Test", msg); assertEquals("H5.H5Eget_msg: ", HDF5Constants.H5E_MAJOR, error_msg_type[0]); try { H5.H5Eclose_msg(err_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_msg: " + err); } } @Test public void testH5Eget_msg_major() { try { H5.H5Fopen("test", 0, 1); } catch (HDF5LibraryException hdferr) { int[] error_msg_type = { HDF5Constants.H5E_MAJOR }; String msg = null; try { msg = H5.H5Eget_msg(hdferr.getMajorErrorNumber(), error_msg_type); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_msg: " + err); } assertNotNull("H5.H5Eget_msg: " + msg, msg); assertEquals("H5.H5Eget_msg: ", "Invalid arguments to routine", msg); assertEquals("H5.H5Eget_msg: ", HDF5Constants.H5E_MAJOR, error_msg_type[0]); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_msg: " + err); } } @Test public void testH5Eget_msg_minor() { try { H5.H5Fopen("test", 0, 1); } catch (HDF5LibraryException hdferr) { int[] error_msg_type = { HDF5Constants.H5E_MINOR }; String msg = null; try { msg = H5.H5Eget_msg(hdferr.getMinorErrorNumber(), error_msg_type); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_msg: " + err); } assertNotNull("H5.H5Eget_msg: " + msg, msg); assertEquals("H5.H5Eget_msg: ", "Inappropriate type", msg); assertEquals("H5.H5Eget_msg: ", HDF5Constants.H5E_MINOR, error_msg_type[0]); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_msg: " + err); } } @Test public void testH5Ecreate_stack() { int stk_id = -1; try { stk_id = H5.H5Ecreate_stack(); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ecreate_stack: " + err); } assertFalse("H5.H5Ecreate_stack: " + stk_id, stk_id < 0); try { H5.H5Eclose_stack(stk_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ecreate_stack: " + err); } } @Test public void testH5Epop() { try { H5.H5Eset_current_stack(current_stackid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { } // save current stack contents try { current_stackid = H5.H5Eget_current_stack(); } catch (HDF5LibraryException err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } long num_msg = -1; try { num_msg = H5.H5Eget_num(HDF5Constants.H5E_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } assertTrue("H5.H5Epop #:" + num_msg, num_msg == 0); try { num_msg = H5.H5Eget_num(current_stackid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } assertTrue("H5.H5Epop #:" + num_msg, num_msg == 2); try { H5.H5Epop(current_stackid, 1); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } try { num_msg = H5.H5Eget_num(current_stackid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } assertTrue("H5.H5Epop", num_msg == 1); } @Test public void testH5EprintInt() { assertFalse(current_stackid < 0); try { H5.H5Eprint2(current_stackid, null); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5EprintInt: " + err); } } @Test public void testH5EclearInt() { try { H5.H5Eclear(current_stackid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5EclearInt: " + err); } } @Test public void testH5Eclear2() { try { H5.H5Eclear2(current_stackid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eclear2: " + err); } } @Test public void testH5Eauto_is_v2() { boolean is_v2 = false; try { is_v2 = H5.H5Eauto_is_v2(current_stackid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eauto_is_v2: " + err); } assertTrue("H5.H5Eauto_is_v2: ", is_v2); } @Test public void testH5Eget_num() { long num_msg = -1; try { num_msg = H5.H5Eget_num(current_stackid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Eget_num: " + err); } assertTrue("H5.H5Eget_num", num_msg == 0); } @Test public void testH5Eget_num_with_msg() { try { H5.H5Eset_current_stack(current_stackid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } try { H5.H5Fopen("test", 0, 1); } catch (Throwable err) { } // save current stack contents try { current_stackid = H5.H5Eget_current_stack(); } catch (HDF5LibraryException err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } long num_msg = -1; try { num_msg = H5.H5Eget_num(current_stackid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Epop: " + err); } assertTrue("H5.H5Eget_num_with_msg #:" + num_msg, num_msg > 0); } @Ignore("API1.6") public void testH5Eprint() { fail("Not yet implemented"); } @Ignore("API1.6") public void testH5Eclear() { fail("Not yet implemented"); } } jhdf-2.9/test/hdf5lib/TestH5Dplist.java0000644000175000017500000001463612050301060020611 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Dplist { private static final String H5_FILE = "test.h5"; private static final int DIM_X = 4; private static final int DIM_Y = 7; private static final int EDIM_X = 6; private static final int EDIM_Y = 10; private static final int CHUNK_X = 4; private static final int CHUNK_Y = 4; private static final int NDIMS = 2; private static final int FILLVAL = 99; private static final int RANK = 2; int H5fid = -1; int H5dsid = -1; int H5did = -1; int H5dcpl_id = -1; long[] H5dims = { DIM_X, DIM_Y }; long[] H5extdims = { EDIM_X, EDIM_Y }; long[] H5chunk_dims = { CHUNK_X, CHUNK_Y }; long[] H5maxdims = { HDF5Constants.H5S_UNLIMITED, HDF5Constants.H5S_UNLIMITED }; private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } private final void _createPDataset(int fid, int dsid, String name, int dcpl_val) { try { H5dcpl_id = H5.H5Pcreate(dcpl_val); } catch (Exception err) { err.printStackTrace(); fail("H5.H5Pcreate: " + err); } assertTrue("TestH5Dplist._createPDataset: ", H5dcpl_id > 0); // Set the chunk size. try { H5.H5Pset_chunk(H5dcpl_id, NDIMS, H5chunk_dims); } catch (Exception e) { e.printStackTrace(); } // Set the fill value for the dataset try { int[] fill_value = { FILLVAL }; H5.H5Pset_fill_value(H5dcpl_id, HDF5Constants.H5T_NATIVE_INT, fill_value); } catch (Exception e) { e.printStackTrace(); } // Set the allocation time to "early". This way we can be sure // that reading from the dataset immediately after creation will // return the fill value. try { H5.H5Pset_alloc_time(H5dcpl_id, HDF5Constants.H5D_ALLOC_TIME_EARLY); } catch (Exception e) { e.printStackTrace(); } _createDataset(H5fid, H5dsid, "dset", H5dcpl_id, HDF5Constants.H5P_DEFAULT); } private final void _createDataset(int fid, int dsid, String name, int dcpl, int dapl) { try { H5did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, dcpl, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5Dplist._createDataset: ",H5did > 0); } @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5dsid = H5.H5Screate_simple(RANK, H5dims, H5maxdims); } catch (Throwable err) { err.printStackTrace(); fail("TestH5Dplist.createH5file: " + err); } assertTrue("TestH5Dplist.createH5file: H5.H5Fcreate: ",H5fid > 0); assertTrue("TestH5Dplist.createH5file: H5.H5Screate_simple: ",H5dsid > 0); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5dcpl_id >= 0) try {H5.H5Pclose(H5dcpl_id);} catch (Exception ex) {} if (H5did > 0) try {H5.H5Dclose(H5did);} catch (Exception ex) {} if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} _deleteFile(H5_FILE); } @Test public void testH5Dset_extent() { int[][] write_dset_data = new int[DIM_X][DIM_Y]; int[][] read_dset_data = new int[DIM_X][DIM_Y]; int[][] extend_dset_data = new int[EDIM_X][EDIM_Y]; // Initialize the dataset. for (int indx = 0; indx < DIM_X; indx++) for (int jndx = 0; jndx < DIM_Y; jndx++) write_dset_data[indx][jndx] = indx * jndx - jndx; _createPDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DATASET_CREATE); // Read values from the dataset, which has not been written to yet. try { H5.H5Dread(H5did, HDF5Constants.H5T_NATIVE_INT, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, read_dset_data); } catch (Exception e) { e.printStackTrace(); } assertTrue("testH5Dset_extent - H5.H5Dread: ", read_dset_data[0][0] == 99); // Write the data to the dataset. try { H5.H5Dwrite(H5did, HDF5Constants.H5T_NATIVE_INT, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, write_dset_data); } catch (Exception e) { e.printStackTrace(); } // Read the data back. try { H5.H5Dread(H5did, HDF5Constants.H5T_NATIVE_INT, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, read_dset_data); } catch (Exception e) { e.printStackTrace(); } assertTrue("testH5Dset_extent - H5.H5Dread: ", read_dset_data[3][6] == 12); // Extend the dataset. try { H5.H5Dset_extent(H5did, H5extdims); } catch (Exception e) { e.printStackTrace(); } // Read from the extended dataset. try { H5.H5Dread(H5did, HDF5Constants.H5T_NATIVE_INT, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, extend_dset_data); } catch (Exception e) { e.printStackTrace(); } assertTrue("testH5Dset_extent - H5.H5Dread: ", extend_dset_data[3][6] == 12); assertTrue("testH5Dset_extent - H5.H5Dread: ", extend_dset_data[4][8] == 99); } } jhdf-2.9/test/hdf5lib/TestH5Obasic.java0000644000175000017500000003142112050301060020541 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.callbacks.H5O_iterate_cb; import ncsa.hdf.hdf5lib.callbacks.H5O_iterate_t; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5O_info_t; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Obasic { private static final String H5_FILE = "test/hdf5lib/h5ex_g_iterate.hdf"; private static long H5la_ds1 = -1; private static long H5la_l1 = -1; private static long H5la_dt1 = -1; private static long H5la_g1 = -1; int H5fid = -1; @Before public void openH5file() throws HDF5LibraryException, NullPointerException { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fid = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Fopen: openH5file: " + err); } } @After public void closeH5file() throws HDF5LibraryException { if (H5fid > 0) { try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } } @Test(expected = HDF5LibraryException.class) public void testH5Oopen_not_exists() throws Throwable { int oid = -1; oid = H5.H5Oopen(H5fid, "Never_created", HDF5Constants.H5P_DEFAULT); try {H5.H5Oclose(oid);} catch (Exception ex) {} } @Test public void testH5Oget_info_dataset() { int oid = -1; H5O_info_t obj_info = null; try { oid = H5.H5Oopen(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); obj_info = H5.H5Oget_info(oid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ",obj_info==null); assertTrue("H5Oget_info object type",obj_info.type==HDF5Constants.H5O_TYPE_DATASET); H5la_ds1 = obj_info.addr; try {H5.H5Oclose(oid);} catch (Exception ex) {} } @Test public void testH5Oget_info_hardlink() { int oid = -1; H5O_info_t obj_info = null; try { oid = H5.H5Oopen(H5fid, "L1", HDF5Constants.H5P_DEFAULT); obj_info = H5.H5Oget_info(oid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ",obj_info==null); assertTrue("H5Oget_info object type",obj_info.type==HDF5Constants.H5O_TYPE_DATASET); H5la_l1 = obj_info.addr; try {H5.H5Oclose(oid);} catch (Exception ex) {} } @Test public void testH5Oget_info_group() { int oid = -1; H5O_info_t obj_info = null; try { oid = H5.H5Oopen(H5fid, "G1", HDF5Constants.H5P_DEFAULT); obj_info = H5.H5Oget_info(oid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ",obj_info==null); assertTrue("H5Oget_info object type",obj_info.type==HDF5Constants.H5O_TYPE_GROUP); H5la_g1 = obj_info.addr; try {H5.H5Oclose(oid);} catch (Exception ex) {} } @Test public void testH5Oget_info_datatype() { int oid = -1; H5O_info_t obj_info = null; try { oid = H5.H5Oopen(H5fid, "DT1", HDF5Constants.H5P_DEFAULT); obj_info = H5.H5Oget_info(oid); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ",obj_info==null); assertTrue("H5Oget_info object type",obj_info.type==HDF5Constants.H5O_TYPE_NAMED_DATATYPE); H5la_dt1 = obj_info.addr; try {H5.H5Oclose(oid);} catch (Exception ex) {} } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_by_name_not_exist_name() throws Throwable { H5.H5Oget_info_by_name(H5fid, "None", HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_by_name_not_exists() throws Throwable { H5.H5Oget_info_by_name(H5fid, "Bogus", HDF5Constants.H5P_DEFAULT); } @Test public void testH5Oget_info_by_name_dataset() { H5O_info_t obj_info = null; try { obj_info = H5.H5Oget_info_by_name(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ",obj_info==null); assertTrue("H5Oget_info object type",obj_info.type==HDF5Constants.H5O_TYPE_DATASET); H5la_ds1 = obj_info.addr; } @Test public void testH5Oget_info_by_name_hardlink() { H5O_info_t obj_info = null; try { obj_info = H5.H5Oget_info_by_name(H5fid, "L1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ",obj_info==null); assertTrue("H5Oget_info object type",obj_info.type==HDF5Constants.H5O_TYPE_DATASET); H5la_l1 = obj_info.addr; } @Test public void testH5Oget_info_by_name_group() { H5O_info_t obj_info = null; try { obj_info = H5.H5Oget_info_by_name(H5fid, "G1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ",obj_info==null); assertTrue("H5Oget_info object type",obj_info.type==HDF5Constants.H5O_TYPE_GROUP); H5la_g1 = obj_info.addr; } @Test public void testH5Oget_info_by_name_datatype() { H5O_info_t obj_info = null; try { obj_info = H5.H5Oget_info_by_name(H5fid, "DT1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info: " + err); } assertFalse("H5Oget_info ",obj_info==null); assertTrue("H5Oget_info object type",obj_info.type==HDF5Constants.H5O_TYPE_NAMED_DATATYPE); H5la_dt1 = obj_info.addr; } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_by_idx_name_not_exist_name() throws Throwable { H5.H5Oget_info_by_idx(H5fid, "None", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_by_idx_name_not_exist_create() throws Throwable { H5.H5Oget_info_by_idx(H5fid, "None", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_by_idx_not_exist_name() throws Throwable { H5.H5Oget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 5, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Oget_info_by_idx_not_exist_create() throws Throwable { H5.H5Oget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 5, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Oget_info_by_idx_n0() { H5O_info_t obj_info = null; try { obj_info = H5.H5Oget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info_by_idx: " + err); } assertFalse("H5Oget_info_by_idx ",obj_info==null); assertTrue("H5Oget_info_by_idx link type",obj_info.type==HDF5Constants.H5O_TYPE_DATASET); assertTrue("Link Address ",obj_info.addr==H5la_ds1); } @Test public void testH5Oget_info_by_idx_n3() { H5O_info_t obj_info = null; try { obj_info = H5.H5Oget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 3, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Oget_info_by_idx: " + err); } assertFalse("H5Oget_info_by_idx ",obj_info==null); assertTrue("H5Oget_info_by_idx link type",obj_info.type==HDF5Constants.H5O_TYPE_DATASET); assertTrue("Link Address ",obj_info.addr==H5la_l1); } @Test public void testH5Ovisit() { class idata { public String link_name = null; public int link_type = -1; idata(String name, int type) { this.link_name = name; this.link_type = type; } } class H5O_iter_data implements H5O_iterate_t { public ArrayList iterdata = new ArrayList(); } H5O_iterate_t iter_data = new H5O_iter_data(); class H5O_iter_callback implements H5O_iterate_cb { public int callback(int group, String name, H5O_info_t info, H5O_iterate_t op_data) { idata id = new idata(name, info.type); ((H5O_iter_data)op_data).iterdata.add(id); return 0; } } H5O_iterate_cb iter_cb = new H5O_iter_callback(); try { H5.H5Ovisit(H5fid, HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, iter_cb, iter_data); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ovisit: " + err); } assertFalse("H5Ovisit ",((H5O_iter_data)iter_data).iterdata.isEmpty()); assertTrue("H5Ovisit "+((H5O_iter_data)iter_data).iterdata.size(),((H5O_iter_data)iter_data).iterdata.size()==5); assertTrue("H5Ovisit "+(((H5O_iter_data)iter_data).iterdata.get(0)).link_name,(((H5O_iter_data)iter_data).iterdata.get(0)).link_name.compareToIgnoreCase(".")==0); assertTrue("H5Ovisit "+(((H5O_iter_data)iter_data).iterdata.get(1)).link_name,(((H5O_iter_data)iter_data).iterdata.get(1)).link_name.compareToIgnoreCase("DS1")==0); assertTrue("H5Ovisit "+(((H5O_iter_data)iter_data).iterdata.get(2)).link_name,(((H5O_iter_data)iter_data).iterdata.get(2)).link_name.compareToIgnoreCase("DT1")==0); assertTrue("H5Ovisit "+(((H5O_iter_data)iter_data).iterdata.get(3)).link_name,(((H5O_iter_data)iter_data).iterdata.get(3)).link_name.compareToIgnoreCase("G1")==0); assertTrue("H5Ovisit "+(((H5O_iter_data)iter_data).iterdata.get(4)).link_name,(((H5O_iter_data)iter_data).iterdata.get(4)).link_name.compareToIgnoreCase("G1/DS2")==0); // assertTrue("H5Ovisit "+((idata)((H5O_iter_data)iter_data).iterdata.get(5)).link_name,((idata)((H5O_iter_data)iter_data).iterdata.get(5)).link_name.compareToIgnoreCase("L1")==0); } @Test public void testH5Ovisit_by_name() { class idata { public String link_name = null; public int link_type = -1; idata(String name, int type) { this.link_name = name; this.link_type = type; } } class H5O_iter_data implements H5O_iterate_t { public ArrayList iterdata = new ArrayList(); } H5O_iterate_t iter_data = new H5O_iter_data(); class H5O_iter_callback implements H5O_iterate_cb { public int callback(int group, String name, H5O_info_t info, H5O_iterate_t op_data) { idata id = new idata(name, info.type); ((H5O_iter_data)op_data).iterdata.add(id); return 0; } } H5O_iterate_cb iter_cb = new H5O_iter_callback(); try { H5.H5Ovisit_by_name(H5fid, "G1", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, iter_cb, iter_data, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ovisit_by_name: " + err); } assertFalse("H5Ovisit_by_name ",((H5O_iter_data)iter_data).iterdata.isEmpty()); assertTrue("H5Ovisit_by_name "+((H5O_iter_data)iter_data).iterdata.size(),((H5O_iter_data)iter_data).iterdata.size()==2); assertTrue("H5Ovisit_by_name "+(((H5O_iter_data)iter_data).iterdata.get(0)).link_name,(((H5O_iter_data)iter_data).iterdata.get(0)).link_name.compareToIgnoreCase(".")==0); assertTrue("H5Ovisit_by_name "+(((H5O_iter_data)iter_data).iterdata.get(1)).link_name,(((H5O_iter_data)iter_data).iterdata.get(1)).link_name.compareToIgnoreCase("DS2")==0); } } jhdf-2.9/test/hdf5lib/TestH5T.java0000644000175000017500000003661212050301057017561 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5T { private static final String H5_FILE = "test.h5"; int H5fid = -1; int H5strdid = -1; private final void _deleteFile(String filename) { File file = null; try { file = new File(filename); } catch (Throwable err) {} if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0", H5.getOpenIDCount()==0); H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); assertTrue("H5.H5Fcreate", H5fid > 0); H5strdid = H5.H5Tcopy(HDF5Constants.H5T_C_S1); assertTrue("H5.H5Tcopy", H5strdid > 0); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5strdid >= 0) try {H5.H5Tclose(H5strdid);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} _deleteFile(H5_FILE); } @Test(expected = HDF5LibraryException.class) public void testH5Tequal_type_error() throws Throwable { H5.H5Tequal(HDF5Constants.H5T_INTEGER, H5strdid); } @Test public void testH5Tget_class() { try { int result = H5.H5Tget_class(H5strdid); assertTrue("H5.H5Tget_class", result > 0); String class_name = H5.H5Tget_class_name(result); assertTrue("H5.H5Tget_class", class_name.compareTo("H5T_STRING")==0); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tget_class: " + err); } } @Test public void testH5Tget_size() { long dt_size = -1; try { dt_size = H5.H5Tget_size(H5strdid); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tget_size:H5.H5Tget_size " + err); } assertTrue("testH5Tget_size", dt_size > 0); } @Test public void testH5Tset_size() { long dt_size = 5; try { H5.H5Tset_size(H5strdid, dt_size); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tset_size:H5.H5Tset_size " + err); } try { dt_size = H5.H5Tget_size(H5strdid); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tget_size:H5.H5Tget_size " + err); } assertTrue("testH5Tget_size", dt_size == 5); } @Test public void testH5Tarray_create() { int filetype_id = -1; long[] adims = { 3, 5 }; try { filetype_id = H5.H5Tarray_create(HDF5Constants.H5T_STD_I64LE, 2, adims); assertTrue("testH5Tarray_create", filetype_id > 0); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tarray_create.H5Tarray_create " + err); } finally { if (filetype_id >= 0) try {H5.H5Tclose(filetype_id);} catch (Exception ex) {} } } @Test public void testH5Tget_array_ndims() { int filetype_id = -1; int ndims = 0; long[] adims = { 3, 5 }; try { filetype_id = H5.H5Tarray_create(HDF5Constants.H5T_STD_I64LE, 2, adims); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tarray_create.H5Tarray_create " + err); } assertTrue("testH5Tget_array_ndims:H5Tarray_create", filetype_id > 0); try { ndims = H5.H5Tget_array_ndims(filetype_id); assertTrue("testH5Tget_array_ndims", ndims == 2); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tget_array_ndims.H5Tget_array_ndims " + err); } finally { if (filetype_id >= 0) try {H5.H5Tclose(filetype_id);} catch (Exception ex) {} } } @Test public void testH5Tget_array_dims() { int filetype_id = -1; int ndims = 0; long[] adims = { 3, 5 }; long[] rdims = new long[2]; try { filetype_id = H5.H5Tarray_create(HDF5Constants.H5T_STD_I64LE, 2, adims); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tarray_create.H5Tarray_create " + err); } assertTrue("testH5Tget_array_dims:H5Tarray_create", filetype_id > 0); try { ndims = H5.H5Tget_array_dims(filetype_id, rdims); assertTrue("testH5Tget_array_dims", ndims == 2); assertTrue("testH5Tget_array_dims", adims[0] == rdims[0]); assertTrue("testH5Tget_array_dims", adims[1] == rdims[1]); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tget_array_dims.H5Tget_array_dims " + err); } finally { if (filetype_id >= 0) try {H5.H5Tclose(filetype_id);} catch (Exception ex) {} } } @Test public void testH5Tenum_functions() { int filetype_id =-1; String enum_type ="Enum_type"; byte[] enum_val = new byte[1]; String enum_name = null; // Create a enumerate datatype try { filetype_id = H5.H5Tcreate(HDF5Constants.H5T_ENUM, (long)1); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tenum_functions:H5Tcreate " + err); } assertTrue("testH5Tenum_functions:H5Tcreate", filetype_id > 0); try { enum_val[0]=10; H5.H5Tenum_insert(filetype_id, "RED", enum_val); enum_val[0]=11; H5.H5Tenum_insert(filetype_id, "GREEN", enum_val); enum_val[0]=12; H5.H5Tenum_insert(filetype_id, "BLUE", enum_val); enum_val[0]=13; H5.H5Tenum_insert(filetype_id, "ORANGE", enum_val); enum_val[0]=14; H5.H5Tenum_insert(filetype_id, "YELLOW", enum_val); // Query member number and member index by member name, for enumeration type. assertTrue("Can't get member number", H5.H5Tget_nmembers(filetype_id) == 5); assertTrue("Can't get correct index number", H5.H5Tget_member_index(filetype_id, "ORANGE") == 3); // Commit enumeration datatype and close it */ H5.H5Tcommit(H5fid, enum_type, filetype_id, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Tclose(filetype_id); // Open the dataytpe for query filetype_id = H5.H5Topen(H5fid, enum_type, HDF5Constants.H5P_DEFAULT); assertTrue("testH5Tenum_functions:H5Tcreate", filetype_id > 0); // Query member number and member index by member name, for enumeration type assertTrue("Can't get member number", H5.H5Tget_nmembers(filetype_id) == 5); assertTrue("Can't get correct index number", H5.H5Tget_member_index(filetype_id, "ORANGE") == 3); // Query member value by member name, for enumeration type H5.H5Tenum_valueof (filetype_id, "ORANGE", enum_val); assertTrue("Incorrect value for enum member", enum_val[0]==13); // Query member value by member index, for enumeration type H5.H5Tget_member_value (filetype_id, 2, enum_val); assertTrue("Incorrect value for enum member", enum_val[0]==12); // Query member name by member value, for enumeration type enum_val[0] = 14; enum_name = H5.H5Tenum_nameof(filetype_id, enum_val, 16); assertTrue("Incorrect name for enum member", enum_name.compareTo("YELLOW")==0); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tenum_functions:query " + err); } finally { if (filetype_id >= 0) try {H5.H5Tclose(filetype_id);} catch (Exception ex) {} } } @Test public void testH5Tenum_create_functions() { int filetype_id = -1; byte[] enum_val = new byte[1]; // Create a enumerate datatype try { filetype_id = H5.H5Tenum_create(HDF5Constants.H5T_NATIVE_INT); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tenum_create_functions:H5Tcreate " + err); } assertTrue("testH5Tenum_create_functions:H5Tcreate", filetype_id > 0); try { enum_val[0]=10; H5.H5Tenum_insert(filetype_id, "RED", enum_val); enum_val[0]=11; H5.H5Tenum_insert(filetype_id, "GREEN", enum_val); enum_val[0]=12; H5.H5Tenum_insert(filetype_id, "BLUE", enum_val); enum_val[0]=13; H5.H5Tenum_insert(filetype_id, "ORANGE", enum_val); enum_val[0]=14; H5.H5Tenum_insert(filetype_id, "YELLOW", enum_val); // Query member number and member index by member name, for enumeration type. assertTrue("Can't get member number", H5.H5Tget_nmembers(filetype_id) == 5); assertTrue("Can't get correct index number", H5.H5Tget_member_index(filetype_id, "ORANGE") == 3); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tenum_create_functions:H5Tget_nmembers " + err); } finally { if (filetype_id >= 0) try {H5.H5Tclose(filetype_id);} catch (Exception ex) {} } } @Test public void testH5Topaque_functions() { int filetype_id = -1; String opaque_name = null; // Create a enumerate datatype try { filetype_id = H5.H5Tcreate(HDF5Constants.H5T_OPAQUE, (long)4); } catch (Throwable err) { err.printStackTrace(); fail("testH5Topaque_functions:H5Tcreate " + err); } assertTrue("testH5Topaque_functions:H5Tcreate", filetype_id > 0); try { H5.H5Tset_tag(filetype_id, "opaque type"); opaque_name = H5.H5Tget_tag(filetype_id); assertTrue("Incorrect tag for opaque type", opaque_name.compareTo("opaque type")==0); } catch (Throwable err) { err.printStackTrace(); fail("testH5Topaque_functions:H5Tset_get_tag " + err); } finally { if (filetype_id >= 0) try {H5.H5Tclose(filetype_id);} catch (Exception ex) {} } } @Test public void testH5Tvlen_create() { int filetype_id = -1; try { filetype_id = H5.H5Tvlen_create(HDF5Constants.H5T_C_S1); assertTrue("testH5Tvlen_create", filetype_id > 0); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tvlen_create.H5Tvlen_create " + err); } finally { if (filetype_id >= 0) try {H5.H5Tclose(filetype_id);} catch (Exception ex) {} } } @Test public void testH5Tis_variable_str() { int filetype_id = -1; try { filetype_id = H5.H5Tcopy(HDF5Constants.H5T_C_S1); assertTrue("testH5Tis_variable_str", filetype_id > 0); // Convert to variable-length string H5.H5Tset_size(filetype_id, HDF5Constants.H5T_VARIABLE); // Check if datatype is VL string int vlclass = H5.H5Tget_class(filetype_id); assertTrue("testH5Tis_variable_str:H5Tget_class", vlclass == HDF5Constants.H5T_STRING); assertTrue("testH5Tis_variable_str:H5Tis_variable_str", H5.H5Tis_variable_str(filetype_id)); // Verify that the class detects as a string assertTrue("testH5Tis_variable_str:H5Tdetect_class", H5.H5Tdetect_class(filetype_id, HDF5Constants.H5T_STRING)); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tis_variable_str.H5Tis_variable_str " + err); } finally { if (filetype_id >= 0) try {H5.H5Tclose(filetype_id);} catch (Exception ex) {} } } @Test public void testH5Tcompound_functions() { int filetype_id =-1; // Create a enumerate datatype try { filetype_id = H5.H5Tcreate(HDF5Constants.H5T_COMPOUND, (long)16); } catch (Throwable err) { err.printStackTrace(); fail("testH5Tcompound_functions:H5Tcreate " + err); } assertTrue("testH5Tcompound_functions:H5Tcreate", filetype_id > 0); try { H5.H5Tinsert(filetype_id, "Lon", 0, HDF5Constants.H5T_NATIVE_DOUBLE); H5.H5Tinsert(filetype_id, "Lat", 8, HDF5Constants.H5T_NATIVE_DOUBLE); // Query member number and member index by member name, for enumeration type. assertTrue("Can't get member number", H5.H5Tget_nmembers(filetype_id) == 2); assertTrue("Can't get correct index number", H5.H5Tget_member_index(filetype_id, "Lat") == 1); // We started to support this function for compound type in 1.8.6 release. int order = H5.H5Tget_order(filetype_id); assertFalse("Can't get order for compound type.", order == HDF5Constants.H5T_ORDER_ERROR); assertTrue("Wrong order for this type.", (order == HDF5Constants.H5T_ORDER_LE) || (order == HDF5Constants.H5T_ORDER_BE)); // Make certain that the correct classes can be detected assertTrue("Can't get correct class", H5.H5Tdetect_class(filetype_id, HDF5Constants.H5T_COMPOUND)); assertTrue("Can't get correct class", H5.H5Tdetect_class(filetype_id, HDF5Constants.H5T_FLOAT)); // Make certain that an incorrect class is not detected assertFalse("Can get incorrect class", H5.H5Tdetect_class(filetype_id, HDF5Constants.H5T_TIME)); // Query member name by member index String index_name = H5.H5Tget_member_name (filetype_id, 0); assertTrue("Incorrect name for member index", index_name.compareTo("Lon")==0); // Query member offset by member no long index_offset = H5.H5Tget_member_offset (filetype_id, 1); assertTrue("Incorrect offset for member no", index_offset == 8); // Query member type by member index int index_type = H5.H5Tget_member_type (filetype_id, 0); assertTrue("Incorrect type for member index", H5.H5Tequal(HDF5Constants.H5T_NATIVE_DOUBLE, index_type)); if (index_type >= 0) try {H5.H5Tclose(index_type);} catch (Exception ex) {} } catch (Throwable err) { err.printStackTrace(); fail("testH5Tcompound_functions:query " + err); } finally { if (filetype_id >= 0) try {H5.H5Tclose(filetype_id);} catch (Exception ex) {} } } } jhdf-2.9/test/hdf5lib/TestH5Lcreate.java0000644000175000017500000010462312050301057020733 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.util.ArrayList; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.callbacks.H5L_iterate_cb; import ncsa.hdf.hdf5lib.callbacks.H5L_iterate_t; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.hdf5lib.structs.H5L_info_t; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5Lcreate { private static final String H5_EXTFILE = "test/hdf5lib/h5ex_g_iterate.hdf"; private static final String H5_FILE = "test.h5"; private static final int DIM_X = 4; private static final int DIM_Y = 6; int H5fcpl = -1; int H5fid = -1; int H5dsid = -1; int H5did1 = -1; int H5did2 = -1; int H5gcpl = -1; int H5gid = -1; long[] H5dims = { DIM_X, DIM_Y }; private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try { file.delete(); } catch (Exception e) { e.printStackTrace(); } } } private final int _createDataset(int fid, int dsid, String name, int dapl) { int did = -1; try { did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5L._createDataset: ",did > 0); return did; } private final int _createGroup(int fid, String name) { int gid = -1; try { H5gcpl = HDF5Constants.H5P_DEFAULT; gid = H5.H5Gcreate(fid, name, HDF5Constants.H5P_DEFAULT, H5gcpl, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Gcreate: " + err); } assertTrue("TestH5L._createGroup: ",gid > 0); return gid; } private final void _createHardLink(int fid, int cid, String curname, int did, String dstname, int lcpl, int lapl) { boolean link_exists = false; try { H5.H5Lcreate_hard(cid, curname, did, dstname, lcpl, lapl); H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_LOCAL); link_exists = H5.H5Lexists(did, dstname, lapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lcreate_hard: " + err); } assertTrue("TestH5L._createHardLink ", link_exists); } private final void _createSoftLink(int fid, String curname, int did, String dstname, int lcpl, int lapl) { boolean link_exists = false; try { H5.H5Lcreate_soft(curname, did, dstname, lcpl, lapl); H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_LOCAL); link_exists = H5.H5Lexists(did, dstname, lapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lcreate_soft: " + err); } assertTrue("TestH5L._createSoftLink ", link_exists); } private final void _createExternalLink(int fid, String ext_filename, String curname, int did, String dstname, int lcpl, int lapl) { boolean link_exists = false; try { H5.H5Lcreate_external(ext_filename, curname, did, dstname, lcpl, lapl); H5.H5Fflush(fid, HDF5Constants.H5F_SCOPE_LOCAL); link_exists = H5.H5Lexists(did, dstname, lapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lcreate_external: " + err); } assertTrue("TestH5L._createExternalLink ", link_exists); } @Before public void createH5file() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { H5fcpl = H5.H5Pcreate(HDF5Constants.H5P_FILE_CREATE); H5.H5Pset_link_creation_order(H5fcpl, HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, H5fcpl, HDF5Constants.H5P_DEFAULT); H5dsid = H5.H5Screate_simple(2, H5dims, null); H5did1 = _createDataset(H5fid, H5dsid, "DS1", HDF5Constants.H5P_DEFAULT); H5gid = _createGroup(H5fid, "/G1"); H5did2 = _createDataset(H5gid, H5dsid, "DS2", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("TestH5L.createH5file: " + err); } assertTrue("TestH5L.createH5file: H5.H5Fcreate: ",H5fid > 0); assertTrue("TestH5L.createH5file: H5.H5Screate_simple: ",H5dsid > 0); assertTrue("TestH5L.createH5file: H5.H5Gcreate: ",H5gid > 0); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } @After public void deleteH5file() throws HDF5LibraryException { if (H5gid > 0) try {H5.H5Gclose(H5gid);} catch (Exception ex) {} if (H5gcpl > 0) try {H5.H5Pclose(H5gcpl);} catch (Exception ex) {} if (H5did2 > 0) try {H5.H5Dclose(H5did2);} catch (Exception ex) {} if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5did1 > 0) try {H5.H5Dclose(H5did1);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} if (H5fcpl > 0) try {H5.H5Pclose(H5fcpl);} catch (Exception ex) {} _deleteFile(H5_FILE); } @Test public void testH5Lget_info_by_idx_n0_create() { H5L_info_t link_info = null; try { int order = H5.H5Pget_link_creation_order(H5fcpl); assertTrue("creation order :"+order, order == HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx_n0_create:H5Pget_link_creation_order " + err); } try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("H5Lget_info_by_idx ", link_info==null); assertTrue("H5Lget_info_by_idx link type", link_info.type==HDF5Constants.H5L_TYPE_HARD); } @Test public void testH5Lget_info_by_idx_n1_create() { H5L_info_t link_info = null; try { int order = H5.H5Pget_link_creation_order(H5fcpl); assertTrue("creation order :"+order, order == HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx_n1_create:H5Pget_link_creation_order " + err); } try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 1, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("H5Lget_info_by_idx ", link_info==null); assertTrue("H5Lget_info_by_idx link type", link_info.type==HDF5Constants.H5L_TYPE_HARD); } @Test(expected = HDF5LibraryException.class) public void testH5Lcreate_hard_cur_not_exists() throws Throwable { H5.H5Lcreate_hard(H5fid, "None", H5fid, "DS1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Lcreate_hard() { try { H5.H5Lcreate_hard(H5fid, "DS1", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "L1", HDF5Constants.H5P_DEFAULT); assertTrue("testH5Lcreate_hard:H5Lexists ", link_exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } } @Test(expected = HDF5LibraryException.class) public void testH5Lcreate_hard_dst_link_exists() throws Throwable { _createHardLink(H5fid, H5fid, "/G1/DS2", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Lcreate_hard(H5fid, "L1", H5fid, "/G1/DS2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Ldelete_hard_link() { _createHardLink(H5fid, H5fid, "/G1/DS2", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { H5.H5Ldelete(H5fid, "L1", HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "L1", HDF5Constants.H5P_DEFAULT); assertFalse("testH5Lcreate_hard:H5Lexists ", link_exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } } @Test public void testH5Lcreate_soft() { try { H5.H5Lcreate_soft("DS1", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "L1", HDF5Constants.H5P_DEFAULT); assertTrue("testH5Lcreate_soft:H5Lexists ", link_exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } } @Test(expected = HDF5LibraryException.class) public void testH5Lcreate_soft_dst_link_exists() throws Throwable { _createSoftLink(H5fid, "/G1/DS2", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Lcreate_soft("L1", H5fid, "/G1/DS2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Ldelete_soft_link() { _createSoftLink(H5fid, "/G1/DS2", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { H5.H5Ldelete(H5fid, "L1", HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "L1", HDF5Constants.H5P_DEFAULT); assertFalse("testH5Lcreate_soft:H5Lexists ", link_exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } } @Test public void testH5Lget_info_softlink() { H5L_info_t link_info = null; _createSoftLink(H5fid, "/G1/DS2", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_info = H5.H5Lget_info(H5fid, "L1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info: " + err); } assertFalse("H5Lget_info ", link_info==null); assertTrue("H5Lget_info link type", link_info.type==HDF5Constants.H5L_TYPE_SOFT); assertTrue("Link Address ", link_info.address_val_size>0); } @Test public void testH5Lget_val_soft() { String[] link_value = {null, null}; int link_type = -1; _createSoftLink(H5fid, "/G1/DS2", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_type = H5.H5Lget_val(H5fid, "L1", link_value, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_val: " + err); } assertTrue("Link Type", link_type == HDF5Constants.H5L_TYPE_SOFT); assertFalse("H5Lget_val ", link_value[0]==null); assertTrue("Link Value ", link_value[0].compareTo("/G1/DS2")==0); } @Test public void testH5Lcreate_soft_dangle() { try { H5.H5Lcreate_soft("DS3", H5fid, "L2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "L2", HDF5Constants.H5P_DEFAULT); assertTrue("testH5Lcreate_soft:H5Lexists ", link_exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } } @Test public void testH5Ldelete_soft_link_dangle() { _createSoftLink(H5fid, "DS3", H5fid, "L2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { H5.H5Ldelete(H5fid, "L2", HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "L2", HDF5Constants.H5P_DEFAULT); assertFalse("testH5Lcreate_soft:H5Lexists ", link_exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } } @Test public void testH5Lget_info_softlink_dangle() { H5L_info_t link_info = null; _createSoftLink(H5fid, "DS3", H5fid, "L2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_info = H5.H5Lget_info(H5fid, "L2", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info: " + err); } assertFalse("H5Lget_info ", link_info==null); assertTrue("H5Lget_info link type", link_info.type==HDF5Constants.H5L_TYPE_SOFT); assertTrue("Link Address ", link_info.address_val_size>0); } @Test public void testH5Lget_val_dangle() { String[] link_value = {null,null}; int link_type = -1; _createSoftLink(H5fid, "DS3", H5fid, "L2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_type = H5.H5Lget_val(H5fid, "L2", link_value, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_val: " + err); } assertTrue("Link Type", link_type == HDF5Constants.H5L_TYPE_SOFT); assertFalse("H5Lget_val ", link_value[0]==null); assertTrue("Link Value ", link_value[0].compareTo("DS3")==0); } @Test public void testH5Lcreate_external() { try { H5.H5Lcreate_external(H5_EXTFILE, "DT1", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "L1", HDF5Constants.H5P_DEFAULT); assertTrue("testH5Lcreate_external:H5Lexists ", link_exists); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lexists: " + err); } } @Test public void testH5Lget_info_externallink() { H5L_info_t link_info = null; _createExternalLink(H5fid, H5_EXTFILE, "DT1", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_info = H5.H5Lget_info(H5fid, "L1", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info: " + err); } assertFalse("H5Lget_info ", link_info==null); assertTrue("H5Lget_info link type", link_info.type==HDF5Constants.H5L_TYPE_EXTERNAL); assertTrue("Link Address ", link_info.address_val_size>0); } @Test public void testH5Lget_val_external(){ String[] link_value = {null,null}; int link_type = -1; _createExternalLink(H5fid, H5_EXTFILE, "DT1", H5fid, "L1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_type = H5.H5Lget_val(H5fid, "L1", link_value, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_val: " + err); } assertTrue("Link Type", link_type == HDF5Constants.H5L_TYPE_EXTERNAL); assertFalse("H5Lget_val ", link_value[0]==null); assertFalse("H5Lget_val ", link_value[1]==null); assertTrue("Link Value ", link_value[0].compareTo("DT1")==0); } @Test(expected = HDF5LibraryException.class) public void testH5Lcopy_cur_not_exists() throws Throwable { H5.H5Lcopy(H5fid, "None", H5fid, "DS1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Lcopy() { try { H5.H5Lcopy(H5fid, "DS1", H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "CPY1", HDF5Constants.H5P_DEFAULT); assertTrue("testH5Lcopy:H5Lexists ", link_exists); } catch (Throwable err) { err.printStackTrace(); fail("testH5Lcopy:H5Lexists: " + err); } } @Test(expected = HDF5LibraryException.class) public void testH5Lcopy_dst_link_exists() throws Throwable { _createHardLink(H5fid, H5fid, "/G1/DS2", H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Lcopy(H5fid, "CPY1", H5fid, "/G1/DS2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Lmove_cur_not_exists() throws Throwable { H5.H5Lmove(H5fid, "None", H5fid, "DS1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Lmove() { try { H5.H5Lmove(H5fid, "DS1", H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); boolean link_exists = H5.H5Lexists(H5fid, "CPY1", HDF5Constants.H5P_DEFAULT); assertTrue("testH5Lmove:H5Lexists ", link_exists); link_exists = H5.H5Lexists(H5fid, "DS1", HDF5Constants.H5P_DEFAULT); assertFalse("testH5Lmove:H5Lexists ", link_exists); } catch (Throwable err) { err.printStackTrace(); fail("testH5Lmove:H5Lexists: " + err); } } @Test(expected = HDF5LibraryException.class) public void testH5Lmove_dst_link_exists() throws Throwable { _createHardLink(H5fid, H5fid, "/G1/DS2", H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); H5.H5Lmove(H5fid, "CPY1", H5fid, "/G1/DS2", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_val_by_idx_not_exist_name() throws Throwable { String[] link_value = {null,null}; H5.H5Lget_val_by_idx(H5fid, "None", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, link_value, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Lget_val_by_idx_not_exist_create() throws Throwable { String[] link_value = {null,null}; H5.H5Lget_val_by_idx(H5fid, "None", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0, link_value, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Lget_val_by_idx_n2_name() { H5L_info_t link_info = null; String[] link_value = {null,null}; int link_type = -1; _createSoftLink(H5fid, "/G1/DS2", H5fid, "LS", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("testH5Lget_val_by_idx_n2 ",link_info==null); assertTrue("testH5Lget_val_by_idx_n2 link type", link_info.type==HDF5Constants.H5L_TYPE_SOFT); try { link_type = H5.H5Lget_val_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 2, link_value, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_val_by_idx: " + err); } assertTrue("Link Type", link_type == HDF5Constants.H5L_TYPE_SOFT); assertFalse("testH5Lget_val_by_idx_n2 ", link_value[0]==null); assertTrue("testH5Lget_val_by_idx_n2 Link Value ", link_value[0].compareTo("/G1/DS2")==0); } @Test public void testH5Lget_val_by_idx_n2_create() { H5L_info_t link_info = null; String[] link_value = {null,null}; int link_type = -1; try { int order = H5.H5Pget_link_creation_order(H5fcpl); assertTrue("creation order :"+order, order == HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_val_by_idx_n2_create: H5Pget_link_creation_order " + err); } _createSoftLink(H5fid, "/G1/DS2", H5fid, "LS", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("testH5Lget_val_by_idx_n2 ", link_info==null); assertTrue("testH5Lget_val_by_idx_n2 link type", link_info.type==HDF5Constants.H5L_TYPE_SOFT); try { link_type = H5.H5Lget_val_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 2, link_value, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_val_by_idx: " + err); } assertTrue("Link Type", link_type == HDF5Constants.H5L_TYPE_SOFT); assertFalse("testH5Lget_val_by_idx_n2 ", link_value[0]==null); assertTrue("testH5Lget_val_by_idx_n2 Link Value ", link_value[0].compareTo("/G1/DS2")==0); } @Test public void testH5Lget_val_by_idx_external_name() { H5L_info_t link_info = null; String[] link_value = {null,null}; int link_type = -1; _createExternalLink(H5fid, H5_EXTFILE, "DT1", H5fid, "LE", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("testH5Lget_val_by_idx_ext ", link_info==null); assertTrue("testH5Lget_val_by_idx_ext link type "+link_info.type, link_info.type==HDF5Constants.H5L_TYPE_EXTERNAL); try { link_type = H5.H5Lget_val_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 2, link_value, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_val_by_idx: " + err); } assertTrue("Link Type", link_type == HDF5Constants.H5L_TYPE_EXTERNAL); assertFalse("testH5Lget_val_by_idx_ext ", link_value[0]==null); assertFalse("testH5Lget_val_by_idx_ext ", link_value[1]==null); assertTrue("testH5Lget_val_by_idx_ext Link Value ", link_value[0].compareTo("DT1")==0); } @Test public void testH5Lget_val_by_idx_external_create() { H5L_info_t link_info = null; String[] link_value = {null,null}; int link_type = -1; _createExternalLink(H5fid, H5_EXTFILE, "DT1", H5fid, "LE", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("testH5Lget_val_by_idx_ext ", link_info==null); assertTrue("testH5Lget_val_by_idx_ext link type "+link_info.type, link_info.type==HDF5Constants.H5L_TYPE_EXTERNAL); try { link_type = H5.H5Lget_val_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 2, link_value, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_val_by_idx: " + err); } assertTrue("Link Type", link_type == HDF5Constants.H5L_TYPE_EXTERNAL); assertFalse("testH5Lget_val_by_idx_ext ", link_value[0]==null); assertFalse("testH5Lget_val_by_idx_ext ", link_value[1]==null); assertTrue("testH5Lget_val_by_idx_ext Link Value ", link_value[0].compareTo("DT1")==0); } @Test(expected = HDF5LibraryException.class) public void testH5Ldelete_by_idx_not_exist_name() throws Throwable { H5.H5Ldelete_by_idx(H5fid, "None", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } @Test(expected = HDF5LibraryException.class) public void testH5Ldelete_by_idx_not_exist_create() throws Throwable { H5.H5Ldelete_by_idx(H5fid, "None", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0, HDF5Constants.H5P_DEFAULT); } @Test public void testH5Ldelete_by_idx_n2_name() { H5L_info_t link_info = null; _createSoftLink(H5fid, "/G1/DS2", H5fid, "LS", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("testH5Ldelete_by_idx_n2 ", link_info==null); assertTrue("testH5Ldelete_by_idx_n2 link type", link_info.type==HDF5Constants.H5L_TYPE_SOFT); try { H5.H5Ldelete_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ldelete_by_idx: " + err); } try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_NAME, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (HDF5LibraryException err) { link_info = null; } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ldelete_by_idx: " + err); } assertTrue("testH5Ldelete_by_idx_n2 ",link_info==null); } @Test public void testH5Ldelete_by_idx_n2_create() { H5L_info_t link_info = null; _createSoftLink(H5fid, "/G1/DS2", H5fid, "LS", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lget_info_by_idx: " + err); } assertFalse("testH5Ldelete_by_idx_n2 ", link_info==null); assertTrue("testH5Ldelete_by_idx_n2 link type", link_info.type==HDF5Constants.H5L_TYPE_SOFT); try { H5.H5Ldelete_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ldelete_by_idx: " + err); } try { link_info = H5.H5Lget_info_by_idx(H5fid, "/", HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 2, HDF5Constants.H5P_DEFAULT); } catch (HDF5LibraryException err) { link_info = null; } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Ldelete_by_idx: " + err); } assertTrue("testH5Ldelete_by_idx_n2 ",link_info==null); } @Test public void testH5Lvisit_create() { try { int order = H5.H5Pget_link_creation_order(H5fcpl); assertTrue("creation order :"+order, order == HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lvisit_create: H5Pget_link_creation_order " + err); } _createHardLink(H5fid, H5fid, "/G1/DS2", H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); _createExternalLink(H5fid, H5_EXTFILE, "DT1", H5fid, "LE", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); _createSoftLink(H5fid, "/G1/DS2", H5fid, "LS", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); class idata { public String link_name = null; public int link_type = -1; idata(String name, int type) { this.link_name = name; this.link_type = type; } } class H5L_iter_data implements H5L_iterate_t { public ArrayList iterdata = new ArrayList(); } H5L_iterate_t iter_data = new H5L_iter_data(); class H5L_iter_callback implements H5L_iterate_cb { public int callback(int group, String name, H5L_info_t info, H5L_iterate_t op_data) { idata id = new idata(name, info.type); ((H5L_iter_data)op_data).iterdata.add(id); return 0; } } H5L_iterate_cb iter_cb = new H5L_iter_callback(); try { H5.H5Lvisit(H5fid, HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, iter_cb, iter_data); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Lvisit: " + err); } assertFalse("H5Lvisit ",((H5L_iter_data)iter_data).iterdata.isEmpty()); assertTrue("H5Lvisit "+((H5L_iter_data)iter_data).iterdata.size(),((H5L_iter_data)iter_data).iterdata.size()==6); assertTrue("H5Lvisit "+((idata)((H5L_iter_data)iter_data).iterdata.get(0)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(0)).link_name.compareToIgnoreCase("DS1")==0); assertTrue("H5Lvisit "+((idata)((H5L_iter_data)iter_data).iterdata.get(1)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(1)).link_name.compareToIgnoreCase("G1")==0); assertTrue("H5Lvisit "+((idata)((H5L_iter_data)iter_data).iterdata.get(2)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(2)).link_name.compareToIgnoreCase("G1/DS2")==0); assertTrue("H5Lvisit "+((idata)((H5L_iter_data)iter_data).iterdata.get(3)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(3)).link_name.compareToIgnoreCase("CPY1")==0); assertTrue("H5Lvisit "+((idata)((H5L_iter_data)iter_data).iterdata.get(4)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(4)).link_name.compareToIgnoreCase("LE")==0); assertTrue("H5Lvisit "+((idata)((H5L_iter_data)iter_data).iterdata.get(5)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(5)).link_name.compareToIgnoreCase("LS")==0); } @Test public void testH5Literate_create() { try { int order = H5.H5Pget_link_creation_order(H5fcpl); assertTrue("creation order :"+order, order == HDF5Constants.H5P_CRT_ORDER_TRACKED+HDF5Constants.H5P_CRT_ORDER_INDEXED); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Literate_create: H5Pget_link_creation_order " + err); } _createHardLink(H5fid, H5fid, "/G1/DS2", H5fid, "CPY1", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); _createExternalLink(H5fid, H5_EXTFILE, "DT1", H5fid, "LE", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); _createSoftLink(H5fid, "/G1/DS2", H5fid, "LS", HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); class idata { public String link_name = null; public int link_type = -1; idata(String name, int type) { this.link_name = name; this.link_type = type; } } class H5L_iter_data implements H5L_iterate_t { public ArrayList iterdata = new ArrayList(); } H5L_iterate_t iter_data = new H5L_iter_data(); class H5L_iter_callback implements H5L_iterate_cb { public int callback(int group, String name, H5L_info_t info, H5L_iterate_t op_data) { idata id = new idata(name, info.type); ((H5L_iter_data)op_data).iterdata.add(id); return 0; } } H5L_iterate_cb iter_cb = new H5L_iter_callback(); try { H5.H5Literate(H5fid, HDF5Constants.H5_INDEX_CRT_ORDER, HDF5Constants.H5_ITER_INC, 0L, iter_cb, iter_data); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Literate: " + err); } assertFalse("H5Literate ",((H5L_iter_data)iter_data).iterdata.isEmpty()); assertTrue("H5Literate "+((H5L_iter_data)iter_data).iterdata.size(),((H5L_iter_data)iter_data).iterdata.size()==5); assertTrue("H5Literate "+((idata)((H5L_iter_data)iter_data).iterdata.get(0)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(0)).link_name.compareToIgnoreCase("DS1")==0); assertTrue("H5Literate "+((idata)((H5L_iter_data)iter_data).iterdata.get(1)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(1)).link_name.compareToIgnoreCase("G1")==0); assertTrue("H5Literate "+((idata)((H5L_iter_data)iter_data).iterdata.get(2)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(2)).link_name.compareToIgnoreCase("CPY1")==0); assertTrue("H5Literate "+((idata)((H5L_iter_data)iter_data).iterdata.get(3)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(3)).link_name.compareToIgnoreCase("LE")==0); assertTrue("H5Literate "+((idata)((H5L_iter_data)iter_data).iterdata.get(4)).link_name,((idata)((H5L_iter_data)iter_data).iterdata.get(4)).link_name.compareToIgnoreCase("LS")==0); } } jhdf-2.9/test/hdf5lib/TestH5P.java0000644000175000017500000012171412050301057017553 0ustar sylvestresylvestrepackage test.hdf5lib; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestH5P { private static final String H5_FILE = "test.h5"; private static final int DIM_X = 4; private static final int DIM_Y = 6; long[] H5dims = { DIM_X, DIM_Y }; int H5fid = -1; int H5dsid = -1; int H5did = -1; int lapl_id = -1; int fapl_id = -1; int fcpl_id = -1; int ocpl_id = -1; int ocp_plist_id = -1; int lcpl_id = -1; int plapl_id = -1; int plist_id = -1; int gapl_id = -1; int gcpl_id = -1; int acpl_id = -1; private final void _deleteFile(String filename) { File file = new File(filename); if (file.exists()) { try {file.delete();} catch (SecurityException e) {} } } private final int _createDataset(int fid, int dsid, String name, int dapl) { int did = -1; try { did = H5.H5Dcreate(fid, name, HDF5Constants.H5T_STD_I32BE, dsid, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, dapl); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Dcreate: " + err); } assertTrue("TestH5D._createDataset: ", did > 0); return did; } private final void _createH5File(int fcpl, int fapl) { try { H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, fcpl, fapl); H5dsid = H5.H5Screate_simple(2, H5dims, null); H5did = _createDataset(H5fid, H5dsid, "dset", HDF5Constants.H5P_DEFAULT); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } assertTrue("TestH5D.createH5file: H5.H5Fcreate: ", H5fid > 0); assertTrue("TestH5D.createH5file: H5.H5Screate_simple: ", H5dsid > 0); assertTrue("TestH5D.createH5file: _createDataset: ", H5did > 0); try { H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); } catch (Throwable err) { err.printStackTrace(); } } public void deleteH5file() throws HDF5LibraryException { _deleteFile(H5_FILE); } @Before public void createH5fileProperties() throws NullPointerException, HDF5Exception { assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); try { lapl_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_ACCESS); fapl_id = H5.H5Pcreate(HDF5Constants.H5P_FILE_ACCESS); fcpl_id = H5.H5Pcreate(HDF5Constants.H5P_FILE_CREATE); ocpl_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_CREATE); ocp_plist_id = H5.H5Pcreate(HDF5Constants.H5P_OBJECT_COPY); lcpl_id = H5.H5Pcreate(HDF5Constants.H5P_LINK_CREATE); plapl_id = H5.H5Pcreate(HDF5Constants.H5P_LINK_ACCESS); plist_id = H5.H5Pcreate(HDF5Constants.H5P_DATASET_XFER); gapl_id = H5.H5Pcreate(HDF5Constants.H5P_GROUP_ACCESS); gcpl_id = H5.H5Pcreate(HDF5Constants.H5P_GROUP_CREATE); acpl_id = H5.H5Pcreate(HDF5Constants.H5P_ATTRIBUTE_CREATE); } catch (Throwable err) { err.printStackTrace(); fail("TestH5D.createH5file: " + err); } assertTrue(lapl_id > 0); assertTrue(fapl_id > 0); assertTrue(fcpl_id > 0); assertTrue(ocpl_id > 0); assertTrue(ocp_plist_id > 0); assertTrue(lcpl_id > 0); assertTrue(plapl_id>0); assertTrue(plist_id > 0); assertTrue(gapl_id > 0); assertTrue(gcpl_id >0); assertTrue(acpl_id >0); } @After public void deleteH5fileProperties() throws HDF5LibraryException { if (lapl_id >0) try {H5.H5Pclose(lapl_id);} catch (Exception ex) {} if (fapl_id >0) try {H5.H5Pclose(fapl_id);} catch (Exception ex) {} if (fcpl_id >0) try {H5.H5Pclose(fcpl_id);} catch (Exception ex) {} if (ocpl_id >0) try {H5.H5Pclose(ocpl_id);} catch (Exception ex) {} if (ocp_plist_id >0) try {H5.H5Pclose(ocp_plist_id);} catch (Exception ex) {} if (lcpl_id >0) try {H5.H5Pclose(lcpl_id);} catch (Exception ex) {} if (plapl_id >0) try {H5.H5Pclose(plapl_id);} catch (Exception ex) {} if (plist_id >0) try {H5.H5Pclose(plist_id);} catch (Exception ex) {} if (gapl_id >0) try {H5.H5Pclose(gapl_id);} catch (Exception ex) {} if (gcpl_id >0) try {H5.H5Pclose(gcpl_id);} catch (Exception ex) {} if (acpl_id >0) try {H5.H5Pclose(acpl_id);} catch (Exception ex) {} if (H5dsid > 0) try {H5.H5Sclose(H5dsid);} catch (Exception ex) {} if (H5did > 0) try {H5.H5Dclose(H5did);} catch (Exception ex) {} if (H5fid > 0) try {H5.H5Fclose(H5fid);} catch (Exception ex) {} } @Test public void testH5Pget_nlinks() { long nlinks = -1; try { nlinks = (long) H5.H5Pget_nlinks(lapl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Pget_nlinks: " + err); } assertTrue("testH5Pget_nlinks", nlinks > 0); // Check the default value of nlinks. assertEquals(nlinks, 16L); } @Test public void testH5Pset_nlinks() { long nlinks = 20; int ret_val = -1; try { ret_val = H5.H5Pset_nlinks(lapl_id, nlinks); nlinks = (long) H5.H5Pget_nlinks(lapl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5.H5Pset_nlinks: " + err); } assertTrue("testH5Pset_nlinks", ret_val >= 0); // Check the value of nlinks retrieved from H5Pget_nlinks function. assertEquals(nlinks, 20L); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_libver_bounds_invalidlow() throws Throwable { H5.H5Pset_libver_bounds(fapl_id, 5, HDF5Constants.H5F_LIBVER_LATEST); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_libver_bounds_invalidhigh() throws Throwable { H5.H5Pset_libver_bounds(fapl_id, HDF5Constants.H5F_LIBVER_LATEST, 5); } @Test public void testH5Pget_link_creation_order() { int crt_order_flags = 0; try { crt_order_flags = H5.H5Pget_link_creation_order(fcpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_link_creation_order: " + err); } assertTrue("testH5Pget_link_creation_order", crt_order_flags >= 0); } @Test public void testH5Pset_link_creation_order_trackedPLUSindexed() { int ret_val = -1; int crt_order_flags = HDF5Constants.H5P_CRT_ORDER_TRACKED + HDF5Constants.H5P_CRT_ORDER_INDEXED; int crtorderflags = 0; try { ret_val = H5.H5Pset_link_creation_order(fcpl_id, crt_order_flags); crtorderflags = H5.H5Pget_link_creation_order(fcpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_link_creation_order: " + err); } assertTrue("testH5Pset_link_creation_order_trackedPLUSindexed",ret_val >= 0); assertEquals(crt_order_flags, crtorderflags); } @Test public void testH5Pset_link_creation_order_tracked() { int ret_val = -1; int crtorderflags = 0; try { ret_val = H5.H5Pset_link_creation_order(fcpl_id, HDF5Constants.H5P_CRT_ORDER_TRACKED); crtorderflags = H5.H5Pget_link_creation_order(fcpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_link_creation_order: " + err); } assertTrue("testH5Pset_link_creation_order_tracked",ret_val >= 0); assertEquals(HDF5Constants.H5P_CRT_ORDER_TRACKED, crtorderflags); } @Test(expected = HDF5LibraryException.class) public void testH5Pset_link_creation_order_invalidvalue() throws Throwable { H5.H5Pset_link_creation_order(fcpl_id, HDF5Constants.H5P_CRT_ORDER_INDEXED); } @Test public void testH5Pget_attr_creation_order() { int crt_order_flags = 0; try { crt_order_flags = H5.H5Pget_attr_creation_order(ocpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_attr_creation_order: " + err); } assertTrue("testH5Pget_attr_creation_order", crt_order_flags >= 0); } @Test public void testH5Pset_attr_creation_order_trackedPLUSindexed() { int ret_val = -1; int crt_order_flags = HDF5Constants.H5P_CRT_ORDER_TRACKED + HDF5Constants.H5P_CRT_ORDER_INDEXED; int crtorderflags = 0; try { ret_val = H5.H5Pset_attr_creation_order(ocpl_id, crt_order_flags); crtorderflags = H5.H5Pget_attr_creation_order(ocpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_attr_creation_order: " + err); } assertTrue("testH5Pset_attr_creation_order_trackedPLUSindexed", ret_val >= 0); assertEquals(crt_order_flags, crtorderflags); } @Test public void testH5Pset_attr_creation_order_tracked() { int ret_val = -1; int crtorderflags = 0; try { ret_val = H5.H5Pset_attr_creation_order(ocpl_id, HDF5Constants.H5P_CRT_ORDER_TRACKED); crtorderflags = H5.H5Pget_attr_creation_order(ocpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_attr_creation_order: " + err); } assertTrue("testH5Pset_attr_creation_order_tracked", ret_val >= 0); assertEquals(HDF5Constants.H5P_CRT_ORDER_TRACKED, crtorderflags); } @Test(expected = HDF5LibraryException.class) public void testH5Pset_attr_creation_order_invalidvalue() throws Throwable { H5.H5Pset_attr_creation_order(ocpl_id, HDF5Constants.H5P_CRT_ORDER_INDEXED); } @Test public void testH5Pset_copy_object() { int cpy_option = -1; try { H5.H5Pset_copy_object(ocp_plist_id, HDF5Constants.H5O_COPY_SHALLOW_HIERARCHY_FLAG); cpy_option = H5.H5Pget_copy_object(ocp_plist_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_copy_object: " + err); } assertEquals(HDF5Constants.H5O_COPY_SHALLOW_HIERARCHY_FLAG, cpy_option); try { H5.H5Pset_copy_object(ocp_plist_id, HDF5Constants.H5O_COPY_EXPAND_REFERENCE_FLAG); cpy_option = H5.H5Pget_copy_object(ocp_plist_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_copy_object: " + err); } assertEquals(HDF5Constants.H5O_COPY_EXPAND_REFERENCE_FLAG, cpy_option); } @Test(expected = HDF5LibraryException.class) public void testH5Pset_copy_object_invalidobject() throws Throwable { H5.H5Pset_copy_object(HDF5Constants.H5P_DEFAULT, HDF5Constants.H5O_COPY_SHALLOW_HIERARCHY_FLAG); } @Test public void testH5Pset_create_intermediate_group() { int ret_val = -1; try { ret_val = H5.H5Pset_create_intermediate_group(lcpl_id, true); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_create_intermediate_group: " + err); } assertTrue(ret_val>=0); } @Test(expected = HDF5LibraryException.class) public void testH5Pset_create_intermediate_group_invalidobject() throws Throwable { H5.H5Pset_create_intermediate_group(ocp_plist_id, true); } @Test public void testH5Pget_create_intermediate_group() { boolean flag = false; try { H5.H5Pset_create_intermediate_group(lcpl_id, true); flag = H5.H5Pget_create_intermediate_group(lcpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_create_intermediate_group: " + err); } assertEquals(true, flag); } @Test public void testH5Pget_create_intermediate_group_notcreated() { boolean flag = true; try { flag = H5.H5Pget_create_intermediate_group(lcpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_create_intermediate_group_notcreated: " + err); } assertEquals(false, flag); } @Test public void testH5Pset_data_transform() { String expression = "(5/9.0)*(x-32)"; int ret_val = -1; try { ret_val= H5.H5Pset_data_transform(plist_id, expression); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_data_transform: " + err); } assertTrue(ret_val>=0); } @Test(expected = NullPointerException.class) public void testH5Pset_data_transform_NullExpression() throws Throwable { H5.H5Pset_data_transform(plist_id, null); } @Test(expected = HDF5LibraryException.class) public void testH5Pset_data_transform_InvalidExpression1() throws Throwable { H5.H5Pset_data_transform(plist_id, ""); } @Test(expected = HDF5LibraryException.class) public void testH5Pset_data_transform_InvalidExpression2() throws Throwable { H5.H5Pset_data_transform(plist_id, "hello"); } @Test public void testH5Pget_data_transform() { String expression = "(5/9.0)*(x-32)"; String [] express = {""}; long express_size = 0; long size = 20; try { H5.H5Pset_data_transform(plist_id, expression); express_size = H5.H5Pget_data_transform(plist_id, express, size); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_data_transform: " + err); } assertTrue(express_size>=0); assertTrue("The data transform expression: ", expression.equals(express[0])); } @Test(expected = HDF5LibraryException.class) public void testH5Pget_data_transform_ExpressionNotSet() throws Throwable { String [] express = {""}; H5.H5Pget_data_transform(plist_id, express, 20); } @Test(expected = IllegalArgumentException.class) public void testH5Pget_data_transform_IllegalSize() throws Throwable { String [] express = {""}; H5.H5Pset_data_transform(plist_id, "(5/9.0)*(x-32)"); H5.H5Pget_data_transform(plist_id, express, 0); } @Test public void testH5Pget_elink_acc_flags() { int get_flags = -1; try { get_flags = H5.H5Pget_elink_acc_flags(gapl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_elink_acc_flags: " + err); } assertTrue("H5Pget_elink_acc_flags", get_flags >= 0); assertEquals(HDF5Constants.H5F_ACC_DEFAULT, get_flags); } @Test public void testH5Pset_elink_acc_flags() { int get_flags = -1; int ret_val = -1; try { ret_val = H5.H5Pset_elink_acc_flags(lapl_id, HDF5Constants.H5F_ACC_RDWR); get_flags = H5.H5Pget_elink_acc_flags(lapl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_elink_acc_flags: " + err); } assertTrue("H5Pset_elink_acc_flags", ret_val >= 0); assertEquals(HDF5Constants.H5F_ACC_RDWR, get_flags); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_elink_acc_flags_InvalidFlag1() throws Throwable { H5.H5Pset_elink_acc_flags(lapl_id, HDF5Constants.H5F_ACC_TRUNC); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_elink_acc_flags_InvalidFlag2() throws Throwable { H5.H5Pset_elink_acc_flags(lapl_id, -1); } @Test public void testH5Pset_link_phase_change() { int ret_val = -1; try { ret_val = H5.H5Pset_link_phase_change(fcpl_id , 2, 2); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_link_phase_change: " + err); } assertTrue("H5Pset_link_phase_change", ret_val >= 0); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_link_phase_change_Highmax_Compact() throws Throwable { H5.H5Pset_link_phase_change(fcpl_id , 70000000, 3); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_link_phase_change_max_compactLESSTHANmin_dense() throws Throwable { H5.H5Pset_link_phase_change(fcpl_id , 5, 6); } @Test public void testH5Pget_link_phase_change() { int ret_val = -1; int[] links = new int[2]; try { ret_val = H5.H5Pget_link_phase_change(fcpl_id, links); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_link_phase_change: " + err); } assertTrue("testH5Pget_link_phase_change", ret_val >= 0); assertEquals("Default value of maximum compact storage", 8, links[0]); assertEquals("Default value of minimum dense storage", 6, links[1]); } @Test public void testH5Pget_link_phase_change_EqualsSet() { int[] links = new int[2]; try { H5.H5Pset_link_phase_change(fcpl_id , 10, 7); H5.H5Pget_link_phase_change(fcpl_id, links); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_link_phase_change_EqualsSet: " + err); } assertEquals("Value of maximum compact storage set", 10, links[0]); assertEquals("Value of minimum dense storage set", 7, links[1]); } @Test(expected = NullPointerException.class) public void testH5Pget_link_phase_change_Null() throws Throwable { H5.H5Pget_link_phase_change(fcpl_id, null); } @Test public void testH5Pget_attr_phase_change() { int ret_val = -1; int[] attributes = new int[2]; try { ret_val = H5.H5Pget_attr_phase_change(ocpl_id, attributes); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_attr_phase_change: " + err); } assertTrue("testH5Pget_attr_phase_change", ret_val >= 0); assertEquals("Default value of the max. no. of attributes stored in compact storage", 8, attributes[0]); assertEquals("Default value of the min. no. of attributes stored in dense storage", 6, attributes[1]); } @Test public void testH5Pget_shared_mesg_phase_change() { int ret_val = -1; int[] size = new int[2]; try { ret_val = H5.H5Pget_shared_mesg_phase_change(fcpl_id, size); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_shared_mesg_phase_change: " + err); } assertTrue("testH5Pget_shared_mesg_phase_change", ret_val >= 0); } @Test public void testH5Pget_shared_mesg_phase_change_EqualsSET() { int[] size = new int[2]; try { H5.H5Pset_shared_mesg_phase_change(fcpl_id,50, 40); H5.H5Pget_shared_mesg_phase_change(fcpl_id, size); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_shared_mesg_phase_change_EqualsSET: " + err); } assertEquals("Value of maximum list set", 50, size[0]); assertEquals("Value of minimum btree set", 40, size[1]); } @Test public void testH5Pset_shared_mesg_phase_change() { int ret_val = -1; try { ret_val = H5.H5Pset_shared_mesg_phase_change(fcpl_id,2, 1); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_shared_mesg_phase_change: " + err); } assertTrue("H5Pset_shared_mesg_phase_change", ret_val >= 0); } @Test(expected = IllegalArgumentException.class) public void testH5PH5Pset_shared_mesg_phase_change_HighMaxlistValue() throws Throwable { H5.H5Pset_shared_mesg_phase_change(fcpl_id, 5001, 4000); } @Test(expected = IllegalArgumentException.class) public void testH5PH5Pset_shared_mesg_phase_change_HighMinbtreeValue() throws Throwable { H5.H5Pset_shared_mesg_phase_change(fcpl_id, 5000, 5001); } @Test(expected = IllegalArgumentException.class) public void testH5PH5Pset_shared_mesg_phase_change_MinbtreeGreaterThanMaxlist() throws Throwable { H5.H5Pset_link_phase_change(fcpl_id , 3, 7); } @Test public void testH5Pget_shared_mesg_nindexes() { int nindexes = -1; try { nindexes = H5.H5Pget_shared_mesg_nindexes(fcpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_shared_mesg_nindexes: " + err); } assertTrue("H5Pget_shared_mesg_nindexes", nindexes >= 0); } @Test public void testH5Pset_shared_mesg_nindexes() { int nindexes = -1; int ret_val = -1; try { ret_val = H5.H5Pset_shared_mesg_nindexes(fcpl_id, 7); nindexes = H5.H5Pget_shared_mesg_nindexes(fcpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_shared_mesg_nindexes: " + err); } assertTrue("H5Pset_shared_mesg_nindexes", ret_val >= 0); assertEquals("Value of nindexes is equal to value set",7 ,nindexes); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_shared_mesg_nindexes_InvalidHIGHnindexes()throws Throwable { H5.H5Pset_shared_mesg_nindexes(fcpl_id, 9); } @Test public void testH5Pset_shared_mesg_index() { int ret_val = -1; try { H5.H5Pset_shared_mesg_nindexes(fcpl_id, 2); ret_val = H5.H5Pset_shared_mesg_index(fcpl_id, 0,HDF5Constants.H5O_SHMESG_ATTR_FLAG, 10); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_shared_mesg_index: " + err); } assertTrue("H5Pset_shared_mesg_index", ret_val >= 0); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_shared_mesg_index_Invalid_indexnum() throws Throwable { H5.H5Pset_shared_mesg_index(fcpl_id, 2,HDF5Constants.H5O_SHMESG_ATTR_FLAG, 10); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_shared_mesg_index_InvalidFlag() throws Throwable { H5.H5Pset_shared_mesg_nindexes(fcpl_id, 7); H5.H5Pset_shared_mesg_index(fcpl_id, 2,HDF5Constants.H5O_SHMESG_ALL_FLAG + 1, 10); } @Test public void testH5Pget_shared_mesg_index() { int ret_val = -1; int[] mesg_info = new int[2]; try { H5.H5Pset_shared_mesg_nindexes(fcpl_id, 2); H5.H5Pset_shared_mesg_index(fcpl_id, 0,HDF5Constants.H5O_SHMESG_ATTR_FLAG, 10); ret_val = H5.H5Pget_shared_mesg_index(fcpl_id, 0, mesg_info); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_shared_mesg_index: " + err); } assertTrue("H5Pget_shared_mesg_index", ret_val >= 0); assertEquals("Type of message", HDF5Constants.H5O_SHMESG_ATTR_FLAG, mesg_info[0]); assertEquals("minimum message size", 10, mesg_info[1]); } @Test(expected = IllegalArgumentException.class) public void testH5Pget_shared_mesg_index_Invalid_indexnum() throws Throwable { int[] mesg_info = new int[2]; H5.H5Pget_shared_mesg_index(fcpl_id, 0, mesg_info); } @Test public void testH5Pset_local_heap_size_hint() { int ret_val = -1; try { ret_val = H5.H5Pset_local_heap_size_hint(gcpl_id, 0); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_local_heap_size_hint: " + err); } assertTrue("H5Pset_local_heap_size_hint", ret_val >= 0); } @Test public void testH5Pget_local_heap_size_hint() { long size_hint = -1; try { size_hint = H5.H5Pget_local_heap_size_hint(gcpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_local_heap_size_hint: " + err); } assertTrue("H5Pget_local_heap_size_hint", size_hint >= 0); } @Test public void testH5Pset_nbit() { int ret_val = -1; try { ret_val = H5.H5Pset_nbit(ocpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_nbit: " + err); } assertTrue("H5Pset_nbit", ret_val >= 0); } @Test public void testH5Pset_scaleoffset() { int ret_val = -1; int scale_type = HDF5Constants.H5Z_SO_FLOAT_DSCALE; int scale_factor = HDF5Constants.H5Z_SO_INT_MINBITS_DEFAULT; try { ret_val = H5.H5Pset_scaleoffset(ocpl_id, scale_type, scale_factor); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_scaleoffset: " + err); } assertTrue("H5Pset_scaleoffset", ret_val >= 0); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_scaleoffset_Invalidscale_type() throws Throwable { H5.H5Pset_scaleoffset(ocpl_id, 3, 1); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_scaleoffset_Invalidscale_factor() throws Throwable { H5.H5Pset_scaleoffset(ocpl_id, HDF5Constants.H5Z_SO_INT, -1); } @Test public void testH5Pset_est_link_info() { int ret_val = -1; try { ret_val = H5.H5Pset_est_link_info(gcpl_id, 0,10); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_est_link_info: " + err); } assertTrue("H5Pset_est_link_info", ret_val >= 0); } @Test(expected = IllegalArgumentException.class) public void testH5Pset_est_link_info_InvalidValues() throws Throwable { H5.H5Pset_est_link_info(gcpl_id, 100000,10); } @Test public void testH5Pget_est_link_info() { int ret_val = -1; int[] link_info = new int[2]; try { ret_val = H5.H5Pget_est_link_info(gcpl_id, link_info); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_est_link_info: " + err); } assertTrue("H5Pget_est_link_info", ret_val >= 0); } @Test public void testH5Pset_elink_prefix() { int ret_val = -1; String prefix = "tmp"; try { ret_val = H5.H5Pset_elink_prefix(plapl_id, prefix); } catch (Throwable err) { err.printStackTrace(); fail("H5Pset_est_link_info: " + err); } assertTrue("H5Pset_elink_prefix", ret_val >= 0); } @Test(expected = NullPointerException.class) public void testH5Pset_elink_prefix_null() throws Throwable{ H5.H5Pset_elink_prefix(plapl_id, null); } @Test public void testH5Pget_elink_prefix() { String prefix = "tmp"; String[] pre = {""}; long prefix_size = 0; try { H5.H5Pset_elink_prefix(plapl_id, prefix); prefix_size = H5.H5Pget_elink_prefix(plapl_id, pre); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_elink_prefix: " + err); } assertTrue(prefix_size>=0); assertTrue("The prefix: ", prefix.equals(pre[0])); } @Test(expected = NullPointerException.class) public void testH5Pget_elink_prefix_null() throws Throwable { H5.H5Pget_elink_prefix(plapl_id, null); } @Test(expected = NullPointerException.class) public void testH5Pget_version_null() throws Throwable { H5.H5Pget_version(fcpl_id, null); } @Test public void testH5Pget_version() { int[] version_info = {255,255,255,255}; try { _createH5File(fcpl_id, fapl_id); H5.H5Pget_version(fcpl_id, version_info); deleteH5file(); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_version: " + err); } assertTrue("super block version: "+version_info[0], version_info[0] == 0); assertTrue("global freelist version: "+version_info[1], version_info[1] == 0); assertTrue("symbol table version: "+version_info[2], version_info[2] == 0); assertTrue("shared object header version: "+version_info[3], version_info[3] == 0); } @Test(expected = NullPointerException.class) public void testH5Pget_userblock_null() throws Throwable { H5.H5Pget_userblock(fcpl_id, null); } @Test public void testH5P_userblock() { int[] version_info = {255,255,255,255}; long[] size = {0}; try { H5.H5Pset_userblock(fcpl_id, 1024); _createH5File(fcpl_id, fapl_id); /* Close FCPL */ H5.H5Pclose(fcpl_id); /* Get the file's dataset creation property list */ fcpl_id = H5.H5Fget_create_plist(H5fid); /* Get the file's version information */ H5.H5Pget_version(fcpl_id, version_info); H5.H5Pget_userblock(fcpl_id, size); deleteH5file(); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_userblock: " + err); } assertTrue("super block version: "+version_info[0], version_info[0] == 0); assertTrue("global freelist version: "+version_info[1], version_info[1] == 0); assertTrue("symbol table version: "+version_info[2], version_info[2] == 0); assertTrue("shared object header version: "+version_info[3], version_info[3] == 0); assertTrue("user block size: "+size[0], size[0] == 1024); } @Test(expected = NullPointerException.class) public void testH5Pget_sizes_null() throws Throwable { H5.H5Pget_sizes(fcpl_id, null); } @Test public void testH5P_sizes() { int[] version_info = {255,255,255,255}; long[] size = {0,0}; try { H5.H5Pset_sizes(fcpl_id, 4, 8); _createH5File(fcpl_id, fapl_id); /* Close FCPL */ H5.H5Pclose(fcpl_id); /* Get the file's dataset creation property list */ fcpl_id = H5.H5Fget_create_plist(H5fid); /* Get the file's version information */ H5.H5Pget_version(fcpl_id, version_info); H5.H5Pget_sizes(fcpl_id, size); deleteH5file(); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_sizes: " + err); } assertTrue("super block version: "+version_info[0], version_info[0] == 0); assertTrue("global freelist version: "+version_info[1], version_info[1] == 0); assertTrue("symbol table version: "+version_info[2], version_info[2] == 0); assertTrue("shared object header version: "+version_info[3], version_info[3] == 0); assertTrue("sizeof_addr size: "+size[0], size[0] == 4); assertTrue("sizeof_size size: "+size[1], size[1] == 8); } @Test(expected = NullPointerException.class) public void testH5Pget_sym_k_null() throws Throwable { H5.H5Pget_sym_k(fcpl_id, null); } @Test public void testH5P_sym_k() { int[] version_info = {255,255,255,255}; int[] size = {0,0}; try { H5.H5Pset_sym_k(fcpl_id, 32, 8); _createH5File(fcpl_id, fapl_id); /* Close FCPL */ H5.H5Pclose(fcpl_id); /* Get the file's dataset creation property list */ fcpl_id = H5.H5Fget_create_plist(H5fid); /* Get the file's version information */ H5.H5Pget_version(fcpl_id, version_info); H5.H5Pget_sym_k(fcpl_id, size); deleteH5file(); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_sym_k: " + err); } assertTrue("super block version: "+version_info[0], version_info[0] == 0); assertTrue("global freelist version: "+version_info[1], version_info[1] == 0); assertTrue("symbol table version: "+version_info[2], version_info[2] == 0); assertTrue("shared object header version: "+version_info[3], version_info[3] == 0); assertTrue("symbol table tree rank: "+size[0], size[0] == 32); assertTrue("symbol table node size: "+size[1], size[1] == 8); } @Test(expected = NullPointerException.class) public void testH5Pget_istore_k_null() throws Throwable { H5.H5Pget_istore_k(fcpl_id, null); } @Test public void testH5P_istore_k() { int[] version_info = {255,255,255,255}; int[] size = {0}; try { H5.H5Pset_istore_k(fcpl_id, 64); _createH5File(fcpl_id, fapl_id); /* Close FCPL */ H5.H5Pclose(fcpl_id); /* Get the file's dataset creation property list */ fcpl_id = H5.H5Fget_create_plist(H5fid); /* Get the file's version information */ H5.H5Pget_version(fcpl_id, version_info); H5.H5Pget_istore_k(fcpl_id, size); deleteH5file(); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_sym_k: " + err); } assertTrue("super block version: "+version_info[0], version_info[0] == 1); assertTrue("global freelist version: "+version_info[1], version_info[1] == 0); assertTrue("symbol table version: "+version_info[2], version_info[2] == 0); assertTrue("shared object header version: "+version_info[3], version_info[3] == 0); assertTrue("chunked storage b-tree 1/2-rank: "+size[0], size[0] == 64); } @Test public void testH5P_obj_track_times() { boolean default_ret_val = false; boolean ret_val = true; try { default_ret_val = H5.H5Pget_obj_track_times(ocpl_id); H5.H5Pset_obj_track_times(ocpl_id, false); ret_val = H5.H5Pget_obj_track_times(ocpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_obj_track_times: " + err); } assertTrue("H5Pget_obj_track_times default", default_ret_val); assertFalse("H5Pget_obj_track_times", ret_val); } @Test public void testH5Pget_char_encoding() { int char_encoding = 0; try { char_encoding = H5.H5Pget_char_encoding(acpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_char_encoding: " + err); } assertTrue("testH5Pget_char_encoding", char_encoding == HDF5Constants.H5T_CSET_ASCII); try { H5.H5Pset_char_encoding(acpl_id, HDF5Constants.H5T_CSET_UTF8); char_encoding = H5.H5Pget_char_encoding(acpl_id); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_char_encoding: " + err); } assertTrue("testH5Pget_char_encoding", char_encoding == HDF5Constants.H5T_CSET_UTF8); } @Test public void testH5P_fill_time() { int[] fill_time = {0}; try { H5.H5Pget_fill_time(ocpl_id, fill_time); assertTrue("fill_time: "+fill_time[0], fill_time[0] == HDF5Constants.H5D_FILL_TIME_IFSET); H5.H5Pset_fill_time(ocpl_id, HDF5Constants.H5D_FILL_TIME_ALLOC); H5.H5Pget_fill_time(ocpl_id, fill_time); assertTrue("fill_time: "+fill_time[0], fill_time[0] == HDF5Constants.H5D_FILL_TIME_ALLOC); H5.H5Pset_fill_time(ocpl_id, HDF5Constants.H5D_FILL_TIME_NEVER); H5.H5Pget_fill_time(ocpl_id, fill_time); assertTrue("fill_time: "+fill_time[0], fill_time[0] == HDF5Constants.H5D_FILL_TIME_NEVER); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fill_time: " + err); } } @Test public void testH5P_alloc_time() { int[] alloc_time = {0}; try { H5.H5Pget_alloc_time(ocpl_id, alloc_time); assertTrue("alloc_time: "+alloc_time[0], alloc_time[0] == HDF5Constants.H5D_ALLOC_TIME_LATE); H5.H5Pset_alloc_time(ocpl_id, HDF5Constants.H5D_ALLOC_TIME_EARLY); H5.H5Pget_alloc_time(ocpl_id, alloc_time); assertTrue("alloc_time: "+alloc_time[0], alloc_time[0] == HDF5Constants.H5D_ALLOC_TIME_EARLY); H5.H5Pset_alloc_time(ocpl_id, HDF5Constants.H5D_ALLOC_TIME_INCR); H5.H5Pget_alloc_time(ocpl_id, alloc_time); assertTrue("alloc_time: "+alloc_time[0], alloc_time[0] == HDF5Constants.H5D_ALLOC_TIME_INCR); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_alloc_time: " + err); } } @Test public void testH5P_fill_value() { int[] fill_value = {-1}; int[] fill_value_status = {-1}; try { H5.H5Pfill_value_defined(ocpl_id, fill_value_status); assertTrue("fill_value_status: "+fill_value_status[0], fill_value_status[0] == HDF5Constants.H5D_FILL_VALUE_DEFAULT); H5.H5Pget_fill_value(ocpl_id, HDF5Constants.H5T_NATIVE_INT, fill_value); assertTrue("fill_value: "+fill_value[0], fill_value[0] == 0); fill_value[0] = 255; H5.H5Pset_fill_value(ocpl_id, HDF5Constants.H5T_NATIVE_INT, fill_value); H5.H5Pget_fill_value(ocpl_id, HDF5Constants.H5T_NATIVE_INT, fill_value); assertTrue("fill_value: "+fill_value[0], fill_value[0] == 255); H5.H5Pfill_value_defined(ocpl_id, fill_value_status); assertTrue("fill_value_status: "+fill_value_status[0], fill_value_status[0] == HDF5Constants.H5D_FILL_VALUE_USER_DEFINED); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_fill_value: " + err); } } @Test public void testH5P_layout() { int layout_type = -1; try { layout_type = H5.H5Pget_layout(ocpl_id); assertTrue("layout: "+layout_type, layout_type == HDF5Constants.H5D_CONTIGUOUS); H5.H5Pset_layout(ocpl_id, HDF5Constants.H5D_COMPACT); layout_type = H5.H5Pget_layout(ocpl_id); assertTrue("layout: "+layout_type, layout_type == HDF5Constants.H5D_COMPACT); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_layout: " + err); } } @Test public void testH5P_chunk() { long[] chunk_size = {0,0}; long[] chunk_new_size = {2,3}; int layout_type = -1; try { H5.H5Pset_chunk(ocpl_id, 2, chunk_new_size); H5.H5Pget_chunk(ocpl_id, 2, chunk_size); assertTrue("chunk: "+chunk_size[0], chunk_size[0] == chunk_new_size[0]); assertTrue("chunk: "+chunk_size[1], chunk_size[1] == chunk_new_size[1]); layout_type = H5.H5Pget_layout(ocpl_id); assertTrue("layout: "+layout_type, layout_type == HDF5Constants.H5D_CHUNKED); } catch (Throwable err) { err.printStackTrace(); fail("H5Pget_chunk: " + err); } } } jhdf-2.9/VERSION0000644000175000017500000000002512050301103014207 0ustar sylvestresylvestreVERSION=hdf-java-2.9 jhdf-2.9/windows/0000755000175000017500000000000012051203651014646 5ustar sylvestresylvestrejhdf-2.9/windows/javacheck.bat0000644000175000017500000002756712050301075017274 0ustar sylvestresylvestre@echo OFF rem Copyright by The HDF Group. rem Copyright by the Board of Trustees of the University of Illinois. rem All rights reserved. rem rem This file is part of HDF-JAVA. The full HDF-JAVA copyright notice, including rem terms governing use, modification, and redistribution, is contained in rem the files COPYING and Copyright.html. COPYING can be found at the root rem of the source code distribution tree; Copyright.html can be found at the rem root level of an installed copy of the electronic HDF-JAVA document set and rem is linked from the top-level documents page. It can also be found at rem http://hdfgroup.org/HDF-JAVA/doc/Copyright.html. If you do not have rem access to either file, you may request a copy from helphdfgroup.org. rem File Name: javacheck.bat rem This batch file is used to check the java hdf libraries rem setlocal enabledelayedexpansion pushd %~dp0 set nerrors=0 if "%1"=="/?" goto help goto main rem Print a help message :help echo.Checks HDF JAR echo. echo.Usage: %~nx0 [OPTION] echo. echo. TESTDIR Directory of hdf-java source. echo. /? Help Information exit /b 0 rem Parse through the parameters sent to file, and set appropriate variables :parse_params for %%a in (%*) do ( if "%%a"=="/?" ( rem Set errorlevel 1 and send to help call :help exit /b 1 ) else if "%%a"=="" ( rem Set errorlevel 2 to send to help if we receive a bad parameter echo.Must supply a directory name call :help exit /b 2 ) else ( set TESTDIR=%%a ) ) exit /b 0 rem Setup our environment :setup echo.Setting environment if "!%JAVAHOME%!\bin\javac.exe"=="\bin\javac.exe" ( echo.%JAVAHOME%\bin\javac.exe not found, echo.please check your java home directory. goto error ) set java_compile="%JAVAHOME%\bin\javac.exe" if "!%JAVAHOME%!\bin\java.exe"=="\bin\java.exe" ( echo.%JAVAHOME%\bin\java.exe not found, echo.please check your java home directory. goto error ) set java_run="%JAVAHOME%\bin\java.exe" if not exist "%TESTDIR%\win32lib" ( mkdir %TESTDIR%\win32lib ) if "%TESTLIBDIR%"=="" ( set TESTLIBDIR=%TESTDIR%\win32lib if %errorlevel% neq 0 ( exit /b ) ) call :safe_copy %TESTDIR%\native\*.lib %TESTLIBDIR% call :safe_copy %TESTDIR%\native\*.dll %TESTLIBDIR% set classpath=%TESTDIR%;%TESTLIBDIR%\jhdf5.jar;%TESTLIBDIR%\jhdfobj.jar;%TESTLIBDIR%\jhdf5obj.jar exit /b 0 rem Build the HDF Java Tests. :buildtest echo.***************************************************************************** echo. Build HDF Java Tests echo.***************************************************************************** echo. rem Build sources echo.Building Java Sources... %java_compile% -source 5 -d %TESTDIR%\classes\ -cp %classpath%;%TESTDIR%\lib\junit.jar %TESTDIR%\test\object\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ -cp %classpath%;%TESTDIR%\lib\junit.jar %TESTDIR%\test\object\misc\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ -cp %classpath%;%TESTDIR%\lib\junit.jar %TESTDIR%\test\hdf5lib\*.java if %errorlevel% neq 0 exit /b if exist %TESTDIR%\test\uitest ( %java_compile% -source 5 -d %TESTDIR%\classes\ -cp %classpath%;%TESTDIR%\lib\junit.jar;%TESTDIR%\lib\fest-swing-1.2.jar;%TESTDIR%\lib\jcip-annotations-1.0.jar %TESTDIR%\test\uitest\*.java if %errorlevel% neq 0 exit /b ) echo.Building Java Sources Succesful exit /b 0 rem Check the HDF Java Library. :checktest echo.***************************************************************************** echo. Check HDF Java Library echo.***************************************************************************** echo. rem Check Library echo.Checking Java JUnit4 Tests... %java_run% -Xmx1024M -Djava.library.path=%TESTLIBDIR% -cp %TESTDIR%\classes;%classpath%;%TESTDIR%\lib\junit.jar org.junit.runner.JUnitCore test.hdf5lib.TestAll if %errorlevel% neq 0 exit /b echo.Checking Java JUnit4 Successful echo.Checking Java Object Library... %java_run% -Xmx1024M -Djava.library.path=%TESTLIBDIR% -cp %TESTDIR%\classes;%classpath% test.object.misc.TestH5Object if %errorlevel% neq 0 exit /b echo.Checking Java Object Library Unit Tests... %java_run% -Xmx1024M -Djava.library.path=%TESTLIBDIR% -cp %TESTDIR%\classes;%classpath%;%TESTDIR%\lib\junit.jar test.object.AllH5ObjectTests if %errorlevel% neq 0 exit /b echo.Checking Java Object Library Successful if exist %TESTDIR%\test\uitest ( echo.Checking GUI JUnit4 Tests... %java_run% -Xmx1024M -Djava.library.path=%TESTLIBDIR% -cp %TESTDIR%\classes;%classpath%;%TESTDIR%\lib\junit.jar;%TESTDIR%\lib\fest-swing-1.2.jar;%TESTDIR%\lib\fest-reflect-1.2.jar;%TESTDIR%\lib\fest-util-1.1.2.jar;%TESTDIR%\lib\fest-assert-1.2.jar org.junit.runner.JUnitCore test.uitest.AllTests if %errorlevel% neq 0 exit /b echo.Checking GUI JUnit4 Successful ) exit /b 0 rem Build the HDF Java Examples. :buildexample echo.***************************************************************************** echo. Build HDF Java Examples echo.***************************************************************************** echo. rem Build Examples echo.Building Java Examples... %java_compile% -source 5 -d %TESTDIR%\classes\ -cp %classpath% %TESTDIR%\examples\intro\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ -cp %classpath% %TESTDIR%\examples\groups\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ -cp %classpath% %TESTDIR%\examples\datasets\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ -cp %classpath% %TESTDIR%\examples\datatypes\*.java if %errorlevel% neq 0 exit /b echo.Building Java Examples Successful exit /b 0 rem Check the HDF Java Examples. :checkexample echo.***************************************************************************** echo. Check HDF Java Examples echo.***************************************************************************** echo. rem Check Examples echo.Checking Java intro Examples... call :runexample examples.intro.H5_CreateDataset call :runexample examples.intro.H5_CreateAttribute call :runexample examples.intro.H5_CreateFile call :runexample examples.intro.H5_CreateGroup call :runexample examples.intro.H5_CreateGroupAbsoluteRelative call :runexample examples.intro.H5_CreateGroupDataset call :runexample examples.intro.H5_ReadWrite echo. echo.***************************************************************************** echo.Checking Java groups Examples... call :runexample examples.groups.H5Ex_G_Create call :safe_copy examples\groups\h5ex_g_iterate.h5 examples if "%nerrors%"=="0" ( call :runexample examples.groups.H5Ex_G_Iterate ) else ( echo.**FAILED** examples.groups.H5Ex_G_Iterate not tested ) echo. echo.***************************************************************************** echo.Checking Java datsets Examples... call :runexample examples.datasets.H5Ex_D_Alloc call :runexample examples.datasets.H5Ex_D_Checksum call :runexample examples.datasets.H5Ex_D_Chunk call :runexample examples.datasets.H5Ex_D_Compact call :runexample examples.datasets.H5Ex_D_External call :runexample examples.datasets.H5Ex_D_FillValue call :runexample examples.datasets.H5Ex_D_Gzip call :runexample examples.datasets.H5Ex_D_Hyperslab call :runexample examples.datasets.H5Ex_D_ReadWrite call :runexample examples.datasets.H5Ex_D_Shuffle call :runexample examples.datasets.H5Ex_D_Szip call :runexample examples.datasets.H5Ex_D_UnlimitedAdd call :runexample examples.datasets.H5Ex_D_UnlimitedGzip call :runexample examples.datasets.H5Ex_D_UnlimitedMod echo. echo.***************************************************************************** echo.Checking Java datatypes Examples... call :runexample examples.datatypes.H5Ex_T_Array call :runexample examples.datatypes.H5Ex_T_ArrayAttribute call :runexample examples.datatypes.H5Ex_T_Bit call :runexample examples.datatypes.H5Ex_T_BitAttribute call :runexample examples.datatypes.H5Ex_T_Commit call :runexample examples.datatypes.H5Ex_T_Compound call :runexample examples.datatypes.H5Ex_T_CompoundAttribute call :runexample examples.datatypes.H5Ex_T_Float call :runexample examples.datatypes.H5Ex_T_FloatAttribute call :runexample examples.datatypes.H5Ex_T_Integer call :runexample examples.datatypes.H5Ex_T_IntegerAttribute call :runexample examples.datatypes.H5Ex_T_ObjectReference call :runexample examples.datatypes.H5Ex_T_ObjectReferenceAttribute call :runexample examples.datatypes.H5Ex_T_Opaque call :runexample examples.datatypes.H5Ex_T_OpaqueAttribute call :runexample examples.datatypes.H5Ex_T_String call :runexample examples.datatypes.H5Ex_T_StringAttribute if %nerrors% neq 0 exit /b %nerrors% echo.Checking Java Examples Successful exit /b 0 :runexample pushd examples echo. %java_run% -Xmx1024M -Djava.library.path=%TESTLIBDIR% -cp %TESTDIR%\classes;%classpath% %1 > %1.out fc %1.out testfiles\%1.txt if %errorlevel% neq 0 ( set /a nerrors=%nerrors%+1 echo.**FAILED** %1 ) else ( echo. PASSED %1 ) popd exit /b 0 rem This function actally copies the file over, first making sure it exists. If not, we increment nerrors rem Expected parameters: rem %1 - name of file to copy rem %2 - destination to copy to :safe_copy if exist %1 ( copy /y %1 %2 > nul ) else ( set /a nerrors=%nerrors%+1 ) exit /b rem Only delete a file if it actually exists. Return the status of delete if it was called rem Expected paramters: rem %1 - name of file to delete :safe_delete if exist %1 ( del /S /F /Q %1 > nul ) exit /b rem Handle errors :error rem For now, our error handling consists of setting nerrors and quitting echo.HDF check failed. set /a nerrors=%nerrors%+1 goto end rem We'll never really get here, but we keep this line for consistency. exit /b rem This is where the magic happens :main call :parse_params %* if %errorlevel% neq 0 ( if %errorlevel% equ 1 ( rem This isn't an error case-- this means /? was specified. Simply rem quit. goto end ) else ( rem Error case. echo.Error parsing parameters! goto error ) ) call :setup if %errorlevel% neq 0 ( echo.Error setting up build environment. goto error ) call :buildtest if %errorlevel% neq 0 ( echo.Error building HDF Java Tests! goto error ) call :checktest if %errorlevel% neq 0 ( echo.Error checking HDF Java Library! goto error ) call :buildexample if %errorlevel% neq 0 ( echo.Error building HDF Java Examples! goto error ) call :checkexample if %errorlevel% neq 0 ( echo.Error checking HDF Java Examples! goto error ) if "%nerrors%"=="0" ( echo. All HDF Library check successfully! ) rem Fall through to end :end popd endlocal & exit /b %nerrors% jhdf-2.9/windows/copy_hdf.bat0000644000175000017500000000171412050301075017132 0ustar sylvestresylvestre@echo OFF rem Copyright by The HDF Group. rem Copyright by the Board of Trustees of the University of Illinois. rem All rights reserved. rem rem This file is part of HDF-JAVA. The full HDF-JAVA copyright notice, including rem terms governing use, modification, and redistribution, is contained in rem the files COPYING and Copyright.html. COPYING can be found at the root rem of the source code distribution tree; Copyright.html can be found at the rem root level of an installed copy of the electronic HDF-JAVA document set and rem is linked from the top-level documents page. It can also be found at rem http://hdfgroup.org/HDF-JAVA/doc/Copyright.html. If you do not have rem access to either file, you may request a copy from helphdfgroup.org. rem File Name: jnibuild.bat rem This batch file is used to build the native hdf libraries rem setlocal enabledelayedexpansion pushd %~dp0 xcopy /y *.bat ..\ > nul popd endlocal & exit /b jhdf-2.9/windows/jnibuild.bat0000644000175000017500000001407612050301075017144 0ustar sylvestresylvestre@echo OFF rem Copyright by The HDF Group. rem Copyright by the Board of Trustees of the University of Illinois. rem All rights reserved. rem rem This file is part of HDF-JAVA. The full HDF-JAVA copyright notice, including rem terms governing use, modification, and redistribution, is contained in rem the files COPYING and Copyright.html. COPYING can be found at the root rem of the source code distribution tree; Copyright.html can be found at the rem root level of an installed copy of the electronic HDF-JAVA document set and rem is linked from the top-level documents page. It can also be found at rem http://hdfgroup.org/HDF-JAVA/doc/Copyright.html. If you do not have rem access to either file, you may request a copy from helphdfgroup.org. rem File Name: jnibuild.bat rem This batch file is used to build the native hdf libraries rem setlocal enabledelayedexpansion pushd %~dp0 set nerrors=0 if "%1"=="/?" goto help goto main rem Print a help message :help echo.Builds HDF Java Native Wrappers echo. echo.Usage: %~nx0 [OPTION] echo. echo. /vs9 Build HDF Java Native using Visual Studio 2008 echo. /useenv Build HDF Java Native using compiler settings defined echo. in the environment, rather than the IDE. echo. /? Help Information exit /b 0 rem Parse through the parameters sent to file, and set appropriate variables :parse_params for %%a in (%*) do ( if "%%a"=="/vs9" ( rem Use Visual Studio 2008 set hdf_vs2008=true ) else if "%%a"=="/useenv" ( rem Pass /useenv flag to devenv set hdf_useenv=true ) else if "%%a"=="/?" ( rem Set errorlevel 1 and send to help call :help exit /b 1 ) else ( rem Set errorlevel 2 to send to help if we receive a bad parameter echo.Unknown option: %%a call :help exit /b 2 ) ) exit /b 0 rem Setup our environment :setup echo.Setting up environment rem Figure out which solution file to use based on configuration if defined hdf_vs2008 ( echo.Using Visual Studio 2008 set hdf_sln="%CD%\windows\proj\all\hdfjava.sln" ) rem Make sure PROCESSOR_ARCHITECURE is set to either x86 or AMD64 if "%PROCESSOR_ARCHITECTURE%"=="x86" ( set hdf_platform=Win32 ) else if "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( set hdf_platform=x64 ) else ( echo.Error: Environment variable PROCESSOR_ARCHITECTURE should contain echo.either x86 or AMD64 exit /b 1 ) rem Setup Visual Studio environment. set ccflags= rem Check for vs2008 environment if defined hdf_vs2008 ( if defined vs90comntools ( rem This sets the Visual Studio 2008 path and environment variables if %hdf_platform%==Win32 ( call "%vs90comntools%\..\..\VC\vcvarsall.bat" x86 ) else ( call "%vs90comntools%\..\..\VC\vcvarsall.bat" x86_amd64 ) ) else ( echo.Error: Cannot setup Visual Studio 2008 environment. Please echo.make sure VS90COMNTOOLS is defined in the environment. exit /b 1 ) ) if defined hdf_useenv ( rem This will tell Visual Studio to use include, library, etc. paths rem defined by %INCLUDE% %LIBPATH%, etc. Assume the user has already rem added external library paths to these variables. set ccflags=%ccflags% /useenv ) exit /b 0 rem Build the HDF Java Native Wrappers. :all echo.***************************************************************************** echo. Build HDF Java Native Wrappers echo.***************************************************************************** echo. rem Build release versions for %%a in (Release) DO ( echo.Building %hdf_platform% %%a Java Native Wrappers... devenv %hdf_sln% %ccflags% /rebuild "%%a|%hdf_platform%" if %errorlevel% neq 0 exit /b %errorlevel% ) exit /b 0 rem Handle errors :error rem For now, our error handling consists of setting nerrors and quitting echo.HDF Java Native Wrappers build failed. set /a nerrors=%nerrors%+1 goto end rem We'll never really get here, but we keep this line for consistency. exit /b rem This is where the magic happens :main call :parse_params %* if %errorlevel% neq 0 ( if %errorlevel% equ 1 ( rem This isn't an error case-- this means /? was specified. Simply rem quit. goto end ) else ( rem Error case. echo.Error parsing parameters! goto error ) ) call :setup if %errorlevel% neq 0 ( echo.Error setting up build environment. goto error ) echo.Building HDF Java Native Wrappers echo. call :all if %errorlevel% neq 0 ( echo.Error building HDF Java Native Wrappers! goto error ) echo.Copy native libraries to native folder if exist windows\proj\all\Release\jhdf5.dll ( copy /y windows\proj\all\Release\jhdf5.dll native > nul ) else ( set /a nerrors=%nerrors%+1 ) if exist windows\proj\all\Release\jhdf5.lib ( copy /y windows\proj\all\Release\jhdf5.lib native > nul ) else ( set /a nerrors=%nerrors%+1 ) if exist windows\proj\all\Release\jhdf.dll ( copy /y windows\proj\all\Release\jhdf.dll native > nul ) else ( set /a nerrors=%nerrors%+1 ) if exist windows\proj\all\Release\jhdf.lib ( copy /y windows\proj\all\Release\jhdf.lib native > nul ) else ( set /a nerrors=%nerrors%+1 ) if "%nerrors%"=="0" ( echo. All HDF Java Native Wrappers build successfully! ) rem Fall through to end :end popd endlocal & exit /b %nerrors% jhdf-2.9/windows/javabuild.bat0000644000175000017500000002157112050301075017303 0ustar sylvestresylvestre@echo OFF rem Copyright by The HDF Group. rem Copyright by the Board of Trustees of the University of Illinois. rem All rights reserved. rem rem This file is part of HDF-JAVA. The full HDF-JAVA copyright notice, including rem terms governing use, modification, and redistribution, is contained in rem the files COPYING and Copyright.html. COPYING can be found at the root rem of the source code distribution tree; Copyright.html can be found at the rem root level of an installed copy of the electronic HDF-JAVA document set and rem is linked from the top-level documents page. It can also be found at rem http://hdfgroup.org/HDF-JAVA/doc/Copyright.html. If you do not have rem access to either file, you may request a copy from helphdfgroup.org. rem File Name: javabuild.bat rem This batch file is used to build the java hdf libraries rem setlocal enabledelayedexpansion pushd %~dp0 set nerrors=0 if "%1"=="/?" goto help goto main rem Print a help message :help echo.Builds HDF JAR echo. echo.Usage: %~nx0 [OPTION] echo. echo. TESTDIR Directory of hdf-java source. echo. /? Help Information exit /b 0 rem Parse through the parameters sent to file, and set appropriate variables :parse_params for %%a in (%*) do ( if "%%a"=="/?" ( rem Set errorlevel 1 and send to help call :help exit /b 1 ) else if "%%a"=="" ( rem Set errorlevel 2 to send to help if we receive a bad parameter echo.Must supply a directory name call :help exit /b 2 ) else ( set TESTDIR=%%a ) ) exit /b 0 rem Setup our environment :setup echo.Setting environment if "!%JAVAHOME%!\bin\javac.exe"=="\bin\javac.exe" ( echo.%JAVAHOME%\bin\javac.exe not found, echo.please check your java home directory. goto error ) set java_compile="%JAVAHOME%\bin\javac.exe" if "!%JAVAHOME%!\bin\jar.exe"=="\bin\jar.exe" ( echo.%JAVAHOME%\bin\jar.exe not found, echo.please check your java home directory. goto error ) set java_pack="%JAVAHOME%\bin\jar.exe" if not exist "%TESTDIR%\classes" ( mkdir %TESTDIR%\classes ) if not exist "%TESTDIR%\win32lib" ( mkdir %TESTDIR%\win32lib ) if "%TESTLIBDIR%"=="" ( set TESTLIBDIR=%TESTDIR%\win32lib if %errorlevel% neq 0 ( exit /b ) ) echo.Remove old jar files call :safe_delete %TESTLIBDIR%\*.jar call :safe_copy %TESTDIR%\lib\netcdf.jar %TESTLIBDIR% call :safe_copy %TESTDIR%\lib\fits.jar %TESTLIBDIR% set classpath=%TESTDIR%;%TESTDIR%\classes;%TESTLIBDIR%\netcdf.jar;%TESTLIBDIR%\fits.jar;%TESTDIR%\lib\jargon.jar;%TESTDIR%\lib\junit.jar exit /b 0 rem cleanup our environment :cleanup if exist "%TESTDIR%\classes" ( echo.Remove %TESTDIR%\classes. call :safe_delete %TESTDIR%\classes ) exit /b 0 rem Build the HDF Java Sources. :buildall echo.***************************************************************************** echo. Build HDF Java Sources echo.***************************************************************************** echo. rem Build sources echo.Building Java Sources... %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\hdf5lib\*.java if %errorlevel% neq 0 exit /b rem %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\hdf5lib\callbacks\*.java rem if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\hdf5lib\exceptions\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\hdf5lib\structs\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\hdflib\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\object\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\object\fits\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\object\h4\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\object\h5\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\object\nc2\*.java if %errorlevel% neq 0 exit /b %java_compile% -source 5 -d %TESTDIR%\classes\ %TESTDIR%\ncsa\hdf\view\*.java if %errorlevel% neq 0 exit /b echo.Building Java Sources Successful exit /b 0 rem Build the HDF JARs. :jarall set nerrors=0 echo.***************************************************************************** echo. Build HDF JARs echo.***************************************************************************** echo. pushd %TESTDIR%\classes if not exist "ncsa\hdf\view\icons" ( mkdir ncsa\hdf\view\icons ) rem copy icons and html files call :safe_copy %TESTDIR%\ncsa\hdf\view\icons\*.gif ncsa\hdf\view\icons call :safe_copy %TESTDIR%\ncsa\hdf\view\*.html ncsa\hdf\view rem Build jars echo.Jaring ... %java_pack% -cf jhdf.jar ncsa\hdf\hdflib if %errorlevel% neq 0 exit /b %java_pack% -cf jhdf5.jar ncsa\hdf\hdf5lib if %errorlevel% neq 0 exit /b %java_pack% -cf jhdfview.jar ncsa\hdf\view if %errorlevel% neq 0 exit /b %java_pack% -cf jhdfobj.jar ncsa\hdf\object\*.class if %errorlevel% neq 0 exit /b %java_pack% -cf jhdf4obj.jar ncsa\hdf\object\h4\*.class if %errorlevel% neq 0 exit /b %java_pack% -cf jhdf5obj.jar ncsa\hdf\object\h5\*.class if %errorlevel% neq 0 exit /b %java_pack% -cf nc2obj.jar ncsa\hdf\object\nc2\*.class if %errorlevel% neq 0 exit /b %java_pack% -cf fitsobj.jar ncsa\hdf\object\fits\*.class if %errorlevel% neq 0 exit /b echo.Jaring Successful popd exit /b %nerrors% rem Install the HDF JARs. :install set nerrors=0 echo.***************************************************************************** echo. Install HDF JARs echo.***************************************************************************** echo. if not exist "%TESTLIBDIR%\ext" ( mkdir %TESTLIBDIR%\ext ) call :safe_copy %TESTDIR%\classes\nc2obj.jar %TESTLIBDIR%\ext call :safe_copy %TESTDIR%\classes\fitsobj.jar %TESTLIBDIR%\ext call :safe_copy %TESTDIR%\classes\jhdf.jar %TESTLIBDIR% call :safe_copy %TESTDIR%\classes\jhdf5.jar %TESTLIBDIR% call :safe_copy %TESTDIR%\classes\jhdfobj.jar %TESTLIBDIR% call :safe_copy %TESTDIR%\classes\jhdf4obj.jar %TESTLIBDIR% call :safe_copy %TESTDIR%\classes\jhdf5obj.jar %TESTLIBDIR% call :safe_copy %TESTDIR%\classes\jhdfview.jar %TESTLIBDIR% exit /b %nerrors% rem This function actally copies the file over, first making sure it exists. If not, we increment nerrors rem Expected parameters: rem %1 - name of file to copy rem %2 - destination to copy to :safe_copy if exist %1 ( copy /y %1 %2 > nul ) else ( set /a nerrors=%nerrors%+1 ) exit /b rem Only delete a file if it actually exists. Return the status of delete if it was called rem Expected paramters: rem %1 - name of file to delete :safe_delete if exist %1 ( del /S /F /Q %1 > nul ) exit /b rem Handle errors :error rem For now, our error handling consists of setting nerrors and quitting echo.HDF build failed. set /a nerrors=%nerrors%+1 goto end rem We'll never really get here, but we keep this line for consistency. exit /b rem This is where the magic happens :main call :parse_params %* if %errorlevel% neq 0 ( if %errorlevel% equ 1 ( rem This isn't an error case-- this means /? was specified. Simply rem quit. goto end ) else ( rem Error case. echo.Error parsing parameters! goto error ) ) call :setup if %errorlevel% neq 0 ( echo.Error setting up build environment. goto error ) call :cleanup if %errorlevel% neq 0 ( echo.Error removing old files. goto error ) echo.Building HDF Jars echo. call :buildall if %errorlevel% neq 0 ( echo.Error building HDF Java Sources! goto error ) call :jarall if %errorlevel% neq 0 ( echo.Error jaring HDF Jars! goto error ) call :install if %errorlevel% neq 0 ( echo.Error installing HDF Jars! goto error ) if "%nerrors%"=="0" ( echo. All HDF Jars build successfully! ) rem Fall through to end :end popd endlocal & exit /b %nerrors% jhdf-2.9/windows/javainstall.bat0000644000175000017500000001424412050301075017651 0ustar sylvestresylvestre@echo OFF rem Copyright by The HDF Group. rem Copyright by the Board of Trustees of the University of Illinois. rem All rights reserved. rem rem This file is part of HDF-JAVA. The full HDF-JAVA copyright notice, including rem terms governing use, modification, and redistribution, is contained in rem the files COPYING and Copyright.html. COPYING can be found at the root rem of the source code distribution tree; Copyright.html can be found at the rem root level of an installed copy of the electronic HDF-JAVA document set and rem is linked from the top-level documents page. It can also be found at rem http://hdfgroup.org/HDF-JAVA/doc/Copyright.html. If you do not have rem access to either file, you may request a copy from helphdfgroup.org. rem File Name: javainstall.bat rem This batch file is used to install the java hdf libraries rem setlocal enabledelayedexpansion pushd %~dp0 set nerrors=0 if "%1"=="/?" goto help goto main rem Print a help message :help echo.Installs HDF JAVA echo. echo.Usage: %~nx0 [OPTION] echo. echo. INSTALLDIR Directory to install hdf-java libraries. echo. /? Help Information exit /b 0 rem Parse through the parameters sent to file, and set appropriate variables :parse_params for %%a in (%*) do ( if "%%a"=="/?" ( rem Set errorlevel 1 and send to help call :help exit /b 1 ) else if "%%a"=="" ( rem Set errorlevel 2 to send to help if we receive a bad parameter echo.Must supply a directory name call :help exit /b 2 ) else ( set INSTALLDIR=%%a ) ) exit /b 0 rem Setup our environment :setup echo.Setting environment if "!%JAVAHOME%!\bin\java.exe"=="\bin\java.exe" ( echo.%JAVAHOME%\bin\java.exe not found, echo.please check your java home directory. goto error ) set java_run="%JAVAHOME%\bin\java.exe" if "%INSTALLDIR%"=="" ( set INSTALLDIR=hdfjava ) if not exist "%INSTALLDIR%" ( mkdir %INSTALLDIR% if %errorlevel% neq 0 ( exit /b ) ) else ( echo.Remove old files call :safe_delete %INSTALLDIR% ) if not exist "win32lib" ( echo.win32lib not found, echo.please verify that the hdf-java directory exists. goto error ) set classpath=%INSTALLDIR% exit /b 0 rem Install the HDF Java Libraries. :installall set nerrors=0 echo.***************************************************************************** echo. Install HDF Java Libraries echo.***************************************************************************** echo. rem Install Libraries echo.Installing Java Libraries... if not exist "%INSTALLDIR%\lib" ( mkdir %INSTALLDIR%\lib ) if not exist "%INSTALLDIR%\lib\ext" ( mkdir %INSTALLDIR%\lib\ext ) call :safe_copy win32lib\*.jar %INSTALLDIR%\lib call :safe_copy win32lib\ext\*.jar %INSTALLDIR%\lib\ext call :safe_copy win32lib\*.lib %INSTALLDIR%\lib call :safe_copy win32lib\*.dll %INSTALLDIR%\lib exit /b %nerrors% rem This function actally copies the file over, first making sure it exists. If not, we increment nerrors rem Expected parameters: rem %1 - name of file to copy rem %2 - destination to copy to :safe_copy if exist %1 ( copy /y %1 %2 > nul ) else ( set /a nerrors=%nerrors%+1 ) exit /b rem Only delete a file if it actually exists. Return the status of delete if it was called rem Expected paramters: rem %1 - name of file to delete :safe_delete if exist %1 ( del /S /F /Q %1 > nul ) exit /b rem Install the hdfview script. :installdocs set nerrors=0 rem mkdir %INSTALLDIR%\javadocs rem mkdir %INSTALLDIR%\javadocs\images rem call :safe_copy docs\javadocs\images\*.gif %INSTALLDIR%\javadocs\images if not exist "%INSTALLDIR%\UsersGuide" ( mkdir %INSTALLDIR%\UsersGuide ) if not exist "%INSTALLDIR%\UsersGuide\images" ( mkdir %INSTALLDIR%\UsersGuide\images ) call :safe_copy docs\hdfview\index.html %INSTALLDIR%\UsersGuide call :safe_copy docs\hdfview\UsersGuide\*.html %INSTALLDIR%\UsersGuide call :safe_copy docs\hdfview\UsersGuide\images\*.gif %INSTALLDIR%\UsersGuide\images rem if not exist "%INSTALLDIR%\hdf-object" ( rem mkdir %INSTALLDIR%\hdf-object rem ) rem call :safe_copy docs\hdf-object\*.html %INSTALLDIR%\hdf-object rem call :safe_copy docs\hdf-object\*.jpg %INSTALLDIR%\hdf-object rem call :safe_copy docs\hdf-object\*.h5 %INSTALLDIR%\hdf-object exit /b %nerrors% rem Install the hdfview script. :installview set nerrors=0 if not exist "%INSTALLDIR%\bin" ( mkdir %INSTALLDIR%\bin ) call :safe_copy windows\hdfview.bat %INSTALLDIR%\bin exit /b %nerrors% rem Handle errors :error rem For now, our error handling consists of setting nerrors and quitting echo.HDF install failed. set /a nerrors=%nerrors%+1 goto end rem We'll never really get here, but we keep this line for consistency. exit /b rem This is where the magic happens :main call :parse_params %* if %errorlevel% neq 0 ( if %errorlevel% equ 1 ( rem This isn't an error case-- this means /? was specified. Simply rem quit. goto end ) else ( rem Error case. echo.Error parsing parameters! goto error ) ) call :setup if %errorlevel% neq 0 ( echo.Error setting up install environment. goto error ) call :installall if %errorlevel% neq 0 ( echo.Error installing code. goto error ) call :installdocs if %errorlevel% neq 0 ( echo.Error installing docs. goto error ) call :installview if %errorlevel% neq 0 ( echo.Error installing hdfview. goto error ) if "%nerrors%"=="0" ( echo. All HDF Jars install successfully! ) rem Fall through to end :end popd endlocal & exit /b %nerrors% jhdf-2.9/windows/proj/0000755000175000017500000000000012051203651015620 5ustar sylvestresylvestrejhdf-2.9/windows/proj/jhdf5/0000755000175000017500000000000012051203651016620 5ustar sylvestresylvestrejhdf-2.9/windows/proj/jhdf5/jhdf5.vcproj0000644000175000017500000002302012050301075021040 0ustar sylvestresylvestre jhdf-2.9/windows/proj/jhdf/0000755000175000017500000000000012051203651016533 5ustar sylvestresylvestrejhdf-2.9/windows/proj/jhdf/jhdf.vcproj0000644000175000017500000002326012050301075020674 0ustar sylvestresylvestre jhdf-2.9/windows/proj/all/0000755000175000017500000000000012051203651016370 5ustar sylvestresylvestrejhdf-2.9/windows/proj/all/hdfjava.sln0000644000175000017500000000370712050301075020516 0ustar sylvestresylvestre Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jhdf5", "..\jhdf5\jhdf5.vcproj", "{A8037537-D6BC-43F4-B24B-B59EB82B1176}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jhdf", "..\jhdf\jhdf.vcproj", "{71D2D2E5-53DA-484A-9917-EB99F7FDA174}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A8037537-D6BC-43F4-B24B-B59EB82B1176}.Debug|Win32.ActiveCfg = Debug|Win32 {A8037537-D6BC-43F4-B24B-B59EB82B1176}.Debug|Win32.Build.0 = Debug|Win32 {A8037537-D6BC-43F4-B24B-B59EB82B1176}.Debug|x64.ActiveCfg = Debug|x64 {A8037537-D6BC-43F4-B24B-B59EB82B1176}.Debug|x64.Build.0 = Debug|x64 {A8037537-D6BC-43F4-B24B-B59EB82B1176}.Release|Win32.ActiveCfg = Release|Win32 {A8037537-D6BC-43F4-B24B-B59EB82B1176}.Release|Win32.Build.0 = Release|Win32 {A8037537-D6BC-43F4-B24B-B59EB82B1176}.Release|x64.ActiveCfg = Release|x64 {A8037537-D6BC-43F4-B24B-B59EB82B1176}.Release|x64.Build.0 = Release|x64 {71D2D2E5-53DA-484A-9917-EB99F7FDA174}.Debug|Win32.ActiveCfg = Debug|Win32 {71D2D2E5-53DA-484A-9917-EB99F7FDA174}.Debug|Win32.Build.0 = Debug|Win32 {71D2D2E5-53DA-484A-9917-EB99F7FDA174}.Debug|x64.ActiveCfg = Debug|x64 {71D2D2E5-53DA-484A-9917-EB99F7FDA174}.Debug|x64.Build.0 = Debug|x64 {71D2D2E5-53DA-484A-9917-EB99F7FDA174}.Release|Win32.ActiveCfg = Release|Win32 {71D2D2E5-53DA-484A-9917-EB99F7FDA174}.Release|Win32.Build.0 = Release|Win32 {71D2D2E5-53DA-484A-9917-EB99F7FDA174}.Release|x64.ActiveCfg = Release|x64 {71D2D2E5-53DA-484A-9917-EB99F7FDA174}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal jhdf-2.9/windows/hdfview.bat0000644000175000017500000000552312050301075016775 0ustar sylvestresylvestre@ECHO OFF rem Copyright by The HDF Group. rem Copyright by the Board of Trustees of the University of Illinois. rem All rights reserved. rem rem This file is part of HDF-JAVA. The full HDF-JAVA copyright notice, including rem terms governing use, modification, and redistribution, is contained in rem the files COPYING and Copyright.html. COPYING can be found at the root rem of the source code distribution tree; Copyright.html can be found at the rem root level of an installed copy of the electronic HDF-JAVA document set and rem is linked from the top-level documents page. It can also be found at rem http://hdfgroup.org/HDF-JAVA/doc/Copyright.html. If you do not have rem access to either file, you may request a copy from helphdfgroup.org. rem File Name: hdfview.bat rem This batch file is used to execute the hdfview utility rem setlocal enabledelayedexpansion pushd %~dp0 set nerrors=0 if "%1"=="/?" goto help goto main rem Print a help message :help echo.Executes HDFVIEW echo. echo.Usage: %~nx0 [OPTION] echo. echo. /? Help Information exit /b 0 rem Parse through the parameters sent to file, and set appropriate variables :parse_params for %%a in (%*) do ( if "%%a"=="/?" ( rem Set errorlevel 1 and send to help call :help exit /b 1 ) ) exit /b 0 rem Setup our environment :setup echo.Setting environment if "!%JAVAHOME%!\bin\java.exe"=="\bin\java.exe" ( echo.%JAVAHOME%\bin\java.exe not found, echo.please check your java home directory. goto error ) set java_run="%JAVAHOME%\bin\java.exe" set INSTALLDIR=%CD%\hdfjava\lib set CLASSPATH=%INSTALLDIR%\*;%INSTALLDIR%\ext\* set PATH=%INSTALLDIR%;%INSTALLDIR%\ext exit /b 0 rem Handle errors :error rem For now, our error handling consists of setting nerrors and quitting echo.HDF check failed. set /a nerrors=%nerrors%+1 goto end rem We'll never really get here, but we keep this line for consistency. exit /b rem This is where the magic happens :main call :parse_params %* if %errorlevel% neq 0 ( if %errorlevel% equ 1 ( rem This isn't an error case-- this means /? was specified. Simply rem quit. goto end ) else ( rem Error case. echo.Error parsing parameters! goto error ) ) call :setup if %errorlevel% neq 0 ( echo.Error setting up build environment. goto error ) if "%nerrors%"=="0" ( %java_run% -Xmx1024m -Djava.library.path=%PATH% -Dhdfview.root=%INSTALLDIR% -classpath %CLASSPATH% ncsa.hdf.view.HDFView -root %INSTALLDIR% ) rem Fall through to end :end popd endlocal & exit /b %nerrors%
  15. :O=9P>:O@;R@8R=8R=8S>9S>9R=8R=8R=8P;6O:5M83L72K61L72L72M83J52K63K63K63J52H30F1.E0-1! 0$ 1*"10#46&3:%4;%25(1&-#'%"$##$!&!& $ $!%!%#$$%'$(%+',(-',&,&+%.)/*0+1,0,/+.,+++,+,*.*.*.*.(.(.-/-/-/-/-/-/-/-/+-*,*,*,)+)+(*&*&-%,%,$+#*!(!( '%%%%%%%%"#$%%%$#"!!! !!                      !!""!#!"""!!!#$% % % % $$###$$% % &!&!'"'"&!&!&!'"'"(#(#(#(!(!(!(!(!(!(!(!' ' ' ' ' ' ' ' *+++++++--------../03467 5689:;;:7!5!4 4 33225 6!6!7"7"8#8$:#!?"?"?"@#>!>!= = <<;;= = = = = = = = >!>!>!>!>!>!>!>!B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$E#E#F$F$G%G%H&H&K) K) J(K) L*!N,#O-$Q/&R0'S1'T4'V7%W:(Y=(]>)^?*bB-eB,iE-pI,wN.U/[0_,g'|7>:;8~6;???@CDFHHKMOSUXYUVURRPQPQRSTUVVWWX[]`ceÕd̔cѕaҖd՗d֘eטcטbטbۚbݜbeddehhkknsrqolmnonlmqrqqw|}{wul۰kխhԭjװoٳtڴuٳtزqղpԱoӲoѳmҵoԷqԺpջqջqֺpغqܼs޾uvutsrsuwyy{vpnloqvtmhfhmopqttspljd޿dܽcڼdڻhոhϳiʯh[YRQRQ|NvKqHpGpGpGqHtKwNyPuLxO|SWYXV}T{R{QzPyOzO{P}R~STTSS~R|PzMwMpI~nJ}mI}mI}mI}mI~nJoKvRuQtPsOqMpLoK~nLnNmPnQoRoRpSqTqTqTqTqTqTpSnQlOkNzeHydGvaDt_Bq\AnY>lWlV?mW@mW@mWBlUCkTDjUDjSCgR?gP>dO!>!?"?"@#@#@#>!>!= = <<;;= = = = = = = = ?"?"?"?"?"?"?"?"B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$E#E#F$F$G%G%H&H&K) K) J(K) L*!N,#O-$Q/&R0'S1'T4'V7%W:(Y=(]>)^?*cC.eB,hD,oH+vM-~T.Z/_,g)|9A<>:|8=>>?=@BCFIJLMQRUUTSQOONOOSTUWWWWVZ[]_adfŕeϕcӕb֗dؙfٚeٚeؙcؙcؗaۚbޝeߞdޝeߞdghlmoqqomijnoooprtrswy|zvvߵmׯiѪeѪiկpڴu۵wڴv״tֳqӲoбnѳmҵoӸqպsջqջqֺp׻qܼs߿vwvwstswvyy{xtnmknpttnifhmpqqrromjkfݿeٻcԹbҶcϴcɯdĬfZUONPRzOuJrIqHqHrItKvMxOzQyP|SWZ[[YWV~T}S|R}RTWXYWVVVT~QzPtMsOsOsOsOsOsOsOwSvRuQtPrNqMpLpNmNmPmPnQnQnQnQoRpSpSqTpSoRnQlOjMxcFwbEu`Cs^Aq\AnY>lWlV?kU>jT?jSAhSBhRDgRAfQ@eP=dO`J<^H=\F;ZC=YB!>!= = <<;;= = = = = = = = ?"?"?"?"?"?"?"?"B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$E#E#F$F$G%G%H&H&K) K) J(K) L*!N,#O-$Q/&R0'S1'T4'V7%W:(Y=(]>)^?*cC.fC-hD,nG*tK+}S-Y.^+g,~mX=iS;jTkU>kU>jT=iS>hQ?gRAeRCdQ@cP?bP!>!= = <<;;= = = = = = = = ?"?"?"?"?"?"?"@"B$B$D#B$D#B$D#B$D#B$D#B$D#B$D#D#E#E#F#F$G$G%H&H&K) K) J(K) L*!N,#O-$Q/&R0'S1'T4'V6'Y:([<*]>*_>+dD/fC-hD,nF,tK+{T-Y/],h.=C?><|9=?@<;;kU@kU@kU@hS>gP>eP=dQBdQBcPAcP?bO>aN=aO;`N:bO>aN?_L>]J<[G"?#?$= @"B$D&D&D&B$A#> > > > > > > > <<<<<<<<> > ?!@"A#B$C%C%C"C#D"C#D"C#D"C#D"C#D"C#D"C#D"D"E"E"F#F#G$ G$H%H%J(J(L* M+!O-#P.$R0&R0&P.$Q/%T2(W5)Z8,];/`?0c?/dA.gC-kE.mH-rK,yS/\5c5s9@ŽE@88=?AA<987: ?"@#?!@"B$C%D&C%B$A#> > > > > > > > <<<<<<<<> > ?!@"A#B$C%C%E#E#E#E#E#E#E#E#D"D"D"D"D"D"D"D"E"E"F#F#G$ G$ H%H%J(J(L* M+!O-#P.$R0&R0&R0&S1'U3)W5+Z8.\:.`<.a=-e@.gC-jD-lG,pL,vR.\6b4r7<ǏDƏ=65:>A?;978:>CCDDEFGGGIKNPSUVTTW[^`bbĔdŒcőbőbǑcʔfϖiәkٝk۞hߞhggebb`aceߜeۜfٜfԝg͞fʡi̤iϥkҨlתo٭pܮprrrtsspox{}}~|y۳vԭrͩmɥg˨hүm״pٴpԳpӶz϶}ζz͵yϵxзwӷvԹvֻv׽sٽtۿuttutyz||yvwxutrqqrstuqkhiinorqqnkfcڽaٺ]ع\շ]ϴ]ɰ^_bd\[XWVT{QwNtOsOsMvMyO~RUVVUUUX[\]\[ZZZ[]^^^^]\\[[YYXWUUTT}T~U~X~X}W{UxSwRsLqH}nE}nE~oHnH}kEzhB~jG~jGjJjJiIhH}fG}cHy_Hx]Hw\Gv[FsZFrYEoYDnXClUCkTBgRAeP?aN=`M<`M>`M>_M?_M?_M?_M?^L@^L@^L@]K?_MC^LB\IBZG@XE>VC ?"?"?!@"A#B$C%C%B$B$> > > > > > > > ========> > ?!@"A#B$C%C%F$F$F$F$F$F$F$F$D"D"D"D"D"D"D"D"E"E"F#F#G$G$H%H%J(J(L* M+!O-#P.$R0$R0$T2&U3'V4*X6,Y7+[9-^:,_;+d?-fA.jD-kF+nJ*uQ-~[5`2p5:ʒE͕BȎ:Č9<>@@<899:?DEFDED~E~D~F~H~H~LNSVVVW[_cŗeǙgȘg̜k̚i̘h˗g͗hϙjԜm֜lܠlݠijifcb`bddghiܝgמgҟhϠhΟgϠhѣhԦkשm٫mۭoܯnݰo߲o߲o߲oޱmmvy|}|{ڱyհyЭw˨pǤjȦiάmҰpӰpѯpѴzϵ|δyδyϵxзwԸwպwػwؼsڼtܾuuturvvxwusuvtsrrrruvuqmklknoqppmkge۾bۼ_ڻ`ָ^ϵ^ɰ^^ac[[WWWT}QyPuPtPtNwNzPSUVVUWX[[\\[[ZZ[\^_``__^^^]\[ZXWVUTVWYX~W|UzSyRtLqIoGoGpJoJmH~jEiGiGhIhIfG~eF|cEz`Ey_Hx]Hw\Gv[FsZFqXDnWEmVDmVDlUChSBeP?`M>_L=^K<^K<]K=]K=\J<\J<[I=ZHYF?XE>WD=VC >!>!?!?!@"A#A#B$B$B$> > > > > > > > ========> > ?!@"A#B$C%C%H&H&H&H&H&H&H&H&E#E#E#E#E#E#E#E#E"E"F#F#G$G$H%H&J(J(L* M+!O-#P.$R0$R0$V4(V4(W5+X6,Y7+Z8,]9+]9)d?/e@-hB+jE*mI)sO-{W3^2n0:͖FҚEΕ>ɑ<>_L=]J;\I:[H9ZH:ZH:YG9YG9XF:WE9VD8VD8VD:VD:VC > > > > > > > > > > > > > > > > > ?!@"A#B$C%C%H&H&H&H&H&H&H&H&E#E#E#E#E#E#E#E#E"E"F#F#G$G$H&H&J(J(L* M+!O-!P."R0$R0$W6'W6'X6*X6*Y7+Y7+\8*\8(c>.e@-gA*iD)kF)qM+yU1[/l.7ΗE՝FӚ@͖<ǐ>>?@><==>AFI~F|CzAy@{A|A|D}E~GLPUYZŗcʘc͛fџjգnץp٦qڧrإpأo֡mՠlՠlעn٤pݦppnmkjgd`himnmljޡjݡk٠i՞fқcϚdНfѠhѢjϢiͣiˣhʣhȤhȤhȤhȤjЩrҩuӫxӭ|Ү|ά|˫zɩzɩzƦwãrãpǦsʩtͩu˪tϰyϲxѴzӶzչz׹yػyټxܾxݿwwvvvwtspqqsrsqllnqrrrqomoruvvvvtrlidٿb׽`gfؽfзcƱ`^^_Y[WVXWU}R|UzT{R|R~TTXYXY\]_]^\YYXYZ\^_abbbbbbb_^_^\[Y[]][XX~V|T{SvNtLqLrMtOtOqOoMiJhJgIeGbF}_Cz\@v[@w\Gv[HuZGrWDoVBmT@iR@hQ?kTDiRBeOAaK=\I:ZG8YF7YF7YG9XF8WE7VD6UC7SA5SA5R@4R@6R@6R?8R?8R?8R?8R?9R?9O:7K65H32F21G53E63D52A30D63B41A2/A/-B.-E10I43K63K61L72N94O:5P;6P;6O:5O:5Q<7Q<7R=8R=8S>9S>9S>9T?:P=7P=7O<6L93I60E2,A.(?,&2",2",0#,.!*+(&#   " #$&&"'#$&%('*)+*+*+*+*-,-,-,-,,+,++*+*-,-,-,-,-,-,-,-,/././././././././0/0/0/000000000202030303030403.3-0,0,/+.*+(+((''&'&'&&&&&%&%&&&)$)$)$*%*%+&+&+&*%*%+&+&,',','-*()'*%)#'!%#! ""! !!##$$%%""!# # $!$% % $$%%&&'(+ + + **)))))))))))((((****,,-.//12000134565588::;;;;;;;;;;<<<<= = = = ?!?!> > ?!@"A#B$> > > > > > > > > > > > > > > > > > ?!@"A#B$C%C%H&H&H&H&H&H&H&H&F$F$F$F$F$F$F$F$E"E"F#F#G$G%H&H&J(J(L* M+O-!P."R0$R1"V5&W6'W5)X6*Y7+Z8,\8*]9)b=-d?,f@)gB'iD'oK+wS1Y-k-6ΗD֟E՜BЙ>˓@Î@=?A@?@ADHH|EzByAzA{B|C~EFHMRX]_͜dќfԟiעl٤nۦpܧqܧq٤nأm֡kՠj֡kأmۦpߨpponmmjffikorpmkjߤlۢk؟hԝeЛeΛdΝe˞gɞgǞhĝfegghišoǣsʦvʨz˩{ʩ|ȧzƧyŦxävãt¢sţsȦvͩwͬwίvϲvҵyչzغzڽ{۾zݿyyyxwwvxwsppstsrpۿklostttqmnrvzyxxusqlhfڿdپckhٿhѸfƱb_]_ZZVVYXWTY~XVUUWYZ\\]]_^_^YXXY[]_accddeeefcba_^^]\a_]YVT|R|TuNsLqLrMuPtPsQpNjLiKhJfHbF|^By[?wY?vZEtYFrWDpUBlS?jQ=fO=eNaK=^H:ZG8XE6XE6WD5XF8WE7VD6TB4SA5Q?3P>2P>2P>4P>4P=6P=6O<5O<5O<6O<6L76I43E10C1/C41D52B41@2/C52B41A2/@1.B0.D0/G21I41J52K61M83N94O:5P;6O:5O:5R=8S>9S>9T?:T?:U@;U@;U@;Q>8Q>8O<6L93H5/D1+@-'>+%3$+3$+1$+/"),(($"  ! !"!" #!&!&#&$%'&)(*),+,++*+*/..-.--,,+,++*+*-,-,-,-,-,-,-,-,/./././././././././.0.0.0.0.2.2.4/4/4/4/5/5/5/4/4.3-2,/+.*-),(+()&'&'&'&'&&&&&&&)$+%+%,&,&-'-'-'+%+%+%,&-'.(.(-**+)*'(%&#$ "  !!"#$%%%$ $ %!%!& & '!' %%&&''((+++**)))))))))))((((****,-..//22/00134555588::;;;;;;;;;;== = = <<<<@"?!> => ?!A#B$> > > > > > > > ?!?!?!?!?!?!?!?!> > ?!@"A#B$C%C%G%G%G%G%G%G%G%G%F$F$F$F$F$F$F$F$E"E"F#F#G%G%H&H&J(J(L*M+O-!P/ R1"R1"U4%V5$W6'X7(Y8)Z9*]9+^:*a<,c>+e?*fA'hC(mI)uQ/~W,j,5˗C՞D՝@њ?͕@ƑA?@BBBBDGH~H{EyBxA{C|BDEGJOU[™ațbЛeԛdמg٠iڣkڣkڣkڣkءiנh֟g֟gءiڣkܨoppoppolkijnpsspkjmݤmڡl֟iќhΛf˙dǙeƛhÛhffghhknÞqơtǥxɧzȧ|Ǧ{ƥzâuâu¢s¢sĤsȨw̪zϮyίvѳuԶxغzܽ}޿~}{{yxxzyzzvrqtvvspoprvwwwspqx{|{xtronjihhhmlkкgıd`\^YYVVZYWV\\YXXZ[]_\]\\\^_XXYY[^`beeefgghhccb`^_^]a_]XU}R|Q{RtNrNpNqOtRtSqSoQkOjNiMfJaH}]DzZAwW@tXCrWDpUDmRAiO>gMaJ<^H:[E7XE7WD6VC5VC5WE7WE7UC5TB4R@4P>2O=1N<0O=3O=3O<5N;4M:3M:3L93L93J54G21C/.A/-A2/C41A30=2.@51A30B30A2/C1/D0/F10F1.H30I4/K61M83N94O:5O:5N94T?:T?:T?:U@;U@;VA8O<6L93H5/D1+@-'>+%3$+3$+1$+0#*- ))%$!"! "!"#"#!$!$"'$'$%'&)(+*,+,+,++*/./..--,,+,++*+*-,-,-,-,-,-,-,-,/./././././././././.0.0.0.0.2.2.4/4/4/4/5/5/5/5/5.4.3-2,1+.*-)-)+'*'*'('('('('('+%+%+%,&-'-'-'.(*$+%+%,&-'.(.(/)-,*+()&'#$!"    !"#$%%& %!%!&"& '!'!' (!%%&&''((+++**)))))))))))((((****,-.//022//0033555588::;;;;;;;;;;= = = = <<<<@"?!===?!A#C%> > > > > > > > ?!?!?!?!?!?!?!?!> > ?!@"A#B$C%C%G%G%G%G%G%G%G%G%F$F$F$F$F$F$F$F$E#E"F#F$G%G%H&H&J(J(L*M+O.P/ R1"R1 T3"U4#V5&X7(Y8)[:+^:,_;+a<,c>+e?*fA'gB'lG*tP0}V+k.7ʖCԞFԝ@қ@͗?Ǔ@>ABBBDDHE|GyDxByB|B~DFGGJOV[Ɯb̞cњbՙcכeٝg؟h؟h؟hמgמg՞f՞f՞fנhڣkܨopqpqpqolllmrsuplkަmݦn٤n֡kҟj͛fșeŗeĘghhhghklmoğsǢvɤxʥyɤxƤvásásáqãrĤqȨuͬyЯzаuѳsַwڻz޿~~|{zyxxyz{|ywuwywsppruwywxsttz}}yurnljikklnpomϺiñe`]]YYVVZZXV]\ZXXY\\_^^[\\_`XXYZ\^abeffghiijedcb`^__b_]XT}R|QzQsMqMpNqOsRtSqSoQlPkOjNgKbI}]D{Y@wW@sWBqVCoTClQ@hN=eK:aJ:_H8`I;_H:\F8ZD6VC5VC5VC5VC5WE7WE7UC5SA3Q?3P>2N<0M;/O=3O=3N;4M:3L92K81J71J73H32D0/@.,@.,@1.A30>3/<1-?40?40A30C41D20D20D0/D/.G2/H3.J50L72N94N94N94N94T?:T?:U@;U@;VA8O<6L93H5/D1+@-'=*$/ '2#*3&-1$+,(($&#&##"#""#!" # #"'%('()()(*)*)+*+*,+-,-,-,-,-,-,-,-,/./././././././.-,-,-,-,-,-,-,-,3!12 02.1-1-2.50615/5/5/5/7/7/7/5/5-4+4+3*2)1)1).(+%+%+%*%*%*%*%*%+%.&/'0(0(/'.&-%-%.&0(1)0(.&,$)#(''&&%%$!" !   !""###&&&''(() (()+,.!/ / ++++++++++**))(''''')))),-.//022//00335544678999<<<<<<<<;;;;;;;;=> > ?!?!@"@"@"===<<;;:<<==> > ?!?!> > > ?!?!@"@"@"I'I'H&H&H&H&G%G%C!C!D"E#F$F$G%G%H&H&I'I'J(J(K)K)L*M+M+N-O.O.P/P/U4#V5"W6%Y8'[:)]<+`<.a=-b=-a<)b<'d>'iD*nI,tP0{T+f-y3ŒCԠJ٢GӜA̖>Ȕ@ĔBCDBACFJ}D}F|E|E|D}B~CCIKPSVXǚ_ΝbԜcךcלd؝e؝eٞfڟgؠgןf՝dҚaҚa՞eۤkrtkjkloppqjijlqpmlܥl֣jѠhϞfΟi͟k̞lǛjǝmØkhefgknklŚoʟt̡vˢtʡsɡpȢqȣoǣoƥpȧr˪ṷwϮxͭpбqضw޼|ŀǀyz}Ѐҁ~|z|xssttpmvvz|~}~{|{}|ztoimkfejklmqnӾkʷhñec`]\\YXYYYZ^__```a`a]][]]`aYYYZ[^`abcdfghiifecb``aa^^^\XT{PxOrNrPsQsQpRmOkMiKkOgKaH~^E|\CxX?uR0N<0K9-H6*G5)L:0L:0K81J70I6/I6/I60J73G32F23C11A//>..<.-:/-:/-:/-:/-<.->..A//B00C/0D0/F1.G2-H3.I4/K61M83N94N94N94O:5Q<7R=8S>9S>9S>9R=8R?9R?9P=7N;5J71F3-B/)@-'1")3$+2%,0#*,(($'$(&"!! !" !" %!&$'()*)*)+*+*,+,+,+-,-,-,-,-,-,-,-,/./././././././.-,-,-,-,-,-,-,-,2 02 03/2.2.3/50505/5/5/5/7/7/7/7-8,5+5+3*3*2)2)1).&,&,&,&,&+&+&,&.&/'0(0(0(0(/'.&.&.&/'.&.&-%+#*"($'&&%%$#" !     !""###&&''((()()*+,- ./ ++++++++++**))(()''')))),-..//22//00335544678999<<<<<<<<;;;;;;;;=> > > ?!?!@"@"==<<;;;:<<<==> > ?!> > > ?!?!@"@"@"H&H&H&H&H&H&H&H&C!D"D"E#F$F$G%G%H&H&H&I'I'J(J(K)M+M,N-O.P/ Q0!Q0R1 T3 U4!V5"X7&Z9(\;*_;-`<,a<*a<*b<)d>'hC)nI.sN1yS,`+s0@НJբGԞDϙA˗CĔB•DCBBBCGE~F}D}C}CBEDGKQUW×ZȚ^ΜaԜc֛c֛c՝dלdלd؝e؝eӛbҚaљ`ӛb֟fݦmsujikmmnpolllosspnئkҤi͠g˞e̟hʟjȝjƚiǜoęljffhmlėnƙo͞tѢvӤvԦuѥtѦsΥoͦoʥnɦnʧoʪq˫r̬qЮoҰp׵uݼy|~Ȁz{~ҁԀ|zzzytqssqmvxyzzzyx||}|ztomolgfjkmnnkͻiǶhfb^\\[[WWXYZ]]]]^_^_^]^]^^``ZYZZ\^abbcdfghiiffedccba^]^\XT|QxOvRvTvTuSrSnPkMjLjNfJ_F{[BxX?tT;nN7jJ5eH6cH7bG6`E4]C4[A2XA3W@2V?1W@2WA4XB5WC8WC8VB7UA6R@2R@2Q?1P>0N<0K9-I7+G5)K9/K9/K81K81J70I6/H5/H51F21D22B00>..;-,9.,9.,:/-9.,:/-<.-=/.?//B00D01D0/F1.F1,H3.I4/K61L72N94N94N94O:5Q<7R=8S>9S>9R=8R=8R?9R?9P=7N;5J71F3-C0*A.(3#-3#-0#,.!**')&)'** ! """& '#()*+*+*,+,+-,-,-,-,-,-,-,-,-,-,-,/./././././././..-.-.-.-.-.-.-.-1-3-4.5 /6/5.4-4-6.6.8.8.8.8.9.8.8,8+8+5*5*4)4)3)/%.%.%.%.%,%,%,%/'/'0(1)1)0(/'/'0(/'-%+#*"*"*"*"($'#&"%"# #    !""###&'''() ))))*+,-..,-------,,++**)()''')))),,-.//12//00335544678999<<<<<<<<;;;;;;;;===> ?!?!?!@"=<<<;:::;<<==> > > > > > ?!?!@"@"@"H&H&H&H&H&H&H&H&E#E#E#E#F$F$G%G%G%H&H&I'I'J(J(J(N, N-O.P/Q0R1 S2!T3"T3 U5 V6!W6#Y8'Z9(]9)^:*`;)`;)b<)d>)hB+mH-rM2wQ-Y(l.>ǘHҠIӠGϛE˙D“A•BDCCBACEE~C}A}ABFGFLRW•Zė\Ț_͜bӜcԜcӛbқbӛbҚaҚaҚaΖ]ϗ^Қa՝d١hަmsvlkklooopomnqstsrդjͣiɞgǜeȝhǞhŜhÙgƛnØkjffgkk˜r͞rҡv֦x٩yګwګwګuثrիoҪmЪlͩk̪k˫nˬlѯoԱo״rܹu{ɂ̃~~ҁԁԁ}zzyxsppqpnwwxzzxwvz{|yxsppqnihkkllӽhͻgɸhŵhgc`\\[ZWWVWW\]]]]^]^\]]_`_^]ZZZ[\^abcccdefgigjjjhgdb___\YU|RzR{YzZyYwWsToQkMjLgL}bGz\DuW?rT2V@5XB7VB7VB7UA8UA6R@2R@2R@2Q?1N<0L:.I7+G5)H6,I7-K81L92K81I6/G4.E2.B00A.0?,.<,-:,,8,,8,,7-,8.-9/.;//>00@01A12D13E12F1.G2-H3.I4/K61L72N94N94N94O:5Q<7R=8R=8R=8Q<7Q<7R?9R?9P=7N;5K82G4.D1+B/)3#.2",- *+()&)())**! "#%&#()*,+,+-,-,.-.-.--,-,-,-,-,-,-,-,/./././././././..-.-.-.-.-.-.-.-2,3-5 /6!07 06/4-3,6.6.8.8.8.8.9.9,9,9,9,8+8+5*5*5*1&0&0&/&/&/&/&-&0(0(1)2*2*1)0(0(1)/',$)!'''( '#'#&"%!$!# " ! !    !""###'''(())****+,--.--------,,++**)()'''))))+,-../11//00335544678999;;;;;;;;;;;;;;;;<==> > ?!?!?!<<<;;::9;;;<===> > > > ?!?!@"@"@"G%G%G%H&H&I'I'I'F$F$F$F$F$F$G%G%G%G%G%H&I'I'I'J(N-O.P/Q0S2!T3"U4#V5"T4T4U5 W7"X7$Y8'\8(\8(`;)`;)b<)d>)hB+lG-pK1rN,{T)e.{9BʜG͞FʚEƖB@CÛDĜEšEC@@BB@}=>AEJINTX[ė\Ǚ^˚`ΛbϛaϛbΚ`͙`Η^Η_Ζ]̓\И_ԛdؠgڡjݥlprpoooqsrqpnnprtssУjʢgƝeŜdŜfŜfĚh˜fghgffjln˞tϠtӤv֨w۫zެw߮vݯtx߳t۲tׯqԮoѮnЮnЮnԱoղnֳoڸqw}˂τуӂԁՀzwwyvrpoopoxxxyxvutvwwtsrqpsqllllkjϻeʹgƶhµghgb^\[[WWVWX]^]\\]\[[]^_``^][[[\^`bddddddfgijknnlhdc__^\[X}UzU}Z|[xXtTpQlMhI~eGy_Dv[@qU=nR:mO7jL4eF1_C.\A0[?1[?1Y=/W=0V2V@5WA6VB7VB7UA8T@5SA5SA3R@2Q?1O=1L:.I7+H6*F4*H6,J70L92K81I6/E2,C0,@..?,.;+,9++6**6**6,+6,+8.-9/.;//<00?11B23E24E33G2/G2-I4/J50L72M83N94O:5O:5P;6Q<7R=8S>9R=8Q<7P;6R?9Q>8P=7N;5L93H5/E2,C0*0 -.))('&'&()')(* !!"$& (#)),,+,+-,-,.-.-.--,-,-,-,-,-,-,-,/./././././././././././././././.3-4 ,7!.8"/8"/7!.6,5+9-9-9-9-:-:-:-:-;-;-;-9,9,8+8+6+3(2(2(2(2(1(1(1(2)3*4+4+4+4+3*2)3*1(.%*!(&&&& & & %%###""    !""###'))* *+++,,,,----........,,++**)()'''))))++,--.01//00335544678999;;;;;;;;;;;;;;;;<<<==> > ?!<;;::999:;;;<===> > > ?!?!@"@"@"F$F$G%H&H&I'J(J(G%G%G%G%G%G%F$F$F$G%G%G%H&I'I'I(N-O.P/R1 T3 U4!V5"W6#U5 U5V6!W7"X7$Y8%[7'\8(^9)_:(b<)d>)gA*kF,mH.oJ-wT,_-r5>BƘCÕ@??BĜEğGĜEDA@A@<:=@EJMQWY[[Ö]Ɨ_˚bʙ_˘aʗ^ɖ_ɕ\ɔ^˔\͖`њbמi٠i۟k۟iޢnosrtsttvuqnkloqoާnϢiȡhĝd›bÜeÜešgebccegk˜nĚpǞrɠrͣsҦuשu۬vݯtݯs|xx޵uڳrزqղpղp״rسoٴpܷqw}ʂЃӄԃԂՀ~yvtwvrpnnopxwxxywutqqpoomppvtonnlijͻgɺiƶh´ikjgd]]\XXXXY^_^]]]\[\[^_a__]]]]^_bdefedccegilmppniec_``^^Z~W|V|XyXtUoPjK{fGxcFx`DqY?oU2Y?2X>1U=1U=1U=3V>4WA6XB7WC:VB9VB9UA6TB6SA3SA3R@2O=1M;/J8,H6*E3)G5+I6/K81J70H5.D1+B/+>,,=*,:*+8**5))6**5+*5-+7/-8.-;//<00@22C34F35G55H30I4/J50L72M83O:5P;6Q<7Q<7R=8S>9T?:S>9S>9Q<7Q<7Q>8Q>8Q>8O<6L93I60F3-D1++()&$#$#%&%&$&"&!!"#$(!+$*),+*+*,+,+-,-,-,-,-,-,-,-,-,-,-,/././././././././././././././.0,4.5!-7!.7!.7!.7!.7-6,9-9-9-9-:-:-:-:-< .< .< .;-;-9,9,9,4)4)4)3)3)3)2)2)3*4+5,5,5,5,4+3*4+2)/&,#) &%$'%%%%%$$"!    !""###)))* +++,,,,,----........,,++**)()'''))))*+,,-.00//00335544678999::::::::;;;;;;;;;<<<=> > > ;;;:9998:::;;<<=> > > ?!?!@"@"@"E#F$G%G%I'I'J(K)H&H&H&H&G%G%F$F$F$F$F$G%G%H&H'I(M,N-O.Q0S2U4!W6#X8#V6W7 W7"X8#X7$Y8%[7'\8(]8(^9'a:)d>+gA,iC,lG-mH-uS0|Z-h.y4;@>;?@CŠGƞGšEECA?=>?CIKQUXWWWY•\ė^Ŗ^Ŗ^ƕ]ƕ]ǔ]Ɠ\ǒ\ΗaӜf٠k٠kٝi؜hݟlpuuvvuuvvspllnoަmؤkϢiȡhĝd›bÜeÜeed``bcfkÚnœooÞqƢr̤qѨrիqڭrܮp}zwu޵uܵt۵t۵t۶rڵq۶p޹sv{΁҃ӀҀ}zvtruvutppopuuvxwvtsnomlklqrwvqqolj־hϽkɹköhgjjhf__^ZZYZ[`_^]^\][\\^^`_`_^^^_aceggfdccdfilnnmjgda``a`^[X|XxWvUqQlLzgGvaBt_Br]@nV2M;/K9-I7+E3)F4*H5.H5.H5.F3,D1+B/+=++:*+8**7))5))5+*5-+6.,6.,7/-:0/=11A33C55E56H66J73K61L72N94P;6Q<7R=8S>9T?:U@;U@;VA8Q>8Q>8O<6M:4J71G4.F3-%$#" !!"#&#&#!""$%'+".%-(+*)*)+*+*,+,+,+-,-,-,-,-,-,-,-,/./././././././.0/0/0/0/0/0/0/1-7"17!.6 -6 -7-7-8 .9!/:.:.;.;.;.;.=.=.? /?!-?!-< ,< ,;+: +9*6'4'4'4'3'3'3'3)4+4+5,6 -6 -5,4+4+4+3*1(/&+"'$" ''%%%%$$!!            !""###)* **++,,----,,,,/1111111..--,,+))'''))))**,,--/0//00335544678999::::::::;;;;;;;;;;<<===> ;:::99889::;;<<<> > > ?!?!@"@"@"E#E#F$G%I'J(K)K)J(I'I'H&G%G%F$F$E#F$F$G%G%H&H'H'L+M,N-P/S2U4!W6#X8#X8!X8X8!Y9$Y8%Z9&\8(\8(]8(^9'a:)d>+f@+iC,jE+jG+qP1uT+^(n-6=><>?CğDǟGĜEĖHHABBDGIMPVXXUSUX[ZZ[[“[Ŕ\Ɠ\ǒ\͖`қe؟jڞjؚgٛhߠmsuttsutstxspoߩmާnܥmעlϢkɠhŜfěeěeěešfd``bbdhilnopŤq̧rӪr׭qۯpyvts߳tݴtݵw޷vݶsݶs޷ruwz}~Ё~~{wtrouvxwronmutuwwtrqomkjknqvyvsrpliԼfϽkȸjeeefffca_\\[\\`a_^_]^\^]^]__aa^^^^`beffeb``bdilnljgfcbaacb`][~[yWvTqP{kJvfEubBr_Ar_AnY>kV;jR8iQ7iQ9hP8dL4bG2\@2\@4\@4[?3Z@3Z@3W?3W?3X@6YA7YB:[D2N<0K9-I7+F4*F4*F3,F3,E2+E2+D1+C0,=*,:*-8),7(+5)+5+,6-.6-.6-.7./:01=13A25D58F69I68L95N94O:5P;6R=8S>9U@;U@;VAWB=U@;T?:S>9Q>8Q>8Q>8P=7M:4K82H5/G4.  !%!%! ""#$( *#-&,'*)()(*)*)+*+*,+-,-,-,-,-,-,-,-,/./,/./,/./,0.0,1/1-1/1-1/1-1/3-9"29!/7/6,6.7-; /"0=!-=!-=!-;!,: +: +: +7(7(5(5&5(5&5&5(5*6+7,8 -8 -7,6+5*5*4*3)0&-#(#  &$%$%$% %        !!""#%%)**++,,,----,,,,/1111111..--,,+))''))))**++,,//01/22345546688999;:::::::;;;;;:;;:;;<<==> ;::9988899::;;<<> > > ?!?!@"B!B"D"E#F$G%I'J(K)L* J(J(I'H&G%G%F$F$E#E#F$F$G%G%H&H'K*L+N-P/R1U4!V5"W7"[8"[8"[8"\9%\9&\9&\8(\8(\7'^9'`;)c>+e@-gC-hD,iE+nL0oN+xV(f-{9@@;<<›>ŞAǠEǝGǙKŗLDDGJMPST[ZXURRXYZX[ZZ[Ŕ\Ŕ\ɔ^Ιc֝h֝h֚f؜fovsީs߫rstutr`{wr߫qݩpڥoդlΣlȡhĝfÜeĝfĝfšfecddeefhinooĤq˨rҫrׯtڱs߳vt߱sްrްr޲s߳v޵ut߷rsuvxyy~~|yusqnsvyytpoptvvxxusoqnmklptyzwtsqlfѻeνmŸjdcccdddba][Z[\``a__`^]a`^\]^`a^\^_aceggeb`acfinolihedcccedb_^}\yXvUqP{kJvfEscBtaCs`Bq\AnY>jU:hR:jR:fP8dL4_I4XA1XA3Y>3Y?2Y>3W?3W?3V>2YA7ZB8ZC;ZF=YG=YG=XF3O;0L8-J8.G5+F3,E2+D1*D1+D1+D1+D1-=++:*+9),8**6*,6,+7-.8.-7-.8.-:01=11@46D66F7:H88L:6N;5R;5U<7X<8Z>:Y@;YBWD>XE?XE?WD>UB;UA:S@9Q>8P?8Q>8O>7N;5J92I60F5. # #"! #$& '!(")!(#(()*)+*+*,+,+-,-,-,-,-,-,-,-,-,-,0,0*0,1+1-2 ,4.4 ,5 /5!-6/6 -5.5,6.6.9/9/919/919/:/:/:-;.< .>"0>"0>"0=!/<"/8 -7!-7!-7!-8!+8!+8!+8!+4%4%6%7$7&8%8%:&=)=+=+=+;+;+: +: +9*7 *6)4'0$, (&#$$#$!          !"$%$$%&()()+,-,,+++++++++,,--..//--,+*)(('''((((),.//012232333555789:;;<<<:::;;::8888868899888:;< 99988776778888::>>>?@ A!B C!G%G%G%G%G%G%G%G%H&H&H%H%H%H%H%H%H%H%H%H%H&H&H&H&L*M,P/S2!U4!V5"W6#Y6#]8%^8%]8%]8&]8&[6$Y4"X3!Z7$[8%]:'_<)`=*b?+b?+b?)iG.kJ+uR,`3r3V>4W@8W@8U>6Q:2L5-G3,H4-G2-F1,D/*C0,C0,D1-D1-@..=--<,-<,,;--<.->00<1/B66B75A55A64B66D97F::H=;B71N=5^C"0>"0>"0=!/<"/7!-6"-6"-6"-7"+7"+7"+7"+4%4%7$7$8%8%:$<$>)?)>)>)=)=)=); ): )9(6'5&1#-*%$"###" !      """"    !""&%$$&')*)*+,--,+++++++++,,--..//.-,+*)('('(((())..//112233335555889::;=><<::;;::88886666998889;< 99887776667889::???@ AAB B G%G%G%G%G%G%G%G%H%H%H%H%H%!H%!H%!H%!H%!H%!H%!H%!H%H&H&H&L*M,P/ S2!U4!V5"W6#Y6#^7&`6&_8'_8'^7&]6%Z5#Y4"Z7$[8%\9&^;(^=*_>+`?,`@+gD.kI.tP0\5m<{>>88Ǜ8ϡ?ҦGҤLңQӣWѥ\MMNOQSWZ[ZWTSUX[\]]\Y[^ǝc̟fϠhԣi٦mݩo߫qrsکqרrئqץp٦qۦrݨtߪv}}|xݮv٬s֩pѩn˫nǩmĤiƣkɤmɡmŜhcdghhefiljhkǤņrЩrҩsԩrܯvܮsݬrݬqsuyyxtsvzˀ΁ρЁ}||{vvsvvywwvtuuvvtqnkjlnqtvyzvqmmlikĻlmkhddbccdda\Z[]`cecdaceecbbaa`^bbbbddggifddeeefqoga^[{WxTxWyXz[{\z[yZwZuWrVnP}jLzgIxeGvcEq]BnZ?jV=jV=jV>iU=gS;eQ9bN6_M9RB2OA4P@3P>2R>3WA6[E:^F<\D:\F;ZF;XH;UG:RF8OF7PD6V?7Y>7W>7V=6T;4P70L5/I2,H3.G2-E0-D/,B/+C0,C0,C1-@..?--=--=--=--?//?10A32C86C86B75A64A75B86D:8E<7JA:PB9_BVH?TF=PB9M?6J<3G90F8/$$#"! !"$!&"'"'"'$')*+*+*,+,+-,-,.--,-,-,-,-,-,-,-*0,0*0*1+3+4 ,4 ,4 ,5,5,6,6,7-7-9-9-919191919/9/9/9/9-:.;!.=#0=#0=#0<"-:#-7!-6"-7!-7!-7"+7"+8!)8!)7&7&8%8%:$:$; %= %?*@*?*?*?*> *> *+`@+eB,iG,sO/~X1e4s6:8Ø<ǝ;͡@΢CΠH͠MϡTϣZONOPQRTUWWTRSUYY\]^][]ÚbȝfΡhѢj֥k٨nܩpޫrrsܩr٧rפoՠlՠl١nۤnݦpuvv߮vۮu׭qիoҬnάm̪m˩l˧k̥lʡkǞhŚgbdfgehjmjžjšmʥpΩtҫtԫu֫tޱxްu߮tޭrttwuxuwy}́ЂтЀӀՀ}{vtsvvyxyxqrrrsqnlghlqttttwrolllkkżm¹nkgccaadeda][]]_bdcdbehfdca`^]]cccceegfhedehhhgljb\|XxT|sRypO{rS|sT~uVvWvYvY~uXtV~oR|kMxgIveGudHsbFp_Cl[?jY?jY?iW?hV>eS;bP8_M7\K7SF5QD4PC3RB3TB4WD6\F9^H;_I<_I<^K=[K7T;4P91N7/K4.J3-G2-F1,C0,B/+B/+B/+B0,B0,@..=--=-->..?//A11B43D65E:8D97B86A75A75A75B86B94LCO@9K<5H92G81 % %$#"!  "# %!&#(#(#($')*,+,+,+-,.-.-.--,-,-,-,-,-,-,-*0,0*0*1+3+4 ,4 ,4 ,5,5,6,6,7-7-9-9-:2:2:2:2:0:0:0:.9-:.;!.=#0=#0=#0<"-:#-7!-7!-7!-7!-7"+7"+8!)8!)8'8%9 &:&; %; %!&? (@*?*?*?*?*> *> *="+<"+;!*8!)6'3$0!-() *#)#)"'!&!% # !   """"    !"##'&%%'()**+,-..-,,,,,,,,,,,--..//..-,+*)()())))**..//1122111133337789::<===;;::9977775555887779:;88877665557889;;C#B"B"A!AA@@G%G%G%G%G%G%G%G%G$G$G$G$G$ G$ G$ G$ H%!H%!H%!H%!H%H&H&H&L*M,P/ S2!U4!V5"W6#Y6#]8&_8'`9(a:)a:)_:(]8&]8&Z7$Z7$Y8%Z9&[:']<)_>+`@+c@*iG,qN.yV0].k0}7;<Ø:ƛ<ƛ=ĘA˜FĘMśQKLMMONOORRPPQTWX]]__\^ÜcȟgͣiУjԦk٨nܫqޫr߭r߬sܩr٦q֡mӞjԜi՝jנj٢lݨrݪsݪsۭr٬q֬pԬoҬmΫkΫkѫlϩkΦk̢h̟h˞gŗcØe˜feghlkžjơlɤoϨqҫtլtحvڭtްuݯsޭr߭pqpsrttwy~̀πр~؀܂܀{wusvvxxzztrrqomlhdflsusqokjgghjjlżm¹njec``acdfa_\^^``bcbdgkhffba^\\cdddfefefddgijgggc\{WxT}uQzqPwnMxoPypQypQypQypSypSypSzoS{lOyhJudFtcEudHsbFp_Cm\@l[Al[AkYAiW?fTYL/,>..?//@00B22C54F87G98G<:G<:D:8C97B86A75A75@72E<5L>5gNGg`jcYPmOEjRHhWMdWNdWOdUNeTLeTJdTEdTG_QH]NG[LEWHASD=O@9M>7K<5!&!& %$#"!!"# %"'#(#(#(%(*+,+,+-,.-.-.-/.-,-,-,-,-,-,-,-*0,0*0*1+3+4 ,4 ,4 ,4+4+5+6,7-8 .:.:.82828 08 08 08 08 .8 .7-8 -9!.;#0;$.;$.:#-:#-8!+8!+8!+8!+8!+8!+: ): ):&:&; '= %>!&>!&?"'?"'@!)A )A )A )@!)@!)?!)?!)@"*>#*>#*<#):!'7$5"1"."-".#,#.%*#)"'!$$# "  """"           !""#$''&&')*+*+-...----------,,--..////.-,+*)*)****++..//11221111333367889:<<>><;:988777755558766789:877665554 4 679:<<C#C#B"B"B AA@F&F&F&F&F&F&F%F%E$E$E$E$E$E$E$E$H%!H%!H%!H%!H%H&H&H&L*M,P/ S2!U4!V5"W6#Y6#]8&^7&`9(a:)`;)_:(^9'\9&\9&[8%Y8%Y8%Z;']>*_@,aB-`@)hF+qN0vS-Y,g0y7;?™=Û<™=>AGKGIIJKIIKNPOOQSVV[^___aÜcȟgͣiѤkӦmרp٫pܫqܫqݪqۨq٤pؠm՝jԛfԛf֝h֟iܨoܩpݪqڬpجoլnҪlЪiЩhѪiӪjӪjӧjҦiѣhѢj̝gɜeƛfěgĜiÞjğkğkơlʣlΧpӪt֭wٮwڰvݰuܮsݬqެoެmnnopruwx|}}~}}~~|xustvwwxxxwusollgbfnttpkh_Խ_ι^ʺb˽eikmĻl÷mjedabbbdea`]__acdddfjnkhhcc^\[cdffgefffefgjkge`]{W}wS|vT{uSysQwqOvpPuoOtmPslOrkNqjMpiMriLwiLufGrcFrcFteHsdGqaGn^Dm]Dl\Ck[BiY@fV?cS<`P9]N9YN^N?_M?cQCcQCdRDbRC_RB]P@ZN>ZM=_KB`G@[D:I>:G>9F=8C<6B;5@93?82A:2J=4gPHjbme~\SlOGgQFfUKcVMdUNdUNeTLeTJcUHcUH^PG]NG\MFYJCVG@TE>RC!&>!&?"'?"'@#(A"(A )A )A )A )@!)@!)@!)?!)B$,B$,B$,?$+="); '8$6#1"0$1%1%1'.%-$*#& $# "  """"          !""#$$('&&()*++,-.//.---------,,--..//0/.-,+*)*)****++..//112211113333667889;<??<;:977666644447766679:77765554 3 4 679:<=C#B"B"B"C!B B B F&F&F&F&F&F&F%F%E$E$E$E$E$E$E$E$H%!H%!H%!H%!H%H&H&H&L*M,P/ S2!U4!V5"W6#Y6#[6$]6%^7&_:(_:(_:(]:'\9&^;([:'Z9&Z9&[<(^?+aB.cD/aA*gH,pO0uS.~Y-f1w9#(#("'!& %$###$!&#($)$)$)&)+,-,-,.-.-/./.0/-,-,-,-,-,-,-,-*0,0*0*1+3+4 ,4 ,4 ,2)3*5+6,7-8 .; / (>!&@!'@!'A"'A"'B#(C")B!*B!*B!*B!*B!*B!*B!*A"*D%-D%-D%-B$,A#+?!)=';%4#3$4%4%3&1%0&.%&&$#   """"  !!!!!!!!!""#$%((''()+,+,-///..........,,--..//00/.-,+)+*++++,,..//112233335555567889;;@?<;:976666644447655679:7666554 4 2 3 5 79;=> A!A!B"B"C!D"D"D"F&F&F&F&F&F&F%F%D#D#D#D#D#D#D#D#H%!H%!H%!H%!H%H&H&H&L*M,P/ S2!U4!V5"W6#Y6#Y4"Z5#\7%]8&^9']:'\9&\9&^=*\;([:'Z;'\=)_@,`D/eF1cC,hI-pN2wU2\2g6v;UA8O;4L81I60H5/E3/D2.D2.D2.C4/C4/G85F85E74E74F85E:6G<8H=9JA8B>5FB9JA8UB;bG@iJEjMGiPIhUNdVMcVMdUNdUNfUMfUMeWNdWNbSLaRM_PK\MHYJEVGBTE@SD?$)#("'!& %$###$!&#($)$)$)&)+,-,.-.-/./.0/0/-,-,-,-,-,-,-,-*0,0*0*1+3+4 ,4 ,4 ,2)2)4*6,7-9!/!&@!'@!'A"'A"'C#(C#(C#(B!(B!*B!*B!*B!*B!*B!*B!*E$-D%-F%.E$-D#,B!*@(=&8$7%7%7&6'3&1&/%(&%#"  """"  !!!!!!!!""##%%((''(*+,+,.////.........,,--..//00/.-,+*+*++++,,..//112233335555557788;;@@=;:8666666444476556789766554 4 4 2 3 5 79;=> @ A!A!B"D"E#E#E#F&F&F&F&F&F&F%F%D#D#D#D#D#D#D#D#H%!H%!H%!H%!H%H&H&H&L*M,P/ S2!U4!V5"W6#W6#W4!Y4"[6$]8&\9&\9&\9&Z9&_>+]>*[<([<(\=)`A-bF1dH2dF.hI-pN2wV5^8iJFED@;:9JALE?KD>IBeIEeNHbQIdWNdWNeVOfWPhWOfXOeXOeXPeVQdUPaRM]NIYJEUFARC>PA< % % % % % % % % %!&"'$)$)$)#(%(+,-,-,-,-,-,-,-,,+,+,+-,-,.-.-.+0,0*0*1+3+4 ,4 ,4 ,3*3*5+6,7-8 .; /; /7-8 .9!/;#1;#1;#0:"/:"/:#-:#-;$.;$,;$,;$,<%+<%+=#,>#,>#,@",@"*@"*@"*A"(<#>$@ %B"'B"'D!%D!%D!'C")B!(B!(A 'B&A%A%@$F#*C")E")D!(D!(C 'C 'A '=&='=); ); )8'4'2&,"*!%"   "#$$$#""""""""!!#$$%&&''((**++++,,--..10/../01........0000000/+*++++,,-./1221122224444766567;=>>;;::88555533336778899955555555656679<=@ @ @ A!B C!C!C!E%C&C%C%C%C%C%C%C%B$A#A#A"A"B#E$I&"I&"H%!H%!H%H&G%G%N, O.P/ R1 S2U4!V5"W6#Y6#Y6#Z7$Z7$[8%[8%Z9&Z9&^=*]>*]>*\@+^B-`D/bF1dH2jL2mO3qR5vU6}[6d:p;>@@EHILMKN~O~PQQSUVVX[adcdeeŢjȤjɥkˤkɢiɢi̥jϨmͦmΧnѩnԪpتoڧnڦlܤiߤhߣeޢdegmtvnjhmtzwuܬj۫kثj֪kԨiҦiѥhϦhҨlӪlجoܰquvyxvsrprty|х҅҂Ӏ~|wtwvvxyz|}{yxz{wsmsoijmpoljkmmjeؿbϺ_ȶ`Ŵbcegjjhf°f¯jikhhifggcaafȪjʧeͨdϪfϬhέh̭jʭiȭjêg«ghghecdddfffdfegffffc]Y{wRzvSxsSvqQtoOrmMpkMojLmhKlgJjeHhcFhbHhbHhbHibFneHofIrgKsjMuiOtjOuiOsiNqeMoeLnbLk`Jk_Ij_Ik^Kk`Lj_Kf[Gf[Gi^Jf[GaVBcXDk`LfYFgZGh[Hi\Ik\Ij[HiZGiXHnZOlXOiULdPG^JAUC9O<5K81I60G6/G51E61E61E61D50C60H;5F;5E:4F;5G<6I>8JA:LCTG?YD?]D@^FB]JD[LE_RJ`SKbTKeTLfUNfWPdZQdZQbUObSP`QN^OL[LIXIFVGDUFC % % % % % % % %!&"'#($)%*%*$)&)+,-,-,-,-,-,-,-,,+,+,+-,-,.-.-.+0,0*0*1+3+4 ,4 ,4 ,3*3*5+6,7-8 .; /#,@",@",@"*@"*A"*A"(A"(>$?$A!&D!'E"&E"&D!%D!%C#(B!(B!(A 'B&B&A%A%F#*E")F!)F!)E (E (F'D'?'>'?*> *=)9'6'3&-"+!(#!  "#$$$#""""""""!!#$$%&&''((**+++,,--...10/../01........0000000/,+,,,,---./1221122224444766567;<>=;::988555533336667788855555555666689<=@ @ @ A!B C!C!B"C&C&C%C%C%C%C%C%C%B$A#@"@!A"B#C$G&!H%!H%!H%!H%H&H&H&N, O.P/ Q0S2U4!V5"V5"Y6#Y6#Y6#Z7$Z7$Y8%Y8%Y:&\=)\=)Z>)[?*]A,_C.aE0cG1jL2lN2pQ4tU6zY8bIOJB@@@CGJJMNMOPQRSTUWVWZ`ccbdefàhŢjŢhšgġgǣgɧjȥkʧmͩmҪo֩n٨mۧkݥhߥfeedfjpsplknwzzvޯkۮk٬kתiԨiӧhѥhФgҩkԫk٭nܰosuwxvsrprtx{҄ԄԁԀ~yxtuuuwyzz|~}}|}{wruqnkkkmknnqolfҽ`˷`ijaaadghihf°f°hïjiiihefgca`dǨeͨbϨcЫeϭfέḫhɬhȭh©fghhigefffgfgfeehgffgd]Z{wTzvSxsSvqQtoOrmMpkMojLmhKlgJkfIidGicIicIicIjdJleIofIqhKsjMtjOtjOtjOsiNqgNpfMncMlaKk`Jk`Jk`Lk`Ln_Lj[HiZGl]Ji\IdWDdWDj]JgZGgZGh[Hh[Hj[Hj[HiZGiYImYNlXOiULdPG\J@VD:P=6K:2I81I81F72F72F72E61D71D71F;5F;5F;5G<6H=7I@9KB;LE=MF>NG?NJAPLCQMDQMDQMDPNBLM?NL?RH?WEAZEB\GD\JFZME]SJ_RJaSJdSKfUNeVOcYPcXRbTQbSP`QN^OL[LIXIFVGDUFC % % % % % % % %"'#($)&+&+&+%*'*+,-,-,-,-,-,-,-,,+,+,+-,-,.-.-.+0,0*0*1+3+4 ,4 ,4 ,3*4+6,7-8 .9!/"0=#0=!-<"->".=#,="+<#)=")<#)=")=")A#+B#+B#+B#+B#+C")C")C")A$B%D!'F"&F"&F"&E!#E!%D!'B"'D!'C &C &C &C%C%G")G")I!)H (G'G'H'F'C(B(B(@(>';%7%5$.!+($!  !"$$$#"""""""""!!#$$%&&''((**++,,,--../10/../01........0000000/-,----..-./1221122224444656567:;==;::98755553333555667776666666666778:=> @ @ @ A!B C!C!B"C&B&B&B&B&B&B&B&B%A$@#?"?"@#A$C$G&!H%!H%!H%!H%H&H&H&N, N-O.Q0S2T3 U4!V5"X5"Y6#W6#X7$X7$Y8%Y8%X9%[<(Y=(Y=(Z>)Z?*]B-_D/`F/gL1iN1nP4rS6xW8^9h;q;{;EONHEEDGKLLONORRRTUVWVWUZ`aaabddeghdeġgĤiåiĦjʨkϨmөmتnܨlߧjgfeegjnqqnmovyywmݰlۮkحiթhӧfѥfФeӪjլj׮l۳n߷rtwwvssqtvz|ՂՂ׀~|{yuttvwzzy{~zvuusokilksrssoiмcŵ`___`cffe°fïfïhŮjĭjìi©ihe¦gçh¦e¥c`æbƨbϪcѫdЫdϭeέf˭eɬfŭgefhhjijiiijhgfdcfffggd]~~XzwTyvUwtSurQspQqnOolMnkLmiLlhKkgLjfKieJjfKjfMlfLleImfJohLqjNrkOrkOrkQqjPphQnfOldOkcNjbMiaLjbMm`Mq^Mp[Jp[Jp]Lm\JiXFgXEgZGi\Ii\Ih[Hh[Hj[Hj[Hk\Ik[KmYNkWNgUKbPF\J@VD:P?7M<4K:3I:3H94H94F93E82E82E82G=4G=4F=4G>5I@7KB9NE.? /@!0A"1A#/@".?!-A#-@",@"*@"*?!)?!)?!)?!)B#+B#+B#+B#+C")C")C")C#(C &D!'F"&G#'G#'G#'H!$E!#D!'B"'D!'D!'D!'C &D&D&J"*I!)I!)I (I (H'I'H'F'D)D)C)?'<%9%6$0!- * $#!!"#$$#""!!!!!!!!!!#$$%&&''((**++,---.///10/../01///////////////..-....//-./1221122224444445667::=<::98774444222244 4 556676666666676778:=> @ @ @ A!B C!C!B"B%A%A%A%A%A%A%A%A$@#?">!>!?"@#B#F% G$ G$ H%!H%I'I'I'M+N-O.P/R1T3 U4!U4!X5"X5"V5"W6#X7$X7$W8$X9%X<'W;&X<'X<'Y>)[@+^C._E.eJ/hM0mO3oQ5sT7{Z9c:j9u9@KPPKIHKLMNOPRSRTWXYXXUSX^a``abcfghee¢gĦjgågȦįjӪlتlޫlkgffghknpronpuvwto޳nܱmذk׫jԨgӧhЧgԫiծiذk۵nrsvvvtttvwz|}~~}yxttuwzyxz|ytvtpjilmssssqnξgŶe^]]^_cdd®eůfŮhƯiƯkĭjīkêjçhĨgƪiǪhƩeƩcƩcǩaҭfҮdѬeϭeͬeɭdǬeŭgdfgkkmmnmlliifdeefgggc[||XzwVyvUwtSurQspQqnOolMnkLnjMmiLlhMkgLkgLkgLlhOmiNkeKmfJohLqjNrkOrkOrkQqjPqiRogPmePldOkcNjbMkcNnaNv_Ox\Ny]Ox^Ot]MmZIiXFhYFk^Kj]Ji\Ih[Hj[Hk\Il]Jm]MkYMjVMfTJaOE\J@WE;RA9O>6L=6K<5K<7J;6H;5G:4F93D93I?6I?6H?6I@7KB9NEQJ@RNCSODUQFVRGVTHVTHUSGSSGOSDOQDTMEUJFXHHXHHVKIVMHZQJ\RIaPHcPIcRKaRM^UP^UPaSPaRO_PM]NKZKHWHEUFCTEB!&!&!&!&!&!&!&!&#($)%*&+',',&+'*+,-,-,-,-,-,-,-,,+,+,+-,-,.-.-.+0,0*0*1+3+4 ,4 ,4 ,5,5,7-8 .9!/:"0="1>"1>.@ /B"1C#2D$1C#0C#0B"-D$/C#.C$,B#+A"(A"(@!'@!'D#,D#,D#*D#*F#*F#*F#)F#)F!(G#'J#(J#(J#&I"%I $G #E 'D!'D!'D!'E 'F!(H (H (K"*K"*K"*K )K )J(L(I'I)H )G(E (B(=%9%5#1 -*%#!""#$$#"!!!!!!!!!!!#$$%&&''((**++---.///010/../01///////////////..-....//-./122112222444433566799<<:988764444222244 4 556677777777777889;> ?!@ @ @ A!B C!C!B"B%A%A%A%A%A%A%A%A$@#?">!>!?"@#B#E$F#G$ H%!H%I'J(J(M+M,N-P/R1S2T3 U4!U4!V5"V5"V5"V7#W8$W8$W8$W;&W;&V;&W<'X=([@+\C-]E-bH-eL.jO4nP4rS7wX9`:f8q9};EQTRMLNPPOPPSUTUYZZZYVRW]``_`bcg£j¥käk¥kĥlƨl¤hågȦiͧiթl۫mmmgggikkmnpnmnqqrppݵo۳nرl׮lլjӪjҩgԭhհiٳl۶osuuuwvuuwxz{||{||{{zwvwxzyyy|}{yrttqllnonmorutnƹj_^[[]_aaídŭeǯiȰjȯlȯlɭlȬkȪjȪjȫiʫḫḫf˭e̬cӱg԰fӮgήe˭eɭdŭeĭgceimnpooonnkjgefgfffea\zzXxxVwwUutUsrSqpQonOmlNlkMkjNkjNjiMihLigNjhOljQnjOkeKlgJniLpkNqkQqkQqkSpjRqkSoiQnhRlfPkdQjcPkdQqbOz]O`RdUaRy^Mr[IlZFjYEm^Ik_Ij^Hj^Hj^Hj^Hm^Im^KjXLhVLdRH`NDZI?VE;SB:RA9O@9N?8L?9K>8J=7I<6F;5E:4J@7I@7JA8KB9LE;OH>RKATMCVRGWSHWUIXVJYWKXVJUUITVIPWGQUGTPGULGWIHWIHUKIULGZQJ[QH`OGaNGaPI_PK[QO[SPaSRaQQ_OO\LLYIIWGGUEETDD"'"'"'"'"'"'"'"'"'#($)&+&+&+%*'*+,-,-,-,-,-,-,-,,+,+,+-,-,.-.-.+0,0*0*1+3+4 ,4 ,4 ,5,5,7-8 .9!/:"0="1?#2B"1D"2E#3F$4G%3G%3F%0E$/G&1G&1F%.E$-D#*C")B!(B!(D#,D#,D#*D#*F#*F#*F#)F#)H$(I%)K$)L%*K$'J#&I $H!$E!%D!'D!'E"(F!(F!(I!)I!)L#+K"*L!*L!*M)L(L(L(K *J *I)G(C(=%:%7#2 .+%$"  "#$$$"!         !!#$$%&&''((**++-..//00010/../0100000000.......--,----..-./122112222444423567687<;9887663333111155566777777777778788:;> ?!@ @ @ A!B C!C!B"A$@$@$@$@$@$@$@$@#?">!= = >!?"A"D#F#G$ G$ I& I'J(K)L*M,N-O.Q0S2T3 T3 U4!U4!U4!V5"U6"V7#V7#W8$W;&W;&V;&W<'Y>)[@+\C-^F.`F+cJ,hM2kP5pR8vW:^;e9n9w7@OWTOOQPONNPSTTW\]]ZXVRW]````ach¥kŨnħmħmŨnǪnĦjƦiʦhϧjթlܬnonhgillllknmmlnmnoߴoܶoڳnٲmرn֯l֭mծkԯiֱjٴmܸnrtttvvuuwy{zywyy{|{zwxxzzyxxy|}yxzrqppmlloikmqwwrǼmc_[Y\^__ĬbŭeǯiȰjɰmʱn˯n˯n˭mɬjʫh˭gΰhвiвiҲiִjԲhҰhήeʬdǬeĬfhdgjloopppnpmlighhhghfb]yyWxxVwwUutUsrSqpQonOmlNlkMjiMjiMihLihLigNjhOljQmkRjfKlgJniLpkNqkQqkQqkSpjRrlTpjRoiSmgQleRkdQleRrcP}[OdXl_gY~^Ou[Jp[Hl[Gl]Hk_Il`JmaKmaKl`Jm^Il]JiWKgUKcQG_MCZI?WFRKAUNDWPFXTIYUJYWKZXLZXLZXLWWKUWJRYISWIURIVNKVJJUIISKHTMGYPIZPF_ND`MF_NG\NKYOMXPN`RQ`PP^NN\LLYIIVFFTDDSCC"'"'"'"'"'"'"'"'!&"'#($)%*%*$)&)+,-,-,-,-,-,-,-,,+,+,+-,-,.-.-.+0,0*0*1+3+4 ,4 ,4 ,5,6 -8 .9!/:"0;#1>#2?#2E#3H#4I%3K'5K'5K'5J&2J&2L(2K'1J&0I%/H%,G$+F#*E")G$+G$+G$+G$+G$+G$+H#*H#*K$)L%*M$(N%)M$(K"&J!%H!$D $D!%D!%E"&G#'G#'J#(J#(L#)M")N!(N!(N'N'N'L(L!+K!+J *H )C(?%;#7!3!.+&$"  #$$$#"         !!#$$%&&''((**++...//00110/../0100000000.......-,+,,,,---./122112222444412567676;;9887653333111166677888888888888899:< ?!@"@ @ @ A!B C!C!B"@$?%?%?%?%?%?$?$?$>#="#@#D#E"F#G$ I& J(K) K)L*L+M,O.Q0R1S2T3 T3 U4!U4!V5"U6"V7#T8#T8#X<'X<'W<'X=(X?)[B,]D.^F.^D)bI+gL1kP5qS9uX:}_=e;m8s5=MXVPQPQPNNNRUVW\]][YUTY]`aa`bbgl¨oén¨ménƩmȨm˧kΨjѧkשmݫnonihknomlkopomnlmoܴn۵nڳnٴpٲqٲqرpرnհiճi׵k۹o߽stuuvvvvxxyyvtuxz{|{yzy{zzzyx|}yyysroonmiihijrxxqúkgd]Y\]]«]ëaŭeǯiɱḵnͲoΰpΰpͰnʭkɪg˭gұjֶmظo׷lضlִjӱi̮eɭdĬdìfhdgjmooonqnpnmkijiighfb~~\yyWxwXwvWutUsrSqpRonPmlNlkMihLihLhfMhfMigNjhOljSmkRjfKkgJmiNokPplQplQplSokRqlVpkUniSmhRkfRkfRlgSsdQ[Oi^thl_`Qv[Js\Jq_KkZFm^InbLpdNpdNnbLm^Ij[HiWKfTJaPF]LBZI?WFRE=QD>OBTNBUQEWSGZVJ[WK[YL[YLYZLXYKWXJUWIT[KUYKVSJWOLVLKTJISKHSLFXOFYOE^MC_LE^MF[MJXNLWOM`RQ`PP^NN[KKXHHVFFTDDSCC$'"'$'"'$'"'$'"'"%!&$'$)&)$)%(%(+,-,-,-,-,+,+,+,*+,+,+-,-,/+/-/+/*/*/*0 +1+2!+4 ,4 +6 ,7,8 -;!.<"/=#0?#1A#/H$2J$3L&3M'4N(5O&4O'2N&1P(3P(1O'2K&.J%-I$,H#+F#*G$+E$+E$+G$+G$+G$+H#*H#*L%*M&+N%+N%)M$*L#'J!'H!&D $D!'D!'E"(G")H#*J"*K#+L#+L#+M"+L!*N *M)M)J(L!*K!+K!+H )C(?%9"7!2!.*&#  !#$$$#"         ###$$%&&''(())++..//001110/../0100000000........++++++,,-./1111011112222/1456554997766543333111156788999888888889899:< ?!@"> > @ A!A!B"B"@"@$?%?%?%?%?$?$?$>#>#="#?"C"E"F#G$ I& J(K) L* K)L+M,O.P/R1S2T3 S4 S4 T5!T5!U6"S7"T8#T8#Y=(X<'X=(X=(Y@*[B,]D._G/\B)aG,gK3kP5oT9vY;|_=e=mSF=RE=PC;LB9J@7I?6H>5LD9KE9LF:NH!>!= = = >!>!?"?"?"D#E$E$F% H' I(I(J*L,L,M-N/O0P1Q2Q2Q5 R6!R6!S7"U9$U:%U:%V;&Y>)Y>)Z?*Z?*[@+[@+\A,\A,_E.aG0dJ1hN3mT5rX7v\9z^7|a6o>GMUXRJRTRRTWVTY[[[ZZZVRRX\_accjij£lťlʧmΧnϩkʧe̩eѪg׬hޯknnndfkpqnmkmmnonnonܱlڲmڳnڳnٴnٴnٴnضnӳjҴkոlػoܿqrusvrnpuwwtutuxz|~}}~~{z|{ywttwvvsqqoonopnljd_XUW[«_ū^Ǭ_ʯ`̳cͳfʳe˴h̶jϹmDZeưdȱe˱gϳjӷnغrڼsֻlӺjзg˴fưdcefhlmopsturqrtuqkhhiiihc~[x|WuyXuxYtwXruVorUknQjjNhhLggMggMjhQkiRkiRkiRmhTkiRhhNfiNgjOhkPllRmmUomVomVqlXqlXslYslYrkYpgVmdSobQtaPybP{fS}hU{iUygSudPsbNrcNpaLo`KpaLpaLo`Kj[FfWBaTC`SB]P?YNL?9')&(%'%'%'%'&(')')')(*(*)+)+*,*,*,*,(+),)-*.),),&&&&*'+(/'0(3)2*-"*,"*-#+.#+0#*2#*6"+7"+8!);!*?!)B#+E$-I%/K(/L'/Q(0R'0T&0U'1W(2Y'2Z&2['3Z&2Y%1W%0T%/S$.Q#-N#,K#+C#(B#(C#(D$)E%*H%+H%+H%+N)0M(/N&.L$,L#+J!)J(H'G(E*F +F +G!,G!,H"-H"-H"-H"-H"-G!,G!,F +F +E (I!)I"'F!(D!'?%;"7!2,)% !""!!      """##$$%%%&'()*,,./012331111111111111111///..--,////////.......-.--,,+,,,,/012330134554322210 / / / 223366778898879 6 8 7 89:;;< < < =!>"?#@$A%B&A%@$@$?#?">!>!>!= = = >!>!?"?!?"B# E$E$F% H' I(I(J*M- M-N.O0P1Q2R3P4P5 Q6!Q6!R7"T9$U:%U:%V;&Y>)Y>)Z?*Z?*[@+[@+\A,\A,_D/`F/cI0hO1lS4qY7u[8w]8~b;m@xFKQVROUVTSVXUTZ[\\[[ZURPUY^`cchgi¢iɥkϧlԧlթlϨcЪcԬfڮgjlnnhjoqspmjkknnmlmݳk۰lٱlرlײlسlִlִlֶmвiдjӷmֻnڿpqsrtpnqtvtrtuwwz{~~}~~~}~|zytwwyxtrqpolmmkieýe_[X\į`ȱe˱dʯ^Ͳaеd϶d̶c̷fϺiϼm̹j˸iηiϸlҸmջpٻsھtԽmҽjϺiʸfŴfddghklnrsvwtstwwuoljihhga|Zv|VtzXtyYsxXrwWpsVmpSjmPhkNhhNhhNigPigPigPjhQlgSkiTdfNcgLdhMeiNgiQjjRljSljSpkWqlXrkXrkXriXofUocSncQm`MpdNufQwkUzkVxlVxiTuiStePpdNqbMnbLqbMl`Jj[FdXB`UA^S?\Q=YN:WL:VK9VJ:VJ:YM=WK;UI;RF8PD8OC7OC7MC7OK?OM@QOBTREUUIVXKXZMX\NW]QW_RW_TV`UUaUUaUUaWV`WX[RY[PYYOWWMWTKURIUPJTOIWPJWNIXMKXMKYKJYKJZJKZJJZLIZMG[NH[NHYLFUHBPC=NA;(*')&(%'%'&(')(*')')(*(*)+)+*,*,*,*,),),)-)-),),&&''+(,)0(1)4*2*/"+.#+.#+/"+2#*3"*6!(7 (<"+>#,B#+F%.J'.M(0O*2R*3R)1T)2V(2W(2Z(3[)4\(4]'4\&3['3Y'2V'1U&0S%/P%.O&.F#)E%*G$*G$*H%+I$+J%,J%,P(0O'/N&.L$,L#+J!)I (H'G(E (F!)F!)G"*G"*H#+H#+I$,H#+H#+G"*G"*F!)F!)F!)I!)H!&E 'B%>$9 50*'#!!    !!!""##$$$$$%&'()+,-./012333333333111111110//..---////////-------,.---,,,,.../01110134443322110 0 / / 223366779898879 7 6 6789;< < ;< < >"?#@$@$A%@$@$@$?#?">!>!= = = = >!>!?"?!?"B# C$C$D% F( G)G)H*L/!L/M0 N1O3P4Q5 Q5 P5 Q6!Q6!R7"T9$U:%U:%V;&Y>)Y>)Z?*Z?*[@+[@+\A,\A,]D._G/cI0gN0kR3oW5sY6u[6~b;j=s@~BITUUUVTUVWTSXZ[]][XURRUX]_aacdeġg˥gѨjשk۫kתf٭fݮhimnnooopqqpmkjjmmkߵiܲjذhծiԯiԯiӱjԲjӳjԴkҴkβiδiжkӹl׾noqopnnqsuqopqsvyz|{|}~}~|{}{~}||yxwwx{|zsnljjghiihľfiüda_ųa˶eϸjҹiжbӹeջgԻgѻfлhҽjoooվnվpؾqٿrܾutֿolоl̻iɸjµggjgjlnqswxvuwxywrojiggea|YvzUsyWsxXsxXrwWqtWorUloTknSiiOhhNgeNfdMecNgePjeQjhSbdLaeLceMdfNffNggOigPigPojVojVpiVpiVphUnfSmdSncQk`LmbLsgQvkUznXzoY{oYzoYwkUshRqeOodNocMk`Jh\FcXB_T@\T?ZR?XP=WOTK(*')&(%'%'&(')(*')')(*(*)+)+*,*,+-+-),),)-)-(+(+''''+(,)0(1)4*3*1!+/"+2",3",6"+7"+8!);!*?$-C$,F%.J&0N)1R*3T,5V,6U*3W)3X)3[)4[)4])5^(5^(5]'4]'4['3Z(3Y'2V'1U'1R'0L$,J%,L$,L$,L$,L$,M%-M%-P(0O'/N&.L$,L#+J!)I (G'E (E (F!)F!)G"*G"*H#+H#+I$,I$,I$,H#+G"*G"*G"*F!(H (H!&D&A$>"83.(%"        !"!!!"###$##$%&'(*,-./01223333333322222222000/...-000//...,,,,,,,,-,--,,--....//000123443211110 0 0 0 2233667799:988: 7 4 5 689:< < :;;=!>"?#?#@$@$?#?#?#>!= = = = = = >!>!?"?!?!B# C$C$D% F( G)!G)H*M0"M0"N1!O2 P3!Q5 R6!R6!P5 Q6!Q6!R7"T9$U:%U:%V;&Y>)Y>)Z?*Z?*[@+[@+\A,\A,\C-^F.bH/eL.iP1mU3qW6rX5z^7f;n=x?GSUWUVTTUWTSUY[]]ZXUSSUX\_`aaacȢdϦhתiެmliimmpqrqrrrrrnmkjilki۴gׯgԮeѬfϭfЮgЯhаgϱhвiϳi̲hͳiϵjҸmջn׾nnnnlprtrpmnprtwwxy{z|{||||zz{yywvuy|~{tkhgžfüd¼dľfhſgýeiȾgǸeǶd˶eϸhռlؽl׽iٿjlljjlpppprstwuropo̼nƹklliklorsvwvuwyzywrlkige_{XuyTsyWsxXsxXsxXruXpsVnqVmpUjjPhhNecLcaJb`KcaLgbNgePacKaeLbdLceMffNggOigPjhQniUniUohUngTogTnfSmdSldQkcNnfOshRumVzoYzr[}r\{s\{pZumVshRogPodNjbKg\FaYB^VA]U@[S@YQ>XP=XP=YP?YP?YPAXO@VM>TKSK>VRFVTGXVJXXL[[O\^Q]`U^aV]cY^f[`j_cmbcoeamc_ka_i`[`Y^aX`a[_`X]\WYXSVSNROJUPLWOLWMKVLJVJJUIIWIIVHGTFCUHBWJDXKEWJDVICUHBTGA)+(*')&(&(')(*)+')')(*(*)+)+*,*,,.,.*-*-(,(,'*'*((((,)-*1)2*5+4+4 +4 )6!*7"+:#-=#.?$-A#-E&.I%/L&1P(1R*3U+5W-7Y.8W)3X)3Y*4[)4])5^(5_)6a)6_'4]'4]'4\(4Z(3X)3X)3V(2P%.P%.O&.O&.O&.O&.N%-N%-Q(0P'/O&.M$,K#+I!)H (G'E (E (F!)F!)G"*G"*H#+H#+J%-I$,I$,I$,H#+G"*G"*G")H (H!&D&A$=!62-(%"         !! !!!"###""#$%&')+,-./01133333333222222221000/...110//.--,,,,,,,,,,,,..00////1111/013332200001 1 1 1 22336677:9::98: 8 5 4 56789: 899: ;!=#=#>$?#?#?#>"= = = <= = = >!>!?"?!?!B# C$!C$D% F( G)!G)H*M0"M0"N1!O2 P3!Q4"R6!R6!P5 P7!P7!Q8"S:$T;%T;%U<&X?)X?)Y@*Y@*ZA+ZA+[B,[B,[B,]E-_G-cL-hO0kS1nV4oW3rX3y`7j9u"62,(&$          !!""#!!"#$%&(*,-./011333333333333333311100//.2100..-,--------++,,..1100102111/0123321/ / 001 1 2222336677::;::9;8 656667777889: <"<"=#?#>">"=!= <<<= = = >!>!?"?!?!B# C$!C$!D% F'"G)!G)!H* L.#L/!M0"N1!O2"P3!Q4"P5 O6 P7!P7!Q8"S:$T;%T;%U<&X?)X?)Y@*Y@*ZA+ZA+[B,[B,[B,\D,^F,aI-fM/iP1kR3mU3nT1v]5f7s;EPQPQSQRUWWTTVWVWXYWXVWY^_b›bÜaşaˤcѩdۮjlpprpsqrqpnkjkjkhihfgj߼jܹhֵfҲgаeȪbǫbǭcɯeȱeʳgʴh˵iɳhʴi͵kθlѺlҽlվnkտikmnmmlklnptwxvuuwy{{{{{~~~{xvus{qigƾigddgþjſiƾiŻfǻe˻f˹eιfҼgnorrsqnnoslmpstuxxxxzzxuſssqttstuxxyxy||{wtpmiec~]x|WswTsxXsxZsxZrwYqtWorUloTknShhPffNcaL`^I^\G][F`[G^\G`_Ja`KcbNfePhgSkjUnlWomXojVniUmhTlgSmfSngTohUoiSupZuqXvrYwsZxt[yu\yu\yu\}y`yu\soVokRnjQkgNhdKe`JaZG`YF^WD\UBZSAZSAZSAZSAZSCYRBXPCXPCXPCZRE[SH[UIYUJWWKYYMZ\O]_T_bWadY`fZai^ak`dnefrhhtjgtjfsjfqiekgfkggifdfaaa_\]XXWUUTPUQNUPMVNLUMKTJIRHGRFFRGEQFDQFBRGCSHDSHDTIETIETIE)+)+(*')')(*)+)+')')(*(*)+)+*,*,-/-/+.*-(,'+&)&)(())-*.+2*3+6,6+8*9)> *A#-E%0H(3N*6P*5Q)4R(2S)3T)3W)3W)3X*4Y*4W(2W(2Z(3Z(3]'4]'4`(5`(5^&3^&3\&3['3['3[)4Y*4Y*4Y'2Y'2Y'2V'1U&0S%/S%/Q&/R'0Q&/O&.M$,K#+I!)F!(E 'G'G'H (H (I!)I!)J"*J"*M%-L$,L$,K#+K#+J"*J"*J"*L#)K"(H (C%>"83-,'$              !!"""  !"#$%'*+,-./01111111113333333321100///2210.-,,........,,,-011133433221./122211/ / / 01 22222336677;:;::9;97554433345678 9!:"">">"=!= <<;= = = >!>!?"?!?!A#!B%!B%!C& E("F)!F)!G+ J."J. K/!L1 M2!N3 O4!O4!O6 N8!N8!O9"Q;$R<%R<%S=&V@)V@)WA*WA*XB+XB+YC,YC,XB+YC+[F+^I,dM.fO/jQ2kS1lT0t]4|d8o;BNPONPOQUXYWVUTSUUXYXXYZ]a›bŝbɡdˣeϨeحhjlprqqrooljhfeefhgjjff޾iܽjٺhԷgеhϴgūaĬbĮcưeŲeǴgȵhɶiȵiɶj̶k̹lлlоlԿnjӿhjlkjjklklquvwvuuvvy{|{|}{yx~zqjimlhgjlkkƺdʻfͽhμfмfԾhnptttrnnnrpqsvwvvvx{}}{xuuvxwuuvwx{z||}{uqpmhca}^yzXrvUtyYty[sw\rv[psXmpUjlThjRfePdcNcaLa_J^[H\YF\WD\WD\YF]ZG`]LdaNheTkhUnkXpmZnkXmjWniUmhTmhTniUpkWqlVtr[usZusZvt[wu\xv]yw^zx_|zawu\rpWnlSmkRkiPhfMfdMc^Ja\I_ZG\WDZUBYTAYSCYSCYSEYSEYSGYSGZTH[UI]WK\XL\ZN[[O]]S^`UacXcf[eh_dj`cjbblcdneeqgfqigtkhulhuniroiomgkjchd`ba[]ZYYYXWUUQPTPOTNNRLLRJHQIGPFEPFDPFDPGBPGBQHCQHCRIDSJESJE*,)+(*')')(*)+*,')')(*(*)+)+*,*,.0-/+.*-(,'+&)%())))-*.+2*3+6,8+9'<)@*D#.J&2N*4R,7V.9T*4U*4U*4W)3X)3X)3X)3X)3W(2W(2Y'2Z(3['3]'4_'4_'4]%2]%2\&3['3Z(3Z(3Y*4Y*4Z(3['3Y'2Y'2V'1U&0S%/S%/R'0Q&/O&.M$,K#+I!)F!(E 'G'G'H (H (I!)I!)J"*J"*M%-M%-L$,L$,K#+K#+J"*J"*M$*L#)J!)F&@#83.-(%     !!              !!"" !"#$%'*+,-./001111111133333333221100//3210.-,+////////+,,-0112445433320/022211. / / 01 22322336677;;;;::;98654321 1 445678 9!9!>">"=!=!<<;;= = = >!>!?"?!?!A#!B$"B%!C&"E($F)#F)!G*"I-"I-!J. K/!L1 M2!N3 M4 M7 N8!N8!O9"Q;$R<%R<%S=&V@)V@)WA*WA*XB+XB+YC,YC,XB+YC+[E-^I,cK/fO0iP1jQ2nV4t\6za8k9|@MRQNNNQUYYXWUSPQTXYZZZ[^`Ĝaǟb̤fΧfԬg۱ikmotqrqolhgd߰bbdefhij޿eeiھjؼiԹhѷjͶhëa¬a¯cñeŴfŵgǷiɷkȶlȶl˷n̺nλnϾnnlѿilmkhimmlmqvywvutvxy{|{|~}|wpiinnii½kmljƺd˽eоhпgҾgjorttvsomoquvwxyxuuy|~}|yw{{zyxxxw|}|~~{uqroieb|]xyYruVux[ty[sw\quZorWknShjRfhPdcNdcNcaLa_J^[H[XE[VCYSCWTCYVE\YJa^MebQjgVmjYolYolYmjWniUmhTmhTojVqlXpnWssYqtYttZsv[ww]wz_{{az}b{{aux]qqWloTmmSjmRiiOggOcaLc^K`[H]XE[VCYTAXRBXRBZTFYSEYSGZTH[UI]WK^XL^ZN_]Q^^R_aVbdYcf[fi^flbfncblcblcbndboedqhgtkgwmjwplutkqqgmmcgh^bc\^]Y[ZXXXSQRTPOSONRLLPKHPHFOGEOEDQGEQHCPGBPGBQHCQHCRIDSJE*,*,)+)+(*(*')')')')')')')')')')*,*,(+(+'+'+&)&)''((,)-*1)2*4*5(?+C+F".I%1L&1P(3P(3R(2U*4V(3U'1U&0V'1Z(1\*3\-5[,6Z+5[)4Z(3['3]'4`(5a)6a)6`(5\&3Y%1W%0X&1W(2X)3X&1Y%1X&1X&1V'1V'1U'1U'1N#,N#,L#+K"*J"*I!)F!(F!(I"'J!'J!'J!'J!'J!'J!'J!'M$*M$*M$*M$*M$*M$*M$*M$*L!(K"(K"*J"*E (@$:"6 *&$                        !!""##%(**+,-./222222222233445 5 221100////..--,,----------01224466778653/-./001132000 24544457888=!=!> =;88 4 5332211034455666;;;;;;;;;<<= ?"@#@" A#!C'$C'$D(%D($D($D)"E*!E*!F+ I/"M3$O5&N4#N4#P6%R9%O9"O9"P:#Q;$R<%S=&T>'T>'Q;$T>'XB+[E.\F/ZD-WA*U?(UA)VB)XB*[F)^I,bM.hQ2jS3mT5pX4xa8p?ILMLGIJNRW\]YXVTTUXW\[Z[^Ücɡf̤g̤fͦcѩcٯehlkllmޫjۨgۨfܫf߮i߰hԨ]׬^ڱb޵efhhfkgٿhԼfѸdͷd̵g˶gƳg°dabóeƹjȻlɼnƶkǷlʸn˻nͼn;mνk;iiiijlnqqopuwyyvuvvx{zyxz|~}ytnkonhfýilppοjͿgϾfϾdпeghgposttrolrstvxxwy{Հ؅ڇ؆҄̀|y|~{wsz|||vrrnic~]|}]|}^z}^twZrv[osXlpUikSfhPceObdNcbMbaL`]J\YFXUDURATN>SM=XRD[UG_YMd^PgaSicSgdSgdSifSkhUomXomXomVpnWsqZvt]qtYquZux]vz_y|ay}b{~cz~cvy^tx]ruZnrWloThlQfiNegOecNdaNc`Oa^M_\K^[J\YJ\YJZVJZVJYUIYUIYUJ[WL\XM\ZN__U_aVabZde]fi`hkbhmfhogcmecmebmebofdqjfunixqmyujtultvksujorejm`de[_`Z\[UUUSQRQPNRNMRNMRLLNIFLDBPFDOECNDBNDBNDBOECPFDQGE*,*,)+)+(*(*')')')')')')')')')')*,*,(+(+'+'+&)&)((((,)-*1)2*4*7)B,D+I .L$/N&1Q'3Q'1R'1X*5W)3W(2V'1X&/Y'0[)2Z+3Y+5X*4X)3Z(3Z(3['3]'4^(5`(5\&3Y%1W%0V$/U&0U'1V(2W%0W%0W%0U&0U&0T&0T&0R'0N#,N#,L#+K"*J"*I!)F!(H (J!'J!'J!'J!'J!'J!'J!'J!'M$*M$*M$*M$*M$*M$*M$*M$*L!(M")M"+L#+H )A%<$7!-)&#                        !!!""#%()*+,-..0000000022233445 32211000//..--,,----------01234566778754/../001122101 24544457888=!=!> =;88 5 5322111034445566:;;;;;;;;<<= ?"@#@" A#!C'$C'$C'$C'$B&#B&"B' B'E*!I.#L2%N4%M3$M3"O5$Q7&N8#N8!O9"P:#Q;$R<%S=&T>'S=&T>'WA*ZD-[E.ZD-XB+WA*VB*VB*YC+[F+_J-cN/hQ2jS4nU7pX6w_9n?}GMMMIJMNTV[]XWVTUTVWZZ[\`ĝdɡf̤gͥgΧdЪc֯dijhjݬi۫kبjըgըg֫gٮiٱiϧ_ѫ`հbٴdݸhjlljf׿gԼfϹdθe̷hʷhǵiIJfccögǺkȽmȽnƸmƸoƸmƸmȻmɼm˿mlkilmopsrnotwyxwtzy{{|yz|z}|zvoprpjľhimopmkihihjimlqsssrqqrtvz{{|ق݆ߋ݌׈Є̂ȂȄƆņ~yw|{}~|vspnid~_{|]z{\zz^tw\quZosXlpUjlTgiQegQdfPdcNbaL`]J]ZGYVEURAUO?SM?WQEYSG^WMb\Pf`ThbTgdUgdSheTkhUnlWomXomVpnWsqZuu]tw\uy^vz_x|az~cz~cz~cz~cuy^sw\quZnrWkoThlQfjOfhPedOedPdaPa`N`]L]\J]ZK[YJ[WKYWJYUIXVIZVKZXL\XM\ZN_aV`bWbc[dg^fi`gmchoggqheogdogcpgaqgcrkfunixqkzuny{mv{lsyhpsfkobgj_cf^bc[\^XXXTRSRQORNMPLKMHEJEBNFCNDBMCAMCAMCANDBOECPFD*,*,)+)+(*(*')')')')')')')')')')*,*,(+(+'+'+&)&)((((,)-*1)2*5+9+C+G*K!-M#/P&2R'1R'1T&1X*4W)3W(2V'/X&/X&/Y(.X)1V+4V+4W)3W(2W(2Z(3\(4\(4[%2Y%1W%0T%/S$.R$.Q&/Q&/Q#-Q#-Q#-Q#-Q#-O$-O$-O$-M"+L#+L#+K"*J"*I!)I!)I!)K"(L!(L!(L!(L!(L!(L!(L!(N#*N#*N#*N#*N#*N#*N#*N#*O")N#*N#,M$,J"+C '>&:#3!.*%!                        !"""%()*+,-..--------1223344433322110//..--,,--------//013478679998751///001121111 24544457888< < ==;99 5 31110///22234446:;;;;;;;;<<= ?"@#@" A#!C'&B&%B&%A%"@$!?#>#>#C(G,!K1$L2#L2#K1"M3$O5$M7"M9!M9!O;#P<$Q=%Q=%R>&S?'T@(UA)VB*WC+XD,YE-YE-WC+XD,YE,[G,^K-bO1fQ4hS6oW;qZ:w_;j>xCHKOJKMNSUY[VWXXWUUUVWZ]›`ǟdɡfˣfΨiΨgϪdԮeڳhge߱fӨdЧgϦhͦeͧfͪfЮgҰhʨ`̪`Яbմe۷iߺjnkhe־fԼfкeϹfιj̹jɷkƴh²efŸiȽmɾnɾoƺnĸn¶jh·hźjɾllkilnpqtuppvwzyyv~}~}~{|~y{||}||{zuvtrljknpopplkkjkkkmoprswxprwz܁܂݃ۋԇЅ͇Ή̋ɊÇ{||||}{urkjgd~`zz^yx\ww]sv[rv]pt[nrYlnXjlVhjTgiSedPcbNb_N^[JZWFWTCVPBTN@VMDXOF\SL`WNd]SgaUicUjdTheTkhUnmXonYooWppXss[tv^y}by}b{d{d|e{dz~cy}btx]sw\quZosXlpUimRhlQgkRfhSefTedRabPa_P]^N][NZ[MZXKXYKYWKWWKZWNYYO\YP[[Q`aY`cZbe\eh_hkdhmfiphhrihrjgrjfsldslfunfwohyskzwr}p{mv}irwgntempejneilbce]_^WWWQQQONLMLJKGDIDAMECLDBKCAJB@JB@JB@KCALDB*,*,)+)+(*(*')')')')')')')')')')*,*,(+(+'+'+&)&)((((,)-*1)3+7-;-E,I+L".N$0Q&0R'1T&1T&0X*4X*4X)1W(0X&/W%.W&,U&,U*3T+3T)2U'1U'1W(2Z(3Z(3W%0V$/S$.R$.Q#-O$-N%-N%-L#+M"+L#+L#+L#+L#+L#+L#+K"*K"*K"*K"*J"*J"*J"*K"*M")M")M")M")M")M")M")M")N#*N#*N#*N#*N#*N#*N#*N#*P#*P#*O$-N%-K#,F!)B(<%6$1",!'$                       !!""$'()*+,-.++++++++1112333433322111//..--,,,,,,,,,,./0145897799:875200000111111233444457888;< =<;99 6 21100//. 12233445:;;;;;;;;<<= ?"@#@" A#!A%$A%$@$#?#"=!< ;; A&E*!I.#J0#J0#I/ K1"K4"K6!L8 L8 N:"O;#P<$P<$Q=%T@(T@(T@(T@(VB*XD,ZF.\H0YE-YE-ZF-\H/_K0cP2gR5iT7pX~g=p>}BGMKKMMRSWXTTXZYWVUTX[^ĝbǟdɡfɢgͩk˩i˪eϭfձgײdٯc֬bˤaɣbɣdǤbȧdȪdɭd˯eȬbʯbͰbѴdַgٸgݹkܼigdսeӻeкeιfϺkͺkʸlƶiĴgöhźjɾnɾnɾoĻnmhcaeļkkjjloquuuttyz|{{{~}}~~~~{}}}ywsrmjjlnnrooljjjkkmoppqvyptx|߂܍ԇЇ·̉ˊɊʼn~|{|}zuphigd~~bzz^yw^vv\tv^sw^qu\osZnpZmoYkmWkmWfeQedPc`O`]L\YHXUDWQCVPDTKDVMFXOH\SL`WPd]SgaUicUheTkhUnmYonYooWoqYrt\uw_}f}f}f}f|e{dy}bx|asw\rv[quZosXmqVkoTimRimThjUghVfgUcdRabR^_O\]O[\NZ[MZ[MYYMYYMYYO[[Q\\R\^Sad[be\dg^dj`gleiphisjjtkjumivmgvohwphyqizrj{ujzyrr|pynw~nu}krxintfkoaeh\]_UUWOOOMLJKJHKGDIEBJEBKCAIA?H@>H@>H@>IA?JB@*,*,)+)+(*(*')')')')')')')')')')*,*,(+(+'+'+&)&)))))+(,)1)4 ,8 .=!/F -L -N#-P%/Q&0R'1T&0T&0W)3W*1W*1V)0V'-U&,T%+S&+S*2Q)1P(0Q(0R'0T&0U'1W(2S$.R$.R$.O$-N%-L$,K#+I$+G")G")I!)I!)I!)I!)I!)I!)J"*J"*J"*J"*K"*K"*K"*K"*N#*N$(N$(N$(N$(N$(N$(N$(N$(N$(N$(N$(N$(N$(N$(N$(O")P#*O$-N%-L$-G"*C)>'7%2#-"'$                         !!$&()*+,--++++++++0111233333221100//..--,,,,,,,,,,.01378::89;;:9:7311111000112333344457888;;<<;:: 72..--,,,///00114:;;;;;;;;<<= ?"@#@" A#!@$#=#$<"!;! :!877=%A)E-!F/!E. E. G0 I2 J5 I7I7J8 K9!M;#M;#N<$R@(R@(Q?'Q?'SA)VD,YG/\J2YG1YG/ZI/[J0`L1cO4gR7iT9nY>r]@w`@zd;j9t;BHKJKKOPSTPSY\]\ZYUXZ]ĝbǟdǠeƢf̪kȩhǪfʬfϮgЮdѫbΨ_Ƥ]Ť_ŤaĦ`ħaūaŮbŰaȳdɴc˵bεaѷcӹdֺg׻ggdսeӻeкeιfϺkͺkɷkƶiĴgöhƻkȽmȽmƻl¹njc][_fýgſghloruuuxx|}~}}~}zxqoigiklkqonkigggmprsppuysw{߀ߎي҄υɁȄDžƆÇ~|{ytoggfd~~b{{azxaxx`vx`uy`sw`rv_qs]oq[moZmoZhgUgfTebQa^M]ZKZWHYSEXRFSJCTIEUJFWNG[RK`WNc]Qf`RheTkhUnmYonYnpXprZtw\vz_~f~f~f~f|dy|awz_vy^sv[ruZqtYpsXorWmpUloTlnVjmZil[gjYehWbeT_bQ]_Q\^P\^Q[]P[]RZ\Q[]R\^S^`U_aVbe\cf]chafkdingjqijtlkumlwqkxqjyrkzsk|vl}wj}wl|{rq~r|s}t}pyipvdim[_bUYZPQSKMLKKIJJHIHDIEBIDAHC@GB?E@=D?*,*,)+)+(*(*')')')')')')')')')')*,*,(+(+'+'+&)&)))))+(,)1)4 ,:"0?#1J!/M!.O$.Q&0R'1R'1T&0S%/T'.U(/V)0V)0W(.V'-U&,Q'+Q)1N)0O'/O'/P'/Q&/T&0U'1Q#-O$-P%.O&.M%-J%,I$+G$*F#)D$)F#)F#)F#)G")G")G")I!)I!)I!)J"*K"*L#+L#+L#)O$+O%)O%)O%)O%)O%)O%)O%)N$(N$(N$(N$(N$(N$(N$(N$(N!(O")O$-N%-M#-G"*C)>'7%2#-"($                          !!#&'()*+,,,,,,,,,,0001122321110/////..--,,++++++++/01379; !#;!";! : 9 887;"?'C+D, C,C,E.F1I4H6H6I7J8 L:"L:"M;#Q?'Q?'Q?'Q?'TB*WE-ZH0\J2[I3[I1[I1]L2aM2dP5gR7iT9mX=r]@ybBzd={e4m6z=DJIIHLLOPNRV[]_^^ZZ\]ĜaŝbƟdšeȨkũhĩfƫfɬfʬdɩ`ǥ]Ǧ_Ǧ_ŧ_ũ`ëaía¯`^ǶdǷbȶ`ɸ`θbѼcսe־fhe־fԼfкeϹfιj̹jǵiųgófµgŸiƻkźjijh_ZX[ad¼ffkpstvtxxz|~~~~}}}|vpjhgikkmppligecckoutpotxxz}܊׈Є̂ĀÁÅ~{urjjgfe}}c}{d||dz|dx|cvzctxart^pr\np[np[jiWhgUfcRc`O_\M[XI[UGZRGSHDRGERGCRGCTKDZQH^WMa[MgdUkhUnmYnpZoqYqs[tx]w{`{~c{~c{~cz}bx{`vy^tw\ruZqtYqtYqtYpsXorWorWnqVnpXmp]lo^jm\gjYdgVadS^`R]_Q_aT_aT^`U^`U^`U`bWacXbdYdg^eh_ejcgleiphlsklvnlwolwqmzsm|un}vozozmzm~rr~t~vwr{how_flV[_RVYNOQKMLKKKKKIJIEGFBIEBIDAGB?E@=D?'5#0!+ '$                    #&'()*+,,--------/0011222000//..-//..--,,++++++++/0138:= >!9:<<=<:763321100/ 0234322444578889:<<<;;71---,,++..//0003:;;;;;;;;<<= ?"@#@" @$!<!: !: : 9 9 9 9 :!=%A)B*B+B+C,D/H3G5H6I7J8 K9!L:"L:"O=%P>&Q?'R@(UC+XF.ZH0[I1\J4\J2\J2^M3bN3dP5gS:hT;kU=r]BzcCzd=xc4|i1u8>HGHFIIIJMPUZ_bècŪc]^]\š_Û`ĝdàfƨlçhefĬfƫdħa¤\ʩb˫bɫbȮaŰañ__\·^·]ŷ^Ǻ^ͼbdhjhf׿gԼfϹdθe̷hʷhųgñedeögķhfefd[VTW\^dÿdjorstuvuvxz{}|~~}yyz|xplhhlnoprpnigdbagntutrw{|}ۉՆЃ΃ƀƁÄ|wtmlhfe~ghj}i{hy}fvzctv`qs]oq\moZkjXihVheVdaR`]N]ZK\VH[SHSHDSEDODBNC?OF?TKBXQG\VHgdUkhUnmYnpZoqYqu\uy^x|awz_yy_yy_xx^ww]ttZrrXqqWssYssYrrXrrXrrXrrXrrXprZor_mq`ko^gkZdhYaeV^bS]aRaeWaeW`cX`cX`cXbeZcf]dg^ehafibfkdingjqjmtmmwomxplwqmzsn}xq{r}r}ppvrq}rupzfov^ekV[_RWZOSTMQPNPOLNKIIGGFDJFEICCGAAF@@D>>D>>D>>D>>*,**)+))(*((')''')''')''')''')')(+(+()()')')&)&'**)))(+(/)3!-:&2A'4H$0M#-O%/P&0Q'1Q'1Q'1P'/N#,P%,R'.T*.U+/T*.U(-Q(.N)0L)/K(.K&-M%-O&.P'/R'0N#,O$-P'/P'/P'/M&+K#+H#*D$)C$)C$*D$)D$)F#)F#)F#)F!(F!(I!)J"*K"*L#)N#,N#*R%*R%*R%*R%*R%*R%*R%*P&*N$(N$(N$(N$(N$(N$(N$(N$(L&M)M"+N#,L",I!*D)?'5 2,'#                    !%&'()*+,//////////001122///..--,//..--,,++++++++.0148:{dB{e>F=>F=>***(***(***(***(***()))'(((&'''')))))))))))))))'-!++))'*'+(/",2%/:&1F&1H$.H$.G#-G!,F!)H )G'O'/O'/P'/P'-Q(.Q(.R'.P).L)0J)0J)0L)0K(/L'/N&.O&.R)/Q(.R'.Q&-R%,Q$)Q$+M$*G"*D#*E$-G$+G$+I$,I$+I$+J"*K#+L#)L#)M$*N%)O$+Q$)T%+U$*S$*R#)R#)Q"(Q"(P#(O"'O"'O"'O"'N$(N$(N$(N#*N#,M",L!+K *J)H'F&E&?$:"5/(!                     #%%%&&''.-../033////////000//..-........,,+++-.035679 :!;";"::998877333221111112233334677777::;;;987 3 3 3 3 1 1 1 0/ . /001237 7 7 7 8777< < < =!> ?!?!?!> >"@" ?# A#!?#@#?$A$@%B&C)E)E+G,G-F/E0F/G2!I3%L6(N8*P;*L9(M;'N>'P@'SC)VG*XI*YJ-^L4^L6`L4`L3bN3dQ3hS6iU4oX6r\7t^7u`5wa2zd2k6p;MNMGz@{@EJLOX\]_`ŭeͬiɦdƠ_ş`ƠaŢbà`^bbb`acªdëcŮbƯaǰdȲfɳhǴhǴhųgųgd__³b̽jtwlikjӺfεeʰcŮbĮcïf°fb^\^ab_\YZ^achinruvtsuwz~}{|{~}wrpjip{|umptuspllgkruwzހ߄܂ـ؂ތ܍ڍٌ؍ԋ͈DŽƈŇyxspm|jzjzj|o{n|mzkw|huxesvcqtcoralm]hiYfdUdbS`^O[YJYSGVKERDAK@8G<6G>5RJ?]WIhbTmgWqn[tr]us^tt\vv^ww]ssYssWrrXqqWmpUloTkmUjnUkmUjnUimVimVjoXkpYmr[ns]or_or_op`mp_kl\gjYdeWacUaaUacVddXegZgg]fh]gg]eg\dj^dlafncgqfjtkkwmmxpmzqn{to{wo~{q}rtvwutsp~lxhtfpzenwbis^emZ_eUZ^RVYMQTHIMEEGHFGIEFHBDF@BF=@F=@G<@G<@*(*(*(*(*(*(*(*(*(*()')'(&(&'%'%)')')')')')')')'-!++)*()'*(-!+1%/6&0@&1C#.C#.B#+B!*B!*C)C 'G$+G$*I$+I$+L$,M&+M&+L'.J)0I*2I(/I(/K(/L'/N&.N&.R)/Q(.R'.S&-S$*S$*R#)Q$+M%.I%/I%/I#.H#+H#+G")I!)K#+L#+L#)M$*M$(O%)O%)R%*V%+V#*U$*U$*T#)T#)Q"(Q"(O"'O"'O"'O"'N$(N$(N$(N#*L!*L!+K *K *L)I(H'G'C$>"81)"                      """#&'''..//0134///////////..---........,,+++-.035678:!:!;"88776655333221111112233366777899::;;;987 3 3 3 3 2 2 0 0 0001123344446566:!:!< =!> ?!?!?!?!?!@" @#A$ A$A$A$B&C'C'E)F+G,H-G-H.F/G0"H1#I3&K5(N8+O9,L9*M:)N=)P@'SC)VG*WJ*XK+^L4^L6`L4`L3bN5dQ3hS4iU2oY4r\5t^5u`3wa2zd3j9n<{IMNK}C~CEIMQV[\]`ĬdϮk˨fǡ`Ÿ]à^â_¡^]]^_abcªdªb_­^ĮbưdDZhűhűjñifd_]bɹktvrml׿iҹgʹdɯdŭc`dda]\^ab`]]aeffilnqstrrvx}݀}{}{z|~~|wtspmrz{wquxyupjhdgloqwކۄڃلݎېَ؏אӎ͌ȉƋŋ|yvq~oykylxl|p|q{pynx|kuyhtwfrudpsbmp_kl\hiYhfWdbS^\MZVJXMGSEBNA;J?9H>5I?6SI?^VIh`SlfVrmZup]vq]us^vt]xv_ttZttXssYrrXorWnqVmqXmqXkoXjnWinWinWhpYjr[lt]ot^or_or_pqamp_kl\gjYefXbdVbbVceXeeYfh[hh^hj_hh^fi^dl_cmbeodgsiiukkxomzqn{tnzvm|yo~{psuwxwvvro{jvhr~fpzdku_fn[_hV[aSV[NQVJKPFGKHFIGEFFBCE?AF=@E'>%? &A"(C")E%*F&+F&+I(/I(1K(/K(/L'/L'/N&.N&.Q(.R'.T'.S&-T%+T%+U$*R%,O'0M'2L'/L$-K#,I!*H (H'M$*N#*N#*O$+O%)R%*R%*S$*V%+W$+V%+U$*T#)T#)R#)Q"(P#(P#(P#(P#(M#'M#'M#'M")I (I)J)J)J)I(I(H(F'A%;"3+#                          !#&())./011244////////...--,,,--------,,+++-.0456789 9 :!887766553332211111122333986668:<::;;;987 3 3 3 3 2 2 0 0 12232334 22224455:!:!< =!> ?!?!?!@" @" @#@#A$ B%B%C&D(E)E)F*G,H-I.H.I/ G0 G0"H1#H2$K5'M7*N8+K8)L9(M<(P@'SC)UF)VI)WI,^L4^L6^L4^M3bN5dQ3hS4iU2mY4o\4t^5va4xb3{e4j9nE:>E:>*(*(*(*(*(*(*(*(*(*()')'(&(&'%'%)')')')')')')')', *+)*(*(*(, *.",0#-5!,6!*7,6)6)6)8)8'8&9%:& ?!?!?!@" @" @#A$ B%C& D'E)G+G+H,I-I.J/J/J1K1 I2"H1#H1#H2$J4&K5(M7*K8)L9(M<(O?(RB)UE+VH+WI,^L4^L4^L4^M3bN3dQ3hS4iU4lX5o\4u_6wb7yb6{e6i:m'-B'.F%.I#.J%-J%-M%.N&/O&.Q&/R'.T'.U&.W%.W&,Y&-Y&-X&/O$-N$.N$.O%/P%.P%.P%.R$.R%,S$,S$*T%+T%+U&,W&*W&*X%,X%,W&,V%+V%+U$*S$*R#)Q$)Q$)Q$)P#(M#'L"&L"&L!(G&G'G'H(H(H(H(G(E")A '<$5 /(#!        !#&(**./234343////////.--,,+++,,,,,,,,,,+++-.0456667778877665533322111111223336420 1 379::;;;987 4 4 4 4 3 3 1 1 44342233///03355:!:!< =!> ?!?!?!B$"A#!A$ A$ B%D'!F)!H,!J."J."K/!K/!K0L1L1K2M3"J3!I2"I2"H2$I3%J4'K5(J7(K8'L;'O?(RB)TD*UG*VH+^L4^L4^L4^M3`O3bQ3gT4hU4kW4o\4u_6wb7xc8ze8~i ?!?!?!C%#B%!A$ A$B%E( H,!K/$M1%M1#M1#M2!M2M2M2L3N4#K4"J3#I2"G1#H2$I3&I3&J7(K8)L;)N=)QA*TD+UG,VH-]M4^L4^M3^M3`O3bQ3gT6hU4jV3nZ5u_8xb9yc:{f;~i>k:wA{?~?|;|7:BIQSUUWVZ]^affc^ZYYZ]_`_^[ZZ[]_]^]^\[[]cúkoȾiɿjnʿoǹnid`ecbbeeeeeeikllmjnmkknptvvx|~}|}z|yyyz||}ywy~}wx~~}tux{}yph`_\\aehhmpw|ʂ·Љь̊ˉ̌Џђђ͐ʏōŒ{x~xx~v|rxnv}ku|jw{jw{jvwguvfxvgzxi}zk{xixrdtlapa\eSQXIDUFASD=RCBD;@E:@D9?*(*(*(*(*(*(*(*(*(*()')'(&(&'%'%)')')')')')')')'*(+)+)+)+)*(*()')))))++*,+,+-,/*0 +2!+2!+3"*4#-6"+7#,9"*D#,G!,J"+K#,M#-O%/Q&/Q&/S&-U&.W%.X&/Z'.Z'.\'/[(1U&0T&0U&0T&0T%/T%/T%-U#,V$-X%,X%,Y&+Z%+Z',[&,Z',Y&-Y&-W&,W&,V%+V%+T%+S$*S&+R%*Q$)P#(M#'L"&K!%J&I (H )G(F'E&C&B%A%?%=$:"4/,*&             """#&'''+-033220///////////..---++++++++,,+++-.05665555588776655333221111112233366666788::;;;987 8888775533220000./014578:!:!< =!> ?!?!?!C&"B%!A$ A$C& F)!J.#L0%O3'O3%O3%O4#O4!N3 N3M4P7#L6!K4"I2 G2!G2!H2$H2$I6'J7(K:(N=)QA*SC*TF+UG,]M4]M4]M3]M3`O3bQ3eT6fV4iW3m[5t`;wdkWI@[OC`THfZLkbQofUrjWtlYuoYwr\wu^vv^uu]uu]rt^qs]os\os\ru`qt_puapuaowbqydszhs|iq|kn{ilwfhucfqacp_do_cp_bm_coaeodfrfhrghthhrigrjetoeutgwvh{yj||moouuvwxwxz|~|upzlvipzeltbfo_dj]`eZ]bWX]STXMLQKKMIGJGBFE?CD>BE ?!?!?!D'#B%A$A$C&G+ K/$N2&P4&P5$P5$P5"O4!O4O4N5P7!M7"K5 I2 G2!G2!G1#G1#I6'J7(K:(N=+Q@,SC,TF,UG-]M4]M4]M3]M3`O3bQ5eT6fV5hU4m[7t`=wc>xe=yf<}g@j>l3r4z:<:;BITVZZ\^ad^^_\YY]b^]\[ZZZYb`a`a^\ZZYVUX\`dhfdcdfjkhdaabda^_empnqz}xqmjklnrrxy}~}||~~}wu{}tuuy~|vqjighgd^XhlszƉʏ̑ƋƋǏ˓ϗИ͗ʔŽ|}~z|wxrtns|kr{jt{kw{lvwiwuhwsgxth}wk~xl}uj|rivgbjXV]KGYGCVG@TE>WI@[OC_SGeYKjaPofUqiVskXuoYvq[wu^vv^uu]ss[pr\oq[mqZlpYru`ru`qvbqvbpxcrzet{it}jr}lo|jkxfhuceradq`cp_cp_am_bn`dpdfrfgsggsggsifsjfurfvvfxxhz|k}nopwwwxvwwy{}{upzkuipzeltbfo_dj^afZ]bWX]STYNMRLLNJHKFDGE@DD>BE$=$<$>!&; %; %8#6!20+#          #%%$$$$#   !""##!"""$%%%+,./013411111111//..--,,********,--..//034444444234554323332211122222222567887658:=!>">"< 97 6 7 9;;!;!8 8 4321/...1112456689 ;< ?!@" @" A#!A$ B%C& D'G*"K/$N2'O3'P4&P5$P5$P5"P5"P5 P5 O7P8 M7 L6!K4"I4#G2!F0"F0"J7(K8)L;)O>,RA-UE.VG0WI/ZL2[M2\N3^P5`Q4bS6dS5eU4hX6jZ6o]9sa;wc>yf>zfA|g<}f0s5AD@@HPTZ`beehica^[[\_`bbccdfggfdedfdba]WVZ__enqqka_fjklic`]_abcfntuxz{}zvsromkqqux|~|~}|}~xwux|~}zxqheeaZT\ft}ÏʖΗʓőőȕɖȗƕ}yy~}zwssor}ms{lrxjrvhvvjywkzvk|uk{rizqhzpg|ogfWR`NLUFAQB=SD=WHAYLCZNBfZNh_PneTriXrkXtmZwq[xs]vt_ut_ut_ts^rt_qs^ps^ps^qtaps`mq`mq`lsaovdqxhr{jn{jiwfesbdraftchveguffteftgdreboe`mcandcpfgtjivoessetwfxzi{mqrtqsuwwxxzyxxusp|oynxls}ipxfjs`ekZ]bUX]STYQRWOPTMNRLKPIGLHCIE@FCTE>WJB[NE[QEe[OibRqhWun\vo\vq]ys]zu_wu`vu`ut_ut_rt_qs^ps^or]nq^mp]ko^jn]ip^lsaovfpyhmziiwfesbesbgudhveguffteesfcqdand`mc`mcboeerhgtmessfuxhw|i{m~pssrsuwxwwywwwusp|pzoynukrzhlubgm\_dVY^TUZQRWPQUOPTMLQJINGEJFAGD=DC$/E'1G&/F%,H%,H%,I$,L$,N%-Q(.R'.S(/U(/W(.W(.X)/X)/W(0W(0V'/V'/X'-W&,W&,W&*X%*X%*Y%)Y%)Y%)Y%'[$'Y%)Y$*X%,V%+V%+U$*U$*R#)R#)R%*Q$)P#(O"'L"&K!%J $I &C%B&B&?%>%<$:$9 $:!%:!%9 $8#7!41-#          #%%%%&&&$$$###""  !#&'(),,./014411111111//..--,,********+++,,--.344444442345543233322111222222226789987679;< < ;97 9:< =!<"<"9!9!553300//1112456689 ;< ?!@" @" A$ B%B%C&E( H,!K/$N2&P4&Q6%Q6%Q6#Q6!Q6!Q7 Q7 P8 R: P:"O9"N8#L7$K6%J4&J4&I6(J7(K:*M<*P?-RA-SD/TE.XL2YN2\N1^P3_Q4aS6cT5dU6gW6iY8l\;o_=ta@uc?vcBwd<~h7uOD>RE=UKB[QG_WJf^QlfVun\zub{vbywb{v`zxaxwbwvavuaut`rt_qs^or_or_lo^kn]hl[hl[gn^ip`lscmvenyijwfgsefrdhtfiughthfrfcoebnd`lb_ka`kcbmedogerkfttguxiv|kzn}oqrttvvwxwwtuutsq}r|q{pwnu}koxejp_bgY\aVW\STYPSXPQVNMSKJPHELFAHD=EC%= %:$9 $7!$7!$7!$9 $8#7!42."         #&&&'''''&&%$$##  "#')++,-/0125522222222//..--,,++++++++***++,,.344444442345543233322111222222226789987678:;;;:9;< =!>">$=#:"9!664411001112456689 ;< ?!@" @" A$ C& C&D'F*H,!L0$O3%P4&Q6%Q6#Q6!Q6!Q7 Q7 Q7 P8S;!Q,Q@.RC0SD-XL2YN2\N1^P3_Q4aS6cT5dU6gW6iY8k[:n^=s`@ta@ubAvb={d8r=HQRPPNVZafiknqffghjnqstuw¿xyzzxmm¿rvÿvtrpidbcc`cgomfXSVXUWVXXZ[^[`chnqv|~}ہ݇ߍݍَ΋LJxrkb]]bhlnu}~ytsv{~~{}xyxwwuurrzmqtimmckg^haYjaZnc]na[hYTaRMQC@OD@OD>LC#*@"*?"'@!'B#)F%,I).M*0L(,N',O(-P'-Q(,R(,S)-U(-S&+S&+S&+T',T',U&,U'*U'*W&)W&)X&)X&'X&'X&'X&'X&)X%*X%,V%+V%+U$*U$*R#)R#)P#(P#(O"'N!&K!%J $I#H%C%B&@&>%; %9 $7!$6"$5!#5!#6 #8#7!550"       &'(()***))(('&&$!!#%)*,,--/0125622222222//..--,,++++++++***++,,.34444444234554323332211122222222789::987789;;;;;>"?#@$@$?%>$;#:"775522111112456689 ;< ?!@" @" A$ C& C&D(F*I-"L0$O3%Q5'R7&R7$R7"R7"R8!R8!R8Q9S;!Q.Q@.QB/RC.XM1YN0ZO1\Q3_Q4aS6bU5cV6gX9hY:l[=n^=qa@rbAtaAua>v`7kE@;B?:A, *, *, *, *, *, *, *, *+)+)+)*(*()')')', *, *, *, *, *, *, *, *-!+-!+.",.",/#-/#-/#-0$./#//#/0"/0#-0#-2"-2"-2",2",3"*3"*5!*5!*5"(5"(6!(:!'; '"@$A%B&B&@&?%<$;#8 8 6 6 33221112456689 ;< ?!@" @" A$ D'!D'E)G+ I-!M1%P4&R7&R7$R7$R7"R7"R8!R8!R8Q9S;Q<Q.Q@0QB/RC.XM1YN0ZO1\Q3_Q4aS6bU5cV6hY:j[o^@qa@rbAtaAta@t`;yf;rBLTZ]]]`ilpsvyqqqqrrrstux{|{zwrpqopnmlc_]acabhiicWSTVRLKLMOSWYacjmpu{ޅމۉևЃͅɆÃ|tlebbddceglqx}|wsqol}j~lszz|w{wyxyxwvspxkmpemmcjf]c\TaVPbUOaRM_MIZKFWNISLFOH@KG>LH=RNC[WKa_PecTjkYrt_xzey{ex|ey}dy}d|~i}|h{zfxwcstbpq_lo\kn[mp_lo^im^im^ho_jqamseougiqdepbdoaepbgqffpecmb`j__i`_i`_ia_ia`jbakcajeajgfnpgqsirwlw{p{twvyxxxwtrql|l|n{mzmylxnxmwpwov~pt}mrxilqcfk_`e\]bRUZQTYOPUKLQHELC@GB=D@;B-!+-!+-!+-!+-!+-!+-!+-!+, *, *+)*(*()'(&(&-!+-!+-!+-!+-!+-!+-!+-!+, *, *-!+-!+.",/#-/#-/#-/#-.$-/#-/#-/#-0#,0#,0#,2%.4%,4%,5$*5$*5$*4#)6#'7 &:!'<#'?$)@%*C&+D%*E%*G'*I&*K'+K'+N'*N'*O(+P'+O%)O%)P&*P&*Q')R(*T'*U(+U')U')W''W''W''W''W'%W''X%*X%,V%+V%+U$*U$*R#)R#)P#(O"'N!&M %J $I#H"G$B%@&? &= %; %7!$7!$6"$3 "4 "5"7"7!8 72"      &()*+,-.))****+*'&&'**++..01236633333333//..--,,,,,,,,,,,,,--../3444444423455432333221112222222289::::98::;< =!>"@$@$B&C'C'C'A'@&<$;#9!9!7!7!4 4 331112456689 ;< ?!@" @" A$ D'!D'E)G+ J."M1%P4&R7&S8%S8%S8#S8#S9"S9 S9 R: R:P;P; P:"O;#P;(P;*P:,M:,M:,M;-O=/P?/RA1RC0RC.XM1YN0ZO1\Q3]R4_T6bU5cV6j[H-!+-!+-!+-!+-!+-!+-!+-!+, *, *+)*(*()'(&(&-!+,"+-!+-!+-!+-!+-!+-!++)+), *-!+.",.",/#-/#-0$.0$.0$.0$.0%-1$-1$-1$-7(/7(/7(/7&,7&.7&,6%+8%+9"*:#+<%+?&,?&,?$)@#(?"'F',F',G',J'+J'+K(,L(,M)-L%*M&)N%)N'*P'+Q)*Q)*S)+R(*T()T()T('U''T('U''U''U'*W&,T%+T%+U$(U$(R$'R$'P"%O"%N!$K!#J $H#G"F$B%@&? &= %; %:$9 $7!$4!5"5"7"7!8 62"     &()*+-..))**+,,-)))***+,./01236733333333//..--,,,,,,,,,,,--..///3343434322445332333221112222222279:;;:98;;<= ?"@#B%C&D'C'D(D(C'@&?$<$9!9!9!7!7!4 631112456689 ;< ?!@" @" A#!D'!D) E)F+ J."L2#P4&Q7&S8%R9#S8#R:"S9 R:S9R:O:O:P; P:"O;#O:%P;(P;*N;,N;,N=-P?/Q@0RA/RC0SD/ZL1YN0\N1\Q3_Q4aS6bU5cV6k\=l]>o^@q`BsbDsbDsbDscBwgEvg@xi>uDNX]]W]ekoruwrsuvwxxxyy|ȁǀ~zqollnprtiecfgdchefaXUVVSSRPPRW]acgjnovz߄ވ݋؉Ѓ˄ˈȆ|upojjigfddc~cf~ey~`sz[pwXryZs|]t}`q|^q|^vc~ksy|z{wzwzz{yyv~soukkmbii_fbY^WOULEQD>PC=TE@VICQJDNJAPLCURI\ZN`^R_]P[\LbcQfiVloZor]qu^rw`tz`w|e~l|jy|ivyfrubnq^kn]jm\hj\gi[dhYdhYei[gk]jn`lodek_ck`ck`dlafmeeldah`^e^`g`ahabhdajedjfbkhajgajibjlcmohpslvxqzvyzyyxwtqon~lymykwjvjtisiq|hp{jq{kr|nr{mrxknufipbel^ah]`g[^eYYaTUZQNULIPJELHCJ*(*(+)+), *, *-!+-!+*(*(+)+), *, *-!+-!+,"+*#+,"+,"+,"+,"+,"+,"+-!+-!+/",/",0#-0#-1$.1$.1$-1$-1$-1$-1$-3#-3#-3#-4#-4#-5$.7#,8$/8$-9%.:%.:%.:%.:%.;$.;$,;$,=#,=$*=")?$+A&+E(-E(-E(,D%*C$)C#(D$'F#'E%(G$(H&'H&'I%%K''M&'M&'M'&N&&M'&N&&N&&O%'P&*T'*U(+U')T&(T$$Q##P""O#"P$%N$%L$%J#$H!$E!%B%@ %?$=#<";!9 7 9"9"9"8!7 420     !#'(*,--,*)++++++++------..//0011223333333310.,****-,,,,,,,-------.224242423131313333111133444444442368:;<= D'D'F&F&F&F&F&F&D$B$B$B$B$B&B&A'S>P; P; O9!O9!N:"M9!M8#M8#O=)O=)O>,P?-Q@.RA/RC0RC.ZL1ZL/\M0\N1_P3bS6eV9fW:j[>k\?l]@m^Ao`CqbErcFrcDuhExlDykD|oBHZaaZ]emuy{yxwtutwxy~|}{{xwwvspqrsrnnjffjlhfgih`XVZ_TRQU[\[[bcejnuz|ދ܎ې׎ЈˆȉȋNJÉ}yyqqnje^{xWutUqrSnqRmpQmpQmpQorSpuWqvXlpUntXqw]r{`u~czhpu~}y~wtwpopjmmepmfid^^WQSJELCQHAVOGUQHXTK\XM`\Qb`TdbUbcSfgUjkYnp[or]os\pt]sw^tybv~gt}hs|gr{foxenuclsclpako`jn_ik^hj]gi^fh]gg]fh]be^af_bg`bg``g`_f_^e^]c_Yb][d_^gd`kgclidnmeoneop`jlalnenshswmx~p}sttspnlll~n~r{syrxqwpvouovpwquptos~mqzjnwfjscgpben_bi\_d[\aYZ^XVYTRUOKLJFG*(*(*(+)+), *, *-!+*(*(+)+), *, *-!+,"+,"+*#+*#+*#+,"+,"+,"+,"+-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-6"-6"-7#.7#.9#/9#/:$0:$09%09%0:$0:$0:%.:%.;$,;$,=#,>$-@'-A(.C(-B',A&+@%*A$(C$)C%'C%'D&(D&(F&'F&'I'(I'&J&&J&&J'%J'%J'%J&&M&)O&*Q')R(*T()T&&T$"S#!R%"R%"Q%$O%&L$%I"#G #D $C &B%?$>#="<!: : :!;":!:!641-          !"&)+,--,+*++++++++........//0011223333333310.,****-,,,,,,,-------.222222221111111133111133444444443468:;= = G'G(G(G(H'H'H'H&E%E%C&B%B%B%A%A%=#R=P; P:"P:"P:"N:"N:"N:"N:"O='P>(P?+Q@,RA-SB.SD1SD/[K1[L/\M0]N1_P3bS6dU8fW:j[>j[>k\?m^Ao`CpaDqbEqdDtgDvmFymE{pC}IYbd[^dksxzyutrrtvwx|||zxuuwuspqsttpokhgjifdkmjd]\chic`acca_ddegkrx}ߏݐܒۓؐь̋ȎȎƌÉ|xvrjc}}[yvUvsTtsUstUstUstUrsTpsTpsVpsVlpUosXrx^u{aw}c|hnu~}{}xuwrrqlonimjcfc\^WQSLFOF?NE>QHATKDWPHYRJYUJ]YN`\Qb^RcaRdbScdRghVkmXmoZlpYmqZosZpu^o{en|enzdnzdmyeoxeovfnuelpako`km`ik^hh^gg]he\ff^be^af`bgabgaafb_ea]c_\b^\b`\eb_hgakjdnmeonfpqeqqbmocnpfqujuynyo|rssqolk~i~k}n}rzuytxswrvrvrvrvququptnr}kozhlwdhscgp_bi\_d[\aYZ^XXZUSTQMNMIH)'*(*(+)+), *, *, **(*(+)+), *, *-!+,"+,"+*#+*#+*#+,"+,"+,"+,"+-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-6"-6"-7#.7#.9#/9#/:$0:$09%09%0:$0:$0:%.:%.;$,;$,=#,>$-?&,@'-B',B',A&+A&+A$(A$(B#(C$)D&(D&(E%(F&'I'(I'(I'&I'&J&&J&&J'%J&&L%(M&)O'(Q')S'(S%%T$"T$"V&$T'$T&&R&'N$&J"#H#E#D&C &@ %?$>#=";!: 9 9 9 9 530,           "#%*+,--,++,,,,,,,,........//001122333333331/.,++++--------........111111111111111133111133444444444578:< >!?"H)H)H)H)I(I(I(I(G(G(D'C&B%B%@%@$>$=#<";!8 76564 3357 9 :!78;::<A##E)&E*#D, E-!G0"J3%K4$M6$N8#O9"O9!O:P;P;Q<Q<R=P; Q(Q?)P@)QA*RA-TC/SD/TE.[K2[K1[K1\L2_O5aQ7dT:fV%+?&,@%*A&+A&+A&+@#'A$(B#(C$)C%'D&(E%(E%(H&'H&'H&%H&%I%%I%%I&$I%%J&(L%*M&)N&'P&'R&'U%%U%#X(&X((W&)T&(Q$'M %I%F#D&C &@ %?$>#=";!;!9 9 9 8420+"       !"#$+,,--,,,,,,,,,,,//////////001122222222220/.,,,,---------........111111111111111133111133555555556689:< ?"@#J+J+J+J+K*K*K*K*J+I*F*E)C'B%@%@%?%>$=#<"8 76463225689 79 ;:;=B$$F)%G,#F/!G0"I2"J3#L5#M7"N8!O9"O9!O:P; P;Q<Q<Q<Q%R>&R>&Q?)R@*QA*RB+SB.UD0TE0UF/ZJ1ZJ0[K1\L2^N4aQ7dT:eU;hX>iY?jZ@k[Am]Cn^Dp`FobBreBulC{oI{oGuHQ_khffhntxzuutuvwwwxvussqrsqpnmprpnolkijhhejloppqw|rqnnpswxvtpkjnx㐾ݍ܎ڐړ۔ؔӒΎʐƎÎő‘wle~_|}]{|]abdc|bv{]ptYlpUquZsy]v|bvdwgzj~ns~|{y{vtvqrqlonihe^c`Y_XRYRLWNGXOH[RK]TM]VN^WO\XM^ZO`\Pb^RcaRdbSabRefTijXkmXilWimVkoXlq[lubjvbjvbjvbmvcnwfqxhryiqugptfprgmodkkagg]ddZabZbc^bd_de`ce`bdaac``ba]a``dcagedjjenmkpsksultvltvltwlvxnu{ox}pyq|r|q~sqo|l|jyjykzmzpwqwrxrxrxqwpvpvqwqwpvoulr~io{flxekw`dm]bh[^eY\aZ[_YY[VTWRPQ(&)')')'*(+)+)+)*(*(+)+), *, *-!+,"+,"+*#+*#+*#+,"+,"+,"+,"+-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-6"-6"-7#.7#.9#/9#/:$0:$09%09%0:$0:$0:%.:%.;$,;$,=#,=#,=$*>%+?$)@%*A&+A&+@#(@#(@#'A$(B#(C$)C%'D&(D$%D$%F$%F$%F$#F$#G##G##I%'I%)L%(M%&O%&R&'U%%V&&Z()Z()Z(+W&)U$(P!'M&H$G'D!'A!&@ %?$>#<"<"9 9 9 8420+"     !!"##$,--,,-----------//////////001122222222220/.-,-..--------........000000001111111133111133555555558889;="A%B&M.M/M.M.N.N.N.N.L.K-H-G+F*D(B'B'@&@&>$=#9!76453224589 89 < ;;= B$"G*$I.#I/"J0#L2#M3$O5$P7#P7!Q8"Q9!R: R: S;S;T=T=R="R="S>#S>#S?&T@'T@'UA(R@(SA)RB+TD-UE.VF/UF1VG0YI0ZJ0ZJ0[K1^N4`P6cS9eU;gW=gW=iY?jZ@l\Bm]Cn^DnaApc@ri@ymGznH~qGN\imiikotxzxxxxz{zzwutqpqsruqnlnmjhmlmkkijifhortsssnkjilouv|zvqprzᒼܐڐڒڕژזҒΒɏŏđƔĕyqkhgikmnmk{dtx_ou[u{ax~d|j{k{l{m~ps|zyvxsprmnmhlkfhe^eb[b[U]VP\SL\SL^UN_VO_XN_XN]YN^ZO`\Pc_SdbUfdUfgWijXmn\no]lo\loZnq\ot^oxelwfludktcktcksdmsentfrujrujqtknqhkldgh`cd\`a[bc^bb`dcaccaccaaa_```^`_bcebfgeilhmpmqtnsvpuxpuxpuyov|rw}qx~ryr{rzr|t~s|qzmylwkxkxlwnuowpxrzrzqypxowowowownvltiq~go|emx`gq]dlZ^gY\c[\aYZ^VUZSSU(&(&(&)')'*(*(+)*(*(+)+), *, *-!+,"+,"+*#+*#+*#+,"+,"+,"+,"+-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-6"-6"-7#.7#.9#/9#/:$0:$09%09%0:$0:$0:%.:%.;$,;$,=#,=#,<#)<#)>#(?$)@%*A&+?"'@#(@#'@#'B#(C$)C%'C%'C#&C#$E#$E#$E#"E#"F""E#$H%)G$(H$(K$'N$&Q%&T&(W''Z()Z()Z(+Y&+W$+S"(Q(L&H (D!'A!&@ %?$>#<"<"9 9 9 9 530.# !!"#$$&-.-,,-..--------00000000//001122111111110/.--.//--------........00000000111111113311113366666666:999; >#B&D(O1O1O1O1P0P0P0P0M0M0J/J/I.H,F,F+B)A'?%=#9!764521145788:!< < <>!C& G*"K1$K1"L2#M3"N4#O6"P7#Q8"R:"S;#S;!S;!T< U=!U>U=!S>!S>#T?$U@%UA(VB)WC*WC*SA)TB*SC,UE.VF/WG0VG2WH1YI0YI/ZJ0[K1]M3`P6bR8dT:fViY?k[Al\Bm]Cm_Bob?of?uhExkH{mHwJVcojjjnrwzxxy{|}|{wutrqqtuwrnkmkiejllmllonginsvuspsqmjgjnpzy{xvw}喽ߒݒܓږڗ٘֘ѕ̒ǐđÐĔƖÕxsrrsvuwvqjyeu{a{g|lprq~prv|~}|w|vsupnpkmlglkfkhahe^f_Yb[U_VO^UN^UN_VO`YO_XN]YN^ZO`\Pd`TgeXigZjk[mn^qrbrsapsbor_qtaqvbqzioxgludjsbhpaiqbkqclrfrujrujrulpsjmnfhicde_ab]ba_cb`dcadcacb`aa_```___bbdcdfghljnqmqtptwrvyqvzqv|qv|rw}rw}qxryszrztzrzpwmvlulultmvlsnvpxrzs{rzpxownvnvnvmultiq~go|fn{bht^eo[_jX\eX[bXY^VU[SRW'%(&(&)')'*(*(*(*(*(+)+), *, *-!+,"+,"+*#+*#+*#+,"+,"+,"+,"+-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-6"-6"-7#.7#.9#/9#/:$0:$09%09%0:$0:$0:%.:%.;$,;$,>$-=#,<#);"(="'>#(@%*A&+="'="'>#(>#(A$(A$(B#(C%'B$&B$&C#$C#$E#$E#$E#"E#$E%(E%(F#'G#%L$%O%&T&(X'*Y'*['+[&,Z%+Y$,V#,T ,P!+H (E"(B"'A!&@ %?$=#<":!;":!:!641/#   !"!"#$%&'(..-,,-./........00000000//001122111111110/.--.00........////////////////111111113311113366666666; ::9; >#C'F+P2P2P2P2Q1Q1Q1Q2N1N1L2L2L1K0J0J0C*B)@&>$9!764421135789 :!=!!C'H, L2#L2!M3"N5!O6"P7#P7#Q8"T<$T<$T<"U=#U=!V>"V>"W?#S>!T?"U@%VA&VB'WC(XD+YE,TB*TB*TD+UE,VF/WG0WH1XI2YI0YI0YI0ZJ1]M4_O6bR9dT;eUhX?jZAl\Cm]Dl^Am`=kb;pcAviGykHqJQ\ojghjpsuwxy{}|zyzvusrswwvqljkkhehklmmnsrnlpsuwxxxvpjfgkktu|}zy}㗹ݓޗݘڙښ؛՘ϕʑŐŔŔŖÕ|{zz}|xrmzjoswywvwx}w{|}x}wsxrqsnnpkoninmholelibjc]e^XbYR_VO]TM]TM`YO_XN]YN^ZOa]QeaUigZlj]lm_opbstfstdqsepsbqtcrveqxhouglrdioahnbiockqelrhqtkrulrunqtmnqjikfdfabc^ba_d`_eabeabeabb`a`^a^^`a`ecdhghlklpopursxtuzsv{pszqt{qu~rvswtxtxszuyrxpvntmslslsmtkrluoxr{r{qzoxnwlulululujshqfo~eo{ckv`gq[_jX\eWZaWX]UTZRQW'%'%(&(&)')'*(*(*(*(+)+), *, *-!+,"+,"+*#+*#+*#+,"+,"+,"+,"+-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-6"-6"-7#.7#.9#/9#/:$0:$09%09%0:$0:$0:%.:%.;$,;$,>$-=#,;"(;"(#(@%*B',="'="'="'>#(@#(A$(B#(C$)A"'A#%B"%B"#D"#D"#D"#B"#D%*C$)D$'F#'J#&N&'S'(V(*Y'*Z&*[&,[&.Z%/W$-U!-Q",H (E"(B"'A!&@ %?$=#=#;";";":!7 420#  !"!!"$&'(+0/-,,-/0........00000000//00112211111111//.-./01........////////////////111111113311113366666666$:#764411134789 :!="$V>"W?#W?#X@$T?"T?"U@%VA&WC(XD)YE,ZF-UC+UC+UE,VF-WG0XH1XI2XI2XH/XH/YI0ZJ1\L3_O6bR9cS:eU#(>#(>#(>#(=$*=$*>#*>#(>#(>#(@#(@#'A"'A#%A#%A#%B"%B"#B"#B"#=#=#@ #C $H!$J"#O#$P"$W&)W%(W$)V#*S )P'M&H%G'D!'B"'B"'B"'B"'A"'A"'9 :!<#<#: #8!64'%$###$%$%%&())*++,,--..--------////////--./00111111111132210//.0001122233333333--./00111111111144444444777766669;!=!>#?$C)J.O4S5R5P3O2P1R3T5U6U8Q5L2 L2O5Q6O6L2B*A(?%=#8!6422000469: 9 :!="?$B&E)G,H-N3 N3O4P6Q6!R8!R8!R8!X>'X>%X>%Y?&Y?$Z@%Z@%ZB&WB#WB#XC&YD'YF(ZG)[G,[G,[J0ZI/XH.WG-WG.XH/XJ0YK1XH1XH1XH1YI2[K4]M6_O8aQ:dT=dT=eU>fV?gW@hXAiYBhZ?i\:lb>sfFtfIufIzkLxRTajpjgktustvwxyyywvxxxwwsqqvvronmkmprutsoiinu{}{unihkrroow袻⟽䣻⣽᤾ߦݦآϜɘǗŘÖ~yw|}}{~uzvjoiglflniqsnsrmrqlpmfspivoiohbe\U^UN^UNaXQ`YO`ZN`\Pb^Rd`UeaVfdXgeYffZjj^nnbooclnakm`moboqforgpshorimpgilchkbjmfmpiqvoqvppuonsokplhmidiedfcgefhdehdegcdfaefaecafcafedifejghmijokksmmuoowppxnqzkoxjnwkoxos|qu~quos~qsqsqsproq~mq}mo~kn}hp}iq~iq~jrltmunvnvksksjrjriq~hp}hp}go|`fr_eq_cn[_hWZcTT\QPVNMS)')')')')')')')')')')'*(*(+)+)* )+!*)"*)"**#+,"+-#,-#,-#,-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-8$/8$/8$/8$/9#/9#/9#/9#/8$/8$/9#/9#/9$-9$-:#+:#+=#,=#,=$*=$*>#(>#(>#(>#(=$*=$*>#*>#*>#(>#(@#(@#(A"'A"'A#%A#%B"%B"%B"#A#%= $>!&? %A!$F"$I"%K!#N"#S%'S%(U$*T#)P!)N)L(G&E 'D!'B"'B"'B"'B"'A"'A"':!:!;"<#9"8!64'%$###$$$%%&())*++,,--..--------////////-../00111111111122210////000112233333333-../0011111111114444444466666665:;!=!=">#C)J.P5R4R5P3O2Q2R3S4T5T7P4K1 K1M3O4M4K1B*A(@'=#9"7 533001469: 9 :!#B&F+J/L1R7"R8!R8!S9"T:#U;$U;$U;$X>%X>%Y?&Y?&Z@%Z@%[A&[A&ZC$XC$YD'ZE(ZG)[H*\H-\H-[J0[J0XH.XH.XH/XH/YK1YK1YI2YI2YI2YI2[K4]M6_O8`P9cSfV?gW@hXAgY?i\#(>#(>#(>#(=$*=#,=$*=$*=$*=$*>#(>#(@#'@#'A"'A"'A#%A#%A#%A#%@#'@#(A"'B"%D"#E!#H !I!M#%O"%P#(P#(M")L!*I)G(D&C &A!&A!&A!&A!&@!&@!&:!;";";"9"8!64(&$#"##$$%%&())*++,,--..--------00000000////001111111111221100////00112233333333////0011111111114444444455555555; <"=!=">#B(K/Q6R4Q3P3P3Q2Q2R2S4Q4O2J0 I/K0K0J1I/B*A(@'>$:#8!654212569: :!:!$C(I.O5S9"W;%W;#W;#X<$X<$Y=%Y=%Y=%Z>&Z>&[?'[?'\@(\@(]A)\B'\E&ZE&[F'\G(\I+]J,^K-^K-\K/\K/ZJ0YI/YI/ZJ0ZL2ZL2[K4ZJ3ZJ3ZJ3[K4]M6^N7_O8aQ:bR;cSfV?gW@fX>hZ?j_ApbGqcHrbIueK|nQvSZerqllpsqrtvwvvuwwxxyxzunpsvspoonpuwxvsoeelt|~~|vrommryxwx물鯾篻㮻ᮻ߯٪Ӧ͡ȟƝÜ}y}}}|yxv|rwslqmglfglflniprmqpkonioleqngslfmf`e\U_VO_VOaXOc\Rd^Rc_Sd`TfbWhdYhfZhfZccYee[hh^ii_hiagh`hiajkelmgmnhmnhjkefibegbfhcikhkplmrnousqwuouskqoflldhiiikjhkjhkkilkinjinkjokjoihnijojjrilsknulovmpymqzhowenucjrcjrdksdkscgpaen]aj]aj^aj_bkaambblbbnacoaep_fpbfr`gqbfrahrcgsahrgkwelvfjvcjtdhtahrbfraep^bm^`l\^j[[eWV^TQXPMTMKP)')')')')')')')')')')'*(*(+)+)* )+!*)"*)"**#+,"+-#,-#,-#,-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-8$/8$/8$/8$/9#/9#/9#/9#/8$/8$/9#/9#/9$-9$-:#+:#+=#,=#,=$*=$*>#(>#(>#(>#(=#,=#,=$*=$*=$*=$*>#(>#(@#(@#'A"'A"'A#%A#%A#%@#'B%*?$)A$)A"'B"%C!"F"EI!"I!"J!%K"(J"*H#*G"*F!)C &C &A!&A!&A!&A!&@!&@!&;";";";"8!7 7 5*'&$###$$%%&())*++,,--..........00000000000000111111111111110000//0011224444444400000011111111115555555544455566#C)L0R7R4Q3Q3P2Q2Q2Q1Q2O2M0I.H-H-H-G-G-C+B)A(?&;$9"8!6 6 33357: ;! ;";"#Z>&Z>&Z>&Z>&Z>&Z>&[?'[?'\@(\@(]A)]A)^B*]C(]F'\G(]H)^I*^K-_L.`M/`M/^M1]L0[K1ZJ0ZJ0[K1[M3\N4]M6\L5[K4[K4[K4\L5]M6^N7`P9aQ:aQ:bR;dT=eU>eU>eV?hZ@i]Cn`En`Ep`GscJwiN|oO|Q`osqlnrpsuuvuvuuttuuuwvqqvxtsrstuy|{xuqdelt|~~|srqosw}~~괽屻㱺౷ۯժЧʡȠĝ|x{z|zyut}|r{zkonhmifkeglfmojoqlpojnmholepmfrkemf`f]VaXQ`WPaXOc]Qc]Qb^Rc_SeaVfbWfdXfdX``VbbXdd\ff^ef^ef`ef`ef`ijdjkejkeghbde`ac^cebfheglhjokntrrxvrxxnttgpoekkhikiikkilkkmkjolkpmlqlmqklqilqjmtintknukpvlpyjqyenubms`ip`ip`ip_fn[bjZ^gTXaTXaUXaUXaXXbYYc[[e[[e]`i]aj_am_clacobfodfrcgpfhtdhqdfrbfoaco_cl_am^aj[]i\\fZZdXW_URYSNTOJPNHL)')')')')')')')')')')'*(*(+)+)* )+!*)"*)"**#+,"+-#,-#,-#,-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-8$/8$/8$/8$/9#/9#/9#/9#/8$/8$/9#/9#/9$-9$-:#+:#+=#,=#,=$*=$*>#(>#(>#(>#(=#,;$,;$,;$,=$*=$*>#*>#(>#(>#(@#'@#'A"'A"'A#%@#'B%*@%*A$)A"'B"%C!"B !C!F"F"F"&G#'F#)D#*C"+C")B%B%@ %@ %@ %@ %? %? %<#;";":!7 7 7 6 -+)'&%%&%&&')**+++,,--..........1 1 111111111111001111111100001111022234445555555411111100111111115555555544456777">"?$D)L0R7Q3Q3Q3P2Q1P0O/N.M/M/I.G,E*D(D*E+C+B)A(@'<%;$:#8#8"5!4 4 68 : !;! <#<#>#A'H-Q7 Y?$^E'[@%[@#Z?$Z?$Z?$Z?$Z?$Z?$\A&\A&]A)]A)^B*^B*_C+^D)_H)]I(^I*_J+_L,`M-aN0aN0`O3_N2]N1\M0\L2]M3]O4^P6_O8^M9]L8\K7[J6\K7]L8]L8`O;`O;aPdS?eT@dU@fW@g[Ck]Cm_Eo_FqaHtfLxjM}sOYisrnmqrruvwutsrrrrstwttsz{xvvuxy}}}zvsjlpu{~|{srssx{涺ᴹ޲۰֬Ѫ˥ɣƠŸ}xzy{xwsqy{oxwimlhmiglfhmgmojoqlpojoniqngqngrkemf`h_Xd[TbYRbYPb\Pb\Na]Qb^Rc_Td`Uc`WdaX^^V__W`_Zba\cd^cd_cd_bc^gfbhgcgfbde```^__]`bacedcgfgkjlrrpvvpxzmuwiqshmphikhikjinjkojkoklplmrjmrjmtintjouhoujnwhowhowhowcmv_lt_ir_ir_jp^gnZcjW^fPW_OV^PU[OTZPSZRU\UU]VV^\\d[^e^^h_biccmcfmggqfipeeocfmccm`cj``j\_f]]g\\dXXbXW_WT]WRYSNTPJNNEJLCF)')')')')')')')')')')'*(*(+)+)* )+!*)"*)"**#+,"+-#,-#,-#,-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-8$/8$/8$/8$/9#/9#/9#/9#/8$/8$/9#/9#/9$-9$-:#+:#+=#,=#,=$*=$*>#(>#(>#(=$*=#,;$,;$,;$,=$*=$*>#*>#*>#(>#(@#'@#'A"'A"'A#%@#'B%*@%,A$)@#'A"'A!$B !B !B !C!"D!%C#&B#)A$)>#*?"'@&B%@ %@ %@ %@ %? %? %= $<#:!9 7 7 7 7!0.,)('''%&&')**+++,,--..////////1 1 1111112222110011111111//00112233445566666666654222110011111111666666664556789 9 ; ="@$@$A&E*L0Q5Q3Q3Q3Q3Q1O/N.L,M/M/J.G+D(B&B(D*C*C*B)A(=&<%<%:%:$7$6"5!78 : !;! =#">% A&E+L1T:![B$`G)]B%]B%]B%\A$\A&[@%[@%[@%]B']B'^B*^B*_C+_C+`D,_E*_H)]I(^I*_J+_L,`M-aN0aN0aP4`O3^O2^O2^N4^N4^P5_Q7aQ:`O;^M9\K7[J6[J6\K7\K7`O;`O;aPdS?eT@dU@eVCeYCiZCk]Co_FrbIsdMugMzpM~R_nqnnrtuwvwvuttrrqrtxwyx~{yyw|||}~{yxtstvy{{xttvy}渷ഷ޲ڱ֮ҫ̦ʤƣàzyxzwuq}}owymvujnmjokinhjoinpkoqlrqlrqlrohrohrkengakb[g^We\Ud[Rc]Qc]Ob^Rb^Rc_Td`Uc`Wc`W]]U]]U]\W`_Zbc^cd_ab]_`[dc_ed`dc_ba]]][\\Z]_^`ba`dccgfhnnmssnvxmuwksuiqshlmjkmklpklpklpjnqjmrinrjouhouhougntgnvfmufmuenu`mu_lt_lt`mucntalr^gnZcjU\dSZbRW]PU[ORYORYRRZSS[XX`YZ_[Zb]^c`_gabgdckdejbai`af`_g]^c\[cYZ_XW_WV^SRZSPWTOVSLSOIMMDGK@DI>B)')')')')')')')')')')'*(*(+)+)* )+!*)"*)"**#+,"+-#,-#,-#,-!+-!+/",/",0#-0#-3#.3#.1$-1$-3#-3#-3#-3#-4#-4#-8$/8$/8$/8$/9#/9#/9#/9#/8$/8$/9#/9#/9$-9$-:#+:#+=#,=#,=$*=$*>#(>#(>#(=$*=#,;$.;$,;$,=#,=#,=$*=$*>#(>#(@#(@#(@#'@#'A"'@#'A$)?$+A$)@#'A"'@"$A!"A!"@ !@""A#%A$&>#(<#'9"(:!%?%A$?$?$?$?$>$>$= $<#:!9 67 8!7!3 0.,*)))%&&')**+++,,--..////////2!2!2222224332110011111111///01222556677886666666563321100111111116666666655689 :!;";"9(>(='<';%8%7#6"8 9!;!";! >$#?&!D)I/ P5 VdS?eT@fUAeVCcSCcVCgXAk]Cp`FscJteNugMynP~wMUgrpostvwxxvutwwvuvx}{||߁~{yy~}}~}}~}wvwyxwxx{}ᄏ渶߳۲ٲְӮͩʧǦâ}yxzwup||nvxlutnrqnsolqklqknpkoqlsrmtsntqjspislfpicmd]jaZg^We\SgaUgaSeaUfbVfbVfbWfcZfcZ]]U\\T\[V_^Yab]cd_``^^^\a`^d`_ba__^\[[YZZX[]\]_^^bcaefejmhprksultvkuvltvmqtmqtmqtlpslpskpskptjosjouhougnvenuenudmtclsbms`mu_nu`ovcryfsyfsycntajq^ek[bhX]cSX^QTYPSXPSXSTYTSYTSXVSZVUZXU\XW\ZW^YX]]Za[Z_[X_WV[VSZSRWROVQNUOLSQLSPKRNGNMDIK@DG<@F:<)))')))')))')))')))'))*(**+)+++)+!*)"*+!*,"+,"+-#,-#,.",-!+.!+/",/",2"-2"-3#.3#.3#-3#-3#-3#-3#-3#-4#-4#-8$/8$/8$/8$/8$/8$/9#/8$/8$/8$/8$/9#/9$-9$-9$+:#+;$,=#,=$*=$*=$(>#(>#(=$*;$,:%,;$,;$*;$,=$*=$*=$(=$(>$'>#(@#'@#'@#%@#'@#'@#(@#(@#(@#'A"'A#%B"%B"#@"$@"$@#%@#'>$'<#':!%9 $>$?$>$>$>$>$>$= $= $<#:!8668!8"5"2 0-+***%&&&))*+++,,--..////////2222222244321100113131310/1032456677889 9 6666666664 52312031313133668686868698 #?$8= C%F(G*H+K/O1P2Q3Q3Q3Q1N.L,J*M.N/L0H,C'A%A&D)C*C*B)B)?)>(>(=&<'9&:$9"8!:!;! ;! >%!B' F+ L1 R8!X?!\C$`F%gJ*gJ*fI+eH*dG)cF(cE)cE)`B&aC'aC)`E*bD*aF+aF+`F+^G(]I(]I(^J)_L,`M-`M-aN.cR4bQ3`Q2_P1_P3`Q4`R5aS8dT;bR;`P9]M6\L5[K4[K4[J6aPdS?eT@fUAgVBbS@dU@gY?l\Bp`FseKteNsgOzoS{sNUfsqpsrtuvuursywvuwz}|zz~|||~~}灾{vwxzy|}亷ݶٳ׳ԱӰͫ˧Ȧĥ|xxwvrp{}mwyksupvtouqnsomrnlqmprmstouvptsnrrjqngokblh_kd\haYd`UhdXgeXhfYhfYhfZhfZff\gg]\]UZ[SZ[U]^Xab]bd_``^]][`_]a`^a`^]][ZZXWYVY[ZZ^]\`a^dd`hjemoiqsltvlvwmwxpuxpuxotwotwltvksuksvjruhougpufovenudmtclsalr^ks`nw^ow`qyct|iwixfs|dnwclu`ip[bjU\bRW]PUYPUYQTYQPVQPUPOTPOTONSNMRNMROMRXV[WUZVTYSQVQOTNLOMKPLJONIOOHONGNNEJKBEH=AE;(+>(+>(*;%'=%%=$'>$%>$%>$#>$%@#%@#'A"'A"'A"'A"'A"'A"'A#%>$? %? %@!&>!%= $;":!<#<#= $= $= $= $>!%<"%9"9"9"8!8!7 7 6 4!4#3"2!/,('''(&)'**+,,,,,,,//0011221111111122222222334343434221335688776655777777777664533254657688::;:;:;:<; ;:< &>">">"A%!D'H, O2 T8 Y> ]C"bF!hL'iK'iK'iK'hK)gJ(fI)eH(cI(bH'_D&]D%^C&^E'aH*aJ+_K*`L+aM,bN-bO/cP0dQ1dQ1^N-^N-^O._P/`Q2aR3aT4aT4bS6bR8aQ8`P7_O6^N5]M4]M6`P9_O8_O8_O8`O;bQ=dS?eU>eS;gViY?jZ@l^DpdLsiPwpTzvS~RTcrvqrqqprsttvx||yz}}zxy{||}~|xz}~xrsyǽ߾ٹ׸նҲάǤǤť|{ywsomn}q~tpxzoxuousntrntrqvrrwqsxqtwpsvmqrjnpejlagg[ddXccW_aT`dVbfXdhZeh]eh]dg\cf][^WZ]VZ]VY\UZ\WY^X]_Z^`]Z\YY[ZXZYWYXWYXUYXVZ[V\\X]`Yac^fickngqsjtvkuwlvxoyznxymwymwylvxlvxmv{mv{kt{hsydoualraktblueoxer{cucweyg{gyfxdtesfr~anw]gqZclX_eU]`PX[MUXQTYRSXQRWPQVNOTLMRKLPLKPQQSPPRQORPNQOMPNLMNLOOJNKEIMDIKBGJADH?BF=@E')')(*(*)+)+*,*,)+)+)+*,*,+-+-++-!--!+-!+-!+-!+-!+.!+.!+2"-2"-3!-4".4".5#/5#/5#/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/7&07&07&07&09%.9%.9&,9&,:%,:%,;$*;$*;%(;%(=$(;%(<',;(,;(*;(*<(*<(*=')=');&%;&%=%%=%%>$#>$#>$#>$#A"'A"'A"'A"'A"'A"'A"'A"'>$? %@!&@!&? %>$=#;"= $;!$;!$;!$;!$;!$;!$;!$9"9"9"8!8!7 7 7 6!4#4#2!0-)''(&''((*+,,,,,,,/00112221111111122222222444444444322346788877665777777777765543355667788;;;;;;;;< < ;;< >"@$B$C"D!E#G%I(J)K+L,S4Q2O0M.L-M.O0P1K-K-H,G+F*E)C)C)A)B*C*E,E/F0G1H2I3H2E/C,C(B'A&A%!D'!G+ M0"S7"X="]B$bE#dH#iK%jL&jL&kM'jN)jN)iL*hK)dJ'bH%_G%]E#]D%_F'`I)bK+aM,aM,bN-cO.cP0dQ1dQ1eR2^N-^N-^O._P/`Q0aR1aT2bU3cT7bS6aQ7`P6_O5^N4]M4]M4aQ:`P9`P9`P9`O;bQ=cR>dT=gVk\?k[Ak_EpdLsiPslRvqSzxQS`ormnpqrttutwz|||y{|wuz|{yv{~~xtuzǽھӶѶгͯʪǦǤť}zyxvtrpoqroy{oxwnwvlutnttouspvrqxqrwqqvopsjmpejmbgk]fh[cgYcgYbhZci]ci]ci]bh\`f\_e[Z_XZ_XY^WX]VX]WX]WY^XZ_[Z\YY[ZVZYUYXUYXVZYVZ[V\\X]`Yac\dg`hkcmoeoqfprfprkwwkwwkvxkvxlwylwymx|mx|ju{hsydoualraktblueoxdr{cwcydzf|gzfweucserco}`jv]gp[dkXafR\^OWZRW]RU\QTYORWNQVLOTMNRLMQPPROOQPNQOMPOMNNLMMKLOKLNEHMDGMBFJADI>BF=@F;?D;>')')(*(*)+)+*,*,)+)+)+*,*,+-+-++-!--!+-!+-!+-!+-!+.!+.!+2"-2"-3!-4".4".5#/5#/5#/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/7&07&07&07&09%.9%.9&,9&,:%,:%,;$*;$*;%(;%(=$(;%(;&+:'+;');');');')<&(<&(>&&>&&>&&>&&?%$?%$?%$?%$B#(B#(B#(B#(B#(B#(B#(B#(? %? %@!&@!&@!&>$=#;"= $;!$;!$;!$;!$;!$;!$;!$9"9"9"8!8!7 7 7 7"6!4!3 1.*)((()'((+,-------00011223111111112222222244444444443334679 8877666777777776665544455667788<<<<<<<<< < < < =!?#A%C%D#F$G%I'J)L,M-N.R3Q2Q2P1P1O0O0O0K-K-H,G+F*E)C)C)@(A)C+F.G1J4L6M7 L6K5I3F/G- F+ F+"F+"G+ J."Q4$W;%]B'aF(eH&fJ%iK%jM%lN(nP*nR+nR+nR-mQ,eK(cI&`H$_G#_G%`H&aJ(cL*dP/dP/dP/eQ0dQ0dQ0eR1eR1^N-_O._P/`Q0aR1bS2bU3bU3cT7cT7bR8aQ7`P6_O5^N5]M4bR;bR;aQ:`P9aPdT=iX>kZ>m\@m^Al\Bk_EocKrgQogPpkNspM{|PZhmnpruwyyyx}р~}~~ww~~ywty|烿zvw{ŷջβ̳̰ɭŧťťä~zxzzyyvtttpz|oyznxylvumvumvsmvqnxpqxqpwooukmsgjpdhnbilahk`hk`hk`hk`gj_eh_cf]ad[_bY_b[^aZ\^YZ\WY[VY[VZ\YZ\YZ\YY[XXZWWYVWYXVZYW[\W]]Y__Z``[ce]eg_gjailailakmhsuguvhvwiwxky|lz}mzn{iv|fsybow`mu_luanwdqzes~exdzh{i|j{gxfudterco}blxaku`ir[diV^aQY\SX^SV]RUZQTYQRWPQVONSONSNNPNNPOMPNLOPLMOKLOKLPJLQFJPEIOCGLAEK?CH=AG;?E:>')')(*(*)+)+*,*,)+)+)+*,*,+-+-++-!--!+-!+-!+-!+-!+.!+.!+2"-2"-3!-4".4".5#/5#/5#/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/7&07&07&07&09%.9%.9&,9&,:%,:%,;$*;$*;%(;%(=$(;%(:%*9&*:&(:&(:&(:&(;%';%'>&&>&&>&&>&&?%$?%$?%$A%$B#(B#(B#(B#(B#(B#(B#(B#(? %@!&A"'A"'@!&? %>$<#>!%<"%<"%;!$;!$: #: #: #9"9"9"8!8!7 7 7 7"7"5"4!2/,+))))())+,-------01112333222222222222222255555555543345679 9 9 87776777777775555555555667788<<<<<<<< =!< < =!>"A%C'E(F&H&I'K*L+N.O/P1Q2R3S4T5S4R3P1O0L.L.I-H,G+F*D*D*C+D,F.H0I3K5M7 N8!M7 L6!J4H1I/ I/ J0!J0!J. N3 T8#[?'`E(cI(gJ(gK&jL&lO'oR*rT.sW0sW0rV/rV1gM(fL)bJ&aI%aI%bJ(dM+eN,gS0gS0gS2gS2fS2fS2eR1eR1_O._O._P/`Q0aR1bS2bU3bU5cT7cT7bR8aQ7`P6_O5^N5^N5cSdT=kZ@n]Ap_Co`Cl^Cm_EmaKodNmeNngMpkKwuNVaknqrw|}}|ЀҀՀ}}xz~{wuwz惾䁸}yx|ӾȲҺɲǰǮŬĨå¤~zy|}~}{xuuq|r|}pz{oyznxynwvmvsmvqqwspwpovnoukmsilrfkqelodkncjmbilahk`fi`dg^be\ad[ad]_b[]_Z[]XY[VXZUXZWXZWZ\YY[XXZWXZWXZYY[ZY]^Y]^Z^_Z``\ad\df^fi`hkbjmakmeprestguvjxym{~o}p}q~jw}gtzdqyanv`mvboxer{ftgzf|j}k~k|hyfugtcnbn~bkzblvajs]fmW^dSX\SV]SV]RUZPSXPQVOPUONSNMRMMOMMONLONLOPLMPLMPLMPJLRGKRFJQEINBFL@DI=AG;?F:>')')(*(*)+)+*,*,)+)+)+*,*,+-+-++-!--!+-!+-!+-!+-!+.!+.!+2"-2"-3!-4".4".5#/5#/5#/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/7&07&07&07&09%.9%.9&,9&,:%,:%,;$*;$*;%(;%(=$(;%(:%*:%*:&(:&(;%(;%(=$'=$'?''?''@&'@&'B&%B&%B&%B&%C$)C$)C$)C$)C$)C$)C$)C$)@!&@!&A"'A"'A"'@!&>$<#?"&=#&<"%;!$;!$: #9"9"9"9"9"8!8!7 7 7 7"7"7"7"3 1/-**)*++),-.......11123334 22222222222222225555555555444678:!9 9 9 8777777777775555555555667788= = = = = = =!=!=!=!=!>"@$B&D(G*H(J)K*M,N.P0Q2R3R3S5U7V8V7T5Q2O0N0M/K/J.H,G+F,E+I1I1J2K3J5K6L6L6K5K5 J4J4L3M4 O6"P7!P6R8X="\A$aF(cI(gJ(gK&kN&mP&qT*uX0vZ2vZ2uY1tX1jQ)iO*fN(dL&dL&fN*gQ,hR-kW2kW2jV3jV3hV2gU1fS2fS2`P.`P.`Q0aR1bS4cT5cV6cV6dU8dU8cS9bR8aQ7`P6_O6_O6cSdS?eU>m\Bo^BqbEpaDm_Dk]Ck_IlaMkcNkcLniLurOT^iqqrv|΁̀с~}~{{}聽~zxy}䃽儼䃷{z|~퉾׼˰ѼƲĮůĮ«~zy|~|xwtutr~~p||oyxnxwmxtqzupzrpzrpwoovnnvkmujntjloflmekldijbhicghbfgafgacd_ab]^^\\\ZZZXXXVXXXXXVZZXZ[VYYWYYWY[XZ\Y\^][_^Z^_Z``\bb_eebgjejmfnpfprbpqdsvgvyl{~o~qrrkzixes|bpybp{cq|ftfvj{j}k~k~k|hyfufs`k}_k{`ixaivbht^emW^dTY_RU\TT\RSXQRWPOUONTOMRNLQNLONLOPKOPKORLNRLNRLNTKNUIMVGLTEJRCHO@EL=BJ;@I:?')')(*(*)+)+*,*,)+)+)+*,*,+-+-++-!--!+-!+-!+-!+-!+.!+.!+2"-2"-3!-4".4".5#/5#/5#/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/7&07&07&07&09%.9%.9&,9&,:%,:%,;$*;$*;%(;%(=$(=$(<%+;&+;');')<&)<&)>%(>%(?''?''@&'@&'B&%B&%B&%B&%C$)C$)C$)C$)C$)C$)C$)C$)@!&A"'B#(B#(A"'@!&? %= $@#'=#&<"%<"%: #: #9"8!9"9"9"8!8!7 7 7 7"8#8#7"6!21/*++++,*,-.......1223344 4 33333333222222226666666665445678:!:!:!9 9 887777777774445566655667788= = = = = =!=!=!=!=!=!?#A%D(F*I,J*L+M,O/P0R2S4T5T6U7V8W9W8U6S4Q2P2P2M1L0K/J.H.H.N6N6N6N6L7L7K6K6K5K5 L6M7 Q9!T<"V>$X@$Y@"ZA"]B$_E$bH'dJ'iL*jN)lO'oR&tW-x[1y^3x]2w\1uY1nU,mT,jS*hQ(hP*jR,kU.lV/o\4nZ5mY4lX3iW1hV2gU1fS2`P.`P.`Q0aR1bS4cT5cV6dW7eV9dU8cS9bR8aQ7`P6_O6_O6aQ:aQ:aQ:aQ:cR>eT@gVBhXAn]Cp_CqbEp`Fl^Dj[Dh\Fi\Kk`NiaNmeNsnP|xRXcnpouz}̀~~{||؀ہ~~惿腽傹~|}‹₺ㅺㅶ⃲|}늻׿ۻέν°}{z{{}~~{zxyxvsr~~p||oyxs~zr}wq|vq{spzrnxoovnowlnqhnoglmejkehichicghbghcbc^aa_^^\\\ZZZXYYYXXXXXXZZXZ[VYYWYYWY[X[]Z]_^^`_\`a\`a]cc_eebgjfkngoqhrtdruetwjy|o~rtttn}kyhves|dr}ftiwiyj{j}k~k~k|ixgseq`k`h{`gy`huags^eoY`hW\bUU]TT\TSYSRXQPVPOUOMROMROMPQLPQLPSMQSMOSMOTNPVMPWKOXINWFLSDIP?EL=BK:@I:?')')(*(*)+)+*,*,)+)+)+*,*,+-+-++-!--!+-!+-!+-!+-!+.!+.!+2"-2"-3!-4".4".5#/5#/5#/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/7&07&07&07&09%.9%.9&,9&,:%,:%,;$*;$*;%(;%(=$(=$(=&,=&,='*='*?&*?&*?&)?&)A'(A'(C&(C&(C'&C'&D&&D&&D%*D%*D%*D%*D%*D%*D%*D%*A"'A"'B#(B#(B#(@!&? %= $@#'>$'=#&<"%: #9"8!8!9"9"9"8!8!7 7 7 8!9"9"8"7!6 21,++,+,,-.///////2223344 5!33333333222222226666666666555689 ;":!:!9 9 888777777773345567755667788>!>!>!>!>">">">"=!=!>"?#B&E*G,J-L-N-O/P0R2T5U6U7W9W9W9W9W8V7U6T5R4R3O3N2M1L0J0J0P8P8O7O7M8M8M8M8M7M7 O9!R="X@$\E&`I)bK)eM)dL&dJ%cI$eK&gM*lO-oS.nQ'qU&uX,y\0z_2y^1v[.tY.rZ.pW.mV,kT*kT+mV-nX/pZ1r_5q^6p]5n[3kY1iW1gU1gU1`P.aQ/aR1bS2cT5dU6dW7dW7eV9eV9dT:cS9bR8aQ7`P7_O6`P9`P9`P9aQ:cR>fUAiXDjZCm]Dp`FrbHp`Fk]ChYBeXEeXGfZJd[JiaNqjPwqQ}yS_iolqtx|}||}ۂ߄ށჿ䆿䅾ㄽ⃽⃽兾憻䄷}}߀↸ㇵⅱށ~~銷퍼ݶͨȻÑ~}|yxyz{|}~~{}|zwtqq}}ut|s{r}wp{uozroyqpwotwprsmopjklghidghcfgbffdaa_```^^^[[[ZZZYY[YY[ZZZZZXZ[VYYWZZXZ\Y\^[\`_]a`^bc^bc]cc^dd^fhaikdlneoqetwfx|k}osttsol}hyfweugwjzl|j{j}l}l}kzhwfrdpcnbj}ahz`hubhtahr_cl]`iZYaYX`YV]WT[VSZTQXUPVTOUQLPSMQSMQVMRWNQWNQXORYNR[LQZIOZGMUDJS@FN=CM:@J9?')')(*(*)+)+*,*,)+)+)+*,*,+-+-++-!--!+-!+-!+-!+-!+.!+.!+2"-2"-3!-4".4".5#/5#/5#/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/6%/7&07&07&07&09%.9%.9&,9&,:%,:%,;$*;$*;%(;%(=$(=$(>'->'->(+>(+@'+@'+@'*@'*A'(A'(C&(C&(C'&C'&D&&D&&D%*D%*D%*D%*D%*D%*D%*D%*A"'B#(B#(B#(B#(A"'? %= $A$(>$'=#&<"%: #9"8!7 9"9"9"8!8!7 7 7 8!9"9"9"8"6 51,,,,-,-.////////2233445!5!33333333222222226666666666555789 ;";":!:!9 9 88777777773345567755667788>!>!>!>">">">">"=!=!>"@$B'E*H-K.M.O/P0Q1S4T5V7V8X:X:W9W9V7V7V7U6T6S4Q5P4N2M1L2K1O7O7P8P9N9O:O:O:O9!P:"R="VA"]F&bL'fP)iS*mV,kT*iP'gN%gN&jQ)pT/rV/oR&rV&vZ*z^.z_0y^/v[,sX+t\.rZ.oX,nW+nW+oX,p[0r]2s`5r_5q^4o\4kY1iW/hV0gU1aQ/aQ/aR1bS2cT5dU6dW7dW7eV9eV9dT:cS9bR8aQ7`P7`P7^N7^N7_O8aQ:dS?gVBjYEl\Em]Dp`FrbHp`Fk]CgXAcVCcVFdVIcWIi]MogRrkOwqO[fnknruz|Ԁ~}׀ޅᆿ∿∿∿∽ᇼ߅ބ⇻䈹↵ނ܂߆ሷ㊴∰ބ܁ۀ݁狴뎹޳Υź—ƘǑ}|zzwwxxy|}}}~|xvrottss{p|xn{tmzsnxpv{uuwrqrmkmhhiddfcddbbda```^`_]]]Z[]ZZ\YZ\ZZ\YZ\ZZXXZWYYWY[XZ\YZ^]\`_^ba`de^dd]cc[ce\df^fh`hj`kmfuzgxl}qtuutpnj{gwgwhxk{l~j{j}k|k|jygveqdohpembi{aivciucjtcgpben]\d]Zc\Y`[X_YV]YT[XSYYRYSMQSMQVMRWNSXORXORZOS[OS\KQ]JPZGMWDJS@FP=CN;AL9?*,*,*,*,*,*,*,*,, ., ., .-!/-!/."0."0.".0$00$.0$.0$.0$.0$.1$.1$.2"-2"-3!-4".4".5#/5#/5#/5$.5$.6%/7&07&08'19(29(27&07&07&07&07&07&07&07&07&07&07&07&09%.9%.9&,9&,9$+9$+:#);$*;%(<&)>%)?&*;$*<%+>%)>%)?&*@'+A'*A'*B%'C&(C&(D')F((G))G))H**D%*D%*C$)C$)B#(B#(A"'A"'B#(B#(B#(A"'A"'@!&@!&?"&= $;!$: #: #9"9"8!8!9"9"9"9"9"9"9"9"::8887772/+'&)-/////////2233444 5!22222222222222227777777777777777777777779 9 9 887777777777777777777;;< < =!=!>">"B&B&A%A&C(F+I.L/K,M-P0R2U6X9Z;\>Y;Y;X:W9V7U6T5T4R4R3P4Q5Q5Q5P6P6S;S<T=T=R>R>Q=Q=Q#VA"[G&bL'hR)mX+oZ+v`1xb1ya3v^0pX,mT+pT-rW,sW'vZ(x\*x\*sY(rX'sY(uZ+t\,t\.s].s].u_0xb3ze8|g:tb4ta6ta6r_5o^3lZ2jX2hV0bR.cS1bS2cT3cT5dU6cU8cU8cT7bS6bR8bR8aQ7aQ7`P7`P7aQ:`P9_O8_O8bQ=fUAkZFn^GqaHp`Gn^Ek[BgY?eV?cTA`SC`REbTGdVIf[ImbLwnQ}Y[jpupjqzЀԀ~|ր܅߈߈݆݇ߋ݉م؄ۇߋللۅۅڄ؂ׁ܇܇܇܇܇܆܆܅卵듼ܬʝƜʚɖƕƎ~}}}~}{wvssvxz|}~zwwxvtr~q{q{t{|~y~zvxumrnhjgaed_a`[_^Z[]Y]^[\^Z^a\]a[_b]^b[_b_a`[_^\^]Y]\Y]\Z^_[_`\bb^cf]eg\dfYceWacXbd]gi`kocryexmuy{zxwrl~j|k}mnnqom|jyhtfrepdoemeldi|bhvbfr_cn^aj__g\Yb[U_XSZXSZZU\\U][T[[QYYPUXOTYNTXMSXMQYNR\PT]QUaPVbOU`MS]JPYFLTAGP=CN;A*,*,*,*,*,*,*,*,, ., ., .-!/-!/."0."0."./#//#-/#-/#-/#-/#-0#-0#-2"-2"-3!-4".4".5#/5#/5#/6%/6%/7&07&07&07&08'18'17&07&07&07&07&07&07&07&07&07&07&07&09%.9%.9&,9&,9$+9$+;$*;$*<&)<&)>%)?&*<%+<%+>%)?&*?&*@'+A'*B(+C&(C&(D')D')F((G))G))H**D%*D%*D%*C$)C$)B#(B#(A"'B#(B#(B#(A"'A"'@!&@!&?"&= $;!$;!$: #: #9"9"8!9"9"9"9"9"9"9"9"::88888750,('(+.........1122334 4 22222222444444447777777766666666777777779 9 8877667777777777777777;< < =!=!>">">"B&B'C(D)E*G,I.K/K,M-P0R3U6X9Z;[=[=[=Z<X9W8U6T5T4S4S4R6 S7!S7T8 T:T:P9Q:S<V?VB!XD!YE"ZF#WB#YD%\H'`L'gQ(lW*p\*r^+v`.xc.zc1yb0v^0s[-sX-rW*tX&w\'y^)y^)v\)u[(w]*y_.w`.v_-u_.u_.wa0yc2{f7|g8vd4vd6uc5ta6p_3m\1jX0hV0dT0dT0cT3cT3dU6dU6cU8cU8dU8cT7cS9cS9bR8aQ7aQ8aQ8aQ:`P9_O8`P9bQ=fUAjYEm\HqaJp`Gn^Ek[BgY?dU>bS@`P@_QD`REcUHfYIl`JukPyY[ejrlinwzԁՁւچߋ፿ߌۋڌیيևӄӃԄՅӃӃԄօօՄԃԂيڊۋ܋܋ۊډۉ⏳镺ݪɛšǙȕǒŏŠ~~}{yxyzzzxvutuvy{}~~|xwusssrvzy{syulrpfljage_ec^dd\bb\ad]be]be^cf^cg_dh_dh_ee^dd\bb[aa[aa\ad^cf]eg`hk_ik]fkYdhWbfZei_jnbouev~g{nsyzzyytpmnnnm~onm|kzjwhufqgoiphogm}ekydhsbfoadkcck_\e]WaZU\[T\\U]]V^^T\\RZYPUYNTXMSWLRXLPYMQ[OS]NS^MS^MS^KQZIOXEKRAGQ>DM!%;!$;!$: #: #9"9"9"8!8!8!8!8!8!8!8!; ; ; ; ; 9 9 8 63-*()+-........00112233333333336!6!6!6!6!6!6!6!777777776666666677777777887766657777777777777777< < < =!=!>">"?#B&C(E*G,H-I.J/K/L-N.O/R3U6W8Y:Z;]>\=[<Y:W8U5T4S3S4T5!S7!T8"U9!W;#W="W="R;S<U>XAXD![G"]I$^J%_K(aM*dP+hU+nY.q\-t`-ua,xc,yd-|e/~g1~g5{d2x].u[*v[&x]&z_(z_(y`*y`*{b,}c0{d0zc/yc1yc1zd2{e3|h6}i7yg5yg7xf6vd6ra5n]2kY1iW1fV2fV2eV5eV5eV7dU8cU:cU:eV9eV9eU;dT:cS9cS9cS:bR9aQ:`P9`P9`P9cR>fUAjYEl[GqbMo`Im^GiZCfX>bS<`Q<_O?_OB`PCbREeUEk\GthNvVX_enkhlsv}Ղىݏސېٍ׍ԊІ΃́ˀ~|̀ςЃф҅ф҄֊׋،ڍڍڌًيޏ啷윻ۨǚ˜ƗǕǐÍ|xxwusqrtuvvuuvvxz~xxvtsssvyv|pyvirqdmlaji`ih`hj`hj`hkailailbjmbiocjpcknbjmaik`hj_gi_gi_ik`jl`kmcnrcnralr\io[hn]jpboufu|h{g~mpuvyxytropmli|izk{k{k{kxhufqfniphogm{gkwfirdgncfkdejc]g`Xc]V^^T]_U^_U^_T\]RZYNTYLSXKRWJQYJOZKP[LQ[LQYJOYJOYHNWHMUDJQBGP?EM>C*,*,*,*,*,*,*,*,, ., ., .-!/-!/."0."0.".-!--!+-!+-!+-!+-!+.!+.!+2"-2"-3!-4".4".5#/5#/5#/9(29(28'17&07&06%/5$.5$.7&07&07&07&07&07&07&07&07&07&07&07&09%.9%.9&,9&,:%,:%,;$*<%+<&)='*?&*@'+@'-@'-@'+A(,B',C(-E(,E(,E(*E(*F(*G)+H()H()H()H()E&+E&+E&+D%*C$)C$)C$)B#(B#(B#(B#(A"'A"'@!&@!&?"&>!%<"%<"%;!$: #: #: #9"8!8!8!8!8!8!8!8!; ; ; ; ; ; 9 9 8 52,**+,--------/0001122333333336!6!6!6!6!6!6!6!888888886666666688888888887766557777777788888888 < =!=!=!>"?#?#?#B'D)G,I.K0K0K0K/L-N.O/R2T5V7X9Y:[<Z;Y:W8U5S3Q1P0Q2R3Q5S7!U9!V:"W="W> W@ W@ XAXBXDYF[H \I!eQ,gT,jW-mZ/s^/ua/vb-wd,ze,ze,}g.l3n8m7f3za+z_(z`'{a({a(za){b*}d,f0~g1~g3}h3}h3}h3}h3}i6}i6|k7|j8{i9yg7tc5q`4m\1kY1iZ3iY5gX7gX7fW:eV9dV;cU:fW:fW:fVfUAiXDjYEpaLo`Kl]HhYBeW=aR;_P;]N;^N?_O@aQBcTAiZEseJrS~SZ`jihlqrvzс׉َُՎӌԏЊɄȂǁƀ|y}ȁ̄͆χЈшшӊՎ׍ؐ؍ՍՊُ眸ퟹퟸڧřzwyxz–ÖƔƑŏË{wstrpnlnpqtvvvwxz|wxvtsrrsvr~zmwvfrpcml`ljaklammcmobmocmocnpensdosensfotgpugpufoteptepteptfqwdqwdqyet{fu|es|cqzbs{ev~gzj~ijmortvvtqpokf{cvbtdtgwhxivgsemcl}cjzdjxdhtcgrbel`ch_cfa`eb]daWb]S\[QZ\R[\R[[PXYNVXKRWJQVIPWHOWHMWHMXINXINTEJTEJTEJTEJSDIQBGO@EN?D*,*,*,*,*,*,*,*,, ., ., .-!/-!/."0."0.".-!--!+-!+-!+-!+-!+.!+.!+2"-2"-3!-4".4".5#/5#/5#/9(29(28'17&07&06%/5$.5$.7&07&07&07&07&07&07&07&07&07&07&07&09%.9%.9&,9&,:%,;&-<%+=&,='*>(+@'+@'+B'.B'.B',C(-E(-F).F)-F)-H*,H*,I),H(+H()H()J()H()F',E&+E&+E&+D%*C$)C$)C$)B#(B#(B#(A"'A"'@!&@!&?"&?"&<"%<"%<"%;!$: #: #: #8!8!8!8!8!8!8!8!<!===< < : : : 741---........./00011224444444444444444888888887777777788888888888776667777777788888888 =!=!=!>"?#?#?#@%B'D)G,J/L1L1K0L0L-N.O/Q1S3U6W8W8W8V7U5T4R2P0O.N-O0O0O3P4R6T8 T:U<V?U>U>V@VCYF\I^K!hU+jW,m[-q_/vb0wc0xe-xe+|g.|h-i/n4s9t;o7k3f-e*}c(|b'{b)}d+~e,~e-i0i3j3k4k4k4k6k6~m9~m9}k9{i9wg6tc5q`5o]5l]6l\8j[:iZ9gX;fW:dV;cU:gX;gX;fV`O?bQAdS?iYBsdGqP|OY\ffhmpqtzςӈԍҎЎώ̊ȅ€~|y{|Āȃʆ͈͈ω˅·ыՍՏԌҋ҉Ԍܑ♳眴螳靴ꟳ쟾٧ę}v{t{vvyđŐϋ}xuqqpnlk~kmorvxyxwx|}|yxvurqqqtp|myyfttdpp`nnaln`nodosbpseptcqtfqwdqwgrxgrxlw}lw}lw}kx~kx~ix}ixixgu~izm~mk}i{i{i}jiijlnprrpnmkg~ax]s\nz_pzcq|dreqbn|aj{_hw[cp\bn]aj[`f[^cZ^a[\^[[]_X`^R^ZNXXLVWKUWKUUHQSFOYJQXIPVGNVEMUDJUDJVEKUFKPAFNBFOCGOCGOCGNBFL@DK?C*,*,*,*,*,*,*,*,, ., ., .-!/-!/."0."0.".."..",.",.",.",.",/",/",2"-2"-3!-4".4".5#/5#/5#/8'18'17&07&07&07&06%/6%/7&07&07&07&07&07&07&07&07&07&07&07&09%.9%.9&,9&,;&-;&-<%+=&,>(+>(+@'+A(,C(/C(/C(-D).F).G*/G*.G*.I+-I+-I),I),I)*H()J()H()G',F',F',E&+E&+D%*D%*C$)B#(B#(B#(A"'A"'@!&@!&?"&?"&=#&=#&<"%<"%;!$;!$: #: #: #: #: #: #: #: #: !=!===< < : : ;! : 741011////////0011223344444444444444449 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 :!9 9 9 8777777777779 9 9 9 9 9 9 9!=!>">"?#?#@$@%@%C(D)F+H-J/K0K0M1L-N.O/Q1S3T4U5V7T5T4S3S3R1Q0P/P/O0O0N2P4Q5R7R8S:P9Q:R<U?XE^K!cP&fS(iW)lZ*p^.tb0ye2{g2{h0{h.k0k0k/n2r6v:w;xbQ?cR@eT@kYAudFqP|PY[cdflontẑ̈́ʈƅÅÅ|xxvyxzxyy~ĄDŽLJɆŃɄ̉ыюЊΊ͆ϊՍݗ♱㜰䚱坯眷֥zvwrxvv}‘ŐĐČ{urnnmk~i|i|h}klptwxtuwz~~}}{wvsrrusp~~k{zhvvdtscqraqqdrudsvesvdsvfsyfuzgtzfuzn{n}p}pp~m~l}k|k|nstroommmmmnopqqolkjf}`w\q[mw]nv`nwaozamy_kw^gv^fsY_kX_iY^dX]aX\_W[\XZYYY[_U^[O[VJTTHRSGQRFPPCLM@IXIPWHOVEMTCKSBHSBHSBHTCIK?CK@DMAELAEMAEK@DK?CI>B*,*,*,*,*,*,*,*,, ., ., .-!/-!/."0."0."./#//#-/#-/#-/#-/#-0#-0#-2"-2"-3!-4".4".5#/5#/5#/6%/6%/7&07&07&07&08'18'17&07&07&07&07&07&07&07&07&07&07&07&09%.9%.9&,9&,;&-<'.=&,=&,>(+>(+A(,A(,C(/D)0D).E*/G*/H+0I*/I*/J,.J,.J*-J*-K)*J()J()G'(H(-F',F',E&+E&+D%*D%*D%*B#(B#(B#(A"'A"'@!&@!&?"&@#'=#&=#&<"%<"%;!$;!$;!$;!$;!$;!$;!$;!$;!$;!$;!"> "> > > =! =! =! =! <"!;! 8 76645 111111111122334 4 5 5 5 5 5 5 5 5 6!6!6!6!6!6!6!6!9 9 9 9 9 9 9 9 ;";";";";";";";"9 9 9 9 9 9 9 9 ;";";":!9 9 9 8777777779 9 9 9 9 9 9 9!>">">"?#?#@$@%A&D)D)E*F+H-J/L1N2M.N.O/Q1R2S3T4U5U5U5T4T4T3 T3"T3$T3$R3!R3!Q5 R6 R6 S8S9S:R;S<T>WAZGaN$gT)kX-lZ*o]+tb0yh4~j7l7m5l2n3m2l0m.p1v7}?E~AyrcdS?fT@hV@m\BvfEqP}PXZ``bgljoswvtpqqhhlknouvuuz{āȈ͊΍Ίˉʅ̉Ҍږߘ᙮ᜮ㛯쟱џx{uusxswĐďË~}|xvqnjj}i|gzexewdyf{gkpsurtvx{~}yvtuyxxspi{{gwwbttgvyewyhw|fx|ix}gy}jyhyposrrpnmrsvsqqstrpqqqqpppmjihe~az`u_q{apwapw`nw`mv^kt_iu_gr[blZai\ag\_d]^`\^]\^[\\\^T][O[VJTSGQREOPCMO?ILBI@CK@DJADJ?CH?BH=AF=@+,**+,**+,**+,**-., ,-.-!-. /."./!0.".1$.0$.1$.0$.1$.1$.1$.1$.2"-2"-3!-4".4".5#/5#/5#/5#/4$.6$06&07%17'19'38(27%16&07%16&07%16&07%16&07&06&07&07&07&.9%.9&,9&,;&-<'.=&,>'->(+A(,A(,B',D)0F(0F).G*/H+0I*0I*/J+0K-/J,.K+.J*-K)*J()J()G'*G(-G(-F'-F',E&,E&+D%+D%*B#)B#(B#)A"'A"(@!&@!'?"&@#'@#%?"$?"$>!#>!#= $= $>!%>!%>!%>!%>!%>!%>!%>!#=! =!=!=!=!=! =! =! <"!;! ;! : : : 9!9!222222222233444 5 5 5 75 75 75 :" 8# :" 8# :" 8# :" :"9 9 9 9 9 9 9 9 <#<#<#<#<#<#<#<#9 9!; 9!; 9!; 9!>#<$=";#$>$@$@$A%A&E*D)D)D)F+I.L1N2M.N-O/P0R2S3T4U5V6V6V6W7 W7"X7$X7$Y8'W6%V7#V7#T8"T8 T:T;S<ZC!YCYCZD\IaN$eT)hW+n\.q_/we3|j8o;q;q9p6o4p2n.~l*n,v4>GIBz:s6p5o6l4i1{d.|g0j3n6o8p7o8o8m5n6m8n9m;~l<|juc;tbn^=kZDH?DI@EI@CH?BH=AF;?E:>.++(+()&+(+(/,/",-*+(.+- *1!.0#-3#02%/2"-0#-2"-0#-2"-2"-2"-2"-2"-2"-2"-3#.3#.4$/4$/5%06&14'16&34'16&34'16&34'18(56)38(56)38(56)38(56)38(26)28(29)39*1;*2=)2=)2=(/>)0?(.A(.B)/D)0D).D).J+3J+3J+3J+3J+1K*1K+0K+0K+0K+0J*-J*-I)*I)*H()H(+I*0H+0G)1F).F(0E(-D&.D',B$,B%*B$,B%*B$,B%*B$,B%*C%'C%%B$$B$$A##A##@"$@"$@"$@"$@!&@!&@!&@!&@!&@"$9 9 :!;"<#<#?# ?# =!>"?#"?#">!#= "<!99!7"6!6!5 4335 6!6!6!7"8#8#8#9!9!;":"<#;#=$ <$ =$ ;#<#:";"9!:!:!8; =!>#>"=";:=!="=!="=!="=!="@%@%@#>#>!$?%@&A'B'@%?$B'I-O3Q5 R6!P1S3U5 T4Q1Q1S3V6W8X9[< \= \=!Z;X9V6_<(^;(Y:%U9!U<U>XAYC]G aI#cL#cM$aN$cR'gX-l]2m\1p]2sa3xf8}k;p=s=v=u8t5s/}s,v.7AILH?v:o7l8k;lmZdUBeVCdWDgXEhYFeTBeTBgTCfUCfSDdQBbOAaN?hUFjUDjUBjV>nZAyfHtSU[QQT]fknoibZZ|Z|XyY~_befdeikllptuxyxuzĆNjˎГיڟܠ۟ڟݥߨ䭵ԡ‘ywu{vywyyċȈÉĊÈzvuyomi~gzdwdwfwgxgxhyhzgyfzinrttwy|~{y}zxvtojxes|gu~hvgxizk~mqsrsttuvvvxzyxvw{}yxxz{ytorqpnkhd~c|\u^t_u`ubtctcserhtisio{hlwegsbenbbjbai\Yd]Wc\VbZT`XP]VNYUMXTLWXNYVLUTHRQFNODLNCKPCLODLJ@HIBIKAIKBGK@DK?CI=?H<>.)-(,'+&,'-(/*0 +.).)/*0 +1!,2"-2"-3#.2"-2"-2"-2"-2"-2"-2"-2"-2"-2"-3#.3#.4$/4$/4$/5%04&34&34&34&34&34&34&34&36(56(56(56(56(56(56(56)36)26)26)27*39*1;*2=)2=)2>)0?(0A(.B)/C(/D)0D).G*/J+3K*3K*3K*3K*1K*1K+0K+0K+0K+0K+.J*-J*+I)*I)*H(+I*0G)1G)1F(0E'/E'/D&.D&.D&.D&.D&.D&.D&.D&.D&.E&,F&'E&$E&$D%#C#$B"#A!"A!"A!$A!$A!&A!&A!&A!&A!&@"$:!:!:!;">">"?# ?# >"@" @""A##@"$?!#=!;9!7"7"6!5 5 446!6!6!7"7"8#8#9$;";";"<#<#=$ =$ =$ =$ =$ <#<#;";":!:!;#>#>#>#>#>#>#>#A$A%@$?#>"=!< < =!=!=!< ;::9977777778889 9 :!:!;"9#9#;#;$;$;$>$>$B'A&@%D)K/P4R6!U6!S3T4U5S3Q1Q1U6X9X9Z;\=^? ^? ]?\>[<_;%]:&Z:#Wuo?h<j;~l<n:o:p7p7q6q3q3p6p6n8m9l:l=|gaPbS>cTAcTAbUBcVCdWDfWDdS?eT@fSBfSBfSEdQCcODbOAhRDiTCiTAjV>nZAxeGqR~U[SRS\bdfb^Vy{SvxQtyQswRqwQs~VvZy]{_|^}aehikloprssmqzÊÌǏ̔Қ֟נננ۪߮䲴ؤʘ|xxvx~yxyĉŃ}zwsrsnki|fydwcvfwgxhyizhxfvdvfxj~nrtvx|~‰ŠŠ{x|yywwqkyesguhviwizk~mppsttuvwxxy{{{yy{}{yz|~|xttsrolhd~b|]w^x_w`ycxdveveuivktjqhn|givdfsddpcco^\i][h\XfZVdXTbVS^VP\UO[WQ[VNYSKVPIQQGPPFOPFNPFNJCKKDLMCLMCKNAHMAEM>CL=@-(-(,','-(.)/*0 +0 +0 +0 +1!,1!,1!,1!,1!,2"-2"-2"-2"-2"-2"-2"-2"-2"-3#.3#.3#.4$/5%05%05%06&16&16&16&16&16&16&16&18(38(38(38(38(38(38(38(36)26)28(29)3:)1;*2=*0=*0?*1@)1B)/C*0D).E*/G*/G*/K,4L+4L+2L+2L+2L+2L,1L,1L,/K+.K+.J*-J*+I)*I)*I),H).G(.G(.G(.F'-F'-E&,E&,H)/H)/H)/H)/H)/H)/H)/H).H()H)'G(&F'%D$%C#$B"#A!"A!"A!"A!$A!$A!$A!$A!$@""=!="=">#?"@#@#@#@" B#!B"#C#$B"#A!"? =:"7"7"7"6!6!5 5 7"7"7"8#8#9$9$9$<#<#<#=$ =$ >%!>%!?&">%!>%!=$ =$ <#<#;";">">!>!= = >!>!?"?"?"?"?"?"?"?"?"B%B&A%@$?#>"=!=!>">"=!;:876977777777889 9 :!:!:!<$<$<$;#="<"<"<"C(B'C'G+M1R6V7"V8 V6V7U6S4Q2S4X9\=]>]>_A`B aC!aCaC`A"`<$^;%[=#Y@"[D"]I$cM$fQ&kT(nV*oW+nW+lW*jY+j]0m`3p_3r_4ub7xf8{k:~n:r;s8x:z8}868t?uAp?p=o;n6o5p6r6s6u7u7t:s9q;o;o=n?}h=zd=v`;t]=q\=nYjU@iWAiWAhV@gU?dS?cR>bS>cT?cTAcTAaTAaTAbUBbUBbS>cT?eTBeTBdRDcQCcPBbOAfPBfQ@hQ?jT=nX@wbElMuPVPONRSSSxsKsnHkgBeb?ebAfcBfeFefDgmIhsKmxPq|TtWwYz^}bcdegijjj|djryÎɔ͘НўҟӢک߮崲깶½ٜʖxy{z{{vw~ŒÈ{zxzyuqmlmk}i{gxductcteufvhwhwevbs^p_qbve{moqty}~ĉƍȍƍōÏÎ~{y{z|{{tm{ftiuhviwizk~mprvvvwxyzzx{~|}}|z{~}ywvtqmhd~b|a{b|d|e~h}i{iziylynwmtkqjlygivgftfesa`n`_m_]k][h[YfYWdXU`XU`WT_XR\VPZTNXSLTRKSRKSRKSNFQOHPQGPQGORELPDHPAFO@E-(-(-(.).)/*0 +0 +2"-2"-2"-1!,1!,1!,1!,1!,2"-2"-2"-2"-2"-2"-2"-2"-3#.3#.3#.4$/4$/5%05%06&16&16&16&16&16&16&16&16&18(38(38(38(38(38(38(38(36)26)28(29)3:)1;*2=*0>)0A*2A*0C*0D+1E*/F+0H+0H+0L+4L+4L+2L+2L+2L+2L,1L,1L,/L,/L,/K+.J*+J*+J*+I)*G(-G(.G(.G(.G(.F'-F'-F'-I*0I*0I*0I*0I*0I*0I*0I*/K+,J+)I*(H)'F&'E%&D$%C#$C#$C#$C#$C#$C#&C#$C#&C$"@#@#A"A"A"A"A"B# C$"C$"F$#D$%F$%B"#C!"?!;"8#8#8#7"7"7"7"8#8#8#9$9$:% :% <$ =$ >%!>%!>%!?&"?&"@'#@'#?&"?&">%!>%!=$ =$ <#>"A$@#>!= = >!@#A$@#@#@#@#@#@#@#@#C'C'B&A%@$?#>">">">"< ;97649777777777789 9 9 :!;";#;#;#="=#=#=#C(C(E)I-P4U:Y;!X:Z;X9U7S5T6W9\>`B dF$dF$cE#cE#bD cE!cE!cE#cA&cA(`B&^F$`J%bO%iT)kV)s[-u]-v^.t^-q]+m]*l`.oc1tc5vd6xf8zh8|l9o;r9s8w9z8;=@CKLSPMFB|@zA{Bt?r=p8p5p5r6w7z:y;y=x>vr>q?qBk@|f=xb=u^kVAiWAiWAiWAgU?eT@dS?cT?cT?bS@bS@`S@`S@`S@_R?_S=`T>aTAcTAcSCcQCbPBbOAdN@dO>fO=jQ=nV>t\B|bGiIsKrHoG}kCxiBsc?n`=j];aT4\Q3WN1VL1UN2XQ5[U;ZY;^b?aiBfqIlwOp{SuXz^|`}a}a~c}b}c|bzbyawb|hpw}Ŗəʜ̞ϡӤةݭⲰ浰跳Žڙˑ}xz|yzvw~ˆ~|wutusqmjh}i{fxfwdubsarbrcsdtcrcrap]nZjZl_qauiimqvy}}ËȐːːʏǓɒƐ}z|{|}xp~hvjvjvjxkyk|mprwwxyz{|}y~~}{yy||yxvsnieb|d~ehklml}l{p{qzovmslo~jlyjiwhgucerbdq`bo^`m^]k\\h[[g[YdYWbXVaXU`WT]UR[VQXVQXVQXSKVSKVUKTUKSTIQSFMSDIRCH-(-(.)/*/*0 +0 +0 +2"-2"-2"-2"-2"-1!,1!,1!,2"-2"-2"-2"-2"-2"-2"-2"-3#.4$/4$/5%05%06&16&16&16&16&16&16&16&16&16&16&18(38(38(38(38(38(38(38(36)26)08)09*1:)1;*2=*0>)0B+1B+1D+1E,0F+0I,1I,1I,1M,3M,3M,3M,3M-2M-2M-2M-2M-0L,/L,-L,-K+,J*+J+)J*+G(-G(-H).H).H).H).H).H).H).H).H).H).H).H).H).H*,L,-N,+M+*L*)J('I'&I'&H&%G%$G%$G%$G%$G%&G%$G%&G%#F% F%F%E$E$E$E$E$F$"G%#I&$H&%H$$F$#F""B#!;":#:#:#;$;$;$;$;$;$;$<%<%=& =& =& ?&!A%!B&"B&"C'#C'#C'#D($B&"B&"A%!A%!@$ @$ ?#?#B%A$?">!>!?"A$B%B%B%B%B%B%B%B%B%D(D(C'B&A%@$?#?#>">"< ;976497777777677789 9 9 89 ; #?%@$A&E(E)G+L1U7Z< [> Z=^@[=X:V8X:]?aCdF"kM)iK'fH$dF"bD bD cE!dF$jH,hI,fI)dL(eO(gT)mX+p\*yb0{d0f0{d.wb-sb,qd-re0zj7{i7}k9~m9o;q:s:t7u5z8>BFJQRSQQKD?}@~Bu}?|@{Ay?v@uAsAsDnAjA{e@xa?ua@r]>mX9jU8lX?lX@jX@jX@iW?gU=eU>cSaR=aR?aR?_R?_R?^Q>^Q>\Q=]R>_T@`S@aTCbRBbPBbOAdN@cN=dM;gN:kP;nT=qU?qW>tZ?sY>oW;jR8bM2]G/WC*SA)O='N=)L=(L=*L?,QD1UJ8VP8Z]>^fAgoJnvQr|Wx[}ac}a}b~c~c~c{bzax`ze~lsx~×řśȞͣҧԨ٬ݯ߱Ჭ湳ķ˽տۗГnj}z~ywvw}~|wtutqpmk}hzgxctcrbq`p`pan~an~bo^k|]m}\k~Xi{Wh|Xj~^p`tdzd|hlrw{{~Œǐ˒͑̐ʕ˕ɔő~z}|~zrlxkwkwkxkym{nprxwyz|~~{~}xvvy}}{zywsoiec}gimoppon}q|r{pwntmpjm|ikzgixehwdgvbet`dp_an]_k[]i\\hZZfZZd[YdZYaYX`YV_XU^XU^VPZVPZWPXXNVWLTUJPTHLRFJ-(.)/*0 +1!,1!,0 +0 +2"-2"-2"-2"-2"-3#.3#.3#.2"-2"-2"-2"-2"-2"-2"-2"-4$/4$/4$/5%06&16&16&17'26&16&16&16&16&16&16&16&18(38(38(38(38(38(38(38(28)06)08)09*1:)1=*0>)0>).C,2C,2E,0G,1I,1J-2J-2K,2M,3M,3M,3M,3M-2M-2M-2M-0M-0M-.M-.L,-L,-K+,K,*J*+H*,I*/I*/I*/J+0J+0K,1K,1I*/I*/I*/I*/I*/I*/I*/J*-N,-N,+O++M+*N**M+*M))L*)K''J(&K''J(&K''J(&K(&K($J'!L'L'K& K& H%J$!H%!I&"I&$J'%J'%J&&I%%G##E#!=!;$;$;$<%<%=& =& <%<%<%=& =& >'!>'!?&!B&"C'#C'#D($D($E)%E)%E)%C'#C'#B&"B&"A%!A%!@$ @%B%A$A$@#@#A$A$B%C&C&C&C&C&C&C&C&E)E)D(C'B&A%@$@$>">"=!;:8769777777766677889 78;#?$A%B'E(F*I-O4X:]@"^A!]@aC^A[>[>_BcFfH"gI#mO)jL(fH$cE#aC!bD"dF$fH&oN/lM.kN,iR)kV+m[+s_-va,i3m4n5m4l1}j0zk0{l3q;q=rEIPTUSSSNE?~>~@w:v8t6t4w5{:>AAC}C{AxBvBtBtCsFoDiB|fAxdAua@p\;lW8nZAnZAlZBkYAiW?gU=cS`Q>^Q>^Q>^Q>^S?YQ]dBgnLmwRt~Yy_eg~d~cdd~d}b|aya}lpux|šɡШЧҦԧ֫ۯⷯʹպܾܗޚߠݘՔϒƍ{yxz~~|yuutpnm~k|gxfuapaqbo`m}_l|^k{^jz]jzZgx[hyZgzWfyVezXi}_ocu`tbxf{jqvz|~čȏʐː˖Ζ̗ʔŏ~|}}zunzkwkwlylyn{o}rqwxz{}~|wutw{}|zyxvsojfc}giortrpn}p{ozoxmtkqil{gjyfixdjxbjw`hu_es]cq[am[_kZ^iX\gZ\hZ\hZ]f\\f[[cYYaYX`WT]YS]ZR]YRZYNVWLRUHOTHL-(.)0 +1!,2"-1!,0 +/*0 +1!,1!,2"-3#.4$/5%05%02"-2"-2"-2"-2"-2"-2"-2"-4$/5%05%05%06&16&17'27'27&07&07&07&07&07&07&07&09(29(29(29(29(29(29(28(28)08)09(.:)/<)/=*0>)0>).C,2F-1G,1H-2J-1K.2L-2L-2N.3N.3N.3N.3N.3N.3N.1N.1N.1M-.M-.L-+L-+K,*K,*K+,K+.K+.K+.L,/M-0M-0N.1N.1M-0M-0M-0M-0M-0M-0M-0M-0N*,O++Q*+O++R,+P-+S-,Q.,O)(M*&O)(M*&O)(M*&O)&O*$Q*#P*!P*!O(!N' M( M&!L'!L'!M'$M'$N(%M'&L&%H%#F$">"<#<#=$>%>%?&?&=$>%>%?&?&@' @' @' D)"D)"D)"E*#E*#F+$F+$F+$D)"D)"C(!C(!B' B' A&A&A$B$C%D&D&C%B$B$D&D&D&D&D&D&D&D&F*F*E)D(C'B&A%A%=!=!=!< ;::99777777756677888;;< =">!?#@$@%F*G+L.S5Z=_B `B _AcFaD_B`CeG!hJ$iK'iK'jL(gI'cE#`A"`A"cD%gH)jK,oN/mO-mQ*lU+oZ-r`.ye0}h/s9v:w:x:v7s4u4u7x=w?w?x=x=y};}?z;y9x8w7y7|;=BCD~D|ByCvBuCtCvIrGlCiB{gBwc@s_fU;bR9`P7]N7]N9^O<_P=^Q>^Q>_RA^SAWQ;XR).?(.F-1F-1G,1H.1K.2K.2L-2M.3N.3N.3N.3N.3N.3N.1N.1N./N./N./M.,M.,L-+L-+K,*K,*K+,L,-L,/M-.N.1O/0O/2P01O/2O/0O/2O/0O/2O/0O/2Q/0P)*P)*Q*+R+,S-,T.-U/.U/,Q+(Q+(Q+(Q,&Q,&Q,&Q,&R+$T,$S+#U*#R*"Q)!O(!O(!N'"N'"M("N(%N(%N(%L&#I&$G&!>#<#=$=$>%?&@' @' >%>%>%?&@' @' @' A(!D)"D)"E*#E*#F+$F+$G,%G,%D)"D)"D)"C(!C(!B' B' B%A#B$D&E'E'D&B$A#E'E'E'E'E'E'E'E'G+ F*E)D(C'B&A%A%=!=!=!< < < < ; 9777777755667788>">"=!=">!>"=!="F*G+M/T7[>`DaC`BdGbEaCdF iK'lN*kM+jL*fG(cD%`A$^?"`A%eF*jK/nO2nM,lN*mQ)nW+r^,ve/~k1o2x:|<==}9|7|7}:|>|@{?{?|={<{<{:=ADGIMSVSTVQE=|:|<}>{<{;z:z;};>?EDE|CyCwAuCtCxItGoDkB}jBye@t`;p\9r_Ar_Ao^Bl[?iX+1?,2A,1B-2D-3D.1F-1H-2K.2M04O05O13O/2O/2P05P05P03P03P03P03P03P01P01P1/P1/Q20Q2/R30R30R31P.-R0/U34W54W56U32R01P.-R01Q/.Q/0P.-P./O-,O-.O-,S,-U-.U--U--V..V..W/-W/-V.,V/*W0+W0)X1*X1*Y2+Y3*[0)[0'[/&Y.%X-$U-%T,$S,%Q*#Q*#O*$N)#K("J'!I&"H'"G,%E,%E,%D+$D+$C*#C*#C*#A(!A(!A(!A(!A(!A(!A(!A(!C(!D'!E("E("F)#F)#G*$G*$I,&H+%H+%G*$G*$F)#F)#F)#G)!H'H'G&G&F%F%F%G&G&G&G&G&G&G&E'B&C'D(E)D(C'@$?#?#?#>"=!< ;:9; 87655677888889 9 < > ?"A$C%E'F)F)L-O1T5X9\>_AbAcC]?^@`BcE!eG%fH&fG(fG(`A$]>![< ]>"bB)fF-gG0fG+nP.nP*nS(pZ+wc0p8{@CBCEGDBBEIE>?DIHCFEGFFINPYZZULC~]P?]R@[TAZUA\UB\UB^S?]P=^O<_L;eOAcL>aE9[?3V6+P0%L* H'F)#B)$@'">'!>'=) >,"?-#>.!<.!=0 =1!?6%D;*I@/ID0LO4PW8YbCdoOm|[ubyhzixi{jl~kzgxbxdyekmpswxyyƢ̨ѱٹīͰմ޺ۗٗוՕՙלڞܝܛܙט֙ԘΓƏ}xwtvwwursn{huepdobn~_k{_hw]fu^eu]dt[cpZboZ`lY_mX^l[cpXapV_nT`pWcs\izbods`qasewi}osxx|ŒǏʎǔ͖ЖΖ̔lj|xuvyyvq}nxmuows{qylvqzywxzxww{~~|yxwvuvvwsrqomkjjg|mqssojyfulwkvltjsipgnfmdm~]iy[hx[hx[gw[gwZftZft\fr\fr]er]er]ep\do[amY_kZ^i[Yf[Xc]Wc_WbaW`^T\YNVTIQ.).)-(-(-(/*0 +1!,0 +0 +1!,1!,2"-2"-3#.3#.2"-2"-2"-3#.3#.4$/4$/4$/2"-3#.5%06&16&16&15%05%/:&1:&/;'0;'0<(1<(1=)2=)2:&/;'0;'0;'0<(1<(1=)2=)2:)/;*0=*0>+/A,1B-2C-0F-1G,1H.1L/3M04O13O13O/2O/2P05P05P03P03P03P01P01P01O0.P1/P1/P1.Q2/Q2/R30R30Q/.R0/U32W54W54U32R0/Q/.R0/R0/Q/.Q/.P.-P.-O-,P,,V./V./W-.V..W-.V.,W.,W0+X/+W0)X/)X2)Y1)Y3(Z2(Z2(]1(]1&\0'[/&Y.%X-$U-%T,$R,#P+#P+#M*$K("J'!J'!F( G,%E,%D+$D+$C*#C*#C*#B)"B)"B)"B)"B)"B)"B)"B)"D)"D'!E("E("F)#F)#G*$G*$G*$I,&H+%H+%H+%G*$G*$F)#G)!I(I(H'H'G&G&F%F%G&G&G&G&G&G&G&E'C%C'D(D(D(B&A%?#@$?#>"=!< ;:9!>!?"@#C%E'G*H+M.O1T5X9\>_AbAcB\>^@aB#cD%eF'eF)dE(cD'`A%^?#\<#^>%bB+fF/gG2fF-qS1pT,oW+s],zf1s8}@BKMPONKLOTNHGKNMJDFFEEHMQUWZULB~<{;~@~BCDEFGHIHG~E{EyCxFwEwEwHwJvKtIoE~kA{h@wdCwdCtdCqa@n^=jY;eV9cS9_Q7_P9^O:]N;[N=\O>]P?\Q?ZS@[TA\UB]UB^S?^Q>_P=`M3T6,P/(K*#F( D)"@)#?("<(<(<* <+!;- =/";/!<0 ;2!>7%B=*FA-GE.HH.JM0RV;[dEdrQl}[rcuexjyk|m{jzgwdxdye|h~jmpuvxxxz~~Ƥ̫Ҵٽȫбڶٖؖ֔ԖԘ֛ם۟ޜݚؙךՖДɐ~|{zwwyxutq|mxjrhqgpen}cjz`gw]dt^dr]cq\bn\`l[_kZ^jZ^j\bpYanW^nV_nYbs\hxal~cpapbsfvk}pswy}Ďǐɏȕ͖ЖΕ˓lj}{wtvyzuqzmuksousyrxmuryxzz{zyxz}~~}zxwuuuuvrrpomkjjh}mqssojyfukxkvltjrhqgnfmdm~]hz[hy[hy[hx[gw[gwZfvZft\et\fr^fs^fs\dq[cnZ`l[_k][h]Yg^Xd^Xb_Wb^T]YNVTIQ.).)-(-(-(/*0 +1!,0 +0 +1!,1!,2"-2"-3#.3#.2"-2"-2"-3#.3#.4$/4$/4$/3#.4$/5%06&17'27'26&15%/9%0:&/:&/:&/;'0;'0<(1<(1:&/:&/;'0;'0<(1<(1=)2=)2<)/=*.>+/?,0A,1B.0C-0F-1H.1I/2M04O13P03P03O/0O/0P03P03P03P03P01P01P01P1/O0.O0.P1.P1.Q2/Q2-R3.R3.R0.S1/U31W53W53U31S1/R0.S1/S1/R0.R0.Q/-Q/-P.,Q.,X01Y/1Z./X./Z.-X/-Y-*W.([0*Y1)[0)Z2(\2&[3']3'^4(^2'_1$]1&[/$Y/#X."V.$U-#S-"R-$Q,#N,#M+"K*!J) G)G,#G,#F+"F+"E*!E*!D) D) D) D) D) D) D) D) D) D) E( F( F( G)!G)!H*"H*"I+#J,$J,$J,$I+#H*"H*"H*"G)!J) J*I)I)H(H(G'G'G'G'G'G'G'G'G'E'D&C'D(D(C'B&A%@$@$@$?#>"=!< ;9%]=$\<#^>%bB+eE.fF/fG+sU3rV.rZ.v`/}j2v:@BHJMMLHJKOKEDHJHEFFFDEHOQPT[VLB~<|^bGepRn}\vexjuiwjzmzkyhwfygzh{g|hkosuvw{}ǥͯҶʬҵڕٖ֖՘՚למ۠ߝޛۙךՖДɐ~}|~zxxyzvtpymvkriphofm}bhx^dr\bp^bn]am\`l\^k[]i[]iZ\h[amZ`lX^lV^kX_o[ds^jz`m~cpcrfwj|otxxÎƑɏɕϗіΔ˒Lj}zvtuyzsoxiq~io}nr~txtxntrvv}{z|zxwy{~zywutsstqqpnlkjjk}nrttpk{gwlykxjuhsfqfndlck~]h|\i|\i|[hy[fx[fx[fxZfv]fw]fu_fv^eu]dt[cp[ao[_k^^j][h]Ze^Xb_Wb\U]XNVSIQ.).)-(-(-(/*0 +1!,0 +0 +1!,1!,2"-2"-3#.3#.2"-2"-2"-3#.3#.4$/4$/4$/3#.4$/5%07'27'27'26&17&09%.9%.:&/:&/;'0;'0<(1<(1:&/:&/;'0;'0<(1<(1=)2=*0=*.>+/>+/?,0A-/C-0F-1G.1I/2L/3O13O13Q14P03O/0N./P03P03P03P03P01P01P1/P1/O0.O0-P1.P1.Q2-Q2-R3.R3.T20U31V42W53W53V42U31T20T20T20S1/S1/R0.R0.Q/-R/-Z02\/2\01[/0[/.Z.+Z/)Z/)\1*]2)]2)]3'^4&^4&_5'`4'_3&`2%^2%\0#Z0$W/#W/%U/$S/#Q/#P.$N.#M,#J,"I+!H,!H+#G,#F+"F+"E*!E*!D) D) E*!E*!E*!E*!E*!E*!E*!F)!F( G)!G)!G)!H*"I+#I+#I+#K-%J,$J,$I+#I+#H*"H*"H* K+ K+ J*J*I)I)H(H(G'G'G'G'G'G'G'G'D&D(C'C'C'B&A%A%@$@$?#>"=!< ;:!`A%cD(cD(aB&^?#\=![< [< \=!^?#aA(dD+fF-gH+qS/qU-rZ.vb0l4wCEGILMMLKH~H{EzExF{I{IyJxIvHqFnClBxf@weAtd@rb>p`>l\;hY:fW:_Q6_P9^O:]N;[N=\O>]P@]P@]QA^RB_TB`SB_R?`Q>`O=`M<^I8[E7X@4U:1P3-K.*G(%C'#>';):(9)9)7)7+7+90818183 96#=:'@?+FA-PH5VK7[U?caJjnUr{^vfwhsethwkwiwgwewe{gzf|h~jmsuwx}Ƨΰӷë̮Զޗۙڙؚ؜ٞ۟ܡߜݙٗטӕГʏďÐ}~~~{xvxwts|ovmtjqiohn~djx]cqZ^j[_k\^k\^k[]iZ\h[[g[[gY[g\`lX^jW]kV\jX^nZaq\ev]iydoerfuj{osvvǑ˖ΘД˔ɒƈ}yuuuyyr~nuhn|ekyjnzqurvosptsz{{|ywuxz}|zywtrqqqppomlkjklortspl|iymzlykvhsfqcnck~`k}]j}\i|\i|[h{\g{[fx[fx[fx^fy^gx`gy_fv^eu\cs\br\_n`_m_]j]Yg\Yd]U`ZS[VLURHP.).)-(-(-(/*0 +1!,0 +0 +1!,1!,2"-2"-3#.3#.2"-2"-2"-3#.3#.4$/4$/4$/4$/5%06&17'28(38(37'27&0:&/;&-;&-<'.<'.=(/=(/=(/<'.=(/=(/=(/>)0?*1?*1?*1?,0?,0A-/B.0D.1E/2H/2H/2K14N13P24P24Q12P01Q/0P./P01P01P01P01P01P01P1/P1/P1.Q2/Q2/Q2-R3.S4/S4/S4/V50W40X51X51X51X51W40W40V3/V3/U2.U2.T1-T1-S0,U/,\01]/1]/1]/1]//]0-]0+]0+_2,_3*`4)`4'a5(a6&a6&b7'`5%_4$_4$^3#\2$X1"X0$V0#U1#S2#Q1$N1#M/$K/#J."J."I-"I-"I-"H,!G+ G+ G+ F*H,!H,!H,!H,!H,!H,!H,!H,!G)G)G)H* I+!I+!I+!J,"K-#K-#K-#J,"J,"I+!I+!H* L,!M+!L* L* K)K)J(J(H&H&H&H&H&H&H&G'E'D(C'B&B&B&A%B&A%A%@$?#>"=!< ; =":!9 7778866789 ;";">#E)E(E(F)I)L-N/P1T4V6Z8];_=!_>a> `? Z;\=!_@$aB&aB%_@#]>![<W8Z;]>!`A$cD%fG(iJ+jL*oS.pT,rZ.wc1m8y>CDILPQQOPRONLNOSRSPNKFEISURZbaVG>99:?BGJNOPPNLLJJ~I|I|I{IxIvFsEpBnC|jB{iCxiBvfBscAo_>k\=iZ=aS8`Q:_P;^O<\O>]P?^QA_RB_RB_RB_RAaQA`Q>_N<]L8]K7YD3WA3T<0Q6-L0,G+(E''B&#<%9':(9)9)7)5)5)8/ 6/6/60 63":7&>;*D=-P?/XB4]L)0>)0>)0?*1>)0>)0?*1?*1@+2@+2A,3A,3A.2A.2C/1D02F03G14J14L25N13O24Q35Q35Q12P01Q/0P./P01P01P01P01P01P01P1/P1/R30R30S4/S4/T50T50U61U61X51X51Y62Y62Y62Y62X51X51W40W40V3/V3/U2.U2.T1-V0-[/0]/1]/1^00^00_2/`3.`3-`4+a5*a5(b7'b7'c8'c8'c8'a6&`5%`5%^4$[4%Y2#X2%V2$U4%S3$P3%N2$M1%K1$J0#J0#K/$K/$J.#J.#I-"I-"H,!H,!I-"I-"I-"I-"I-"I-"I-"I-"G)H* H* I+!I+!J,"J,"J,"L.$K-#K-#K-#J,"I+!I+!K*!N,"N,"M+!M+!L* L* K)K)H&H&H&H&H&H&H&G'F(D(C'B&A%A%B&B&B&A%@$?#>"=!< ; =":!9 87789 778:!;"=$>%A&F*H+I,K.N/P1Q2Q2V6X8!\:!]; _="_=!`=!_=![9Z;[< ]>!^?"^? ]>]>X9\>aC!fH&iK'mO+pR.sU1sW0sZ1w_3{g5o:z@CCILRTTUUWTUUXY[]\UTOHHKVYY]eýgaSF>9:@CHKNRSSRQQPQPNM~L|JyIvFtFsEqFpH~oH{lEwgCrb@n_>k\?bT9bS<`Q<`Q>^Q@^Q@`SC`SCbRCbRCbQAaP@_N<\K9ZH4XF2S>-Q;-O7+K2+G.)B('A$&=#":#9%:&:(:(8(5'3'8,5+5+4,5/!74%=7)C7+[@5`B7cI)0>)0>)0?*1@+2@+2@+2@+2@+2A,3A,3B-4B-4C.5C.5C04D13E13G35I36J47L36N47O24P35Q33Q33R23R01Q/0P./P01P01P01P01P1/P1/P1/P1/T52T52U61U61V72V72W91W91Z71Z71Y60Y60Y60Y60Z71Z71X5/X5/W4.W4.V3-V3-U2,W1.Z./[-/]/1^00`22a41b50c60b6-b6+b6)c8(c8(d9(d9(d9(b7'a6&_5%^4$[4#Z3"X3#W3#V5&T4%R5'P4&M3$J3#J3#I2$L1&M1&L0%L0%K/$K/$J.#J.#I-"I-"I-"I-"I-"I-"I-"I-"H* J) J) K*!K*!L+"L+"M,#N-$N-$M,#M,#L+"L+"L+"K*!O-#O-!N, N, M+M+L*L*H&H&H&H&H&H&H&G'G)D(C'A%A%A%B&C'B&B&A%@$?#>"=!; >#;"9 8889 9 89 :!;"=$?&@' C(G+J-O0R3!T5#T5!T3 S3Z7![8"];"^_A`B[=aCiK%oQ+rU-vY1{^4b:~b;}d<f=l=s>{ABACFMQRRUXXXXZ[[[]\YSLJPZ\\_hnlƴ`QEAAEGJNQRSVVUWVXWUSRO~L|J{KzLxMwLuLqJ{kGvfDpa@m^AdV;cT=bS>bS@`SB`SCaSFdTGdRDcQCcPAaN?]J9YG3VD0TB.O:)M7)J4'F/'B*&?'%=#$:" 9":$;%:&:&8&6%3%7)5(2(2*4,!60$;3(C2(hG>jD;eE:cI+1?*1>+1@+2@+2A,3A,3A,3A,1B-2B-2C.3C.3D/4D/4G14G14H25K26L37N38O58Q48P35Q35R46S34R25R01P-1M-0P03O13P03P01P1/P1/P1.P1.U63U61V72V80W91W91X:2Z92[82\71[60[60[60[60\71]82Z5/Z5/Z5/Y4.Y4.X3-X3-X1,Y-*Z.+\..]1.`3.a60d71d90b6+a7+c7*b8(d9)c9)e:)e:)b7'a7'`6&_5%\5$[4#Y4$X4$V5$U5&R5%Q4$O4#M3"L2!L2#N2&N2'M1&M1&L0%L0%K/$K/$J.#J.#J.#J.#J.#J.#J.#J.#H* H* I+!I+!J,"L+"M,#M,#N-$N-$N-$M,#M,#L+"L+"K+ N.#N.!O-!M- N, L,M+K+H&G'H&G'H&G'H&G'F*E)B&A%@$A%B&C'B&B&A%@$?#>"=!#;"`BaE_BeI!nQ'tY,y].}c2g7l=m@mBo?s>w=|??>CFLRTWī[į^³^^`_a`aba^VPLPZ]^`jqukZLHHJJLMLNNQQQSUWXVTTSPNNO}OzOwMtImEzhBscAo`?fW:eWcT?aTAbUDcVFeUFeSGeQFcPB`M>\I:WD3S@/Q>-L7&J4&H2%D-%@($=%#:""9!!8!7#;$:&:&8%5$4#6(5&3&1'3) 5,#90'A0(cE=c>6Z90S8-Q>0UI9[VB]_IekQgpUkuZmxZmw\nwZpy^r{`s}er{fqzepydo{ep|hrkrno~konoqpusxw}~ĩ̵пȥϧֲ╾ޓِԏцʃŁÈ}wvy{}~ytmzhthoemzdjxagueiuaeq\`l[]j[]j[]iZ\hZZdOOYPNYPNYQPXQPXROVSPWRQYOR[OS^QU`SWbVZfW]iZ`n[cp\et]iybmhun~tz|ΓǔɐǒɓˍŅxtwwwunveky`dpceregtegtgiukmynr}ovpyrzr|sux||zxy|zvrnkjjmmlllllnqsvvusp}m}m|l{ixfubq_n\k[j^j^j^j]i^i]h|_g|^f{ai~bjcj}cj}ch{afy_dw`ct\[iWWcRP]NKVMGQIDKE>FA:A- *, *- *-!+.!+/",/",0#-2"-2"-3!-3!-3!-3!-3!-3",3"*3"*3"*4#+4#+5$,5$.6%/7&07&08'18'19'39'3:(4:)3<+3=,2A.4@/5C04B/3@-1?,0C.3C/1E/2E/2F03F03G13I03L25N15N15O05O05O05O05O05P16Q16Q16Q14Q16Q14Q16Q16P16O26P16P24P22Q40Q4.Q4,U7/U7-X7.X7.Y8/Z92[:3\93\50\50\50\50[4/[4/[4/[4/_83^72[4/Y2-X1,X1,Y2-[2,[3+[3)^3,^6,a6-`8.c8/b:.f<0d<0e;/c<-d:,b;,c9+c9+`6&`6&_5%]6%\5$\5$[6$Y6#Z7$W6%V5$U4#R3!Q2 P1M0 N1#N0%N0%N0%N0%N0%N0%N0%K-"K-"K-"J,!J,!I+ I+ G+J."J."J."J."J."K-"K-"K-"J,!K-"N.#P0%Q/%Q/%P.$O/$M-"K-"M-"K-"M-"K-"M-"K-"I)G)J*H*J*F(G'D&B&A'A'A'B(B(B(B(C)C)A'?%=#<": 9="=!<:;:; #>#=%>&@(B*D, H.!G*L+O.S2!T5!T5 S5R4T6W9W<W<U:T9U:W<T8 V:"Z<"Y>![> \B!dH#fM$iN#kS#tZ)zc-k3r8t;v=v>xA}DC>~;98CDJQYî_ƳfȷgȽdù`][_bbab[WVQOV_`dmrsj`YUUUUTTSPHILMMPWœ^[\YTQPQPQ~OzKuIrEmBxe;r`8n^:hY8bT7aS8`TYE:TA3Q>/N;,H5&G4%D1#A-$>*#=(%<'&<'&7"6#7"6#6#4#3"2!3$3$1$2%3& 4)#7,&<-&K7.N6,N8-N<0QC6UL=YSC[XGfgUhkXkp\ns]puapu_ot`ns]px`py^rw`pu^ot^ks\iq\gp]kwcmzhnlppqvw}İ̼ǣҥڧ旿㓹ݎ֌Ћ͉~{{{|~}{vuv{}qp|nwiq~ckx_eq[amY_k]dn]dn\cm[_hX\eTXaQU^PSZKNUMNSMNSMNSMNSMLQMLQLMRKOXKO[LP\MQ]PSbTWfX[jX^l\br`gwdpjwm}ry}ŽĔɖϖӑЍ̊ņzvuspo}eq}blv\doYal\cm^eobfqbfqgnvjqymt~nvnxo{tv}}|}|}|}}|yuqnmlkknopprrrsqqqppol}k|j{izewbt_q]octcrap_n`m_l}`m~`m~bmbmemgohpem`gz[aq[ZhVT_PMXKHQKFMHAHE;CA8=, *, *-!+-!+.",.",/",0#-2"-2"-3!-3!-3!-3!-3!-3",3"*3"(4#)4#)5$,5$,5$,6%-7&07&07&08'18&29'39'3:)3;*2<+1>-3@/5A14@03A.2A.2C/1D02E/1F02F02G13G21I11O05P05P05P05P05P05P05P05Q16Q16Q16Q16Q16Q16Q16Q16P17O27O26P35Q33R51R5/S5+W9/W9/Z:/[;0[:1];2]:4`;5^72_62_62_62_62_62^51^51b95`73^51\3/[2.[2.\3/\3-\4*]5)]5)^6*_7+`8,a9-a9-d<0d<0c;/c;/b:.b:.a9-a:+a7)a7'^7&^7&]6%]6%[6$[6$\9&[8%Z7$Y6#V5"U4!T3 R3!Q1$O1&O1&O1&O1&O1&O1&O1&L.#L.#K-"K-"J,!J,!I+ H, J."I/"I/"I/"J."J."K-"K-"J,!K-"O/$P0%Q/%Q/%P.$O/$M-"K-"K-"K-"K-"K-"K-"K-"G)H*H*I+ H*G)E'D&B&A'B(B(B(B(B(B(C)B(A'?%=#<": : >!= <;:;; #?$@%?'C)C,G- H,J*M,P/S2S4S4R4Q3R7T9U<U<R9Q8Q:S<T8 V:"Z?$\A$^C%bH%iP(nV*t\,w`,~h/o3w8}@CHINU^ijcȷiɺiɾeź`]^ab`ab[VSSTYcehprqjbZYY\^deihʻ\λ\Ϻ]ε[˫VƣRŞQĜTŝX\[YWTRRVSO}NyMsH~kAwe=sc?m_EC:?@7<, *-!+-!+-!+.",/#-0#-0#-2"-2"-3!-3!-3!-3!-3!-3",3"*4#+4#+4#+5$,6%-6%-6%-6%/7&07&08'18'19(29'39(2:)1;*0=,2?.4B/3C04C04C04D02D02E/1F02F02G13I11K12O05P05P05P05P05P05P05P05Q16Q16Q16Q16Q16Q16Q16Q16Q28Q28Q27R44S42T50T6.W6-[:1\<1];1];1^<2`;2a<4a<4`92a82a82a82a82a82a82a82d;5c:4a82_60^5/^5/^5/^6._7-_7+_7+_7+`8,`8,`8,`8,d<0d<0c;/c;/b:.b:.a9-a:+`9*`9(_8'_8'^7&^7&\7%\7%^;(]:'Z9&Z9&X7$X7$W6#U6$Q1$O1&O1&O1&O1&O1&O1&O1&M/$M/$L.#L.#K-"K-"J,!I-!K/#J0#K/#K/#K/#K/#L.#L.#M-"N.#O/$P0%R0&R0&Q/%O/$N.#L.#L.#L.#L.#L.#L.#L.#H*I+ I+ J,!I+ H*F(E'C'C'C'C'C'C'C'C'C'B&A%@$>"=!;;; ; :99:<= A%A%B&C)F*F,H,H,K+N-Q0S2S4R3Q3O1Q6S8S:R9P7O6O8R;T9X= ]B$aG&eK(kR*rZ.w_/h4l3q7y:?AEFJKJHGHNRPSXñ]Ƕd˺hͼjξiͿgɻcĵbbaa^[\VPRW\cjknrrpjc\__dgoszwvvyvndճZҬYѪ[Ψ_ȥccca`_[ZZZXzSpM|iHxhGrcDm]Ci[Ag[Ag[CeYCeUEeSIdOJ_KDZF=T@5O<.K8)H5&G4%F3$B.#?+"<(!:% 9$#9$#5"3 1/./012#2#2%3& 4'!6)#7,&:-%E4,G5+F5+G9.J>2LD7QI-3B/3C04D15E26D02E13F02F02G13H24J22K12P16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16R18R38S36T45U64X72Y81Y9.\<1];1];1_:1`;2`;2`;3a:3`80`80a91a91a91b:2b:2b:2f>6e=5d<4c;3b:2a91a91`80a9/a9-a9-a9-`8,`8,`8,`8,d<0d<0c;/c;/b:.b:.a9-a:+a:+`9(`9(`9(_8'^9']8&]8&]:']:'Z9&Y8%Y8%X7$X7$V7%P3%P2'P2'P2'P2'P2'P2'P2'O1&N0%N0%M/$M/$L.#L.#L.#K/#J0#K/#K/#K/#K/#L.#L.#M-"N.#O/$Q1&R0&R0&Q/%Q/%N.#L.#L.#L.#L.#L.#L.#L.#I+ J,!J,!K-"J,!I+ G)F(E)E)D(D(D(C'C'C'A%A%@$?#>"< < ;::989:<=!B&C'F(G)I+ I,J-I,N-O.R1S2S4Q2P2N0P4R7R8P7N4N5O7R;V<aG"gN&kR)qY-x`0}f2l3o3u6{8>BFHQRRRQU[ų_ñ[Ƶ]ʹaνeikkklͿgȷeòdc_[WVQNRYdmqppsqnjdadeehlpso|~{qmdݺfճi̮hĨikkk^^_`_[uTmOziMveKp`Gl^Dl]Fi]EiZEgXEgUKeQJ_KBYE:R?1L9+H5&F3$G4%E2$B.#>*!;' 9$8# 8#"5"2/-+-/12#2#2%3& 5("7*$6+%9,$C2*C2(B4)C7+D:.G?2KC6JG8LI:OP@YZJcfUko^pweszhu}huzctz`pu^lqZinXdlUbjU`iVep_ivdn|kqquzzǼʢ֥߈։׍۔搼ߍۊքɁdžLjDŽ}{yutrrrprsss~t|t{r{p}ortvtt~r|mulr~jnzfjuaco]_k[[gWYeSV_SV_RU^OR[NNVJJRGGOFEMGFLGDKGEJGEJFDIFDIHCGEDIHKTHLWKMYNP\RTaUWdXZiZ\kbdsdjxjqmyq~v|—Ö”ÕēĒÎ|wqnmn~n~nziufpzcmwdlwemxelvdkucgpfjsjnylp{kqnvszw{|~~}zxtpmngyhxgwgxgxixjyjzkxkylylylyk{k{k{gvfwgxgzfxewcucvfwevbs_p^n~]m}]m}]m}_l}_l}al~dogrfqdlahz]_l_]h[XcQNWGBI?8?>4<>5:-!+.",.",/#-/#-0$.1$.1$.3#.3#.4".4".4".4".4".4".4#-5$.5$.6%/6%/7&07&07&08'18'18'19(2:)3:)3:)3;*4:)1;*0>+1?,2A.2C04F16G27F03F03F02G13J14J14J22L23P16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16Q16S38T49V37X65Y75[82\:1];1];1_;/_;/`:/`:/`:/_90`80_7-`8.`8.a9/a9/b:0c;1c;1g?5g?5g?5f>4e=3d<2b:0b:0b:.b:.b:.b:.a9-a9-a9-a9-d<0d<0c;/c;/b:.b:.a9-a:+a:+`9(`9(`9(^9'^9']8&\9&[8%[8%X7$X7$W8$V7#V7#V7%R5%R5'R5'R5'R5'R5'R5'R5'P3%P3%P3%O2$O2$N1#N1#M0"L0"L0"L0"L0"M0"M0"M0"M0"N.!O/"Q/#R0$S1%S1%T0$Q/#O/"O/"O/"O/"O/"O/"O/"O/"L,M- M- N.!M- L,J*G)F*F*E( E)D'C'C&B&@#@$?">"= < <;:777:; >"?#E'F(J*L,M- M- M+L+N-O/R2S3S4Q2P1N/P4Q5Q7P6N4O5Q9U>[A`HgO#mU'rZ*xa/~g1m3q5t3x580L9+H5&G4%H5'F3%C/$?+";' 9$7"7"5"2/-+-/11"2#2%4'!6)#7*$6+%8+#?1(@2'A3(B6*C9-E=0H@3FC4JG8KLED?EE@FGBHHCIJDHHFKJJRILUOOYSS]WWcZZf]\j\^kbdqfjvkqoyr~v|ÚŚŗėĘŗÔ|{ywrnmn~n~o{kwhr~fp|hp{hp{hnzimxehqhktkmykozlo~msrwu|z{~|yxtpnm}iyixhwfufuivjwkxhthtiuhvivjwjwiyfvfwgxgxgxexdvcvfwevcsaq_o^n~`m~`m~bmal~al~dohphpembi{_an__i[YdROXHCJ@;A>7>>7>.",.",.",/#-0$.0$.1$.2%/4$/4$/5#/5#/5#/5#/5#/5#/5$.5$.5$.6%/7&07&07&08'1:)3:)3:)3;*4;*4<+5<+5<+3<+1<+1>+1?,2@-1B/3E05F16F03G14G13H24J14K25K33L23Q27R27R27R27R27R27R27R27Q16Q16Q16Q16Q16Q16Q16Q16V39V37X67Y76\95]:4^<3a=1a=1a=/b<1a;0a;0b:0a91a9/`8,a:+b:.c<-d<0e>/e=1f?0h@4hA2h@4hA2g?3e>/c;/b:.b:.b:.b:.b:.c;/c;/c;/c;/d<0d<0c;/c;/b:.b:.a9-a:+`9*`9(_8'^9']8&]8&[8%[8%Z7$X7$X7$X7$W8$W8$W8$W8&S6&S6(S6(S6(S6(S6(S6(S6(R5'R5'Q4&Q4&P3%P3%O2$O2$L0"L0"L0"L0"M0"M0"M0"M0"N.!O/"R0$S1%S1%S1%T0$T0$P."O/"O/"O/"O/"O/"O/"O/"M- N.!N.!O/"N.!M- K+J*H* G*"F)!E( D'C&C&B%?"?">!>!= <<<8 8 8 8 ; ="?#B$F(J*M+Q-!R."Q-Q+N*L,N.Q1S3S4R3Q2O0P4Q5Q7 Q7P6R8V>$ZC#`GfNoX&v_-|e1k5r8w;~=<=?BEIKOSVY[°\ɷaνeikmpsrrqrѿmɳg_[VSPQSQS\kuwwutspljgffefhknmv|}zvnϸh¬c`_bbcdc_Z{WrRnS}iP{gOxfPvdNr`Jo]ImZKhUGbOAZG9S@2N;-K8)J7(J7)H4)D0'@,#<'"9$7"7"5"3 1/./010!1"3& 5("6)#7*$6+%6,#9@@9AA:AD=DF?FIBIMDIKFLIHPHKTNNXSS]WWc[[g^\i^]kcbpeiujp~owr~w|šƚƚęÖ{vvvxtqmm}n~nzkwishr~ks~ltkq}lp|hjvllvlnzlnzln}mpqtsxy{}|yvsol|l{jyhwhufserfsitjvdp~eqeqfrgsgthuhuhugwhwgxgxfwevduductcsaq`p`pbocpdocnbmdohphpembi{`bo__k[YdRP[JGPE@GB;BA:A.",/#-/#-/#-0$.0$.2%/2%/4$/4$/5#/5#/5#/5#/5#/5#/5#/6$06$06$07&07&08'18'1<+3<+3<+3=,4=,4>-5>-5>-3@-3@-3?,2>+1@+0B-2E.4F/5G14G14I03J14K14L25L23O24Q27R27R27R27R27R27R27R27Q16Q16Q16Q16Q16Q16Q16Q16V37X46Y55[86_96a<4b=4d>3gA4gB2g?3g?3f>2g=1g<3d<2d=.d?-e@0fA/gB2hC1iD4jE3gB2gB0hC3hC1gB2e@.c>.a<,`:-`:-a;.b1d>1e?2c=0c=0b > > ==<9!8"9!9"=#>$A%D'J*L+Q-T.!U/"S.R+O*M*M-P0S3S4S4R3Q2P4R6 R8!R8!R8V<#[C'`I'eMlU!v_+h2q8x>CFHEDCBCEGOQRTVYǷ`ξfknruxvsrpιj«_WRNJKQVVUZhvxwuvurnljggfgjotv{߀~wp̻iŵgefcdea^\V{VuVpSmR~hPxbKr]Hq\KjWHcPA[H9UB3Q>/O<-N;,K8*I5*E1(A-$=(#:% 8#7"5"5"4!3 2!2!2!2!0!1"3&5( 7*"8+#5+"5+"9/%;1%>4(A7+E;/G=1IA4IC5KH9KLHC;F?8@A7@C9AE;CG=EI?GLAGJCJDCIFFNLKSQPXVT_YWb\Yd\Zgbbnegsko{nvs}w}™ěėzvsstyxtom}m}lxiuisismunvntnr~kmyoo{pp|mo{ln}kn}orpux}{|{xtrn|kzlxiugtepbn~am}co}gphqcl{dnzen}fo~gpfrgsgtivjwkxiyhwgvetdsdtcsdqcpcpdqfqfqiqgoemfnhohoelch{`cr\^jXXbRP[NKTIFMGBHD?E.",/#-/#-0$.0$.1%/2%/2%/4$/4$/5#/5#/5#/5#/5#/5#/5#/6$06$07%17%18'18'18'1=,4=,4=,4>-5>-5?.4?.4?.4B/5A.4?,2>+1@+0A,1D-3E.4G14G14J14J14L25L25M34O24Q27R27R27R27R27R27R27R27Q16Q16Q16Q16Q16Q16Q16Q14X46X44Z75\95`;5a<4d>3e?2kF6kF6kD5jC4kA5j@4j@4h@4gB2gB0hC1iD2kF4lG5mH6nI7fA/gB0hC1hC1gB0e@.c>,a<*_9,`:-a;.b > > > > ==< :":#:#<">$A%D'G'K*O+S- V/ W0!W-T*P*L)L,O/S3T5 T5 S4 R3P4R6 S9"S9 T:!Y?$_H)dN)gOoY {e,p7y?EKQMIFA@?@@QRPOPWƶaξgnouxyxutӼlʳeZPJGEEPXZTXhtwutvuuqmjihgilpux}؃|xǽhĹgdab_\ZVW~UyTrRkO{cIv]Gr]HkYEdR>]J9WD3S@1Q>/Q>0M9.J6+F2)B.'=)":% 8#8#6#6#6#6#5$4#3"2!/ 1"3&6)!7*"8+#5+"5+!9/#;1%>4(B8,F<0I?3JB5JD6KH9KLFJ?EI?GB?FDCKIHPNMUTQZWT_YVaYVab`mffrjnyous{x}Ŗvr~r~rqtzzvpm}l|kwhthqjtnvowouptmo{qq}qq}po}ln}ln}nqqty|{~zxvr~o{lxkvgrgocl}`ix`ixbjwdlyfn{ckxckxdk{dm|fo~gphqgskvkxkxkxjwfudscrbrbrcpcpcpergrhsjrhpfnfnhogndk~bgz`cr[]jVVbQQ[QNWNKTKFMGBH0$.0$.1%/1%/2&02&04'14'15%05%06$06$06$06$06$06$06$26$27%38&29'3:(4;*4;*4<+3=,4>-3@/5@/5@03?/2?/2B/5C.5C.5C.5D-3D-3D-3D-3I04I04K14K14L25L25O24O24R38S38S38S38S38S38S38S38R27Q16P05P05Q16S38V6;X8;[79[77\97^;7b=5c>5e?4f@3fA1hC1lE4mF5oE7nD6kA3g@1kF4jG4jG4jG4jG4jG4jG4jG4gD1hE2hE2gD1fC0dA.b?,`=*c?1c?1c?1c?1d@2d@2d@2d@2c?1b>0b>0a=/`<._;-_;-^:*\8(\9&\9&\9&\9&\9&Z9&Z9&]<)\=)\=)Y=(X<'X<'X<'W;&V9)V9)V9)V9)V9)V9)V9)V9)V9)V9)U8(S6&R5%Q4$P3#O2"Q4$Q4$S3$S3$S3$S3$T3$T3$[7)[7)Z6(X4&X2%W1$V0#T0"S2#S2#R1"R1"Q0!Q0!P/ P/ V5&U4%T3$R1"P/ N-M,L*N.#M,#L+"J) H'F%E$D#E$E$D#D#C"B!A ?!>$>$>$?%C'G*M-P/ V2$X3#Z5%[4#[1!Y.U*Q(L*P1V6Y9"W8#U6!U6"U6"S7!S7!S9 W="\C%bI*fO-hR)mV"v`&m3y?ELOSQJB;:;AGEGINT[_Ŷa̼eiqvvrӾk͸gƯa[SJDCFIPVYZ[`mvyx|}{vspnliijntz΅ςҁچ܁|vnøf`ZWTX~UnL}dF{cIvbJm[EbP:ZH4VC2S@1P=.N;-S?4M9.E1(@,%>*#=)"<'":% >+$>+$>+$?,%?.&<+#6%1 3%1#1$5(;.%@3*=3)<2(91$=5(A9,C;.E;/H>2KC6NH:LI:OM>TWFZaObnZkxdqkuotmq~jmzfkxflwfmziq~msr{~ǞҦߪ䌵ӂȀƃɇ͉ёڎي҇υxrhlptx{|yur}qypwmrlomo~qsvuwutsprnr}np|lnzkkwggqecncal_\g`Zd^Va[T\[QZZPYZNXYOXTLWSMYSKXRJWPHSNFQNDOMCNF:DE9CD9AD9AE8AF9BG:AF=BHCIHELJGNMJQSNUVPZXR\WT]_]hccmhktlp{nwq{ux|v~u~wywsx{utuqiylxiuhqirnupxqwqutvuutssroqmo~lmknqtwy}xsq|q|p{lwkshqcjzZaqRZgQYfU[g\bn`fr_eq_eq_es_gtbjwdlygn~hqlujvjvkwjuivhugtererererfqfqfqfqhpgoelcj}ah{_fy_dx_dw`cr]_lXXdTT^SPYPMVNIPKFM0$.0$.1%/1%/2&02&04'14'15%05%06$06$06$06$06$06$06$26$27%38&49'5:(4;*4<+5<+3=,4?.4@03@03@03?/2A.2C.5C.5C.5C.5D-3D-3D-3D-3I04I04K14K14L25L25O24O24S38S38S38S38S38S38S38S38R27R27Q16Q16R27T49V6;X8;Z87\97]:6^;5b=5d@4eA3fA1fA/hC1lE4mF5mF5nD6kA3g@1kF4jG4jG4jG4jG4jG4jG4jG4hE2hE2hE2hE2fC0dA.b?,a>+c?1c?1c?1c?1c?1c?1d@2d@2c?1b>0b>0a=/`<.`<._;-_;+]9)]:']:']:']:'[:'[:'Z;']>*\=)Z>)Y=(Y=(X<'X<'X<'V9'V9)V9)V9)V9)V9)V9)V9)V9)U8(T7'S6&R5%Q4$P3#O2"R5%R5%T4%T4%T4%T4%U4%U4%[7)Z6(Y5'X4&X2%W1$V0#U/"V2$S2#S2#S2#R1"Q0!Q0!Q0!V5&U4%T3$R1"P/ O.M,M,N.#M-"L+"J*I(G'F%E%F%E%E$D$C"C#B!@"A%A%B&C(F)K+P/ S/X3#Y4"[4#^4$]2"Z/X*S*N,Q2V7X8V8 T5 T5!U6!Q5S7T:X? \D"cK'iS,mX+xa+j.v7@FJMNNJB=/O<.S?4M90E1*@,%>*#>*#<'";' >+$>+$?,%A.'A0(>-%7&2!5'3%2%4'9,#>1(?5+?7,?9+C=/GA3IA4KA5LB6NF9QI-5?.4@03A14A12@01A.2C.5D-5D-5D-5D-3D-3F-3F-3J/4J/4M04M04N15N15O24O24S38S38S38S38S38S38S38S38R27R27R27R27S38U5:W7/_>/_>/^=.^=,^:*^;(\;(\;(\;(\;(\;([<(]>*[?*[?*Z>)Y>)X=(X=(X=(W:(W:(W:(W:(W:(W:(W:(W:(U8&U8&T7%S6$R5#Q4"P3!P3!U6$U6$U6$U6$V5$V5$X4$X4$Z6&Z6&Z5%Y4$Y2#X1"W0!V1!W3#W3#W3#V2"V2"U1!U1!T0 X4$W3#V2"U1!S/Q-P,N-O/"N.!M-"K+J*H(G'G'G'F&F&F&E%E%D$D$F)F)G*J+L-P/S2!V3 Z5#\6#_6$_6$^3"[0X-U,Q/R3W8X8U7T6T5 U6!Q5U:Y@!]E!`I gP&q\-ye2r6y8@FHIKJHFCAADHKWWXZ\^`aɺeʺeʸdɷcɴaȳ`DzaƱ`[ZXVQMIEJNSTW^jqtuz|~|ywurlecccempv|̓׉؀ƽpbYOwLuOmMudHiX>_M5YG3UB1R?0P=/R>3M90E1*@,%?+$>*#=)"<(!=*#>,"A/%D2(E4*A0&:)4#6(6(5)5)7+<0$A7+E=0GD5JG8QK=RL>SK>RJ=UK?VNA[UG[YJ_bQelZkxdsmwt{x|z|xyvvsvuyx|}|x~z~Ěϡܧݎ·ƃ~}~ÇƆʇ˅Ȁyrnmehou{{trzpxpwouornpnp}qp~sssq~qq{ps|or{mpyjmthhpcck`_g_\c\W^[V\ZSZ[QY[PX[PV\QW[QYYQ\XR^WQ]UO[SKVOGRLDOJBMF-3?.4A14A12A12@01B/1C.3D-5D-5D-5D-3D-3F-3F-3J/4J/4M04M04N15N15O24P24S38S38S38S38S38S38S38S38S38S38S38T49U5:V6;W75aA6cB3dC2eE0fF1iF0jG1lH2lG4kF3jE3iD2kH5iH5iH5iH5iH5iH5iH5iH5fE2fE2gF3gF3fE2eD1cB/bA0bA2bA2bA2a@1a@1a@1`?0`?0`?0`?0`?0`?0`?0_>/_>/_>-`<,`=*^=*^=*^=*^=*]>*]>*\@+\@+\@+[?*Z?*Y>)Y>)Y>)X;)X;)X;)X;)X;)X;)X;)X;)U8&U8&T7%T7%S6$R5#R5#R5#W8&W8&W8&W8&X7&X7&Z6&Z6&Z6&Z6&Z5%Z5%Z3$Y2#Y2#Y2#Z5%Y5%Y5%X4$X4$W3#W3#W3#W3#W3#V2"U1!T0 R.Q-Q-P/ O/ N.!M-L,J*I)I)I)I)H(H(H(H(H(H(N-N-O.Q0T0 V3 X5"Z5"]7$]7$`7%_6"^3 \1Y.W.T2U6X9X9U7T6V7"X:"V; ]B$cK'hQ(kT(r\+~j5u:=?EHJJKLHGGGHKNP[\^^`c¸cĸb̽hʼd˹cȶ`ȴ^Dz_Ʊ^Ʊ`\^^\ZTONORVX[cmrvvy}||yvvrjba____ekqu{̂ӇܐنugYSuQ{jLn]AaP6ZH2UB1Q>/O;0R>5L8/E1*@,%?+$?+$>*#=)"=+!>,"B0&F4*G6,D3)=,"7&5'8*:.":.";/#>2&B8,F>1LI:PN?WTE\VH\TG\TG]SG^VI_YK`^OcfUip^n{gsowvzy~}}||yzwzyz}}~y}̟٥Ꮾˁ||}Àă|unmmhkoty}vrzoxovovouptproq}qq}qq{qozooyps|orympwilsffnabg^]c\Z_YTZXSYXQXYPUZOU[PV\QW\RZ[U_[Ua[UaYS_UOYQITMEPJBMG=FF-5?.4@/5A14B23B23A11B/1C.3D-5D-5D-5F-3F-3G,3G,3J/4J/4M04M04O05O05P24P24S38S38S38S38S38S38S38S38S38T49U5:V6;W76]?7^@5`C5cD2eF2eF1fG2gG0hH1kI0kH2jG1iF2iF3iH5iH7iH7iH7iH7iH7iH7iH7fE4gF5hG6hG6hG6gF5eD3dC2dC4dC4cB3cB3bA2a@1a@1`?0`?0`?0`?0`?0`?0a@1a@1a@/_>-_>+_>+_>+^?+^?+^?+^?+]A,]A,\A,[@+[@+Z?*Y@*Z?*Y=(Y=(Y=(Y=(Y=(Y=(Y=(Y=(V:%V:%V:%U9$U9$T8#T8#T8#X9%Y8%Y8%Y8%Y8%Y8%[8%[8%\7%\7%]6%\5$\5$[4#[4#[4#\7%\7%\7%[6$[6$Z5#Z5#Z5#X3!X3!W2 V1U0T/T/R.Q0Q0P/ O.N-M,M,L+M,M,M,M,M,M,M,N-T0 T0 W2"X3!Z5#[6$\7%]7$^8%^8#^8#]7"]4 [2Y0V0W5W8Y:X9V8 V8 Y;#\>&_D'gM,pY0v_3zd2m6y>B@AFIIIJLIIIKORUV\\^aeûfȾggiiihѽfκdͷbʶ`ǷbŶcŴbija`]][Z]``diptvvxz{wtrtnf````^X]dgkpuzُ͆ߔ֍ĀlaXuStcEfU9[I1UC/P=.M9.R>5L81E0+A,'@,%@,%@,%?+$=+!>,"B0&F4*H7-F5+@/%:)3%8*=1%@4(A5)A5)B8,DEF>F?>DA@FAAIJJVNP\WYf`bogivjnzjm|hn|iohn~gm}fm}fmhojqjsgrgriqiqiqiqjqjqjojojoinikfh}cezadw]csY_mW[gUWdXXdWWaVU]TS[0$.0$.1%/1%/2&02&04'14'15%05%06$06$06$06$06$06$28&68%89&9:':;)9<*8=+7>-7>-7?.4A06B25B23B22A11C02C.3D-5D-5D-5F-3F-3G,3G,3J/4J/4M04M04O05O05P24P24S38S38S38S38S38S38S38S38S38T49V6;X8=Y9>Y9>Y9>Y9:[>:\?7]A6^B6aD6bE3dH3fH0gI1gI1hH/hH/hH1jG1jG3jG3jI8jI8jI8jI8jI8jI8jI8jI8fE4gF5hG6iH7iH7hG6gF5fE4gF7fE6fE6eD5dC4cB3bA2a@1`?0`?0`?0a@1a@1a@1bA2bA0a@/a@-a@-a@-`A-`A-`A-`A-^B-^B-]B-\A,\A,[@+ZA+ZA+Z>)Z>)Z>)Z>)Z>)Z>)Z>)Z>)W;&W;&W;&W;&W;&W;&W;&W;&[:'[:'[:'[:'[:'[:']:']:']8&]8&^7&^7&^7&^7&^7&^7&_:(^9'^9']8&]8&\7%\7%\7%X3!X3!W2 W2 V1U0U0T1T0 R1 Q0Q0P/O.O.O.P/P/Q0Q0R1 R1 R1 U1!W2"Z3$[4#]6%^7&_8'_9&^8%_9$^8#]7"\6!\3[2Y0V1Y7Y:Z;Y:W9!Z<$_A)cE+iN0qW4{d:m}@DF@@FHGGKMKKKMPSWYZ\_b¼fijjjjklliӾeмeϿh;i̽h˼g˺h˺hɺgʻjƹjĹjiikosuttvvvtqnnf`\_`a_Y\`dfgjklt~ǃ͆Սۏud^oNm\@`N6XF2R?0N:/R>5L81E0+A,'A-&A-&A-&@,%>,">,"@.$D2(F5+F5+B1'>-#4&9+ ?3'D8,F:.F:.D:.C;.KI:QRB\ZKdaRgaSg_Rg]Qf^Qd\OdaRfiXir_n{gqnttwyy{z|z{yzy|yzyęΛמጩ}xz}}}|{yvroopppqrssqs}}wq|pynwovpxqwsyuyswps|mpynnvlovmrxmrxkpthmqdglbcg_^c\[`WUXVTWXSWXRTZQT[RU^SW[UY\Yb\Ze^[f]ZeZW`UR[RLVNHRKDLJCKHAHF?FG=EG=EG>CH?DF@BF@BH?BI@CK@FK@FKBGKBGQGORMSVSZZ[`_bgglpov|v}yvrtz}xvxvvvs|qxovqwrxrzqypxnvmukskqjp~ntoupvqwtwtwuxuxpuqvrumpehy]`oY[hWYeOO[LLVHHPCDIA@F?>D@?E@?GFFPKKWRTa\^kcergivgjyhkzil}fl|ek{djzdk}gnipjsjrhsjrjrjrjrkrkrkplqlqlqlnhjeg|bex_dw[aqX[jVZfYYeXXdWU`UT\0$.0$.1%/1%/2&02&04'14'15%05%06$06$06$06$06$06$28%89&::':;(;<*:=+9>,8>-7>-7?.4A06B25C34C33B22C11C.3D-5F,5F,5F-3F-3G,3G,3L/4L/4M04M04O05O05P24P24S38S38S38S38S38S38S38S38S38U5:W7Z:?Z:?Y9>Y9:\?;[@7\A6^D5aF5bG2cI2eI1fJ2fK0hJ0gI/gI/iI0iI2iI4jI8jI:jI:jI:jI:jI:jI:jI:gF7gF7iH9jI:jI:iH9hG8gF7iH9iH9hG8gF7eD5dC4cB3cB3_>/`?0`?0a@1bA2bA2cB3cB1bA0bA.bA.bA.aB.aB._C._C._C._C.^C.]B-\C-[B,[B,ZA+[?*[?*[?*[?*[?*[?*[?*[?*Y=(Y=(Y=(Y=(Z>)Z>)Z>)Z>)\;(\;(\;(\;(^;(^;(^;(^;(_:(_:(`9(`9(a:)a:)c9)a:)`;)`;)`;)_:(^9'^9'^9']8&X3!W2 W2 W2 V1V1V1U2T1R1R1R1Q0Q0Q0Q0S2T3 T3 U4!V5"V5"W6#Y6#Z3"]3#`6&a7'b9'b9'a8&a8&_9$^8#\6[5Y3X2W2U1[9Z;[< Z;Y;#]?'dF,iK/oU4v\7k]K7VC4R>3Q=4L81E0+A,'A-&B.'B.%A-$?-#>,">,"A/%D3)F5+D3)A0&:,!;-"=1%B6*G;/I=1G=1DC?>DCCMHHTPP\YYe_ancerfhueiuhkzgjyciybhxdjzgm}ipjsjrhsjrjrjrjrkrkrmrnsototnpkmgi~dgzafy]csZ]lX\hZZfYYeWU`US^0$.0$.1%/1%/2&02&04'14'13&05%05%05%05%25%05%25%29&99&9:':;)9<*:=+9>,8>-7?.8B.7C06D15E24E33D22C11D-3D-3F,5F-3F-3F-3G,3G,3L/4L/4M04M04O05O05P16P24S36S36S36S36S36S36S38S38S38U5:X8=Z:?[;@[;@Z:?X::\?9\A6]C6^D5aF5cH5dI4dJ3gK5fJ2fJ2eI1gI1hJ2hJ2iJ5jI8jI8jI8jI8jI8jI8jI8jI8gF5hG6iH7jI8jI8jI8iH7hG6kJ9jI8kG7hG6hD4eD3fB2dC2a=-`?.b>.a@1d@2cB3eA3dC2cB1bC/cB/bC/bC/bC/`D/`D/`D/_C.^C.^C.]B-[B,\A,\A,[?*[?*]>*[?*]>*[?*]>*[?*\=)Z>)]>*[?*]>*[?*^?+^?*]=(]=&_<(_<&_<(_<(_<(_<(`;(`;(b<)b<)b<)b<)c=*c=*b<)a='`<&`<&_;%_:'^9&^9&W2W2W2W2W2V3V1U2U2S2U2R1T1R1T1R2W4!V6!X5!Y6"Z7#[8$[8$]8%]3#_4$b7'd9)d9)c:(b9'a8&^8#]7"\6!Y5W3V2U1T2Y:Z;[< [< [=#_A%gI-mP0qW2x`4m;{BHIFAABDFEDGKLMKJLPUXZ]`cfhhfhhhhhgghnqsuvvuvyxusp¿pnmijnprqpof]XUY\][heddeb]ZSYbkt|ňύޙ杼܋ƀyp^~nLp\AdP8\G4XB4Q=2L8/E1*B.'A-&B.'B.%A-$?-#<,<+!>-#B1'C5*E4*A3(>0%<0$;/#@4(F:.J>2I?3E?1MKBA;BDBMGGSNNZVVb\^jacpdfsegtgjyfixbhxagwciyfl|ipjshthththtjrjrjrjrmtnuovounsjofkch|ahz]dtY_oX[jXZgWYeVVbTT^6+35*23(02'/1&.2'/2&03'13'34&33%23%22$32$11#21#26%78%88%89'7<'8=(7>*6?+6@,7B-6D/6E05F16G35G14G14G14G14H/5H/3G.2G.2G,1G,1L/4L/4M05M05O06O06P17P16O11O11P22P22Q33Q33Q35R46R46S57T68V8:W8=Y:?Z;@[==\?7\@4^B6`D8bF8cH7eJ9fK8eJ7eJ7eJ5eJ5fJ5fJ5fJ5fJ5jK7kJ7kJ7kJ7kJ7kJ7kJ7kJ7iH5jI6kJ7lK8mL9nM:oN;oO:nK7oL6pL6oL6oJ7lI5kF4iF3gB0fC0gB0eA1fA1d@0e@0d@0aB0`C1dE3dG5eH6eH6dG5dG5bE3bE3bE3bE3`C1]B/\?-[?*_@,_@+`@+_@+`@+_@+`@+_@+]=(\=(^>)]>)_?*^?*`@+`@)\:];_;!`=!`<"_;!^: ]9b>&c?'d@*d@*d@*d@*c?)c=&c>$d?$d?$d?$b?#_;!]9[7[9 Z8Y6 X5X5W7 Z7#Z7#X5!W4 W2V3W2X5!\7$\9#c>+_<&_;%`<&c?)fB,eA)e?*e:*h:-i;.h=-g<,e:*b9'`7%`:']8%[6#W4 U2S0S0Q1U5Y9"^>%aB&bE'fI)jP+nU,u]-j6~CNQPOLEGLMMORUQOLJJPUZX\Ʒbɻc˽dξfgjgikjikou{}|}||{{zzwtpſkfdceimrsqobYSPW_`_feghhea\USW^djzˉؑ垺죺固ڑϊ}ra|QzfClW8dN6`I7YC5R?1K9-G5+F2)D0'B+#=) <,;.=/"@2%B4'B6(D6)C7)?3'=3'=3)>4*A7-E;1H>4GA5LJ;ORAYZHcbPfeSebOb\L\YHfcThfYkm`psht|oyx~~~~~}}||y|ƞϡ֡ݠړwlxkzn~tyzywvuvvvsrsssrqpoptvwurstxxw~szqxtyw}{~|}|~y{vuqq}kmyhoyhqxipxipximvgjsffncckb_h_\e]X_[T\[QZ\R[^S[]V^YVaYWd[Yd\[c[X_XV[XSWWQUSMOSJKRHIPFGNBFMAEL@DK?CL@DL@DL@DK?CK?CH=AG<@F=@E*6>*5A,5B-6E.6G06H17H17J15I04G14G14H/3H/3G.2G.2G,1G,1L/4L/4M05M05O06O06P17P16P22P20P20Q31R44R44R44S55S57T68U79W9;X9>Z;@[>\?7]A5^B6`D8bF8cG9eI;eI;eJ9eJ9eJ7eJ7eJ7eJ7eJ5fJ5iJ5jJ5jJ5jJ5jJ5jJ5jJ5jJ5jJ5jJ5kK6lL7mM8nN9oO:oO8qM7qM5rN6qM5pL6nJ4mH5kF3jE2jE2iD2iD2hC3hC3gB2fB2aB0`C1bE3cF4dG5dG5cF4cF4aD2aD2aD2aD2`C1^A/\?-[?*_?*_?*_?*_?*_?*_?*_?*_?*\<']=(]=(^>)^>)_?*_?*_?(`=!a> b?!b?!b?!b?!a>"`=!c?%c?%eA)eA)eA)eA)c?'c?%d?"eA!eA!e@#c@"a> ^;]:^'gA*hB+iA(g>(k=-l<.k=.j<-f;+c8(`7%^5#Z4!X3!V1S0Q.O.O.O.V5"Y9$]=&_@$`C%dH#iP'nV&j6vAE?AJFGOMNVTU[[[bbbjjjpprxu~ut|srzrrzqtysx|t{ty{Î}{yywtpxnuowpzp|p{n{lyjwhuftfr~eq}dnzdnzfm}gn~ipjqkqlsnsorkl~dcuYVgQM\NEVMERODRRFPSGQQGONEJJDFJDFKFJGFNGGQJJTNNXRU^Y\e^bmaep`dp`dp_es`ft`huaivaiv`jveq}es~ftguhvgtfsfsjwkxlxlxkwiugsfrbm_k{^gv\fr]cqY_kVZeRVa5*04)/3(01&.1&.1&.2&02&04(43'33'32&22&41%31%32$35$46$47%58&6;&5<'6=)5=)4A,5B-6E.6G06H17H25J15J15G14G14F03F03G.2G.2G,1G,1J/4J/4M05M05O06O06P17P16Q33R42R42R42S55T66T66T66U77V88W9;Y;=Z<>\>@]?A^@>]@8^B6_C7`D8bF8cG9eJ9eJ9fK:fK:fK8fK8fK6fK6fK6gK6iJ5jJ5jJ5jJ5jJ5jJ5jJ5jJ5kK6kK6lL7mM8nN9oO:pP;pP9sO9sO7tP8tP8rN8qM7oK5nJ4lG4lG4lG5kF4kF4jE3jE5iE5`A-_C.aE0bF1cG2bF1aE0aE0_C.`D/`D/`D/_C.]A,[?*Z>)_?*_?*_?*_?*_?*_?*_?*_?*\<'\<'\<']=(]=(^>)^>)_?(b?#c@"dA#eB$eB$dA#c@$b?#d@&d@&fB*fB*fB*fB*d@(d@&fC'fC%fC%fC'eB&c@$a=#`<"a?&`>%^<#[9 Z7!Y6 Y6 Y6 [7![7!]7"^8#`:%b<'e?*f@)nE/lC-jA+kB,mE,mE,lB*j@(oB/nA.m?/j<,e:)a6%\2"Z0 V/T/S.Q-P-Q.P/P/Y8%[;&^>'aB&cF&iM(rV.y^/yCGOWYXXWONSSRSSSWUPNPSVXWƲY̸_ϻbѽddghhjljihnrz{{zxvvvw{~}{rkgdefjnnlk_WNKPW[[^afmonhbYT~}Q|}QySxT^gx֖̍ۚޝ䢸駺饼馿騿㣹ܜԕ̐xg|U{hHp[@jT?cN;\I:SA3N<.M:,L9+L6+H5'A1"@3#A4$D7'E9+G;-I=/J>0KA5I?3F<2C9/B:/E=2JA8MG;RPCSTDYXF^]Ka`LcbNebQdaPdbSfgYkm`rulv{txxvzuw~~~|z~zvxy~ÖʘӘژ匪Ёwjrirnwoyq{s}nznzmynzozp{r}r~vuvvvtsrpsw{|{yxzzzv~s{s{x|{~|}~|}y{vxtsoq~mq|ls}os~os~or{loxkkuiisb_j`]h_Yc\V`[S^[S^^T_]UbYUdVUcWUb[Yda^gb`e`[_]WY\ST\ST\RS[QRYMOUIKSDIPAFRCHQBGNBFMAEL@DJ?CH?BH?BGACKGHPNOVTUZZZ___egfjkmihnjiqkjrlmrmpuqvzt{v~ÖŎ}zwq|mukrmuq{r~r}p}o|lyjwhvgsfr~dnzeo{fm}gn~hoipjpjqmrnqjk}cbtXUfPL[OFWNFSNCQPFORHQPFNNEJKEILFHLJMIHPIISJMVNQZTW`Y\e]al`do^dp_eq_es`ft`hubjwckxblxfrfthviwjwivivhulylylxkwiugsfrdpdoam}_hw]gs^drZ`lW[fRVa5*04)/3(02'/1&.1&.2&03'14(44(44(43'32&42&42&42$35$46$47%58&4;&5<(4=)4=)4B-6C.5F/5G06I36I36K26J15G14G14F03F03G.2G.2G,1G,1J/4J/4M05M05O06O06P17P16S55S53S53T64T66U77U77U77W99X::Y;=Z<>\>@^@B_AC_A?_B:_C7`D8aE9bF8dH:dI8eJ9fK:fK8fK8fK8fK6fK6fK6gK6iJ5jJ5jJ5jJ5jJ5jJ5jJ5jJ5lL7lL7mM8nN9oO:pP;qQ)^>)^>)^>)^>)^>)^>)^>)\<'\<'\<']=(]=(^>)^>)^>'b?#c@"dA#eB$eB$dA#c@$b?#eA'eA'fB*gC+gC+fB*eA)eA'gD(gD(gD(fC'fB(eA'd@&c?%dB)cA(`>%^<#\9#[8"Z7!Z7!\8"]9!_9$a;$d>)h?)jA+lB,qG1oE/qD/rE0uH1vI2tG0qD-rE.qD-nA,g<)c8%^3"Y/W-U.U.S.R-Q.R/S0R2Y9$\<%`@'eF)kN,vZ2g:q>LMSXYXXYRRUUSRQQUSQOOSVWİYɶZϺ_ѾbӾccfhhjlihimrvxxwvvyzy{~{uojgfehklig]WNILSWYVZclomfaYRyxLuvLruJovLs~Sy]jsĊʏДכݠह㤽婿穿媽ᤸ٠ԚЕȐwfsTuaHmXCcQ=]J9TC3N=-M:,L9*M7)I6'B2#A4$B5%C6&E7*G;-I=/K?1ND8LB6H>4B:/@8-B:/H?6LF:RPCSTDYXF_^LbaOdcOebQebQdbSefXkm`pvlu|tt~vq|vmxpz{zy{|{}{~z~wvuw{}đʒӔߖ牽䋻㑽䓺ቪ~tlucj|dm|jtkumwpzjvjvjvkwmxozq|r~vvvvutrqpsw{}}{zzyvt|s{t|w}zy~{~|}{|y{vxvurtptqurvrvqt}nqzmmwljub`kb_ja[e^Xb^Va]U`]U`]WcZXfVUeWUc\Zeebkhfke`d_[\^XZaXYbXYaWX_SUZNPWHMTEJSDIRCHNBFL@DJ?CI>BH?BF@BFBCKGHPNOUSTWWW[[[_a`cdfcbhdejhinilqlqupx{u~yƖŐ|wp{jrhokspzss~rq~o|lziwhtfr~eo{eo{gn~hohohohngnmplohi{a`pXUfQM\PHWPHUODRQGRRHQOHOMFMLGKNIMOMPMLTMMWNQZRU^VYb[^g]al_cnagsagsagubhvbjwdlyfn{fp|gsguiwkylylykxkxlylykwiuhtfrdpcocn`l|^gv]er\bpY_kUYdPT_6+15*04)/3(.2'/2'/3(04)15)34(24(44(43'32&22&43%45$47%57%38&4<'6=)5=)4>*5B-6C.5F/5H17I36I36K25K25G14G14F03F03E/2E/2F-1F-1J/4J/4M05M05N16N16O27O26R57R65S76S76T87T87U98U98W;:X<;Y=<[?>\@?^BA_CB`D@`D9`D6aE7bF8cG9dH:dI8eJ9gL9gL9gL9gL7gL7gL7gL7hL7jK6kK4kK4kK4kK4kK4kK4kK4mM6mM6nN7oO8pP9qQ:rR;rR;vT;vT9wU*_?*_?(_?(_?(_?(_?(_?(_?(\<%\<%]=&]=&^>'^>'_?(_?&a>"b?!c@"dA#dA#c@"b?#a>"eA'eA'fB*gC+gC+fB*eA)eA)gC)gC)fB(eA'eA)eA)eA)eA)fB*d@(b>&`<$_;#_;#_;#_;#_9"a<"c=&e@&jA+lD+nD,qD-tG0sF/uG0xJ3|L6}M7{K5wI1rF-nE)j@'e;#`5"[2 W-V,R+R+Q,Q,R.R/T2U3X6];bC$jL(uX0f:wFJPQSTSUWĵX±WïVWWVUQPSRPPPTWWɴ[͸[Խ`Կbֿbbdgiijhgimrquvuvy}{}||{vsrkjhhjkif^YQLMRUXSWainke`W~{NvsHsqHpqImrJpxOuWz_iwǓ͙עڣߪ⫻⭹ިڦעΙ˘ēq{]ueLlZDbP<\I8TC1O>,M<,K:(J7&H5$E4$C3$C3$A4$C5(E7*G;-I=/MC7LB6G?4A9.=5*>8,D=3HD8NL?RPAYWH`_MebQfcRebQc`OcaRcdVik^ouku|tuwoztkvpt~vuvxzy|zzwvstwyzz~Ìʐ֒ޏ݊ڑڏՂtp{gn~_euaivemzhp{jt~oylvlvkwlxmzp}r~tvvwvusqpqtx|~~|zywsq{q{t|v|w~w|y|z{z{zyyxwvvuuwvyvyvyuurr|omxmkvdbmcalb_j`]h`Zf_Ye_Ye_Yg\YjYXhYXf_]jhepjgnhcib^_a[]d[^f[_eZ^cW[^RV\MTXIPUFMSDKNAHL?FI>DH=CG>CE?CFAEKFJPNQTRUVVXWXZ[\^^_abcgghllmqnrupuxs{~y~Ŕœ~yq|jrgnjroyr~srrq~n|kyiugt}eoyfpzhp}iphogneldk~jmil}efx_^nWTeRN]SKZTLYRGUSITRKSPIPNGNMHLQLPQPUQQYQT]SV_WZcY]f\`i^bm_cnciuciuaivbjwdlygo|hr~jtgshvjwlymzmzmzmzlykxivgtfrdpcocpal~`iz]dtZboY_mW[gRT`MO[8-37,26+15*04)14)15*25*25)35)35)54(44(43'33'53%46%58&69'5:(6=)5>*6?+6?+4C.5D/6G06I36J47J47L36K25G14G14F03F03E/2E/2F-1F-1J/4J/4M05M05N16N16O27O26R57R65S76S76T87T87T87U98W;:X<;Y=<[?<\@?^B?_CB`D@aE:aE7bF8bF8cG9dI8dI8dI6gL9gL9gL7gL7gL7gL7gL7hL6lN6mM6mM6mM6mM6mM6mM6mM6nN7nN7oO8pP9qQ:rR;sS'^>'^>'_?(`@)`@)b@'a>"b?!c@"dA#dA#c@"b?#a>"d@&d@&fB*fB*fB*fB*d@(d@(eA)dB)d@*c?'c?'d@(d@(eA)d@(c?'b>&b>$b>&c?%d@&eA'fA&gB'iD)nF,pH.rH/tH/vH0xJ2xH1yI3~L5O:O:L7zJ3oC(kB$g>"a9 \3Y0W-V,O(P)P+R.V2Z7]:^=_>eEkN$uX,e5t?JNQQRRRRŶWɺ[ȹ\Ƕ\ij[ñ[î[WUQQQPRTWŪ[ȮZѹaԽ`cdcֿacehhjiikostuuvxz~~}}}{ywqollllji`]WSRTWXVY`imkd^R{xKupFtpJqqKmrJnvOr}UsWz`muzșϟاެஷ߭ެݬӡҢ̞y}`vgPn\HcQ=^M;XG5UD2RA/P?+L;'I8&H7'G5'D4%C3$D4'D6)E9+G;-J@4KA5H@5A;/<6*<6*@<1FB7KI*6?+7@,7@,5C.5D/6G06I36J47J46L36L36G14F24E13E13E/2E/2D.1D.1I04I04K05K05L16L16O27O26O56O54P65P65Q76Q76R95R95U<8V=9W>:X?:ZA=\C>]D@_D=bF:bF8cH7cH7cH7dI8dI8dI6hM:hM8hM8hM8hN7hN7hN7iM7nP8oO8oO8oO8oO8oO8oO8oO8oO8oO8pP9qQ:rR;sS(a>(a>(b?)b?)c@*c@*dB)dA%dA#eB$fC%fC%eB$dA%dA%c?%c?%eA)eA)eA)eA)c?'c?'b?)_?(`=)_<&_<&`='b@'cA(a=#a=#a=#b?#e@&hC(kF+lG*pI*rK,tM.wN0yP4{O4{O4{M3~O5M4N7N6P:M8I4xF-k?"e>b;]5Z1V0U.U.T.V0Y4_:fB mK%sR)vU(wY'}_+g1p8y=FNOSSTSóTȸVϿ]acοd˼aɹaʹaɵ_į\WRRSUħYɬ\бaдaּefifd׾b׾bؿbfgjklmrvzzwwwz~~|vtpoonljdb^ZXYZ[\_eknkdaOzvIvoEupJtrLoqLmsOowRpvRwZemrw~ĘФ٭߲㵸渺躷ᳺ޲ҩz|bthPp_KiXDfUAbQ=^O:\M8XI2SD-N?*N=-L:,I7)F6'E5(D6)E9+G;-H>2KA5JB7D>2>8,;7+@<1FB7MI=PL@VSD\YJb\Ne_QdaRcaR`^Q^`SbeZjrgt~vx}t|p|xq~wrxu{v|v~r|p|m}|l}orssswwzy|{{}džʊΌ̇ćq|bibgz\`lX\h]amcgsdkuhqzoxq{q{o{o{p}rtuuuutrp~m{lzsuy|}{xvywux{zxu{sxuwuvuvwvxuxvxv}~~}|{wv~qpxljuigrigrigrhfsgerecpcanb`m`_mbasabtdcsfeshfsgfnebid_eb\`b\`cZ_cZ_bW]aV^aT]`S\]PW[NUWJQRGMODJNEJMGKMGKNIMQORXVY\\^]^`^_a^bc`deaedgmkqwuu~}x|•ėțțŚ×ÕĔŏvnvjqiq~lvmymyn{p}qqn|lyjweoxgq{iq~jrhoel~ah{`exbetbdqa`n[ZhWSbUQ_YSa\VbZR]ZR]XQYTOVOLSNMRQPUTUZY\cZ^g\`i_claenaen_fp_fp^dp]ep\dq[eq^htakwfp|frfrfsivkxmzn{n{n{ivhufsdqcpcpdqerdlaj{^eu[cp[^mVZfQS_LNZ<04;/3:.29-18+28+29,5:-67*37*36)36)35'45'44&36&3:(6:(6;)7<*6?+7@,7A-6A.4C.5D/4G14I35J46J46L36J46F24F24E13E13E/2E/2D.1D.1I04I04K05K05L16L16O27O26O56O54O54P65P65Q76Q84Q84U<8U<7W>9X?:ZA<[B;\C>]E;cG;cG9cH7cH7cH7dI6dI6dI6hM8hM8hM8hN7hN7hN7hN7iM5oQ9pP9pP9pP9pP9pP9pP9pP9oO8oO8pP9qQ:rR;sS$c?%d@(d@(d@(d@(c?'a>(_?*^>)\<'[;&]:$_<&a?&b@%^: _< `=!c@"gB%kF)nJ*rK,wP/zR/|T1U3V6U5S4Q5S8R9P8P8P8M5}D0uA)g;b;_7[3W1V0U/V0\6_:eA!mJ$wU(_/h3o3s3z50M;-H8)G7*F8+F:,H<.H>2KA5LD9GA5A;/=9-B>3GC8OK?PL@SOCZTF^XJc]OebSfdU_]P]_R`cZipht}xyuq}s{u{v|ws}o~{jzyhxxk}}nqrqrvvwwvvvx}ËÇzko]_t\^mVXdVXe\`kcgreithoymvrzq{o{o{o|q~stvtvssn}nzjxuu{{~zyu{xy}~{w}tvtutuvuwtxtyuyu~}}zxu~powjhsgepkitjhsjhuhhtffrddpbbn_anbcudeyhgyhgwhfsecnc`ib_fa\ba[_bX`aW_bW_aV^cV_cV_cV__TZZOUULQRINPJNQKOQLPPNQTTV\\^`acbceaefcghdjj]cadmhoxuu~y~™×ęȞ˝ǜřŗƖǐŠypxkriq~jtjvkwlyo}qqo}mzkxfpygqziq|jrhoel|ahz_dw`cr`bo_^lZYgWSaVR`[Ua^Xd]U`\V`YS]SPWONTMNSQRWSV[[`f]aj_clbfocgpahp`gq^gpZbmYalWamWamZdp^htblxco}dqfshukxmzn{n{n{gtfsdqcpcpcpergrgpcl}`gw^dr]`oX\hSUaNP\?03@14@16A27@16?05=.5<-49)39)38(28(27'27'26&16&16$07%18&2;)5?+7A-8B.7C06D/6E05H25J46J46J54L44I35H46F35F35E24F24E13F03F03D.1E/2H/3I04K05L16L16M36O56O56P65Q76R87S98T;7T;7U<7V=8W>9X?8ZA:\D:]D=]E9bF8cH7dI8eJ9eJ7dI6cH5bG2eJ5fK6gM6hN7iO8jP7kQ8lP8nP8oO6pP7pP7qQ8qQ8rR9rR9rR9rR9rR9rR9rR9rR9rR9rR9uV:uV9uV9uV9uV:uV:uV:uV:qQ8qQ8pP9pP9oO8oO8nN9nN9jJ3jJ3iI2hH1gG0gG0fF/fF/bB+bB+cC,cC,dD-dD-eE.eE.gD.hD,gC+gC+fB*fB*eA)eA)eA)gC+iE-kG/kG/jF.iE-hD*gD(iF(lI+oL.oL.nK-lI-jG+hD*gC)eA)c?'b>&b>&b>&b?)^>)[<(Y:&W8#W7 Y9"];"^_<[:Y8[:\>`B\AW/I9*I9,H:-F:,E9+G=1H>2IA6IC7HB6F@4C<2A:0OH>QK?VPDZTH^XJa[M`\P_]P^\P]_R_e[dnekvpp|xr~sus}r|p|o~{n||n~}n~~qsvvtstusx~~ywy{yt{jodbx^[nWUcXXb\\h[^g^ajaenfmujs|gozgq{frhtivlyl{p|r~rs~r~r}o{ozmyxy~{v{uwpqnk~mizqm|ys}wy~~{|w~xszqnumjsjiqnlwooyqq}np|jlygivgivgjyeh{gi~kllmlkyggscbj`]d_Za_Z`_X`_X`aW`aW`cWacWacX``U]]RZXNVVLTSLSTMTTOUVTYYX]_^cabfcdhdhkhlokqqjspnyst{x}şɟʝʞɤ͠ɚƖŔőÍv~pwmulvkwlxkxkykyjxjxkxkxfpyfpyhp{go|fm}el|cj|bhx`dp^`l[[gWWcVR`VR`YS_ZT`[Ua[U_XU^WV^UU]SV]RU\QV\[_h\`i[bj\ck]dl_fn`gq_hqZbmXblV`lV`lUamWcoZfr\hvdqergtivivivivhulygtcpbodqerdqcnirhoek{ciwbet]_lXXdRR^?03@14@16A27@16?05=.5<-49)39)38(28(27'27'26&16&16$07%19'3;*4?+6A-6C06C06E05F24H24J46J54J54L44I43H45F35F35F35F24F24F03F03E/2E/2H/3I04K05L16M27M36O58O56P65Q76R87S98T;7U<7U<7V=6W>7YA7ZB8\D8]E;^F:bH9dI8eJ9eJ7eJ7eJ7dI4cH3fK6fL5gM6hN7iO6jP7kQ8lQ6nP6pP7pP7qQ8qQ8rR9rR9rR9rR9rR9rR9rR9rR9rR9rR9rS7uV9uV9uV9uV9uV:uV:uV:uV:rR9rR9qQ:qQ:pP9pP9oO:oO:lL5lL5kK4jJ3hH1gG0fF/fF/dD-dD-dD-eE.eE.fF/fF/hE/iE-hD,hD,hD,gC+fB*fB*fB*fB*hD,jF.lH0mI1mI1lH0kG-lI-mJ,pM/rO1rO1pM/mJ.kH,gC)eA'd@(b>&a=%`<$a=%`='[;&Y:&W8$V7"W7 Y9 ^-3=,2:)1:)19(29(28'18'17&07&07%18&29(2;*4?+6A-6C06D17F16G35I35J46K65J54L42I43G55E56G46F35E24E24F24E13E/2E/2F03G14J15K26L37L36N58O77P88Q99R:8S;9T<8T=7U>8V?7WA6YC6ZD7\F8]G:_H:cI8dI6eJ7fK8fK8eJ5dI4dI4gM6gM6hN7iO6jP7kQ8lR7mR7oQ7pQ5pQ5qR6qR6rS7rS7sT8sT8sT8sT8sT8sT8sT8sT8sT8tW9tW7tW7tW7tW9tW9tV:tV:sU9sU9rT:rT:qS;qS;pR:qQ:pP9qN8pM7nK5lI3jG1iF0hE/hE/hE/hE/iF0iF0jG1jG1kH2jF.kF,kF,jE+jE+iD*iD*hC)hC)jE+kF,mH.oJ0oJ0oJ0oJ0qN2rO1sP2tQ3sP2qN0nK/lI-d@&c?%a=%`<$_;#^:"_;#^;%W8#T8#S7!S7!W9![;"`>"bA"hF#jH#oL&vP)}V-]2c8f:k@j@h?eW6N0xG)tC%r@%n@&b="^/H<0H<0J=4H>4I?5H>4H>5G=4NC=QG>UKBYQF^VK`ZNc]Qb^RcaUeg\ingjtljwpkzuo~uutsrrrstx{{up~k}oqvuq|owowpxqyryqxqtoljcueZk`Ue]Wa^[ba^ga`f_`e]`e^ci^em]fo]gq`jvam}dqethwixq|rzqyqyrzt|wy~y{tuvsrnphwqftuiuznx~q{s|wu{~s{zpxunvqlsmjskjrtr}uuvxtxpvltmunuqvtvtvrunojiwdbo`^ia^gb\fbZebZee[fg\ji^lj`kf\edZc`V_\R[XQYXQYWRYVSZ[Z``_edejgjojmrnswty}wwvwx{ޞĜÛėÔÔŒĐ}xu}t~r~q}o}m{kyhvet{dqycpvepvfqwgpygozfn{dlybiybhvbdpccmb`k`^i_\g]Ze\Yd[Xc^[f^[f^\g^^h\`i[bj[bj\ckW^fX_gX_gY`hYbiZcj[dm[en[eoYcmVbnVbnWcoXfq[it]kxgthtiuiuivhufsergtivjwivfsdqdqeqgnfk~ehycfuacr^]kXVcRP]@03A14A14B25A14@03>-3=,2:)1:)19(29(28'18'17&07&07%18&2:)3<+5@,5B.7C06D15G35H46J46K65K65K65L42I43H66E56G46F35F35E24F24F24E/2F03G14H25K26L37M48M48O69O77P88Q99R:8S;7T<8T=7V?7WA6XB5ZD6[E7]G9^H:`I9dJ9eJ7fK8gL9gL7fK6eJ5eK4hN7hN7iO6jP7kQ8lR9mS8nS8oQ5qR6qR6qR6rS7sT8sT8sT8sT8sT8sT8sT8sT8sT8sT8sT7tW9tW7tW7tW7tW9tW9tV:tV:uW;tV:tV$`<$^:"]9!]9!]9!\9#U6!S7!S7!T8 X: \>"cB#fE$nL'pO&xS)Z-a4h9mf>h?jCd@_"`>"b?!eB"kI&rP*yV,|Z*l6v7>FKˬRԶVڽYڿVTVWUVVYgiillnnkhfeffgije_ܺVԲN԰PֲR۴Yڷ[ѷZϺ]Խ`Ӿaվabfhooqstturqprtuuvw||~~xsmkloqssrkkklnpstx|}|}ypc\USY\^^x|Wz|W|}[}`djotʬٺǽµʷ}lwr^ojTnlSooUnqVlpUgmQdjPeiPgiSojWleSd]K\UCUN>QH9MD5KB3I=1I=1I<3J<3K=4L>5M>7M@8PC=PE?TJAYOF]UJaYNc]Qc_Tc`Wgh`kpilupkwsl|yszyzwussrsxz{zwso}jzlnpo{lsglhk~hk|gj{il{jl{lkyjfuh`ogYjbVd_Wba\ce`gc`g_^d\]bZ]dZ_e[bj[eo_iu`m}dqetfvixozownvnvpxt|y|~zxxtvotiwthtxku~nxq{qyqx}pw{nwxmuuktrkspjtnktvvwyy}w}t|q{r{t}y~{}y{vyqrjl{edrb`mdaldaje_if^ii^lk`nmbpncqi_jf\ecYb]V^[T\YT[XU\YV]\[a_`ecfkhkpkptqvzx}{{z|~“ĒĒ“~zwtr~p~n|kyhw~et{dqwcpvfqwfqwgpygpyfnydlybiybhvdfrffpfdoecndalb_j`]h_\g_\g_]h__i_bk_cl^gn_ho`ipZcj[bj\ck\ck\el]fm\fo\fo]gqZgpXdpXdpXfq[it]kv_mzivjvjvjviuhufserfsivlylygtdqdrfrfmdi|dgxbetcbr^]kXVcRP]@01A12A12B23A14@03>-3=,2:)/:)/9(09(08'18'17&07&08'19(2:)3<+5@,5B.7D17E26H46I57K57L76L76K63K31I43H66F67F67E56G46F35F35E24E13E13G14H25I36J47M48N59N8:N8:O:9P;:Q<9R=8S>9S?8UA8VB7WD6YF7ZG8\I8]J9`K8eL8gL9hM8hM8hM8hM8gM6fL5iO8iO6jP7kQ8lR7mS8nT9oT9pR6qR6qR6rS7sT8sT8sT8tU9tU9tU9tU9tU9tU9tU9tU9tU8tW9rX7rX7rX7rX7rX7rW9rW9tY$`<$^:"]9!]9!]9!\9#T8"S9"S9"V:"[=!`C%hG&jI&tR,xW,[.d2j9q>vByEyHvHqDoAmAlBkAkBb;^8T1wL)oG$lD!kD#jF&`?aC!gF#mM'uT+~]0f3k2BBIMȦMͬMѰOҵOպQ׿SVXVֿWZ^ikkllnnkgddfgghi]Y߾SۺQ۸TܹU۷WطV־\^`abejlpprruvvssqsuwxyy{{}|vqklmostsrjjjlotwyz~ĀÂ}tic[XZ^a`zX{YzZ}\ahmq~ȮֻºǶ}nzuaqoXooUnrWntZjsXeoTcmTemUhmWqp\pmZlgTd_L\VFVO?RI:PG8L@4K?3K=4M<4M<4O>6S@:SB;SF@RGAUKBYOF]SJaXOc\Rc_T__Udg^iphkvpjytm|w~zvroo~o~vtsqq}q}p|n{jzk{mxlsil}dfucbpdbobbnddngepjgrkcpj_mjYieWdaW`a\bd_ea_d^\aZY^WZ_V[a[bj\fp`jvbofsgvgwixowovmtmtpwt{x{{}|}t{pykxzjt~mupvpwqw}lrzkpwjqtiosiqrksrlvqnwxxy{|{xvuw}}|~xzstln}gftecphephepkeqkeqmetnfupeupeskali_hc\d_X`]V^\W^ZW^[X_[Z`^_dbejfinjosqvzw{z{ÑÓ՘–zvsqp~m{kzhw~hu{guxgrvgrxhqzhqzgozemzcjzciwfirhhpihphgohenfcldalc`k_]h`^iaak_cl`gqajsaktblu`ip`ip`ipajqajqajqaktakt^kt]js\htZhs[it^lwaozcq~kxkwlxlxkwiuhugtfsivlylygudrdrfrel~di|cfwbetcbr^]kXVcSQ^@01A12A12B23A14@03>-3=,2:)/:)/9(09(08'18'17&07&08'19(2;*4=,4A-6C06D15E26J68J67L76L76L74K63K31H32I77F67F67F67G46F35F35F35F24F24H25I36J47K58N59N59N8:N8:O:9P;:Q<9R=8S>9T@7VB9WD6XE7ZG8[H7]K7^L8aL7fM9hM:iN9iN9iN9iN9hN7gM6jP7jP7kQ8lR9mS8nT9oU:pU:pR6rS7rS7sT8sT8tU9tU9tU9tU9tU9tU9tU9tU9tU9tU9sV8tW7rX7rX7rX7rX7rX7rW9rW9tYyB}D}F{JxIuFrCrDoClBj?^4[2{S/tN)oI%kG#jF$iG$cBfH"oO(xX/`3k8v=~>LM¡PǧP˪M̫JͭJ̯IպSؿX[[[[afijjllnomhehhihiia`_]]\YػWbdeedejmnnnrwzzwwtuwzz{{|~zspllnqtvutklmoruy{x~ŀĂŃ~ujd^[\^^_{Z{[|Z}[_fjptŰҽнǻ}n|wcus\qtYqw[oy^kx^gtZeqYeqYiqZor]qp\nmYheR`]LZTDVO?UL=QE9PB7O>6O<5O<5R>7VAXIDUJDWMDZPG]SJaXOd[Rc_T``Vdg^gnfitnkzuqz}wrnm|l{tqm{lznzp|q}p{kxkxmtlojiyfdrc`ka^g`]db_febiidklbmj^jjYihXeaU_`Y`b[ba\b\Z_YX]XY^W\b\ck^fqblxdqgtgvgwhwnvnumtmtnuqxszu|tzv|y}}t|p~{kv{jrlsmsntnt{hnxgmvgnsfmshptjrumxtqzyyy}{{ywx{}}|~xzstmnjiygftjhumjuqkwsmyskzrjyqfvpeslbmj`id]eaZb]X_]X_\Y`[Z`[\a^_dadiehmhmqotxv~{z}“ÖÛŚzwusqn}l{ky|jx{hswitxjszjs|iq|gozemzekwilujjrjiqihpifohengdogdocalccmbencgpcjtblubowcpxenuenuenuenuenuenudnwdnwboxanw_mx^lw_mxbp{es~gtlxlxmynzmylxkxjwgtivjwivftdrdreqel~di|dgxcetdcs`_mZXeUS`@01A12A12B23A14@03>.1=-0:)/:)/9(09(08'/8'/7&07&09(29(2;*2=,4A-6C06E26F37K79K78M87M87L74K63K3/H30I77G78F67F67E56E56G46F35F24F24H25I36J47K58L69L69N8:O9;P;:Q<;R=:S>9T?:T@7WC:XE7YF8[H9\I8^L8_M9bM8gN:hM8iN9jO:jO:iN9hN7hN7kQ8kQ8lR7mS8nT9oU:pV;qV;qS7rS6rS6sT7sT7tU8tU8uV9uV9uV9uV9uV9uV9uV9uV9tW9tW7rX5rX7rX7rX7rX7rW9rW9tY&a=%`<$a=%`>%]A)ZB(\B)]D&dG)hK)nP*rR)_4c3i7rTF;RA9P=6Q=6U>8YA=ZE@\MH[NH\OI]PJ^TK`WNd[Rc_TddZeh_fmehsmk|vrz}wrnn}l{tqo{o{q}r~p{nylwkvmrmnkhyjdrf^id]d`Z^a\`e`fhahk_ii\fiWeeU`_T\^X\_Y]]X\YWZXW\Z[`Y^d\ck^fqblxcpfsetdtdsmuountntnsnsnsotrwsxv{y~}|v}qzlyyhr{gphnjnjnimzejvektejrelshpukswozwt}xxy}{|zxz|{z~x|vxstnolk{jiwmkxqm{wqysyqum|qfwncsmbpj`ke]haYd^Xb]Wa\Yb\[c]]e``hbelehohmsmtzv}{}~–ÙÚ~|yuqn}lz}jx{juykvzlu|lu~ks~iq|go|gmyloxlmrjiqhgohenifojgrkhsigrhhrgiufmwfoxgqzfs{fs{gpwgpwgpwfovepvepveoxeoxer{dqzbp{aozcq|es~fwhxlxmyo{p|p|p|o|n{jwhufsdresesdr}dp~fk~fi|efxdfuedtb`n\XfWSa?03@14@14A25@16?05=.3=,2:)/:)19(09(08'/8'/7&07&09'3:(4;*4?+6A-6E07F18H17L69O69O69O77N66M53K31J20J67I68I68H57H57G46G46G35F24G34H25I35J46K57L68M79O:9N:9P;8Q<9R=:S>9T@9T@7XD9XE7YF7[H9]J9^L8_M9bM8gN8iN9jO:kP;kP;jP9iO8hN7kQ8kQ8lR7mS8oT9pU:qV;rW:rS6rS6sT7sT7tU8tU8uV9uV9uV9uV9uV9uV9uV9uV9uV9uV7rX7rX7rX7rW9rW9rW9rW9rW:sX;sX=sX=rW&b>$b>&b@'`E*^D)`E*aF(fI)kM)rR+vU*b4f4l7t=zADEG|DzExCxEwFsBl7Q<7V>:YA=ZE@_PK]PJ]PJ\QK^SM`WNc\Rc_Vhh`fibelegrll{xrx||wroo}n|usr~sutqymuowntmrmnljxkeqh`ke^f_X_aZad]dh^fj]giYffTbcS^^SY]WY]W[[VZXV[WX\Y\a\`i[bl]erajycodqcrbqconuqtqtpsornqlnlnrtsuvxy{{}t|n|lyzisyenydk|figjgj~ehzejveksdirfjtgpvltyq|xuwwx|z{zyz}x~x|vzsxrtopnmlk{nlzrp~xt}v|svm~qfwlarmbpkale]haYd^Xb\Yb\Yb\[c``hbbjcfmejnintnvyv}|~ysn}jyiv~jw}jw}lw}lw}ku~is|gqzgpylpyknuiisffpgfnhgojhsljumkvmmwkozjq{is|hu}iv~iv~dqydqweoxcpvcpxcpxbowbowgt}fs|eq}dp|fr~htjxlzkzlzm|o~pr~q~q~lyhsdpco}eqfreqeo{il}hi{hgwgfvhdsd`n`Zh[Uc=07=07mSDEHOSƨRʪSѯUصYݺ\_`aݼ]ܾ^`bdehiprutstxwqnrvxxut|~{wtmljheb`_^`iq{~|wx}{urqrpmnmprtuuvwy{zywvu~Ʌƒ~spnlhfb^bedaaflsɿǺzsr}q~wxvuurvsuptk{njvjltejpbjn`hl^gi\ccW_[P\UK`VM]PHWHARA:P=9Q<9U=;U@=XJGZOK]RN[PJXMGXOH_XPd`Wa^Wab\dicirmo{ysvyzsmyiuo{r{t}wywsynupupvruqspo}ljwieshbnc[hc[fcYdcWcbTabR_aQ^^Q[`WZ]WW\XY[Y\[\a]`g_cl^fq[eq]fu^jzal~bmbmbmckinkkiihhigjh~minjnlqostyz|~~|xr~kzexwbqu_lr]fqZbs]`y`czbbx`^t_^wdfuehufkthlwjsyowzr}yvxvy{}~}|z|{x|uzuwsustusrourzu{v{ttmnexi`speuncqialf^ic]g_\e^[d]\dbchefkgjoinqnsws{}||tn|iyk|m~pqrqp~~q|~hqzio{kozkozloxloxnnvlovpszpu{qxr{r|p}n|l}gxgzhyhyfwdu}cqzboxdqzdqzdqzfpzhr|jt~lvkwhyhzl|opqrrozpxnwktiphojpmpmo|kivgcqfbpjbqg_l`UcXLZ<19<19;08;08:/7:/7:-6:-69)39)3:)39(29(28'18'17%1:(8:(8<'8>'7A)7F*8J+:M-8R16R@6TB8VD8VD8YF8YF8]G9^H:`JrV@rXArV@oU>nR=lP;mN:mL9lL7jJ5jJ5jJ3kK4kK4kK2lL3mM4nO3oP4pQ5qR6tR7wS9xS9xS9xS9xS9xS8xS8xS6wR5xS6xT4xT4wS3uQ1sO/rN.rM0sN3sN3sN3rM2pK0oJ/mH-nI.mH-lG,jE*iD)iD)jE*iF*iJ.jM/nO0qP-uS-{Z/a4h6n:t=z?EGEED}>>~>v:t:s=k7a0\/}X,uS&qN$pO$tS(yZ.~_0l3v6@EEFLNɫSϰUطZ߾_dfed߾]ݿ]^`dimpuwxwuuyyuswz||{z}~~{wurqomjhfedeir{}}|}|xrsvwsnoopppprvwz|}|{xvssqs{˄Ɔzwrpnjd`gihfehpwzuv~y}|z|u{tzrzqwm}sjwmhrghpcgmafl`gj_ceZ`]T\XOaXQ^SMYLFTE@Q?;P=9Q<9Q>:WIFXOJ]RN\QMXOHYPI^WOb^Ua^Yab]ejfiroo{ysxx~{vr~o{s|s|t|wzxsynuourutvsurqmlzigufbqd^ld\keZhcWebTcaP`_O\\OY\SVYUTXVWYY[[\a\`i]co_gt]fu\hx_j|ck~dldm~dk~di}ikiiifhf~ie~kf}lg~mhpkpmtqxw{|~xsm~e{w^srZjoWenWalU]mTZpWZt\\w__v^\r]Zvcetdgtejthlwjqyow{t|zwzx{z{~||zyx{y~v{uwrtprqrrpspurytytxpskmdyi`speuncqjbmg_jc]gb\f_\e^]edejfglhlokornsvs{}|xpm}j|mqtvtr~p~lu~ltlr~lr~mq|mqzmpwmpwpu{pw}rys}t~qqok}kmml~k|jxiwhtgsishr~iskumukwgyf{j|moorr}pxpwnulqjolomnmo~nlyjgrgamf`li^leZh^P_VHW<19<19;08;08:/7:/7:-6:-6:*49)3:)39(29(28'18'18&2:*7;)9=(9?(8A)7G+9K,;L.8R2=R39S4:S49R46P35O32L23K26I28I36J47J47K58K57K57K65K65K65L76L74M85M85M:4L93L;3N;4P=6R@6TB8WC8XD9\F9]G:^H:_I;bK;dM=eN>eO:jQ;jR:lR;lR;mSoS=pQAGKKIOèOͯUӶXݿ_fkkjhb`acipw|~}zz{z{{~}|}|zxvtsrpmms}|}{zuqonrurqnoqrsvvyy~݁݃قyuttss|΅ʉ‚xrqqnebgjjiiltyƺǾҼ}y{|~v|tzu{rwm}rjwmgqfepbfnafl`hk`eg\aaW^[Rb[S`WP\QKXKESD?Q?;O=9N<8RGCVLJ\SN]TO[RK[RK]VN`\Sa^Ybc^ejfjspp|zsww{|}~}zxwu~t}v}y{ysyovntpvtwtwsuon~kiwhdshbpg_ng\jdXf`Tb^P_[M\YMWTNRRPQTRUVW[X[b\`i^dp`hu_hw`ixaj{cj|dk}cjzdi|eh{gh}gh}hf~ge{hd{je{me|nf}rjskvnxt{x~unf}v]rpUhgO_cKYaIVcLVbKQdNQhRTmXWq\[r]Zq]\tbbscdsdgthlwjqyow{t||v}y{zyzy|w|u|u{u{y~y{vxstpqoppnomurvqyqxpumpi{mdwjarpesoepjbmg_jd^hc]g`]d_^defkhinjmrmpupuxv{~|}vqk}osx{yvts{rzrxqwqupt}pszorysx~ryt{uwuussrtuttutm{lzkwjvjvjvmvjwgye{g{k}m}m~p}q|nvmtlqmpmnln}ml|nlzkivhepf`ld^jf[iaVdZL[SET<19<19;08;08:/7:/7:-6:-6:*4:*4;*4:)39(29(29(28&2:*7:*7=(7?)6B*8F,9I-9M/9R3;S4:R39Q48Q46N45M32L44K26I28I36J47J47K58K57K57K65L76L76L76M85N96N96N94L93M:3O<5Q?5SA7UC7WC8XE7^H;^H:_I;bK;dM=eNzCGGLONOŪSʯTжWջZ`flnnkihjnsy~~|{|z}~{xqoq}}{zuqmpsuwvtuwyz||~܁}z{zzxςӉϋń{vomqpgdjlljkouzȾüͼ~|x|uysxrulyoiukeqedoacn`fnagmagj_bdY__U`\S`YQ^UN[PJXKESF@PA*6@*7B*8G-:J.:K09R45T@7VB7ZD9[E8`I;aJ:bK;eK:gMJX:FU:CV;DV=CXAGZDG^JKcOPhTSlZXr^]tb`s_`s`bvcewgjzkp{nu|qy|r{xp{vp|so}qo}qpqrtuvwxvwutrropmololpl}soun~tk|rizpgxnfuoduncsqgroenmclibjhaifahdahdahihnklqmpupsxrw{uz~{~~zvutswy|~~}|z~x|w{{yyyyzzz{{{|}~xvsqn}m|l{k|f|f|g{g{jzl{o{rzlqil}fesecpgdoicoialf^ijdnhblf^id\gbXc^R^XJWSER<19<19;08;08:/7:/7:-6:-6;+5;+5<+5;*4;*4:)3:)39(2;+5<+5>*6?+6C+8E.8I/8L18S5=P5:O58M47L44J54K65K57K26K28K26L37L37M48M47M47N66O77O77P88P86Q97Q97Q95P84O;4Q=4S?6UA6YC8ZD7[E7bK;bK9eK:gN:iP}Z>zXm:f9f:]3_2a1f4p:~CJNQPSĨUʰYѸ\````cflpxy}~~zrnqw}}zyywy}މލݑӋŀtolnutrqrurruyz|þÿÿ¿~y~uxsuo{qkulgqhfsidrecpfeqeeqgdncbg`_bY^_Y^^V^[V]XR[SPXQKUMJSKHJEANIETOKXSO[VP\WQ\WQZWR_^Zbdahlkmvus}tuuwxxy{{~~|zzz|zv{sxlsmtpvpvrupsnpmo|on|nlzjhueao`\j\VbXR^TQ\NNXNR[RVaU\fY_k]cq^eu_fv`gw`ft_bq]_l\\h\Ze^Xd\Yd][h^\ia]ke_mi^lj^lk]jl\ir`nsaoucoucoq`jkZdeT^cNWaCM`?H[:CU6>T5;T7P5:O58L36J46I56J65K78K26L18L16M27M27N38N47N47P67P67P67Q78Q76R87R87R:6Q95Q:4S<4U>6WA6ZB8\D8]F8eK[>}Z<|W:yV:wR7tQ5sN4pL2qL2pL4rL5qM5rP7qO6pN5oM2nL1nL1oM2pN2tR6uT5vU6wV7xW8yX7zY8{Z9{X8|X8|X8|X8|X8|X6|X6|X6~Z8~Z6~Z6~[5}Z4{X2yV0xU/zW1yV0yU1wT.uQ-rO)oK'nK%rN*rO)tP,vS-zV2~[5]9`8f9l=sCzEHJORYVVTQKLIF>~:{k8c6d8c7f9k9s=~CJQTħYǨXȬYγ\Ի_cghgfjpwzulilu|}zz}ߓӊxurswvuuy|yz}|x|uwr|sovnjtkgtjdticsierhericoe_ia\c[af`ad]^_Z[ZUYURURMSOLQMJJFCLHEQNIURMYVQ[XS[XS[XS_^Zbdahlknwvs}stsuuvw{}}|{|{y{tymtmtmsmsmsmsorproq~on|kjxgera_l]YgYUcVTaRT`QXbTZfW_l[cp]dt]dt^eu_es_bq^]k[YfYV_YT[[QZYRZWQ[XR\\T_`VacV`eU`fU_gS^kUakS`iR\fOYbKS^GOZCKZAG[;@[8ZBB\GF`LKcONdRPfWTk\Yq_]uabwcdyef{hj|im{jpzkpwjqk^gi]gh^ie]jd^je_mc_nd`okdtjcsibribribrkcrldsmerldqodrqftrhsrhsqgrpfqoenrfpqfnndlmckjckibjidkgdkhgolksppxpszqt{tw~v{x}~{{~zyxyz~~|zvsppoihi}j|k{o{s{u|prfes[XcWOZZOW^QX`QX\OX_U^_U`_U`^T_[O[VJVRFROCO<19<19;08;08:/7:/7:-6:-6<,6<,6<+5<+5;*4;*4:)3:)3=,4?,2?+4A,3C,4H/5J17L18R7Z=}X;{V9xS8wR7tO4rM3pK1pK1qL2rM3tP8rP5qO4pN3oM2oM1pN2qP1vU6vU6wV7xW6yX7yX7zY8{X8|X8|X8|X8|X6|X6|X6|X6|X4\8^8^8^8]7~[3|Y1{X0}Z2|Y1|Y3zW/xU/tQ)rO)pM%tQ+tQ)vS-xU-|Y3\4`:b8k|AGNUVβ_γ\е^Ի_beijikrz{ofgqzz{慾݀Ӌ~}{zyyxuw~||ƸƼ{x{uvryqlvmivmeukdtjdtjeribof]h`Zd\elechb`b]Z\WVWRRSNOPKNOJIHDJIEMLHTQLXUP[XS\YTZYT^_Zbdahlmnvxs}utsq}r~sv{~~|||{y{vxnsmrlrkqkqlrorpsprnp}lkyhgucan^\iZXeWWcTXdTZfW_lZbo\cs]dt]dt^dt`cr^`m][hYVaYQ\XNVYNVXMUQJQSLSXNV[PX_OYaPXcNWcLTgMVeJS`EN[@GWb=c>d?e@fAe@d?d@]9]<^=^=^=[AKTŬZ˱\̱ZϴYպ_djmnkxz{kejr}~z{⁶|Ձ׆،ԋ̇Ń~}~}ȹùy|t~vozrgvodumdsldslgtmerkbmg_hc]fa\b^Y_[X]YY[XUWTPROKMJFFDGHCIJENMISRMYXS_^Yba\efahjglpqpxzt~trp}r|s}s}ux{}~}z|vxtvsurururuqtpsqrqsrtpron|jiwdcq]\jXWeSUbMSaQYfX_o^eu`gy_fx[brY_oX[jXZgYWdZT^ZPYYNVXKTWJQVKQVKQWJQZKP^KQaLQeLRgLSdFNaDI\=CV7\D@^IFbOKeSQgUSeVShVTs^]yaaggkmkm|hjvbdq^bkX^eT\`QX_OY^Q[_R\^R\\PZ_Q^_Q^_Q^`R_`T`bV`eYcf[cm`incksfoujpvkqtioqflodjpcjqflrgmofkmckkdkngopkroluonvqozooyooyor{tvw{{|}ĝƟğâå¤~}|}z|}xspqsprrtuq|nslmgesb\hZPYUHQVEMYFLZGKXGMYISZNX]PZZNXUISPDNNBLNBL<19;08:/78-58-58-5:-6:-6:*4:*4;*4<+5<+5=,6=,6@,5B-2D.1H/5J15L18L16N16N16O27M27M36L36J46I56H66H66L39M29M27M27M27M27M36M36N45N45O56P67Q76R87S98S:6R94V;4Y>7Y>5Y>3\@4`D6dI8kO:lP:mQ9qS9sU9uX:vY;xY:z\:|[8|[:|[8}\9~\7~\7~\7]9^8^8^7^7^7^7_8_8^7]8]6^9`9c>d=d?d=fAg@gBf?e@d?^9_;_;^=]<\;[:Z;X9~W:|U8zS6yR5yQ7yQ7wR7xS8wT8wT8wT6xU7xU7xU7xU5zW7{Y6|Z7|Z7|Z7{Y4zX3yW2~Z6{W3yU1zV2}Y5\6\6~[3_7_7^6^4]3\2\2~[1\2^1]3^1\2|Z-zW-xV)yV,{Y,}Z0~\/\2`3e;k=p;v>~DIKMPQRRSSßSQPOHHF@wCY9>U58R46S57U79W99Y75Y62X51V50U63V74W:6W;7Y@<[C?^FD`KHbNMcQOdRPeQPjRRoUVu[\yaazadt^`oY[jVXiTYdQU`MS_LR^MU_NV\MT[KU[IU[IU[IU[KU]MW`PZcS]dU\gX_h\`l`docgqeioefmcdlaepdhqdkqdkncilailbjngoqjrqkuroxtq|sq|rr|tt~uwy{x|w~xy|}~~ƝȟȢǦ˨̡ |}{yussursuxxv}qtml|d`n_WdWKUSDKRAIUBHWBGVCGSCMUHRXKUXKURFPNBLK?IK?I<19;08:/79.68-58-5:-6;.7;+5;+5<+5=,6=,6>-7>-7@,5E.4H/2K05M36P38Q27Q27P16Q27P37N47M47K57J67I77J67N3:P2:P38P38P38P38P37P37P35P35Q46R57S76T87U98U96U95X;5Z=7[>6[?4]?4bE5fI7mN9nP8pR8sT8uV7wY7y[9|[8_<_:_<_:^9^8^8^8`;`9`9`7_6_6_6_6a7a7`9a7a:d:d=ff?e>bEL;COFF-7>-7?.8?.8A-6I04M04P16R38T49T49T49S38R27Q27P37N47M47K57J67K58N3:P2:P38P38P38P38P37P37P35Q46R57S68T87U98V:9V:7W:6Y<6[>6\@5]?5^A3cF6gK6nO:oQ7rS7tU8wY7y[7}\9~^8d?d>c>bh>i?i?j@kAj@i?h>g=d`>_=]=[;~Z:~Z:~Y<Z=|W:|X8|X8{W7{W7{W5zV4zV2{W3|X4}Y5~[5~[5~[5}Z4}Z4|Y3|Y3|Y3}Z4\6_7a9b8c9e8f9g:il>k;jr@yBEMTVTUUQRQQSQRSNLHA~?~AHKPNLPVƵ]Ͼbdilpux{sdeiqsw~vx隿ߖϊ}rlkjw}‹ƌɍˍˍ̐̑˒ɐŏŐǓɘТݲ˴׿ñ|t~ixuiusfrpfrpfrpfrpcml`ji`ih]feYbaW`_X^^U[[OUUKQQGMKHNJKPLNSOSUPVXSZ[V[[Ygihlpqswzrz}ov~mvpzsr|q{qyqyryszu{v|{|xxwusqtptpsospqoroqopmonml|jiygfvbaq_^l\[iZ^j]`obetdjxfl|gm}fl|fizacrbaob`nc]idZecWabU^dU\cSVfSUgSUfPSdKO`FI]>CZ;@R25P03O/0M//M//O32R65T85V74V74X64U63U64U63T73T73X<9W>:Y@\DB^FD_GE_GEeIHiMLpTSuYXwZ\vY[sVXoUVeKLbIL`GJaHKcJNdKOcJN_HNYBJXAIW@HVAHVAHVCGWDHXEGUBDUEFXHI[ML_QPbTQbWUcXVi[[iZ]fZ^dX\bW]dY_h^fkdkmgqqkutq|wtvtuuwvwy{}z~y{~Ėǚ˞ΤԨ֣Ѡ̝ɚěĝƠɡ˝ɛșȕƒŐϏ~}~~|zwww~z|xyqo}jftYQ^TJUL?IH8BI5>I6HQAKOBKK@HG=ED:B=2:<19;08:/79.69.6;.7-7?.8?.8@/9@/9C.7K05O13R25T47W48W48W4:V39U28S38R38Q48N59L69L69N59Q3;R3;R39R39R39R39R38R38R46R46S57T68U77V88W99X:8Y:7[<7]?7^@6`?6bB5fG5jK6pP9qQ8uS7xW8{Z9}\9_:`:gAf>f@e=ci>i>i>j?j?j?j?h=ge?e@c>a>`=_<^;^>^>[;~Z:~Z:}Y7|X6|X6{W5{W3{W3|Y3~[5\6]7]5]5\4~[3\4\4]5^6a7d:fn>m:i9h5f6f3`0b/a1b/b2g4n>t@EJRVWW XáWSSTSTRRQLKFB@DKQSQSVZʽaeiqtx{|~qmmuvw}Ёwpw܈ߛˊynfegpv~Č͑ҖіҘњΗ˔˓ЙӞ୿ѼŮҶĬ|tmywkuvgqrgqrgqrgqremockmaik^fh]be[`cY^aV[^PUXLRRGPMHQNLRNOUQRWSTYUWYVXZW`bahlmswzt|rynwoyq{t|t|s{rzsytzu{v|~~z{xvvttntntosnsnqmrmqnpknk~mj}kh{gduc`q`]n]\j[Zh[]j_ancgsfixil{jm~jm~fhwgftfdrf`le]heYcdWaeV]hUYjTWiSVhOScIL^AEY:?U58L,/L,/J,,K--L0-M40P73R95X:8X:8X97V86U77S53R42Q31Y;9Y=:Z>;Y@<[B>]D@_FBbFChJHlNLrTRwYWy[[y[[wYYtXWiMLeKLeKLgMNjPSkQTjPShNQaFM_FL]DJXAGV?EUACT@BTBBQ??P@@RBBUFCXJG\OI_QNaSPbTTcUUaUW`TX]RX`U[dZbf_ficmmgqqnytp~sqtrutuw|~{|}~ÑœǗ˜РԦڤ֟ӜЛϛΝОќϚ͘˕ʒǏƍčЍ~{yw|uxvwyxuslhwe_mTLYPDPH;ED4>E1:E28E07D/6F2;G6@K:DM=GM@IK@HG=ED:B>3;=2:<19:/7:/7:/7.8>.8?.8@/9@/9A0:A0:D/6M04R/3T15W37X48X48Z2:X3:V18U28S38Q48O49N59N59N59Q3;R3;R39R39R39R39R38R38S57S57T68U79V88W99X::X:8Z;8\=8^@8_A7aA6cC6gH6kL7qQ:rS7vT8yX7|[8_9a;c:g?g?g?g?fge?f@f@gBfAdAb?a>a>`@`@]=]=\:[9~Z8}Y5|X4|X4}Z4~[5]7_7`8`8_7_7_7`8a9a9a7b8fn;l9k8k8k8e2e2e2d1e2j7s@yCJLSWXWáYţYģVģV¢UTTQPOIIFBBGOTTUW\Ⱥaelowy|}|{|z}~|ޑۏ؏֍Ԏȃysẍ́ڒޞȎxg^^alrz~ɒҚқӝԞҜϗЗ՞ܦǸ署ܸұʭª{snzzkuvhrsfpqgqrgqrfnpdlnbjl_gi^cf\adZ_bW\_QVYMSSIRQKTQNTPPVRSXTSXTUWTUWTZ\[bfgnruszt{qzpzpzs{s{rzqysytzu{v||}~|}xywuuqululumtltlqlqlqloj~ni}mh|ifyfctb_p^[l\ZhYWdZZf]\j^`mbdsdgvfizhi{jiyihxieticqg_lg]hfZfhXbkV[mTXjQUfKPbEI[H8BI3;=2:<19;08:/7:/7.8?/9@/9A0:A0:B1;B1;E07N/4S/1U13Y25Z38Z38[28Y27W29V39T49S49R5:O6:O6:P5:R49a@9bA8aA6cC4iH7lL7sQ8uS7xU7{X8]8`:bh>gb?b?b?c@_=^<];\:[7~Z6}Y5|Y3\6]7_7a9b:b8b8b8c;e=fp;n9m8m8m8n9k6k6j5i4j5p;xCINOTVVVáYƤZƦYťXĤY¢WUQOMEFECBGPUVZ³^Ǽcgmuxz|~}yw~߁ތڍ؏ِ֏ӍЋ͋ʋɍǍ‰}uw{ˏכߣՙtcy\z\}_kr{ÏʕϜҟԠҞϙқڢü躴ݳҮʬǬª}vo{{muwiqsgoqhprhprinqgloejmbgj^cf\ad[`cW\_RWZNTTKTSKVRNWTRXVSXTSXTTVSSURWYX\`agknmtzszt}s}s}owownvnvpvqwuxvy{~{~}~|}|zywussoulukuktjtjrjrjrjqinilg{idxeara]n]YjYWeYWdXXbYYeY[h[]l]_n_`rabtfewfeuhdsicqianj`kk_kn^hnW]nSXiNSeHM^AEX9>T49Q16I+-I+-J,,K/.K10M53M83O:7S9:V9;W:<^@>bCAeGEjKHlMJmNLpQOtUSxYWz[Yz[YyZXwXVz[YwYWvVWuWWuWWsUUnPPiLNfINcHMaFK_EH^DG\CFZDFZFE[GFXFBVD@TE@UFAYJC\OG^QK^PObTTfWZeY[eY]dY_e[cg]ekcnmgqokyplzqo}spxu{z}||}ĎǐɐɎɑ̕Иԟߟߣܠٛ֗Ҕϔ͒Ɏ~{}~vujiwfdrgcqf`n]WeUMZSITNBNG:DD4>C2A8=?6;?4<>39<19;06;.7h=h=j=g:g:h9i:h:i;jk>j=ijAi@hAg@jChAg@e>d>c=d>c>`<_;^<];[9~Z8}Y5}Y5]7^8`8b8c9d:d:d:fi?g;e;d8hn>p@qAsCtBsAq=o=m9l8l8n:n:o;o;n:l8m9s?|HLMOTUSUáWƦ[Ȩ[Ũ\æZYVQOOCDDCCHORX[źafkpz}zy~،ԍя̌ʊƇ„~soorНƒr}bz\|bfnwÔ̞ТӥѡϞҞܩŸ庬խάˬƫ§~zm{|lvxhrtfprgqshpsgorempcknbgk_dh]bf[`dX]aRW[NSVLUTMVUOXWRXXSYWRVUQUTPTSUYZY]``ehhpsox}tvvltkskrkrmsousvtwy|{||}}{{yxuuqsnukwjwjtjsirjrjqiphphlg{hduf_qaZj]Vf[Td]Wc]WcZWbXVcXWeYXfY[jZ\kcbrdbpfbqicqlaonbppbosblpW]pSXjMRcFJ\=BV7\><\=;\=:]>;_=;`>gDBjHFoMKqOMuSRxVU}YY\\^^^]]\|][a_~_]zZ[xXYvVYrRUjKPeFKcFJbEI_EH^EH]DG\FH]GI]IH_LH]JDZGAWF?XG@YJC\OG^QK`RObWUj\[j^^j^^h^_h_bgaengnoispmxpn{po}tszy}ÑȑΒϒϐѓԗٙݛ᝿ߛޘژ֗ҍ̗Ē~~wshepa^ic]iaYdYQ\RHSTHRNBLH;DE5?C4;B19@/7@,5C06?,2;*0;,1=15?37>37=26=07=15=07=15?07?05?07@/5>-5@-3?+4@-3A-6C06G2;K28N+1S*0T+1U,2U.3W05V26U26T15R25Q14P24O24O56P69Q7:O27O19P2:P2:R39R39T49T47T47T45U64X64Z86[97\:8]<7b@7b@6d@4f@3hC3mF5rI7uK5xN5zQ5~U5Z7^9a:b;d:c:c:d9e:e;gm?m?n@oAoAqBqBn>m=li?j@kAlBmCmCjAi@i@h?ecA^:bi>io@p?rArArAq@n=mn=o>q@sBtCq=t@wBxCzE}HMMPOSV YĤ[Ʀ[ŨZƩ]ĩ\¨]ZVRMJFFFDGLV\³^ʼclrww{߆ލ֌΋NJÈ~{wtqqqojb~_bmu|wmg}c~gjr|œʣѨϥϣگ뼽ʿ˷޹ڶүɩ~xn}ny}juyitxjuyktyhqvfot_hm^ekZagV]cSZ`PW]QV\PU[MRVMRVNSWOTXPUYPUYQVYQVYOWYRZ\Xbceopp||xyvr|qzovmtlrkqmpmpuvyx|{~{|yyutprk}vjvjuirhpfme}kc{hczje{idziavg`rd[l_Wf^Sc[P^^P_^R^^T_\TaZWbYWbXXbWWa^^hb`kicoodrqcpsaor]lrZguZasTYkLQaBGX9>R46P24P24L.0L..N00P20P41R63T85R95U<8V=9W>9Z>:]@:`B:cB9dB9hC:lF=nG@oHCpGCrJHwOO{SSyRS{STUWX[[\[[\Z|]Zeab`}]^zW[tQWpLVjIThIQjKPhKMdKN`JL^JL]JL^LL^LJ`MG_LE_MC_MC`OE`RIbUMdWQkaXmd[qg^qhaofamebogenhhkghnlqqrwsv}txx||“Ĕ˖їט٘ڗەݙឺ랿瘿旼斷⒲ۑԌƎ}}ǘȘǔ~zrmt`[bXQYYRY[QYWMURINPEKMBHI=AD8<@46@14?03@039),9),9),9),9*-;,/=.1>/2=15=15?05?05?05?05@/5@/5@-3@-3@-3@-3B-4D/6F18K28O,2S*0T+1T-2V/4U15U26U26R25Q14P24O13O24P35P67Q7:O27O19P2:P38R39R38T47T47T45U64W53Y75[84\95]:6^;5b@6d@4e?2g@1lB4pE4vI6xK4{M5}P3U5Y6]9a:c9c:c;c;c9d:e;fo>o>p?p?l:k9k9k9k8k8j7j9j>k@k@kAlBlBmCmAmAlAlAk@i>e;c9b5^4a7a=^<}X;|W:\?bB`h>j=im?m?n=o>p?rAs@p=s?wCyEzFHNPRRSU YĤYťZħYƩ]ĩ\[XTPLKIJIIJMTYȺbgouxyzߋވ߆ݏҎʍōŒ}wtpljkkga|[z\~_cutrlihmpu}Ĥ̪˩̨ٲϾڽѶǰ۸ӱɫ¥|un}kx~hu{fsyitzitzgrxepv_ho]fmZaiV]eSZbPW_QU^PT]NSYOTZOTZOTZMTZNU[NVYNVYOYZT^_]iihttsyyxus|pwmtlrkqnqopvuxw|z}{|xxtun~sj{th|uh|sg}pg|oe}ld|id{hczje{idxiavf_of[laVf^R`]O\_O\`P]_Q^_U`]Wa\Yb\[c[[c``hcbjhblndorbot_nt\luYgtV^nOTdEJ[9[@9_A9cB9eC9hD8pH>rJ@wLCyLF{KG|LJPPSS{RP{QR~RSSVVYZ[]]`^fbb`|][xVWsPVnMVkKXiKUkLQiMLdKN`LM^KO\LM\LM_MK`MG`NDbNCcODeSIhWMiZSh^Upg^sk`wodwpfunfqlfrmirnkkijnnprsxtyy}|Șʓ͕Ԙښݛޚߗ⚴垺졿땴㓮ٓГƓ~|~|~~yq~lel]V]VOVXOTXOTTKNNEHNCGLAEJ>@E9;B66?33@22?119)*8()8()8()9)*:*+<,-=-.=15=15?05?05?05?05@/5@/5A.4@-3@-3@-3B-4D/6F18J17P-4T,4T,4U-5V.6U07U28U28Q16P05O05N/4N15O26O58P69O27O19Q28Q28R39R38T47T47W56X65X64Y75[84\95]:4];2c>5c?3e?2hA2mC5qF5vI6xK4|N6~Q4U6Y6^:a:b9c:dn>o>n=n=n=ml@l@mAmAmAmAmBpEpCpCoBnAk?ha?c=f>l?m?m?m@oBpDtGrDrDqCpBn@n@n=tCtCvEwFwDwDvCvCp?p?o>n;n;oq=q=u>yB|E~GJPRVVVW YãXãXVħ[XWSOLJIKMNNOTX\lqw{||~߉ِ͋ŊčÎytqnfbbcca|}[vzYwxXtzX}c}chhijpsuzƧǩɩԴѽߺնγɫټҳȬytn}kx~itzgrxhsyhsyhqxfov_fn]dlY`hV]eTXaRV_QU^PT]QV\PU[PU[PU[NU[MTZMUXMUXPZ\Xbdcnpnzzuyy{xwrynvlrlrorqsvuwvzw|x|uyrtmsj}qeyreypdzmdylbzkczhczhczidzhcwiavf_oeZkaVf^R`]O\^N[_OZ_R\_U^`Ya`]da`fbagcbhebijcknblr`lt^ks[iuYgpRZgHM[@H<>E99A55@22>008()7'(6&'6&'6&'7'(9)*:*+=15=15?05?05?05?05@/5@/5A.4A.4@-3@-3B-4C.5E07I06O.5S.5U-5T/6T/6T17U28S38P05N/4N/4M.3M04N15N47O58O27O19Q28Q28R38R38T47T45X65Y76Y75Z94\95\95]:4];2b=4c?3f@3iB3nD6sH7wJ7yL5~P8R5V7Z7]:a:b9b9cn>n=moAoCoCoCnCnAnCnArEqDqDqDpCoBm@m=d4d6b:^8}Y7}Y9]=b>dvEwFxGxGxEwDvCuBr?q>p=o;o:^?jE?kF>rKDyNGPIQKMJLKLMOMYR^T]ZYYZ^_dae^b]^{YXuSRmNLiKMeJOfMSgNTlOSkNPhNQdNQcNSbOQcPReQPfRKjTIlVIoYLq]RscVse\rh_|sjyq~vz~x|w|{w{{yxxzwx|x{ˤϠ՜؜ݝᠸ䢺棻頻螸鞺꠾蕲ܕԖʕ~zu{s~zr}zs{xszur{oq~lrlrlup|w{tpjxd]e\U\SLSPIPSJORINMDGH?BG<@H=AJ>@I=?G;;B66@22=//7'(6&'5%&4$%4$%4$%5%&6&'=15=15=15=15?05?05?05?05@/5@/5A.4A.4A.4B/5D/6H/5P/6R/5S.5R/5S06Q16Q16Q16O/4M.3M.3K.2L/3M04M36N47O27P17Q28Q28S38S38T47T45Z87Z87[86\95\95\93_:4_:2a<3b>2f@3jC4pF8tI8xK8zL5P9S7W8[8]:`:b9b9b;ck=k=jn>m=m=m=m=oBoBoBpCpCqCqDpCrEsDtEtEtEsBrAq@j8i9e;_8\8]9a=d?fxExEyFyFxEvCtAs@t@s?r>r;q=r;sH<>I=?G;;C77@22=//7'(6&'4$%3#$2"#2"#2"#2"#=15=15=15=15?05?05?05?05A06@/5A.4A.4A.4B/5D/6E.4N/5O/4O/4O/4O/4N/4O/4N/4M.3K.2K.2J-1K.2L/3L25O26P17P17Q28Q27S38S36T45T45[98[97\95\95\93\93^93^91`;2c=2g?3nD6rF9wI9zK9{M6Q:T8W9[8^;`:a9a9`9a:c9d:e;fk=j=jn>m=m=lo=j=e;b;c>fAj@k>p>t@wAv@uAwEzF{H|H}I~J}IzFxDvB{G{G{HzFyFvCtAs?v?u>g??gA@hB?hAAD;>A6:B7;E9;F:008()6&'4$%2"#1!"0 !0 !0 !<15<15<15<15=15=15=15=15A27@16@/5?.4?.4?.4B/5E.4J/4M.4M.4M.4M.4L/4L-3K.3K.3K.3J-2H-2H-2I.3K05N16P17Q07R27R27S38S36V45V45]99]:8_96_96_:4^93^91^91`:1b<1h@4nD6sG:xJ:{L:|L6R;U9W9\9^;`:`8`8^7_8`7c9fj>k?h:j;ko>h:g:i;i;i;jn>m@nApCsCtEvEwFxE{H|H~JKJJHGzCwAp>j=h>j@mCpDtDwC|F}E|D{C}GGLKMNOLI}FIIKH|HyEvBuAw>v;v=v;w>x=z?|>DFJJNOW›Zě[ƚYǛZŝXĜWšTSRMLLLPSÝVSǬUεXfow}ݛٚ՚їΗÓ{qoookhe~bz_uxYotTu[x`gjjhi~iotyyy|̿ѷݢ͠Üzr{kzueprfqwirykt{lu|hqxbiq\ck\`iZ^gX\eUYbTW`SV_SV_SV_QV\QV\QU^RV_PW_PW_PW_QX`Ybi[dk_irfpymws}svxyzz|z~z|{{{y{y{w|u|szqxoxlugxrdunark^ph\pg^qg`ribtibtibrh`og\jdXd`T^]PZ]MW]LV^MU^OV`SZeZ`kbgqhmulqulqxmsylsyjquajlW`cLV_ENS8=R8;P69O58P67Q78Q78Q78P65P65Q84Q84Q84R95R94T84\=:_=;b;=d>;hC=pE?{I@LCNJUR\\ebnguonn_cYb^f]cUXtPRpPSpMQnKQnJVlJXiM\iO\tV^rW\pW]nW_nY`oZar\_s^]w^Z|aZ~fZk]pbtgvj~wm~w}Ƭǫƪũå¨ϦУաءߡ⟺基礿♯ԗŗ~~y|{|}w}|ptthlrfjshltjkpghlcdgachcgech`_d[[c\_feirmqzw{uxqqyjioe`g^W^WQUVMRTMTOHOHAHC009)*7'(5%&2"#0 !/ / / <15<15<15<15=15=15=15=15A27@16@/5?.4?.4?.4B/5D/6I06I.3K.3I.3K.3H-2J-2H-2K.3H-2G,1G,1H-2I.3J/4M05P17Q16R27R25S36S34V45V43^;9^;7_96_:4_:4^91^91^90_9.c;1j@4pD7vH;zK;|K:|L6Sj?l@i;i;ko>g9f9h:h:i;jn?pArAuDyEyF{GIJJLKLIID{At>nw;_=;b;5:=49=47<36>37>37@46@46@44?33?11>00:*+8()5%&2"#0 !/ ..8/28/29.29.29.29.2:.2:.2<-2<-2=.3=.3?.4?.4@/5B/5E.4G.4H-4F-3G,3E,2F+2D+1H-4H-4H-4H-4I.5K07M29P38P17R27U28V37W48X67Y57Z66^87^85^85_:4`94a:3a:3b<3f>4g?5kA5pD7uG:zK;}L;O9R;S8U7X6[8]8_8`9^7^8a8c:f=j@lAmBl>l>l>m>n=n=n=n=h:g=e==f>>iCBjGCfA;jB:~IA]Uf_]Xig념r}gp]^`]ea{cax[]uUZtQXqRZkV[kX\jS[nWapZfp\gp\hr\hv_g{bfghjepi}r|Ų̰ˮ˰ͲҰҪФΪةݩ飾颽衾ܕywlzpdnqfntioynt~rvtxsxpvpsxhkrddk__f\[f^\gb^jgbmjetljqigmdehbdfbcidhjhmmkpifmb`eXVYTPQTNPTNNUMKTKLICGD=D=6=929:169056-03*-;04:/3;/1:.0:..;//=//>009)*6&'3#$3#$3#$2"#/ ,8/28/29.29.29.29.2:.2:.2<-2<-2=.3=.3?.4?.4@/5B/5D/4E.4D-3D-3C,2C,2E,2D+1G.4G.4H-4H-4I.5K07M29P38Q27R27U26V37W56X67Z66Z75^85^85_:4_:2a:3a:3a;2b<3f>4g?5lB6pD7vH;zK;}L;O9Q:R7T6V5Z8]8^7_8^8_9b9d;f=h?i?k@j=k=k=k=l;mgo>q=r?uAyE}F~FEFFGJJKJJIGE}CyDyE{F|EIHGECCHKNMNQURNJIKJKJHIFDDA|>z<|>BGLJJIGHJMQRSTšUØT—SQ—RƜTˡWͣWͣWͤUϤVШSܻZbs|~㯸֤Ң̜Ĕ|xvroprspnruxvvtxz{~̩ըکߩןΛǘ|wp}vktogpmailbkrgnvipxhowcjr_cl[_hZ]fX[dVYbSV_SS]QQ[QQ[QQ[PS\NR[MQZNR[NU_QXbU[gW]i\dq_fvbkzgpmvs|uy{||{{}}}~|~||yu~s}r}q}mz}mz{kxtfumaoi^ni^niapkcrjboj`ki]gfYbcV]bSX`QTfVYbRU_OR`PSeUXl\_p`cqadtdgtaep]akV[eNT]FLX?ET;?S99c@gA@iC@kHDnKGqLDsKC}KBWNd]gazuxowfdjdiczhdy`cuZ_tV^qX^j\\i]_mYbpZgr]lq_mq_ou`ozdp~gonqqoys{Ŷɷϵвϲгղ׭ש֪ܪߪ蝥Ӑ~yyn|pcmj[bfW^gX_jY_m\bq^ds`ftaetaevcepbbh\\bXW`XU_\Web]ifaskhqgfndekbckbelfjpipqlrkflc^dXSWQMNOIIOIIPHFOGEF@DA:A:3:7078/47.35,/3*-8-18-19-/9-/9--9--;--;--:*+7'(4$%3#$3#$3#$0 !-6026028/28/28/28/29.29.2:.2:.2;/3;/3>/4>/4?05@/5C04C.3C.3C.3B-2A,1B+1B+1E.4D-3F-3F-3H/5I06L18O27R27T15U26V37X46Y57\56\65^85_96`94`92b93c;3c;3c;3g?5h@6mC7qE8vH;zK;}L;M8O9Q6S5U4Y7[7]6^7`:a;a9c;dl?m?q@t?vAyB|EGGFGGGJLMKKLJG}BzAzC|E~EHIHHGGJLPPQRTPLHFGFGFFGGFFE}B|>~@EIJNNMIHJNOQRTWšUTSŚUɟWΤZѧ[ҧYӨYիY֮Wflx}}|ށ㴿ܮԦ˝|{{|~~}~~}}ľȡΟӡ٤ޥ۟җŒys}juqflhcgf_gjahpdksfmufjsbfo]ajY]fY\eWZcVV`SS]QQ[PPZPNYOOYLOXKOXKOXLPYNU_RYcW]iY_m]dt_fvbk|goltqys~wz{y{xzyxzy|z}{|yv~r~}q}oz~ny|lwvhupdrlaolaombpmbpkali]ifZdcV]cTYbQWaQTfSWbOQ_LN_LNdQShUWkXZlY[hUWhTVeQSbLO]GJZAEV;@S8=R97^A9cE=gF?iFBlICpMGrQHuSIzTI~PCTIbYmf~x}yrquomhynlxhkwclu`iq`hiceicgm`jr`psbttcvudwxexiyn{u{yy}æŬƲƷʻμԺԶҶԴ״ڱܮݮ֑zurizk_icT[]LRYENYDMZCK[DL^GOcLThQWjUZp]_m]^gYY]SRWOLVSN]ZUda\ndcmaaj^`h^_i^bkbgndlohojcjb[bWQUNHJICCICCIDAJDDC=A?8?9296/66-25,14+.3*-5*.5*.6*,6*,6**6**8**8**:*+7'(4$%4$%4$%4$%1!".6026028/28/28/28/29.29.2:.2:.2;/3;/3>/4>/4?05?05@03@03B/3A.2A.2A,1A,1@+0D-3D-3F-3F-3G.4I06L18O27R27U26V37W56Y57Z66]76]76_96_:4`92a:3b:2c;3c;3d<4h@6k@7oC8sE8wG;{J;L;M8N8P5R5U4W6Z6\5]6bxA|BEFFGHHIJLKLLLIC@z?|ADEHHJJLKNPQQPQOKFECDCCEEHHHHFD}BBGLJNSOJHMPOQSU›X›XÛVÛVɞY̢Zϥ[ЧXӨY׭[ܲ^`ptz}}~߂任ڱΤŜ˝Н֠ܣޞӓËvmyyenmced_`b_dj_fnahpbiqbfo]ajX\eUYbVYbTW`SS]QQ[NNXMMWMKVLLVILUHLUIMVLPYNU_SYeY_m\br^eu`gyck~goltpxq|u}{{~yzvxxwyx}{{|xu}r{q{nz}mxyitserpdrodroepndokajh\feXadUZbSVbRUbRSbOQ^KM[HJZGI]JLbNPcOQcOQ_IL^HK]GJ\CGY@DV=AU:?S8=R97[C9cF>fIAkJAnMDsSHwWLsQE}YKVIXKf[nerl}z鱗낐끋ނ{|zvrn|stzowwkwugtrhqljolipncsrcvrd{se|uf}{ipuyĝƠƤȩȯʶ̻νֹּԶն״ڲ߲엠وwplbzdWh[NXVEMR?EQ/4?.4>-3>-3?,2?,2?,2C.5B-4C,4C,4F,5H.7K09N08U28V26W35X46Y57Z66]76^87`86a:5b93c:4c;3d<4d<2d<2lA8mB9pD9tF9xH<{J;L;M8M8P5R5U4W6Z6\5]6bk?nApCqDrDuAw?yA}CDEFEGHIIJIIIGFA?~@BGIJKLLMMNPOOOLJGCABCCBBCFGKKJG~EEJMJNRQMLRVRRUWğ[ğ[Ş[ŞYˣ]̤\ϥ[ЧXԪXܲ^fjxx|߁ބ߇߉ދߍߍĽصʩƞ͜ќם۟ݛЎ{sjtvdila`e\]a_dj^em`dm`dm]ajX\eTW`PS\RR\QQ[OOYLLVLJUKITKITJJTHKTGKTIMXLP[OUaU[g[ao^dt_fxah{ck~goksowoys{~}~z{wxyxzy~|}|y}w{s{q{}mwzjuvhuthtrhsqgroeplbki^ffY`eV[cTWcSVeRT_LN[IIWEEVDDYEF[EG[EGZDF[BEZADY@CX>AVT:=T:=Q8;O9;O9;O9;N98N98N98M87F1.I41L72L72K61K61N:3P<3T@7XD9`HJ5>I2Z?HdIRiPVeNTePUbOQYKKOCCMCBSKH[SQaWXaUY^RV\OV\OX[OY]Q[]S\cYd^T]TMULELGBFECDKGHNJKICGF?F@9@:3:6-22).1(+1(+2'+3(,6*,7+-7++6**6((5'':*+8()5%&5%&7'(7'(4$%2"#6026026026028/28/28/28/29.29.2;/3;/3<04<04?05?05>/4>/4>/4=.3=,2=,2?,2>+1B-4B-4C,4C,4F,5H.7K09N08V39W37X46Y57Z66[77^87^85a:5a:5b93c;3d<4d<4d<2e=3mB9nC:sD:uG:yG<{J;K;M8N9P6R5U4X7[7]6^7`;`;a9b:b:b:c9c9h;h;g:f9g6f5e4d6e:e;e;e;e;e;f;f;j>k?l@nBqDsFuHuGyCz@|BCEGGFJIIJJKKKHGECEGKLLMLKLLNžPMNNJGCBBBCDBBCFGKKJG~EGMONOPNMOVZWW¡Zţ\ƣ_ȣ_Ǣ^ȡ\̥`Φ^Ҩ^լ]۱_epw{}~܄܆ۈ܉܊݋ݍݍǻԷɬæøɝϛћ֙؛ޝٗ̊zp}ipvdglbag_^d`cj]dl^bk\`iX\eRV_MPYJMVKKUJJTIISGGQHFQHFQIGRIISILUHLUJNYMQ\PVbW]i\br`fvah{bi|ckgojqmtnxqx}}~z{yzzy|y~z|~~|~u{qznx|lvylvxjwvjvsitpfoodlm`ij^bhY^gWZgTVgUU`NN\JJXFFWCDXBDXBDX?BV=@X?BV=@VD/8C,6B+5E+6I/:Q6?Y>G^CL]DJ]FL[FKVCEN@@K??MCARHG\PT[NUYLSXKTXKUXJWXLXYMY\Q_ZP[SKVLGNECHDBEHFIKILFAGE>E@9@9294+00',0'*1(+4)-6+/9-/:.0:..9--9++7)):*+8()6&'6&'8()8()6&'4$%6026026026028/28/28/28/29.29.2;/3;/3<04<04?05?05<04;/3;/3;/3<-2=,2>+1>+1B-4B-4B+3B+3F,5G-6J/8M/7V37W35X46Y57\56]67^87^85a:5b;6c:4c;3d<4d<2g<3g<3nC:oD;sD:uG:yG<{J;K;L7O:Q7S6V5Y8\8^7_8_:_:`8a9b:b:d:d:iV<=U;CAACCCE>9??8?<5<6/61(-.%*0'*2),7,09.2=13>24>22=11<..:,,;+,8()6&'7'(9)*9)*7'(5%&8/46028/48/28/48/28/48/29.49.2;.5;/3+1B-6A,3A,5B+3C,6G-6I/:M/7T49X46X46Y57\56^66_75`94b95c:4c:4d<4d<4e=5g<5g<5oD;oE9rF;uG:xH:{J;~K8L7Q9S8T5W6Y6\6^8_7^6_6`7a8b9d:d:e9i=i:TA;UBZIAXL>]QAdYGk^KsbNzhPnVsYzc}f{f}kr|nzp}ǝæ{w{rrmolto~rvzqxqyoyo}r{ŨɪӮ޴{ls_]ZPrUGaUDWS>MM9DI5@H4?I5AK7CI5>H5;G2;F18F/7F,5G,3F+2L18M29M48N59M7:K57H46D13?.4>.8@0:C3>D7AG9FI=KI>LTIWSKXPJTJELA>E<:?;:?=;>7158268/44+0.%(-$'0'*4*+9.2<02?35A57C55A33>00<..;+,8()7'(7'(9)*:*+8()6&':/7905:/7:/5:/7:/5:/7:/5:/7:/5:/7:/5:/7:/5:/7;.5.8>/6>.8>/6?.8?.6B.9B.7A-8C.7D.:F/9H0=K1:P05S04U13Y23]55`75c74d93g:5g:5h;6g<6h=7h=7g>:g>8k@7lB6nD6rG7wI9zK9|N7~N7R7T6T5W6X3Z3[4\4a4a4a4b4b4b4b4b4b4d5f9g:h;g:g:f9g=ft?s>t?u@xB|FHGGDGILKLJOMM¢MťPǩQ˫TͮTȩNȩNɧNġMIHMOÝTRMJHGIÚJˢPʢMǞLěKKJIJLMNLJGFEEFHGGFFCFEFHPV]Ħ`ǩaɫbʬcȫ_Ȩ]ǧZʩZͭZԴa۹bjqx{}ށބ߆ޅބڃ׀րԁӁҀ҂ӃՇ؊ڋڴɶ|{~{~{y~u}~ÐØʛϚЖΔΓΔϔҘә͒~~wnvgozclucjrejpggofek`_gXW]ONVGFLA@H>=C<;C>;B?P7:O69M47J14J03I/2I/2I/2J/4I04K25L36L68M79M98N:9P>:SA=UFAXIDYLDYLDXKCTJ@WQCZTD_ZGe_IoeLznTz]cnllpw|}~y{svpvpzq{p{pu}stxx|ĺ²Ƕ̵ϱѰֱ޵酖owdc]TqXJaQ@PQ@JO>DL;AI8>F5;D3;E1:D15E12D02C/0C-/D+.D*-D*-F)-G*.J-1M04O26O24P16L16@)1=)4=)4<+5>.8B5?G;EI?HKDLJELIDKD?E=8>94:94:;59<36:129/06,-4*+2()2()3''@46E77H::H::E56B23@01A12=//<..9++7))7))7))8**9++:/7:/7:/7:/7:/7:/7:/7:/7:/7:/7:/7:/7:/7:/7:/7:/7.8>.8>.8>.8?.8?.8B.9A-8A-8A-8C-9E/;G1=K1:k@7lB4nD6rG6wI9yL7|N7}O5T8U5U6X5Y4[4\4]3a2a2a2a2b2b2b4b4c5d6f9g:h;h;g:f9g;g:g8j9k8o;q=t>w>x?x=z?}CDHGCAFHKLMLĤQĤOãNĤMĦNƨPȪRɬPɫKɫKɪMĥKIGILœSQOKIKěLŜL̢NˡKȞLŚK—IJIKLNNLHFDEDFFGEDDDFFEHNV\æ`ǩaɫbʭaɬ^ɩ\ɪX̬YϯZٹb޿djrw{}ބ݅݅݅܅ڃׂՀԁҁӃӃԆֈ،ڍ̺}x{~ÜǜǑ˜ʝћљϗϖΖϖϘЕȎzy}~wowgq{cmvaktbiofemc`g]ZaTQXLIPEBI@=D>;B=:A>;B@=D?(4='3;*4>.8@5=F;CG@GHAHGBHFAGA.8>.8>.8>.8?.8?.8A-8A-8A-8A-8C-9E/;G1=K18i=:j?9lA8mC5pD7rG6wI9zM8}O8~P6V:W7W8Z7[6]6^6_5`4`4a4a4a4a4a6a6c7d8e9g;g=g=fE@;B?:A?:AAEC>EC>EFAHLGNNMSKNULS[RYcU\fW_lZaq_fydjfngogqitjukvivltrusttutvvuuuur}tqzwryxsw}twwxyx|z~|}~~{||}}|}tu}mpwhkyjmzkn|nn|mpzllvjlwiiweer^_kWXgSTcOP^JKUABM9:N8:M79K57I35H24J14J14K25N58M79N8:O9;Q<;R>=R@>PA)2=(1;*2=.5?4:E:@E?CE?CE@DD?C?:>:486044.25/1:019/.7-,6,+5+*5+*7++7++@22D66H89G78D45@01?/0?/09++9++8**8**8**9++:,,;--9.69.69.69.69.69.69.69.69.69.69.69.69.69.69.69.6.8>.8>.8>.8?.8?.8A-8@,7@,7@,7C-9D.:F09j>;j?9lA8mC5pD7sH7xJ:zM8}O8P6Wh>g=fp?tCxD|F~EFFFHJMNMLILàOĤQƦSƦQǧR˫VʪSȪRǩOǩOǪNȫOɬN˯N̰MίR̭RȨQLIGLNNL›NŞQǠQɣRˣNˡMȞLěKKJKMONOMKIEFHJGFFGFFIHILPX_Ũbǩaɫbˮbˮ`ͭ`б_նdڼfqsw{~ބ݄݅܃ڃ؁ׂցՂփքׅ؈ىڊ܍ޏӶïμ͸ɲ«~~ßΤՠіȏŖΟٜٞי֖ՔӒєЎˆ~urrtvu}t|s{pxks~enw`ir_dj^]eYT[OJQFAHA9@=8??:AB=DD?FE@GE@GHCJMHONMUNQZOV`T[eW]iX_o\cuag}ekiqjqiskukukviuitqsrsstsutstrtp~spytovvovzqt}tuwxyx{z|z}}~{{tt}on~po~poqp~po|nmxmkxji{iiwcdp\]iUVcOP[GHR>?K78M79L68K57J46I35J46K57K57P:R>=T@?UC?TE@SF@WJDWMDYPG\VJ^XL^ZN^ZN^[L`_KbdNjhSrmW{u[ckpmmlu{yyuzv}w}w~uvux}ֿտ剟}uxke^RfSETSCMQBGO@CK==H9(*@'*?&)=#&@#'C$)E&+F',H).H).H+0B(1>)0<(1;*0<-4>37C:?D>@E@DFBCFAEB>?<6:7136046028./8.-7-,6,+6,+7-,9--:..?11C55G78F67C34?/0>./>./7))7))8**8**9++:,,;--;--9.69.69.69.69.69.69.69.69.69.69.69.69.69.69.69.6.8>.8>.8>.8?.8?.8@,7@,7@,7@,7B,8D.:F09k>9k>9l?9nB9oC6qE8sH7xJ:{N9~P9Q7X=Z:Z;\:]9_9a9b:`8`6`8`6`8`8`8a8c:d;g=h>h>h>g=g=h>j@nAtCwF}GGFFGHJLPQOŢQǣOǤPɦRɧPɧPǧPƧMȪPȫOȫOȫOƬOȮOʰQ˱PͱNβOϲTαṶSťNKGILLNÞPŠPȡRʤSˣNʢMǞLěKKLKMPQOMKIHHIJIHFGHGJJJMS[aŪcƪaȬbˮb̯aαcҶcۼjmwx}݀~ބ݄܅ڃ؁׀ցցփׄمچۈ܉݉݌ߐڼзʳƮԿιξǷǡӥ؟ԗ̐ŏƌɎɕѠܟݝݚڗ֑ٔӓҐƊxtrrs}pxrxrxpvlr~elv^eo\agYX`SNUHCJ@;B>9@=8?=8?<7>@;BB=DE@GFAHGBIIDKMHONMUPS\QXbU[gX^lY`p\cuag}ekjqkrjtkukukviuitprrststsurtrso}roxrmttmtxot{ru~tuwvxxzx~{}~|ywtvsurtqqn}olzlizkhmk{gfs_^kWVcONYEDO;:I54L87K76J65J65J65K76L87M98R>=R@>SA?SDATEBUHBVICUKBXOFYRH[TJ]YM`\Pa_Pb`QcbPdfPgiQomVuqX}w]chmvssz{|zx{x~z~zx|z|׿׿댨ڃ~x{lf[OcOAPTDNRCHO@CJ>@G8=D5:B17B/3A-/B,.A+-@*,?)+>(*?&)?&)@&)@&)C&*D'+F)-H+/I,0H-2B+1@+0=*0;+.=.3?56C:=D>>HDEHGEHFGEDBA=>;76:469338.-7-,7-,6,+7-,8.-:..;//>00B44F67E56B23>./=-.=-.7))5))6**7++8,,8,,9--9--8-58-58-58-58-58-58-58-58-58-58-58-58-58-58-58-5.8>.8>.8>.8?.8?.8@,7?+6?+6?+6A+7C-9E/;G0:N08P17R27V45\56_77a86d93k;7l=7l=7m>8m>8l?:l?:l?9nB9oC6qE8tI8yK;|M9O9Q7X=Y:Z;\:]9_9a9b:`8`8_9`8`8`8`8`8d;ei?i?h>g=j@m@pCvEzGIFEGHJKNOQŸN˧Q̨P̨P̪Q˩OʨNǨMƧLƩMƩKƩKūJǭNʰO̲QδSϳPβOϳRϲTϰUʫQãNJHIJLÞNŠPǠQȢQɣNȢMǞL›LKLLMPQPNLJHHMKIHFGIKKKKNT\§bƫdƪaȭ`ˮbͰbгcֺgpu{}ރ߀}߅݄ۄق׀ցׁׄمۇ܈ފފߋފߏڸѴΰǪó̩͠բٜՖϑʏȋƈÍɖԠޟߞߙܕڒדӒʍ{vsqpzoupvruqtlp|cjt^bk[^eVSZOJQD?F>9@=8?>9@=8?;6=@;BC>EGBIHCJIDKJELNIPOLUQT]RYcV\jY_oZ_r\cvagdjkpkrlskukukujtksprrsututustrso}tnzrjusltwmuypu}rvvwwyxx|{|~{~v|tzrwotl~qk|oi|mjlk|hgua`lXWaMLWCBM98H43K76K76J65J65K76M98O;:O=;TB@RC@SDATGAVICUKBVLCVMDZSIYUI[WK^\Ma_PbcSdeUefThjRknSrpWvuYz]biktqry|~zz{{||{~ٽ懡ԁ~x{ie~WNaNBPRENQDKNBFJ>BG8=C49A06B/3A-/B,.A+-@*,?)+>(*?&)?&)A'*A'*A'*B(+F)-F,/J-1I.3D.1A.2?,0<-0<02?56C:;C?>JIGLKIMLJJIGFBA@<;>88=7780.8.-7-,7-,7-,8.-:..;//=//A33E56D45A12=-.<,-;--5))6**7++8,,8,,8,,7++7++8-58-58-58-58-58-58-58-58-58-58-58-58-58-58-58-5.8>.8>.8>.8?.8?.8?+6?+6?+6?+6A+7C-9E/;G0:L1:P17R27V37\58_77a86d93l<8l=7m<5n=6n=6n?9n?9o@:oC:pD7tF9vH8zK;}N:P:R8X=Y:Z;[9]9_9`9`9^9^9_;_9_9_9`9`9d;e7?;4FIBJKDLKDLLEMPIQPMVQT]TXcX[jY_oZ_r\auae~ciinipkrlsmtkujtltqtutvsvswsvrvp~uo{qittjswltzou~qxtxuzvy{y{~v~u|sypvmslrkqllk}hgwbamXWaLKVA@L87G32J65J65I75J86K97M;9P>BE9=C49A14A.2B.0C-0B,/A+.@*-?),@'+@'+?&*?&*?&*?&*B',C*.G,1G.2F03C02A.0=//=11?75B=:D@=LKGNMIPOKMLHGFB@?;?;8?:791/:0/8.-7-,7-,8.-:..;//=//@22D45C34@01=-.;+,;--6**6,+7-,8.-8.-6,+5+*3)(8-58-58-58-58-58-58-58-58-58-58-58-58-58-58-58-5.8>.8>.8>.8?.8?.8?+6?+6?+6?+6A+7C-9E/;G0:L1:O19Q28T47Z68_77a86e83l=7l=5n=6n=6o>7o>7p?:o@8qB8pD7tF9vH8zK;}N:P:Q8X=X9Z;[9]9^8_8`9^;^;^;_;_9_9_9`8c;eh=h?i=i=h:l>o@sByE}FCA>BBEFJK¢MţJɦJ˧GͩIͫJΫMάKͬMʬJȬIǫHŬHĬHŭIǯKɱMʲNζRʹPβQϳRдSαSʫPŦLCFHKLÞMÞNÞMȤPǣOğNLMNLOSRROMKJKNNKHHILLNLMPV]eŭgū`ȭ`˰aγdҷfڿnv}}~؁܂ބރ܁߈݆ڃ׀~ـڃۄއ߈ܹ۶ذҴڭӣɜſǜԠڟۗԒЎ̌̈ȅnjΖڜᓾޔڒЎĄ}xrnzmupvrurtnpikxbdp]]gZYaTOVLEMCFIBJKDLLEMMFNPIQRLVSS]TXcY[hZ]l\_r\aubd}dhiminkpkrmrmtlsmsrsutwtwtwsvrwqwo|shvtjuwkuzow~qzszu|vyyy~z}q}p{nxnwmvnununkhggyaanVVbJJU@?L76F21J65J65J65J86L:8N<:P>RH?TJATKBVNCVPDURCYWHZXIZ[K\_L_bOcfSejVglUknQorSvwW||Z_flrzvw||z~z~~~~»ܾ鈝Ԁzqra]tWN_VLWRFPQFNMBHI>DE9=A59?03A.2C/1C-0B,/A+.@*-?),A(,@'+>%)=$(=$(=$(?&*?),D+/D.1F24D13@01>00>22@86C>;EA>LKGNMIPOKMLHGFBA@.8>.8>.8>.8?.8?.8=)4=)4>*5@,7B,8D.:E/;F/9N4=Q3;S4:U5:Z6:^78b97g:5m>8p?8sA:r@7p>5n>4p?8qB:sD:tF9vF:xI9|K<O;R=U];[8[6]7`:\:]:^;_<`;bf;e:f8gpBsCzI{H{F~EFHKIJIJIIHǨNͬǪHѫJկN԰OЮMάJ̫JˮJ̰L̰L˲MʳM˳OʴO˵P˵P˳O̴PзSѸTѸTδSͰRˮRȩN£IEDEGIHƣOJFFGHGDKLMLKJHJQMIJMORPUTTUY^ba¨]ƭ]̳cҹiow~؃Ձ׀؀ڂہ܂܂݆ل~zy|؀܃ڲصܫ֥ΝŘŖ͖ҘԚؕӓьʇdžƈʍϐӔٗޚ㔼ߒڔԏDŽ~zuq}oworkm|ihxihxihveeq\ZeUR[IBJG=FB8A@6?B8AD:CD:CD:CD:CE;DG=FJ@INDMQGPSIRQKUUS^TVbXWeY[j]^racxeefhjkimjnkpospvqwsxstururtquqtpvp~vn{qftrhsuisxku|lw~nxpzrwuwyw~z{zz|~xwts|r{qyrxspohgv\[gMLZ@?R:8O75M85I41K84N;7P=9O=9P>:SA=TE@WJBVLBWMCYOEZRG\TG\VH[XI][L_^L`aOcfQhkVlq[qv`sy_y|_|_cgcal~ļ˹βϳԾ훱̑ϕڛ眼爛zip_`VShOIWJBMSIRSIQSIQQHMMBFG;?C47B/1A*0C*0B)/A(.=&,<%+;$*;$*8!'8!':#)<%+?(.B-2G06H38E13D13A12>22@65F>43:0/8.-:0/;10<00;//B44@22>./<,-:*+:*+:*+:,,4((4*)4*)5+*4*)3)(1'&0&%6+37,47,48-58-59.69.69.6;08;08;08;08;08;08;08;08.8>.8>.8>.8?.8?.8=)4>*5?+6@,7B,8C-9D.:F.;N4?O4=Q3;T49X59^78c:8g:5l=7o>7r@7q?6o=4o=4q?6rB8tD:tF9vF:xI9|K<O;Q^<\9\7^8`:^<^<`=ag=e;f9e8f7j:n>sCvE{G}FFGKMNMHIIHEGƧL̫LͩHҬIְMױPӯNϭKήK̯KͰL˲M˲M˴NʴOɶPɶPɶP˵P͵QзSѸTѸTзSдSϳRϰSɪOGCACGGŸKJGEFEEGIHIHGGEHNMGHLPPPUTVYZ]_]ZŬ\εeֽmry~׃׃׃؂فۃ܄܅܅ۆل~{{~ۂޅܳݥԡΛƘ–ÔȖϖӗ՗֖ԓю͉ɉʊ̎АӔږݚ㕻ܖ֑ʇ|xtrzornm}kjzljxkiwfdo]ZcTQZIBJG=FB8A@6?B8AD:CD:CD:CE;DFYLCXNDYOEZPD[SF\TG]WI[XG_^LbaMdfQilWps^tybx}fzdcchlhhtů˲Ի唥шȏӎَޚ鉙wgl[\zSPeNHVKCNRKSTJRTJRRHPNCIH<>D66C02B+1C*0B)/A(.=&,<%+;$*:#)8!'8!'9"(:%*=(-@+0C.3D15H57F67F88D88E;:HC@PLITSO[\W\]X[\WXYTTSOMLHFEAC?.8>.8>.8>.8?.8?.8>*5>*5?+6@,7B,8C-9D.:D.:K3@M3>P2:S4:X59^78c:8g:5j;5n=6q?6q?6q=2p<1s?4sA8uE;uE9vF:xI9|Ka?b=c>d?f?g@i?e9f7g8j9m\NE\PD[QE\SD]VF^WG^XH]ZGcbNgfQlnXrv_z~gjmmjhloouʔ˙Ɯá¤øǻǼźǹ˹Ӻܿێą}|ĆБަꊖt~bgVWuQNaPJXOGRTMUTMUTMUTJRPEKJ>@F88E24B+1D+1B)/A(.=&,<%+:#):#)7"'7"'7"'7$(9&*;(,>+/=-0G7:J:=K22<00;--:,,9)*6&'5%&4$%4$%3%%3)(3+)3+)4,*3+)2*(0(&/'%7,48-58-58-59.6:/7:/7:/7;08;08;08;08;08;08;08;08.8>.8>.8>.8?.8?.8?+6?+6?+6@,7B,8C-9C-9C-9J2?J3=N35p>3q=2q=2s?4vB7wEd>f?g>h?i=g8h8k:n;r?wB}GFFGJNRRRPKLJHFGŦI˪KҬIװK۴OܵPزOԱMҰNгOͱM̳N˳OʴOɵRɷSɷSɷSθSϸRйSѺTԻVֽVؿZ[ھZؼYӴWɪOE?BCBDHFA?BEDDECABDGMKIKNQRRQVZ^_]ZVWƯ_q}Ҁ~׃؄׃؄؅كنڄكك؂؂ۂޅڢӝΗȘ˙ϙәԗՓՒԔϔϓϑΑϐϑБѓԔؘݙߛ♽ᘺޗ۔ьĄ~xxw}rsroqm~qm|qjzico[U_PIQI?HF?V22R0/S10Q20N0.N0.P41R95S;7T<8T?:XC>ZG@_QF^RD_SE_VG`WHaZHb[Ib]IigRmlWts^{}ekoqplklotΔܣԣͦ§«ƩȣǝėōƎɍȋąšʦɫǸדČ}y~s{p}wËѓڛ蠾튖t{adVVrSPcTN\TNXWRYXSZXQYVOVRINLBCH::G55C,2D+1C*0A(.=&,;$*:#)8#(7"'5"&5"&5"&6#'6&)8(+9),C36E69J;@KABMDGOKJSQRWWUceddfcdfeceb___YYWSSSPOMPHFNDCJ@?H>=G=.8>.8>.8>.8?.8?.8@,7@,7@,7@,7B,8B,8B,8B,8G1>I1>M1=P2:U5:\8:c:8h;6i:4m<5p>5s?4r<2s=1u?3wC8xF=wG;xF;yH9}I;M:O:Q9T:Y;^AbAa?ae=gGF:DD8BE9CG;EI=GH:X?;YA=]EA_KDbQG_SEaUGaXGd[Je^Lf_MfaMpnYss[yya~hnopnmlmp{̌ߟרά¯Ŧʤ̟˚ɕȒɎɌ̍ΎύΊʃÁȦϫαͿڷѱˬɽ޽۟ɐ|{uulpfnlutwϖࢸx~eh\\x[Xi]Wc^Y`^Xb\Yb]WaZS[VLTODHJ<;I77D-3F+4C)2A'0=&.;$,8#*7")6!(4!'4!'2!'2!'3$)4%*5&+:)/>/4E6=H=AMDIPLMUSVYYYefhfhgghjgihdeg_a`[[]XVWXOPVLKRHGPFEMCBH>=B66=11;--:,,;+,9)*8()6&'4$%3%%2*(1,)1,)2-*1,)0+(.)&-(%8-59.69.6:/7:/7;08;08;08;08;08;08;08;08;08;08;08.8>.8>.8>.8?.8?.8@,7@,7@,7@,7B,8B,8B,8B,8F0=G/6t@5t>2t>2wA5yE8xF=wG;yGb=c>b=c>d>e=h=izAEILJLIJLKIIHLLKK¥IæJȩNΫMխKڰL޴PݶQڴQղNԲPѴPβO̴P̴RʶSʶUʸVȸXʸVͺTкTһSԽUֿUWXXپWۿ[^ڽ_Ե[ʪSLIEGIGFC@ADB~A|?}@BFJONMQVYXWSV[\YY]^Ʊbտl~ڇڇׄք؆ՁՁԁՂՂՂՂՂچ܅އ؛НԟנڞۘהՒё˒ɔˑʓ̑̔ϒϑ͑ѕՖؚܙݛߛߔؒӌǂ|uwx~vwurtmqjznfue]jVNYMCLHHI=GG;EMAKNBLQEOTHRWKUZNX\PZ^S[`SZbU\hXbj]gm_nm`qm`tm_voaxoc{pd|pf~rhulvmvovrvrxqwpxownynyn}o|n~m~m~k~~k~k~j}quww}wywsyr|q~s~s}twqlh]\uNOmEFg:=a47[.1W-/X.0X01U./P,,S10T53X:8Y=:[?<[B>`GC`LEaPFaSFcVFeYIi]MjbOldQleRwr\xv_}{dhmprqrsv|Ȉݚ׬αĩ˦ϡќϗ͕ВяЍЌԍՎՊхÎĝϩ԰շۼոǫ̭شꥬإˑyvrohibffkmsr|z‘עﯾـqskhhevhepjelebkdajd^h_ZaXQXRGKJ?=H88G.4G,5D*3A'0=&.:#+7")6!(4!'3 &1 &1 &1"'2#(4%*5&+4#+9*1>18E:@JAFOJNVTW[[]degefhhikijlhikefhbbd`^_^UV]SRZPOWMLSIHLBAD88=11;--;--<,-;+,:*+7'(5%&3%%2*(1,)1,)2-*1,)0+(.)&-(%9.69.69.6:/7:/7;08;08<19;08;08;08;08;08;08;08;08.8>.8>.8>.8?.8?.8A-8A-8A-8A-8A+7A+7A+7A+7E/4t?7uA6u?3v@4yC7{G:yG>yGd?h@h@iAjBlAm@o@p>uAv@{BEIKNK–MKJHIIKJLL§L§LåKŨLʫPѮPԬJڰL޴PݶQٳPղNӱOѳQϳR̴R̴TʶUʶWʷXȸY˸Y̹SкTӾUWWUTTVؿX]ܿaڽaԶ^̬WƧTKJJKIE@>@|@z=x;z<}?CHLLMQUYYUTXYXVY_dϺktׄ݊ڇׄ؆ۉ׆׆׆׆ׄׄׄׄۇ݉ۜҞաء۟ܙڕהӒ˓ȒƐŒȒ˔ΔϐˑϔӖ֚ۚܝޜڔՏʅ~wy{{zvssl~ofwmbrcYdVLUKAIG;EF:DE9CG;EJ>HK?II=GG;EMAKNBLQEOTHRWKUZNX]Q[_R[bSZeV]jYcm]hp`moapn_rm^spaxpbyrd{sg}uiwkxlwnvotpvowpxoyp{p{pqppomlk~k~oqst|svrqvoxmyovkofe_}WTqIIf>?`68`25^02[-/X,-X,-V,-T,,S-,Q.,S1/V74X;7X<8[?;`D@`IAaOC`SCcVFg[Kk`NmeRqiVqkUzu_zxa}diorvxzˏߛ֮γúıʮ̫ѧգ֝әӘ֖ؒ׏׍؏ڏ܌نЁËȒȢԯڶۼ۹ڲװӱҷ׸Ƕóְ➡Νyusqnlhi}jlosty{ϡ갸ߊ}yvurtq|rovlirkhqhepd^h\U\TIMK@>I99G.4G,5D*3A'0=&.:#+7")6!(3 &2%0%1 &1"'3$)3'+4(,4%,9)3>1:C8@I?GNIOVTY[Z_abfaeheilhlojkohimfejecfd[\bXW`VU]SRXNMOEDE99=11:,,:,,;+,;+,9)*7'(4$%1##2*(1,)1,)2-*1,)0+(.)&-(%9.69.4:/7:/5;08;06<19<17;08;06;08;06;08;06;08;06.8>/6>.8>/6?.8?.6A-8A-6A-8A-6A+7A,5A+7A+7D.:F.;I/8O19U5:[9:a;:f=9i<6o>7sA8vB7v@4wA5zE7}G;{G<{G<{G:|H:}J9L9N9N9S;X=^BcDdAd=d9e:jAkBlCnBpBrAr?t>y@|ABDHIKKMJIIIJL¤LJJħKħKŦKǨKͬOҰOӭJرLܵP۵P״PӱOұPѳSͳR̴T̵UʶUʸVʸVɹW˹W̹SкTԿVYXUUӾSWX־Z^b׾aѶ[̱XLKKLLHB~>|?y>w;u9v8z<~@EJLMOUWXUWZYUSV_doxڇމڇׂهފډۇډۇۇچنچ܈ߊݜӞסڣޡߝۗוӓ̓ˑɏǐȔʖΘёʓΕҘכܝޟݙؓ͊{|}zyqsj}odtk_mbVbVKSLAIH;DF9CF9CG;EJ>HK?IJ>HH%+:#)7 &5 '2%2%0%1 &1"'3$)4(,5)-8)09,3>3;C8>H>FNHLUSX[[]_`dbcefgkjkmklpjkmihmhfig^_e[ZcYX`VUZPOPFEF::=118**8**9++9++8()4&&2"#-!!3)(1,)3+)2-*3+)0+(0(&-(%;06;04;06;04;06;04;06;04>39=26=28<15<17;04;06;04>18=15>/6<-2<-4<-2>-5>-3A-6A.4A-6A.4B-6B-4B-6B-6B+5E.8J09L18Q27U58]99d<:j?9nA;uE;wE:xD7yD6|D5~F9{E9~H>K?L>~K:~K:N;P>O;U>^DgHlFl?k7i4m=n@pArCtBwByA{ADCDGKLONMMKLLàLãLĥKǥKȧJʩJͬMϭLЮMЮMЮJԳJմKֵNִPԴQѳQϳR̲SɯPɱQɲRȴSɷSʸRʻT̻SнVӾUWYZWXWϼSҿV]`_]оXκYɲUŭUQOHFBC|B|Cy@t:q5t5{HN>HO?IM@ILAIK@HI?GI?GMCKODLRENVFPYHR^JU`JV`LWbR]cV`h[el^koannbpn`ql_ppcuqdvsfxuh|wj~xkylyl~~q|o{m~zl}{m~}ortpomlk~kkl~ro~kykwmwounsloef|ZYpJIhBAf>>c;;^66Z01Y,/Y,/Y,1V,.V,.V,.U-.U-.S-,V0/W40X51W61X72[:5Z?6\L?\SDcZKg`NkdRohUtnXvq[yu\|afghlvzr¼ֺؘ¿˻ӹص٭ת׫ߧࢢޞᛣ䙣蓡莟玜匚㌕يҊ͉ɋŜ̤ΰԺ·Ǻȼɽw|tyn~wlzwkwuisqfnnciujnzpq~vt|wsytpxun||t}{yէݧ⩿藩זږژ٘ӕȐ{}vvvtwtwtvsusuw{Ξ䥵뛢َċ|~pqljebuaZj[S`XMUQEIO?@R9=N47H-2B)-@'+='*:$'7"'5"&5"&3#&3#&1"'1"'/#'/#'0$(2&*7,2@59I@EQKMWQUZVWgehjhimmooqppqsnpolmoljkrijl`bbVX[OQWKMPDFE9;<023')2&(1%'0$&2#&1%'4%(3')4*)3+)4*)3+)2('/'%.$#,$";04;04;04;04;04;04;04;04>37=26=26=26<15<15;04;04>26=15>/4<-2<-2<-2>-3>-3A.4A.4A.4A.4B-4B-4B-4B-4B+5D-5I06L16O27T47[98c=:h?;mB;tE;vF:xD7yD6}E6G8}D9~H~K:~K:N=Q@Q@WC`FiHnFp?o6n5q=r?s@tAv@y@{?|=CDFGJKMLMMKKLŸKĢKƤKǤJȥI˨JάKЮMҮMҮMѯKӴJԵKյNӶPѵRδS̲SʲRȯRȱSdzTǵSɷSɺSʼSʼQнTӾUWYYYXWVX[]]ZWοX͹Z˳YíXRLFB{A|C{DzCv=s9s7y:~A~JLNMOOQRVTWTONYƼgyր܆ڄڄވ߉܆߉ވވ߉ݛל؞ٟٞڝ؝ך֔ԍϊʉƌǎȐǏƏƎǏ̔Ҙܜ✲㛱ڙғˎ{{npbsk[hcQ]ZFOUAJUBHP?IP?IO?IM@IM@ILAIJ@HJ@HMCKODLRENWFP\HS_IUdJWbLXcS^cWchZgk_kn`onbpn`ol_prdurevufyuhzxi|xkyjyj}{m~|k}{j|{j||k}moqpnmj~i}i}i}i|m|ixgvgtitjshofl{X^rNPiBEc<=b::`88[31X./W-/W-1W-1W-1V,0U-.U-.T-.T-.W10[54Z73Z73[84^;7]@8\L?[RC_VGcZIg^MkdQsmWxrXxsV~_hnoqttxLjݝ޺ѿǹϷص߱ޫܩݩ⦤㡢㜡㗟璞荝苛芚猘䌔ߌٌύʎƏñƹƻv{ms}irtdnnakl\fjZdjYchW_eTZbRUaQReWVj\[g^Yd]Wc_Vie\lkfnoqlqwu{ȐˑʑȓȖē~xyvvyu{vzuwssprsv{֞墲랤ޒˍuvqoif{c\n_TbZOWTHLSCDT;>R57H.1C),@'*?&);%(8$&6!&5"&3#&3#&1"'1"'/#'/#'2&*4(,9-1@59J?CSJM[RU]WYf`bhdekijpnopppooommmmijrhik_a`TVXLNSGIL@BB68:.03')2&(1%'0$&0$&1%'2&(3')3)(4*)4*)4*)3)(2('0&%/%$<15<15<15<15<15<15<15<15>37>37>37=26<15<15<15;04>26=15>/4<-2<-2<-2>-3>-3A.4A.4A.4A.4B-4B-4B-4B-4A*2D-5I06K05N16S36Z89a;:f?:mB;tE=vF:xD7xD6{F6}H:{E9~H~K:~K:N=Q@TCYEaGjIpHsBu>u;v@wAxByA{B}A~B@HIJJLLNONMKKKK¢KäJţIǦIʩLͬMϮMҰOҰOӱOӳLѴLҵMѶOѵRδS̲SʱTȱTƲSdzTȶTʸVɺUʻT˽TнVѾWҿXZZZYY[\^__^\]_Ѽ_˵_XPG@y={B{ByCx?u;t8u7w=yF{H~JHJJKLSQSQNO\k{ف߇݅݅߇ߜ؜؝؝؞ٜכՙՕӎΊȇ‡Ə̒җ٘ݘۛڙҔ̏|{nm_pgWdaO[XGOUAJWDJP?IP?IO?IM@IM@ILAILBJLBJNCKODLRENXGQ]IT`JVeKXeMZeS_dWajZek^hp`mn`mp`mm_nudttfuxgyxj{{j|xi|zi|yh{zi{{iy{iy|jz~l|l}m~nnl~j|gzfy~exfyfwfuererdrepbl^e~Y`kFMf?B`9<^67_56^45Z1/V,-X.2X-4W,3V-1U,0U,0T+/S,-U./V31Y64[86Z75[:5^=8^A;^J?^NAaQBbUEfYHnaNvlS}tW{uS\gmqsx{Ǎ՛ӹ˴ֳޱ孵樯奪䦦楤衤霠锜卙劗劗劘㌕ێԍ̍Ŏ{wqnjgydcu\_mY[bSX]PW[LSZKP[JPYILWDHTACTDEWIH[MLYPKWPJWRL]YPb_Xgeffgkjmtuy{{z{z|wtxt~yzx{trnqprty~Ȗڝ墪駫루⚠ԕƓzxpkhaqdZc_TZZNN[IIX@@U8:J03D*-@'*?&)<&)9%'7"'6#'3#&3#&1"'1"'."&."&5&+7(-;,1B38J;@SGK]QUbW[cX\g^alfhrlntpqsopplmnhjqegj\\^PPUGGOAAH::?119++5''4&&3%%3%%3%%3%%4&&3''3)(4*)5+*5+*5+*4*)3)(2('=26=26=26=26=26=26=26=26?48>37>37=26=26<15<15<15>26=15>/4<-2<-2<-2>-3>-3A.4A.4A.4A.4B-4B-4B-4B-4A*2D-5H/5J/4M05Q35X67^;9d=8iA9pD;tE;vD9xD7zF8|H:{E;}I>L?L>~K:~K:N=P>UAYB`FhGoEuCxAz@y@{C|BDCEFEMLMONPOPONLKLML¢KäJŦKʨNˬOЯPұPұRӲQгMеNѵQ϶QδS̴T˲UɲUƱTƳUǴVƶVȸXɻXʽWʽWϽWѾWҿYXZYZY_^_^`_aaccѼaȲ]VKB{={B|CzDy@u=s:r6r9wDxHzG}FHGIIPOPPLO`o~݅ޝٝٝ؛֜ךՙӘғώʈÅčʐГՔ՚ٗҕˑŽ}ymj\mcS`^LXWFNVCIWDJQ@HP?GO?IO@GM@IMBHNCKNCIODLQDKUEOYHP_IUcLVgMZfN[iU`hWakYen\hp^jp^jp^lp^lwesygw{iy|jz}j}|i|zgzyfy|gx}hw~izkzl}k{k}k{k~jzgzev~cv~ct~cvbrbrdpftfralZbwOXpHP`7=]48\24\23]34]34[/.V,-X.2W.4V-3U,2T+1R+.R+.O+-Q-/T00W33W53W53X64[97\=8`E@N47F,/A(+@'*='*:&(8#(6#'4$'3#&1"'0!&."&/ %4#)6%+<)/?.4F5;O@E[LQaUY`TXeZ^laeshlvmpulorilqghmaafXXZLLPBBI;;C55<..8**6((6((5''4&&4&&5''6((4((4((4*)5+*6,+7-,6,+5+*5+*>45>45>45>45>45>45>45>45?56?56?56>45>45=34=34<23>24=13>/2<-0<-0<-0>.1>.1A.2A.2A.2A.2B-2B-2B-2B-2A*2C,4H/5J/4L/4O13W56\97b:8g>8nA;rC9sC7uD6wF8yH:zF;{I>~M?~M>|K:|K:N;P>S?U?[AcBlAtByB~D|>?ADGJLLOOPOQRSQQPOMMMM¤LĦNŧMɪOˮPίRвRбTϳRʹPʹOεQ͵S͵UʳUDzUŲVƳWijWĵXŸXǺZȼZɽ[ʾZοZоXоZοX[Y\[b`a_baefabԿb͸_XPGC}B|CyBx@u>r:n5l6uDvGxF|E~HHKLPMLMJOarف޿ݞܜٚיԗҗіЏʉĄ~ǏΒїՖѕˑÏ~wkgYh_R\\LVVGNTCIUDJP?EO>DM>EM>CN?FMAEOBIQEIPCJSDIWFN\IO`KTeNViOZjP[lU_mV`oWdqYfs[hs[ht\jt\j{cq}euhxjzi|gz~ex|cv~gwiviyjwjzjxjziwgxfucu~bq}`r|`o}`r`o`odoftfq]hwOXjAIb9?\18[15]03^23_34_32]//Z./V-3U-5T,4S+3Q)1P).O(-M)+K')M+*Q/.P1/P1/Q20T53W85_@;dG?lPEsYJxaOkStV|Y[aiowύٜެܰ֫ˢŠŧñϬܫ穴짯ꎗ揖䊐ڌԎΎŎ}zsn}hw~juputurlohxd[r\QhQIaHA^E@\C?Z@?X@>WHCTGATEBUFCXFDWCBS?>O=;J86I:7H:7G<8G>9IB(+<(*9$)7$(4$'3#&1"'0!&-!%.$2#5"&:%*=*.B/3I945=34=34=34>24=13>/2<-0<-0<-0>.1>.1A.2A.2A.2A.2B-2B-2B-2B-2A*2C,4G.4H/3I.3M02S34Y75^85c<7j?8nB9pA7qC6tD8wG;xF={I@~LA~M>|K:|L8N;Qi>sC|FEAACFIKÔNONNOPRSTS¢URQQOP£PåOƨRȪRʬR̯SͰTαSαU̲S˳Q˵R͵U̵U˴VȳVƳWòVijYĵZķ[ùZŻ\ƽ^Ⱦ_Ⱦ]Ϳ^ξ\ͽ[̾[ͽ[]^_cccdefhf_acл`ůZTLJC~EyBv?t=p9l6h5qCsDvDzF}GHLMO}KJJJPdtڂ۾޽ޞܜ٘՗ҕЕϔ΍Ljz|Ɛ˔ДϓʑÐ}ui}dXf]PZ\LVWHMTDGTDGO?BN>AL;AK]05_27`25_13_13_11^00^..Z./U,2S+3R*2P(0O'/K&-J&*J&*F$%I'(J*+L-+K,*M.,P1/S41^=8eD;pPEy\NfSqY{[^ajw†ˋՒڞ׫԰ɧĪѬ⬸쩳铖㍍ՏΐƐ|usplx}hq}hmikjg|haxd[iRJcLD\C7V=9W>:W=S@:O<8K84I75F74D63D95F=8KA?OECSHDYNL[OOXNOXOT]S[^Va^Vcd\kcZkf[lj_pobtrcvqbum`rjarg`pj_pncttgy{m~o|~q{wjtuisrjypktq}|™͜ҡѡΛÖ|v{{ooxidwd^u[ZlOQZ@CM36D+.A(+>(+<(*9$)8%)5%(3#&1"'/ %, $.$0!5"&:%*<)->+/E26O<@XEI_ORbRUeVYiZ]k\_j[^g[]eY[_QQ[MMTFFM??G99B44?11>00;--;--:,,9++9++:,,;--;--9--8.-9/.:0/:0/9/.7-,6,+@67@67@67@67@67@67@67@67@67@67?56?56>45>45>45=34>24=13>/2<-0<-0<-0>.1>.1A.2A.2A.2A.2B-2B-2B-2B-2A*0C,2G.4G.2H-2K.0R23W53Y62_:4f=7j?8k@7mA6rC9tE;wG=zJ@}MA}N>|K:|L8N;QS;W;^=i@tDIĈJECFHI“KLLKLMOSTVTƥXŤUģRâQâQâQäQĦPɫUʬTɮU˰U˰U˱TʯTʰSʳUȴS˴VɴWɴWǴXòVWĵZöZ·[ú]ż_ľ`Ǿaȿ`̿_̾]˽\ʾ\˽\^`acdeghiiha`aн_Ʋ[UOOE~Dx@t>r=o:j7f5l>nBrCvC{EIKMO}KIHHOdw܄ֿؿڽݼ߽ޜڗՖѓΓ͓͍Ŋ~wz}~ƓΒ͒ɑ{shybVd]PZ]NUYHNSCFRBEO<@N;=L9=J:;M:>P=?S@DVCEUBFXDF[FK_ILcLRiPTmRYnSZtV^uV^vW_vW_wWbxXcyYdzZg~^kanetixkzizfwetfrdp}amz^jz\hy[g{[h|\i}]j}]j}[i}[i[i\j^l^k^h\fWa|MWpAKf7?`19^/5c4:d37b14`/2^..\,,\*+Y+-S*0Q)2P(1N&/K&-I$+H$(F#'E"&H&'I)*J*+I+)J,*M/-Q2/]:4dB9nLBxXIePsYafjq|ĈˎϚȣǬȩ֬䮸疔ݐΒƒ~vollyltmsmokjydaq]VkWP_KD[G@X@ZF=UA:Q=6Q<7N;7J86G85G98I>(+=)+:%*8%)5%(3#&1"'/ %, $-#/"5%(<)-<,/=-0A14I9..=--<,,<,,=-->..>0/;//;10;10;10:0/9/.7-,6,+@67@67@67@67@67@67@67@67@67@67@67?56?56>45>45=34>24=13>/2<-0<-0<-0>.1>.1A.2A.2A.2A.2B-2B-2B-2B-2@)/C,2G.4G.2G-0K.0P22U64V42[84c<7g>8h@8k@7nC:qE|K:|L8N9P;T=Tp>n;i6d5hn?sAyE}GJLP~M}JHGOdwޅؿڿݽ߾ޛٗՕВ͒̒̑nj~{vy|}őʑʒƒyrgxcUd`P[_NVYHNSCFR?AN;=N:;L8:K78M9;P<=U?BWACWADYCE^EIbILgLQkQTpSXrSXwW\yV\yV\yV\zW^{X_|Xb}Yc[e_idpiujxjxguescnai{\dwX`uT]uT]xT^yU_~Zd}Yc~Xc~XcYd[f]h]g[eV_MVrAGg4;`/5b/6d37g6:f58c25_.1\*+Z()Y'(X'*S(/P(1O'0M%-I$+G")F"&D!%E"&H&'I)*K+,J+)K-+N0.R30\93b@6kI?tTE}bMtYfmstz{|ę̪ۯ豷䘑ՓƖ{skhvionptstqmhvb[iUNaMDWC:T@9Q<7R=:W??YCE\CFZEBXF:VF6XG7[I;_L>^J?[E:W@8Q:4L72G32D20D44F87H<>SED[ML^POYKKVHHZLL\MPXLN]NS[LSYISZJU[KX[KXYHXVEUTFSVISZJW[IW\JXdP\mYduajtagsbhpclocqqeywmx{~sqnjkly\^dJMS9(+=)+:%*9&*5%(3#&1"'/ %+#+#0!$6'*=.1>/2=.1@14G8;N?BWHKVGJUFITEHTEHSDGSDGRDDSCCSCCRBBP@@M==J::H88G77A11@00?//>..>..?//@00@21=11=32=32<21;109/.7-,5+*B87B87A76A76@65@65?54?54>43?54?54@65A76B87B87C98=11=11?11?11?11?11@01@01A.0A.0A.0A.0B.0B.0B.0B.0B-2B-2C-0E,0H.1J01N21P20U31X51Z71`;3d=6iA9kC;oD=uHBwHBvG=xH:zI8}M7P:R:V?WX;=]@D_BDcDIgIKlMRoQSqRWsSV}Y]~W\|UZ|UZ}U]W_Ya[c`i`i_j]h\g[fYgYdxS[wT[vSZvSZxS[zU]{V^|W_ZcXaU_Xb[e]g[eXbR[}JQr?Fi6;f17c05b-3_-0d25c12`./]+,[)*Z()Z('Y(+O$+N%-M%-L$,L$,I%)I%)H$(K)*J()I'(G(&H)'K,*N/,O0+U2,];1fD:kN>qXD|hOz^iuux|~ǮӦԪர백鞒ښʔ|urtsm{jpqovoypxopewcXiUJ`LAYG;ZH>YF?WD>U@=UA@ZED]JD^L>aP>fSBgTEgQCaK>\D:V?7Q:4M83I54F42D44D66E99G;;L@@N@@N@@N@@OAAOAAO@CO@CO>DN?FO?ISCNVFSVFSQ@PM=JO?JO>HM;GM9EN:FU?K^IRfQXfQVkX\m\bjZedVggYpter{pyo|tvxmo}cdtWY`FIP69D+.@'*<&);')=(-;(,6&)4$'1"'0!&-!%-!%* -!!3''9--?33C77E99F::I==J>>J>>J>>H<22=32<21<21:0/8.-7-,6,+B87B87B87A76A76@65@65?54@65@65@65@65A76A76A76A76>22>22@22@22@22@22A12A12A.0A.0A.0A.0B.0B.0B.0B.0C.3B-2C-0D.1G.1J01N13O32S42V42X72]:4b=7e@8iB;kByK<|M;O:RX=[=`;g=sCMōP̘OɘIǘHƗGŖHĖHÕGGŚKěKěKÝLşNǡPȣSʥT˥TʤQʤOɥOɥOɧP˩RʪSήWͯU̮VɮSɮSɰTʱUʱUʲXȳXǴXȵYƵYǶZƷZǸ[Ǻ\ź^ż_żaĽcždľfľfƿeƿeƼcĽcĽcþcƿeefghijkljkihg˽e]TNLHxBsAsBr@k;}g8~g=h>~l>p?tAxD{G|IxGvExFGITn؄پٽݽߺۙיՕёˎƋ~~~||zzzzĔđsrdugUccOZ_KTXCHS?AT>@R::S98V9;W;:Y;=\<=]=@^>?b?CdBChEIlJKpMQtRSwTXyUWVZVXVXUWVZVZW[W^T[T[~S\~S\}R[|Q[|Q[{Q[yQYxQVxQVxQVzQW{RX}TZ~U[U\U\V]Y`]d]dYaU[}HNwCGn:>h48f26f24e15d02c12b01_-.]+,[)*Z()Z('Y))S&+O&,O&.M&+M$*K$'J#(H$&K')J('K''J(&K)(L-*P.,R1,Z92_>5eE:gJMJ:GK:DM9BK7BI5@J4@O:CWBK^IN_JOeQSiVZeT\bP^eRfp^xxhwhrgxtl{y}u|mp|beqTV\BEM36E,/B),>(+<(*>).;(,7'*4$'0!&/ %, $, ")+#!1'&7-,=32B87E;:G==H>=I==H<31>31@21@21@21@21A11A11B00B00B00B00C/0C/0C/0C/0C/1C/1C-0D.1G.1H00K12N21P20S41U61Z92]<5a>8e@:gB{M>Q=T=U=V`;h=sBLŒN˙P˚K̛L˚KʙJșIǘHǚIɜKǝKǝKǞLɠNˢPͤRϧRϧRΦOΦOͥNΦOͨPΪRάSϭTͮSͯU̲U̲U˱TʰSɰT̴ZʵZʵZʷ[ȸYɹZȹZȹZɼ\ǽ^ǾaǾcƿeƿeſghſgſgĽeýeýe¾eſgghhijklmkkikk˿i±aXRLHyBtAtBsBn?j;|g<}h=~l>p?t@vBxDwDzJyG{GHMZvߋٽڼ޻߹㞿ޜܜؗӒ̐ȉ}~|{zzĕē}~qraqgS_cNW`IQXAGS=@T;>V:9W97Z:;\=;`>?c??g@ChABi@DjBCmDHpHIsLOwPQxTV{TU~TUTUUVUVSVSVRU~QVsFKsFKtGNtGNtGNuGQuGQuHOxNRvMQwMQwMQyOSzPT~QVSXQWSYV\Z`\bY_SYMRu>Cp9]J;_L>fSElYJtaPu`Os]OoXJgOC`E:X=4S81P40M40I11E0/C11A11C34C47@48@48B38B38B17B17D17D17H4=F5=G6@J9CK;HK;HF8EE5@H4=I4;G2;E09D.:G2;M8AS>CU@E[GIaLQ`MS]IU_J[hRin[qo]mh[ei^fqjq{xzrzimz`clOQW=@J03E,/E,/B,/>*,?*/<)-7'*4$'/ %-#*") )!)$ .,):2/A96F>;IA>I?=H>,*A/-B0.@.,<-*9--8.-7-,7-,7-,7-,7-,7-,C97C97C97B86A75A75A75@64C97B86B86A75@64?53?53>42?42?42A32A32A32A32B22B22C11C11C11C11D01D01D01D01D02C/1D.1D.1G.1H/2K12L21N21Q31T52V72Y:5^=6`?8b?9hAZ=]?aW:h@AkABnADoCDnADnBCoBEpDEpFHrHItLMvLMyML{NK|NN}OO|NNzLNxJLvHJk=@l>Am?Bo@FpAGrCIsDLsDJwJMvJKvILxJLyKN|NPOSPSQUTWV[Y\U[PT|GMvBFm77k32f00f00i33k55i65h54`.-_-,]+*Z*(Y)'X(&X(&W))X*-V),U(-T'*R%(O%&N$%L$$N&&O'%P(&Q,&S.(S0*W2,V4+U2,X7.\;2[?3^D5aL9gVDk^Kwn]zl}£ȦͨӬ٭ݥ٢ئ᪙餕李㘌ގӑҔΔȖv|g{`v[qVlTlSlUnVjT|fOs]HiS>cL:dO[@7T92P40N2/M10I/0D/.B./A//B/1@03>/4>/4>/4>-3>-3@-3@+2@+2B-6C.7C/:C2C3>A1<@0:E1:F18E09B-6@*6A+7F1:J5,*?-+A/-B0.?-+=+);)'=+)?-+@.,?-+;,)6+)5+*5+*4*)4*)5+*6,+7-,D:8C97C97C97B86A75A75A75C97B86B86A75@64?53?53>42A64A64C54C54C54C54D44D44D22D22D22D22E12E12E12E12E13D02D.1D.1D.0E/1I11K10N21O30R42T73W:6Z;6\=8_>9d>;iB;rG>yN>R>V?Y>X[=]=a^<;`=9f>>jA?nBCoAAq@Cr@Ar@Cp>?o=@m==j<>k==k?@l@?rEBsFAtGDtGDsFCrDDoAAn@@i;=j<>l>@n@CpBErDGtEKuGJuGIuGGuGIxHHzIL|LLNQOPRUSUUYTVMRzCFq:?l58k32i2/g/.g/.i31j42f30d1.^-)],(Z*(W*'V)&V)&V)&V((Y+-X*,X*-V(*U')S'&R&%P'%O&$Q($S*&T-&V/(W2*Z3,Y4,U2,W6/[:1\>3_C7cLmR?rXGw]Lr[MnVJjODbG>\?7V93R51P20M/-K/.H./E--B,.?--?,.=-.>/2>/4>-3?,2@+2@)1B(3A'2?%2A'4@(5@*6?+6=,6<,6=,4C06E07E09B-6?)5?)5A,5D/6H38N:+';($:'#;($=*&?,(?,(=*&<)%=*&@-)B/+A.*>,*6+)4*)3)(2('3)(4*)5+*7-,D:8D:8D:8C97C97B86B86A75A75A75A75A75@64@64@64@64B75B75D65D65D65D65E55E55E33E33E33E33F23F23F23F23F24E13E/2D.1D.0E/1H00I11M32P43R42T64W:6Y<8[<7\=8a>:e@:lD:uJ:}P=T=Wd>=f>?o;=p99l?:l?:l?:l?;j=:j<@n@BqCEsEHuGJvHJvFFvFFvFFxFGzHI}KLMONPPRPSORJMyADp8;i14f./j21h1.g0-g2.i31g41d1.`/+\+'Z*&W*'U(%U(%T(%U)&U)&Z**Z**Z),Z**Y))W*'V)&U)&Q%"S("V+%W/'Z2*[5,]5-\5.^93]:6_<6a@7aE:eK>gPBgTFl[Qsf^uu§ɨʪͬήϜsiln~kowç˯˰”|vn{gv`oYhTdRdQeTgUl\iYcR{ZIsSDpPAqTDtXJjODdKD_D=X=6T71Q40P20O1/M//K/.J-/E--B,.?+,>*,=*,@01?/2A.2A,3A*2B(1B&2D&2? /?#1?%2=&0;&/:'-9(.;*0@-1C.5D/8B-6?)5='3?*3A,3E05J68O9).;(,6&)2"%.$,")!()*-" 2'%9+*>0/D44G77H66G55F23D01D.0C-/B,.B-,@-)>+'<)%:'#9&":'#;($=*&@-)>+'=*&?,(B/+D1-C0,@.,8-+5+*3)(2('1'&3)(4*)6,+E<7D;6D;6C:5C:5B94B94B94@72@72@72@72A83A83A83A83B73B73D63D63D63D63E63E63F42F42F42F42G32G32G32G34F24E13D01C/0D.0E/1H00H00N43N43R63T85V:6X<8Z=9\=:`=9d?9iA7oE5xK8P9T9U:W:Y;[;^9b9h:r@y??ōBљNןRןRԟO֢O٥RؤPؤNإLاKڧKܫN߬POROQޭPݯQݱR޳UݵV޷X۷WٷVطXطXָX׹Y׺\׼a׾d׾bb`__]]_`adʿeʿfȾgĿm¿nllllnnnnnnnmmmonprtºrli[TIxCvCvB~rB{nA}nC|mBxm?vo;yr>|w@{G~JxGMQUax܊ӻֺշյղԯ׮تبڦܦޥ坿❾ߜܜږҏʋĉzyz|xnz_rpQ`mMXjKSeDKaAFcABh@@jA=mA>oB?p>=p::m56k34o46m24j/1f./e//d10e32f64k;7j;5j;5j;5j:6k;7l<8l<:i97j:8l<>p@@rADtCFtCFvDEvDCwEDyFE{HG~KJMMOOMMKLGHw?@p57i.0g,.g-,h1.g0+f1+h3-j51g40d1-_.)[*&Y)%V)&U(%S'$T(%T(%U)&Y)'Z('[)*[)(\*)[+)\,*Z-(R% T)"W,%[0'^3*]5+`5,^6.a97`:7b<9c@:fE+@ -A#/>#,9"*8#(;&+=*.=(-?*1A,5@*6<(4;'2;'0=*0C.3F24J47K4:M3L9;H<+'>+'=*&=*&=*&=*&A.*?,(?,(A.*D1-F3/F3/C1/:/-7-,4*)2('1'&2('4*)5+*E<7E<7D;6D;6C:5C:5B94B94>50?61?61@72A83B94B94D95C84E74E74E74E74E74F74F74F42F42F42F40F42F40G40G32G34F23D0/C/.D/.E0/G//H0.N43O54P73T85V:6X<8Y=9[>:`=9c>6f@5lB4uH5|N7R9U9V9X:[;]8_7g;n?u?}=EϖQ֝VןU֞Q٢RܥRۤQ٥O٦MڧLۨMݬP߮RSTRR߮QޯSޱTߴV޶WZݹYڸWطVطX׹Yٻ[ټ^پcؿeؿccab``__``deȾeƾimnlllnppprrqqqqrsttuvtpl^UJyCvCtCqB{m@{nBxk?uj=rj;umm69j25g/2i14h03f.1c,/b.0d23f66h88k;7h;6h84f94i95k;7m=;o?=g75g75i99k;;m==o??p@@qAAvDCwDAxEByFC|IFLKNNOOII}GGyABp89g/0c+,d,-g/0f0.e0,f1-g40i63i63d3/`/+Y)%X(&W'%T'$T'$T'$T(%V)&Y'&[(%\)&]*'^+(_,)_.*_.)T%W("[,$]1(b3+a5,d5-b5/^51^64a:5e>9jE=mKAoNEnQIsXQu][~jlz~tonre|`v~fv|dru]jzdpq~pzjnba_[`W^RYJzRFSJPJzMGwJDtGBrGAqF@oFBpGCpIDnICiD>_<6Y60V4+U4-bFB[B=S:6L3/J.+J.+L0/N21M//L/1K.0G-.D,,@+*=)(<('C.-B-,A+-B),B',B$,A#+B"-<(?!+?$+=$*8!'7#%9&(=*,9$)<'.?*3?)5<&29%0:%.;&-A,1C.3E.4F/5I/8K1>O4CS9FV=CN8;I57F67D:;KEG`[aspw~qsw_]iPL`CE\?CV9=O58J14G.1B,/>*,9&*8%)5"&1!$/".!.#-!(*0 !5%%;))=++?+,?+,E/1F02H/2I/2G-0D*+D'+?''@,+@.,@.,@.,@.,?-+?-+>,*A/-@.,?-+?0-E31E63E63B41;1080.5+,1)'1'(0(&3)*3+)J?9I>8H=7G<6E:4D93C82B71B71B71B71C82C82C82D93D95G96H88H88H88H96H96H96H96I:5I:5I:5I:3I:5G81G6/F5.F40E3/E2.E2.E2.F3/I41I4/M51N62O73R95T;7V=9W>:[>:_=4d>3h@6kA3mB1rE0yI3M4W;Y;\;^h>i(*=)*=)*;))9)):**:**:*+B-4A*4?(2<%/:#-8#,9",9",=&.?(0A*2A*2B+5D-7J2?P6AQ80/<.-<.-;0.<1/>31?53@53?53?53>64:127117.12,,2),.((0'*-''I>8I>8H=7G<6E:4D93C82C82B71B71B71B71B71C82C82E82H88H88H88H88H96H96H96H96I:5I:5J;4J;4I:3H92F8/E7.G6/F5.F3-F3-F3-G4.I4/J50M51N62O73Q95T;7U<8W>:Z=9^<3d>3h@6iA5kA1oD3wH4|L6R:U9Y:]sB>zEA}FA~GBIDIF~IE|FDyFCo<9k85d21^,+[)*Y))[++\,,_-._-.`./`./^,-\*+Z()X&'[)*Y'(W%&U#$U#$W%&Y'(\)(a,(c,'d-(f/*f/*f/*e.)e.)d-(f/*h1,j3.l50m61m61l73f71d92g:4j>5oC:uI@zMG|QKXX[`bmmzxgvYxqRquWs}\wd}bz~[qxUi~Xmbtcu^s_zmwtl|hrdj`cWUSPzMJsGFnBCd:<\26T-2N.3M.3M/1L.0K.0K.0J.-J.-L21K10I1-H0,G/+H0,F1,I1-U<8S:6N94J71G6/E4-E2,F1,F.*G.*I+)H,)E,(B*&?*%?*%F/)G.)G.*F.*F.*D/*C.+B/+=+)=+):+(:+(:,+<.->0/@01D/6C,6@)3=&0;$.9",9",9",:#-<%/>'1?(2@)3C,6H1;M6>O49O58K25D.0B,.H45VDDbPPkYYlZZp\]s_`u\_oVYfLO`CG_@FY:@Q49J/4H-2C-0@*-=)+:')8%'6"$3!201/.#,%-&.'2'5!*9$+;&-B-4B-4B+1A*0A(,@'+?&*='*>./>00?11?11=11<00;//9/.;10<21=53>64?75?75<74<748248246025/12,.0*,.(*-')K>8J=7I<6I<6G:4G:4F93E82D71D71D71D71D71D71D71D71H88H88H88H88H96H96H96H96I:5I:5J;4J;4J;4I:3G90F8/I81H70H5/G4.G4.H5/J50J50M51N62O73P84S:6U<8V=9Y<8]:4b=4e?6g?5hA2lB2tG4xI5M6Q6W8[<_>`>`>`:c8kxb9l_5g`6f]6e\5f\8j`=tA@vC@|EBFBGEGEECyB?t>8sD>yJD{NKXYZ`anj{rwwwwrgvXrjLfhH`mMduTi^q`q[lzVd|Ve\i_l\kXl\s_r[jWbW\VXSSzMJtGDl>>d89]37V-3O'/H#*D$)C%'C%'D&(C&(C&(B('B('E+*D*)B*(B*(A,'B-(C.)D/*Q95Q95N94M:4J92F70G6/G4.H0,H/+J,*H,)E,(B*&@+&?*%F/)H/*J2.K3/L40I4/G2/E2.>,*=+):+(:+(;-,?10D65H89G27F/7B+3?(0<%-:#+8!)8!)7 (9"*<%-=&.>'/@)1E.6H17K05L25J14E/1D.0G34P>>XFF]KK\JJ\HI]IJ`GJ^EHZ@CW:>Y:@U6)0>)0?(.?(.?),?),A(,?),>./>00=11=11>22=11;10:0/<21<42>64?75=85=85<74<748249359358246023-//)+-')J=7J=7I<6H;5H;5G:4F93F93D71D71D71D71C60C60C60B5/I99I99I99I99I:7I:7I:7I:5I:5J;6K<5K<5K<5J;4I;2H:1K:3J92J71I60H5/I60J50K61N62N62O73P84R95T;7U<8W;7[:3^<3c>6d>5d>1g@1oD4uH5xI5}M6T9[<^@_@^=]:_8c7k=yFPΔUӚUӛPӛNќLЛKΛJʚHǘHĖHĕGAABDĖIǜN͢TΨWѬ[ү[Դ]ֹ]ּ]׽\׿[`ӾeҾgҾgпeecccacdefhikllmlmmmnnquvxxyz{{|ywvtsvtncWvH{d:o\2eY1bZ3cZ3dZ6f\8j`>wAAzBACBDAEDCB{?>u;9m54f30`.-]-+W*'S'$R&%Q(&S*(V*)V((V((X((V((W''T&&U%%S%%Y))V((V&&S%%U%%T&&X((Y)'\&$]($a*'c.*f/,g2.h1.g2.l52l73o85p;7r;8r=9s<9o<9h86e85e53f62j95p?;uEAyIGTVX_]icuh~hfef~axwWljJ_bATa@QfEVmK[vTb~Zf~ZdyT\wRZ{V]~Y`~V_Vd~Tb{O\yNW{NS|PQ{MMxKHtGDmA@c78Z02T+1P(0I$,E")A"'A#%B$&B$&B%'C&(B('B('C)(A)'@(&?'%=(#>)$?*%@+&J50K61L93L;4J;4I:3I81H5/J2.J1-K-+I+)G+(D+'C+'B*&J3-L5/N62N94N94K61G40E2.<*(;)'7(%8)&:,+@21F87K;'/A*0I.3K14L36I35G13H45L::P>>UCCSAAR>?S?@W>AV=@T:=Q7:R39O06J-2E*/C*.A+.@,.@-/=*,;(*8%'4!#1/0-+ )")"*#.#0%2%4!':%,:%,<%+=&,>(+?),A(,?+-=-.=//=11>22>22>22<21;10=53>64?75@86>96>96=85<74935:46;57;579355/11+-.(*I<6I<6I<6H;5H;5G:4G:4G:4F93F93E82D71D71C60B5/B5/I99K99K97K97K97K97K95K95K95L;4M<5N=6N=5N=5M<4L;3M<4L;3L92J70J70J70K70L81N71N71O82P93R94S:5S:5V:6X94\;4_<6_=4a<3d>1iB3oF4rG4yL5R;Z>]B_B^?]=];^8c;m?{ELŎMǑK͗M͘L͘J̙JɘIŖF”FE>?@AEKĘQĜTĞSǣUͭZӵ]׽`ؾ_ս[Ӽ\мcμfμfͽe̾eʿcccbddfgijkmmnmlklnpsvwxwuvzz{yxvuuyvsj[wIvc8iX-`W0^Y3bZ5e]9ia=ld@ogCojDtpJwuL~RatʎϐՔՔטٗڙݛޜߠߟþԿҽҿòųȴ˳ͲͯЭѩҩԧ֥פء٠؟ڝۜ۝ܝݝߞ碿ᢺܠўɘtdo|S[|NQ}IKzBCx=?w?Bg58]/2V(+P#&N!&M#'K"&J!%I"'G#'G$*G$*E%*F&+F%,F&+C!"F$#K(&M*(P*)S++X/-^21b52d42h54l66p87t<;z@?}AA~A@@@??{>=u99m32e-,_,)Z('X(&R&%O&$M%#N&$N('P((S'&S'&S%%Q%$R$$Q%$R$$Q%$V((T('U''S'&T&&T('U''V)&X%"Z'$_)'`-*e/-e2/g1/f30k53j74n86n;8q;9o<9p:8n;:h88d68d44c31f64j:8q?>sCCNQQWVa[iZnYp|UpxUmzXitTalLYcCP^=H]'-=&,:#)8!'9"(;$*G,1J03L36K57J46I56I77K99L::K99L89N:;R9(+>*,?,.=*,9)*7$&3 "0.-,('!(!(!*!,#0#1$6!(7")8#(:%*='*>(+?),?+-=-.;//=11>22>43>43=32=32?75@86?:7?:7?:7>96<85;74:46;57<68<68:466022,./)+H;5H;5H;5H;5H;5H;5H;5H;5H;5G:4G:4F93E82D71C60D50L:8L:8L:8L:8L:8L:6L:6L;4L;4L;4N=6O>6P?7O>6O>6N=5P?7O>6N;4L92K81K81L81M92N71N71O82O82Q83R94R94T84V95Y:5Z;6\;4];2`;2e?4jC4nD4qH4{N9T=YA\B[B[@[>\;_:e=n?xBDDŎKőHǓHǖIŖHÕGED@@AAEIMOLP¡Ṱ[Ӹaռ`Լ\Ѻ\ϻe̼g̼g˽eɾeȿdƿddcdeghjjloonlkkllsvwwxvtuz{zyyyxyyywn_|Kxg;iZ1_W2_Y5c];ga?lcBmgEoiEnjEtrLtvNyRatƋʎϕіҗՙכٛ۝ݞľÿýüϿŲdzȳ˳ͰͭϬШϧӥԤԡՠ֟מלڜۜۜۜܜޜ椼ऴ֢ϝȗsamzOXzIOyEIt;Ao4:k28\.1U+-P&(M#%L#'M$(J#&G#%D!%D!%B"'B#(B#(A$(A$)A$(> A#!F'%J(&K(&O)(T,,Z.-^1.b0/g11j21p65u99y==|>?|<<{;;y99s65m11g-,_)'[(%W%$S&#P$#M$"L$"K%"L&%M'&P'%Q%$P$#O#"O#"P$#Q%$Q%$T('T('T('T('T('T('T('U''W%$Y($]*'_.*b/,c2.d1.d3/g41g62i63i84k85j95j74i76e79b58a35`22b44e85k;9m==vEHxIO|OV|Q[yN_vM_uKarK^qMYmJQgDKa>E]:@]:@`<@b>@c?AnGHsMLpJGmGDnICnFDkCAi?Ac9;d7:k?@pC@nA>h;6e:4`41X/-O)(H$&D$)B#)?!+> (= "=! =! =! >"!<"!<"!;#!D,*B*(>)&<'$:%"9$!9$!9&"?,&@/(@1*B5-B8/D:1H92L93K3/J1-J.+I+)H,)G.*I0,I1-P<5P=6Q<7N;5L93H5/D1-A/+;)':(&7(%7(%9))>..A32E55G35F/5B+1?(.<%+:#)8!'8!'<%+>'-@)/>'-;$*8!'8!'9#&C),F,/I03J46J46I56G55F44C11B00D01F23J14H/2D*-@&)C&+C&+@%*<#'8"%8$&:')=*,8()6&'5"$1 /--,('!' (!) +"/"0#4&5 '7"'8#(;%(='*>(+>*,<..;//=11?33?54?54>43=53A97B:8@;8A<9@;8?:7<85<85;57<68<68;579356023-/0*,I:3I:3I:3I:3I:3I:3I:3I:3K<5J;4J;4H92G81F70E6/E61L:8L:8L:8L:6L:6L:6L:6L;4L;4M<4N=5P?7Q@8P?5P?5O>4RA7P?5O=3M;1L:0L:0M90M90N7/O80O80O80Q81Q81Q81Q83T84W:6X;7Y:5X94[:1`>4fB6f@3iD2qH6wN:}S=V>XAYAX>Z>\<`=e=m>uA{AFFEF’HEDDCFDDEHJKKKNVˮ^ѷbԻaлbͻg˼i˼iɽgȾgƿeeecefhijkmopomllklstvwxwvwz{zzz{|}{|zueR|oBoc9c[7b^;e`@hdAkeCkgDjgDggAoqJotKvRbxōȑ̖͗ϙҙԛ֝ٝڞࣿ㾿þžļüº¸пѿ´ȴ˳˳˳̭ͯϬЧΦҤӣӠԟӝԛ֜ڛڛڛښښܚޚ馾䥷ۤ՟ϝʜŖu`mwLUtCIq@oBEsFKtFPpEOnDRoDUqGUkCKgCGc?A_;=]9;[79]67]76]76g?=lDBjC>iB=jC%+<#'?"$?# <#<#<#;";! :" ?'%<'$:%$8#"7#"7#"7#"8%!;(";*#:-%:0'>4+A7.H92K:3H3.I0,I-*I+)I-*I0,L3/K61O<5M<4M:4J92H70F5.D2.C1-?-+<-*<-*<-*=-->..A11D22D02C-0@*-='*;%(9#&9#&9#&:$'='*@*-@*-='*;%(;%(<&)>$'@&)C*-E/1G13F23C11A//?-->,,>*+?+,C*-A(+>$';!$?"'?"'="'9 $4!3!6#%8()5%&4$%1!".-,,+('!'!'!( )!,!-"3 &3 &6!&7"'9%':&(<(*;(*<..;//<21>43?54@65>64>64B:8A<9A<9B=:@<9>:7=96<85=79<68;579357135/13-/2,.H92H92I:3I:3I:3I:3J;4J;4L=6L=6K<5I:3H92G81F70E6/L:6L:8L:6L:6L:6L:6L;4L;4L;3M<4O>6P?7Q@6Q@6Q@6P?5SB8Q@6P>4N<2M;1L:0M90M90O80O80O80O80P70P70Q81Q83S74U96X:8W:6V95X94^=4b@6_=1c?1iD2nI6tN;yS>~UAWAU>X@[A]?`=f>pAxC}DDEHHGFEHGGHGIJLLKMTç]ʹdӺhҽj˺jȼjȼjǽhŽhľfÿffefhijkmoqrqqomlmqsuvyyyz{|{}}}~}~xiWwHsj?d^:da@gbBheDifCheBdd@ac>joGjrIp}QczȒʖʘ˚͛ϝӠ֠آڡޥߤ㥾⽾໽ߺ޽ĻȺǸŷĶõĴïοο±ññòƴ˴δβαήάЩЦХҤӡӠԞӝԚ՜ڛښٚٚڙۙݙݚꦿ祹ޤؠҠРϜő}z|xaltIRl=Ci6=c.6_'0Z'.I#D D "E#$G%&E%&B"%> ">!%<"%<"%;"%:!%8"%8"%8"$9!!=#"@&%D('F'%J&&P((V*)Z**]*)a+)g-+m0/t44y78z::s77n43i/.d*)_'&\&$Z'&Y'&T$$S##P"$N"#L"#J""J""J""O&$N%#L#!L#!L#!M$"O&$Q(&Q(&R)'R)'S*(S*(R)'R)'S'&V((W*'[++\/,_//^1.`00^1.]--\/,`00_2/a11^1._//\01^59\5:\5:\58]56^66_56_64d:;g=>kAClBFk@Ik@JnBOqFPg>Dd=@c;<_89^67[45Z22Y11Z20b:8g?=f?:f?:g@9b;6Z3.\23X,-Y-,b63g;8d85b63b95U.)Q+(J(&G(&F*)D,,@*,>(*B('C'$A($@'#?&">&"=%#=%#7"7"6! 4 5! 6"!7#"8$#8&"6' 6)!7-$:1(@6-F91L;4G2-H0,I-*H,)I-*J1-M51M83L;3I;2I81F70G6/F5.F40F40A2/@1.@1.@1.@00@00@00C11B./A+-?),<&(:$'9#%9#&9#%7!$;%'?),A+-?),>(*?),@*,9";!$>%(@*,C-/C/0@..>,,B00?--=)*<()@'*@'*>$';!$<$; %; %7"204!#6&'3#$2"#/ ,-+,+) ("'!'!( )!,!-"3 &3 &5 %7"'8$&9%':&(:')<..:0/<21>43?54?75?75=85A<9B=:B=:A=:@<9?;8=96<85>8:=79:468246024.03-/3-/L;3L;3L;3M<4M<4M<4M<4M<4O>6O>6O>6O>6N=5K:2I80H70J73K84L95M:6N;5P=7Q>8Q>8P=6Q>7R@6SA7TB8VD:WE9WE9RA7RA7R@6P>4N<2M;1M90L8/S<4R;3Q:2P91Q81Q81Q81Q83O62P65R65S74T84V93W91Z90`@5b@4cB3iE5nI9rM;vQ?zTAVBXBYB\B_Ac?f=g8uB{CFFFGILKHILRTQNM~I~FGPYé_ůdųgǺk˾oʿmŽjeefbehjlmmmqsrsrrqrpstuwy||‚€āŀŀŁ~}ztcRvrEljDeeCfcBggEffB_a<]_8_d!< <":!7!7"7"6 #7 &6!&7"'7#%8"$;##=#$@$#D%#H&%L&%N%#Z**\)(`('e+)k.-q1/v53w75l20f0.c--_))Z'&X&%X&'W''U$'U$'Q#%P$%P#&N$&P&(P&'P'%P'%P'%P'%Q(&Q(&Q(&Q(&O&$Q(&S*(V-+W.,V-+T+)S*(\0/Z.-Y+-V*)U')S'&T&(S'&U')S'&T&(S'&U')V*)Y+-W-/U.3V26Y59Z68Z68Z66\97^;9`:9b<;e=>g>Bh?Ch?Ei>Gh=De;?a9:_57\45]35Y12V,-Q))R**V.,\42a97b:8a:5]53[31T,-V,.X.0Y/0Z01Z1/Z1/X1,R-'O,&J+&H+'D+'C+'A,)B-*C*&@'"?&!@'"A)%B*&A)'<'$8#"5 103 3!!2 16$ 5&6)!7-$:1(?5,D7/F70I60K3/M1.L0-L3/N62O:5P=7N@7K>5I:3E80E6/E6/F72G83H96I:7H96D52@00?//B22G55K78I43E/1@+*=')<'&<&(<'&9#%9$#:$&=('?)+?*)<&(8"$?%(>$'=$'>(*B,.C/0@..>,,A//?--<()9%&:!$9 #: #: #6 6 6 5 3 1 1 / 2$$1##/!!--++*&%!'#($+#,$,","/$1 &5"&8%):');(*<(*;(*9--9/.;10;31=53>64>64<74>96?;8B>;C?;>=9;:6;749359357136024.02,.1+-0*,L;3L;3M<4M<4M<4N=5N=5N=5P?7P?7P?7P?7N=5M<4K:2I80K82K84L95N;5O<6P=7Q>8Q>7Q>7R@6SA7TB8UC9VD8WE9XF:SB8SB8SA7Q?5O=3N<2N:1M90S<4S<4R;3Q:2Q81Q81Q81Q83O62P65R65S74T84T84V93W91]<3^>3_?2bA2fE6jI8oK;qN;wR@zTA~UAX@Z@]?a=b9pBuD{FGGFIGGEGKQTUR}LzHzEHMU[]beǺlɾnŽl¼hghdgikmnmptuttsrttrstvwy|}Àāāŀƃс}xkW}zMllFefDeeCfhCdfA\a9[`8]f;gtIk|Ow^rĒǔŔřƛȝ̟Ϣҥԥ֦ڨܩݨ੶㬶欷毺챾鱼篻氽貾鴻峻嵻嵻巹ⶸᵶ߳ܳ޸ݷݷݷܸܸܺܺݼݾܽ۾ٽټ׻׾ıdzɱɲȮƮƫŬƪƭǫǮɬɯʯʲϲϯЯЭѭҪөӥҤӢԠՠן֝֜؞ݝߝߝߜޚޘܗݙߗޕ맾覼妹㥷ߥڟљƕzyxy~}}{zxwwn{[cmDJ^48Y.5W,5R'1L#+E!%A!"A!$?!#=!; ;"8!7"5"5"4 "5 %4!%4!%4!%7!#:""<"#@#%C#$G%$K%$N%#Y))\)&a)(g+*k.+q2-v2/t42e.+`/+^+*Z('W%$U%#U%%V&&U$'U$'Q#%Q#%P#&P#&R%(R%(R&'P'%P'%P'%Q(&Q(&Q(&Q(&O&$Q(&T+)V-+W.,V-+T+)S*(X./W-.W+,R()S'(P&'R&'P&'R&'P&'Q%&P&'S'(S)*V*+U-.Q-1S04U26V37U34T45Y76\:8];9_<:`<f?@h?Ci?Cj@Dg=Ac9;_57\24[13Y/1U+-Q))P()S++W//Z22[33Y32X00U./S,/S,1U,0V-1V./U--S++Q+(O,(M,'J+&G,%E,%C/(D0)D0)E.(D+&B)$B+%D,(E-)A,)?*'8#"4 113!!4""3 "2 7$ 7&7(!8+#:0'>4+C6.F70H5/I4/K2.L3/N62Q<7TA;SD=RE)(>)(>)(?*)>)(>)(>)(@+*B-,A,+=(':%$>$'=#&<#&<&(@*,B./@..>,,@..?--=)*:&';"%9 #9"8!7!6 5 3 10.-1##0"". -,--+( &"'#'#*"+#,"-#/$0%5"&7$(:');(*<(*9)*:..:0/;31=53>64>64=85=85<85>:7@<9B>;@?;>=9<;7:959569358246024.02,.1+-0*,L;1M<2M<2N=3N=3O>4O>4O>4Q@6Q@6Q@6Q@6P?5N=3M<2K:2L93N94N94O:5P;6Q=6R>7S?8T@9T@7UA8VB7WC8XD9YE:XF8UE8TD7TB6SA5Q?3O=1O;0O;0S=2S=2S=2R<1S;1R:0R:0Q81P73P65R63S74S73T84U82U80Y;1Y;0Y;0]=0_?2bB3eD5gF5pLU=X=Y;\8e=k?sCyG}F~EGGEBEJOSUS{JyIwDxEIOTS[^gƻlƽnükjifgjlmmnqtvuuttvuuvwyz|}~~~ĀƂǃdždžńq_TqsLimJhjEhlGfkC_f<^g=f?@iABkACi?Cf9>^48Z04X.2V,0R)-P()N%)N'(P)*Q*+Q*+N**O()L(*N)0N)1P(0P(0O(-M&)L%(H$$M*(L+&I*%H-&G.'E1(G3*H4+J3+G0(E.&F/'G0*E1*C.)A,)8$#5! 3 2 4!#6#%3#&4!#8# 9$8' 8)"8.%<2)A4,E6/F5.H3.J50M83P=7UD=YJC[NFWMCSK@OE;M>;M;;K99L::M;;H43G2/D/,A,)@+(@+(B-*C.+D/,C.+C.+D/,E0-D/,?*';&%<"%;!$9 #:$&>(*@,->,,=++@..?--?+,<()<#&9 #7 57!6 5 20.,*/!!, . -.-.,)#'$%"%"& (","-#-#.$2"%5%(9&(;(*;(*9)*<00;31=53?75>96>96=85=85:63<85<;7?>:@?;?>:=>9=<8;78;579357135/13-/1+-0*,M<2M<2N=3N=3O>4P?5Q@6Q@6RA7RA7SB8SB8RA7Q@6O>4O=3O:5O:5P;6Q<7Q=6R>7R>7S?6UA8VB9VB7WC8XD9XD9YF8XF8WE9VF9UC7TB6R@4Q?3Q=2P<1S=2T>3T>3T>3U=3T<2R:0R92Q84S74S74S74S73S73U82U80Y;3X:0X:/X:/\iAAkABj@Bf9<\26W-1U+/R)-P'+M&)M&)M&)L%(I%'H$&G%&H$&G$(E$+E$-H%,H%,G$*G#'E!%D "I'&G(%H)&G,%G.'I3(I5*K7,L6+I3(G0(F/'E1*E1*B-(?,&9%$6"!2 3!!6#%8%'5%(6#%;#!;#8%9(!8+#5D:1E82D71F85H:7K<9M>;N<,,>,,?+,=)*=$'8"536 5 20.+*)++. /!!0 !/ 1 .!,&)&&#$!$& +!-#+!-#1!$4$'9&(;(*;(*9)*<21=53?75A97@;8?:7>96<85841:63;:6=<8?>:?>:>?:?>:<89<68;578246023-/1+-0*,N<2N<2O=3P>4R@6SA7TB8TB8TB8UC9VD:VD:VD:UC9SA7R@6Q<7Q<7R>7R>7R>7S?8S?6S?6VB9WC8WC8WC8XE7XE7XE7WE7XF8VF7VD6TB4SA3Q?1Q>0P=/T>1U?2V@3V@3W?3U=1S;/R:0U95V86U75U84U84U84U82U80[=5Z<2Y;0Y;0Y;0[>0\?1]@0dG5gH6kJ9pM:uO?g=>a78Z02T*,Q)*O'(M%&J#$M&'J&&I%'F$%E#$C#$E#$C#&=$='? (@!'B!(D!'C &C $F#'D$%E&$E)%F-&H1)K4,M7,L6+I3&D0%C/$C/&B.'>+%;("8$#5#!2 3 "4$'7'*7&,8$&>$#=$ 9$9& 8)")&=#$: #7!6 "9#%;'(:((:((;))<**<();'(;"%7!524420.,*(*+-!!/##1##0""0 !.".!(*''$$!#$( )!* ,"0 #4$'6&'8()9)*9++=32>64>96@;8A<9?:7<85;74841762984<;7=>9>?:?@;@?;>:;>8:<68:467134.02,.1+-N<2O=3P>4Q?5SA7TB8UC9VD:VD:VD:WE;XF9S>9S?8S?8S?8S?8S?6S?6VB7VB7VB7VB7WD6WD6WD6WD6WE7VF7VD6TB4R@2Q?1Q>0P=/T>1U?2WA4XB5X@4V>2T<0R:0X;7X:8X;7W:6W:6V93V93V91[=3[=3Z<1Y;0Z<1[=2\?1]@0aD4bE3gH6kJ9qL:uO<{Q;~Q:{M3Q5X7^:d=kBtIzKKGH~EzCyCzD|GPQOOMNQQMLRZcgjhkljjklnotuvvwvvwz{z|}€āÀĀÂŃńƅƇƇljĆtcZv}QovLlsInwJqzKq}KwR}[kuƏʕ˗ʘ˚ʞʡˢΤΧѩҪӭԮհֱٳܸ޺߻Ậ㻫乪㺫乫们庭潮缮羮缰ĵ÷ǹƹû캺궹곻궸糵㲳ްܯܱܴݷڵٵٵٵط׸ԷҵѶҷӺӼҾѽнϾãŤŤŤŤŤǦǣģĤťƦǧȨɨɥɦʧ˧˧˧ͥ˥̢ɣʥΧЪӬծٯگ۰ݮܮܫ۫ݩܨޥݥߤߡߡߠ柿颿줿ꥶᣯלǘzwvw~t}t}utoycl[_vJKmA>_62U/,O++L)-G&-D%+B"'A!$A!&@ %=#;"9#8"7$5$5$4$2%2%0%3%9%<&>%A!&D!'I"%K#$O#"Y)'],(c.*g0)i.(g+#c'_$^&%\(*])+])+\*+[)*Y(+V(*R%(P&(N$(M$(M$(L%(N'*O'(P"$R""S##U%%V&&X((Y))Y))Y))[++]--^..]--[++Y))U')M&'J&(H$&E!#D "C!C!C!E!#E!#D "E!#F"$H$&I%'M&)T()V(*V),T*,Q*+Q--U32Y76Y76[98^;9b<;d<6ND;RKATRFXVJVRFTNBOH>IB8E<3A8/A60A60C52B41C41D52G55G55E33D0/D/,B-(A,'@+&A,'C.)F1,H3.C.)C.)D/*G2-J50J50G2-D/,@&'=#&8"5!8"$9%&8&&7%%8&&8&&8$%7#$8"6 4333100--++, /##0$$3%%1##1!".".!(+ ((%&#$$&&)+!/"3#&6&'8():*+9++<21>64?:7A<9A<9?:7;74952651762984:95;<7=>9>?:@?;@<=@:<>8:;577134.02,.1+-N<2O=3P>4R@6TB8UC9WE;WE;VD:WE;YG=YG=ZH>YG=XF:V?9V?9V?9V?9U>6U>6XB7XB7XB7XB7WA4WA4WA4UB4WE7UE6UC5SA3R@2P>0P=/O<.T>1V@3XB5YC6ZB6W?3T<0R:0[>8Z=9[<9Z;8Z;6Y:5X94X:2Z<2Y;1X:/X:/Y;0Z<1[>0\?/\A0]B/cD2gF5mH6qK8vK8zM8{M6}O5Q5T3X6_;iBpF{I|H|HxDvAu?xB|EILMLJKPSPKLQ[bgimkiiijlnsvwuvwww{|{}~€ÁłłƂƄŃńăąąƊ‡xia~Yw~Tt}RyU~X[cn{Šɑ˖̢̛̘̙̠̥ϧЪҬӭӮԯֲ׳ٵۺ޼߽ྨᾨ⼩⿪侫侪侪忬­įðƱǮð±ñ辱溯丮㵭൬ߴ޵ڶضظ׺׺ֶ׵ٹٹոӶѵѷϸϸѼҽҾѽϾοĞšƢǣȤɥʦʡššǡǤȤȤȥˢǣʤ˥̥̥̣̣ͤͥ͢Ѧҩժ֬ڮۯݯ߮ޮޫݫߩިߗߘߙ板柿颿줿槵ܣСŝ}|zu{ryqzp{jr^fUWrFEk@:_60V/*P*)J()F&+D#*B"'A!&A!&@ %=$;#9#8"7$5$5&4&4!'4!'4 )5 ':&>'@&B"'E"(J#&L$%P$#Y,)^-)c.*e.'f-&d)!a%^#_%$^&)^&)^'*['+X&)V%(R$&R%(P&(M$(L%(J&(J&(K(,N'*O!#S!"T"#V$%W%&Y'(Z()[)*[)*]+,^,-_-.^,-\*+Z()U')M&)H%)F#'D!%B#A"A"A"D!%D!%C $D!%E"&G$(H%)M&)X'*[)*],/[-/X.0X01Z34[77Z66\88a:;e=>f<=e9:b65`43[20W.,S*(P'%N&$L$$G! BE" D" D"!B#!B#!@" ?!>"!7!8#9 &; '='>'>&=#>$>#?"@""A%$C*&F-)G0*N8-I6(E1&C/$B.%@,#;("8%5#!3!/ 0 !4$'6%+7&,9%'D')C%#@$!=%!<)#=.'B3,E6/J;4I:3I:3G=4I@7JF;KK?NNBOM@MI=HD9C?4A:0@7.@5/@5/F85C52A2/@1.D22E33D01B.-C.)B.'@,%?+$@,%B.'D0)F2+B.'B.'E1*J6/O;4P<5O;4L72D*+@&):!$6 "7!#7#$6$$5##6$$5##4 !3 445522111 /!!0"".""+! -#"0$$2&&4&&2$$0 !-!,!'* (*'(%&!$$#(* -!1"%6&'8():*+9++;31;63?:7A<9@<9=969527307628738949:5:;6<=8<>9>?:B>?A;=?9;<688245/12,.1+-O;4O=3Q=4R@6UA8VD:XD;XF0P<1O<.T>3V@3XB7ZD7YC8WA4U=3S;1[@7\?9\=8\=8[=5Z<4Y;1Y;1X:0W9.W9.W9.W9.Y;0Z=/Z?.Y>+Z?,]@.bC/gF3mH5pJ5sJ4zP8|P7{O4{N1|O.W4`=hAuIxGxGvErAt@xD}H{E~GJIHJOSVPLOXagkmlkhjiloruvwvvww||}‚ƒĄdžƅƅŅĄŋˆ~rid`{^binzŒďȓ˖̙̚͜˜ͣͣϦѨѫҬԮձձִضںܼ޿߿éĩĨç¥߿߿¨èŮɯʱɱɰǮí㿫ὦڶڹۼڽؾ־ԾӻҸֺٿؾӼϸϸлκκϾп ÞÞşơȣʤͥΦϠȠʠʠˠˠˠˢˠɡʣˣ̥ϣΣϢϣϣҥӦ֨٩۫ܬ߬ߕ眿圿瞿螿꠿렿婲ۦΠ{u|nvlujsem[a}SUpDEj>;_64V.,N**J()E%*C")A"(@!'@!'? &<&9%8%5$4%4&4&4!'5"(5"(6#)7"'; '>!&@!&B"%F$%I%%N$%P$!]-)`-)c.*d-(c,'`)"]&Z# Z$$[$'Z&*Z&*X&)U$'R!$O!#R%(P&(M$(L%(J&(J&(K)*N'*N"#Q!!S##U%%W%&Y'&\)(\)(]*)]+,_-.^..^..Y+-V(*R(*K')F&)D$'B"%@ #?"?"?"B"%B"%B"%B"%C#&E%(G'*M&)Y(+^*,a/2a03^03]03]35_78\45^78c;?e==b::]53Y1/W.,T+'P(&N&$M'$J$!D!?@? @!A" @!@!==; %; ' (='<%:#9";";"<"> "?"$@&%C)(D,(O;2J8.F4*D1*C0)A.(=*$8&"4" 2 ./ 3#&6&)7'*9%'D*+D('?%&;&#<)%@.*C4/F72K<7J;4H;3F<3F=4FB7HF:KI=NG=KD:F?7B;3@70@5/@5/B41J;8F74C1/A/-C11E12D01C.-C.)A-&B+%>*#A*$A-&E.(E1*D-'C/(H1+L81T=7UA8V?9T=7F.,B();##8 6! 6"#6"#5!"5!"4 "1123 5!5"100 12!2"#2$$3%%-!!/##3%%5''5%&3#$0 !-,!'+"'+ ()$'"$#!')-!1##6&'8():*+9++;10;63>96@<9>=9;:676243/873873984984:95;<7<=8==;@>?A=>>9=;788265/13-11+-Q95P<5S<6S?8XA9XD;[E:ZF;\F9[H:^H:\I:_J9\I8^I8^I8YD3YB4XA3W@2V?1T=/S;/S;/YA5YA5X@4W?3X@6YA7ZB8ZD9XD9WC8VB9T@5R>5P<1O;2N:/M90O;0Q=4T@5UA8UA6W@8V@5Y>3[?3[?3[?3Z>2W;/U9-S7+R6*T8*W;-Z>0]A3^B4]A3]B1^C0^C.^C.`D/eF2iI4nK5rN6qM3rM2vO2yR3~U7Y9]=`k@k?k?o@wG}M}J~JJI~HKQVZXTQS[fnkjjhjhhjnpqsuvxyy{}ÅÅņ†‡ŒŽ|ruy~ÔƘɜʟˠ̢̢ҩөҫӬԭծհֱղֶٸܼ޾޾ܿܿ۾۾ڽڽ£££££¦ŧƧƧƩŪƫƫƤٿٿؿ¨èãҾҾѽϻμͻ̺˻̼˾šǠƠơǡˢͣΥҥңӢԢԡӠҠҠ͢͢͠͠ϠѢҠҠҟբآڦަߣ⦯֢ʝ|ytn}kxgs`h|T\sJPh?Ca9:V/2M)+I'(F&)D$)A"(?!)> (; )9(6)3'2(1(2'/&/$1$2#4!#7#%8$%:$&<$$<"!?# C$!I&"P'#W'#_,(b+(d*(a)(_)'[)(W*'U)(S%'S%'S%(R$'Q$'P#&P#&O"%L"$L"$L"$K#$K#$K#$K#$K#$O%&O#"N"Q$!Y'&^+(a+)a)(\&$[('[)*X**S)*P()L%(G%&B$$A%$A%$A%$?#"=! ;:>"!>"!?#"A%$B&%D('E)(I'(X*,\*-`.1c14e36e36d36c25b67a78b::_<:^<:Y<8W:6V72[52X0.R,+M*(J(&G%#@!<>>>>@@A!@!?'>(='<&;#9"879!73359$#?*)B/+F40F40G51F42C1/?-+;)'7(%1!!0 /// / 0 !3 "5!#5!#6!&6#%:')<,,@00C41K<9K<7J;6H;5G:2E;2E;1F<3K>8J<9G96D63C41B30A2/A11@..A//C/0C/0B./B,.A+-B**@(&@($A($A)%B)%A)%C*%B+%C*#C,$H/(M6.T;4U?4T;4Q:2I2,F.*A)'<$"8 4334!3"2#3"2#2%3&4'/ .-.// 1"2#5"$4!#4""3!!3!!2 2 /+#*#+ &*#)!&#!((*. 3#$8((<,,=/.>22=53=85;:69:5794572350873873<74=85=96>:7=<8<<:@@B>>@=;@97:8394/33,32,0Q95R:6T=7V?9XA9ZC;\F;\F9\F9\F8]H7^I8^I6^I6^I4^I4]F4]F4\E3ZC1YB2XA1W@2W@2YB4YB4X@4W?3W?5X@6YA7YC8ZC;WC:VB9T@7R>5P<3O;2N:1L8/N:1P<3R>5T@7T@7S?6U?4W=0Y=/Z>0Z>0Y=/W;-U9+T8*S7)T8*W;-Z>0[?1\@2[?1[@/]B/]B-]B-^C.aE/dH2hJ2kK2oM2oM2qN2tO2yR5|U6X9Y9`=b;d$#=#";! 9<"!=#">$#?%$@&%A'&B('G'(X+.^,/a/2d25f26g37g37f47d36a56_77]:8[<9X<8V=8X<8W42U/.N+)J(&G(%C%#> :<<<= ? @ @ @"?%<&>&<&;#:#8 6 6 4325 9%$>*)@.,B22C33D44D44B22?//;++9))3##2""1!!///0 0 !3#&3"(3"(4$'6&)9)*<,,>..F74F74F72F72F70F70F8/F70I:7H88E55C33D22C11C11C11>*+?+,@*,A+-@*,?)+?&)>%(@&'A'&A'&A($A($A($A($A(#A(#B)"E,%K2+Q81T<2R:0O6/F/)C,&?'#:"766 6 5"4!3$2#1$1%2(1'."---.0 2"3#6"$6"$5!"4 !4 !3 21* *#*#)"(%#!**+-1!!4$$7''8*);//;10:5287368338216024/561952;63>64>96>:7?;8>=;@@B=>B<;@:8=8395063,32+2P;6P;6R>7T@9VB9XD;ZF;[H:YF8YF7ZG6ZG6[I5[I5\J4^I4`I7`I7_H6^G5]F6\E5\E5[D4YB4XA3W?3V>2V>2W?3X@6XB7YB:VB9UA8T@7R>5Q=4P<3O;2L8/M90O;2P<3Q=4Q=4Q=4S=2S;/U;.V1Z@3Z@3Z@3Z@1\B1\C/]B-]B-`D.bF0eG/hH/nL1nL1oL0pM/rM0uP3yR3{R2X5Z4[5[5\5`6e;i>tHxIzK}K|J}KNQPTVTQT^ekjkjjijjprtuuvww|~đÓӒ“ÕÕ×řÚƜȠʤ̨ͩΩϩҫԭԭӯհֳֵֶ׷׺ڼģţţţ££¢   ĠĠĠĠġŢƢƣǤǥȥȥȦȦȧǦƥŤĥĤࠟ˿ĝĝĝĝƝƞƟɟɠȞɞɟ̡Ρѣա֡֟ןٞ؞؟ؠӠҠҠӠՠננ١ܡݢ鬵ާТwix^l{WcuRYmHPfAH^:>X48O+/I&*D$)B#(@!'= %:&:(8)5(3)1(.(.(0 *0!(0'1!$4!%6"#9#%;&%>$#@$!@#B#H%P)"Y,&_.)`+'a*'`('^((Z(+V(+R(*Q(,P&(O%'O%'O%'N$&M#%M#%M#%L"$L"$L"$L"$L"$L"$L"$L"#N&&L$"N"R%"[*&b,*e.+d-*b*)]*'Z()T&&M%&I%%G$(C%'C'&C'&C'&C'&B&%@$#?#"=! ?#"?#"@$#A%$B&%C'&D('F&'W-/^-1`/3b15d16e27e27e27a04_14\24Z34X65X97X:8Y;9S//R+,K''H&%E&$A##=8999: ; = = =!:"9$:$9$:#9#9#8$6 5 55!7!#:&'=)(>,*@00A11C33D44C33A11>..<,,7''5%%3##1!!0 /// 5%(4#)3#&3#&3#&4$%6&&6&&<-*>/,@1,B3.C4-C4-B3,A2-D52C33A11@00A//A//B00C11;'(;'(=')=')<&(;%'<#&;"%?%&?%&?%&?%$?%$?%$?%$?&"?&"?&!B)$G.)M4/O6/N5.K2+B+%>)$:% 6!434 4 2!1 /".!.#.#/%/$-!---.0 2"3#7#%7#%6"#5!"3 210,* ))'%#"+*++-/!!1#"3%$7++7-,50-43/24/05/05/24/34/730941=53=85>:7?;8>=;??A>=B=;@:8=94:7076,45+3O:5P;6R>7T@9VB9XD;ZF;ZG9XE7XE6XE4XE4YG3[I5\J4]K5aJ8aJ8`I7`I7_H8^G7^G7]F6ZC5YB4W?3V>2V>2V>2W?5WA6XA9VB9UA8T@7R>5Q=4P<3P<3L8/L8/M90N:1O;2O;2O;2Q;0P8,P9+S8-Q:,T9.R;-S8-Q:,R7,R;-V;0V?1Z?4ZC5^C8_E8^D3^E1_D1`E0bF1cG1fG2fH0jJ1lJ/mI/nK/qL1sN1xQ4yR3|S3~S1~S1|T1|V1|Y3~\6^8h?mCsFuHwIzK}LOyLSWVOQ\ckkjikjklrtvvvvww}~’ÓĔŖÔԓ”ƜǟɣͦͩϪϪϫӯӯӱԲԴյֶֹֻؽâŢǢǢǠ¡áࠟßÞĞĞĞĞƞƞƞƞƞƟǟǡȡȢɢɦ̥˦ʥɤȢƣƢޞžœ›ĝƝƝƝȝȝȝȟ˞ʞɜʝ˝͟ϞҠ՟ןמٟ۞۞۟۟؟֟֟؟ڟڟܟݠ뫳᧪ӣƢsbqtTanMXjGNd?G_:AY59R/3K(,D$'A"'?"&= %9%9%7&5(3'2(1(.(.'1!+1")1 &4!%6"$7#$:%$>&$B&#C$!E$H%O& W*%_.)d1-_*&`(']''Y%'V%)T%+Q'+P'+O%'O%'O%'N$&N$&M#%M#%L"$L"$L"$L"$L"$L"$L"$L"$L"$N&&L$"N"!S&#[*&a.+d/+d/+b,*^+*Y'(R$&K#$F"$E"&C#&D&&D('E''D('D&&B&%A##?#"A##@$#A##A%$C%%C'&D&&E%&U+-X*-Z,/],0^-1`-2a.3a.3^-1[-0X+.U+-S,-S//T21U32O++K')F$%C#$A##>!#:555578899!6!5!6"7#8$7#8$8%5 3 5"5!"8$%9'';)'=+)=-->..A11C33C33B22@00?//:**9))6&&3##1!!/// 6&)6&)5%(3#&2"#1!"0 0 3$!6'$:+&>/*?0+?0)=.'<-(?0->..=--<,,>,,?--@..A//:&':&'<&(<&(<&(:$&;"%:!$=#&=#$=#&=#$<"#<"#<"#;! <"!<#>%!B)$G.*J1,I0+F/)<'":% 7"42234!1 0.!- ,!-"-#.#-!,,,./1!2"8$&7#%6"#5!"3 21/+)('&%$#))))*,/! 0"!2&&2('0+(/.*/1,.3-/4.24/34/62/941=53=85>:7?;8>=;??A>=B=;@:8=:3:8187-56,4N94O:5Q=6S?8UA8WC:XD9YF8WD6VC4VC2VC2WE1ZH4\J4]K5_I4_I4_I4_I4^G5^G5^G7^G7[D4ZC3XA3W@2V>2V>2W?3V@3WA6UA6T@5S?4S?4R>3Q=2Q=2L8-L8-L8-L8-L8-M9.N:/N:/N8-N8+N6,M7*O7-N8+P8.O9,N6,N8+R:0T>1X@6[E8_G=aI=^G7^H3aH4bI3dI4eK4fJ4hJ2iI0iJ.lJ/mK/qN2tQ3xS6|U8zQ3yP2yP2xQ2yR1yU3yW2yW2{[5~`:g?kCpDsGwK{OwKSXVSR\fnkkkmmmmqsvvvvxx~––ƞȢʤ̨ΫϫЬЭұԴԴյնֹֻֻֽֿášȡȠǠǞĞĝÝÜĜĜƛŚĚĚŚŚǚǚǚǙƚǚǛȝȞɟɟɣ̢͢ˡʢɠǟƟƜۛ›ĚÞǞɞɞɞʞʞʞʟ̝͜˚̚̚ΛЛӟמٞۜ۞ݜݜݜݟܠܠޠޠߠߠ꭯ߪХ¢viwvWfiIVcBM_>E[8?V39S04N+/H%)B"%@!&>!&<&8$8$6#4%3%2&1&/(/(3",3"*4!'5"&7#%:$&=%%@'#E&!H%M&!P'!Y)%^-(e0,g2._)']''Y%'U$'R$'Q$)P%,P%,O%)N$&N$&M#%M#%L"$L"$L"$L"$L"$L"$L"$L"$L"$L"$L"$N&&L$"N"!R%"Y)%`-*c-+c-+a++\*)W''P$%J"#E!#D!%B"%E%(D&(F&)F(*F&)D&(D$'B$&C#&B$&C#&B$&D$'C%'D$'F$%N&'R%(R%(T&)V%)X'+Y(,Y(,Z)-Y(,T&)Q$'M#%L$%L%&K''J&(F#'B#?"= "9"5222223355!11!2"3"4#4%5$5$3"2 3!4!#6$$6&&8((9)):**<,,?//A11B22B22A11@00=--;++8((5%%2""1!!0 / 9&*9&*8%)6#%4!#2!1003!7%#;)%=+'=+'<*&;)%:+(9))8((8((:((<**=++>,,;'(;'(=')=')=')<&(<#&;"%:!$:!$:!%9 #8"8"7!79!!8 9!=%!B*(D,(D,(B*&:%"8# 5 31234!0/.!,,!,!-"-", ,,,-/1!2"7#%7#%6"#5!"3 210-+*)('''&&&'),. /!!/##.$#-(%,+'-/*.3-05/350450841:52>64=85>:7?;8>=;??A>=B=;@;9>;4;9299/78.6L72M83O;4Q=6S?6UA8WC8XE7VC5UB3TA0TA0VD0YG3\J4^L6]H3^H3^H3^H3^G5^G5^G7^G7]F6\E5ZC5XA3W?3W?3X@4WA4WA6T@5T@5S?4S?4R>3R>3Q=2M9.M9.L8-K7,K7,L8-M9.N:/L8-K7,L6+I5*K5*I5*L6+J6+K5*I5*M7,N:/S=2UA6[E:]G:\G6_H6`I7dK7fM9gL7gL7hL6hJ2iI0jJ1mK0qM3uR6xU9zU:xP6wO5vN4tO4vQ4vS5uR2rQ0pR0tV4x\7|`;~e=iApGuLtK{PTTRV`gmllmmnnoqsvwwxzzĘØĘĚŚƝƝǟƠǣɥͩΪέϭϯҵӷӷԸջջֽֿԿğǟʞɞɝȝǜƜƛśƚŚǚǙƙƙșșʙʙʙʘɘɘəʛʜ˝˝˟̟̞͞˟ʞɞɝțěěĚÚŚŚƚƞʞʞ̞̞ΞΞΜΝћЛϙΘΗΙљԝڛڛܛޜ봮ܫɞdwtXdhJV^@J[U28P-3O,0I),D$'A"'?"'&$C'$H' N(T)"[,&`-)e.+f/,f.-^((Z&(U$'Q#&O"'O")N#,O$+N$(N$&N$&M#%L"$L"$L"$K!#L"$L"$L"$L"$L"$L"$L"$L"$O''N$%N"!Q##X(&\+'^+(]*'\)(Y'&T&(P#&J!%E!#C $A!$D$'D$'E%(F&)F&)E%(D$'C#&C#&C#&C#&C#&D$'D$'D$'F#'I"%K!#J "L"N #O!$P"%S"&V%)U$(Q#&N #K!J GF!E!%A$<!: :"6!1/... / / / 1"1"/ - .!0#1"1#2$2#3#1"1 0 !1!"4$$7''8((8((:**=--?//A11@00?//>..>..<,,9))6&&4$$2""2""1!!9&(9&(9&(8%'7$&5"$2 1/14" 7%#9'#:($9'#9'%7''6&&5%%5%%7%%8&&9'':((<()<()>(*>(*=')<&(=$'<#&9 $8#8%7"6#5 437!669!>&&A)'A))?'%:%"8# 5 2113 4!0/.- ,!,!-".!,+++,.0 1!5!#5!#5!"4 !4 !3 32 .,+))))*&%&&()-, -!!-#"+&#+*&-/*/4.271683783;74<74?75>96>:7?;8=<:??A>=B=;@=8><5<:3::089/7J71J71L92N;4P>4R@6TB6UC5TB4SB2RA/RA/TC/WF2[K4^L6_K3`J3`J5`J5`J5`J5`I7`I7_H8^G7\E5ZC3YB4XA3YB4XB5V@5T@5T@5S?4S?4R>3R>3R>3O;0N:/L8-K7,K7,L8-M9.N:/L8/J8.I5,F4*F2)E3)G3*G5+G3*E3)F2)F4*I5,K9/O;2Q=2YC5[F5]H7aJ8cL:fM9gL7hL6fJ4hJ2iI0jK/nL1pN3sQ6uQ7uO8sM6qK4qM5sO5tP6qN2mK/lM0oP3qT4sV6sY6x^;eBkGpJtKxO{PRXaipnmmmnoppqtuyz||““˜ÙÙĜŜşƟơšƤɦ˪ͬϯϯΰҷԺӼӼվվܝÜƝǝɜțɛɛțțȚǚəșʙʙʙʙ˙˙͙͙͙͖͖͗͘ΘΙϛϜК͚͚͚͚͛̚̚ʗŗŗŘƘƘƘȘȝϝϝѝѝѝѝѝќҚњҗЗҕҗԖךܙܚߙ᪛Ɣ~jjObbHSZ>JV8BV7?T5;O/4J*-K+.G'*C#(@!&?"'="):(6%7$7$5$4&5 )4 )4 )4 )7#,7$*7"'8"%<#&>$%@&%D'#K&S(\+$d/+i/-j.-h,,d,+]''X&'R$&N!$K!%L!(O!+Q#-N$(M#%M#%M#%L"$L"$K!#K!#L"$L"$L"$L"$L"$L"$L"$L"$P&'N$%N"!P""V&$Y'&Z('Y'&V$#U%#S%'N$&L#'F"&C &B%D!%E"&F#'G$(H%)G$(F#'E"&F#'F#'F#'F#'E"&E"&E"&E"&H!$H#G"G!H"K#M %O &P!'P!'R!'Q &N%L#J!F C#>"976"5"0,- - -"."."."/$.$,"-#-!-".#/"0#.#3 $/"- -.0""4&&7))6&&8((;++>..?//>..=--<,,>..<,,:**7''5%%4$$4$$4$$9'':((:((;)):((8&&6$$5##12 3!5#!6$"7%#8&$9'%5%%4$$3##2""4""5##5##6$$:&';'(<&(=')<&(;%';"%:!%7$7$6%5"3"2117"557<#&?''?&)>&&<'&9%$5! 20012 0 /. ,, , -!-!++++,.0 1!3!3!3 4 !4 !5!"5! 4" /.-+**,,'&%%%&()-!!,"!+&#+*&.0+1605:4:<7;<7>:7?:7A97?:7>:7>:7<;9?=@?=B?:@=8><5<<2:<19;08H5/I60K81M:3O=3Q?5SA5SA3TB4RA1Q@.Q@.SB.WF2[K4_M7`L4aK4bL7bL7bL7cM8cL:cL:aJ:_H8]F6[D4ZC5YB4YB4XB4V@3T@5S?4S?4S?4S?4R>3R>3P<1O;0M9.K7,K7,L8-M9.N:/L:0J8.H6,E3)D2(D2(D2(E3)E3)D2(B0&A/%B0&D2(F4*G5)S@1XC2[F5^I8bK;cL:eL8fK6gL7gK5hJ2iI0iI0lJ/nL1oM4rN8pK8nI6oK5qM7pM7mK2hH/lL3mN2nP4nP4mR4qV8x]?|dBnIpHrJwL~QXagqpnmooopmptuy{}~“ÔėŘĘיŸĢƥȧˬ̯ͰͰαѻӽӽßߜܜƜɛɛ˚ʙ˛̛̚˚˙˙˘̘̙͙͙ϙϙљљљѕϖЗИјљққҘΘΘΘΙΚϚϚΖȗɗɗɗɘʘ̘̝ҝҝԝԝԝԝԜԜכ֙֗ԔՔՕהי﹭ݤnpVs\DTW=FQ7@P5#*<#)9(7&8%6%6%5 %4!'5!*5!*5!*7$*8#*9"(;"&=#&A$&C'&H&$N&W(`.'h1,m10l/.h,,b*+[')W&)P#&K!%J&K 'O!+P",N$(M#%M#%L"$L"$K!#K!#K!#L"$L"$L"$L"$L"$L"$L"$L"$Q'(N$%N"#O#"R$$W'%V&$U%#S#!Q##Q%&O%'M$(G#'D&B%D!'D!%F#'G$(G$(G$(F#'E"&F#'F#'F#'F#'E"&E"&E"&E"&F"&G #F"F!F!G"J $N!&M %O &P!'S"(R!'Q &O$J$B#: 8 6 5!2!. ++"+"+"-"-$-$-$-$,#*#,!+",#,#-"-"1 &/",*+/!!4&&7))5%%7'':**=--=--=--;++:**>..<,,:**8((6&&5%%5%%5%%8&&9'';))<**<**;))9''8&&3!!3!!3!4" 5#!6$"8&$9'%4$$3##2""1!!2 3!!3!!4""8$%9%&;%';%':$&9#%:!$9 $7$6%5$4#2!1 007$5 46 :!$>%(>%(;%'<(':&%6"!200111!0 . -,-!-!."++++,.0 1!12 23 5!"6"#6"!7#"2 /-,,+-. * )'%$$$%-!#-#"+&#+*&.0+2717<6<>9>?:@<9A<9B:8@;8>:7>:7<;9?=@>7>>4<=3;<19<19H70H70H7/I80K:0M<2O?2P@1TD5RB2QB/SD1XI4ZK6YJ3XH1bN6dN7eO8fP9eO:dN9bL7`J5eN0O<.O<.O<.P=/P<1N<2K:0J9/H7-G6,F5+G6,G6,C2(B1'@/%>-#=,">-#?.$A/#I7)M:+S@1XE4_J9bK9cL:eL8iN9iM7gK5hJ2gI1iI0kK2nK5nK7pM:qN;rOM4:N38O26N13L/1J,.G*,E(,?$)<#)8!)8!+7 (7 &7!$7 &7"'6#)7$*7#,8$-7")7")7 &:!%>!%A#%C%%I&"Q&Z*d/'l2.n21l/.e))^&'T "P"$L"$J!%J!'L!(O")P#*M#'M#%M#%L"$L"$L"$L"$L"$J "J "K!#K!#L"$M#%N$&N$&L"$M#$P$%Q%$Q%$Q##P# O"R$$P$#N$%L$%K$'H$(H#*G$*G$*G$*G$*G$*F#)F#)F#)F#)B%B%B%B%B%B%B%B#F"&F"&E!%G %F$F$F#F#F"J$M&O (O&L#IC=8 8 6 4"0!/!.!/&-%+%*#)")")#*$,%*$+$*$*",$.&/ %/ %.$.!.!0 #2"%5%&7'(7''7''8((9));++=--=--=--D44C33A11>..;++8((6&&5%%>,*@,+A-,B.-@,+>*);'(9%&<():&'8$%6"#6"#9%&<()=++7''6&&4$$2""3!!2 116"#7#$9#%:$&:$&8"$8"7"3$2%1$/"/ / 0!03"4!5"6 #7!$8"%9#%9#%;'(8&&4""1.---.....- ,+--,++,./12 23 5!"6"#6"!7#"4" 3!2 / -,**-!#+!(!%#!!"* ,"!-(%-,(.0+05/6;5<>9AB=C?;D<:A<9>:7=96;:8?:>AED:B@5=;.78+4H70H70H7/I80K:0M<2O?2P@1TD5RB2QB/TE2XI4ZK6YJ3YI2bN6dN7eO8fP9eO:dN9bL7aK6eN0P=/P=/Q>0Q?1O=1M<2K:0I8.H7-H7-H7-H7-E4*D3)B1'@/%?.$?.$@/%@0#D2&G5'L:,R?0XE6^I8aL;dM;gN:gL7fK6fJ4gH3gI1gI1iI2kJ9kJ9mI9kJ9jI8iH5gF3fE2eF2gH3hI4iK3gK3jN6pT%+:#+8#*7"+7")7 &7!$7"'7"'7$*7$*7#,8%+7")8!':!%<"%@"$C#$E&$L&#W+"^,!d/'h1,i/-e+*`%'Y"%S!$P"%L"$J!%K"&M#'N$(Q$)N$&N$&N$&M#%M#%M#%M#%M#%J "J "K!#K!#L"$M#%M#%N$&L"$M#%P#&P$%P$%P$#O#"N"P$#N$%L$%K$'J#(H#*G"*F#*H%,G$*G$*F#)E"(E"(D!'D!'B%B%B%B%B%B%B%B%D $D $D $B#C#B"B"D"ABH"J$K$L#J!G"A"=#9!7 2 / . - -$+#*$)#*#*#+%+&+%+%*$)#*$+#,$-%-#-#.#.!0 #3#&6&'7'(8((8((9)):**;++<,,<,,<,,E55D44C33@00>..;++:**;))?+*@,+A-,A-,@,+=)(:&'7#$:&'9%&6"#5!"5!"7#$9%&;'(:((8((7''6&&6$$5##3!!3!!5!"6"#8"$9#%9#%8"$8"7"3$2%0#/"/ / 0!02!3"4!5"6 #7!$8"$7#$8&&6$$4""1///// / .--,,,. -,+*+,-0023 4 !6"#7#"7#"6$"5#!4" 2 0,*), "* ' #"! !(+! +&#+*&,.)/4.6;5=?:CD?FB?FA>G?=C>;A=:@<9>=;?:>A.!?/"C3&I7)O=/VC4]H7aJ8bK9eL8fK6fL5fJ4eI3dH2eF1iI:hH9gF7dD5cC4bC1bC1bC/bC/dE1fG3fG2fG2iJ5oP;rV>v]?vbAydE{hGlKsO{WYdgltwxxuuvwx{}¡ĥŨƫȬȭɰʳ˴͵ͷθнпŸÞŝěĚזÔŔŒŒőƑƓ̔ϔϕЖїӗӘԖԖԗ՗חז֔ԓՔؓדؒ֓֒ԓՒӐҏАЏΐϑϒѓђΒΓϔЕӖԗ՗՜ۜۜݝޝޝޝߛߛ쩣ёxecLfY@UU=KN9BJ7;G27G14J14K33J01H./F,/E+.B',>%+:#+8#,7!-7"+7!$8"$7#%7#%7$(8%)9$+9$+9"*9"($>$>$>$>$>$>$>#A"A"A">!@!? ? >9:?BF H!J#I%F&A$=#73/-,) ) ( ( )#+%-'.(,')&(%'#)#)#*"+#,#,!/"1$3 $6#'9&*;(*:**:**;++;++;++:**;++<,,E55E55C33B22@00>..=-->,,?+*A,)B-*B-*@+*=('9$#7"!9#%7!#5"4!4!5"7!$7#%9''8((9))9)):((8&&6$$4""4 !5!"7!#8"$8"$8"$9 #8#2#0$/!. --./0 012 3 4 !5!"6"#5"$4!#3 "1 1 1 1 2!1 0.,+,./ /!. ,**)**//124 !6"#7#"8$#9&"8%!7$ 3!1,*)* )&#! %((# '&")+&-2,6;5>@;AB=D@=D?9=?:@B;BB;BC8@?4<;.78+4H70H70H7/I80K:0M<2O?2P@1RB3RB2SD1UF3XI4ZK6[L5\L3eQ8fP8fP8eO7eO8dN7cM8cM8fP;eO:dM;cL:aJ:`I9`I9_J9[E7ZG8ZG8ZG8[H9[H9[H9\I:XE6WD5UB3TA2TA2TA2UB3UB3TB4QA2P>2N>/N<0L<-N<0M=.L:.J:+I7+G7(F4(D4%D2&C3&>.!>.!?/"A1$G5)N<.TA2ZE4]F6_H6cJ6fK6gK6gK5eI3dH3fI9eH:dD5aA2`@1_?0`A/aB0`A-aB.cD0bC/bC.eF1kL7mQ9sY>v_@zbF{fG}hK~kKpOtPX]fqvxwtzz{{||£ħŪǬʯʱʳ̴ͷθθιϼпœÛ™˜•“ēđđđƑƐˑ͓̒ΔЖҗӗӖԗ՗טؗז֔֓הٓؓؑ֒ՑԑӐҏюЏώΏΐϑВѓғғҔӕԖזזכޛޛԓ{jgSl\EWX=LSBG!H$I (E&?$8 40-,)''( *$-'/)1!+*')&(%&#'!'!(") *!-"/"1$5 '8#(;&+<',=*,<,,=--<,,:**9)):**<,,C33C33B22@00?//>..=-->,*@-)A,)B-*B-*?*)<'&8#"6! 7!#6 "4!3 23 4#4$6#%6&&8((:**<**9''6$$4""4 !4 !6 "7!#7!#7!#9 #7!$2#0"/!---..//0123 4 !4 !2!2!2!2!3 "3 "4!#4!#4!#2!.,+-/1 1!/!-+*))*./13 5!"7#$8$#9%$;($:'#8%!5"1-*()&$! #%% %$ ')$,1+5:4>@;<=8?;8?:7A97>96<85<85986<7;=8>@9@B8@A6>=2:;.78+4F70F70F8/G90I;0K=2M?2NA1OB2PC2RE2TG4VJ4XL6ZN6^P6fR9gR7fP8eO7eO7dN6dN7dN7gQ.P=/P?/N;-M<,N;-L;+K8*I8(I6(G5'C3&?1&>0%>0#B2%G5'M:+P=,VA0YB0^E1aH2eJ5eJ5eJ5eJ7dI8bF8`C5^A3]@0]@0^A/_B0\?-]@.`A-`A-`A,bC.gH3jN8qW>u[@z`G|dH|dJ{fI}hK~kJySYfqyzyvzz||~~ħŪƫȭ˲˴̵ͷ̸ιιλνϾ™̿•”ŔœƓƓȓȏʐˑ͓̒ϕіԖԖԖԗחחٕה֓גّؑؐ׏֍ԏԎӎҍьЌЎЎЏѐғՓՓՓՔؘ֔ؔؔޘޘߘߙ៙vo\reN^`FQV=CN59I68E56E24F23I43H32H00E--D+.B),@'-<%-9$-8$/8$08$-7#%8$%8$%9%'8%)9&*:%*:%*<%+>%)B%)D&(I'(M))R,+V-+_/+^-(Z+%V)$T&&R&'Q%&R%(Q$)P#&O"%O#$N%#O&"P)$Q)'O%&O%'P&(P&(Q')R(*R(*R(*K!#K!#J "J "J "J "J "J "L$M %L"$M#%M#$K##J""H"!H"!G! G #D $D&C&C(B(B#)@#(@!'= %<#9!9 7:!9!:!9!:!9!:!:!; = ; 9875454467<?B H&E$A";630-)'')*"-%0'1!+)&(')$'"&!& (!(!+ -!0$3%7 (9"*;$,<%+<)+=--?//=--:**9));++=--A11@00?//>..=--;++:**<*(?,(A,'B-(B-(@+(=(%:%$7"!6 "6 "4!3 2!2!2#2"2!2""6&&8((:((9''6$$4""6"#6"#7!#7!#7!#7!#9 #8"%1 /.-,,-..//01234 !0/"0 #1!$2"%3#&4$'4$'4$%2"#/ ,,-0 3 "3#1#/!-,,,,0124 !6"#7#$8$#9%$<'$;&!9$5"1-*('$# !$$%$ ')$+0*493<>9;<7>:7>96@86>96<85<85:97948;4;>4<>4<=2:fO=eN/Q>/Q>/Q>/O<-O<-P=.P=.P=.O<-M:+L:,I9,E7,B4)@2'B2%D4'H6(K8)P;*Q<+U>,Y@,]B/_D/_D/`E2^C2^B4]A3\@2\?/\?/]@.]@.[>,\?-_@,^?+^?*`A,eF1iJ5mQ9pV=u[Bx^Ey_Fx`FzbHzeFuRXfq{ĺ}Ż}ûzļ{z||}ħŪǬɮɱ̵̵ͷͷ͸͸ͺͺͼνοο˾ʽɼ”ŔŔǔǔɕʐɑ͓̑̒ϔДҕӔҕӖ֖֕ה֓Ւ֐֏א׏֎ՍԏԎӎҎҍьЎЏѐҐғדדדהؔڔڔ۔۔ەޗ멨Ж|jjScdJU^CHS9:H0.K99G77G55H66J65J54H00E--C*-@*,>'-;&-9%.6%/7%17&07$&8$%8$%9%&9&(9&*:%*;&+?&*@%*C&*G'*L*+R+,V..Y0.]-)\,(W*%T(%P&'O''P()Q')P&*Q$'P$%O#"O# M$M&N' N$%N$&O%'P&(Q')R(*S)+S)+K!#K!#J "J "I!I!I!I!L$M %L"&M#%L$$K##I#"H"!F F C!C#B$B%A&@&>%= %<$;#9!8 768 8 8 8 8 8 8 9 :::75333333257;=D"C!B">!962/,+)))!+#.%/()$&%'"&!% &!(!*!, ."2%5(7 (;!*<"+:#);(*=--@00>..:**9))<,,@00A11@00?//=--;++:**8((:(&?,(A,'B-(C.)B-*?*'=(';&%7!#7!#6 #5"4#3"2#1!2!1!!4$$6&&9''9''7%%6$$:&'9%&9#%7!#7!#7!#9 #8"$0/-,,,--./01234 3!!-/"0 #2"%4$'4$'4$'4$'6&'4$%2"#0 !0 !0 !2""3#$5 %4&2$1#0 0 0 1!4 "5!#5!"6"#7#$8$%9%$9&":% 9$8#4!2.+)%#  $&!'&"(*%+0*2719;6;<7>:7?:7A97?:7>:7>:7<;9715818:08:08;.79,59)37'1F70F70F8/G90I;0K=2M?2NA1M@0PC2TG4VI6VJ4XL6\P8aS9hT;hS8fQ6eP5dN6eO7fP9gQ:gQ:hR;iS>jT?jSAhQ?gP>eP=eP?bO>aN=`M<^K:\I8[H7[H7YF5XE4WD3UB1UB1UB1VC2VC2YD3XC2VA0T?.S>-S>-S>-T?.P;*Q<+S>-U@/U@/U@/S>-Q>/J<1H;2G9.E7,F6)G7*I7)K8)K6%K6%L5#M7"P7#Q8$T9$U:'U;*V<-X<.Y=/Z?.Y>-Z=+Z=+[>,\?-_@,]>*]>)_@+cD/hI4fJ4jN8oS=qW@rXAs[Cv^DwbE~jIvN]lu¶zĹ{ĻzĻxüxûz|}¦ĩƫƭɯʲ˳̵˶˷˷̹̹̻̻ͼͼͼͼͽʽɼǺȾÓĒœƔǔɒˑ͑͒Βϒϒђђђѓԓԓ֒ՐӏԍӍՍՍՎՍԏԏԎӍҍэяяѐґӔؔڔڔړٓړړܑڑړޕ֔|xcvhNY]BGV<;Q83L5/N<:I;:I99K97L87J65G21C.-@*,?)+=&,;&-9%.7&07%17&07$&9%$9%&9%&9&(9&(;&+;&+@'+B',E(,H(+N*,T-.X00]10^.*]-)W+(S*(O)(L((N'*N'*Q'+R%(P$%N"!M"K#J$K%L#!M#%N$&O%'P&(Q')R(*S)+K!#K!#J "J "I!H H GL$L$K!%L"$K##J""H"!H"!CCB B"A#A$@%?%:$8$7#7#6"5!5!4 4 4 4 4 4 4 4 6:::75311/./0347;>AA B"?";!6 30 .+***+ ,#'"&#%"%"& '!*!+".$0%5&8): ); ); ):!'9&(<,,@00?//;++:**>..C33D44C33B22?//=--:**9)):(&?*%B+%D,(F.*F.,D,*B**A));"%;"%:!%9 &8'7&6%3"4!#3##4$$6&&9'';));))<**?+,=)*;%'9#%7!#7!#9 #7!#0.,+**+,.//012 3!4" .!/$1 &3"(4$'4$'4$'3#&7'(6&'5%&5%&4$$4$$4$$4$%7"'6!(5 '4&4$4$5 %6!&8$&8$&8$%8$%8$%8$%8$#8%!8#9"6!3 1.+)#"  $(# *)%*,',1+05/572561841941;319418418416534.24-46,46,47*36)26&05%/F70F70F8/G90I;0K=2M?4N@3L?/PC2UH7VI6VI6XK8\P:bS-Q>-S>-Q>-O:)O<+T?.TA0WB1UB1VA0S@1M=0J)\@+aE0eI4_D/dI4iN9lQ*,<',:'-9%07%17%18'18$&:$&:$&:&(:%*;&+;&-<%-A(.D',F(*K)*R**W.,\1+a1-a0,_.*Z-*T+)P*)L)'J&&L%&Q)*P&(P$%N"!L K I!H!L"#L"$M#%N$&P&(Q')R(*S)+K!#J"#I $I $H#G"F!G!K#L$K!%L"$L"$J""H"!G! BB B"@!@#?#?#<$8"6"6"6"5!5!5!5!4 4 4 4 4 4 4 6: 9975310,,/135586;=@#>$<#8"5 3"1!.*((('!##""%& ) ,!."0$4%6': ):!'9(6%7%%;,)@1.?0-;,):+(?0-D52H96G85E63B30>0-;-*9+(9*%=*$@,%B.'E0+E0+D/*B-*A,)=%%<$$<#&;"%:!%8#6!38$%7%#8&$9'%;)'=+)@,+A-.A-.?+,='):$&8"$7!#9 #7!#/-,+**+,//0/ 2 1"2#2# .!0%2!'4#)4%(4%(2#&2$$6((6('6('6('7''6'$5$$7$&8$&7#%6"$6"$7#$9%':&';'(;'(:&%:&%9%$9%$9$!9$!8 7630.-+#! $)%$,+',.+,1+.3/350++),+'0**0+(0**1,)0,+0,+2,04*24*25*24)14'03&/2%.H92H92H:1I;2I;2J<1J<1JhT;hTfQ-Q@.TA0TC1VC4UD4UB3SB2Q@0PA.O@-P?-O>.N=-M<,M<,H7'H5&H5&H5&G4%G4%F3$H3"E0H1K4"N7%O8&P9'O8&O8&R;)R;)S<*T>)T>)U?*V@+V?-YB2[D4]F6`I9cL:fO=iS>iU=iU:n[=wdDrN[htxtuy~èȭɮʰ˱˳ʲȳȴʺʼʾʾȽɽȼȼǼǾſƿ’ÎĐƑɒʒ˒˒˒˒˒͓͒ГГғғғғғԐӍԏԎӍԌӌӋҍ֍֎׏ؐڐڒےۓܓܕݕݕݕߔޕޔݕޖߗ뙙ˆ~zkr_scMYU@EO;VFFXFFWEEUCCQ??K8:E24B/3@+2>+1<(1;'2:&1;'3;'3<(3;%(<#&<#):#+;$.<$1>&3A'2L.8M.4Q-1T,,Z-(_.'c1&f2'd/)^+'X'#S&!R&#O(#M'$K%"I#"K##L$%M#$O"%M!"KIJ !K!"M#%O%'P&(O%'M$(L#'H#G #F$F$E#E#D"E"H K!L"K!#L"$J"#H!"H!"D "C!A"= ;9868 6 7!7!6 4323456 53105555444200/./.--+.38 ;"%;"%9 $7"1 .,'$"!" $' %#!&*/"2#5 %8#(:#):$':#)9%'7(%8+%;,'>/*@1,A2-B3,B3,J;4J;4H;3F91B8/?5,<2)0'A0&B1'C2*D1*D1*D1*D1*C/(B.'@+&>)$>&"<$ ;#;#<'";(";($;($<)%=*&@+(A,+>)(>)(=('<'&9#%6 "31/. -+**+ + .%.#- +-,. /! 2#2%0%0!&0$&1'(4*)4,*5-*7.)8/*:/)=0*>/*?-)>,(;)%:($9'#9'#:($<+$?,(A.(F1,C.)@+&@+&@+&>)$;#6: : !9"7!3 0 - *!& %!%"" ! %!"'#"(&'**(+-,+-*)-,(-)+-,,,*-+,/+*0*,/))1(+1(+2).3(03(02'/1&.0%-0%-/$,G81G81H:1H:1I;2I;2J<1J<1L>1OA4SE8VH;WJ:YL<]P@cSCeS=hTiU=gS;eQ9dP8cO7aM5aM5`L4_K3]I1\H0ZF.XF.VF-UE,TD-SC,RB+P@)O>*O>*Q@.Q@.Q@.RA/RA1RA1SB2SB2RA/RA-Q@,Q@,P?-O>,O>,N=+K:*J9)I8(H7'G5'E3%D2$D3#B/F1H3 K6#L7$M8%L7$L7$O:'O:'P;(R=*S>+T?,U@-VA0V@2WA4YC5\F8_J9aL9cN;dP8eQ9iU>NBBPDD]MM]KK[IIVDDQ>@K8:F37D15?+4>*3<(3;'2:&29%1:&2;%1=$*=$*<"+;$.;#0=%3A'4C'3G)3L)/Q*-W+(_.'g1%m3%o5'i0)c.*^)%Z)$Y)%W,&S*&P)$K#!K##N$&N$&P#(P!'P%M"N"#M#$N$&O%'O%'N$&K"&J!%G %G %D $D $C%C%B$D"H K L !K!"K!#J"#H!"G !C!A >!<98656 6 7!7!6 53234555310333333330//.--,*((.36 "7!#9 $6 #1 /,'$"!!!$&'''*, /!!0 !2"#5"$6#%8$&9%'8&&7(#8+#<-&?0)B3,D5.D5.E7.K=4J=4J=4G=3E=2C;0@8-@6,>2&?1&@2'@2'B1'B1'C1'C1'@.$@.$@,#?+"@)!?( ?( ?( >*#=)"<'":% 9$9$:%":%";&%;&%;&%:%$8"$5!21/. , +*!*!+#+#-&,#+#*+,+ . 3 $3 &1 &1"%1%'3)(4,*4/+4/)70*:1*<1+?2*?0)A0)@/(;-$:,#;*";*"<+#>-%B/(D1*F2+C/(@,%?+$B+%A*$=& :": 9 8"5 1". ,"(!& %"&"#  !$ &"#%#$(&')))****,+)+*)+*)+*+++,*+.*+/)+1(+3(,3(,4)/3(03(02'/1&.0%-/$,/$,F70G81G90G90H:1H:1I;0I;0L>1OA4SE8UG:WJ:YL<\O?aQAdT=eS;fT,N=+N=-O>.Q@0RA1SB0SB0RA/RA/Q@.Q@.Q@.P?-N=-M<,L;+J9)H7'F5%D2$D3#B/C1D2F4 G5!G5!G5!G5!J8$J8$L:&N<(P>*Q?+SA-TA0S@1S@2UB3VC4XE4ZH4[I5\J2_M5aP6fU9l[=scB{kJqPuQYY]agjnnz|Ǭ˰ɮʯ˱̴̲ʵʶȶȸȺȾȾǿÝɿȾȾǽǿƾ•”Ó’ŒőǑǒȓɔ˔˔˔˔͔͔ϔϓΓΓГГғғґҐԏ֏֎ՎՎՍ֍֏ُُۏېܐܑݑݔߒߓߕ|wh]_QjYHZN>HH9>I:=NBDSIJXLLhVVeQR`LNYEGR>@M9;I49G27@+4?*3='3;%1:$09#/9#0:$0<%/<%-<%/<%/=%2?'4C)4E*3H)/M+,U+,^/)f2'n4(s5&v7(k/'f,(b(&^)%\)&Z*&V)&S'$O#"N%#Q%&S%'S%(U$(T#'S"&P$%N$%O%'N$&M#%L"$I $H#G %G %D $D $C%C%B$D"H K J "J "J "I!"F"F"B"@!= ;9755556 7!6 532334442101///////-,,,++*)*)-03 5"6 #7!$1 /-)&%#$ %% % (# .&$1)'2('2&&.""0""0""1!"2"#6#%7$&8&&8)&9,&*#;&!8#5 4337"!7"!7"!7"!5!310.-, +) ) *"+#+$*!)!))+*-2"%4!'3#&3$'4(*5+*7/-91.92,:3-=4-?4.B5-B3,D3,C2+?0)>/(<-&<-&?.'B1*E4-H70G4.D1+B-(@+&@+&?*%?'#=%!986 3/ ,* && %"&"$!!"$ '!#(""($#)%$)(&((&((&((&((&((&)(&,('.((0'(2()3)*4(,4)/3(02'/1&.0%-/$,.#+.#+F70F70G90G90H:1H:1I;0I;0M?2OA4RD7TF9VI9YL<[N>_O?cSgU=fT*R@,S@/R?0S@2TA2TA2UB3VC2WE1XF0\J2]L2_N4cR6hW9m]'1>)2A*4F-3J-2O/2V0/^2/g5.o6+u7*y6&y5(n/(h+(c'&a'%^(&[(%W%$S#!R%"R$$U%%V%(X&)X&)Z%+Y'*R&'P&'O%'N$&L"$J "G"F!G %G %D $D $C%C%B$D"H HI!I!"H !F E!B ? <;98652456 6 6 5433333221/........,,,,,++*,*+,/3 5"7!$1!/ .*)) ) !(""*%"'"% *%"4,*91/9/.6,+.$#."".""0""1##3#$4$%5%%7)&:-'>0-C60H:7J?9NA;MC:RE=PF=OE*#<(!9$6!310034444 20/.-, *) ) *"*")") ''(*)-4$'4$'5%(5''6**8.-;1/<41=60>71@70B71E80F70G6/E6/D5.B3,@1*?0)B1*E4-I81K:3L93I60G2-C.)@+&>)$>&"=%!8 64/,)'%$$!&"%"#$ %!)#%("")##)##)%$'&$'&$'&$'&$'&$)%$+%%/&'1'(3')4(*5)-4)/3(02'/1&.0%-.#+-"*-"*G81G81G90H:1H:1I;2I;0I;0OA4OA4QC6SE8VI9YLgU=gU=fT,P@0P@0P@0P@0P@0P@0P@0P@0I9)I9)I9)I9)J:*J:*J:*K:*D1 D2C1B0B0B0B0B0D2E3G5!I7#L:&N<(P>*Q>-R?0S@2S@2TA2TA2UB1UC/VD.ZH2[I1]L2_N2cR6gV8kZ>m]<{iE|jD~lFpJtMwS{V}Z`cflprtt}}ĩƭɯɱʴ̵̷˸ʸɹǹǻǽȾšĚœ›ɿɿɿǿÖÖĖĕȕȕʕʔʔʔ˔͔͔͔ϔϔєђϒϒђђҒҒҐҐ֏؏؏؏ؐڐڐڑݑݑߑߑߑߐސł~i`UIaJ?PH=KF?GJCJULQ^UXe[\j[^mZ\hTV`LNVBDO:?J5:H3:G29@+2?*1=(1;&/:$0:$0:$0:$0>(4>(4>(4?*3B+3D-3J03N00T20\50g82q:3x<1~<0:+~8.s2,m0-j-*g,(e+)a*'\&$W$!W&"W%$X%$Y%'\%(]&)^',\(,T&(P&'O%'L"$J "I!F!F!G %G %D $D $C%C%B$D"F!H I!H !G"D C@=::875423345 5 5 4332110000--------,,-----,-+,+.1!4 "6"$10/,+,"!-%#,'$,'$'# %!*2-:52:206.,-%#.$#.$#/##0$$2$$3%%3%%6+)9.*>31E:6K@>OFASHDTKDVKETKDRI@OF=LB9G=4C90@6,B6*A5'@2%?1$?1$@2%C3&D4'K9-K9-K9-K9-J6+G3(E1&C/&<(!:&8#5 32223344310/-,+*(()!*"(!'&&(**-5%&5%&6&'7))8,,:0.=31?53@72A83D93E:4H;5H;5H92G81H92E80B5-@3+A2+D5.H92K<5O>7N=6K82F3-A.(<)#;&!:% 6! 41-*'&$$$!&"%"#$ '!+"%) !)!)!'"'"'# '# ($!)%"*%"-%#0&%2&&5''7'(7(+5(/4)12'/1&./$,-"*,!)+ (H92H92H:1I;2J<3J<3J<1K=2PB5OA4OA4RD7VI9YLhV>dR:eS;fT.N>.O?/O?/G7'G7'H8(I9)J:*K;+K;+L=*F5!F4 E3C1B0B0B0B0C1D2F4 G5!I7#K9%M;'M:)P=.P=/Q>0Q>0R?0S@1TA0TB.XF2XF0ZH0]L2`O5eT:hW=kZ>s`@ta@vcByfE{kIoMsPuT|[}^`cdeegolkjqzǯɱɴ˵˷ʸʸɹȺȼȿɿڦܜɿĘÖėŗʗʗ̗̕˔˔͔͔ϔϔϔϔєѓГғғӓӓӓӑՐ؏؏ِؐڐڑۑݒޒޒߑ薞͆unaWoRGXG?NGAKIFOQNU\W]f]bi^bl]`eRVbNPZFHR>@K6;G27E07D/6@+2?*1=(1<'0<&2<&2='3>(4?)5?)5@+4B+3F-3J03O11T20W2,`5.k92v=4}>5>2;1~:1t50o40m2.l2.l20i2/d.,a+)[(%Z'$[%%\$%\$%]%&a&*^'*T&(P&'M#%K!#I!H G"G"G %G %D $D $C%C%B$D"F!G G F E!A?=987653221245 6!5 44321///00........-.../ / 0!/!/ ,--/1!4 "5!#2 0./ 0"0%!1(#1)&-(%($!%!*-*72/6.,2*(-%#.&$0(&2('2('1'&0&%/%$5+*9/-@44G=;NDBSKHWOLYRLYRJXOHVMDRI@MC:H>5C90@6,B6*A5'A3&@2%@2%C5(G7*I9,N<0O=1P>2O=1N:/J6+G3(E1&=)";' 9$7"6!5 5 6!5 5 6! 5 4 20.-,*)(()!)!' '&'(*+ ,!4&%5%%5''7)(9.,<1/?53A83B94C:5F;5G<6J=7I<6J;4H;3K>6H;3D7/@3+?2*C4-F70I:3O>7P?8O>7K82D1+>+%:'!9&"7"!4 0+(%#"% %"%"$!!"& ) !((('''"(# )$!,'$.&$0&%2&&4&&6&'9&(7'*6)04)12'/0%-.#+,!)+ (*'I:3J;4J<3J<3K=4L>5L>3L>3QC6OA4OA4RD7VI9YL*K:&H7#H7#I8&J9'I9)I9*J:+J:+K;+L<,L<,L<,H9&H9&H9&H9&I:'I:'I:'J;&J9%H7#F5!C2B1B1B1B1B1C2D3E4 F5!H7#I8$I8&J9)J8*K9+L:,M<,O>.P?-P?+SB.TD-UE.XH/[K2_O6cS:eU;iX:jZ9k[:n^=qa@vfEzjI}lNqSrVsWtXuYtXsWrWrZoZoYqZv`}fmqưȲʵʵɷʹʹɺɻɽ›™ěĝÞɿęĖėř˚̙Θ͖˕˔ϔϔєєєєӔӔӔԔԔ֔֔֔֒֏׏ُِڑݑݒޒ얢փqldZrYN_ODRF@JGFNMMWXVab_hhahj]djZ]\GLZCIT=CN7=H19E.6C,4B+3@)1?(0>'/>'/?(2@)3A*4B+5@+4@+4B+3E,0K.0P1/U2.Z3.a6/h91q<4w>5y=5w8/s3*n/(f/*d/+d/+g2.j51j51f3/c0,_)'^(&]%$\$#^$#^$#a%']''S%%O%&L"$J "H H G"H#G %G %D $D $C%C%B$B"E!EF"E!D @=:865321111245 6!6!5 5 320.../0.-------.../0 0 1!1!/"-"-"-"0!2#3 "4!#11/ 0!1$4'!5*$5,','#($!&"($!-)&/+(.)&+&#+&#-(%1,)5-+5-+2*(/'%,$"4,*80.@67H@>PHFUPLZUQ]XRZVM[TLXQGULCQG=LB8I<3G:1B6*A5'@4&@4&A5'D8*I;.L>1M=0O?2Q?3R@4Q?3N<0J8,H6*A-&@,%=(#;&!9$8#8# 8# 9$#9$#8#"7"!5!30/-,*)''( )!' '&')+,!-"3%"4'&7)&9.*=2.@51C84D95E:4G<6H=7J=7J=7I<6I<6LA;H=7B71=2,<1+?2,C60E82I:5L=8N?:N<8G51A/+<*&;)%8$#4" 0*&##"% %"%"# !!#'''&&'( +#!,$"0(&2('3''5''6&'8%':&(9&*6)04)12'/0%-.#++ (*')&J;4K<5K=4K=4L>5L>5M?4M?4QC6OA4N@3QC6VI9YLgW>bR8aQ7`P6^N4\L3[K2YI0YI0WG0UE.Q@,L;'J9%H7#I8&I8&F6'G7(G7(H8)I9*J:*J:*K;+J;(I:'I:'H9&H9&G8#G8#G8#L;'J9%G6"E4 C2B1C2C2C2C2D3E4 E4 F5!G6"G6$E4$F4&G5'I7)J9)L;+M<,M<*Q@.Q@,RA-TC/WF2[K4^N7`P7cR8dS7eT8gV:kZ>p_CtcGwfJyeJyeJ{gN|hM|hM{gL{fK|dL~bMcNdOgQjUmXo[q\}irİƲȳɶɶɷɸȸȼɾÜŜßęĘėř˚̚Θ͖˕˔ϔєєєєӔӔԕՕՕווווُٓ؏ُېܑݒޒߌ掔uu_YsWL]QGRJCKEBIHHPOQ][[gebmibjh[bfU[U@GT=CO8@K47p92i/+`&"W"T%Q&T'"Y,&a2,c4.c2-a0+^+(_)']'%\$#]#"^""_##]%&S%%N$%K!#I!H H H#I $G %G %D $D $C%C%B$B"E!EE!C!A>:8653111111235 6!6!5 5 320.-./..........//0 1!2"2"2#-".#.#/"2#2!3 "3!!110!1"3$5( 9*#8-'-%"'# &"'# )%"*&#)$!'"+&#.)&2-*50-50-2-*-(%)$!4+,901>88GAAPKHWSP\YT\\TZWNZVKYUJWQETLAQG;OB9L@4B6(A5'@4&@4&B6(F:,L>1OA4L1Q?3SA5SA5Q?3N<0L:.E1(C/(A,'=(#;&!9$8# 8# ;&%;&%:%$9$#6 "30/,+*)''( )!' ''(*,-" .#3%"3& 5'$7*$9.*=2.A62C84D93E:4G<6H=7K>8J=7J=7G<6MD=H?8B92=2,:/);0*?4.C60C60I:5N?:N?:H94D2.@.*>,(8&$3$!/($""#$!%"%"#  !%(''%&)+#!-%#3)(4((6((7'(9&(9%':$'8%)8)04)12'/0%--"*+ ()&(%K<5K<5K=4L>5L>5M?6M?4N@5QC6QC6SE8TF9VI9WJ:XK;YL;]N7_Q7`R8bT:cU;dVfX>i[Ai[Ai[Ai[Ai[Ai[Ai[Ai[Aj\Bi[Ai[AhZ@gY?fX>fX>eW=fV.M=-M>+O@-QB/SD1TE0VG2VG2XH1ZJ1^M3aP6dS9eT:hT;hT;lV>pZBu_HycKzdLwaIu]ErZBuYDuYDuZGw\Ix_KycN{fQ{iSp\u`iyƳıijǷƷĵ̿ʿĠƟÝÝǜǝɝɝ͚̚Ι͙͗͒ϒѓғҔӔԕՕחٖٗڔؓג֑׎֑ܐܐސޑߑߑꝤۅc_OF[NDORHPOIMURYXX`\^j`bnc`kaYd]PY]IRU>HT:CO5@J09F,5D*3C)2C)2D*3C)2C)2C)2C)2E,2G-6H/5F-1J01P22T20W1.]4.h93n=6q?8q<6m84d1-\+'S#!KDC B!D!G"K$O& T)#X($S"U"Y#![#"^$#^$#^"![#"P""L"#K!#J "H GE E H!&H!&E!%D $C%B$A#A!E!#D "C#@!>:9742211///111111114!3 0.-,---,,,++++1 1 2!2!1 0/.1 &.#*+.!0 !0 !./ 0!4% 8)$;,%=.'?.&;.&3+(,'$'"% '"(# '"% '"-(%3/,62/51.2.+1-*0,)5//;57C?>IHFONJUVQ]^Xcd\__U\\P[WL[UIYQDVM>QE9L@2B6(B9(D;*G>-J>.I=-H<,H<,M@0K>.M=.O?0RB3SC4Q?1O=1J6-F2+A,'?*%@+&@+&>)&<'$?*)?*)?*)=('9#%3.*-,*)'''( ' '( *-!0"!0%#1&"6+%:0'=2,>4+>1+>1+?2,A4.B5/H;5NA;QD>NC=LA;LA;MB8C:5A83@72@72A62D95H:7K=:L>;J<9E63>/,:+(7(%3%"/ +)&"!!  "$&'(()(),"!/%$0&%4((4((6((6&'8%'9%'9#&7$(2#*.#+-"*,!)+ ()&(%(%K<5K<5L>5L>5M?6M?6M?4N@5QC6QC6RD7TF9VI9WJ:XK;YL;]N7_Q7`R8bT:cU;dVfX>i[Ai[Ai[Ai[Ai[Ai[Ai[Ai[Aj\Bi[Ai[AhZ@gY?gY?fX>fX=gX;eV9bS6`Q4^N4^N4^N5^N5ZJ1VF-P@)L<%K:&J9%G6"C4!@3#?1$?1$@2%A3&C6&E8'F9(I<)I<)I='J>&J>&J>&J>&J>&L=(K<'J;&H9$G8#F7"E6!E6!H9$G8#G8#F7"E6!D5 C4C4!F6'F6)F6'G7(G7(H8)H8)H8)K;,K;+M=.N>.P@0RB2SC3TE2TC/VE1YG1\J4_M7`N8cN9cO7iS>lV?pZCs]Fw^Hv^Fs[CqYAqVAqVApWCrYEt[Gv]IwaLxbMwbO|gTp\|hxǼ¯ijǶɹʻɻɻɽʿ¡ßÝǝǞɝɜ̜̙͙͙͓͗ϓғҔԔԕՕוחٗۖڕٔڒؑ׏ؑސސސޑߑ㖘yw[UqJARJ@HNEJNIMQPUUU]Y[g``la]k_U`[KUXDMT=GS9DN4?I/:E+6D*3C)2C)2F,5E+4E+4E,2F-3H/5I06K05M02O1/S1/W1.]2,d5/k:5r=7o:4k62a0,X(&M#$F B >;9 !C"G$M&!R'!R" U$ X%"[%#\$#\$#\" X" P""L"#K!#J "I!H F!E H!&G %D $C#B$A#@"@"D $B !A"= <986211//...111111114!20.---,,,++++++01 2!2!2!1 /.1!$/".!1!"4$%4&%2$#/!0!1"4% 8)$>-&@/(C0*@1*5+)/'%*" ( )!'"&!% &!,'$2-*51.40-2.+0,)0,)3/.954A@>HIDNOJSVOZ]T_bW[_QY[MYWJZTFYRBXL-H?.JA0L@0L@0L@0L@0NA1M@0P@1RB3UE6TD5Q?1M;/M90H4-B-(?*%?*%?*%>)&=(%?*)?*)?*)=('9#%3.+-,*)'''( ' '( +."1#"3(&4)#8.%;1'>4+>4+?2*=0(>1+@3-C60H;5NA;QD>NC=LA;LA;LC8B;5@93A83A83A83D95G<8J?;M?5L>5M?6N@7N@5N@5PB5QC6RD7SE8UH8WJ:XK;XK:]N7_Q7`R8bT:cU;dVfX>hZ@hZ@hZ@hZ@hZ@hZ@hZ@hZ@i[Ai[Ai[AhZ@hZ@hZ@gY?gY>hY2"@5#A6$H=)H=)H='I?&J@'J@%KA&L@(O@+N?*M>)K<'I:%G8#F7"E6!I:%I:%H9$F7"E6!D5 C4B3 D4%D4'D4'C3&C3&C3&B2%B2%G7*H8)I9,K;,L<-N>/O?0O?0N=-P?-S@/VC2XF2ZH4ZH4ZH2bM:dO:fQ!<; 86321/..-- -000000002 1/-,,,-++++++++01 2 3!!3!!2 112""3#$5''9+*<.-8-)4)%0%!1# 3& 6'"9*%>,(C0*G2-I629+*2('-#"* )( '&( +,)3.+2.+0,)0,)1-*1-,653@@>HJEMRLQXPU]PX`QW^NVZIUVDWTAYR?YN)$=(#>)$>)&>)&>)(>)(>)(<'&8"$3.+,+*(''( )!' (( +0!$4&%7,*9.(91&<4'@6,@6,?2)=0'?0)@1*D5.I:3M@:PC=NC?MB>KB=KB=GB:D95>3/;0,6+'2)$.""* ( $  "$&(''$$&& '/$(0$&1"'2"%3 &3#4%1$.&+ (+ (+ (+ (*'*'*'L=6L=6L>5M?6M?6N@7N@5OA6PB5PB5QC6SE8UH8VI9WJ:XK:]N7_Q7`R8bT:cU;dVfX>hZ@hZ@hZ@hZ@hZ@hZ@hZ@hZ@i[Ai[Ai[Ai[Ai[AhZ@hZ@hZ?iZ=hY:gX;eV9cT7bS6aQ7aQ7[K2WG.RB)O?&M=&J:#F6A2;- 9-!9-!9-!9-;/!<0 =2 F;'G<&H='I?&J@%KA&LB'MC(PD,RC.QB-O@+L=(I:%G8#F7"H9$H9$G8#G8#F7"E6!E6!D5"E5&D4'D4'B2%A1$@0#?/"?/"D4'D4'E5(F6)H8+I9,J9/J:-K9+L;+O<.R?0TA2UB1UB1UC/YG3YG3]H5_J5aL7dP8fR:gS;fQlS?nUAoTAsXEv[Hy\J}`NkY|jwƽǴƵó³ĴŸƺȼʽʾʽȽɾ¡¡ ĠĠȠȝȝȜ̛˛͚̘̗ΔҔ֔֔֕זؖږژޗݗݖݖݕܔےݒ掿玿ꢿ韾ꞽ霽꛻ꚼ꙽혾睭ޓxrXRnNGYKCNE?CFBCMKLPOTSS[ZXe^ZhaVd[MZVBMQ:DQ7DO5BK1>G-:D*5C)4D*5D*3F,5F-3F-3F-3H/3J15L37P35V22Y1/\31b63j:6l;7h73d3/Z('S&#I ?854!5!#1136<? D!I!!M#$Q%$T&&X(&W'%T$ P LN"!L"#L"$K!#J "J "H#H#F$E#C#B"A#?!?!= = = <986321/.---- -0 000000010.-,,--**+++,,,01 3!!4""5##5##4" 4" 8)&;,)?1.C52A62=2.6+'1&"5("6)#9*%=+'?,(D/,K31M85;++7))2$$, *('&( ,$"1)'1,)1,)/+(1-*2.+0/-672?A)&>)&>)(=('<'&:%$7!#3/,+*)('()!)!' ()!, 1"%7)(:/->3-=5*?7*B8,A7+?2)=0'>/(?0)D5.H92L=8OBJA8B=7A<6C<6C<6E<7G>9I@;JA:E:6@51<3.7.)3*%.$#+! (!%  !"$%$#!!!"",!'+ &,&-%.%/$0$/$+'*'*'*'*'+ (+ (+ (L=6M>7M?6N@7N@7OA8OA6OA6OA4PB5QC6RD7TG7VI9WJ:WJ9[O7]Q7^R8`T:aU;bVdX>eY?eY?eY?eY?eY?eY?eY?eY?g[Ag[Ag[Ag[Ag[Ah\Bh\Bj\Aj[>j[%J@%LB'MD'ND)RF.RF0RF0PD.NB,K?)G;%E9#D8"D8"E9#E9#E9#E9#E9#E8%D7'D6)C5(A3&@2%>0#=/$=/$?1&?1&@2'A3(B4)C5*C5,F5+I7+K8*M9.O<.Q>0R?0Q>/Q>-R?.Q@,SA-TB,WE/ZH2]K5^L6aO9aO9`N8`N8cN9fP;iP>h;8_2/W*'L#!J""D >; 7!5"4 "4 !5 78>!B !G #I!"K!#O#$Q%&R&%Q%$L#I GK!"K!"K!#J "J "I!H#H#E#D"B"@ ?!> > <;99875211/.-- + + -0 00000000/.---..*) ) *+ + ,,/ 0 !3##5%%6'$7(%7(%6'$@1,D50H;5I<6E:4=4-7.'2)"7,&;.(>/,?-+A,+E--K12O77>*+9)*5%&/!!,())),$"0(&/*'/*'0+(3.+51.32.894AC>KPIR\QWcUYfTZgSZfPYaJX\CXX>[U;[Q8[M3WH1QI4OH5NG4MF3NG4OH5RJ7TL9OD2LA/J=,K>-OB1RE4TG6UE6R@6L81C.)=(#;&!=(#=(%=(%=('=(';&%9$#6 "2/-**)('()!*"(!) )!, 2#&8*)=20@5/@8+B<,D=-C:+@4(=/$>-%?.&E4-F70J;6M@:MB>KB=I@;D?9C@;A@;DA:C>:D<9F>;G?4290+4-'/'%+#!("$  !"##!&$'$($*$+$-$.$.%*&)&)&*'*'*'*'*'M>7M>7M?6N@7OA8OA8OA6PB7OA4OA4PB5RD7TG7UH8VI9WJ9[O7]Q7^R8`T:aU;bVdX>eY?eY?eY?eY?eY?eY?eY?eY?g[Ag[Ag[Ah\Bh\Bh\Bi]Ci^Bl]@l]>k\=k\=iZ=gX;eV9cT7_O5\L2XH/UE,RB)N>%H8!B3 ;- 9,#8+"7*!7+8,9-:/A6$B7!D9#F<#I?$LC&MD'ND)RF.SG1TH2SG1QE/NB,K?)I='F:$F:$F:$E9#E9#E9#E9#E8%D7'D6)C5(A3&@2%?1$>0%=/$=/$=/$>0%>0%?1(?1(@2)B1)G5+I5*K7,M9.N:/N;-N;-M<,K:*L;)L;)N=)P?+QB+TD-UE.\J4[I3[I3\J4_J5aL7dN9gN:cH3hM8nR=qR>sR?vUB|\GaMkX{jòɼǵоƸƷĶöŶǹɼ˿£âââŢšɡɞǜǜ˛ʙ˙˙˖͕ԕٕٖږڗۗݗݘߘߘ莿現菾萿딽锽闽ꙿힾힽ鞽顾衾裿磿裼䣼䢻䟻㝺䚹噸旹昺ꕻꔹ풺퐹퐹펹匠ӅqpbZrSK`TN\ROVJJLJJJSSU`_ea^gc]kcXh^P_XFTRH,:E)7D(6D(6E)5F+4C(1C(/D).E*/G,1J/4L25R25X.2a04f8;k=?j<>a56T*+K##C C! A!"?"$<"#9 #5!4 8#9";#<"@#E#H%J $K#L"L"K!"I!!G!F F H I I!I!I!I!H#H#D"C!A!?> ==;87754200/.--+ + + + / 0000000//.---..)*!+",#-".#.!/"1!"2"#5%%8((:+(;,);,);,'F70I;2K>6I?6D:1>5,:1*8/(;0*@3-C41D0/A,+C)*H+/J03='*;(*8%'1!"-+,, , .$#0&%0(&1)'1,)50-841873;>7BG@MUJXcU^l[ap]bqZbpW`jQ^bG\\@]X;]T7[M2XJ0OG0NG4NG4OH5PI6RK8TL9UM:UJ8QF4OB1NA0QD3SF5TG6UE6N<2I5.A,'<'"<'"<'"=(%<'$=('<'&:%$7"!4 20.*)((') *"+#*#*!)!, 1"%8*)=20@70C=/E?/F?/D;,A5)=/$=,$>-%D3,E4-F72J=7K@;F>;F<:D:8@64>42:3-6/)0(&,$") #%   " "!"!$"&#)$+%.&/'+'*'*')&)&)&)&)&M>7N?8N@7N@7OA8OA8PB7PB7N@3OA4PB5QC6SF6UH8VI9VI8[O7]Q7^R8`T:aU;bVdX>dX>dX>dX>dX>dX>dX>dX>dX>fZ@g[Ag[Ah\Bi]Ci]Cj^Dj_Cm^Am^?m^?m^?k\=iZ;fW:dU8bR8^N4[K2XH/UE,P@'I9 C4;/#8.%7-#6,"6, 7.8/80<4!>6@8!C<"F?#IB%KD'NE(RF.SG1UI3VJ4TH2QE/NB,L@*K?)J>(H<&G;%E9#C7!A5A4!A4$A3&@2%?1$>0%>0%=/$=/$<.%<.%<.%=/&=.'=.'>/(@/'C0)E1(G3*I5*I7+I7)H6(H7'G6&G8%H9&J;&K<'J>(M>'M>'SB.TB.UC-VD.ZE0\G2`J3cJ4aF1cH3gK5iM7mN9pQK/>I-> >"!=#$<"#: !77 <#<"<$?"B#D#G%J$I!IFDBB C!D" FGGGGH G"G"C!C!@ ?> =<:65443100/.- - + + *"+ / ///////.-,,,-./ +"+$,#-$/$0%1!$1!$3#$4$%7'':+(=.+?0-?0+@1,G90I;0J=4F<2C9/?7,>7-A8/?4.E82H96H45A+-@&)B%*D).<&);')9%'4!#/,/ 1##.""/%$1'&0(&1)'4,*91/<74=>8?B;EJCNXM\hZfubkzel{dky_fsWcjKabC`[=^U6\N1XJ/NF/MH2PJ4SM7UO9VP:XP;YQ<]R>[P+$C0*C2+C4/G:4I>:I@;D<9>95A>9@?:BAGD?GD?FC>EB=@;7A<8D<9E=:D<9B:7@64>42;4.50*/*'+&#*!$%   !!$#)&,(0*/),(+ (*')&(%(%'$'$M?6N@7N@5OA6OA6PB7PB7PB5N@3OA4PB5QC6SF6TG7XH9VI8[O9]Q7^R:`T:aU;bVdX>dX>dX>fX>dX>dX>dX>dX>dX>fZ@g\@g[Ah]Ai^Bj_Cj_Ck`Dl^Am`@n_Bm`@l]@i[>gX;dV9cS9_Q6\L3XJ0WG.PB(J:!D5 >0#6B;!E>"HA$KD'LE(RF,SG/VJ2WK3VJ2SG/PD,MA)OC-NB,K?)H<&D8"A5>2=0>1!>0#>0#=/"=/$<.#<.#;-";-$<.%<.%<.%<-&<-&=.'=.'?.&A.'C1'D2(D4'D4'D4'C3$D4%E5&G7'I9)J;(H;(I:'I:%O<+O=)R=*S>)VA.ZD/]G2`G1eJ5cH3cG2dH2iJ5lM8nO:oP;xUBxWD{\JcQp_tƿ³ĶǸȷȸŷŸçħĦƤȤˣ͞ɝʛ̙˙̘˖˖͖Օזؖڗۗݘޘߙ፿⍿莿玿玿瑽ꑽ꒾듿ꔽ땾옾헽얺ꓷ甶曻룷鬾ꩺ觸䦷⤵ࣶࣺ㡺⠹❹ᛸ☷㖷䕷喸蔸蓸쐸됸쎷뎷팷쌷ꍸ델델뎹썻퍻퍻팺܁qyYVqXQcRN\NMUHINHIMPQU[\ajgphbneZj^P_XFTQ=HL5?J09I/0-@2/A4.A4,F8/F:.G;/D:.@8-?9-A=2EA6?80E:4J<9I77A+.<#'?"'A$):$':&(9%'5!#0-0 !3%%/##/%$0(&0(%/*&2-)940;:5@A;?D=EMBPZO_k]jxgqksjr~fox]hlQccGb]@]V9YP3UK0KG.LJ3QL6UP:XS=ZT)$<'"=(#=(#; $!<'&;&%8#"6! 3100)'('()+",#,#+")+/!!6((=/.?4.GA3HB2IB2F=.B4'?.$=*#=*#B/)B/)D3,G83H=7H?8B;5<71@=8@?:DA?:6@;7C;8C;8C;8A96?74=52<4180-2*(.&$*!"& ! !  $!)$,'/)0*- ),!),()&)%'$'#%"K?1K?1L@2MA3OC5PD6RD7SF6RB3QA2P@1P@1RB3UE6[I;\L<]Q;^R:^R<_S;`T<`TdY=cXgY?hZ@i[Aj\Aj\Aj_Cj_Ai`Ci`Ai`Ai`Ai`Ai`Ak`Bk`Bm_Dk`Bk]Bg\@gY>dY=`R7]R6^P5YN2VH-NC'J.>-#?.$@/%>0%>0#>1!=0C6%B7#C8"E;"G=$I?$JC'KD(TI-UJ.VK/VK/VJ0UI/TH.SG-NB*L@(I=%F:"C7!B6 A5@3 >1 >1!>1!=0 =/"<.!<.!;- ;-";-";-$;-$;-$;-$;,%;,%:-$;/#>0%@2'@2'@2'>0%@0#C3&D4'E5(G7*H8+J:-L:.M;-Q;-P;*P9)P9'R;+X>-\B1`E2dI6cH5cF4cG2fG3iJ6kL8mN:oL9rO(4@*6D/8F/7H/5J03N13R44V75[97b95n72t72s95k62^.,Q(&K$%G%&@""= "9"7 8 77978899<<==>>??@ ? @ DFFFDDC B A!> <987651 .!,+*+++++,-./ 0!2"////////3 2/---..-+ + -./11.4%":,)>0-<1-=2.?61C82B6*>2$=6&D>.EB3B@1BC5HH5C?6F=8D63?+,;"%:!7!6!6%5 %3#0/ 1#"2'%0(%0+'0-(/,%++#,-%12*58/CHAFMEISHR^Rbparovpr{huzfop^ifSc^J^XBXR:PL3IG0BA,GI3RR:WW?XV=XW;[W:]X;e^Bh^Ci]EhYDbS@[J:R@2N:/D0'F/)F.*E-)C+'A)%@(&>&$<$$;##:""9!!7!42/(%'%&')*- - - / 3#$8()=-.?1.H>5LB6MC7J>2B4)>-%@-&C0)A.'C0)D3+D5.D7/B8/B8/A81B=9C?HC@IDAHC@GB?FA>C>;C>;B=:@;8>96=85<74=53;10;//8,,3''-!#(!%#"#$!$"&"'!)#.(2",-%+%,$)#)!& '$I@/JA0L@0NB2OC3PD4RE5SF6RB3QA2P@1P@1SA3VD6ZH:\L<_P=]Q;^R<^R<_S;`TdX>dY=cXhX?hZ@i[Aj\Ak]Bi^@i^@h_@h_@h_>h_>f`>f`>k`Dk`DlaEk`Dj_Ch]Af[?eZ>_T8_T8]R6YN2TI-NC'H=!D8 @. @.$A/%A/#@0#@0!@0!@0 C6#C6#D9#E:$H>%J@'JC)KD(TI-UJ,UJ,VK-VK/UJ.TH.SG-NB(L@&I=%F:"C7!B6 A5@3 >1 >1!=0 =0 <.!<.!;- ;- ;-";-";-$;-$;-$;-$;,%:-$9,#9/#<0$>2&?3'>2&>0%=/$C2(D3)E4*F5+I7-J8.L:0M9.Q;.Q:,P9)P9)T:+X>/]B1`E4cH5cH5cF4cF4fG3hI5jK7lM9sR?xUB}YI_OgYsdrzò˿ǷȶƲIJŵǼſ°İʬ̧ϡ͝МҙҗҖЕЕЕИ֙֗֗֗ؗږܖܗ፿县玿玿珿璿钾둽ꎽ鎽鎿뎿ꎽ鐼鐻蒻镻꘼웽쟻를ﯹ꽸¹ĺ뼴嶳ಳ߯㥺堻杺䜹㘷㘷㘹旹畷瓷瓹ꓸ쑹폷덶ꌶ荵捶䌵㌵㋵卷獹ꎺ닷茸鋹댺쌻ꘞ҃plTTlRTcRTaSUaNQZKNWTT```lgesf_o`XgZN\TDNL;AH66F24C.7D.:D.;B,9>*6=)5@,7D/8F/7H/5L/3O11U32Y62^85e82s:1x90u91l5._.)S'$J$#F$%?!#= $9#7!7788778899; ; <= > > ?!?!@"B E!GGEEDC!C!> = : 97654.!,"+!* ))*+,,--./01/1111111421//01/-+ + . / 0!2 2 / 3$!9+(<1-=4/=60>71>7/C9/?6'?9+C@1DB3>@2?C4DH:<>3@=4D=7B73@..<&(=#&FNCJTIR^Pbpasowqu|lvwgro^jdTb[I[TATO;KJ5DF0AE.GK4OS:TW./@21H;3KA7OB9K>5F5-@/'A.'C0)C0)D1*E4,D6-E7.D7.B8.@7.C;8C>;FA>HC@IDAHC@GB?FA>D?;B=:A<9?:7>96<74>64<00<..8**2&&-!#(%"  "## !$ ("*"-%0!(-',&+%*$)#("'!& JA0KB1MA1NB2OC3PD4RE5RE5RB3RB3QA2QA2SA3VD6YG9ZJ:]N;\P:\P:]Q;_S;`TdX>cXh_>f`>f`>k`DlaElaElaEk`Di^Bg\@f[?aV:`U9^S7[P4UJ.NC'H=!D8 B1!B0$B0$B0$A1$A1"A1"A1!C6#C6#D9#F;%H>%J@'JC)KD(SH,TI+UJ.VK/VK/UJ.TH.SG-NB*L@(I=%F:"C7!B6 A5@3 =0=0 /[A0^D3bG6bG6cF4cF4dH3fJ5iJ6jK7nM*5A+7C.7G08I04M04P22U32Z73_96e82v=4x<2t91j3.],(R&%I#"C#$=!;"7!6 77887799: : ; <!<<<= ?!?!?!B E!GEEE!D!C!C!=<986531.!,"+!)))**--..............//.../00.. . 0 0 3!!3!!4""1!!4$$9+*=20@85@;7=84;60B90@8+A;/CA4CD6AC6BF8FI>@B7AA9C>:B75?/0<(*<#';"(5$4&4$1"-. 2$#4)'6-(4-'0+%-*!,) --!33'79.AG=FNCKUJR^Pao`q~mwqw~nvwgro^jdTa\IYT@QO:KK3EG/EK1IO5OU;TX=VY)&=(%;&%:%$8#"6! 4 20/)'&&&')*)*+.2"#8()>./@21F93I?6OB:M@8J92D3,C0*D1+E2,F3-F5.E6/E6/C6.A7.?6/B:7A<9D?E@=E@=E@=C>;B=:@;8?:7>96?75;10:..6**2&&-!#($!!"##$$$!&")%*&*&)&)&(%'$&#%"$!$!KB1LC2NB2OC3PD4PD4RE5RE5SC4RB3QA2RB3TB4VD6XF8YI9[L9ZN8[O9\P:^R<_S;`TgW@hX?iY@i[Aj\Bk]Bk]Bh]?h]?g^?g^?g^=g^=e_=e_=k`BlaEmbFmbFlaEj_Ci^Bh]AcX"E9F5%E3'D2&C1#B2#B2"B2"C3#B5"D7$E:$H='J@'KA(JC)JC'RG+RG)TI-UJ.UJ.UJ.TH.SG-NB*L@(I=%F:"C7!B6 A5@3 /[A2]C2`E4`E4bE3cF4dH3eI4hI5iJ6iH7kJ9mL;nM ?!?!AE!EEDD!C!C!A!;9865320- +!* )(()*. . ///.-,........--../010.//2 3!!4""5##5##6&&6('9.,@64E@B?:>;4B;3B;1B>3DB6DF;EH=GJAILCGHBFE@E@=A76<..8%)5$4#0"0#0!/ .1!"6('9.,:/+7.'3,$0)/+ 2.#73(88,AD9FNALWIR_N_l[n{ivpxmyzhut`mjWcaL[YDTT;FA>GB?GB?FA>E@=FA>E@=D?;A<9?:7>96@86?54;108,,3)(/%&+"#'""!#%'$$" %#*&)%&#('(''&'&&%%$%$%$MD3MD3MD3NE4PD4PD4QE5QE5QD4PC3RB3SC4TD5UE6WE7WG7YJ7XK8YL9[O9]Q;_S=`TbVh_>f`>f`>laClaCmbDncEmbDlaCk`Bj_AeZ(KA(LB)JC)JC'PE)QF*SH,TI-UI/UI/TH0TH0NB*L@(I='F:$C6#B5"A4!@3 ;.;.:-:-9+9+8*8*8*8*8*!8*!8*!8*!8)"7*!7*!5+7+8, 8, 9-!;-";-"?.$?.$@/%B1'E3)F4*G5+I5*M7*M7)N8*P:,S<.U>.Z@1[A2]C2^D3`E2aF3cF4dG5eH6eH6iI:kK7t93i2-^+'S&#J""C!=!9 6 4 3557877789: : : 99;<<= > AC DD C C B B"@":875421., *!('''((,- ./ /-,,----------./001 00013 4 !6"#7#$6$$9)):,+<20D<9IFAKJEHICDE?IF?JG@JG@GG?FGAEHAEHABG@EGBCD?@<;<347+-4#)2$. *)+,.4$%;-,B43@2/;0*7,&5+"6,#9/%=3)=7+AC6HN@OWHQ^L[hVivbskwj{~izydrq\iiQaaI[^CX^BW`AWa?T_=T^/N<2M92I4/E0+A,'?*%=(%=(%<'&:%$7"!42110,)('''()((),0 !6&';+,=/.A30B71I<6J=7J84E3/C0,A.*E2.E2.E3/D50C4/A4.>3-<3.>63@86C;9G?=H@>IA?H@>G?=H@>G?=F>649/.5-+3*+-'') %#!!$&(%$" &&(&'%$"''')')&(&(%'%'%'NE4NE4NE4NE4PD4PD4PD4PD4QD4QD4SC4TD5TD5UE6VD6VF7VI8VI6XK8ZM:\P:^R<_S=`ThXAhXAiY@jZAj\Bk]Cl^Cm_Dj_Aj_Ai`Ai`Ai`?i`?ga?ga?laCmbDncEncEncEncElaClaCf[=f[=eZ0Y?0Z@1\B3]C2_D3aF3cF4cF4cF4cF4cC4eE6hH9iI:kI=nL@rREvVIuWLz^Rh]ym̺Ⱥ̻ν̼ǻƥŢɟ̜ΚИЗҕӓԓ֔וؖۖݖߗ叿㏿㏿㏿叿叿珿珿瑾甽镻蔺瑺摺摼璽蒿鑼瑺擹擸喸昸盺霻険皻桽嫾̻¹ַ٤ۜݙݘܕܔ۔ޓ䓸䓹擹摺菷荷猶掶鎶鍵荵茵鍶ꎹ쏺ߎ{kn_axY\oVYjX[jY]iY]iacpikzonni}lewh]m`R_XIPP@CM:>H3:E09C-9B,8C-9D/8D-7E+4K07M05P03U11[33_62d93i:4r;6m3/a,(V%!M! E?: 532125785666899989;;<= > > AAA@@>> = 76532/.-+) ('&&'(*,./ 0.,+,--------./000/./0124 !5!"6"#6$$:**<.->42C>:JGBLMGMPIMPIVUQWVRTSOKLGFHEDFC?D@:?;<>=9996235,/3&-2#*2'/$&')*.5%&>0/E74B5/@1*=.'<.%>0'@2'A3(>4(DB5JN?QXHQ]IWcOdpZpydt|e|iz|dvv^mpUgjOdiKclMepNbnJ^jDXd>V`;Xb=]e>`f@bfAffDifEjeHhaEb[A[P:TG4NA0R@6P<5K61E0+A,'>)$=(%=(%=(';&%7"!41111-*)('(())))+/ 4$%8():,+?1.@5/D71D71E3/B0,?,(=*&B/+B/+C1-B3.B3.@3-=2,=2.=31>64B:8E=;H@>H@>G?=G?=G?=G?=E=;D<:B:8A97@86?75D<:?7580.3.+2,,/)))#'"!"&*&# "%&''&$%#''''''''''''''''NG5NG5NG5NG5OF5NE4NE4NE4PD4PD4RE5RE5SF6SF6UE6UE6TG6UH7WJ7YL9[N;^R<_S=`T>aU=aU=aU=bVdX>dX>hXAiYBjZAk[Bk]Cl^Dm_Dm_DlaClaCkbCkbCkbAkbAicAicAlaCmbDncEodFodFodFncEmbDg\>g\>g\>dY;aV8[P2WL.SH,N=)L;)I8(F5#C4!D5"F7$G8%B6 D8"G<&K@*MB,NC-KC,JC)NB(OC)QE+SG-TH0UI1TH0TH0NB,L@*I<)F9&C6#B5"A4#@3"9,9,8+8+7)7)6(6(6(6(6(6(6(6(6' 5( 6) 3)4'3&4'6) 8*!:,#<+#<+#>-%?.&B/(C0)D1*E3)I5*J7)N8+P:-R<.T>0V?1W@0Z@1\B1^D3`F5bG6bG6aF3aF3]@0_B4bE7cF8eE8hH;lL?pPCtTIuWL{]RdYqexĽñȷȺúġȝ˚͗ϖєғӓՔٕؔۗݗ摿㑿㑿㑾呾呾瑾瑾璽画擺咹䏹㏹㏺䐻呼擽璼攻改嗹智眻靼꘹曺袺櫽нøָڣڜݙݗ۔۔ۓݒߕ䓸䓹擹摺菸捷猶搸돷뎶ꎶꎷ폸훭ߐsxcg]`sU[kW]kY_m[aoehwopsrroqi~mbseYg]MWUDJR?CI4;F/9B-6B-6E.8F/9G-8E+4N08O05S04X12\31b63h84j94l73f/,Y&#M F@;732101477422366787799<<<> >>>>><;96530/-,*+) (&&&''(*-0!00.,++++++++-. /!0"0". -+-/024!6 #6"$6#%6&'8,,<42@<9ED@KLGNSMSXR[[Y]]]YYYNPOHJIEIHAED;?>679224-+.,&*-"*- ),%) ( &)),2$$=--E63E61D3,B1*C2*F4*G5)E3'@2%EB3LO>SWFRZES_I^jRku]qyayey}bvy^psVjoQjqPlwUo}YkzQdsJ[jAXd7K82E2,@-'=*$<)%<)%=)(:&%6"!20011.+*(((()***+-2"#6&'7)(?1.=2.?1.?1.@.,>,*<(':&%>*)?+*@.,?0-@1.?1.=2.<1-<20>43B87F<;H>=I?>H>=H>=G=64C;9:523.+1,)1++-)(&!%  $(&%   "!&%&%&&&'%'&'&'&('('('('('OH6OH6NG5NG5OF5NE4NE4NE4PD4PD4RE5SF6SF6SF6TD5TD5SF5TG6VI6XK8[N;]P=_S=`T>`T>aU=aU=bV>cW=dX>dX>eY?iYBiYBjZAk[Bk]Cl^Dm_Dm_DmbDmbDlcDlcDlcBlcBjdBjdBlaCmbDncEodFpeGodFncEncEg\>h]?h]?f[=cX:^S5ZO1WL0P@)M<(I8&F5!D5"D5 F7$G8#A5D8"H='LA+NC-NC-KC,JC)MA)OC)QE+SG-TH0UI1UI1TH0NB,L@*I<)F9&C6#B5"A4#@3"9,8+8+7*7)6(6(6(6(6(6(6(6(6(6' 5( 5(3)3&3&3&5(8*!9+";*"<+#=,$?.&A.'C0)D1*E3)H4)J7)N8+P:-R0V?1V?1Y?0[A2]C4`F5bG6bG6aF3`E4eH:gJbhBciEijHijJlhKjfIf_E]V,,>/,?//?1.=20=20;10=32A76E;:H>=H>=H>=G=cW?dX>eY?gW@hXAiY@k[Bk]Cm_En`EoaFodFodFneFofGofEpgFnhFnhFncCncCncCodDodDpeEpeEpeElaAk`@i^>j_?k`@j_?g\(K@*MB,NC-ME.MF,L@(L@&MA)NB*OC+PD,QE/RF0L?,J=*F9&C6#@3">1 =0+%?,&?,&?,%H4+J6+M9.P=/S=0T>1S=/S=/V?1W@0[A2]C4^D3^D3_D3_D3dH:dHH19G08G08G08H.7I+3Q07R/3W.2[12c55h73h52f30[('W%&N "E>7522!1#2#4#5!5!8!7101111339764578<==<:9654/.//.*(&(%$""#$$()+,--,,0#,('),- - .!- - ,+***/./0/1 3#4!%5%(2&(2)*510=<:GIFQVRX\[abf]^cXY^XY]WZ_SWZKLQCDI54:+*0(#*(!))'$!#%!& &!' (+!2$$;++A2-E4-F5-I7-N:/T>1T>0P:,I8(E9)LG4VUAZ^G[`I]fKdmRlrVrwYqtUloPflJdkIhtNrZzay]nPbrC\l?alBepFhnHflHabB_`Aa]@a]Bc[D_W@[P:WJ7SB8N=5I81E4-C2+A0)=+':($>,*;)'6$"1../0****))))++,-./ 0 !0"":,,9.,;--:,+<)+:((9%'8$%8$&8$%9&(<,,A12A32;//7++7-,;10A76F<;I?>J@?H>=F<;@65A76A76@65?54=32;1091/3+),'$&!"  "!!!!!!" $"$!%&(* !,"#.$%/%&0&'OJ7OJ7PI7QJ8QJ8RK9SJ9SJ9UI9TH8TH8SG7SF6SF6RE5RE5UH7UH7VI8WJ9YL;ZM:[N;[N;\P:]Q;^R<`TeY?gW@hXAiY@k[Bk]Cm_En`EoaFodFodFneFofGofEpgFnhFnhFodDodDodDodDpeEpeEpeEpeEncClaAj_?k`@laAk`@h]=eZ<\L3WG.QA*M=&K<%K<%I:#H9"H<&I='J?)LA+LA+MB,JB+JB+L@(L@&MA)NB*NB*OC+PD.PD.K>+I<)F9&B5"?2!=01S=0S=/V?1W@2[A2]C4^D5^D3_D3_C5cG;cG;cG;dHiL>mM@qOCsQExRG}WL^SdXm`zlïĵ¸ĨŠƙǗɕ˙љԘӘ՗֘ٚۛޛ吾␾␽䐽䐽搽搽摼擺㓺㓺㑻㑻㐼㐼㐼㒼䑻㒹⓸╸◸㙸䚹痷꘶Ꜷ磵家乸ƹйܿϺŸ㻶߮۞ۘۖۖ۔ۓܒޑ⑶㑷摷萸鐸鐺쐺쒹읯ᐟʃt{im_dz_dxafych{insuvv{y|wypvk|rfriYc]LTT?FP9AK4^X@_W@]U>ZO9WJ9SB8N=5I81E4-D3,B1*?-)<*&=+):(&7%#3!0///****))))++,-./ 0 !/!!8**6**9++9++;(*9&(9%'8$&7#%7#%8%':*+?/0?11:..6**5+*9/.>43C98F<;G=43?54@65@65>43<219/.7-,0(&*%"$! "%%# !"! !" $!%"% ))+ ," 0%#2(&6+)6,*MJ7MJ7OJ7PK8PK8QL9RK9RK9RI8RI8RI8QH7SG7SG7RF6RF6UH8VI9WJ:WJ9YL;YL;ZM:[N;[N;\P:]Q;_S=`TcW?dX@gW@hXAiY@k[Bk]Cm_En`EoaFodFodFneFofGofEpgFnhFnhFqgDqgDqgDqgDqgDpfCpfCpfCpfCndAmc@mc@oeBndAj`=g\&K?'K@*LA+LA-K@,H@+G?(L@(L@(L@(MA)MA+MA+NA.NA.I<)G:'D7&A4#>1!0T>1T>1U?1V@2YB4[D4^D5^D5^D5]C4aE:bF;cGoOBsQEwQDySF~VJZNYNcXrixñŦÝÛƛ˜МӚҙӚԛכڛۜܚޚޙߗ㓿䓿䑽⑽⑽䑽䑼摼摼摼攻䔻䔻䒼䒼䑽䑽䐽䑽䒼䓺㓸╸▷☷㙸旷虷띷袸骸屸亷òͷѻ̸Ķ绵岳ᨰޝݙݗޗޔݓޒᓵ㑵呷葶ꐸ됸됹퐹퓺ꖦيypvhnhohognkpsuvv|z~x|t|pym{qalfU]YDKT=CM6>I2:K1:L2;N3:Q2:Q.5V/4[13d66l98m75l20e-,T#&O"'H"@ : 7!4#2%0$/$0$1"3"4"7 610000011766556799887632/-,+**'&%%$#""#$%* * , -!. --- .!*&&(+ + *-"-",!,!+ + **+,,,-.0 0!1!$0!$.$%0**732>>;B2-4*#+$$'%'$$$%""%&)/$"9+*?2,=.'@/%C3&K9+TC3[H7]K7]K7SB0UF3WL8[U=a_FhhLmpStuV{|\xyWtuSmqLkqKmxNrVw[axUjwIfqFhsIltMjpNgjK]\@[W>XR:XP;XP;ZO;YL9WJ9RA7N=5I81F5.E4-D3,A/+?-)<*(:(&8&$5#!3!!0/.++**))((**+,-./ . 4%(3')6'*6'*9&*8%)8#(7"'5 %6!&6#'8(+;+.;,/7+-4(*4((7++<00A55D88D88C77B66<00=11?33?33>22:..6**2(',$"( #$(((!!" !""!#!%!&"'!)#'/! -"0"0%!6(%9.*?1.@51MJ7MJ7OJ7PK8PK8QL9RK9RK9RI8RI8RI8RI8TH8SG7SG7SG7VI9VI9WJ:XK;XK:YL;ZMcW?gW@hXAiY@k[Bk]Cm_En`EoaFodFodFneFofGofEpgFnhFnhFsiFsiFsiFrhErhErhEqgDqgDsiFqgDpfCqgDrhEqgDmc@j_?gX;bR8[K1UE+QC)N@&J;$G8!H<$I=%J?)K@*K@,K@,H@+H@+L@*L@(L@(K?'K?)K?)K>+K>+G:'E8%B5$?2!=0 ;.;.;.8+8+8+7*7)6(6(6(6(6(6(6(6(6(6' 5( 5("2'!3& 2%2%3& 5&!6'"7%!8&":($<*&A.*D1-G40I60I6/J8.K9-M;/P<1Q=2T>1T>1T>1U?1XA3ZC5]C4]C4]C4]C6_C8`C;bF;cH=eJ?gLAiOBjPCdJ;hL>nNApO@rN@tNAyQE~THXO]Vf_qizs»Ʊť¡àȢѢՠԠ՟ԝ֝؞ۜڜۛښܙݙݘܖޖ⓿⓿Ⓘ㒾㐼ᐼᐼ㐼㐻吻吻呻咼䒼䒼䑽䑽䐽䐽䐽䑾命䑻㒹⓸╸◸㗸営噷靹頻ꥺ稹家䱴ᷱ߾¸뺶贶篵穷杴☵ᗴᓲᐲ⓵呵瑶ꑶ됸쐷ፙ|w}qwqwntjqkppuvx}z{~v~r|oserjYa\GNV?EN7?I2:J09M29Q3;R39R/5X/5`36h88p::n74k0,b*)Q $J&E#?":#6$3&2&/$/$0$1$3"4"6 61000001166666677877541/-,*)(''&#$##"#$%&+!,"-!.". . -, *)&&(**),!,!,!,!+ + + + ***,-....!-!+!"-$%1-,764>>aU?bV@gW@hXAiY@k[Bk]Cm_En`EoaFodFodFneFofGofEpgFnhFnhFtjGtjGtjGtjGtjGtjGtjGtjGvlIukHsiFtjGukHtjGqgDmbBj[>eV9^O2YJ-TF+PB'J<"F8E9!F:"G<&J?)K@,LA-JB-JB-L@*L@*K?)J>(I<)H;(H;(G:'D7&C6%@3#=0 ;.:-:,:,8+8+8+7*7)6(6(6(6(6(6(6(6(6(6' 5( 4'!1& 2%1$1$2%4% 5&!7%!8&"9'#;)%@-)D1-H51K82I80I8.K9/L:0N<0P>2R>3S@2T>1U?2WA3XB4[D6[D6[D4\B5^B7_B:aDeJ?eMAgPBhQCfO?iO@kN>lL=mI;pK;uN?{QEVOYS^Xd]kduo}ǽʵȯǪ˨Ѧզզפפأעٞמٜٛٛٙڙژܗ┿ᔿᓾᓾᒼⒼ⑻ᑻᑻ㑻㑻呻呻呻哽咾㒾㑿㑿㏿㏿㏿䑿㐼ᐺߒߕ╶㘷固蜻矼柺塶ᥳ୸氶泶鲵讴樲㨶穻띵㛶噵䘴㕴㓱㒲㐱䓴鑴ꑶ둶퐷博΂~xv~qyjrioosyz~~|w|s{nqcpgWa]HOW@FN7=I28K28M29Q3;S29U07Z15b47j89p87n42h+(_%$M"G&B$=#9#5$2&1(.%.%/#0#2!3!530...001133667766655320.,-*('&$$$$####%&',"-#.".". -,+) ' $%' (!' &)")")")"*#*#*#*!()),,,,,,!+!)!+ $,&(2./845:8;@?GCALGEPLITLIRGAK=6>7-61'/)&$ & ( #"# "$(.$"6-(>4+C9/E9+G;+OB1XL6`TaU?gW@hXAiY@k[Bk]Cm_En`EoaFodFodFneFofGofEpgFnhFnhFtjGtjGtjGukHvlIvlIwmJwmJyoLxnKvlIwmJxnKwmJtjGpfCm^?iZ=bS6]N1YK0TF+N@&I;!C7E9!F;%I>(K@,LA-KC.KC.L@*K?)J>(I='G:'F9&E8%D7$B5$@3">1!+'C0,H51J71I80I8.K9/L:0M;/O=1S?4T@5S=0T>1V@2XB4ZC5ZC5ZC3\B5]@8^A9`C;aF=aI=cM@eOAeOAiRBjSClQ@jM=jI8mI9rM=vNBwLE{NIRMVP\Vd^pjysñʺʴ˪ΦҩԨ֩קئפآ֟ןם؝ٚ؜ؙږߔᓾᑻᐺ␺␺䐺䐺䐺Ⓘ呿㑿㏿㏿䐾⏻ߑߒߕߗ♼䙼䘻㙹⚵ࣺ椶椴妴壱➮ᠲ䣹ꟷ眷暶晵啳唲摱䐱擴ꑴꑶ푵돜Ӊ}u}kskqou{|~w}tzoqcpfV`_JQZCIR;AO6&:&5&1'/&,%,%.%/#0!2!530...00112367876554410-,++)'%##$#####$&(),"-#-!."-,**) ' %&(!)"(!&(!(!)")"*#*#+$+"( )* ,!,!- ,++ + * )!*!$,&(1+-3.274=86A<9D@:F?9C;3>7-63(03(0+%'('#!! #%) /%#8/*>5,H@5I@1LC2SK6\T=b[Af\Ai[AqXDnQ?hO9dR:i[@neFsjKsmKtnJrlHplFmnDkqEjsDftCdrAkwEpyJs|Ot{QquRjkLa_F\WCXQ?TK1N>1N<0M;/K:0F8/C4-C4-E6/F70F72D50=.+<-*9*'7(%4$$1!!0 /--,*)'&&''()*+,++!)!,"-#/"/". -. 0"0#.#-",", $-!%6'*7)):,,<..>00>00>00>00=//<..;--9++6((3%%1##/!!-!!*(((%!"$"&'$'!&#!   !% )!)* ,!0!2#4$6!&6"$7#$8&&<()@..E12I77M9:M;;MJ7MJ7MJ7NK8PK8QL9QL9QL9PI7QJ8RI8SJ9TK:TK:WK;WK;XJ=XJ=XJ=XJ=XK;XK;XK:XK:WJ9XK:YL9[N;\P:^R<_S=`T>gW@hXAiY@k[Bk]Cm_En`EoaFodFodFneFofGofEpgFnhFnhFrhEsiEtjFvlHwmIyoKzpL{qM|rNzpLyoKyoKzpLzpLvlHsiFrcDn_@hY:dU6_Q4ZL/TF+OA'E9!F:"G<&I>(J?+K@,IA,H@+L@*K?)J>(H<&F9&D7$C6%B5$@3"?2!=0 :-9+8*8*9+8+8+8+7*7)6(6(6(6(6(6(6(6(6(6' 5( 3& 0%1$1$1$1$3$4% 8&"7%!7%!8&"=*&A.*F3/I60J91J9/I8.J9/M;1O=3S?4T@5Q>0R?1V@2XB4ZC5ZC5ZC5[A4]@8]@:_B:`E<`H>aK>bL>aN?iTClUEnTCmRAmNoG?tICyLG|OJRLXR_Zfbsp²ħȣ̨ϧҨӧզ֥ףԢ֢؟ןٝ؞ؚږޓߒߑߑߐ␺␺䐺䐺䐺⓿䐾⏻ߑߒߔݔܕܕޓߒ⑻ᔹ㙺噵䝵塷螴噯㢺Ꞹ靷蛷陵畳甲摰搱瓴ꑴ쑵ޑynvntsy}~zw}rtfujZdcNU^HKZAGV=CU:AW9AV7=X5;^6>`6:f58i65l21g,(a!UL#D'B(=&8&2%/%-%+%+$-$."/ 1 420...00002367766544210-+*+)&$"""##!!!#$&( )!*"+!+!*('(*!(!' (!*#+$)"&(!(!(!)"*#+$+$*"'!( )!,"-",!,++ *)'(!*!$-$'-'+/,5/-81.92,82*52(30$.0#,6)2.&( )(#!" !#%) !/'$81+?8.JD6LE3QJ7YS=a[Cf`FhaEl^Cx]HwXDpU@jV>jZ@m_BodFqhGnfBjd@hd>ig>ilAfn?am=\j7dnMJ7MJ7MJ7NK8NK8QL9QL9QL9PI7QJ8RI8SJ9TK:UL;UL;XLYK>XJ=XK;XK;XK;WJ9WJ9WJ9XK8YL9ZM:\P:^R(J?+I>*H=)G<(K@,K>+J=*G:'E8%C6%A4#A4#?2!>1 3TA3WA4XB5YC6XB5YA7\A:\A:[B;]D=^G?]I>^J?_L>fSEkUGoXJqWJmQCjM?hK;jJ=nLCsNFwPIxQJzRJ{SKVP[V`\jg{zƩɫ̬ͫϨЧҧԥԤ֣֡סנؘ֝ڕ۔ۓܓސݐސ吾⏻ޏߎܑݒݓۓےݏݏᐼ㒼斻疸固飿횶曷碾鞸雷陵畳瓲葰珰摴쐵쑵薡ϔ}ryrwx|}~}yuwj{n^kfQXdKO^EI\AF[AD\=BZ:=[79b9=d7:g56g43g11a)(Z NI%D!(@(=&8&4%/$-#-$-$."."/ 1 220.0000001368865322/.,+((*(&"!!"##!#!%%)( +!)!, * +(('*!) (!)"+$,%)"' ' (!(!)"*#+$+$+%(")!+#.$.#-"- ++ *((( *"+ $,#(-(.+(/,'.+$,+!*,!)/)0!(:)11 (*!*'"!!"& ' , "1'%:1,A81KC8MG9RLo`?qdAi_;f^7d_7ed8fi6M:3K81H4-D1*F5-A3*?1(@1*D5.F70F72E61A2/>/,9*'5""1!!2""3#$--,*)'%%'&'()***+ + + + ))''+. /!- (''+#/"0 !1!"3#$4$%5%&6&'6&'B23>009++5''2$$1##1##1##5%%3##2""1#"1##/ #+!%!$!(&(($$"  %!)!(&'(&'+.4 "7#%:$&<&(@'+D+/K26O9AS=@RYP?UL;XL&F:"F:$F:$E9#C8$E:(E:(D9'B7%A6$@4$?3#>2"<0 ;/;/:.:.9-9-9-6(6(6(6(6(6(6(6(4&4&4&4&4&4&4&3&4'2(2(1'1'0&0&2%2%3&4'5( 7*"8+#9,$;,%C2+D1*E2,F3,H5/K81N;4O<5Q>7Q>7Q>7S?8S?8T@9T@9T@9UA:UA:VB;XD=ZF?ZG@\IB\IB_LEdPGjVMnZQqZRnWOjSKhPFiQEjPCiOBiMAiMBkODmPHnQIz]W}`\ebon{|ŮɭͮҬѧӥҢҢҡԟӛҗҔґѐԑڕ䎶ڏۑܔܖޘݚޘ䑿ᑿᏽߐߏސݏݏܐېېېݏߐ㏹㒸喼闼闻뙻뙻뙻뙻뚺띹띷ꚵ꘳蕳铲蒳鑴ꓸ͍yzvwz{~zymo^pmS^nQUkNRgKJeGEcDAeB>g@;h;8k98k87f24^,-S%'K!D!C '@(>';%9#5#3"2!0!0!/ .-,--112222226 6 5544330.-,+*)(*'%"!!!!""$%'(*).#-#/$.$.#*(&#%(+"-$-$,#+"%&(")#*$)#)#("+#+!+!,!,!,!,!,!&''('((&( )##-$%.$%, ","1$3 &1&0%,#)#$ !%&*- 5"$:*+@21D63J?9MD=OK@TRFVXJ[_PaeThiWqdSzeR~cP|]H|^D~cEye@pa8ia3jc5lh;ol?lmCch?V_4NV/VZ9VW8TT8VT;ZU?[TAXO>VJ0%>0%?1(A3*C5,E6/G83@1.>/,:**6&&2"#0 !.-+)*(('**)('(((')0 0-*'(),+,,,++, -!-2"5 %6!&4$5 %7$(:'+<)-9),8(+6&)4$'2"%1!$0 !8&"8' 9'#;)%=+):**5%&1!$.#)!%"# %$%$&#& *"-#0%1$/!,(,!&!#,6$$='*B),I/0L23P67S;;S>=T?>S?>R>=HG3IH4IH4JI5KJ6KJ6MJ7MJ7QL9QL9RK9RK9SL:UNXQ?VMZO=[P>\O>\O>[L9\M:\M8]N9_N:_N:`P9_P;bS@aTCbUDdWFgZGi\Ii^Hj_IiaJiaJhbHicIidGjeHjeHkdGseHufGxiJzkL{lM{lM{lMzkL}nO|mN{lMzkLyjKzkLzkLzmMwiLqfHlaEi^Bf[?aV:[O5VJ0UI1PD,K?'H<$H<&G;%E9#C6#E:(D8(C7'B6&@4$?3#>2"=1!;/:.:.9-9-8,8,8,6(6(6(6(6(6(6(6(4&4&4&4&4&4&4&4&4'2(2(1'1'0&0&0&1'1'2(3) 5+"6,#7-$9,$A0)B/)C0*D1+G4.J71M:4O<6P=7P=7Q>8Q>8R?9S@:S@:TA;TA;UBXE?ZGA[HB[HB^KEaNHeRLiVPkXRiVPgTNeRKgTFfSBgQCfPBfPCgQDjRHkSIsXQuYUy]Zeboo{{ŪǪʨ˩ΨΥϣΠΝΘΗДӔ֒ڑېڑ۔ܕۗڙۜښݕ䑿㒾ᒾᐼߏސݏ܏܎ېِۏݏߐ␷⑸㑸㑷䒸喼떼떼떼떼햼햼헻훹뜸ꚵꗵ镴ꔵꔵ뒷쓷薛Ռzyzx}zznratrXctW\rUWoSRlOKkJCjE=lA:m<7m:6m75f32[-/P&(G %@#A '@!)>'<&:$8"7!4 4 210/,+-2222222255443321.-,+*)((('$"!!#$%&'()*-"-"-",!+ )('$&),!-$,#+"*!%&(")#*$)#)%("+"+ + + + + + + &&''(()()+# /%#/$"/!!.1"4$2&0%-&)#%"!&)+06"$<)+B00C54I;8JA8M:6J54G13E/1C/.?.&<.!=/$>0%@2)B4+D5.F70@1.>/,;++7''3#$1!"/"."+)*(()++***)()(*12-*('),*+,,))(*-1 4#4#3"4#6!&9$);(,:'+7'*5%(3#&2"%0 #0 9&"8%9& ;("<*(;)'7%%3 ".!*%#$&!$#&"*"/$2%4&5#4!/++"' %(2$#<**C-0H.1M34O54S98V>UB>UB>TA=HJ5HJ5JI5JI5KJ6KJ6MJ7MJ7QL9PK8PK8PK8SL:TM;VO=WP>XO@XO@ZN>[O?\P@\P@]P?^Q@]N;]N;]N;]N;_N:_N:`O;_P;`Q>_RA`SBbUDeXEgZGg\Fh]Gh`IiaJhbHicIidGjeHjeHleHqcFteFvgHxiJzkL|mN|mN|mN|mN{lMzkLxiJxiJxiJxiJxkKwiLrgIncGlaEi^BeZ>^R8YM3TH0QE-MA)K?'K?)I='F:$C6#D9'D8(B6&A5%?3#>2"<0 <0 9-9-9-8,7+7+7+6*6(6(6(6(6(6(6(6(5'5'5'5'5'5'5'5'4'4'4'3&3&2%2%2%3&4'5( 5( 7*"7*"8+#:+$=,%>+%?,&A.(D1+H5/K82M:4N;5O<6P=7Q>8R?9S@:TA;TA;UBXE?YF@YF@ZGA\IC]JD`MGcPJeRLfSMfSMfSLiVHhUFgTEfSDhREhREjRHjRHkRKlSLpTPuYU}_]igqqx{ĪƪȨȥɠɜ˜͛ә֔ՐԔڔڕۖܘۚܛۚݖ㓿⓿Ⓘᒾᑽݐݐݏ܏܎ېُڏݐ␷⑸㒹䒸咸喼떼떼떼떼햼햼헻횸Ꜹꚵꗵ閵떷엸횟ٌz{xw}{y{ovexwam{bhzady_`wYWtSNqJEqD?rA=ZB@ZEBXEAWD@UC?IK6IK6KJ6KJ6KJ6KJ6MJ7MJ7PK8PK8PK8PK8RK9TM;VO=WP>YPAYPA\P@\P@]QA]QA_RA_RA^N>^O<^O<^O<_N:_N:`O;_P;^N>]P?_RAaTCcVCeXEeZDf[Eh`Ih`IhbHicIidGjeHkfIleHpbErcDteFwhIyjK{lM}nO~oP|mNzkLyjKwhIvgHvgHwhIviIvkMshJqfJodHmbFi^BbV<]Q7UI1RF.OC+NB*MA+K?)G;%C6#D9'D8(B6&@4$>2"<0 ;/:.8,8,7+7+6*6*5)5)7)7)7)7)7)7)7)7)5'5'5'5'5'5'5'5'4'4'4'3&3&2%2%2%4'4'5( 6)!6)!7*"8+#9*#:)";("<)#>+%B/)E2,I60K82L93M:4N;5P=7R?9S@:UBWD>WD>XE?XE?YF@ZGAZGA\IC^KEaNHdQKfSLiVHiVGhUFhUFiSFiSFjRHjRHjQJjQJlPLnRNsUSz\Zbbghvwxy{{}«ǥŢǡˢҡכՕӗژۗۘܚݚݛܚޘᔿⒿߐݏ܏܏܎ۍڏ؏ڐސ⑸㑸㒹䒸哹於떼떼떼떼햼햼헻횸ꙷ阶ꗷꗶ엸햹ގuuwu~x}qzklxnuntmpff\ZzQMyIExEAv?0/B41B94C>8DD.SC3UE6VD6TB6R@4SA7R@6P<5M92I4/D/*@+&=*#:,!9-9-!9-!;.%=0'?2*@3+?1.=/,:,+6('3%%1##0!$0!$+)*)*)++--.-+***//-+))*,-/.,*'''*--./012 8$&6#%5"$4!#1!"0 !/ .8%!6#6#9&":(&;)'8&&5##/"*$"#$"#+"-"0!2!45!6"!5&!,!.%4)#=0*G51O:9U;>V<=Z@A[CA]EC]HE]JF[IEYGCVGBJK9JK9JK9JK9LK9LK9KJ8KJ8NK:MJ9OI9OI9PJ:RLVO?ZQBZQBZQB[RC]QA^RB^RB^SA]P?]P?_P=_P=_P=_P=_N:^O:]M=\O>^Q@`SBbUBdWDdYCeZDg_Hg_HgaGhbHjeHkfIlgJmfIncEqcFseHugJwiLzlO|nQ}oR{mPzlOxjMvhKtfItfItfIugJujLtiKrgKrgKpeIlaEfZ@`T:VJ2SG/PD,OC+OC-MA+I='E8%E:(D8(C7'@4$>2"<0 :.9-7+7+7+6*6*5)5)5)7)7)7)7)7)7)7)7)6(6(6(6(6(6(6(6(4'4'4'3&3&2%2%2%5(5(5(6) 6) 7*!7*!8*!8' :'!;("<)#?,&C0*F3-H5/J71K82M:4O<6Q>8TA;VC=WD>WD>WD>WD>VC=VC=VC=UBVC=WD>YF@]JDbOIdQJhTIhUGhUGhUGhTIhTIiSHiSHnUNlSLmQMlPLnRNsWSw[Xy`\khnjplsouswtvvwwwy{|űǬǪɩϧџњОٛٚۛܚܚܛݙߙݓޓܑڑڑڐُ؏؏؎ِޑᑸ㒹䒹䓺哹擹於떼떼떼떼햼햼헻홹ꙷ阶ꗷꗶ엸햹㒕~~sswuxsquyzyrtffYXPLKGxA>m54a.-Y))P&'G##B !A"A"@#= =";: :87632100//////////..--,,,+++****)(%$"" !&&&&'''')(&$$%&')+ ,!-",#) &$%&(")#*$)#)%("$$$$$$$$##$$%%&%* !*" -#"0$$3$'1"%/$-"-",!,#*"'#&#$"% * +-.2!6#%9));-,?1.@72B;5B?8EGG=4A4+B2%H5'L:,P>0R@2TA3T@5S?4T@5S?4R>5O;2K7.F2)B.%?-#<.!:. 9-!9-!9,#:-$;.&1)F70O<8V><\?A]@B`HH_KJ`LK`NL^OL[MJXJGWIFKL:KL:KL:KL:LK9LK9KJ8KJ8MJ9MJ9OI9OI9PJ:RLVO?YPAZQBZQB[RC]QA^RB^RB^RB^Q@^Q@`Q>`Q>_P=_P=_N:^O<[N=\O>]P?_RAaTAdWDdYCeZDf^Gg_HgaGhbHjeHkfIlgJngJpeIrdGrdGtfIvhKxjMzlO|nQ|nQ{mPxjMvhKugJtfItfItfItiKshJshLshLshLodHh\BbV+%@-'C0*D1+H5/I60K82N;5Q>8TA;WD>XE?XE?XE?WD>VC=UBVC=UBZGA^KEaNGdPEeRDfSEhUGiUJiUJjTIjTIpWPnUNmQMlPLmQMpTPtXUt[Vzc]zf]~jandpiqkplpl}kimkoopqsv}ųǯɩȣ̟̣֠؟ڜۛۛݙݚޛޖޔݓܒۑڐُِ؏؎׎׎ّߑᑸ㒹䓺哺哹攺疼떼떼떼떼햼햼헻홹ꙹꗷꖶ镶떷앸痚ǁttzxwux}zmo`aWVLK|B@k32^+(T&&M%#F#!A?? ? >;;:998652100//////////..--,*+**+*+++*)&$##!!&&&&'''''&&%%%&')*,!-",#) '%%&(")#*$)#)%("$$$$$$$$""##$$%$) ( +! .$#1%'1"%-#)*))!'!&#&#%#&!,",..1 5"$6&&8*)=/,?61B;5@=6AC8MPE_eYlwi~{|lxs_uoYrlToiQokRmiPkcPi]MfUK\KCQ>:H5/D0'H5'L9+O<.P=/P>0SA5UC7TB6UB4UA6S@2P=/L9+G4&D2$?1$=1#;/#9-!8+"8+"8+#8+#;-*:,)7)(4&%2$$0""0!$0!$-,++++,,1//-,))),,,**()+12310.+,-,,.22216"$6"$5!#3 "3 "2!0 !2 9&"8%7$ 9&";)'=+)<**:((2"#- '%%%"!(*/4 !9$#>&$>)$?,%;-$A3*H:1Q@8WB=\BAbDFdFHdONcQOdRPbSP`RO[PLXMIULGLO>KN=KN=JM^Q@`SBbUBdWDdYCeZDe]Ff^Gf`FhbHjeHlgJmhKohKrgKseHseHseHtfIvhKykNzlO}oR|nQykNwiLugJtfItfItfIshJriJriLsjMsjMofIh^CcY>[Q8VL3QG.ND+NC-MB,K@*J?+H=+G;+E9)B6&@4$=1!;/:.8,8,8,7+7+6*6*5)8*8*8*8*8*8*8*8*7)7)7)7)7)7)7)7)5'5'5'4&4&3%3%3%7)7)7)7)7)7)7)7) ;*#;(";(";("=*$>+%@-'B/)F3-G4.J71M:4Q>8UBYF@YF@XE?WD>VC=UBVC=UB===<<:9999765430........//..---**)*+*+,,*)&$##!"''''&&&&%%&'''&&()+ ,!,#*!(&%&(")#*$)#)%("$$$$$$$$!!""##$#(() -#$0$(/#')!%'%%&% % &!&!-#, ,,.1!"4$$6('=/,?61B;5@=6@@6ILA[aUgrdyz{~lwtarkXkeOnhRmeRm`Ol\MiULcJEZ>:S73I2*J6+M:,M;-M;-N>/SC4WG8TD5VE5WE7WF6VC4R?0P:,K8)C6&@4&=1%:."8+"6) 5( 5( 9+(8*'5'&2$#0""/!!/ #/ #..-,,-..210-,*)',--++))+/120/.-,0../36 317!#6"#5!"5!"4""3!!3!!3!!;($9&"8%!9&"<*(>,*>,,=++4$%/ )&&&#"). 6$"<)%A,'F/)E1(D2(I8.O>4UD:[HA`HDdHEiIJjLLhSRdUReVSdVS_TP[RMWNITMGLO>LO>KN=JM^Q@`SBbUBdWDeZDf[Ee]Ff^Gf`FhbHjeHlgJmhKohLshLtfIseHseHtfIugJxjMykN~pS}oRzlOxjMvhKugJtfIrgIqhIqhIriLsjMtkNpgJi_DcY>]S:XN5QG.MC*MB,MB,MB,K@,J?-H<,F:*C7'@4$=1!;/:.9-9-8,8,7+7+6*6*8*8*8*8*8*8*8*8*7)7)7)7)7)7)7)7)5'5'5'4&4&3%3%3%8*8*7)7)7)7)6(8'=*$=*$<)#<)#<)#=*$?,&@-'E2,G4.J71M:4Q>8UB8Q>8WD>VC=UBZGA[HA]KA_MAbPDeSGhTKiULiULiULiRJgPHfMFdKDdKDgNGmRKmTMoYNs]PxbU}gZk`lakcjb~e`hchd}d`y_^z`_hgorw~ĽȺ͸ѰЪҧ֢֟؞ڜۚ۞ޞݝܛڙؖؕגؑבא؏؎׎׍֍ؑߒⒹ䓺哺唻攺町疼떼떼떼떼햼햼헻홻똺ꖷꔵ蓴钳萳鑴ꓷ젣Јzz}~vw~s{hn`ePQzBAg11X&%O#"I#"B =<<<;;99899765431........///..--+))*+*+,,*)&%$#""''''&&&&$%'()(&%')+ ,!,#+"('%&(")#*$)#)%("$$$$$$$$!!!""###'&(!,!%/$(-"&( "$#$$$%&!&, "-!-,.0 !3##4&%=/,@72C<6@=6??5HJ?Z]Rfnauxv{xgqjXh`Mg_Lh]KiYIiVGkPEfH>`=7X70M5+K9+M;-K;,K;,L?/RE5WL:SF5WG7XH8ZI7YF5VC2T?.O<-G7(B6(?3';/#8+"5(4'3&8*'6(%4&%1#"0""/!!."/"0..-.-//110/,*)(.--, +)*,-/// - - -,1/.157!6 27!#7!#6"#6"#5!"4""4""4" <)%:'#8%!:'#=+)?-+?-->,,5%&1!"*'''$",!2%9*%B/)G3,K4,L6+J6+SA5XF:^LBbNEfMIhLImMNoQQiUTfWTfXUcXT`UQ[RMVOITMGNRAMQ@MP?KN=IL;GJ9GH8FG7JH9JH9JH9JH9KH9KH9KH9KH9QK?RL>TL?VNAXPCZSC\SD]TC_SC_SC_SC_TB_RA_RA_RA_RA\O>]P?]P?^Q@aTAdWDeZDg\Fe]Ff^GhbHkeKmhKniLojMpiMqhKrgKrgKtiMujNxmQ{pT|qU~sW}rV|qU{pTzoSxmQwlPwlPulMrlLqjMrkNrkNngJhaEc\@b[A[T:SL2MF,KC,KC,JB+IA,I>,H<,F:*C7'A5%>2"<0 ;/9-9-9-9-9-9-9-9-8*8*8*8*8*8*8*8*7)7)7)7)7)7)7)7)6%6%7&7&8'8'9(9(;* ;* ;* ;* ;* ;* ;* ;* ;(";(":'!:'!:'!<)#=*$>+%F3-H5/J71L93N;5O<6O<6O<6S@:TA;UBcKAgOEjRHhTIiUJlXMo[Ps_VwcZ|e]}f^}d_{b]za\x_Zz^[|`]}a^}cdgnnw~ƶŲɱϬҢϡҢןؘԟܟܝڜٚטח֕ה֒֒ؑאُ؏؏ڑߒⒹ䓺哺唻攺町瑷摷撸璸瓹ꔺ땻얺옺ꖸ蔵葵琴葵钵듶쑵υxx~{}z{|q{gp^dRUv@@a-/T&&L#!A;;<<998876: 8762100.,,,,,,,..-,++**()))))**(('''!'!%!%#$%&()**((''&&%%(((((((((!' '!& %$#" !!""###%$!  #&'& %&!*#.#',#&(!"   !"$$()+*+-3##6('>0->50@93B=7FC:KMBVXMZ`Vmzp~pvm\k`Nk^KaR=fT@r[IsVFsOAtJ>gA6P9+M=-N>.J=,H=+IA.OG4UM8[P,*>,*@.,B0.;++7''0"!,*++,!0%!8+#@1*I6/P91U=3ZB8]G:^J?dPEkWNnZQpWSrTRsSTsUUjVUgWWfXWcXV`US\RPWOLUMJNRAMQ@MP?KN=IL;HK:GH8GH8JH9JH9JH9JH9KH9KH9KH9KH9QK?QK?TL?UM@WOBYQD[RC\SD_SE_SC^RB^RB_RA_RA_RA_RA\O>\O>]P?^Q@`S@bUBdYCeZDd\Ef^GhbHjdJmhKniLniLohLqhKrgKrgKshLujNwlPynR{pT|qU|qU{pTzoSynRynRxmQwnQsmMrlLqjMrkNrkNngJibFd]Ab[A\U;TM3NG-LD-LD-KC,IA,H=+G;+E9)C7'@4$=1!;/:.8,8,8,8,8,8,8,8,8*8*8*8*8*8*8*8*6(6(6(6(6(6(6(6(6%7&7&8'8'9(9(9(;* ;* ;* ;* ;* ;* ;* ;* ;(!;(":'!:'!:'!<)#=*$>+%C0*D1+F3-I60J71K82K82K82N;5O<6R?9TA;VC=WD>XE?WD>YF@YF@YF@YF@YF@YF@YF@YF@]LD^ME`OGbQGeSIgUKjVMkWNiULfRIdMEaK@aI?bJ@eMCfPEeQFfTHiULmYPp\St`WxaYzc[za\y`[x_Zw^Yy]Zz^[{_\|`_~afemryĸ̻ȸͳϩʥΦԤ՞Ңآءמלՙ֘ՖՕԔ֓בא؏؎׎ّߑᑸ㒹䒹䓺哹擹搶吶呷撸璸铹ꔺ딺땹铷璶萴搴萴葴꒵됴痚Dž||}|}wp|fo]eJOm9;Z),O#$F =89999786658 563200.++++++++-,,,,+++))****++))( ( ("("&"& %%&'(*+ + (((''&&%'''(() ) ) (!(!'!& %$## !!!""##%#!  #&'!&"% &!)$+"'*!$%"""#%&'(-!#-!#/!!,,.3##7)(@2/@51C:5C>8EB9JJ@QQGUXOeofwz~}ovm^m`Ol]JbQ=iWAwaJz[FyTAzL+LA-ME0RJ5UO9[S>WO:VJ4VG2WF2VD0V?-R=,L:,G7*B1'>-#=,$;*"8' 5$3!3!4""3!!2!/-+/0/0/0//101/.,,+.0/ . +*.14301220.00/02589!!:""7"!5 434 5! 6"!>+'@-)B/+A.*>,*=+)?-+A/-<,,9))3%$. ---" /$"2'!:-$D3+K9/U=3\A8cH=fNBfPEhTImYPpYSpWSpTSrRSqTVkWXgWWeWVbWU_TR[QOXPMWOLNRCMQBLPAKO@IM>GK\O>\O>]P?^Q>aTAbWAcXBd\Ef^GgaGjdJlgJmhKniLohLpfKpfKpfKqgLrhMukPwmRxnSyoTyoTxnSxnSxnSxnSxnSwnQsmMqlLojLpkMpkMniKhcFd_Bb\B\V+%?,&@-'B/)E2,F3-G4.G4.G4.H5/K82N;5R?9VC=YF@ZGA[HB[HB[HB[HB[HB[HB[HB[HB[HB\KDZLC^ME`OGbQIdSKgUKgUKfRGdPEbNC`LA`J?`J=`J=aK@bNEbPFeRKhUNlXQo[Tq]Vr^Wu^Xt]Ws\Vr[UsZUt[Vu\Wx\YwX]z[abhmuòýͿϴ̬̪ЪӥҦ֤֣ՠ֞ԛԚӘՔӓӒԐԏՏՎ׍ؐސ⑸㑸㒹䒸咸吶吶吶呷摷蒸钸钸钸瑷搶珵掳玳珴鏴鐴ߎ|umzbmW^r?Da03P#&G A857777 564414 3310-.,*))))))))****+++**++++,,+ + *"*"*$*$($("''()*+ + ,!)((''&&&&&'(() *!*!)")"("'!& %$ $   !"""#$#! !#%& &"%!%"'"'#$"!##$( * !+! , -!!0&'0&'/##, ,. 3%$8*)A30C84F=8HA;HD;HH>MMCOPH\aZmtm}yznxl^m`Oj[HaQ:jX@zdLbJ\DT=uJ7Z;'R;)P;(O>*SD/VJ4VN7XP9]U>YQ:WK5VG2VE1VD0XA/U@/N;-I7+C1'@.$>+$<)"9& 6#4 4 4 !3 1/-,.-..-./.320..-++/3 3 "1!".+,/4324442.1123569 9!!<$$;##7"!6! 5 5 5 5 >*)@,+B.-A-,=+)<*(=+)?-+>/,<-*7)&3%"1# 1# 2'#4)%8+#>0'H5.P<3[@7cF>kNFqTLmUKnXMnZQmYRnVTnTUqTVpVYlXYgWXdVV`TT^RR[QPYQOYQOMQBMQBLPAKO@JN?HL=HJOK?RL@SMATN@UOAWOBXPCZQBZQB[RA[RA]QA^RB^SA^SA]P?]P?\O>\O>]P=_R?`U?aV@c[De]FgaGicIlgJmhKmhKniLpfKpfKpfKpfKrhMsiNukPwmRvlQwmRwmRwmRwmRwmRxnSvoRslOpkKojLojLojLniKidGe`Cd^D^X>WQ7QK1OI1MG/KE-HB,G<*F:*D8(B6&?3#<0 ;/9-6*6*6*6*6*6*6*6*7)7)7)7)7)7)7)7)4&4&4&4&4&4&4&4&7'8(8(8(9):*:*:*;+;+;+;+;+;+;+;* ;(!;(":'!:'!:'!<)#=*$>+%=*$?,&A.(C0*E2,F3-F3-F3-G4.I60M:4Q>8UB_I<^H;]G<_KB`LEbNGdPIgSLiUNkWPlXQpYSoXRoXRoXRpWRpWRpWRqXTqRWuT[wX^|]ckpƵʽ϶̳ΰϬЩԦ֥բԠҝӜҚӕҔӒԒԏՏՍ֍؏ݏߏᐷ␷⑸㑷䒸吶吶吶吶吶琶瑷葷萶吶叵揵掳玳玳莳菳폳폳وßǕvivWawENd5;V),H#B <647!544 2310/1 ..-,++*(((((((((())*+, ,++,,,,,- ,!,!+#+#+%+%)%)#) ))*+ ,!,!,!)))('''&&&'(() *!*!)")"("'!& %$ $    !!"""#"! !"$$'!%!$!#!!# $ '!!)##-%#.$#0$$0$$0&'0&'/##, ,. 5'&:,+C52E:6K@)X?)ZF.]M6]Q9]S:^S=[P:WK5VG2TC/UC/VA.VA0R*)@,+A-,@,+<*(;)'<*(>,*@1.?0-<.+9+(6(%7*$8-);0*>1)F5-M92V=6^A;eG?mOGsUMrWNoVOnWQkVQkVUnUXqWZrY]lXZgWXdTU`RR\PP[QP[QP[SQKQCKQCJPBIOAJN@IM?JL?IK>GI^S=_T>c[Dd\Ef`FicIkfIlgJmhKmhKqgLqgLpfKpfKqgLsiNukPvlQukPukPvlQvlQvlQvlQvlQunQslOpkKniKniKojLniKjeHgbEf`F`Z@YS9TN4QK3OI1KE-HB,H=+G;+E9)B6&@4$=1!;/:.6*6*6*6*6*6*6*6*7)7)7)7)7)7)7)7)4&4&4&4&4&4&4&4&8(9'9':(;););)<*<*<*<*<*<*<*<*<*;(!;(":'!:'!:'!<)#=*$>+%>+%?,&B/)D1+F3-F3-G4.F3-I60K82N;5R?9UBXE?YF@]JD]JD]JD]JD]JD]JD]JD\KDZHDYJCZKD[LE_NF`OGaPFbQG`NB`NBaN@aN@`M?^K<^H:]G:`IC`HDbKEcLFeNHgPJhQKiRLkTLkTLkTLlUMlUMkTLkTLlSOoPUqRXtUZuV[{\amqǴͻ͸ͲϫѧԦӤԢҟќқԕҔӓՒԐ֏Վ׎ُݏߏᐷ␷⑸㑷䒸呷摷搶吶吶琶琶琶玷厷厶獵援莳獲獲玲쎲쐲ԇŠʘtanvGQ`19Z-2N%)B#?$;#6 4$7'1!10 //..+,++**)))((((((((''()* * +!+++,,,,,- -"-",$,$,&,&*&*$*!*+ + + ,!,!,!*)))('''&''(() ) *!)"(!("'!%$$ #     !!"!!!!!"##&!$!"!" !$#!)%$,'$0(&2('3(&2&&0&'.%&-#"* )-!!6('<.-B41F;7MB>PICPLCQNETQHTTLTSN_`Zjmfqrjvvlxtiqi\h\NbVFWJ7\Q;l^Dv`HcKdP_J~O=vI6lC1gB/fG2gN8gS;eU<^R:]Q9ZN8XI4VE3UB1UB1WA3X@4S;1M4-I0)G.)D+&@'#=$ <"#;!"9"64210,,-///0196300../67!:!%8"%3!/-/5446772/34567:;! <"!?%$=%#=%#<$"8# 7"5 5 =)(?+*@,+?+*<*(;)'=+'?-)B3.C4/B5/@3-3-D7/F70M:3U>8\A:aB=gFAlKFqPKpSMlSNjRNhSPjTVmWZpZ]r\_kWYgWXdTU`RR]QQ\RQ\RQ]SRKQCKQCJPBJPBKOAJN@KM@KM@GI^S=^S=bZCd\Ef`FhbHkfIlgJlgJlgJqjNrhMrhMqgLrhMsiNukPvlQvlQukPukPukPukPukPtjOrkOrmOpkKmhJmhJniKniKkfIidGgaGb\B[U;VP6SM5PJ2LF.HB,I>,H<,F:*D8(A5%>2"<0 ;/7+7+7+7+7+7+7+7+6(6(6(6(6(6(6(6(5'5'5'5'5'5'5'5'9':(:(;);)<*<*<*<*<*<*<*<*<*<*<*;(!;(":'!:'!:'!<)#=*$>+%>+%@-'B/)D1+F3-G4.G4.G4.K82M:4P=7S@:VC=WD>XE?XE?\IC\IC\IC\IC\IC\IC\IC[JC[IEYJEZKD[LE^MF`OG`OGaPF^L@_MA`M?`M?`M>_L=`J<_I#<$8&3#3%8*/"..--**))((((&('()))))))((())))***++++,,,!,!+#+#+%+%)%)#+"+ + + + + + + ***))(('(((((((((!' & %$#""     !!!   !!"""$" !! %#$'&$-)&0,)5-+6.,7,*6,*3*+2)*/%$+! *-!!7)(=/.B41G96LA=QHCRKCSOFVSJYVMTTL\]Wdg^knessixulsk`g]Q_VGQH7SL9aYBk[Dx_IcO]JRAO>K9zK9vM9rR=oU>lX@cS_P;[L9XG5XE6[E8_D;Z?6U82P5.N1-J.*G)'C'$B$&?"$=#9 7443..001244=!;6311017:!:$9 $3 /027654542045678;<"!=#">$#>$#=%#=%#:%"9$!7"6!:&%=)(?+*?+*<*(<*(>,(@.*D50G83H;5F93B5-B5-D:1K>6N=6T?:]D?cFBgFAiFBlIEmLGmPLhOKfNLdPOhTVlW\nY^nY^iTYgTVfSUbRS`RR]QQ]QQ\RQKQCJPBJPBJPBKOAKOAKOAKOAGIVNAVNAXO@YPAZQB\SD_SC_SCdWFcVEaTC_RA^Q>^Q>^S=^S=bZCd\Ee_EhbHjeHkfIlgJlgJrkQrkQqjPqjPqjPrkQslRtmStmStmSslRslRrkQqjPpiOpiMrmOojJmhJlgIniKniKlgJjeHhbHd^D]W=XR8UO7QK3LF.HB,K@.J>.H<,E9)B6&@4$>2"=1!8,8,8,8,8,8,8,8,6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(:(:(:(;);)<*<*=+<*<*<*<*<*<*<*<*;(!;(":'!:'!:'!<)#=*$>+%<)#>+%@-'B/)D1+E2,E2,E2,K82M:4P=7TA;WD>YF@ZGAZGA\IC\IC\IC\IC\IC\IC\IC[JC\JFZKF[LG\MF]NG^PG`OGaPF^L@^L@_L>_L>`M>`M>aN=dN@dI@eHBeHBeJCfKDgLEgLEeMChMDgOEiQGjRFiSHhREfPEfMHgJNjMRnOToPUpRTtVX|^^df~~ʺʼ̰ϪѩҦѤѡџѝӚӘ՗֕גؒؑڐۑߑᑸ㒹䒹䓺哹擹攺锺铹蒸璸鑷萶琶玷司搸鑹ꐸ뎶鏴鍲玱뎱돱唙юçͦТʝ›hz|P_l>I[-7K 'I"'>!9 8$5&0#1$5(- + + **(('&&&$%$%%) ) ) ) ) ) ) ) (((''''&))****++,!,!+#+#+%+%)%)#+"*******+ **))(((+ **)'&&%&&%$#"!!       !   !!""!#!!!"%%%)))-,*3/,730<41=52>31<20=459335-+0&%-!!/##7)(=/.B41F85J?;MD?OH@PLCSPGVSJTTLZ[Sad[hkbstlzzpwphjcY\VJNH:OL;\WCcVCmXEyZHQBN?O@TCWFXDWCxXCrYCjU@jZCk\GiZGdTD_O?]K=`J=dI@`C;[<7U82S41O2.L-+H*(E%(B$&@ %;!967600223467@$=!8422259;!;#8"2147!:"84231/.56789< ?#"@$#<"!=#"=%#>&$>&$=%#9$!8# 7#":&%=)(>*)<*(=+)?-)B0,E61J;6L?7J=5F91F91I?5PC:RA:[C?eIEkLIoLJpJIpJIoLJlNLfMIbMJbNMfRThUYhU[gRYgRWfSWfSWdTWbSV_SU]QS\PRIQBIQBIQBIQBJPBJPBIOAIOAFJQK?QK?QK=UM@VNAXO@YPAZQB\SD]TC_SCeXGdWFdTD`SB_R?_R?_S=^S=dYCc[Df^GibHkdJkeKmfLmfLtmSukRtjQsiPtjQslRtmSunTunTunTtmSrkQqjPpiOohNmgMrmPnjMkgJkgJmiNmiNlhMieJhdKc_F]Y@XT;UP:QL6KF0HB,JA0I@/G>/D;*A8'?6%=4#<3"7.9-9-9-9-9.9-9-6(6(6(6(6(6(6(6(7)7)7)7)7)7)7)9(:(:(;);)<*<*=+=+<*<*<*<*<*<*<*<*;(!;(":'!:'!:'!<)#=*$>+%:'!<)#>+%@-'B/)C0*C0*C0*J71L93P=7TA;XE?[HB\IC]JD[HB[HB[HB[HB[HBZIB[HBZIB]KG]KG]KG^MF_NG`OG`OGaPF^L@^L@]K=]K=`M?`O?bQAgQCeJAgIAfICgJBgJDfKBgLCgLCgLCfNDhPDhREhREgQDeOBdMEbHIeKNjMQlOQoQSrTTwYYz^]ghïȵͮϬЩϧϣРПћҙԗՖ֓דגّڑݒ⓺㔹㕺䕺敺斻薻蕺甸蓷瓷钶蒶撶擷甸蔺딸꒶ꐴ菲荰莱鑱쐳풴蚟וʑɩөզҢȟvXji?M\1;T)2L%*B#:55 2!--!2&+ * ))''&$%##$##$%+!+,!++!++!+* )(('&%%'()())**+ + *"*"*$*$*$*"*!***))))+ + **))((.#.#,!) )&$$%%$#"!       !!     $#(&).,-3/0843=77B9:C98B89A78F=>B9:=324*)/##0$$7)(<.-B41F85H=9K@RKCTPGSSIXZO^aVgj_twl}}syvmmi^ZVKLHOBXL^O\LXFVB|XBrXAp^HpdNobOk\IfUEeOAhNAhLAdF<^@8Y;3V72R5/N1-K,)G'(G%&D $@ =:9844446889D%B#>97457;> >!: 86: >#B$=7534108::;>>A!"B$"> >">$#@'#@&%>&"<$"9$!6"#8&&<()=)(=)(=+'@.*A2-F72K<7Q?;P>:L;4I:3M@7TF=UB<^FBiMJpRPqRPrPOoPNnPNiONeMK`LKaOOdQSeRVcPV`MSePUfQVhSXgTXdTWaRU_PS[OQEPBEPBFQCGRDIQDJREKSFKSFFL@FL@GJ?GJ?FI>EH=EGPM>QN?QK=RLXQAYR@ZSAZSA[RAeUEeVCeTBcTAcTAbS@aR?_R?cVCcXDeZFg\Fj_IkcLodNpeOthRuiSvjTwkUwkUujTtiSshRujTujTskTrjSoiQmgOjdLicKigPigPigPjhQjhSkiTkiTkiTigRfdO`^IYWBTR=OM8MK6LI6HB2E?/B<.A;+C<,B;+@9'=6$<5#;2!916.5-5-8-8-7*7*6)6)5(5(4'4&7)7)8*8*9+ 9+ :,!<+!<* =)=) =)=) =)=) =)?+">*>*!>*>*!=)=) =) ;' ;&!;&!;&!;&!;&!;&!;&!=(#>)$?*%@+&B-(C.)E0+E0+I5.M92S?8XD=\HA]IB[HAZG@\KC\KC[JB[JBZIAXJAYH@YH@]JD^KE_LF`MFaNGaNG`MF_MCaQDaQDaQDbRCcQCbRCbRCcQChMBhLAgJBfJ?fKBgLAjODiQEjRFkSGkSGiSFhREdQCbOA`LAdMGdLJdJIeKJjNMnRQsUUuWWx[]tv©ѻʿŻǷθҳЬ̢ͦ͡МКјҖӔՖؗۘܔܔܖޔޖߖߖᖹ㗸嗸嗸嗷旷藷藵痵畳啴㕴㔴啳唴甴甴琯吱摰瑲蒳铴ꔴ퓶楤ݚǝÞĜšÜǠѥפ֠ТШЧɡ~_tnGZa;JX2=O*2G$*> "= "9 631/ ,*!(!' ' &&%$"!!!!!!$/ 02 00 0/ /*('%$$%%'&)'''&%%%&'() *!*!.%.%-$-$,#+"+"*!) ) +"+"+") '()))'(&&%""""!!!!       ! ! !#% % %!'#-$)1(-;27@7?6;B7=GH<>J>>H<<=113%%/!!5'&>0/F85I;8L?9M@:I>8I>8J?9JC9II=PTE_cTosdy}o{}pvvjppdZXLUQFRL@TJ@]OFcPIfMHfH@tLBNBTK\UaY_TZJXD{Y@tcIngMkeMpdNvaNtWGlK3U:/P5,M0(R0.P((K!IH C8.5>!;:B(="6<@E!H!F>:68?CCDE F!G#I#M$O%O'K$D =;<BDBADH M%&P*)J&&F$"A" A$ B&#A(#>&"9$!8(+8'-;')8$%6#8' =.'B5/K<9N<]EAaGFfLKjPOkSQkSQhSPfSO]KIYGGVDDWDF\IKaNRdOTdOT^GM_KMaMObOQaQR_QQ]OO\NNDPBDPBEQCFRDGRDHSEITFITFEM@EM@FL@EK?DJ>DJ>EH=FH=HHPM>QN?RL/D>.C=-@;(>9&=6$<5#:2806.6.8-9.7*7*7*6)6)5(5(4'7)7)7)8*8*9+ 9+ <+!<* =) =) =) =) =) =) =) =) =) =) =) =) =) =) =) ;&!;&!;&!;&!;&!;&!;&!;&!=(#=(#>)$@+&B-(C.)D/*E0+K4.O82S?8YE>\HA^JC\IB[HA\KC\KC\KC[JBYKBXJAXJAZIA^KE`KFbNGcOHdPIcOHbPFaOEaQDaQDaQDbREbRCbRCaTDdRDhPDjNChLAgK@fK@gLAgOChPDjRFkSGjTGiSFfSEdQCbOAaMBbNEaMFbJFcKGhLIlPMpRRsUUuWYfhz|ūýɽκζΰ˩ʥ̡ΞϚИЖї֖ח٘ڗۗۗݗݗߗߘ♸䘷㘷嘷嗶嗵癵癵瘲㘲㗳㗳㗳嗳啳啳呱䒲哲蔳锵ꕶ땶씷顡ݛ֚ΛşßŞǛʛ͟ңبݦؤӪծԬͬɱªq|Tlf?RY5CR.8G&-@!&;":631.+)(!& & %%$$$"""""""%/2211//.*)'%$$%%$%&''&%$$$%&'() ) -$-$,#,#,#+"+"+"() *!+"*!('') * (('&%%!!!        !! !#&' '"*%/$*4)/9.6@5=D9AC8@D8BH>L>>C557))2$$7))>0/E76J<9OA>OBXZLgk\swhvzkrtfln`dbV[WLSJARE=WF?[HB\GD]F@jODzRFVN^Wa\bX`Q`L[BzeJrhMlfLqeOweQv[JpPAoO@iLGI>II=II=JH;JH;KIPM>QN?SM=TN>VP@YSC[TB\UC\UC]TCbUDdTDdTDcSCcSCbRB`SB`SBbUDcVEeXGgZIi^Lk`NmbPncOqeOrfPsgQshRshRrgQqfPnfOqiRpjRpjRpjRnhPkgNieLgbLecNdcOedPedPfeQfeQfeQgfRa`L`_K^]I[ZFWVBSR>ON:ML8KH9HE6EB3DA2GA1F@0D>.A;+@9'>7%=5";3 9180:/:/8+7*7*6)6)5(5(5(6(7)7)8*8*9+ 9+ ;* <* =) =) =) =) =) =) =) <(<(<(<(<(<(<(<(:% :% :% :% :% :% :% :% <'"=(#>)$@+&A,'C.)D/*E0+L40O73S>9YD?]HC_JE]JD\IC^MF]LE]LE\KDZKDYJCYJC[JC`MGbMHcOHdPIdQJdQJcQGcQGbPDbPDaQDbREcSDcSDdTEeSEkSGmQFkODjNChMBgLAfNBfNBjRFjRFjTGjTGgTFeRDcPBbNCaMD`LEaIEaIEfJGhLImOOoQQtVXxZ\bdvwʱϽͷ̲̭ͨΣϡНљїҗ֘יٙٚݚݚߚߚᚼᚼ⚻䙸䙸䘷嘷嗶喵䖴斴昴䘴䘴䘴䘴昴斴斴擳攴瓴锵ꖷ엸헸ޑҏΐʚΞ͟ПѝЛќԝէޤأҦѯӵұ˫s`xnF^[4GP+F;CE:BF;CI>FE9C>3;H9>M>AO@CI:=?039++;--?10E76L>;SEBSEBM?NEUM[Q]Q_O_M^GfNygQrfPsfSviVveSq\IoUDmP>iJ8hD6f@3b:0]5-Z/)X+&T$"PPS#U!%P"M IM#HFK K!I!O'W*Z+^)Y$RJCBKMO"N #N #L!I IGJL!J D?> B FLO"R!%O!$K!GAI!"E!!D"!C%#F(&H,)F-)E+*@%,?!+>&=$?"&?*)>/,?1.C41I54S68X89\88`=;bC>fICcGDcIHeKJdOLePObPNaOM]NKYKJUGFRBCP@AR?AS@BT?DS>CWCEXEG[HJ[KLZLLWKKUIISIHFRDFRDFRDFRDGRDGRDGRDGRDFNAFNAGMAGMAFL@FL@HK@HK@JJ>JJ>KIPM>QN?SM?UO?WQAYSC\UC]VD]VD^UDaTCcSCcSCcSCcSCcSCaTCaTCaTCbUDdWFfYHh]Kj_MlaOmbPncOodNpeOqfPqfPnfOmeNkeMnhPoiQoiQnjQlhOhfMhdKecLbaMbaMbaMcbNcbNdcOdcOdcO^]I^]I^]I\[GYXDVUARQ=ON.B;)A:(@8%>6#<4!:2;0;08+8+8+7*6)6)6)5(6(6(6(7)8*8*8*;* <* =) =) =) =) =) =) =) :&:&;';';'<(<(<(;&!;&!;&!;&!;&!;&!;&!;&!<'"=(#>)$@+&A,'C.)D/*E0+L40P84T?:ZE@^ID`KF_LF^KE_NG_NG^MF^MF[LE[LE[LE\KD_LFaLGcOHdPIcPIcPIbPFbPFbPFcQEbREcSFdTEeUFfVGhUGpUJpTIoSHmQFjODiNCfNBfNBkSGkSGkUHkUHhUGgTFeRDdPEbNEaMFaIEaHDdHEfJGiKKkMMtVXuWYwZ\giȲ͹˶̰ͬΧΣϟЛҙӘԘטؙٛܛޛ⛽⛽㛽㙹♸䘷嗶䖵䕴㕳唲䗳㗳㗳㗳㗳啳啳啳啵蕵蕶떷엸혹ꖠݍэђԜמء١۠ٞךכ֟٠֞ϡˬϵШ}`{vNfa:OQ,>I$5C"-=&8 8 53/-+*(' %%%$##########&+,.,,++)*('%$$##!"#$$#"!!""#%&&' (!(!)"*#*#+$,%,%' ' ' &&%$$&'&%$"!!    !! "  "% )$,!'.#)1&,6+1:/5=2:C8@GFF:DA6>H9>N?BSDGPADH9KC8NA8TF;ZI?ZLAPF:YG9mGNATEXH]J_KeQeRweQuhUynZvnYrgQo]GpU@nO;mH8mC5k<2e6.b1,c2-],(V$#R U!T RNAGR W&[)X)P$O#T'Y'_'`%\!SIEIJKJJ L"L$M$FHI HB><@BIO!S"&R$'O"%K!EDBB C$"E'%G+(I-*I-,H'.F",C&B&B#(B),>,*;,'D2.L40V75]76`75b97d?9dC>dFDbHGcIHaLIaLK^LJ\JHYJGVHGTFERBCP@AP=?P=?QJJ>LJ=MK>OM@PN?QN?SPAWQAYSC[UE\VF]VD^UD`UCaTCaTCaTCaTCaTCaTCaTC`SBaTCcVEeXGh[Jj]Ll_NlaOmbNldOmePnfQnfQlfPkeOidNkfPlgQlgQjhQigPggOfdMddL`_K`_Ma`Na`NbaObaOcbPcbP]\J]\J]\J\[IZYGWVDTSARQ?QN?NJ>KH9JG8MG9LF8JD4GA1D=+C<*C:)A8'>6#<4!<1;09,8+8+8+7*6)6)6)5'6(6(6(7)8*8*:)<* =) =) =) =) =) =) =) 9%:&:&;'<(<(=) =) <'"<'"<'"<'"<'"<'"<'"<'">)$>)$?*%A,'C.)D/*E0+F1,L40P84U@;[FA`KFbMHaNH`MGaPI`OH`OH`OH]NG]NG\MF^MF^KE_LF`MGbOIbOHbOHaNGaOEdRHdRHeSGfTHgUIiWKjXJkXJtYPtWOsVNqTLnSJlQHhPFgOElTJmUKlVKmWLjVKiUJhTIgSHeQHcOHcLFbIDcGDdHEgIGiJHoOPrTTx[]cepqϼͿ͹˴̯ΪΥТўӚӚՙՙךٝݝߝߝߝ᝽㝽䝽䙹♸䘷嗶䖵䔳⓲ᓲᖲ▲▲䖲䔲䔲䔲擳斵떵떷엸햹铣ߏّۘ枦塩碭墭㟬ᜧݚښמןҢ̬ʭÛgrNhhBWW1FK&8E 1A +=&9!9!6 41 /-,*&%%$###""""""""#)+,++)))*('$$$##!!"##"!!!!"#$%&&' ' (!)")"*#+$+$&&%$$###%%$$#!             " # !" &#+ (/$,1&.5*29.6=2:D9AH=EH=EC8@D9AI>FJ?GF;CI:AO@EVGLVGLQBGJ;>G8;F88G99OAAWIIWIHOA@F87A32>31G>9E>8E@:NJA[XOddZgg[gg[]^PZXKURCSM?TL?VM>YM?WN?VSDYR@dM=oJ8~K8PHKO!Q $Q#&O"%M #H !A@AB#!C%#E'%G)'I++O,2L'/G"*E")D%*B()=*&;("E,'N/*[2,d40g62g73e<6c@:cDB_ED_ED\GD\GFYGEXFDUFCSEDRDCRBCQABQ>@Q>@R=BS>CVCGVFIYILZKNXLNVLMTJKRIJGSEGSEGSEFRDGRDFQCFQCFQCFNAGOBHNBHNBIOCIOCLODLODLNALL@KK?JJ>MK?MK>NL?OM@QMARO@VPBYSCZTD[UE\UE\UC_SC_TB`SB`UCaTCbUDbUDbUD_RA`SBbUDdWFgZIi\Kk^Mk`NkcNldOmePmgQmgQkfPjeOidNjeOhfOigPhhPggOffNeeMdcN_^J_^L`_M`_Ma`Na`NbaObaO^]K^]K]\J\[IZYGWVDUTBTRCRNBPL@MJ;LI:OI;NH:KE7IC3E>.D=+D;*B9(@8%=5"<1:/9,9,9,8+8+7*7*6)5'5'5'6(6(7)7):)<* =) =) =) =) =) =) =) 9%:&:&;'<(=) >*!?+">)$>)$>)$>)$>)$>)$>)$>)$?*%@+&A,'C.)D/*F1,G2-H3.L40Q95U@;\GBaLGcNIbOIbOIbQJbQJbQJaPI_PI^OH^OH]NG^MF`MGaNHbOIcPJcPIbOHbOHfSLfTJgUKiWKjXLlZNm[Oo\Nv[RwZRwZRvYQsXOpULlTJkSInVLoWMoYNoYNmYNmYNkWLkWNiULiRLfMHdKFdHEeGEgHFhIGfFGmMNwY[}`bghvwıɼξ̶ɲͰЩХѢӝҜӚ՚ךלܜޞޜޜ✼㚺㙹☷㗶䕴㓲ᒱ⒰⒰⒰⑱䑱䖵떷엸혹咦㑥䚬꠯Ꝭ圦៥ᢢަקϨßmxWteBZ]8JP+=E#3@,>+;'7#6"5"2!0"/!. -+ &$$##"""!!!!!!!"())))()()(&$$$##!"####"!!!"#$%&&' ' ' (!(!(!)")"%$#"!!""$$#!                "!$"#" '$-"*2'/5*29.6=2:A6>I>FLAIJ?GD9AD9AJ?GLAIJ?EKAKOAATFFUGGPBAH:9A32>0/D97C97E;9JC=RMG[XOb_VccW^_Q]^N^\M^[J^XHZUBWP>TOsM:qF6m=/j8-b2(_0(Z/&X+%X'"X" YTM!KY!$c"*a&^'Y&OJQ]&g+m$/j#+a &X!]$*Z#(S %M"H EF!G"F"I#K$H!C?=AO#Q"S$S %Q $M #I!G BCD"!E#"C$"C%#G(&I)*P-1N+1J'-G',E(*E)(B)$D'N([+!j/'p4,q60n93i>7dB9_@>[A@Z@?WB?WBAUCATB@RC@OA@PBARBCQABQ>@P=?R=BS@DTDGTEHWHKWKMWMNULMSJKOIIHTFHTFGSEFRDGRDFQCEPBEPBGOBGOBHNBIOCJPDJPDMPEMPEMODLNCKMBJL?KK?KK?NL@OM@OM@PN?SPAURCYSEZTDZTD[TB\SB\SB_SC^UD`TDaUEbVFbVF]QA^RBaTDcVFfYIi\Lk^Nk`NkcNkeOlfPlgQlgQkfPjeOgeNfdMffNggOggOggOdfNbdLacM_^L_]N`^O`^Oa_Pa_Pb`Qb`Qa_P_]N][LZXIXVGWUFVTEVTESOCPL@NJ>MI=PJ>OI;LF8IC3E>.E>.E<+C:)@7&=4#;/9.:-9,9,8+8+7*7*7*4&5'5'6(6(7)7)9(<* =) =) =) =) =) =) =) :&:&;'<(>*!?+"@,#@,#?*%?*%?*%?*%?*%?*%?*%?*%A,'B-(C.)E0+F1,H3.I4/J50M53Q97VA>]HEbMJdOLdQMcPLcQMcQMcQMbPL`QL_PK_PK_PK_PKbPLdRNeTMfUNeTMeTMdSKhUNhVLjXNkYOnZQp\Qq]Rt^Sx]Vz]Wz]Wz]Ww\UuZSpWPoVOpWPqXQqZRr[Sp\Sp\So[RnZQoXPlUMjQJfMFfJFfIEhIFiJGfGEiJHnPPuYXw]\gfŴʽȸŵɵЭϨϣѡҝӜӜ՜מܞܟޞޞ➻㚺㙹☷㖵ᔳᓲߐߑᑯᑯ㑯㑯㐰㐯启啶앶얷핸푮蓭ꗱ운褩饣⧝٥ʜnuWskIa[8LS1BI'8@ /<):(9'6$3"0!0!."-!+ *($$$##""! )))))()(('&$""##!!"##"!!!!"#$% &!&!'"'"'"&!&!&!% % $"! !!!                      "!$#$" (&/#-4(28-5;08@5=C8@K@FODJNCII>DI>DMBHNCIJ?EM>ESDKZKR^OV[LQWHMRCHPADM>AN?BPBBRDDPBBK==C54=/.@22B44C77F<:KD>QMDYVM_]Q]^P_`PcdTfeSedPb`K_ZFZXAWW?ZV=^R8bM2fH.jF,qI0vL6yP>}SC~WFZHdOoWqWoQkLzgIu`CrX?qS;oJ7oA1k;-b2&b3)`6*_4+\1([,&Y&"U& L'G!W!c!%b"d&d",Z&HJR]!g'j'f$^ Y$T $P#K!E><:E!J#L#K!H EEGP!R#S&T!(S"(O"'K!%H#H!$I%'J()I'(G%&E%&I'(I)*I-,I,.I,.F,+E,(H+%N,"V*i. w/#3(4,6/r7/f;2^=4Y;9V<;V<;S>;S>=Q?=R@>PA>M?>OA@RBCP@AO<>M:MI=PJ>OI=MG9JD6E=0E>.E<-C:)@7&<3":.8-:-:-9,9,8+8+7*7*4&4&5'5'6(6(7)9(<* =) =) =) =) =) =) =) :&;'<(=) ?+"@,#A-$A-$A,'A,'A,'A,'A,'A,'A,'A,'B-(C.)D/*F1,G2-I4/J50K61M53Q97VA>]HEbMJePMdQMdQMdRNdRNcQMcQM`QL`QL_PK_PKcTOdUPgUQhVRiXQiXQhWPgVOiVOjWPkYOm[Qp\Sr^Us_Tv`Uy^W{^X|_Y|_Yz_Xw\UsZSqXQqXQrYRr[Ss\Tr^Uq]Tp\Sp\SqZRoXPlSLjOHhKGgJFiJGiJGnOMiJHiIJnPPqUTv\[mnï˺Ǻ¹ȹͯάΧТПџӟ՝ՠٞ۠ݞݞߝߝ᝻᜹ᙹ☷㖵ᔳᒱߐߏޏߏߏᏭᎮᎮᎭ㍮㕶쓶씷핸줟ߣҠwvYweEZa@QU3DM-E:BJ?EODJQFLMBHMBHPEINCGI>BO@GTEL[LS_PW]NSYJOUFKSDGO@CN@@M??PBBQCCM??D65=/.<,/@03C55D97F<:KD>TPG[YMXYK]^NcdRhjUkjVihShfOfdK^]?c`Aj_Al[=mV7nP4pP7tQ;oL9uR?{TCWF_KhRiPgLiMgIx`Ds[?pT=N@?QABO?@L9;J79K6;L9=M>CMAENCGOFIPGJMGIJFGIEFEQCEQCEQCFRDGRDHSEHSEHSEKSFKSFLRFLRFLRFLRFNQFNQFORIORIOQFOQFNPENPENNBNNBSQDSQDTRETREVSDVSDWTEYSCYSCYSCZSC[TD\UE\UE]TE^UF[OA[OA]OB^PCaSFdVIiYLi\LiaNibOidPidPidPhcOecNdbMfePfePedOedObdNbdNbdNacNcbPb`Qb`Qa_P`^O_]N_]N^\M_]N_]N_]N^\M\ZKZXIXVGWUFQMAOK@LH=LH=OI=OI=MG;JD6JB5IB2G>/D;,@7(=4%<0 ;0*!?+"@,#A-$A-$C.)B-(A,'@+&@+&A,'C.)D/*D/*E0+F1,H3.J50L72M83N94W?=ZBB\GF_JI`KJbMLeQPhTSdRPdRPeSQfTReVSfWTgXUgXUcURdVSgXShYTj[Vj[Vl[TkZSn[To\Uq]Vr^Wv_Ww`XybZzaZ{`Y|_Y~a[b\~c\~c\{b[zaZu\UsZSpYQqZRq]Tr^Up\SnZQmWLmUKmRKlQJkNHjKFjHFjHFjHGiJHjKIkMKoSRu[ZgfppʾϳͯϫѩԦ֤գ֢إݤݣݡܟܜۚۙݘݘݕޔݒޑݐސߏ⏯⏯␯启台台咳鐳鐳됵쐵쑶푵ﮨ蟐ijPsgJ``@MR1:F&3@".:(6$5%3%0#,!.#-#+#(!' %$$!!!!!!!!    !!!""##########"   ! ! ! "!"!! ! !                 ##"!"# %#&""''.".3'18,6>2?L=BSDI\MRdUZfW\cTY^OR[LOWHKUGGRDDPBAOA@L>=G98C54@03@03B44E:8D:8D=7NJA[YMVWIY\KadQknYrt_qs]kkSedHebAb^9e[7k]:t_@v^BoW=hP8dK7pSA~YGXG]IhRnYrZdMfMdH{`Cv[@sS'!B)"P4)X4&^-w0:):,;0921--)|/)`4+R5-V:7T:9S98O:7O:9M;9N<:M>;M?>N@?O?@L<=J79I68L7MI>PI?PJ>MG;KE9JB5IA4G=1D;,A8)>5&=1!<0 =0*!?+"@,#A-$B.%B.%A,'A,'?*%?*%?*%A,'B-(C.)E0+F1,G2-I4/J50L72M83N94X@@[CC]HG_JI`KJbMLeQPiUTeSQeSQfTRgUSfWTgXUhYVhYVeWTfXUiZWk\Wl]Xl]Xn\Xm\Uo\Vp]Vr^Wt`Yw`ZybZzc[|c\}b[b\c]d^e^d]|c\|c\v]Vt[TqZRr[Ss_Vt`Wr^Ur[SqYOpXNpUNoRLmNIkLGkIGjHFjHGkIHlJIkLJnPPuYXcbkjҹοſƽʶ̳ίҫө֦֥ף֦ܥݣݢܠܞۜۚۘܘݕޔݒޑݐޏގߎᎮᏯ⏮䎯䏰危史萳鏴돴됵쐵쑵率ې}r[cFb`AQ\;BR27G(0A#/:(5%4&2%.#+",#+#($&!% $##!!!!!!!!   !"""######"    ! ! ! ! ! !                   ""!!"# %!&"#((.".3'37+7<0:B7?GATEH]NSeVYiZ_gX[cTW`RRYKKVHGRDCPB?OA@M?ia:ob?ueDvcEo[BgU=aO9hO;qN;O=ZHhUkZkYgWdR[E~V=vT;rO9oF4m<-|B7}A9z?9q:3f7/[3)V2&V0%O[ku$}(.%4|,9d +V!Y%b#+h +u#/}!0p&^$[$)W$)M EGJ!JT'Z)c!/i%4g 2b-e0l'9a!/S"T&Z"-Q'J#G#?E!%F"&I&*K(,F"&A!I"'S/1J-)D'!I(Z2&f5&s05#>/L@OHIG99/-1-e6.Q6-T85Q76P65L74K65J86K97I:7J<;L>=M=>K;CL@DMAEMBFLCFHBDGACEABEQCEQCEQCFRDGRDHSEHSEHSEKSFKSFLRFLRFLRFLRFNQFNQFORIORINQHNQHMPGMPEMODMOBPPDQQESQETRETREUSFUSFUSDUTBUTBVSBWTCWTCZTD[TD[TDYPA[OA]OB^PCbREeUHgWJgYLi]Mh_Ni`OibPibPgbOfaNe`MgbOdaNdaNcbNbaMa`La`La`Lb`Qb`Sa_Ra_R`^Q`^Q_]P_]P_]P_]P_]P^\O\ZMZXKXVIWUHRNCPLCMI@MI>QJ@PI?NH2E;/B9*?6'?3%>2"?2!>1=0*!>*!?+"?+"@,#A-$B.%C/&D0'D0'A,'@+&@+&@+&@+&A,'C.)D/*G2-G2-H3.J50K61M83N94O:5X@@\DD^IH`KJaLKcNMfRQiUTfTRfTRgUShVTgXUhYViZWj[XhZYg\Xk]Zm_\o`]o`[q_[q`Yr_Ys^Yv^Zxa[{b]|c^}d_d`d`eafbgcgcfbfa~e`x_Zv]Xt]Wu^XuaZvb[t`Yt]Uu]Sv[PuXPrUMpRJoNGnKGmJFkHFkIGlJHjKHkMKpTQy]Zdavtũ͸ϼƽŹ˴̱ѮѪԨը֥רܦܤۢڠڞۜۚۘܗ۔ۓܑݐ܎ێݍ⌭⍮㍮䎯台捰揲ꎳꏳ폳펵䔅wa`FiV:PV8BU58P22F).?$-9'4%3&0%/%,%)#'#&$$!#            """###"              !   "$ &"'%(*,/#13'35)59-7>3;B7?LAGJ?EH=AI?@MCDPFEQGFPFEOAAUGG^ORgYYm^am__j\\gYX^POZLITFCQD>OA>M@:I;8F85C11@00C33D95D;6C<4JF=SSGZ[M]`OfgWpq_xyg{}h|{gyy_nnJmkDmhBrhDxiHvgHqaGk[BdT=aK6dA-{D0TBfXi\i_pjib^TXHXE|VAvP=tI8yE8{@8z=8y<7r;6j92`3-].&e.'s2,4417,7+9,:{-:_ )R!Q"W &^(k"-u!0o*d(a$+\#*T#NO R#R"U#Y$a)f-f-`)b+f1])T"V&Y!,S )L%E">A!>A"E"&F"&E#K"(T+/R,+O&"X)#l3*}7+6(;-C7^Xda[\AE1432i83R5/R63O54M32I41H32F42F42E63G98H:9J:;I9:I68J79M8=O<@N=CN?FN?FL?FJ?EH?DG>CD>BEQCEQCEQCFRDGRDHSEHSEHSEKSFKSFLRFLRFLRFLRFNQFNQFORKORKNQHNQHMPGMPGMODMODPPFPPDRPDSQETRETRETREUSFTRCTSATSAUTBVSBWTCYSCZSCYPAYPA]OB^PCaQDdTGfVIhXKg[Kf]Lh_Ni`Oi`OhaOg`Ne`Me`Me`Me`Mb_Lb_L`_Ka^K`_Ma_Pa_Ra_Ra_R`^Q`^Q`^Q`^Q_]P_]P_]P^\O\ZMZXKXVIWUISOFQMDNJANJARKAQJ@OH>LF:LD9JB7I?3G=1D;,A8)A5'@4$B5$A4!?2!>1 =0>1 >1!?2"=/"=/"=/"<.!<.#;-";-"=,";)<(=) =) >*!>*!?+"?+"@,#A-$B.%C/&D0'E1(F2)F2)C.)C.)C.)D/*D/*F1,G2-G2-I4/I4/J50L72M83N94O:5O:7YAA\DD^IH`KJaLKcNMfRQjVUgUShVThVTiWUiZWj[Xj[Xj\Yi^\j_]n`]pb_rc`rc`tb^tb^u`]u`[ya]zb^}d_~e`eafbhdhdiejfiehdhcgb{b]y`[v_Yw`Zwc\xd]vb[v_WyaWz_Tx[SuXPtSLqPIoLHnKGkHFlIGkIGiJGiJHmOMsWTz\Zig}{ūϹȿƼ˸͵Ѱҭժ֪רةڨܦۣڡڟٜٝۘۗ۔ۓڑې܎ێ݌ߌጭ⌭⍮䎯印捰掳ꎳꏳ폳펵闉{g]DkO5PN2AM05M//O11D).>%+7&2%1&/&-&*&&$$##" !          !!"""!                    "%!'$)(+-!/1%33'55)57+7;/9?4M@8H;3E82C41A2/B41D93B;3@<3FD8NNBZ[M]_QefVmn^tuezyg{zh{zeopPnnJokHsjIwiLwhKscJn^GiXDbL7_?*q<*I8\Og[lfpqnphfbX[MXE{VCzUCuIE-213h84R5/S53O54M32H30G21E31F42D52E76E76F67F67I68K8:N9>P;BP2F<0C9-C7+B6(C6%B5"A4#@3"?2!?2!@3#A4$?1$?1$>0#>0#=/$=/$<.#>-#<* =) >*!>*!?+"?+"@,#@,#B.%B.%C/&D0'E1(F2)G3*G3*F1,G2-H3.I4/K61L72L72L72K61L72L72M83N94O:5P;6P;8X@@[BE]GI`JLaKMcMOfRSiUVhVVhVViWWjXXiYYjZZk[[j\[k`^ka_ncapecsebtebvdbuc_va^wb_zb^|d`~eafcgchdigigjhjhjgifhdgc|c_za]x`\x`\yd_ze`xc^xa[zbX{`Uy]RvZOuTMrQJqNHoLFkHDlIEkIGhIFgHEiLHnROuVS`]omͳʺ̸дҰխ׭ت٫کܧۥڡڟٜٝۗږړڒِڏٍڍ܊ދጭ㍮䌯印掱鏲ꏳ퐴旋|jdKuK1NG,=K-7I,0H+-K.0B',<#)6%1$0%.%,%)%$$#$"#   !!!!"!                     !$!'$*&+-"21$54'86*86*67+7;/9>3;C8>C8dE1j=*>.K<_TlgenlvpvhfXP~M>rM;qR>rQ@pHB@=<9786BDKOGN1:&,r,._30P3/T64P65N43J52I43H64H64G85D65D65D45E56I68L9;N9>O:AO;DL;EK:DI9CE8AC8@C8@C8@EQCEQCEQCFRDGRDHSEHSEHSEKSFKSFLRFLRFLRFLRFNQFNQFMRKMRKLQJLQJMPGMPGMNFMNFNPENPEOOCPPDRPDSQESQDRSEORAORAPQAQRBSQBTRCWQCWQCZPDZPD]OD]OD`OEbQGeSIfTJgWJfYIh[Kh\Li]Mi]Mi]Mg^Mg^Mf_Me^Le^Ld]Kc^Kc^Kb\L`\P_]Q`^R`^Ra_Sa_Sb`Tb`T_]Q_]Q_]Q^\P\ZNZXLXVJWUIVRISOFQMDPLCTMETMEQJ@OH>ME:LD9LB6I?3G=1E;/E9-E9+D7&C6#B5$@3"@3"@3"A4$A4$@2%@2%?1$?1$>0%>0%=/$?.$=+!>*!?+"?+"@,#@,#A-$A-$B.%B.%C/&D0'E1(F2)G3*G3*H3.I4/K61M83O:5P;6P;6P;6N94N94N94O:5P;6P;6Q<7Q<9W??ZAD\FH^HJ_IKaKMdPQhTUhVVhVViWWjXXiYYjZZk[[j\[k`^ka_ncapecsebsebvdbucawb_xc`{c_~eaebgdhdieigigjhigifhegcfb}d`{b^x`\ya]ze`ze`yd_yb\x`Vy^Sx\QvXNuTMrQJqNHpMGjGCkHDkIGiGEgHEhKGlPMrSPZUfbxvũ˽ͺѵӲ֯֯حګګܧۦڣڠٜٝٙؖڕڒِڏٍڌۋߋጭ㎯厱珲萳둴쑵썆~ocLzS8YE(B7;E:>KABPFEQGEMCAJA5,A:0@<1<:.==1CC7NOASTFZ[Ma_ReaUfbVjcYkeYkiZjiWlgSmgQrfNtdMwbMwaLv_MrYEkN}$:u2j*i,g.b,\'Z%Z(P G K"L'G&F!(P+2F#)@"A#G&K )V(2e08p*2-36:?DAF=@45/2,11818(/k#'^((U/,O2.R63O54N43K63K65J86K97J;8F87D65D45E56J79M:N9@O:CM9DK7BG6@D4>B5>A4=@5=EQCEQCEQCFRDGRDHSEHSEHSEKSFKSFLRFLRFLRFLRFNQFNQFMRKMRKLQJLQJMPGMPGLOFLOFMODNPEOOCPPDPPDQQESQDQRDNQ@MQ@NQ@PQARPASQBVPBWQCZPDZPD\NC]OD_NDaPFdRHeSIeUHfVIhXKhZMj\Oi]Oi]Oi]Oj^Ph_Pg^Of_Oe^Ne^Nd]Mc]O`\P_]Q_]Q`^Ra_Sb`Tb`Tb`T_]Q_]Q_]Q^\P\ZNZXLXVJWUIVRITOIQMDQMDTMETMERKAOH>NF;ME:LB8KA7I?3G=1G;/F:,D7&C6#B5$@3"@3"@3"A4$A4$@2%@2%?1$?1$>0%>0%=/$?.$>,"?+"@,#@,#A-$A-$B.%B.%B.%B.%C/&D0'E1(F2)G3*G3*G2-I4/K61N94P;6Q<7P;6P;6P;6P;6P;6P;6Q<7Q<7Q<7Q<9U==Y@C[EG]GI^HJ`JLcOPfRSgUUgUUhVViWWhXXiYYjZZi[Zi_]ia^lb`odbrdardaucatb`wb_xc`{c_~eaebgdhdiehfhfighfhefc~ea}d`}d`{b^x`\ya]ze`{fayd_yb\u]Sv[PvZOtVLtSLrQJqNHrMGkEBkHDjHFjHFgHEgJFkOLqRO~UQ_Ymi}̷ʾͺѶӴ԰ׯد٫ګܩڦ٣ؠّٜٝٙؕٔ؏َ،׌ی⎯台揲葴ꑶ풷|qhVR8_N0HH)8E(-D'+C&*A&+A(.>%)7!$1 -+!*#($$$#%#% $"     !                              "$ ($!,(%0,&24)98+=;.?=1=@4>C8@C8@C8?MCBNDBMCAJA;M@:SF@_RJl_Wsf^qd\m`Wk^Ui]Qg[OeYMbVJ\PBSG9MA5D:.?5)>6+A;/@<0<:-;<.?@2EE9LL@VTH\ZN_[PaZPd[Td]Ule]le]lfZneTteRvdN|cOcNy^KtYFnUAiN;fC/k@-K:UJbigustzkj_W[N{\Jy_Nu[LvVKzTKUPUQQPOKzH?PFLHx;:o14l47e27Z)/T)e(7q(;|*@2I.Es((:%:'<&>#;y4o-j.f/\'N \'`-T$G K"J%A > G")A$@"D&I (L!*V(2g/8u,3/54>;E>G9A18,1)-{)/o(.f+1[*-O)(J-)K2-O30M32L21I41K65J86L:8K<9H:9E76D45E56K8:M:M8?O:CM7CK5AG3>C2NF;ME:MC9KA7I?3G=1F<0G;-D7&C6%D4$@3"B2"@3"C3$A4$B2%@2%A1$?1$@0#>0#?.$?.$>,"@,#@,#A-$A-$B.%B.%B.%A-$B.%B.%C/&E1(F2)F2)G3*E0+G2-J50M83O:5P;6O:5O:5Q<7Q<7Q<7Q<7Q<7R=8R=8R=:R=$'=$(>$->'/:%*5 %. +) ("$"" $%#$!$#                                    !  !"%!)&#.,&2.(66+<9.?=0B>1B>1B?3AB6BE9CGLB@MCALC>H?:H?:NE>ZQJh]Wod^mcZh^UgZQfYPgZQh\Pg[OcUHZLARF8D;,>7'=7'?<-?=.9:,9:,==1??5IF=SPGZUO\WQ_XR`YS`[Wiebifamf\ofWsfSxfPfRfSz]KsXGmVDjSAeL8`C1lE6HAW[WbbkioklfaaU_M}bOybP{_Q~^S\TWS{QRyMLQKWPMLw9:l.1m07e-6\$/b%4u0B0D0D6I-?t2u!1*<1u+s.q/m.m.r3s3w2x1v/x!4x%7m/\#X#^,T%J P%N&E?9:B$P'/U'2U#/Y#1e%3}+9.93?:F>Kg)6\(4[09V26I++F*'J1-L0/L0/J0/J20I43K65M98M;;M;;H89G46H59K8O:CM7CJ4@F2=D0;A0:B1;A1;JREJREJREIQDIQDHPCIOCHNBJPDJPDJPDJPDJPDJPDJPDJPDIOCIOCIOEJPDJPDKQEKQEKQEJPDLODLODLODLODLODLODLPBKM@LL@MMAQOCRPDTRFVRGXRFVPDXPEXPCYQD[QE\RF]SG^TH]TE^UD`WFaXGcZIe\Kg^Mf_Me\Kd]Kd]Kd]Kd]Kd]Kd]Kc]M`]N`]N`\P`]N`\P`]Nb\Pb\Na[Oa[MaYN_WJ]UJ\TG\RHZRGYQFWQEVNCUMBTLAUMBWODXPCSK>RJ=QI*!>*!?+"@,#A-$A-$B.%C/&B.%B.%B.%C/&E1(G3*H4+H5/H5/I60J71K82L93M:4M:4N;5N;5O<6P=7Q>8R?9S@:S@:VC?VC?WCBWEC[GF]KI`NN_OOcSSbTSdTUdVVeWWcWWfWZdXXcXVdYWf[Yj\[m_^oa`rbbuccsaaua`wcbyed{fe|gf|gf|gfolnkkh~ifzebxc`u`]v^\w_]w_]x`^ya_x`^w_]w]\v]YtYPsXMrVKqUJoSHnPFmOEnMDjI@hG@fE>eD=gF?jIBmLEmOGpSMx]V|_YhdɯϼͽѾѵϲѳմٲذ׫ըբԞ֜חהڑٍَڍ܍܎ݑߒ┶斸薺엺~~~~~~~蚔ЈwmT~Z=[G*>F,7C-0@,-=)+8#(5(1%+")")"(!("'!&#%"$!$!# !  !  !                             !$$  !""%& ,1)691@>5F>5F@5FA6FB7GD9GE;FF,A?*>=);<*:=,<>0>@3@B7;;3>;6D?=>EIX]hliia[`TfUpYkS|bQ~bVc^aa^bX^UXPQz?Ap/3w08:F{4Dk$6q(;~1C1A0;.9$/$04B0A} 2k'e)b.Z.X/\"1`,e&w-+=1D)<~-p)Y"S&O!J PW%V%KD=>F#U-`5i!9s :+B1E5E6B9F>N~8Po0Mn5Ud2O\,BV,:S.5T23R23O11L..K/.L/1K12L23M34M47L69L69N7=P9?R;CQ:BO8@K4>H3F2=D0;C/:A-8@,7=,6KQEKQEJPDJPDIOCIOCIOCHNBJPDJPDJPDJPDJPDJPDJPDJPDIOCIOCIOCJPDJPDKQEKQEKQEIOCIOCIOCIOCIOCIOCIOCKNCKMBMMCPMDQNEROFSPGUQFVRGVPDVPDWQCXRDZRE[SF\TG\UE]VF]VD_XF`YGb[Id]Ke^Lf_Me^Le^Le^Le^Le^Le^Le^Ld_La[M_\M_\M_\Ma[Ma[Ma[Ma[MbZMaYLaWK`VJ^TH\RF]QE[QEZPDXPCVNAUM@TL?UM@VNAWOBSK>SK>RJ=PH;ME8IA4F>1E<-H8+G5'F4&D2$C1#B0"C1#C1#@. @. @. @. @. @. @. @. >*!>*!?+"?+"@,#A-$A-$B.%C/&B.%B.%B.%C/&E1(G3*H4+H5/H5/I60J71K82L93M:4M:4M:4N;5N;5O<6P=7Q>8R?9S@:UB>UB>UC?VD@YGE\JH\LL^NNbRRaSRbTTcUUcWYdXZeY[eYYdXXeZXhZYj\[m_^oa`rbbsccr``saauccweezfgzfgzfgzfe~lj}kg|iezgcxeaub^u`]t_\w_]w_]x`^ya_z`_y_^x^]w^Zv[RuZOtXMrVKoSHmQFlNDkMCjI@iH?gF=eD;gElJAkMEhOHqZTt[V}d_ywŧܿ׾ӿϿκζеҵԵֱ֬Ԩդؙ֛ٖ֟ܓېۏ܏ޏߏޒޒܓ┶㖸蘹엻~~~~~~~~~}}}}}ᗊifHjT4KF*8E+4A-/>+-:'+6#)3'1')#(#'"'"&!&!% % $##""!!!!  !                                 "#&&#!!"#$$%#(*"/5-:<4CA8IB9LB9LC:KF;LGFG:AE9=D8:F::J<=CB@AC@EECPOM^ZYd`]g_]c[XaVR`UOcTOgXQhWPaPHZGATC9F=,B=)=:':9'9:*:<.>@3BB8A>9B=:FA>NHHQMLSSQ^`_foll}wt|y|pxgygubo]wbQxaQwbOubQtaPs[OuRNwKJsC?~GBOMXTXTZSh[ygp\o\l[mbninljofjUXQTBFz26}-61?|)=l/z&=,?/=7@?G6>-85A;K1B&8p2`.Y.\#4g*:f.i#v"-"5/v!c S!N%O$MR Z$\&S!R&L%J%Q)a2m!;y$C$C*F.E0B~0>w4Es9Ok5U^/Sc5\_3W[.KW-CW.*5=)4KQEJPDJPDJPDIOCHNBHNBHNBIOCIOCIOCIOCIOCIOCIOCIOCIOCIOCIOCJPDJPDKQEKQEKQEIOCIOCIOCIOCIOCIOCIOCKNCLNCMMCPMDQNEROFSPGUQFUQFVPDVPDWQCXRDZRE[SF\TG\UE]VF]VD_XF`YGb[Ic\Jd]Ke^Le^Le^Le^Le^Le^Le^Le^Ld_La[M_\M_\M_\Ma[Ma[Ma[Ma[MaYLaYL`VJ_UI]SG\RF]QEZPDYOCWOBUM@TL?SK>SK>TL?TL?SK>RJ=QI8R?9R?9TA=TA=UB>VC?WECZHF\JH\MJ`PP`PPaSScUUeWWgYYfZ\g[[dXXeZXhZYj\[l^]n`_qaarbbq__r``tbbvddxdexdexdewcbwecweawd`vc_ta]s`\s^[s^[v^\w_]x`^ya_z`_y_^x^]w^Zx]Tw\QvZOsWLpTImQFlNDkMCkJAiH?gF=eD;fD;gEgIAbIDkSOoVRu\Xmkոƾ̽иѴжԴղׯիקأ٠ۜۘޕݔޓߒ⓴ᓴߔޕ㖷䗹阹엻~~~~~~~~~}}}}օwmT~W8XJ*AD(6B(1=*.8(+5%(4!'1%.%("'"&!&!% % $$###""!! !  !                               !!#$''%$%&% &#($)',.&3:/=A6FF=PG>QH?RI@QLARMBRNCQNDOQEOODLM@GJ>BH<@H<>K5$:3#85&<8,A?3EB9GC:FA;JE?QQIUXQU_V]j`cwno{zsyizjZyhVwhUviVxkXyfWy[PxSJqK@uI76";%; 3k$WK K$O%O R W"W%U$N M!R"Y&h/w!<&E'B/E.B,@x+?n.Fi4Nb3SY0R\2V\2V^2S[0LY/EW.@U/P6?M6@K4>I2(4='3='3JPDJPDJPDIOCIOCHNBHNBGMAIOCIOCIOCIOCIOCIOCIOCIOCIOCIOCIOCJPDJPDKQEKQEKQEHNBHNBHNBHNBHNBHNBHNBJMBMODNNDPMDQNEROFSPGTPETPEUOCUOCVPBWQCYQDZRE[SF\TG]VF^WE^WE`YGaZHb[Ic\Jc\Je^Le^Le^Le^Le^Le^Le^Ld^N`ZL^[L^[L^[L`ZL`ZL`ZL`ZL`XK`XK_UI^TH\RF[QE\PDYOCWMAUM@TL?SK>RJ=RJ=QI/H8+G5'F4&D2$C1#B0"C1#C1#A/!A/!A/!A/!A/!A/!A/!A/!@,#@,#@,#A-$A-$A-$A-$A-$C/&B.%B.%B.%C/&E1(G3*H4+H5/H5/I60J71K82L93M:4M:4L93M:4M:4N;5O<6P=7Q>8R?9TA=TA=TA=UB>VDBXFDZHF\JH]MM^NN_QQaSSdVVfXXfZ\g[[cXVdYWgYXi[Zk]\m_^o__p``o]]p^^r``saauabuabt`at`_p^\p^Zq^Zq^Zq^Zq^Zq\Yq\Yt\Zu][w_]x`^y_^y_^x^]w^Zz_Vy^Sw[PtXMqUJmQFlNDjLBkJAjI@hG>fECJ?CGCDDBCDBCJHIVRS^XXd[\f\[k__h][ueexuvtp^\]IHXFBM<2F8+@2';/#9/#>6)D>2IC7JC9HD9OMAY[N^fW]n\azedulzyyg}r`vkYujVwjWzhTz]MxTDnJ6E7I.A);+>,B&=.G0L4N6N0F&5f)U#I L#R&S"T TT"W %KT`#k){6&D,K,G0D.B+Hu+Nk.Wd4^_5]Z4[V.SY1T_3W_1U[.MW,GU.AV2>U4;U79V8:U79R59O26K.3G,1K07L18L2;L2;J3=H1;F/9E.8E/;D.:C-9B,8@*6?)5='3='3JPDIOCIOCHNBHNBGMAGMAGMAHNBHNBHNBHNBHNBHNBHNBHNBIOCIOCIOCJPDJPDKQEKQEKQEIOCIOCIOCIOCIOCIOCIOCKNCNPEOOEQNEQNEROFROFSODSODTNBUOCVPBWQCYQDZRE[SF[SF]VF^WG^WG_XH`YIaZJb[Kb[Kd]Md]Md]Md]Md]Md]Md]Mc]M^XJ\YJ^XJ^XJ^XJ^XJ_WJ_WJ`VJ_UI^TH]SG]QE\PDZNBXNBUK?TL?TL?SK>QI8R?9R?9U@;U@;TA=TA=VC?XEAYGEZHF[KK\LL^NN`PPaSSdVVeWWfXXbWUcXVfXWgYXhZYj\[l\\l\\lZZm[[n\\o]]q]^p\]p\]o[ZjXVjXTlYUlYUmZVn[WoZWoZWrZXs[Yt\Zv^\x^]x^]w]\v]Yz_Xy^UwZRtWOqTLmPHlNFjLDkJCjIBiHAgF?fC=eBaEAgNJjNKoSP{][hfħ׼ȼ¼ӹϻԹֶ׳دحکݦޣ᝻ᚺᙹ☷㙸晸昷㘸ᘹ智登뙺혼~~~~~~~~~}}{||{r[HuJ/RG&AD$9=!09!.5!,0)-'+"*) % #""!"!! !     !                 #%&"#%$##%"( %#(&+( -.#15*8>3AE:JNEZOF[SG]UI]VJ^VK\WJ\VIZYKZWIVUGTREOQALO?IN>HK>EF@DD?CE@DJEIRLPZTVaX[dZ[l`bh\\uefwxtvq___MM\JHQ@9K:2D3+<.%;.%A5)F<0KA5JC3MG7VSBbeRft]gekpnvĒx|kwp^ujXzkXkVeQaNsOCnLBoO@zUCZJbWqp߀xyui}crdocgZa}CR@Q|8Gw-<{(8-=2F2G7K6F1<2:9=49289CDPBQ=M1B,?0B,?$6*=.A2E.@)8p#-\!'Q $N #R!$Y &\$Z!VU Z#_#p +3 9&F1R3Q.H'9%>t%Rm)df/r^1tY2kW3cQ+TW/T^1X_1X\.SX,MU/HT2BQ28Q35R38S49R38O26M05L/4I.5I.5I06I06H.7G-6F,5C,4F1:E09D/8B-6A,5?*3>)2=(1IOCIOCIOCHNBGMAGMAGMAFL@HNBHNBHNBHNBHNBHNBHNBHNBIOCIOCIOCJPDJPDKQEKQEKQEJPDJPDJPDJPDJPDJPDJPDLODNPEOOEQNEQNEROFROFSODSODTNBTNBUOAVPBXPCYQDZREZRE^WG^WG^WG_XH`YI`YIaZJaZJb[Kb[Kb[Kb[Kb[Kb[Kb[Kb[K]WI[XI]WI]WI]WI]WI^VI^VI_UI^TH]SG\RF\PD[OCYMAYMATJ>SK>SK>RJ=QI1E<-H8+G5'F4&D2$C1#B0"C1#C1#B0"B0"B0"B0"B0"B0"B0"B0"C/&C/&B.%B.%B.%A-$A-$A-$C/&B.%B.%B.%C/&E1(G3*H4+H5/H5/I60J71K82L93M:4M:4N;5N;5O<6P=7Q>8R?9S@:TA;VAVC?XEAYGEZHF[IIZJJ\LL]MM^PP`RRbTTbTT`US`UScUTdVUeWVgYXhXXiYYiWWiWWjXXkYYlXYlXYkWXjVUgUSgUQiVRjWSjWSkXTmXUmXUoWUpXVrZXs[Yv\[v\[u[Zu\Xx]Vw\SvYQsVNpSKmPHlNFkMEkJCjIBiHAhG@hE?fC=fC=dC>bFCeLHgKHlPMvXV}_]vvͲԽʽûӿпսֹ׷سٮثܧݥࢿᠼ᝻᜹᜹㜹圹嚺㚺㚹皻蚺뚻~~~~~~~~~}}{||~~~臂cVJ3]D'FD$IL?HD:BABHBFOIMWNS]RX`UYk_cfW\hW]qadtaeiVZbOScPRTEBN?:H62B1*?1(C5*I;.MA1NB2QI6[VBfjSk{^ok{Нךƍs|tg{n^n]r]q[r_g]]TtTGtSB~TDXObfky{}ykefx]kP]}9N}9P|7Jz1B},;+;&;%94H;L>IAHAG5)2=(1<'0IOCHNBHNBHNBGMAGMAFL@FL@GMAGMAGMAGMAGMAGMAGMAGMAIOCIOCIOCJPDJPDKQEKQEKQELRFLRFLRFLRFLRFLRFLRFNQFOQFPPFROFROFQNEQNERNCRNCTNBTNBUOAVPBXPCYQDZREZRE^VI^VI^VI_WJ_WJ_WJ`XK`XK`XK`XK`XK`XK`XK`XK`XK`XK]WI]WI^VI^VI^VI^VI_UI_UI`TH`TH_SG]QE\NC[MBZLAXL@SI=SI=SI=SI=QG;ND8KA5J@4LB6LB6LB6KA5J@4H>2E;/F:,H8+G5'F4&D2$C1#B0"C1#C1#C1#C1#C1#C1#C1#C1#C1#C1#D0'D0'C/&C/&B.%A-$A-$@,#C/&B.%B.%B.%C/&E1(G3*H4+H5/H5/I60J71K82L93M:4M:4O<6P=7Q>8R?9S@:TA;UBXE?ZGCZHDZHF[IGZJJ[KK\LL^NN^PO^PO^SQ^SQaSRbTScUTdVUeUUfVVeSSfTTgUUhVVhTUhTUfRSeQPfTRfTPhUQhUQiVRiVRkVSkVSlTRmUSoWUqYWsYXtZYtZYsZVvZVuZStWQrUOoRLmPJlMHkLGkJEjIDjIDiHCiFBhEAgD@fE@cECdHGdFDiKIrTRtVTiiϸͽźټ׺صذج٩ۦޤߢឺ᝹᝸㝸㞹䝺䝺䝹蜻電욻~~~~~~~~~~}}{zz{~~}~딎ujP>n>&J@#?B"78-7-2+,*('&!##$! "!!            """!!    !"%) ," -) ( (&## &#)&+*"/0%34)79.<@5CI=KNCSNBXPD\UG^WI`YL`XK_WH]VGZXGYWFXVEWUDTTBRQ?MP>LN>IA6>@9@E;CI?GNDLUJRYNV]PWhY`cT[aPXcRXeTZeTZgTZeUXUIIPECK<9E61D3,G6,K;.N>/TE2VI6`U?ggMkzYunܸň|wnpdn]q\r[uaqibZySFtO?yO?OGPSSanstmkl]uK`@V=Q8G3A0=.;+<);/C6I:K?OCR8H0C9G4914/3,4'2%2*81?4B2?,8%0)207v08k*0g&,g &q(|%.(1{&-x&,&/)9,C(G C#E*I%Ay5g8YKStTP#J!H#K'O'eS(VW&UY(UY,WW/TP2LO2DN.9M,3K*1I(/H)/J+1L-3M05H*2E*1E*1D)0C(/C(/B)/B)/B+3A*2@)1>'/=&.;$,:#+9"*IOCHNBHNBGMAGMAFL@FL@FL@GMAGMAGMAGMAGMAGMAGMAGMAIOCIOCIOCJPDJPDKQEKQEKQEMSGMSGMSGMSGMSGMSGMSGORGOQFPPFROFROFQNEQNERNCRNCSMATNBUOAVPBXPCYQDYQDZRE^VI^VI^VI_WJ_WJ_WJ_WJ_WJ_WJ_WJ_WJ_WJ_WJ_WJ_WJ_WJ\VH\VH]UH]UH]UH]UH^TH^TH`TH_SG^RF]QE\NCZLAYK@YK@TH2J@4J@4J@4J@4I?3G=1D:.E9+H8+G5'F4&D2$C1#B0"C1#C1#C1#C1#C1#C1#C1#C1#C1#C1#E1(D0'D0'C/&B.%A-$A-$@,#C/&B.%B.%B.%C/&E1(G3*H4+H5/H5/I60J71K82L93M:4M:4P=7Q>8R?9S@:TA;UBXC>WB=WB=XC>XE?ZGC[HD[GFZHF[IIZJJ[KK[KK\LL[ML]RP]RP`RQ`RQaSRbTScSSdTTcQQdRReSSeSSfRSeQRdPQcONfTRfTPgTPgTPhUQhUQiTQjURjRPkSQnVTpXVrXWsYXsYXrYUtXTsXQrUOqTNoRLmPJmNIlMHjIDjIDjIDjIDkHDjGCiFBgECbDBbDD`B@fHFoQOoQOaa̶Ͼǹ׻ֲַ֮׫ةݥݣߠߠᠷ㠸䟺垻垺鞺霺으}}}}}|~~~~~~~~~}}{zz{}~~||}ጁiZC0]9 @?#:= 22%3+1,++%(#"""#  !!             #"""!     !"$'+" .$"/#-$!,# +!)%%"(%+*"/.&35*89.<>3AD9GMAOSFWNAUOCYTF]WI`XK_WJ^VG\TEXVEXVEWUDVTCUSAQQ?OO=MM=J>2<@6>E:BJ?GNCKSHPXKTZMVbR\bR\cR\cRZgV`jYakWbeT\WMNRHGN@?J86G6/H7-L:.O>.XG5[J6`T>dcGhwVwr˝Վ~xrodjYiUjSlX`RREsH7xK8Q?QEPMNYNcZwdhqwiUmMbDV7E0;0;5A:J>P/B/D,B1HVH=TH2I=1H<0G;/H:-H8+H6(E3%B0"@. @. A/!A/!B0"B0"B0"B0"D2$F4&H6(I7)J6-I5,G3*E1(D0'C/&C/&C/&@,#A-$B.%C/&E1(F2)G3*H4+I60J71J71K82L93M:4N;5O<6Q>8Q>8R?9S@:TA;UBZC=XA;UA:U@;VAXE?\IE[IE[IG\JH]KI[LI[KK[MLWLJXMK\NM_QP`RQaSRbRRbRRgUUfTTfTTfTTgSTgSTfRSfRQgUSgUQgTPgTPgTPiVRkVSlWTkSQlTRnVTpXVqWVqWVqWVpWSrVRtYRvYSsVPoRLlOInOJpQLoNInMHlKFkJEjGChEAfC?eCAcDBcCDgGHlLMmNLpQO}__npѼӿ̼˽ʾǼƾӾҹҶԳִ۲ާڦۤݣߤ㣺㤹䣺䡹基垹蝹蜺으}}~~~}{{|~~~{w~݀p]K}B-T489 5?$34*0).**+&)$%! !!                     !  !  """"""""!!      #%'%$$%(!-%#1(&3&"0(".'!-'!-',',&+&+,!//$25)7<0>D8FK?MQCRSFWOBVPCWQDXSFZUF[WH]XI\YJ]TCVUDWVCVUBUR?RN;NL7JG5E;.8>3;E8AL?HQDMTGPXHRXHRcS^bR]bP\aPZbP\cR\eS_fV`[NUSGKN>?N:;H51D1*L8-XE6bO>dR>dU@_]DctTyxէ嗮|ppper`nXiSfPWB|N7~J2R;V@R@PEPNPXZlXrXufkc~`xOdJZGW7C.92=3@=N:N)A.HEdHi6Z3ZDfAYEXK]?O0>5B7F+84C4A5F.E9W1S#C'B(>{/d1SCFdBDH#H&C"AM&yP$_S!TS"OS%SN(OH)HD(>H(5K'1K'1H'0H'0H'0G(0G(0D%+C&+B%*B%*?$)?$)>#(=$*?%.<"+: )9(;!*;!*8'6%IOCHNBHNBHNBGMAGMAFL@FL@GMAGMAGMAHNBHNBIOCIOCJPDIOCIOCIOCJPDJPDKQEKQEKQENTHNTHNTHNTHNTHNTHNTHPSHQSHRRHTQHSPGSPGROFSODSODTNBTNBTN@TN@UM@UM@VNAVNA[SF[SF[SF\TG]UH]UH]UH^VI^VI^VI^VI^VI]UH]UH]UH]UH]UH]UH]UH]UH_UI_UI_UI_UI`TH_SG^PE\NCZLAXJ?XG=WF2I=1H<0I;.I9,H6(E3%C1#A/!A/!A/!A/!B0"B0"A/!B0"C1#E3%G5'H6(I5,H4+G3*F2)D0'D0'C/&C/&A-$A-$B.%C/&E1(F2)G3*G3*I60I60J71K82L93M:4N;5N;5P=7Q>8R?9S@:TA;UBZGCZGCYGEZHFZHF[IGYIIZJJXJIWLJ[ML^PO_QP`RQaQQaQQeSSeSSeSSfTTgSTgSTgSTgSRgUSgUQgTPgTPgTPhUQkVSlWTlTRmUSoWUpXVrXWrXWrXWrYUsWStYRvYSsVPoRLmPJnOJpQLoNInMHmLGkJEkHDiFBhEAgDBfDEdDEfFGkKLlMKnOMz\\kjŮ͸ͼϿ˾ż½ӾԼնճذ٪٨ۧܥާ⥻䧺䥺壺梺桹韺韻ힼ~~~~~~}|{~~~~~~{wvcS@n?)M47619#02).(,*'*%)#'!! !!                             """"""""!!     !#%'''&'*!-%#1)%3)#1)#/)#/(".)!.( -( -( -/$22'57+9>2@E9GK?MQCRSEVNASOBTPCWQDVTEZUFYWH[WH[UDWUDWVCVUBUR?RM:MK6IH3D=-8>18E5?IdUBa_HcvZx~ٯ敪yppshualTdNbLW=U9W=^F^GVDQDQJ~LOR^NbPkdk_|ZsYlL]@Q/=)5-:*80@:O0H.K6W4Y*S,W5^9Y8S9Q1G/BEVO_@P6D>J=J=HBK9C-6-80=*:$6$7*:3B8F8I)D3P1R/J5K0>r"/_ 3P"FF"lDF!F$G&D$C"EvGZLNNJN NL#MF$ED$#(?&,<"+: ): );!*;!*8'6%IOCIOCHNBHNBGMAGMAFL@FL@FL@GMAGMAHNBHNBIOCIOCIOCIOCIOCIOCJPDJPDKQEKQEKQENTHNTHNTHNTHNTHNTHNTHPSHQSHRRHTQHSPGSPGROFSODSODTNBTNBTN@TN@UM@UM@UM@UM@XPEXPEYQFYQFZRGZRG[SH[SH\TI\TI\TI\TI\TI\TI\TI]UJ^TH]SG]SG]SG_SG_SG_SG_SG^PE^PE^MC\KAZI?XG=WE;VE;RD9RD9QC8QC8QC8QC8QC8QC8PB7PB7OA6N@5M?4L>3K=2J8R?9S@:TA;UBWD@XEAWECXFDXFDVGDVHGVKIZLK\NM^PO_QP`PP`PPcQQcQQdRReSSgSThTUhTUhTSgUSfTPfSOfSOgTPhUQjURkVSlTRmUSoWUqYWsYXtZYsYXsZVtXTuYUvYUsVRpSOnQMoPMpQNpNLoMKnLJlJHlIGjGEiFDiFDhFGfCGhFGlJKjKIlMKuWUdctvì͸ҾӿͼǼŽĿֿոԴկծڭܫߪ᫽㪽嫽媽祼椼裻롼렼~}}~~}}~zzbND/X9&F252,2 ,-'*'()&*#(!& ! !##""!!!!!!!!!!            """"""""!!!   "$&' +*)*!,$ /'#2*&4,&4+%1,$1+#0+#0*"/,!/,!/3'55)79-;?3AE7FJ-7?05C2:G8?M3V@5\I;cSFa`Ndwawߺ厧zt~ynluht_vfOr\Gy]HvR8Y?cLgS^NPAJ?|IE~PRS\L_Sljsjc~avSeGW9I5D3C+:)7;L;P9U3R.R2X>gGm?b7W/L!=$':&;,>7HBRFY9T5Q+H(>,SK>UMBVNCVNCWODWODXPEXPEXPEZRGZRGZRG[SH[SH[SH\TI\TI]SG]SG\RF\RF^RF]QE]QE]QE\NC[MB\KAZI?XG=WF3L>1J8,I7)H6(F4&D2$C1#B0"B0"B0"A/!@. @. A/!C1#D2$E3%F2)G3*G3*G3*F2)E1(D0'C/&B.%B.%C/&D0'D0'E1(F2)F2)H5/H5/I60J71K82L93M:4N;5P=7P=7Q>8R?9S@:TA;UBMN@OQ@PSBRTCSUDTYFYYFYZEXXCVT?RO:ML5II2BA-6?/2A06D39J9?P?GWFN[JT\KU[JTYGSXFRVDRUCQTBPSAMUAMU>HY;EX9?U8:Q76O;4Q=6R>5ZF?aPI_[R^sds|u|ojqod`zl_ylYl]HjUDvYGqK4W@bPaRRED;zA:tD@}SUV`ObSlfmklbv\lWiObHZ?Q5D/?:L@W@]5X0U8`GnOsBd=]6W'F"@6Q=V-B8F7J=USK>RJ=RJ=SK@SJATKBTKBULCULCVMDVMDWNEXOFXOFYPGZQHZQH[RI[SH\RF\RF]QE]QE\PD[OC\NC[MB\KA[J@ZI?YH>XF1J8,J8*I7)H6(F4&D2$C1#B0"A/!A/!@. ?-@. A/!B0"C1#E1(F2)G3*G3*G3*F2)D0'C/&C/&C/&C/&D0'D0'E1(E1(E1(G4.H5/I60J71K82L93M:4M:4O<6O<6P=7Q>8R?9S@:TA;UA:V?9X?8X?8X?8W@8W@8W@:T@9S>9S>9R?;S@KP@MQANSAOTBPZEVZEVZEVYDUV?QR;MM6HJ3CB/5B/1B/3D15I6:P=CUDJYHP[JRZIQYHRXGQUEPRBMQANQ?KS?KU>HY;EY:BX;?U==Q>:O<6S>;YDC]KKXRRVfcgɹsf{ko{e_ceXRo_Pn^NfUCiRDxVJ{L8tA>tHIxMTS`NdLiUuW|\gdufrduZoL_=R;L;M;O;S5V0X.X2\7`9\3S8W@c;_2X=bDg;Y4J6F:E=F:F9H7K4I6IATHaF_DJ>CI=CI=EK?EK?EK?FL@FL@GMAGMAHNBIOCIOCIOCJPDJPDKQEKQEKQEMSGMSGMSGMSGMSGMSGMSGORGQSHRRHTQHSPGSPGROFSODSODUOCTNBTN@SM?SK>RJ=QI3L>1K9-K9+J8*J8*H6(F4&D2$B0"A/!@. ?-?-?-?-A/!A/!C/&E1(G3*H4+H4+F2)D0'C/&D0'D0'D0'D0'D0'D0'D0'D0'G4.G4.H5/I60J71K82L93L93N;5O<6P=7Q>8R?9S@:TA;UA:V?7X?8Y@9ZA:YB:XA9W@:V?9S>9S>9R?;S@0?B4CF5EH8EH;EIIMU?AQ?=L:8Q=T5O0L,O2X7`7^3W0Q%B*G;]Bf:d/:w6>v7@m/O#:K%2H$.G!.H"1J$3L&5M)5O+7Q-7R.8G&-G&-F',E&+E')D&(C&(B%'B(+?$)="'="'>#(>#(; %9#DJ>DJ>CI=CI=BHEK?EK?FL@FL@GMAGMAGMAIOCIOCIOCJPDJPDKQEKQEKQEKQEKQEKQEKQEKQEKQEKQEMPEQSHRRHTQHSPGSPGROFSODSODUOCUOCTN@RL>RJ=QI[J@ZI?ZI?YH>YG=XF3K=0K9-K9+K9+K9+I7)G5'D2$B0"A/!@. ?->,>,>,?-@. B.%D0'G3*H4+I5,G3*E1(C/&D0'D0'D0'D0'D0'D0'D0'D0'G4.G4.H5/I60J71K82L93L93N;5N;5O<6P=7Q>8R?9S@:UA:X?8[@7ZA:[B;[B;ZA:XA;W@:T?:T?:T?:U@;TA=UB>UB>TB>UGFUJHYKJ[ML]ON^PO_OO_OOcQQcQQcQQcQQdPQeQReQReQPeSQdRNdQMdQMeRNfSOiTQjURhPNjRPmUSpXVsYXtZYu[Zu[Zy]ZvZWtVTsUStVTtVTrSQoPNkIHkIHkIHkIHkGGkGGkGGkGGpINiEIhDFkIJkLJiJHkMKqSQpTSqUTx^aot˱ȶö¶ʿʽϻѹԷطܴߴꬿꩾ맽졻~~~|||~]_8/Z. 9(2(2"*!)!'  " # %!&%$$$##"""                           """"""""""##$%%&(('''( )!*%.%.$-%.(!1,%5/(82,:1)81)63(62'52'51&42&42&45'67)89+:=/>C2BF5EI8HK;HH;DH;DLNR;KO9EG35G34G34H45J79N;=Q>BS@DTCITCKUDNTCMRBMO?JM=HK;FE8AJ9AL5?K28L69Q=>L<c;^9T:T0K(E0P<^7^3Z:a?cA]=TBUBU;O=R@\9T=S6L.K2Q;V?XW'=W%>T"=R>P#(>#(DJ>EK?EK?FL@FL@GMAGMAIOEIOEIOEJPFJPFKQGKQGKQGJPFJPFJPFJPFJPFJPFJPFJPFQRJRRHRRJSPGSPGROFROFSODSODUOCTNBRL>QK?QIRJ?SI@RJ?TJATLAUKBTLASI@SK@UKBUMBXNEXPEZPGZPFZPDZPD[OCZNBXL@WK?VJ>VH=YK@XJ?XJ?WI>XG=WF4N>1M<2M=0K9+K9+L:,L:,J8*G5'D2$C1#A/!@. ?->,=+>,?-?-A-$C/&F2)I5,I5,G3*E1(C/&E1(E1(D0'D0'D0'D0'C/&C/&F3-G4.H5/I60J71K82K82L93N;5N;5O<6P=7Q>8R?9S@:T@9W@8Y@9ZC;[D<[D>ZC=XA;UA:U@;U@;U@;VAVC?VC?UC?WHEWIF[KK]NK_OO_PM_OOaOMdRRdRPcQQcQOdPQdPOdPQcONeSQdRNcQMcQMeQPfRQgSRhTSePOgRQjUTmXWqYYs[[t\\t\\w]\tZYsWVrVStXWtVTqSQnOMhIGjHGjHGjHGkGGjFFjFFjFFpILkDGhDFmIInLKjKImNLrSQxZZuWWx[]fjpv|įòĵĸºϿѻӷԹٸ۶޵笿騿륽뢽젼읽~~}|z|wzzWT1)P+"7*!4' 0*!+"*  ! # %!&!&!&$#$"#!"!                       !!!!!!!!!!!"#$ % % %!( ( (&''"*"*%-#+$,%-) 1,&41(94,;3(63(64(63'53'52&43%42$38*99+:>-=B1AF5EI8HL;KN>KJ:EK;EMJRAKUAMUAMUAMWCOYBRZCSXAQV?OSQV>Z@b8XC^B\?^>\=X;R:L9IEW1D3F@QZ&=V';S)7N*.H)$E&#K(/K'5K'3J&2H'2H'0G(0F'/F).F).E(,E(*D'+D')C&(C&(B(+?&*="'<#'?$)=$(CI=AG;@F:?E9@F:@F:AG;AG;AG;BHNJ?OI=OI=PH=QG=RHSI=VI@UK?WJAVL@VI@TJ>WJAVL@YLCWMAZMDXNBUK?UK?UK?UK?UK?UK?UK?WK?WK?VJ>UI=TH0Q;0O9,M7,J7)D2$D2$D2$D2$D2$E3%E3%E3%@. @. ?-?->,>,=+=+=+!>,"@.$B0&C1'D2(D2(D2(D2(C1'C1'B0&A/%@.$@.$?-#B/)C0*D1+F3-I60K82L93M:4O<6O<6P=7P=7Q>8Q>8R?9R?9VB;VB;VB;VB;VAWD>XE?XEAYGCYGCZHF[IE\JH]KG^LJ_LH^JI_LH`LKaNJbNMcPLcONdPOdRPbSPaROaROcQQcQQcQQbPPhUWhUWhUWhUWjW[lY]o\`q]_oY[rZZsYZrXWpVWnRQjNMhJJfGEfGEhFEhFEhECgDBhBAgA@hDDiEEjFFlHHnJJoMLqONrPOvTUxVWzW[~[_bhms{Ų̺˽ƼӾԻֹڸܷ߷榼ᢾ墿}}||ztvvxlkND-&G'#4 +'')!) (!(#("'#'"'#'"&"& $!# "!" !                        ! ! "!!!%(#(%*#($)"'$)"'',%*(-( -,!1+#0.#3/$24&56&36&36&36&37'47'47'49)6;+8>,:A/=E3AH6DJ8FK9GN9HO9FO9FP:GQ:JQ;HQ:JR;KXAQXAQZBRYAQX@PV>NT./?/2A14@16=49=;>@DGBKRNVkV[xd_e\{^ToZLeZI[_IUiJRtPTzWU|VSuRLsNFzMHOHSHSFSERDSJ~SM~RSRWO[L]MbQeLbEYFZJ_@YSwWNOOKPFsCW=H:I8U6\6a7_Aa5U:bIuJyIwFl?^AVDVHYG[C_AcAkCmCiDf=_:X:Q3D7AKQBH8?9D|:Fd*8T!0U&6U+9^2Cd5Ge2Ea*=e*>n1Cq2Cl/?f->c.>_/=\0=Y19T04O-,K+,M,3M,5K,4I+3F+2D+/A+.@*-D.1B,/B,/C-/E/2E/1D+.A(+?&*='*>%):$':!%5"41DJ>CI=BH<@F:@F:@F:AG;AG;BHEK?FL@FL@GMCGNFGNGHOHHOHIPIIPIJQJJQJJQJJQJJQJJQJJQJJQJJQJKPJMPINOINOIOPJPPHQQIQQIRRJOLCNKBOK@OK@NJ?NJ?OI=PH=RHWK?WK?WK?VJ>WK?WK?WK?WK?XL@XL@XL@VL@VL@VL@VL@VL@VL@VL@VL@TJ>TJ>SI=RH,>,>,=+!>,"@.$B0&C1'D2(C1'C1'D2(C1'C1'B0&A/%A/%@.$@.$B/)C0*E2,G4.I60K82M:4M:4O<6O<6P=7P=7Q>8Q>8R?9R?9UBWD>XE?YFBZGC[HD\IE]JF^KG_LH_LH_LH_LH`MIaNJbOKcPLdQMcQMcQOaROaQQbRRbRRbRRbRSbRSgWZgWZgWZgWZhW]jY_l[ap]ao[]q[]s[[rZZqWXmSTkONiMLeGGfGEhFEgEDgDBfCAgA@gA@gDBhECjGElIGnJJpLLrNNrNNvRTxTV{W[~Z^`djnu|~ʴ̺Ⱥ¸ļ¾׿ٽܼ޹޸޵ᨿߤ~}}}}zrttvpjPC{+%A%#1+(( )!) (#)#)#(#(#'#'$&"% $ " "!!                            """! !""##$$"%'$'$'%(%(%(%(%('*(+),*-,!/.#1/$20$26&37%37%37%38&48&48&49'5;)7<*8>,:A/=D2@G5CI7EL7FN7GP8HP8HQ9IQ9IR:JR:JR:JX@PX@PYAQYAQX@PV>NT00=//<..=11E77G:APEUWK_aOeaNbYHXRBOQ@JV?GdEKnKOwPQwQPsNHrKDzJF~MFXNXKUISIRMRSRXR_YlQgLdOgPeK\FVEUGZVxSFJW\bNzJXAD=D;V;c=jk;b1U1P9P5E3;?BBBn67l39k6>d08Q>8R?9R?9UBWD>WD>YFBYFBZGC[HD\IE]JF^KG_LH`MI`MIaNJbOKcPLdQMeRNdRNbPN`QNaQQbRRcSSdTTdTUeUViY\iY\hX[hX[iX^jY_l[ao\`p\^r\^s]_r\^rZZpVWnQSkONgIIgGHhFEgEDgCCfBBeB@eB@gDBgDBiEEkGGmIIoKKqMOrNPvRVwSWzVZ|X\[bcjnuuw}«ɶȹĸȾ޾޻ܴݮߪ}uvv{mfM?t)#?$"0 +) ) )'%#)#)#(#(#'#'"&"%!%!#!# " "!!!                   ##""!!! """##$$# $&$&%'&(')')(*(*)+)++-, .."0/#10$22$36&37%18&28&29'39'3:(4:(4;)5<*6>,8@.:C1=E3?G5AJ6BN8EO7EO7EP8FP8FQ9GQ9GQ9GU=KV>LW?MW?MW?MV>LU=KTJ39D/4B.0>*,;(*:')<)+>+-@-/=*,<,-;+,9)*7'(7))<,->/4HZ?DdFHmKLoMKmLGmJDuJDyLGYRWQTNRNQSSYU`VeYnMeC\E\I^FX=K6EDZNnHz>H]im^~ZdOTFP@[@eAh@eBc6Z8h@w?{A}Dz?oBh@b@`AdDnEwE}E|FuAj3Y4U@Z=Q3@5>DH~9CI=BH<@F:@F:@F:AG;AG;EK?EK?EK?DJ>DJ>DJ>DJ>DJ@ELDELEFMFFMFGNGGNGHOHHOHIPIIPIIPIIPIIPIIPIIPIJOINQJOPJOPJPQKQQIRRJRRJRRJPMDOLCPLAOK@OK@NJ?PJ>QI>SI=UI=UI=UI=VJ>VJ>VJ>VJ>WK?VJ>VJ>UI=THUI=TH,"@.$A/%B0&B0&A/%A/%B0&B0&B0&B0&B0&B0&A/%A/%B/)C0*E2,G4.I60K82M:4M:4N;5N;5O<6O<6P=7P=7Q>8Q>8TA;TA;TA;TA;TA;TA;TA;TA;TA;TA;TA;UBYFBYFBZGC[HD\IE]JF^KG^KG`MI`MIaNJbOKcPLdQMeRNdRNaOM`QNaQQbRRcSSeUUeUVfVWjZ]iY\iY\hX[iX^kZ`l[ao\`q]_s]_t^`t^`t\\qYYnTUnQShJJgIIfGEfDCfBBeAAeB@eB@fCAfCAhDDjFFlHHnJJpLNqMOtPTvRVxTXzVZ|W^]delkups{į˸ʻ˿۽ڹڵ߱zxy}e\C5f'!;#!/ +*!* )&$#)#)#(#(#'#'"&"%"$"$"$!#!# " "!                ###""""""###$% % % $#$&%'&('))+*,*,*,*,, .-!//#10$21%33%27%17%18&29'3:(4;)5;)5<*6<*6=+7?-9@.:B0F4@H4@M7DN6DN6DO7EO7EP8FP8FP8FR:HS;ITLU=KTNV>NU=KU=KS;IR:HP8EO7DL5?J3=I2M8G>UB_=d=sIYcfkpi|YrGo@o@l?lAs=sDLFC?7wG|EtDmFmGqFsAr=mHrEl:^8VA]=T2D3?3<387;:>~=AGNCKg/c/W8>V7=S6;O49M27H25G14E13E24D13B/1D02G14F03D+/A(,;%(:$'9#&8"%7!$6 #7!$7!$CI?BH>@FTJ>VJ>VJ>VJ>UI=UI=UI=UI=VJ>VJ>UI=TH/P>0O=/N;-L9+J7)H5'H2%H2%E2$C1#C1#B0"A/!A/!@. @. A/!A/!@. @. ?-?->,>,=+!>,"@.$A/%A/%A/%@.$?-#@.$@.$A/%A/%A/%A/%A/%A/%A.(B/)D1+F3-H5/J71K82L93M:4M:4M:4N;5N;5O<6O<6O<6R?9R?9R?9R?9R?9R?9R?9R?9S@:TA;TA;TA;UB*6?+7@,8A-9A-9B.:C/;E1=F2>G3?G3?L6CM5CM5CN6DN6DO7EO7EO7EO7EP8FR:HS;IS;IR:HQ9GQ9GTH1;F/9F/9G08H19F/7D-3@)/>(+:$'7!$6 #6"$8"%9%'6 #7#%8$&8$&6"$6"$9%'<',K7BP@S9<[=?dBCjFFnGHqGHxGJxJJuMMsMLwJM|KQLVP]UeVlSlOkJfGbI^M^M[N]F[>VFBOu7Fi4Dg8Hg;JfZ0<\2<_4>b4>b4>[2:T04P03Q46U8:Y:@X9?V9>R7D:>D:AG=AG=AG=AG=BH>BH>BH>BH>CJCCJCDKDDKDELEELEFMFFMFHOHHOHHOHHOHHOHHOHHOHINHLOHMNHMNHNOIPPHPPHPPHQQIQNEPMDQMBQMBPLAOK@QK?RJ?UK?WK?VJ>VJ>UI=UI=TH/Q?1P>0O<.M:,K8*I6(H5'G4&E3%E3%D2$C1#B0"A/!@. @. @. ?-?-?->,=+=+=+>,"?-#@.$@.$A/%@.$?-#>,">,">,">,"?-#?-#@.$@.$@.$?,&@-'B/)D1+F3-H5/J71K82J71K82K82K82L93L93M:4M:4P=7P=7P=7P=7P=7P=7P=7P=7S@:S@:S@:TA;TA;UB*6@,8A-9B.:D0F2>G3?G3?L4BL4BL4BM5CM5CN6DN6DN6DM5CN6DO7EP8FO7EN6DM5CL4BQ9IR:JT%+H.7L2=S8AVDR=BP:=P7:T68[8SV26O/2O24S68Y8?Y8?W8>U8=R7(+<&)9#&6 #5"5"6 #7!$?E;>D:=C9D:>D:?E;@FBIBBIBCJCCJCDKDDKDELEELEHOHHOHHOHHOHHOHHOHHOHINHJMFLMGLMGMNHNNFOOGOOGOOGQNEQNEQMBQMBPLAPLARL@RJ?UK?WK?WK?VJ>UI=THVJ>VH=VH=VH=VH=VH=VH=VH=VH=UG0O=/P>0O=/M;-K9+I7)G5'F4&E3%G5'F4&E3%D2$C1#B0"A/!@. >,>,>,=+=+<*<*;)>,"?-#@.$@.$@.$?-#>,"=+!;)<* <* =+!=+!>,"?-#?-#>+%>+%@-'B/)D1+F3-H5/I60H5/H5/I60I60J71J71K82K82N;5N;5N;5N;5N;5N;5N;5N;5R?9S@:S@:TA;TA;UBG3>G3>G3>G3>K3@K3@K3@L4AL4AM5BM5BN6CL4AL4AM5BM5BL4AJ2?I1>H0>L5EN7GP:GR)2?*1@+2?*1>'-:#)=$(<#';"&:!%7"5 3147!7!557!;#D',H)/N/5S4:U8=R8;Q48O13T15[28c6;k:@s;Dx^;B^?EY<@W8=Y9>_:Ae=Ei@HeX7>W8>V9>T9>S:>Q;>P<>P<>N:D:=C9D:?E;@FUI=THWK?WK?WK?UG0O=/N<.M;-L:,J8*H6(F4&D2$C1#H6(G5'F4&E3%D2$B0"A/!A/!=+=+=+<*<*;);):(>,"?-#@.$@.$@.$?-#=+!=+!:(:(;);)<* =+!>,">,"<)#=*$?,&A.(C0*E2,G4.G4.G4.G4.G4.H5/H5/I60I60I60M:4M:4M:4M:4M:4M:4M:4M:4R?9R?9S@:S@:TA;TA;UB_A?aCCcEEeGGgIIhJLiKMiJOlMRqRWsTYsTZsTZvW]xYapOX}Yejuu|Ȯɯɱ̶кؾںݶ}jvWU}LB]3*=-%2&+"'"'$)$)$)!&!&"%"%!$!$ # # "!!                          !""$$% % &!&!'"'",&,&-&,&,%+%,%+%1 *1!+3",3#-6%/7'19(29(2:&1;'2<(3>*5@,7B.9C/:D0;H4?H4?H4?H4?H4?H4?H4?I3?J2?K3@K3@K3@L4AM5BM5BM5BK3@L4AL4AK3@J2?H0=F.;E-:J4AL5EO9FQ;HQ;HP:GM7CK5AG2;C.7>)2=(1>)0>)0=(/<',9"(<#'=$(=$(;"&7"5202764357D$)I&*O,0S36V69U58R25R01T-2Y/3b17i4GFM;H+?/J6R9U>XThETCOFP:E3@9Gx;JyCPh9C]3=`;BbBG^?D[V9>U:?T;?S=@S=@P<>O9>C<C<>CUI=UI=THXG=VE;UD:TC9TC9UD:UD:TC9SB8RA7Q@6P?5P@3P>2P>0P>0O=/O=/N<.N<.N<.I7)I7)I9*I9*J:+J:+K;,K;,G5'H6(H6(G5'E3%C1#A/!?-=+=+<*<*;);):(:(<* <* <* <* <* <* <* <* >,">,">,"=+!=+!<* <* <* ;(";("<)#>+%?,&@-'A.(B/)C0*D1+E2,F3-H5/J71K82K82L93L93L93M:4N;5N;5N;5O<6P=7P=7P=7P=7Q>8Q>8Q>8Q>8VC?VC?VC?VC?VC?VC?VC?VC?[HD[HD[HD\IE\IE]JF]JF\JF_MK]NK^NN^NN^NN^NN_OP_OPaQTbRUcSVfVYhW]kZ`l[am\bm^am^an_bo_`m]^n[]mY[mWYfPRfNNdJKaGHaDF`DC_CB_CB\@?]A@^AC`CEbEGdGIeHLfIMkNSlOTmPUoRWpRZrT\sU]uV^zYb~Zd_iirt}ǭ̲Ҹ׽׽۸ߴ|uffWOg90A+ .(+),!$"!&$$#"   !!!!!!                ""!!!#$% $$% % &!&!'"'".'.%0%.%0%.%0%.%1&1 (4 )2!)2'1 (7#,:&/;'0<'0>)2?*3A,5C.7D/8E09G2;F1:F1:F1:F1:F1:E09E09L5?L5?L5?L5?L5?L5?L5?L5?K4>J3=H1;F/9E.8E.8E.8F.;I3@I4CK7CM9EN:FN:FN:EN:EE1:B.7>*3;'09&,:'-;(.>).<%+<&)>%)=$(<#':!%9#8"68 :!8559<!?E!H$&J()K)*K)*N*,O++O&*X.0c58j7`DYGNGL>OFgV=AV@CQ;>P:=O9>C<C<>CE>?F?@G@AHABIBDKDELEFMFGNGHOHIPIJQJKPJLOHMNHNOINOIOOGNNFMMEMMESPGSPGSODSODRNCRNCSMATLATJ>VJ>VJ>UI=UI=TH4N=3M<2M=0N<0N<.M;-M;-L:,L:,K9+K9+I7)I7)I9*I9*J:+J:+K;,K;,H6(H6(H6(G5'E3%C1#A/!?-=+=+<*<*;);):(:(<* <* <* <* <* <* <* <* >,">,">,"=+!=+!<* <* <* ;(";("<)#>+%?,&@-'A.(A.(B/)C0*D1+F3-G4.I60J71K82K82L93L93M:4M:4N;5N;5N;5P=7P=7Q>8Q>8Q>8R?9R?9R?9VC?VC?VC?VC?VC?VC?VC?VC?YFBYFBZGCZGC[HD[HD\IE[IE[IGYJGZJJ[KK\LL\LL]MN]MN^NQ_ORaQTcSVeTZhW]iX^jY_j[^j[^k\_j[^jZ[hXYiVXhTVdPQcMOcKKaGH_EF_BD_CB_CBZ>=X>=\?A[AB_BD_EFbEIaGJhKPgLQjMRiNSmOWmRYpRZpRZzYb~Zd^heooxyɫԶ܂pq`Xo<4C.#1*-+ .#&!$#(!&$#!   !!!!!              !!  !"#$$% % &!&!'"'"(!0%0#0%0#0%0#0%0#1&2%4 )3 &2'3 &6"+:&/<'0=(1>)2@+4B-6D/8F1:F1:J5>I4=I4=I4=H3J3=H1;F/9E.8E.8E.8E/;H2?H3BJ6BL8DM9EM9EM9DM9DF2;D09?+4<(19&,9&,:'-;(,:%*;%(<&)=$(<#':!%9#8"68 9 8669>!?BG !G##I"#J#$M%&O'(L$%V,.b58i8r;@uLDWL`NdKcI_@W?UJISMWIq?Jo=HjV5V;@W>BP:=O9C=C=>C=?D>?D>?D>>E>=D=VJ>UI=UI=UI=UI=TH4N=3M<2L;1K:0J9/K9-L8-L9+L9+K8*K8*J7)I7)I7)H8)H8)I9*I9*H;+H;+I<,K;,H6(H6(H6(G5'F4&C1#A/!@. =+=+<*<*;);):(:(<* <* <* <* <* <* <* <* >,">,">,"=+!=+!<* <* <* ;("<)#<)#=*$>+%?,&@-'@-'A.(B/)C0*E2,F3-H5/I60J71K82K82K82L93L93M:4M:4M:4P=7P=7Q>8R?9R?9S@:S@:S@:UB>UB>UB>UB>UB>UB>UB>UB>WD@WD@XEAXEAYFBYFBYFBYGCWECUFCVFFXHHYIIZJJ[KL\LM\LO]MP^NQ`PSbQWdSYfU[fW\dX\eY]eY[eY[fWZeUXcSTdQScOPbLN_IK_FI\DD\BC\BC\BCU;W??Z@C[BE]CF\CFbGLbIMdIPdKQgLSgNTjOXlNXuT]xT^{Wa\fbljtq{vu|έ߾݇ts`XmB7G2&2, ,-!-$%"#&'#$! !!!!               !"#% % % &!&!'"'")"1$2"2$2"2$2"2$2"1#3#4&4$2$3#7"):%,>'1?(2A*4C,6E.8G0:I2K4>J3=L5?L5?L5?L5?L5?L5?L5?L5?K4>J3=H1;F/9E.8E.8E.8E/;G1>G2AI5AK7CL8DL8DL8CK7BH4=E1:A-6=)29&,8%+8%+8%)9$)9%':&(;%(:$':!%9#8"678888;> =@CDDEJ !M#$P((Y11d:;l@Al>@j<j>?h7=q5?6F?QH]J_GZBRHJR}AIw@Fp=Dl=CkBFnGJoKMpLNb>Bb;@c:BeV7=T9>U:?U<@R9=P7;O6:O6:P5:N38K.3D).C*.?),;%(7!$3 1//BGAAF@?D>=B<C=>C=?D>?D>?D>?F?>E>VJ>UI=TH4O>4N=3M<2L;1K:0J9/J8,N8-N8+N8+K8*K8*J7)I7)H6(H8)H8)I9*G:*H;+H;+I<,I<,H8)I7)I7)H6(F4&D2$B0"@. =+=+<*<*;);):(:(<* <* <* <* <* <* <* <* >,">,">,"=+!=+!<* <* <* ;("<)#<)#=*$>+%>+%?,&?,&@-'@-'A.(C0*E2,F3-G4.H5/J71J71J71K82K82L93L93L93P=7P=7Q>8R?9S@:S@:TA;TA;TA=TA=TA=TA=TA=TA=TA=TA=UB>UB>UB>VC?VC?WD@WD@VD@UCATEBUEEWGGYIIZJJ\LM\LM\LO]MP^NQ`PSbQWcRXeTZdUZcW[bW[cWYcWYdUXbSVaQR`PQ`MO`LM^HJ[EG[CCZBBZ@AYAAT<>W??X?BY@CZAD[BE_FJ_FJaHNbIOdKQeLRfLUhMVlMUnMVsOYwS]|Xb^hcmfpkuoyvšݷꚡ˄nexF:H3'3, ,, ,$$"#%&!"! !!!!               !"% &!&!&!'"(#(#)"1$2"2"2"2"2"2"2"1!3#4$3#2"3#6!&:%*?(0@)3A*4D-7F/9I2L5?N7AN7AM6@M6@L5?K4>J3=J3=L5?L5?L5?L5?L5?L5?L5?L5?K4>J3=H1;F/9E.8E.8E.8E/;D0G3*3:'-7$*6#)5"&7$(7$&8%'9%'8$&8"%8#8"567789:==@@A@EN T#&O!#V((_13f66f66d42a54b67a28k/;0A9MCZG[BT:GCm>DjAEkDGlEHlEJi@FeV9>T9>S:>R9=P7;N59N59O49M27J-2D).D+/@*-<&)7!$3 0.-BGAAF@?D>>C=C=>C=?D>?D>?D>?F?>E>VJ>UI=TH4O=3N<2M;1L:0K9/K9-P:/O9,O9,N8+L9+K8*J8*J8*H8)H8)G:*G:*H;+G;+H<,I<,H8)I7)I7)H6(G5'D2$B0"A/!=+=+<*<*;);):(:(<* <* <* <* <* <* <* <* >,">,">,"=+!=+!<* <* <* <)#<)#<)#=*$=*$=*$>+%>+%>+%?,&@-'A.(C0*E2,F3-F3-I60I60I60J71J71K82K82K82N;5O<6P=7Q>8R?9S@:TA;UBUB>VC?UC?VDBTEBVFFWGGYII[KK\LM]MN^NQ^NQ_ORaQTbQWcRXeTZdUZaVZaX[bW[bW[bVX`TV`QT`PQ_LN]JL[GHXDEWACV@BX@@W??V>>T?>U?AV@BWACXBDXBEYCF\EK]FL^GM_HNaJRbKSdMUfLUhJTkKVoNYsR]xWb~]h`jblfpkup{xÞ졢ΉpcwJ'/?(0A*2D-5G08J3;L5=M6>N7?N7?M6>L5=J3;I2:H19H19L5=L5=L5=L5=L5=L5=L5=L5=K4E4cFdCX4BFu>Dq@DqBHrEJxKRsFMm?Ih?GgBJeFLbGLbGLdAHd?Ga>E\;BY:@W:?T9>T9>S:>P7;O49N38P38N16L-3G*/D+/@*-<&)7!$3 0.-CHBBGA@E?>C==B<=B<=B<=B<=B<=B<=B<>C=>C=?D>?D>?D>>E>=D=VJ>UI=UI=UI=SG;SG;SG;RF:QE9QE9QE9QC8Q@6R@6R@6R@6R@6Q?5Q?5Q?5P>4P>4O=3N<2M;1L:0K9/K7,O9.P8,O9,N8+N8+K8*J8*J8*H8)H8)G:*G:*G;+G;+H<,I<,I9*J8*J8*I7)G5'E3%C1#A/!=+=+<*<*;);):(:(<* <* <* <* <* <* <* <* >,">,">,"=+!=+!<* <* <* <)#<)#<)#<)#<)#<)#<)#<)#<)#=*$>+%@-'A.(C0*D1+E2,H5/H5/H5/I60I60J71J71J71L93M:4N;5O<6Q>8S@:TA;TA;R?;R?;R?;R?;R?;R?;R?;R?;R?;R?;S@TB>VDBUFCVFFWGGXHHZJJ[KL[KL^NQ^NQ_OR`PSaPVbQWcRXcTY`UY_VY`UY`UY`TV^RT^OR]NQ[KL[HJZFGWCDV@BT>@V>>V>>T?>T?>U?AU?AV@BWACWADWADZCIZCI\EK]FL_HP`IQaJRdJSjLVlLWpP[tT_zYd~]h`jblakfplwuĜ颟ʉ{o]sOAP8+5- *+($"#!$# !!!!                     !"#&!'"'"(#(#)$)$*#3#4!4!4!4!4!4!4!4!5"7!$6 #5"6 #9#&='*=&.>'/A*2D-5G08J3;L5=M6>O8@N7?M6>L5=J3;I2:H19G08L5=L5=L5=L5=L5=L5=L5=L5=K4E^CH`EJdAHd?Gc>F^=D\;BX;@W:?T9>T;?Q8C?=B>=B>=B>>C?=B>=B>=B>>C?>C??D@?D@?D@E>?F?@G@AHABIBBIBBIBCJCDKDELEFMFGNGINHHKDJKELMGMNHPPHPPHPPHPPHSPGSPGSODSODRNCRNCSMATLATJ>VJ>VJ>UI=UI=TH4O=3N<2N<2M;1M;1M;1M;1L:0K9/J8.I7-H6,I5*M7,N6*M5)L6)K5(I6(G5'G5'H8)H8)G:*G:*G;+G;+F=,H<,I9*J8*J8*I7)H6(E3%C1#B0"=+=+<*<*;);):(:(<* <* <* <* <* <* <* <* >,">,">,"=+!=+!<* <* <* <)#<)#<)#<)#<)#<)#;(";(";("<)#=*$?,&@-'B/)C0*D1+G4.G4.G4.H5/H5/I60I60J71J71K82L93N;5P=7Q>8S@:S@:Q>:Q>:Q>:Q>:Q>:Q>:Q>:Q>:R?;R?;S@TB>UCASDATDDTDDUEEVFFWGHWGH\LO\LO]MP]MP^MS_NT`OU_PU\QW[RW\SV[RU[PT[OS[LOYJMZJKZGIYEGVBDU?AS=?S=?S=?R<>R<>R<>S=?S=@S=@T>AT>AV?EV?EW@HYBJ[DL\EM]FP`FQdHTgIUjLXnP\sS^vVayXczYd}Yc^hcnjuv֬޺ԴѴеϸϼ۠rWFV?/:0#-.!+(&'%'&! !" !!!!!                !!  !"#$'"'"'"(#(#)$)$+$5$7"7"7"7"7"7"7"7"9 $:!%:!%8#9 $=$(@'+>$-?%.B(1E+4H.7L2;N4=O5>T:CS9BR8AP6?O5>M3-5:)/6%+3"(2"%0!$/##2$$3%%4$%6#%6"$6 #5 22368788<=>C P f#w%1ejs#z(!,$,}&.|'.*5(6'<+@/G1F0C/>3B-?/F1M*M+R.W)V%Z0k5{9@OZ\T_yrgYXSCDmJhDmApFyAr:e=_?W9HALKTEM?IANAQ6P9R8P6J5G6E:I>N6I8K:N}8Jn5Db4?Y8?Z;Ad?Gd?Gc>F_>E^=DZ=BX;@V;@V=AR9=P5:O49Q49P38N/5J-2A(,='*:$'7!$4!210BHDAGC?EA>D@=C?=C?=C?=B>>C?>C??D@?D@>D@;B;SG;SF=SG;SF=RF:RE,">,">,"=+!=+!<* <* <* <)#<)#<)#<)#;(";(";(";(";(";("<)#>+%@-'A.(B/)C0*F3-F5.G4.F5.H5/H70I60H70I60I81K82L;4O<6P?8R?9RA:P>:P>:P>:P>:P>:P>:P>:P>:Q?;Q?;R@TB>QB?PB?QCBQCBQCBQCBRDDRDDXJJXJJYJMZKNZKN[LO\MP\MPYNRYNRYNRYOPXMQWKMWHKVGJYIJXHIWDFTACS?@R>?Q=>Q=>N:;O;P<>QCU@EVAHXCJYDK[DL[AJ^CL`ENcHQgISiKSlLWlMUuT]{WaZe]hgozڬ㪱槯㦮बۢ֡ҠΠ̡̣̣̣ˢˡ˞ȞʡǢƣƥɩ̰θϽ괷ꪬ߯峳鼸Ļóگ}`IYG1>9%14$/,)*(+)$#$#!"   !!!!                   "!!!#$% '"'!)")"*#*!+"- 5$7"7"7"7"7"7"7"8#:!%;"&;"&9 $:!%>%)A(,;$*<%+?(.B+1H.7K1:N4=O5>W=HVJ3;H19F/7E.6E.6G-6F/9F0-5=)29&,6#)2"%0!$0""3#$4$%4$%6#%6"$6 #5 1/1576448:;@P i%{#1|!0&3.95@:FZ<_0[-]1d-d)j2z67=M\c]e|ul__[KOVOI{MK}HrPqNfI[P\T\NSNRRZR^RjSnQjMaHZEUGWJZGZL_QdL]COm:Ca8@^9@c>Fc>Fb?F`?F^=D\=CZ=BWQ6;O49Q49P38N16K.3A&+>%)<#'8#4!222?LC?LC@KC?JB>IA;F>:D<9C;;E=;E==D==D==D==D==D==D=?F?=G?>E>>E>?F?AHACHBDICDICDICFHCGIDHJEHJEHJEJKFKLFLKFLKFNKFNKDNKDNKDOJDQMDSLDSLBRKAQJ@QH?PH=PH=PH=PH=QG>PH=QG>QG=QG>QG=QD7L>5N>1M;-L:.J8*I7+H6(I7+I7)I7+I7)H6*H6(G5)G5'F4(F4&E2$E2$G1$E2$E2$E2$E2$E2$G4&F4&E3%E3%F4&H6(I7)J8*N;-N;-M:,L9+J7)I6(H5'G4&B/!A. ?,=*<)<)<)<)9%9%:&:&;'<(=) =) ;';';'<(=) =) =) >*!;(";(";(";(";(";(";(";(">+%=*$<)#;(";("=*$?,&A.(@.*>/*A/+A2-D2.C4/F40E61G51E61H62H94K95K<7N<8L=8K<7K<7L=8L=8M>9M>9N?:N?:L=8L=8M>9N?:O@;PALA?MB@NCAODBPECTIGTIGUIIUIIVJJVJJWKKWKKTHJTHJTHJSGGSGITFFTFFSEEOAAOAAO?@N>?M=>L<=K;M=>N>?N>?O?BO?BP@CR?CT?DU@EXAGZCI_FLaHLdIPgJOjKQmNTrQXxW^`glt{ˏΊɇŃÔÖÖØƛȟ̤˧Ҳغ긲ഭٵԵϭ­ëvTeW5FC'6=%30*)$)&)&,!))&$!!                                  "! ! ! !""&%&&'),/3 6!6!7"7"8#8#8#<#'<#';"&:!%:!%;"&<#':$';');')=)+?+-D-3H19L5=N7AT:GU:IWM5BK4>K1\H`BWEXT_VYGG>?DHBR?TFXKYGRKUPZKWMYMXLUJQFLvBFoT7!&7!431,*KB>KB=JA;H?:E=9D<>E>>E>>E>>E>=G?=G?>E>>E>?F?@G@CHBDICEGBFHCFHCGIDHIDIJEIJEIJELKFLKFNKFNKFNKDNKDOJDOJDSLDRKCRKAQJ@QH?QH?PH=PH=PG>PG>PG>PG>PG>PG>QG>QG>QD7M>7L>5O=1M;-L:,J8*I7)H6(I7)I7)I7)I7)H6(H6(G5'G5'F4&F4&E2$E2$E2$E2$E2$E2$E2$E2$F3%F3%E2$E2$F3%G4&I6(J7)L9+L9+K8*J7)I6(G4&G4&F3%B/!A. ?,=*<)<)<)<)9%9%:&:&;'<(<(=) :&;';'<(<(=) =) =) <)#<)#<)#<)#<)#<)#<)#<)#;(":'!9& 9& 9& ;("=*$=,%<*&;,'<-(=.)>/*?0+@1,A2-A2-B3.C4/D50E61F72G83H94H;5H;5I<6I<6J=7J=7K>8K>8G:4G:4H;5I<6J=7K>8L?9K@:H=;H>KA?LB@MCAMCAQGEQGERHFRHFSIGSIGTJHTJHUGGUGGTFFTFFSEESEERDDRDDN@@N@@M??L>>K==J<>L>>L>>M??N@@N@@N@@R?AS@BVBDXDF\FI^HKaHLcHMiLQkNSoPVtU[{Zaelryy}}z|{zyxyyxzw|wzzz{|~ĔƗɚțʞ̤ҭ׶̼Ŷ΅ظϵȴYka8JH&7A%35,,&- )+ (.!*+''!$$ !                         #!"!"! !""('((*,-.3 5 6!6!7"7"8#8#<#';"&:!%9 $9 $:!%;"&:$'9%&8&&:&'<(*?*/B-2F/9H1;P5DR7FT9JU:MV9OU8NR4LP4JM6HK6EJ5DI4CI3@I3@I1>I1>K3@J2?K1AoACpBDq@CnADkCKiFMhGNgFMeDKa@G\=CY:@YKB>KB=JA=H@>E>>E>>E>>E>=G?=G?>E>>E>>E>?F?BGACHBEGBEGBEGBFHCGHCHIDHIDHIDJIDJIDLIDLIDLIBLIBMHBMHBQJBQJBQJ@PI?QH?PG>PH=PH=PG>PG>PG>PG>PG>PG>QG>QG>QD7M>7L>5O=1M;-L:,J8*I7)H6(I7)I7)I7)I7)H6(H6(G5'G5'F4&F4&C0"C0"C0"C0"C0"C0"C0"C0"D1#D1#C0"C0"C0"D1#F3%G4&I6(I6(H5'G4&F3%E2$D1#D1#A. @->+=*;(;(;(<)9%9%:&:&;';';';':&:&:&;';'<(<(<(<)#<)#<)#<)#<)#<)#<)#<)#8%8%7$7$8%9& :'!:)"9'#8)$8)$9*%:+&;,'<-(<-(=.)>/*>/*?0+@1,A2-B3.B3.E82E82E82F93F93G:4G:4H;5C60C60D71E82F93G:4H;5F;5F;9E;9F<:G=;H>J@>NDBNDBNDBOECOECPFDPFDQGESEERDDRDDQCCQCCPBBPBBPBBM??M??L>>K==J<>L>>M??Q>@R?AT@BVBDZDG[EH_FJaFKgJOiLQlMSnOUtSZ|[belkoonnlpnqopponokoirktktkvmxm{q|s}uy{}ūѶ˻Ƶ⽭Ժϵɱ°csg>NJ(8A%17!-1 (3$+/")/"++''#%"%##$"                          ! ! #"#"#"!"##'()+--.-223 3 4!4!5"5"9#&8"%7!$6 #6 #7!$8"%9#&7#$6$$7#%8$&9$)<',?(2@)3K0?M2AP5FR7JT7MT7MR5KP4JM6HL7FL6CK5BI3@H2?H0=G/I1?I1AG0@G2AF1@C/;@,7?'4;$.;!*8!'7"'6#%7#%7#%8$&8$&9#&9#&;"&:!%8#42.,** , 07@J Q XZ RR VW`igl%o&ot(.<+;+%/'A/O*S#R"Y)dZ d(k*m&m&t*13@Li~}k`_WKPS{Fk;`DiIlDb@YPgDW=NEPKQHJEMNYFSBMzEMtGLf?Bd@BjAEc:>`6:b9=c?AdDEfHHgIIgGHiFJhEKjGNjIPkJQiHOdCJ]>DY:@[>CZ=BY9I?=JA>KB?LC?LC?JB?JB=G?=G?=G?=G??F??F??F??F?>H@=G?>E>=D=>E>>E>AF@BGADFADFADFAEGBFGBGHCGHCGHCIHCIHCKHCKHCKHAKHALGALGAOH@OH@OH>OH>PG>PG>PH=PH=PG>PG>PG>PG>PG>PG>QG>QG>QD7M>7L>5O=1M;-L:,J8*I7)H6(I7)I7)I7)I7)H6(H6(G5'G5'F4&F4&C0"C0"C0"C0"C0"C0"C0"C0"C0"B/!A. A. A. B/!C0"D1#F3%E2$E2$D1#C0"C0"B/!B/!A. @->+<);(;(;(;(9%9%:&:&:&:&:&:&9%9%9%:&:&;';';'<)#<)#<)#<)#<)#<)#<)#<)#8%8%8%8%9& :'!:'!:)"9'#7(#7(#8)$9*%9*%:+&:+&<-(<-(<-(=.)>/*>/*?0+?0+A4.A4.B5/B5/C60C60D71D71A4.A4.B5/C60D71E82F93D93C86B86C97D:8E;9F<:G=;H>J@>KA?KA?LB@LB@MCAMCANBBOAAOAAN@@N@@M??M??M??L>>K==J<P=?R>@T@BWADXBE\CG\CGbGLfINiJPjKQnMTuT[]dbheefchhkkkjhfead^h`jakamcofrgsltnys|vy|~}}}Ⱥ۲̪iujAOM)5D&0:#+6"+5&-/")- )*&&"$!%###"!                            !! ! #"#"!""##&(+-//.-11223 3 4!4!7!$6 #5"5"5"5"6 #6"$7#$6$$6"$6"$6!&8#(:#+;$.D*7G,;J/@N3DQ4HR5KQ4JO4GL5EK6EL6CK5BI3@G1=G/D-=E0?D0*5=&0:#+: )6%6"$6#%7#%8$&9%'9%';%(;%(<#';"&9 $6!3/,*$ * 3=GP T YS M MQZef!i&n*p)r!&+9/?0*)4%@ D?H%\PW _%f)j-s158EIVqwra\d`UNnUoMiHhUw[}SoKbcwScDODLKNORU`boJWvGQpHPhIN\BE\CF_EHZ=AfGLgJNhNQhOReOQbLNaHKbEIbAHhELjIPlKRkJQgFM`AG\=C\?D[>CZ=BX;@S8=O49K05I.3G(.C$*= %8"7!5 0-8G@9HA;JC=LE@MF@MF?LE?LE>IC>IC?HC?HC?HC?HCAGCAGC>H@=G?>E>=D==D==D=?D>@E?CE@CE@CE@DFAEFAFGBFGBFGBGFAGFAIFAIFAIF?IF?JE?JE?NG?NG?NG=NG=OF=OF=OGPG>PG>PG>PG>PG>QG>QG>QD7M>7L>5O=3M;/L:.J8,I7+H6*I7+I7+I7+I7+H6*H6*G5)G5)F4(F4(C0"C0"C0"C0"C0"C0"C0"C0"B/!A. @-?,?,@-A. A. C0"B/!B/!B/!A. A. A. A. @-?,=*;(:':':';(:&:&9%9%9%9%9%9%8$8$8$9%9%:&:&:&;(";(";(";(";(";(";(";("9& :'!:'!;("<)#<)#<)#;*#:($8)$8)$9*%9*%:+&:+&:+&<-(<-(<-(=.)=.)>/*>/*>/*>1+>1+>1+?2,?2,@3-@3-@3-A4.A4.B5/C60D71E82F93E:4A64@64A75B86C97D:8E;9E;9G=;G=;G=;H>>J>>J>>I==I==H<N;?O<@P=AS>CU>DX?EY@F^CJbDLfGOgHPkJSqPYyXa^c_ab`ffiiihfda\_Xe\g]g^h_kbmdmgoirotqxs|w}x|wzwzv|z~~|yz}Ÿͻѽ·´׼а£{{jslDMO+5H*2@'-:%,7&,2#(/ ',$&"# #"!"!                               "##! !"#"#"# # $$&(+-//.-0011223 3 5"5"4!3 3 4!5"4 "8$%7%%7#%6"$6!&6!&8!)9",?%2A'4F+:J/@N1CO2FN1EM2EK3CK5BK5BK5BK3@I1>H.;G-8D*5F,7I.7J/8K-7I+3E'/C%-D%-E&.F(2F*6G+9D,9C+9B,9B.:A-9?+7=)4<%/9"*9(6%6"$6#%7#%8$&9%'9%';%(;%(;"&;"&:!%8#6 1.+,,.07> E IUNC @ GQ[c"`#h+r$2o(q+&6- 2##3<8:FIMT [&b-j2u6CPZ]ux{td`gcZWl]nTjMhUwVxKhD[^pT^HNFGKHPOS^_mJYoESfEPaFOXAIYDK]FNW=F\AJ^CLaGPbKSbKS`IQ\EM]BI^=DdAHgFMkJQlKRiHOcDJ`AG[>C[>CZ=BW:?R7!&9#8"5 0.9HA:IBH@=G?>E>=D=C=?D>BD?BD?BD?CE@DE@EFAEFAEFAFE@FE@HE@HE@HE>HE>ID>ID>LE=LE=LE;MFPG>PG>PG>PG>PG>QG>QG>QD7M>7L>5O=3M;/L:.J8,I7+H6*I7+I7+I7+I7+H6*H6*G5)G5)F4(F4(C0"C0"C0"C0"C0"C0"C0"C0"B/!A. @-?,>+>+?,@-@-@-@-@-@-@-@-@-@-?,=*;(:':':':':&:&9%9%8$8$8$8$7#7#7#8$8$9%9%9%9& 9& 9& 9& 9& 9& 9& 9& 9& :'!;("<)#=*$=*$<)#;*#;)%9*%9*%9*%9*%9*%9*%9*%<-(<-(<-(<-(<-(<-(<-(<-(;.(1+>1+>1+A4.A4.B5/C60D71E82F93D93@53?53@64A75B86C97D:8D:8D:8E;9E;9E;9F<:G=;G=;G=;G;;G;;G;;F::F::E99E99D88F::F::E99D88C77B66A55A55@46@46@46@46@46@46@46@46A57B68B68C79C79D8:D8:D8:J:=L9=M:>N;?P;@Q$1B'6F+:J-?K.@K.@J/@H0>H2?J4AK5AK3@J2?I/:H.9D*5E+4G,5H-6I+3G)1E'/D&.D%-E&.F(2E*3F*6C+8B*8@*7>*6=)4<(3:&/;$,9"(:!'8!'7#%6#%7#%7#%8$&8$&9#&9#&:!%:!%:!%9 $8"40.0/./2 9 A E SN@< FPZe'b(e-s+9t&4m ~$"50,.&:-E!=2<"Q RTY!Z'_-d3j7z7I\`gގ~skg_Xx]n_nUjQmWzSxLlPiReR[QSROTORQOZSdQbuJ[nJXiKWbHScLVfOY`FQ[?K^BNbFRdJUdJUaGR]CN[@I]MH>MH=LGJF>JF?JF?JF?JF?JF@IF@ID>H@=G?>E>C=AC>AC>AC>BD?CD?DE@DE@EFADC>DC>FC>FC>FCPG>PG>PG>PG>PG>QG>QG>QD7M>7L>5O=3M;1L:0J8.I7-H6,I7-I7-I7-I7-H6,H6,G5+G5+F4*F4(E2$E2$E2$E2$E2$E2$E2$E2$C0"B/!@-?,>+>+>+?,?,?,@-@-@-@-@-@-?,>+<);(9&9&:':':&:&9%9%8$7#7#6"6"6"6"7#7#8$8$9%7$7$7$7$7$7$7$7$6#7$9& ;(";(";(":'!8' :($8)$8)$8)$7(#7(#7(#7(#:+&:+&:+&:+&9*%9*%9*%9*%:-':-';.(;.(1+?2,@3-A4.B5/C60D71B71?42>42?53@64A75B86C97D:8C97C97D:8D:8E;9E;9F<:F<:D:9D:9C98C98B87B87A76A76D:9D:9C98B87A76@65?54?54?56?48?48?48?48?48?48?48?48?48?48@59A6:A6:A6:C7;H7=I8>K8>L9?N9@O:AQ:BS9BX=FZ?H^@J`BLbBMfFQmLWuPX|ORTTZ[`_b_b^_Z]W`XaX~bW~bWaYb]b^baeffjklmopqrprprphglknonpmplporqxsrsrtw}}zxw}szqxowpvqxrxszv|t{ryu|}~zejqHL`<@^>AT7;H/2B.0<)-9(.4%,- )*&(&&$"# !!!                      ! $!!!""#%%#$"!$!$!$!$%%('((*,-.--..//002 10//012 4!#3 "3!2 2"3#5&6'9*;!,?%2D*7G+:H,;H,;G,;D,:F.;I1>L4AN4AM3>K1Gc@GcBIdCJdCJa@G]>D[U8=S6;M27J/4F+0D).G(.C$*= %8"7!40-:KE;LFMH=LGH@>E>AC>AC>CD?DE@DE@DE@DC>DC>FC>FC>FCPG>PG>PG>PG>PG>QG>QG>QD7M>7L>5O<5M;1L:0J8.I7-H6,I7-I7-I7-I7-H6,H6,G5+G5+F4*F4(E1&E2$E2$E2$E2$E2$E2$E2$C0"B/!@-?,>+>+>+?,?,?,?,@-@-@-@-A. ?,>+<):'9&9&9&:':&:&9%9%8$7#6"6"5!6"6"6"7#8$8$8$6#6#6#6#6#6#6#6#3 5"7$9& 9& 8%7$5$8&"6'"6'"6'"5&!5&!5&!5&!8)$8)$8)$7(#7(#7(#6'"6'":-':-':-';.(;.(1+@3-A4.A4.@5/?42>42?53@64A75B86C97D:8C97C97C97D:8D:8E;9E;9E;9C98B87B87A76A76@65@65@65D:9C98B87A76@65?54>43>43?48?48?48?48?48?48?48?48>37>37?48?48@59@59A6:B6:G8=H7=J7=K8>M8?N9@O8@P9AU;DY>G\>H]?I^>IaALgFQmJQpGKxLMSUZZ^\_[_Y]W^U|^Tz^Sx]Ty\V{\Y~\Z\\aebgejillmonooqnigjhjkihfg}giills}gt|euzevzhx|k{}orsvwxxwsqoq}puotmrmrotpvqxltpvoyovs{zysycftLMiBChFG\>>N45G13A-/>.18).1$+- )+ ()'&&##" !                         $!%"##$#%%%#$"!$!$$$%%('&&(*-/---..//010////011 0000 1!3$4%8): +>$/B(5F*8G+9F*9E+8D*7E-:H0=K3@O5@N4?L2=J09F+4E*3F(0F(0E'/F(0G(.G(.E&,F'-F(0E*1F*6B+5A)6?)57#.7#.7#,8%+:#+:#)=$(;%(8$&6#%7#%6"$5!#5!#5"5"6!8#:!%;"&; %8"41'&'+05< ? BG=> LRT\d/R "a.v->t 01%;67+$'18ALRUUQNP(X/h9GS`^ZTtmghpmvor}|l]ZwQgTiXtfjS{FkPrMgRbSYMOGGEIHWRfQgH^yDXsDVkBRlFUmIWd@N]7Fa;JgAPlFUmIWiGUeERbBMbAJdAHcBIbAH`?F]U8=U8=S6;Q49L16H-2D).B',F'-B#)<$7!6 4/,7JD7JD:KE:KE;LF;LF=LG=LG?KG?KG?KG?KG@KG@KG@KG@KE@ID?IA?F?=D==D==D=>C=?D>?A<@B=AC>BD?EFAFGBGHCGHCDC>ED?GD?GD?GD=GD=ID>ID>KD7M?6L92L:0K9/K9/J8.J8.I7-I7-J8.J8.J8.I7-I7-H6,H6,G5)H4)H5'H5'G4&G4&F3%F3%E2$A. @->+=*<)=*=*>+?,>+>+=*<);(;(:'>+>+=*=*<)<);(;(;';':&:&9%9%8$8$8$8$7#7#6"6"5!5!6#6#6#6#6#6#6#6#8%8%8%8%8%8%8%7&7%!5&!5&!5&!5&!5&!5&!5&!7(#7(#7(#7(#7(#7(#7(#7(#7*$8+%8+%9,&9,&:-':-':-';.(1+?2,A4.B5/@5/A64@64@64@64@64@64@64@64@64@64A75A75B86B86C97C97@65@65@65@65@65@65@65@65@65@65@65@65@65@65@65@65<15<15<15<15<15<15<15<15<15<15<15=26>37>37>37@48B38C49D39E4:H5;I6P6?Q7@T9BWH_AKbBMdCLoKOuMN{QSVWZW]Z_Y`Y^U{]Sy\Tv[RwZVz[Y}[Z]^]c]d`dbdegggihkigeeccdcb}cd{eg|fi|glvbmucoucquervfsugvthvuiwyl}yl}zl}}l~}l~k~kk}irinhmglflfmhogofohpitkumwlwkwktcf[\zRRqMMkKLcFHV=@K58I6:A279-14'.2%./"++('$" !                                # # ""##%%%#$!""#$' (!))))****)*+,--,+--------1 01!0 0 1!2!3"8'9(;!*>$/@$0A%1A%3@&3@&3?'4A'2C)4F,7I/:M2;N3C=>C=?A<@B=AC>BD?DE@FGBFGBGHCFE@FE@HE@HE@HE>GD=HC=HC=KD7M>7M>7L=6L92L:0L:0K9/K9/J8.J8.I7-J8.J8.I7-I7-H6,H6,G5+G5+H4)H5'G4&G4&F3%F3%E2$E2$A. @->+=*<)=*=*>+?,>+>+=*<)<);(;(>+=*=*<)<);(;(;(;':&:&9%9%8$8$8$8$8$8$7#7#6"6"5!6#6#6#6#6#6#6#6#8%8%8%8%8%8%8%7&7%!5&!5&!5&!5&!5&!5&!5&!7(#7(#7(#7(#7(#7(#7(#7(#7*$8+%8+%8+%9,&9,&:-':-';.(1+?2,@3-A4.@5/A64@64@64@64@64@64@64@64@64@64@64A75A75B86B86B86@65@65@65@65@65@65@65@65?54?54?54?54?54?54?54?56<15<15<15<15<15<15<15<15;04<15<15=26=26>37>37>37@48B38D39E4:H5;I6H_AKbBMcDLlIOpLNxOSUWYX[X\V]V~\Sz\RwZRuZSvXVwYY|Z[}Z^}]b~]d_d`ddeegggigfdeccc~ac{abxbdxbewdhp_io_jp`knakoanpboocopdpsgssgstfuugvvhwyhxyhx}hwgpemdldldldmeoepdoeofsitjxjvixjueh^_VWySRsOOjJK^ACQ;=K8:D47<-05)-2%,1")-'*$$!"                                 """###%%## "!"#&' ))))****()+,--,+--------001!0 0 1!2!2!5$6%9(;!*>#,>#,>".>".?%0=%2@&1B(3E+6H.7L1:N3&3;%17#.7#,7#,7$*:#):$'<#':$'7#%6#%8$&9%'9%':&(;%(;%(=$(=$(<#';"&9#6 42.+))+. 4 7BHJHMYccX "Z(\(d-r2v*+">:, !.=!E!KSQTRN!S&Z5s@aU:NNoKd>Ia=Ga=Ge?JiCNlFQhGPcEM\CIY@F]!&9#6 2.,5JE6KF7JF8KG8KG9LH;KH;KH>MJ>MJ>MJ>MJ@LJ@LJ@LJALH@ID?IA?F?=D=BD?DE@EFAEFAFGBIHCHGBJGBIFAHE>GD=GB7L=6L=6K<5K<5K<5M:3L92L92K81K81J70J70J70I6/I6/H5.H5.G4-G4-F3,F4*G3(G4&F3%F3%E2$E2$D1#D1#A. @->+=*<)=*=*>+>+>+>+=*=*=*<)<)=*=*=*<)<);(;(:':&:&:&9%9%8$8$7#9%8$8$7#7#6"6"6"6#6#6#6#6#6#6#6#8%8%8%8%8%8%8%7&7%!5&!5&!5&!5&!5&!5&!5&!6'"6'"6'"6'"6'"6'"6'"6'"7*$7*$7*$8+%9,&9,&9,&:-';.(;.(1+?2,@3->3-?42>42>42>42>42>42>42>42>42?53?53@64@64A75A75A75>64>64>64>64>64>64>64>64<42<42<42<42<42<42<42<34:14:16:16:16:16:16:16:16:16:16:16;27;27<38<38=28@3:@3:C4;D5K6?K6?N7AO8BS9DV:F[=I]?K_AMaALhGNmJPuNS|RVUVWTYSYS}XPyXOvXPuXTuWWuWYyV\xX]yZ`z[a{\a~^a`abcdceddcdbaa|_ax^as]`s]`q^diYcgZdh[eg[eh\fh\fh\fi]gj^hj^hk_kmamnbnqcprdqtdozcm}bk|aj~`j~`jalbmbn`nbncrerfvgugwgsfkab[\XX|UVrPQfHJZADR>?I9:A339-/8),6%+3 &.%'#$"!                                  """###"! !"%&) ) ) ) * * * *()+,,,++,,,,,,,,/ / 0 0 0 0 1 1 3 4!6#8%; '$/@&1D)2H-6M/9O19L.6J,4G(.C$*A '@ %A!&A!&A"'C$)E(-F+2F+4@)1=&0:%.8$-8$-8$-7$*9"(9#&;"&9#%6"$5"$6"$7#%7#%8$&9#&:$'<#'<#';"&:!%9#6 425"0!,)*, 3 6 =EGIO\j!k%["['[&c*s3~3,-. ( &)-02:MJE ;> S%^)j:cS20{4|FHHSLAKJSgokli^ZYRS|X|QtImKpMnQlQfDU6J;QOt:Io9Gn@Kh@I`;Cd?Ge@HiAJjBKfCJaBHZAEW>B]#(>#(>#(@!'? &= %8"6 3/.5JE5JE6IE7JF8KG8KG:JG;KH?NK?NK?NK?NKAMKAMKAMKAMI@ID?IA?F?=D=;B;;B;AC>CD?DE@DE@EFAJIDIHCKHCIFAHE>GD=GB+=*<)=*=*>+>+>+>+>+>+=*=*=*>+=*=*<)<);(;(;(;':&:&9%9%8$8$8$9%9%9%8$7#7#7#6"7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$6%6$ 4% 4% 4% 4% 4% 4% 4% 6'"6'"6'"6'"6'"6'"6'"6'"6)#7*$7*$8+%8+%9,&9,&9,&;.(;.(1+>1+<1+>31=31=31=31=31=31=31=31=31=31>42>42?53?53?53@64=53=53=53=53=53=53=53=53:20:20:20:20:20:20:20:12:14:16:16:16:16:16:16:16905905905:16:16;27;27;27>39?29B3:C4;E4K6?N7AN7AR8CT:EXJ^@L_AMdEMjGNrJRxNR~RSSSTQ~UOzUMxUOtUPsVRsUUtTYwT[uT[uX]uX\wZ^y[]{]]~^_`^a_b`aa|_aw]`sZ^oX^lW\jW]dW`cWacWacWacWacWadWacWadWadXbfYcg[ei]gk_il`jp`jt^ju^hv\iv\gx\h|^j_l_m^k^l`naobqcrcsepdibc\_Z\WXvRTjJK_EFYEDQAAI;:D66B23@-/;')6#'*&'%#!                                 !!!!!   !$%) ) ) ) * * * *()*+,,+*,,,,,,,,..0 1!1!0 0024!6#8%; '$-B'0F+4K-5L.6L.6J-2G(.D%+A!&@ %?$?$@!&B#(D',C(-C(/?(0<%/9$-8$-7$*7$*7$(8"%8"$:!$8"$5!#3 "4 "4 "4 "6"$8"%8"%;"&;"&:!%:!%9#6 428&4#-((-37;>BGP\k$o)[ ](_(a'm-z3.$93361 ' ,:'N"MIH%S/b-h(j*uFiyhE.t,n-n3}5C]#(%=$;#8"6 4004HF5IG5IG5IG7JH8KI8KI8KI=ML=ML>LL>LL>LL>LL@LL@LJAJE?IA?F?AC>BC>CD?CD?CD?IHCIHCJGBIFAGD=FC+=*<)=*=*>+>+>+>+>+>+?,?,?,?,>+>+>+=*<)<)<)<(;';';':&9%9%9%:&9%9%9%8$7#7#7#7$7$7$7$7$7$7$7$7$7$7$7$7$7$7$6%6$ 4% 4% 4% 4% 4% 4% 4% 5&!5&!5&!5&!5&!5&!5&!5&!6)#6)#6)#7*$7*$8+%8+%9,&:-';.(;.(;.(42>42<42:52:52:52:52:52:52:5272/72/72/72/72/72/72/7117157077077077077077077076/66/66/6707707818818:08=2:?2;B2F5?I5@J4@M5BN6CR8ES9FV:HX!?!#A#%B%)A&+A&-=&,;$,8#*7$*7$*6#)5"&7!$6 "7!5!3!1 1113!6 #7!$9 $9 $9 $9 $8"6 436$3!+').6:89<DMXh#o+X^'c*`$a"m*x,y $1L"<76+ ,(EA<?'O1^1c-g)j$i*q7}@=}3p(e&f+v+|+6=51<;u@mIpJvMcxxmf`ZUpShNfHaC\?S:JCRUh\qNb89>8AC>AC>AC>AC>BC>BC>BC>BC>GFAGFAHE@GD?FC5G>5G>5G>5G>5G>5H>5H>5F91F91G81F70F70E6/E6/D5.I60I60I60H5/H5/G4.G4.G4.F3-F3-E2,E2,D1+D1+C0*C0)D0%D1#C0"C0"B/!B/!A. A. A. @->+=*<)=*=*>+>+>+>+?,?,?,@-@-@-@-@-?,?,>+>+>+=) =) =) <(<(;';';':&:&:&9%9%8$8$7#8%8%8%8%8%8%8%8%6#6#6#6#6#6#6#5$5#3$3$3$3$3$3$3$5&!5&!5&!5&!5&!5&!5&!5&!5("6)#6)#6)#7*$8+%8+%8+%:-':-':-':-':-';.(;.(9.(;0.:0.:0.:0.:0.:0.:0.:0.:0.:0.:0.;1/;1/<20<20<41;3194194194194194194194172/72/72/72/72/72/72/7117157077077077077077077075.55.55.56/66/67077079/7=2:>1:A1;B2H4?H4?L6BN6CQ7DS9FU9GW;IZ;J[%L#R'\*d'd&a&](^)^&Z"W[,t'v(u1|73w0o6kEq>b?aAjIgogc[~QcOYHX=PIZ@Q9GFWXnUlG\?S=RK_>G_#(; %:$:$<#<#:"6 530/3GE4HF4HF5IG6IG7JH7JH7JH:JI:JI;II;II;II;II=II=IGAJE?IA?F?AC>AC>@B=AB=AB=AB=AB=DC>DC>FC>EB=EB;EB;FA;FA;F?7F?7F?5F?5G>5G>5G?4G?4F=4F=4F=4F=4F=4F=4G=4G=4E80D7/E6/E6/D5.C4-C4-C4-G4.G4.G4.F3-F3-E2,E2,E2,E2,E2,D1+D1+C0*C0*B/)B/(C/$C0"B/!B/!A. A. @-@-A. @->+=*<)=*=*>+=*>+>+?,@-@-A. A. B/!B/!B/!A. A. @-@-@-?+"?+"?+">*!>*!=) =) =) ;':&:&9%9%8$8$8$8%8%8%8%8%8%8%8%6#6#6#6#6#6#6#5$5#3$3$3$3$3$3$3$4% 4% 4% 4% 4% 4% 4% 4% 5("5("6)#6)#7*$7*$7*$8+%:-':-':-':-':-'9,&9,&7,&9.,8.,8.,8.,8.,8.,8.,8.,9/-9/-9/-:0.:0.;1/;1/:2/:2083083083083083083083072/72/72/72/72/72/72/7116046/66/66/66/66/66/66/64-44-44-45.55.56/66/69/7=2:>1:?2;@3H4?H4?L6BM5BQ7DR8ET8FV:HW;IW;I`BNdDOlFQrIQyKN|LL|LJyLGyNHwPKxROvTSvSYuRYtN[pOZnTWlWVnVVpVUsWVtXUuWUvXVvZYvY[sY\qX\nT]iR\eO[bNZ_MY^N[^LZ^LZ]KW^JV^JV^JV`LW`LW`LW_NX`OW`QXaPX`PZgUafT`gUahVbkWboYer[ev\ey^gz\d|[d~[b]d_fahchbi^eV^}NVvINnEIgEFbFE\GB\KD]NG^QI]NGYF@P84E0/5&-.",(&"                           ! "!"#&') ) ) ) *!*!*!) &%'(((''((((((((*,0 1!1!0 .,1257!: #: #;!$:$>#*="+ (@!'@!'B#)A"(B"'@ %@!><:?"?!#>!%=#&=")9"(9"*7")4!'3 &2#1 212/1.-,-/3 5"7"7"8#8#8"6 4531,)(-36522:BI Ye&X!U\"]"W ^ j)j%klmm i i q  ,34;A#J-Z+Y%S!MHG"M#Q!RT)f$d%a+d0e1b1^1W@^2M3M<\DsXrwf^`\vT\TUNVALHUES=KCUId>[:TCZ{@Vr7Ko4Jr9Lj7J^/?X/?\8Da;Jg=Ko>Qs@Qq@Sk?Nc=L]7@;7=97=98=7AC>AC>AC>@B=AB=AB<@A<@A;BA5G>5G?4G?4E<3E<3E<3E<3E<3E<3F<3H;3D7/E6/D5.F5-E4-E4,D3,D3+F3,F3,F3,E2+E2+D1*D1*D1*E2+D1*D1*C0)C0)B/(B/(B0&C/$B/!B.#A. A-"@-@,!@-A-"@->*=*<(=*=)>+?)@*@*?,B,!A. A-"B/!C/$C0"C/$B/!B.#A. A-"A-"@,#@,#@,%?+"?+$>*!>*#>*!;' ;':&:&9%9%8$8$8%8%8%8%8%8%8%8%6#5$5$5$5$5$5$5$3$3$3$!3$3$!3$3$!3$4%"4% 4%"4% 4%"4% 4%"3& 5("3("5("4)#6)#5*$7*$6+%:-'8-':-'7,&9,&7,&9,&6+'9.*8.,9.,8.,9.,8.,9.,8.,9.,8.,:/-9/-;0.:0.<1/;1/:20830:20830:20830:20830:20830:20830:20830:208226046/66/66/66/66/66/66/63,34-44-44-45.56/66/68.6<19>18?2;@3:C3=D5H4=L6BL7@N6CR8CT8FU9EV:HW;G`BNdDOjFPqIQvLPxLMyKKwKJwNLwOMxRQwSSwSWuRYtNYpOVpSWmUUnVTpVUpVUsWVtXWrXWrXYrX[rY]qX^lU]iR\fN[cMZ\JV\JX[IWZHVZHT[GSZFRZFR]IT]IT]IT\KU\KU\KS\KU]LVdT_dT_eUbgUakWcnXdr[es\dx]fz\dz[c|[b}\c_ebhchdk_gW_~MSuFLmCGjCFdFDZB>ZGA\MF`QJaPIZGAP84D/.7&,0#*)%"                          "!""#$'())))* * * )&%&(((''(********,0110../1359 :!:!:!A$)@"*> (='<&<$=$= %<$<$;#:!9 763;!$; %;"&;"&9"(8#*7")6#)3 &2%1"0!//.-/.+++.2!4!6#7"7"8"8"6 6530,**-14723:>C R^#["P T[$W"[&b,^%^ i&o'n#t&~+-%+$?"=52<%JAD=7: D&O&V T%Y!S#Q(O,P1T2R.I1J&=+D=[@iExNM\W^~_pY]]^\`MVAKFRBO@S#(="'>!&= %<$8$6 3 /.-2HF2HF3IG3IG4JH4JH6JI6JI4HG5IH5IH6JI6JI7KJ7KJ8JJ;IJ=II>HI>HIFC>EB;DA:C@9C@9C?6C?6E>6E>4F=4F=4F>3F>3F>3F>3A:0A:2B92B92C82C82E80E80H:1J91I80J8.I6/H6,H4-H4+H4)G3(F2'E1&D0%D0%E1&F2'G3(G3(F2'F2'E1&E1&D0%D0%D.#D.#D-%C-"C,$B,!B+#B,!@)!@*@)!@*@)!@*@)!@*B)"B* C*#C-"E,%D.#E.&E/$B.%B.#B.%B.#A/%A/#A/%A/%@-&@-&@-'@-&@-'@-&@-'@-&=*$=*#=*$<)";(";(!;(":' 9&9&:' :' 9( 9( :)!:)!6%4&3%3%2$2$0#0#0"0"0"!0"0"!0"0"!0"2$#2$!2$#2$!2$#2$!2$#2$!0%!/&!0%!0'"1&"1(#2'#1(#5*&4+&5*&4+&5*&4+&5*&5*&5*&6+'8*'7,(9+(8-):,)8-):,)8-):,)8-):,)8-):,)8-+7-,7/-8.-80.9/.91/:0/91/;10:20:0/80.8.-7/-7-,6-.4.04.24.24.24.24.24.24.24.25/35/3604604715715905<17<15=28>37@3:C49E4+.70<43?&K&P#S P$N F!C$A'B)B)B)?:Q/H(E6YAj4b2eDo:TFUV`]d[aRXISJW6C=KBQ?P{5Mq/Ko/Qq5Qt9Kv>Is@Gk:@b15^-1c05h7;l>Ag=Ac;C^;B\;D^=H`>Lb@N^=F\=CZ;AV9>Q6;N38K26J15K26J15I04H-2F+0F).E(-D',9 &6%2#/,*)(2HF2HF2HF3IG3IG4JH4JH5KI3IG4JH4JH4JH5KI5KI6LJ7KJ:IL;IL=HJ=HJ;@<@;?AEB=EB;DA:C@9C@9C?6C?6E>6E>4F=4F=4F>3F>3F>3F>3A:2A:2B92B92C82C82E80E80J91J91J8.J8.J6-I5,K4,J4)I5*H5'F3%E2$E2$E2$F3%F3%G4&G4&F3%F3%E2$E2$D1#D1#D-%D-%D-%C,$C,$B+#B+#B+#A*"A*"A*"A*"A*"A*"A*"A*"B)"E*#C*#D+$E,%E,%E.&E.&B.%B.%B.%B.%A/%A/%A/%A/%@-'@-'@-'@-'@-'@-'@-'@-'>+%=*$=*$<)#<)#;(";(";(":' :' :' :' 9( 9( 9( 9( 4&4&2%2%1$1$.$.$1# 1#"1#"1#"1#"1#"1#"1#"2$#2$#2$#2$#2$#2$#2$#0%#0%!/&!/&!0'"0'"1(#1(#1(#4+&4+&4+&4+&4+&4+&4+&4+&7)&8*'8*'8*'9+(9+(:,):,):,):,):,):,):,):,):,)8-+8,,7-,8.-8.-9/.9/.:0/:0/:0/:0/9/.9/.8.-7-,7-,6-.6-04.24.24.24.24.24.24.24.24.25/35/3604604715715;25<15=26>37@48A59D5:E4:I6N7?Q7@R8AS9BS9BY>E\AFaDIfGMkKPoLRqLSsKStMRtMRtMPqMOqMOoMNoMLmMNrRUqSUoRTmSTmSVjTVkUXjVXgTVhUWjUZjUZiRZfOWdJS`ISYHRWGRVFQUEPTDOTDOUEPVFQRBMSCNTDOUEPVFQWGRXHSYITYGW\JZ_M]aL]aL[bLYeO\iQ^pVaqV_rW`vX`xY_z[a{\b\bZd^g^eU]NT~MQvJKlFEdFD]D@VA>T@?VBCT>AN5;G.2@,.9''/ )$!    " $                          !##$$&&''((**+*)'''))))//0///1/100011335579;= >!@!B"B"A!? ="<":"8#6 #1 .(&%%%($($*"+#-%/ '3"(4#)3 $2#1"/ .-+*)' ' ' + ,!0!2#5$5$9#9#:!9 861/113368;A>CIA < G VQ I H H&E &I -P5G +S-^ )q+8 8/2 /4!@'B 8"9&@<236 A"E H"Q%QD97!8#: 930#?<>/T?i8e4a>`BMDEKPSZVaRbH]D[6L9L:Kw:Lk7Mf4Mh/Pj.Js4Et7?o8>i59b03a-/h03k47h67b67Z68T5:Q6;S8AX8E[9GZ;CY:@W:?S8=Q6;N59K58J47H25G14H/3G.2H+0G*/G(.E(-8!)5 '2$/!,*))1GE2HF2HF3IG3IG4JH4JH4JH3IG3IG3IG4JH5KI5KI5KI7KJ:IL;IL;IJ=HJ=GH;EF:CB9B?;A=@;>@;@A;@A;BB:BB:BA8C?6C<4C<4C<2C<2D;2D;2D<1D<1B;3B;3C:3C:3D93D93F91F91J91J91J8.J8.J6-J6-L5-L6+J6+I6(G4&F3%E2$F3%F3%G4&G4&G4&F3%F3%E2$E2$D1#D1#B.%B.%B.%A-$A-$@,#@,#@,#?+"?+"?+"?+"?+"?+"?+"A*"D+$D+$D+$D+$D-%D-%E.&E.&@,#@,#?-#?-#?-#?-#>-#>-#@-'@-'@-'@-'@-'@-'@-'@-'>+%>+%>+%=*$=*$<)#<)#<)#:'!:'!:'!:'!9(!9(!9(!9(!4%4%2%2%1$1$.$.#1# 1#"1#"1#"1#"1#"1#"1#"2$#2$#2$#2$#2$#2$#2$#0%#0%#/%#/%#0&$0&$1'%1'%1'%4*(4*(4*(4*(4*(4*(4*(4*(7)(7)(7)(8*)9+*9+*9+*:,+9+*9+*9+*9+*9+*9+*9+*7,*7++6,+7-,7-,8.-8.-9/.9/.9/.9/.8.-8.-7-,7-,7-,5,-6-24-44-44-44-44-44-44-43,33,34-44-45.55.56/6604:14:14<15=26?37@48C49D39I6N7?O8@R8AS9BW>DZ?F_BGdEKhGNmJQoJQpKRsLQsLQqMQpLPpLNnLMnLMkKLoORnPRmPTkQTkQThRThRUgSUeRVfSWgTXhSXhQYeNVcIR_HRXGQVFQTDOSCNSCNSCNTDOTDOQALQALRBMSCNTDOUEPVFQVFQVEUYHX\K[]K[\JX_KWcMZgO\kT^mS\pU^qV]uX]wZ_x[`zZ_Yb\d\cX_W\X\~RSqIIjHF_C@T<:N:9O;?AGFHLC < BO M I G C@D&K.A 'J(V 'i)36/1=68&@$727277; ?>;BE!@42!5%?&DCC"H#J#I0VAl=j1`2Y@Q9C:FDVNdNlGk@e7Z6U}3Lf0G_3J_5Mb-Ka%As.At-;m.9i-5f-3g.4k06k28f26_25V45Q48N59M6>R6BV8BW8@V7=T7?9>?9?@8AA9A@;A@;C@;C@;C@9C@9C>8C>8C<4C<4C<2C<2D;2D;2D<1D;2B;3B;3C:3C:3D93D93F91F91J91J91J8.J8.K7.K7.M6.M6.K7,J7)H5'G4&F3%G4&G4&H5'G4&G4&F3%F3%E2$E2$D1#D0%B.%B.%B.%A-$A-$@,#@,#@,#@,#@,#@,#@,#@,#@,#@,#@,#E,%E,%E,%E,%D-%D-%E.&C/&@,#@,#?-#?-#?-#?-#>-#>-#@-'@-'@-'@-'@-'@-'@-'@-'?,&?,&?,&>+%>+%=*$=*$=*$;(";(";(":'!9(!8' 8' 6' 4%4%2%2%1$1$.$.#2$!2$#2$#2$#2$#2$#2$#2$#2$#2$#2$#2$#2$#2$#2$#0%#/%#/%#/%#0&$0&$1'%1'%1'%3)'3)'3)'3)'3)'3)'3)'3)'4)'7)(7)(8*)8*)9+*9+*9+*8*)8*)8*)8*)8*)8*)8*)6+)5+*5+*6,+6,+7-,7-,8.-8.-7-,7-,7-,7-,6,+6,+6,+5,-5,13,33,33,33,33,33,33,32+22+23,33,34-44-45.55.5905903;04<15>26?37B38B38G6N7?O8@R8AR8AU;DW>DZ?F`CHdEKhGNlIPnIPrJRoKOoKOnKOmJNkKLjJKjJKkMOlNPkNRjPSiPSfPReQScPRcPTdQUeRVfSWePWdMUcIR^GQWFPUEPSCNRBMQALRBMRBMSCNP@KP@KQALQALRBMSCNSCNTDOTCSVEUYHXZIYZHV[IU`LXcMYfQZhQYlR[oT[qV[tW\tW\wV]X`ZaZ`Z`]b`dXZwMNnKIaB?S:6L42J54K57H24E/2?*/7'*0 #( %#                              "##$%%''((**+*+)))++++..000133323333566899: : ; ; ? ? @#>#<":!7!5 .*($$#%&!&"%!'!(")!+#.%/$0#0#/ ..,,**' ' ' )+ ./ 2!2!5554215589=@BEIKJLLI DEL L KE @=B!F*; B "O !e %/55:-O6-1*#&&(C"<99:8=<%C3./<%I%R%V'V*X'P+S;d=h2`0W5L+8;>7;>7=@9?@:@?;@?;@?:@?:B?:B?:C@9C@9A=4A=4C<4C<4C<2C<2D;2D;2C<4C<4D;4D;4E:4E:4G:2G:2I80I80K9/K9/L8/L8/N7/N7/L8-K7,I5*H4)G3(H4)H4)I5*G3(G3(F2'F2'E1&E1&D0%D0%B.%B.%B.%A-$A-$@,#@,#@,#B.%B.%B.%B.%B.%B.%B.%B.%F-&F-&E.&E.&E.&E.&B.%B.%@,#?-#?-#?-#>-#>-#>-#>-#?.'?.'?.'?.'?.'?.'?.'?.'?.'?.'?.'>-&>-&=,%=,%=,%<)#<)#:)"9(!9(!8' 5&5&4%3&2%2%/%/%.$.#/$ /$"/$"/$"/$"/$"/$"/$"0%#0%#0%#0%#0%#0%#0%#0%#/%#.&#.&#/'$/'$0(%0(%0(%2*'2*'2*'2*'2*'2*'2*'3)'4)'4)'4)'5*(5*(6+)6+)7,*5*(5*(5*(5*(5*(5*(5*(5*(4*)4*+5+,5+,6,-6,-7-.7-.5+,5+,5+,5+,6,-6,-6,-5,/5,13,33,33,33,33,33,33,31*11*12+22+23,33,34-44-48/48/4905:16<17>18A29A29F5=H4=J5>K6?M6@N7AO8BO8@Q:BT;AWF`AIeDKiFMkHNnIPnIPmHOlIMkHLiILiILgIKiJOjKPjMQiORhOSeORcNSaNR`MQ`PScPVdQWdOXaLU`IS]HQVEOTDOSCNQALQALQALRBMRBMP@KP@KP@KP@KQALQALQALRBMPBQSETVHWVHWXHUYGS\JVaMXcNWfOWhQYmTZoVZpUZpUZsTZ{V]X^X]Y_`dbgZ]{ONqIGdA?U75L21K31J54H24E/2?*/6%+0%("& $!                         !""#$%''((**+*+)))++++..001245 4 4 4 4 6 6 7 7 7 7 9 9 999:= = >!=";"9!5!3 ,(&"##$&!'#'#(")#*$+#.%/&/"/".--,,**' ' &)*-.4#4#7!7!6532589<?CFHN$M"N MKMONL OK!C ==A "E'E%G!U "e %z)078'B &}&"y w !x #82-/11;!A$C5/09DLPQQFA$L.T-V1T.G%;/H9X0U+V-`+`+`4g6a-Sm(Ee+C`+?]&9s3Dp->f)8d*6f,8i09l-8i*5o3=h5<^5;W7O4;K28I06E.4C.3A,1B+1D+1D+1D)0F(0G(0F(08!)5 '2$/!,+*).FF.FF.FF/GG/GG0HH0HH1II/GG0HH0HH0HH1II2JJ2JJ4IJ7IK9HK:IL;JM8>:7<67<6:=6;>7=@9>?:?>:?>9?>9B?:B?:C@9C@9A<6A=4C<4C<4C<2C<2D;2D;2C<4C<4D;4D;4E:4E:4G:2G:2I80I80K9/K9/M90M90O80O80M9.L8-J6+I5*H4)I5*I5*J6+G3(G3(F2'F2'E1&E1&D0%D0%B.%B.%B.%A-$A-$@,#@,#@,#C/&C/&C/&C/&C/&C/&C/&C/&F/'G.'F/'F/'E.&E.&B.%B.%?-#?-#?-#?-#>-#>-#>-#>-%?.'?.'?.'?.'?.'?.'?.'?.'@/(@/(@/(?.'?.'>-&>-&>-&=*$;*#:)":)"8' 6' 5&3&3&3&2%0&/%/%.$.#.#.#!.#!.#!.#!.#!.#!.#!0%#0%#0%#0%#0%#0%#0%#/%#.&#.&#.&#/'$/'$0(%0(%0(%1)&1)&1)&1)&1)&1)&1)&1)&2(&4)'4)'4)'5*(6+)6+)6+)4)'4)'4)'4)'4)'4)'4)'4((3)*3)*4*+4*+5+,5+,6,-6,-3)*3)*4*+4*+5+,5+,5+,5,/4*22+22+22+22+22+22+22+20)00)01*11*12+22+23,33,37.37.38/4905;06<17>18@18E4K6?M6@N7AO8BO8BO8@P9AS9BWFaBJeDMiFMlIPkHNkHNhHMhHMfHJfHJfHJgHMhKOhNQhORfPSdPRaNR_LP\LO]MPaNTbOUbMV`KT_HR\FRVDPTDOSCNRBMQALQALRBMSCNP@KP@KP@KP@KP@KP@KQALOBLNBPQESTHVUGVUGTWGRZJU^MW`LUcNUfQXjSYnUYnUYmTXpSXxU[}U]U\W\\``cY\}OOrFEf>ADFM#K MKG NT#PL NH @< ? D!G#S+V'd)q,x )-0}-.pr ~%v"i b ]o/r+|+,('09546=DKNOO!TI=>?"C.M0J&>1N9X$ICMN(]5k:m1]+N,Fm->b(6n1Ag-<_)6])5`,8e-8h*7h)4k-:f.9^/9W/7R18S4:V5>W6?W8@U7?Q6=N3:J17E.4A,1@+0@+0@+0@)/B)/B'.A&-C%-B$,7 (4&1#. +)((,FG-GH-GH.HI.HI/IJ/IJ/IJ.HI.HI/IJ/IJ0JK0JK0JK2JL5HL7IM8JL9KM5>95<54;46;58=69=>9>?:@?:@?:C@;C@9B?8B?8C?6C?6E>6E>6E>4E>4D=5D=5E<5E<5F;5F;5H;3H;3I80I80K9/K9/M90N:1P91Q:2N:1M90K7.J6-I5,J6-J6-K7.G3*G3*F2)F2)E1(E1(D0'D0'A.'A.'A.'@-&@-&?,%?,%?,%B/(B/(B/(B/(B/(B/(B/(C/(H1+G0*G0*F/)C/(C/(B.'B.'A.'A.'@/'@/'@/'@/'>0'>0'?.'?.'?.'?.'?.'?.'?.'?.'A0)A0)A0)@/(@/(?.'?.'>-&<*&<*&;)%8)$6'"5&!4% 3& 3& 1& 0%0%/$.%-$-$+"+!+!+!+!+!+!+!/%#/%#/%#/%#/%#/%#/%#/%#.&$.&$.&$/'%/'%0(&0(&0(&1)'1)'1)'1)'1)'1)'1)'1)'2('2('3)(3)(4*)4*)4*)5+*2('2('2('2('2('2('2('2('2()2'+3(,3(,4)-4)-5*.5*.2'+2'+3(,3(,4)-5*.5*.4+.4*22+32+32+32+32+32+32+3/(0/(00)10)11*21*22+32+24.24.27.38/4:/5;06=07?07E4K6?L7@N7AO8BM8AN7AO8BS9BZ<^85Y75W97S98M53E12>).8%+0'+#'#$""!!                           !!""#$''((**+*)'''))))-.0124!6!7"8#8#8#8#9#9#9#9#:$:$9#7!8 6564578 7!3/+,*%#""$ %!%"%"&!% & '!)"*!-"- ,,-,,++ (!' &'(+,4#4#7!6 53103579;?ACIFIGAKQ!H HJ C9 6 ?FJ X$^ "u-622x5m+q$h qx'l#`"X(R )\2a/q/ 30((/,3 <%C&I%L#O"Q N,W*R$IC7 <2K2L 8*G4R!B;"FE,Z5j8o2e0Z2R/?c$-a)6Y)5S(2R)1U*3]+6c)7g)6i)9f)8_)6Y*4U+5V.7Y/9Y1N3#,?!+5>;2;63955<58=79>7;=8<=8=>9>?:@?;@?:C@;C@;B?:B?8C>8C?6E>6E>6E>6E>4D=5D=5E<5E<5F;5F;5H;3H;3I80I80K9/K9/M90N:1Q:2Q:2N:1M90L8/J6-J6-J6-K7.K7.G3*G3*F2)F2)E1(E1(D0'D0'A.'A.'A.'@-&@-&?,%?,%?,%C0)C0)C0)C0)C0)C0)C0)C0)F2+H1+G0*D0)C/(C/(B.'A.'A.'@/'@/'@/'@/'>0'>0'>0'?.'?.'?.'?.'?.'?.'?.'?.'B1*A0)A0)A0)@/(?.'?.'?.'=+'<*&9*%8)$6'"5&!3& 2%1& 1& 0%0%.%.%-$-$* * * * * * * * /%#/%#/%#/%#/%#/%#/%#/%#.&$.&$.&$/'%/'%0(&0(&0(&1)'1)'1)'1)'1)'1)'1)'1)'2('2('2('3)(3)(4*)4*)5+*2('2('2('2('2('2('2('2()2'+2'+2'+3(,3(,4)-4)-5*.1&*1&*2'+3(,4)-4)-5*.4+04*22+32+32+32+32+32+32+3/(0/(0/(00)10)11*21*22+33,34.27.38/4:/5;06=07=07D5K6?L7@N7AM8AL7@L7@M8AP9CV:F\>H`BLdDOhGRhGPgFOfGMdGLdGLcFKcFKeHMeJOhMRiPTgPVcPT`MQ\LOYHN[JP]LT^MU`LU^JS]GSZFQXFRVFQTDOSCNRBMSCNSCNTDORBMRBMQALQALQALQALP@KNAKNBPPESSHVTIWTHTTHRZJU]MW]LT_NTfQXjUZlVYlVYjTWkRVrSXxU[{TYzQUQWVYSV}KLp@@i;;a86]:6[<9X<9P73G21>*,8%)2%+#("&##""                              !!"#$''((**+*)'''))))-.013 4!7"7"8#8#9#9#9#9#9#9#; %:$9#7!6 45413554 1+(,+&$#"$ %!# "###$&' ,!,!,!,-,,++ (!' %'(++3"3"6 541/. 12568:=>AAGD<CI<DF < 67 CLOa $l %4?7|4l2[#d` jp$f"b(e7c;V.Z+l.&9.A)< 63.39857:>4$D.M.L'F8#;:O1H1 !<~.I}*H3X8g7m2h6e9\.Bl)],T"-N%-M%-O'/T)2^*6d*8i,;g*9`*7]+6Z,7Y.8]/:\2'/<%-=#,9>?:?>:@?:C@;C@9C@9C@9C>8C?6C?6C?6E>6E>6F=6E<5F;5E:4G:2G:2J91K:2M;1O=3P<3P<3Q:2Q:2L8/K7.K7.J6-J6-I5,I5,I5,I5,I5,H4+H4+G3*F2)E1(E1(A.'A0)A0)B1*C2+D3,D3,E4-B1*C2+C2+D3,D3,E4-E4-F3-I4/I4/H3.G2-E0+C0*B/)A.(E2,C2+C2+@1*@1*?0)?0)>1);,%<-&>/(?0)@1*@1*@1*@1*@1*@1*?0)?0)>/(>/(=.'=.';,';,);,):+(9+(8*'8*'7)&1&"0%!/&!.% ,#+"*#)"," ," ," ," ," ," ," ," -#!-#!-#!-#!-#!-#!-#!-#!-%#+%%+%%+%%+%%+%%+%%+%%-''-''-''-''-''-''-''/&'/%&/%&0&'1'(1'(0&'/%&/%&1'(1'(1'(1'(1'(1'(1'(1'(4)-3(,3(,2'+1&*0%)0%)/$(2'+2'+2'+2'+2'+2'+2'+1(-3)2/'2.&1,$/,$/.&1/'21)41)41)41)41)41)41)41)41*23.44/55.56/68.69/7:/7;.7A1;A1;C2I5@J6AL6BM7CL8CL8CM7CO7DS9FV:FZHaALbBMcCNbDLbDL_DK]BI]BG`EJbGLeJQfMSeNTbOS`MS]LR[LS\MT]NU_NV`LW^JU\FRZFQSAMRBMRBMQALQALP@KP@KO?JO?JP@KP@KQALQALRBMRBMPCMOCQPESSHVUJXXLXXLV[KVZJT_NV`OUdOVePUhRUhRUhRUjQUlMSqNTuQUzSVRWSUQTPQvDCrB@k?8}.%;s*g },-&,#5*)!9(@";#9'='?'B*F*E&>~"7l#6j!50K'K'V0e5g,V&E'=n 0]!-X%.Y.5X16S*0T&0Y'2])6\(5X(4V(3T)3T)3W)4U+5K+6H-6G,5E+4A*2?*1>)0<)/<)/;(.:%,8!)9(8'9'8'2#/!,)'&&&,FG,FG,FG,FG,FG,FG,FG,FG.HI.HI.HI/IJ/IJ0JK0JK0JK2JN4IN4IN6IM6IM8JL8JJ:JJ8FF9EC8DB8C?7@;6?:5?76=66;79;8;;9<<:=>9>?:@?;@?;B?:B?:B?8B?8D?9D?9D@7D@7E>6E>6F=6E<5F;5E:4G:2G:2J91K:2M;1O=3P<3P<3Q:2Q:2L8/L8/K7.K7.J6-J6-I5,I5,I5,I5,I5,H4+G3*G3*F2)E2+B/)A0)B1*C2+C2+D3,E4-E4-C2+D3,D3,E4-E4-F5.F5.F5.J50J50I4/G2-E2,D1+C0*B1*D3,D3,A2+A2+@1*@1*>1)>1)<-&=.'=.'=.'>/(?0)@1*@1*@1*?0)?0)>/(>/(=.'=.'=.';,);,):+(9+(8*'8*'8*'5*&1&"/&!/&!.% ,#*#*#)"," ," ," ," ," ," ," ," -#!-#!-#!-#!-#!-#!-#!,$!+%%+%%+%%+%%+%%+%%+%%+%%-''-''-''-''-''-''-''-''-$%/%&0&'1'(1'(0&'/%&.$%1'(1'(1'(1'(1'(1'(1'(1'(4)-4)-3(,2'+2'+1&*1&*0%)2'+2'+2'+2'+2'+2'+2'+1(-2(1/'2.&1-%0-%0.&1/'20(31)41)41)41)41)41)41)41)43.53.45.55.58.68.6:/7:/7>1:A1;C2H4?J6AL6BL8CJ8DJ8DL8DM7CP8ET:GX (> ( FO Wdr'y+/43{.g %P !F K V&_$k)v2m(`"h *|=?6+).44t&"5t+p$&1#-#&$"3%:67#<$?$A&C(C'@&9o%4i"2{)?<C)V4e5d1Z4V0G})9i#.b)2^/5Y.5W,3W,5W,6V+5R*3N)1L'/L'/O%/N&1J*5E+4D*3A*2?*1<)/;(.;(.:'-9&,8#*6!(6'8'9'8'4%1#-*'&&&*FI*FI*FI*FI*FI*FI*FI*FI,HK,HK,HK-IL-IL.JM.JM0IM2IO2JN2JN5JM5JM7KL8JJ:JJ9IH9HE:FD8D@7B<6A;4?94=86:98:99;8:<9<>;=?=8?>9A>9B?:C@9DA:DA:FA;E>6E>6F=6E<5F;5E:4G:2G:2J91K:2M;1O=3P<3P<3Q:2Q:2M92M92L81L81K70K70J6/J6/J6/I5.I5.I5.H4-H4-G3,F3,D1+C1-C1-D2.D2.E3/E3/E3/E3/E3/E3/F40G51G51G51H62K63J52I62H51G40F3/D2.D2.E3/C4/B3.B3.@3-@3-?2,?2,=0(1)@3+>1)>1)>1)=0(=0(G3?I5AJ6BK7CH6DH6DH6DK7CO7ES8GV:IX,,4$'*$# "%"                 ""   !"$%+*)*-/.++('%''((*+.03 5"9 $; %<&>'? (> (> (=':&:&8$8$7$6#4!0.--,+((()))'' ' &!&!&!&!! ! !%'!+",#-$-"."."-!+ (%"!#$)*)(* + ./.-, -./0123216:6-+/ 0 5 B P ]hv #.v(w+~/w*j$ZL DC"K%T"`'m-i'b"l,|8<:0) *0~1n x,q&r$+2*1( +$ $$3$:76<&E%D&D(E(B%'1<'09%.8$-5$,4#+3"*4 )4(5(5(8)9*5&2$/!,)'&%*FI*FI*FI*FI*FI*FI*FI*FI,HK,HK,HK-IL-IL.JM.JM.JM1JO2IO2JN3KO5JM6KN7KL8JJ;=?=8A>9B?:C@9DA:EB;FC6E>6F=6E<5F;5E:4G:2G:2J91K:2M;1O=3P<3P<3Q:2Q:2N:3N:3M92M92L81L81K70K70J6/J6/J6/J6/I5.I5.I5.H5/E3/E3/E3/F40F40F40F40F40F40F40G51G51H62H62I73I73J73K63J73I62H51G40F40F40D50D50C4/C4/A4.A4.@3-@3-?2*=0(:-%8+#9,$;.&>1)@3+>1)=0(=0(=0(H4@I5AH6BF6CF6CG5CH6DL5EP8FT9HV:IY=LZ>L[?M[AL\BMYBLYBLXAI]CL_FL_HN`KP_LR\KQYJQWHOUHOUHOWGQWGQXFRXFRYEQWEQQALQALQALP@KP@KO?JO?JN>IN>IO?JO?JP@KP@KQALQALQALN@OOAPPBQRDSVFSXFRYGS[GRaLUdMUfOWiPViPTiNSgLQhKPnMTqNUrOUtQUwSUzTS}TRSPPLOJ|KFyHCqD?h?9b;4\:0lL=jO>eK>XA9K61@..3$''!'&#$                    ""  !!!"%&+**+-..-+('%''(((),/25"9 $; %='>'? (? (> (='<&9%8$6#6#4!1 /-,,*)((())''' ' &!&!&!&#!" !%& +#+",#-$."-!, + '$#"$%()((* * + + + * ) * ,-//00. - 285- +/ 2 7 B Vm| %,0n&i%g$c "_WK D9? !F P _&\ Z!f+g )s,0012~4y2o #r'g i&/,5)70@%3*)$5(?"@=>'H'E%B&A(B$=q1`)f&7`#3a 4r";(L3_>tGyGk:T*< .l!(\#)T%+P).N.3K.3F-1A+.@*-A(,D',E&.C(1A'2>'1;&/9$-6"+2!)2!)/&/&0%0%2%4'7(6)6'3%1#-*(&%)FJ)FJ)FJ)FJ)FJ)FJ)FJ)FJ+HL+HL+HL,IM,IM-JN-JN.JN/KO1JO1JN2KO3KM6KN7KL7KJ;NL8C=8><9=<:>=:>=<>;=?<>><>?:<=8=>9?>9@?:C@;DA6E>6F=6E<5F;5E:4G:2G:2J91K:2M;1O=3P<3P<3Q:2Q:2O;4O:5N94N94M83M83L72L72J50J50J50J50K61K61K61J71H62F72F72E61E61E61E61E61E61E61E61F72F72G83G83I73J73J73J73I62H62H62G51G51E61E61C60C60B5/B5/?4.?4.@3+>1);.&9,$9,$;.&>1)?2*=0(=0(=0(KZ@MZ@MXAKXAKW@H]CL^DM^GO^IP]IRZIQVGNSFMRENRENREOREOTDOTDOVDRVDRQALP@KP@KO?JO?JN>IN>IN>IN>IN>IN>IO?JO?JP@KP@KQALP?OQ@PQ@PSBRUCQWEQ[GS\FR`KTcLThNWkPWlQVlOTjMRjKQpLVqLTqNTrOStRSwTR{SQ}TPTOSNPLMFyHCqD>lA:gA6{[F~_Jy\JjPC[D@==?<>><==;=>9>?:?>9@?:C@;DA6E>6F=6E<5F;5E:4G:2G:2J91K:2M;1O=3P<3P<3Q:2Q:2P;6P;6O:5O:5N94N94M83M83J50K61K61K61L72L72M83L93J84H94H94G83G83F72F72F72D50E61E61F72F72G83G83G83I62I62I62I62H62H62H62F72F72F72D71D71C60C60@5/@5/A4,@3+>1)1)?2*=0(.9@0;B0G3?F4BC2BA3BC2BE3CH3BK4DO7GR7HS8GT9HVKW?LV@LVAJU@IZCK]CL]FN]HO\HQWHOTELPCJPCLPCLOBLOBLQALSCNUCQVDRP@KP@KP@KO?JN>IN>IN>IM=HM=HN>IN>IN>IO?JP@KP@KP@KQ@PQ@PQ@PSAQUCQYEQ\FS^FS`ISeKTjOXmRYpSXoRWmPUmLSqKVsKTqLTqNRqQRuSQzTQ~UOUOUPVORLMI{JEvICsL=fNpTlWz_LlQF]IBK787&,1!++(%#"!" !               ""!!"""$&'')****,,+('%''(((),.13 7"9#?*A +@ +@ +?*=(:&7%7%5$1"/ -,++)(''')() ' ' '!'!&!&!&#&#    #%!( ( *!*!+!+!)(&$##%%((()-+ ( & & '& ( * -//-, + * , 10+ , 8F U h-$>%@0^SG DI T"V&L#B <$A'D N!Y)U&Q'[1j)?]+V \ i"n)m-k+v1o+f*k-w54482)| #)6$< ;9/|0t.t2x$;y'=s$:j!5[,]'5]-9Z&3e1$?3V;`9V?XDV:F,4t%+g&,^)/U&.P(0J)0G*/E*/E*/H+0I+3A%1?%2;#08".4 +1(.'-&)")"*!*!,"/$2%1$1$/!/!. ,)'%)FJ)FJ)FJ)FJ)FJ)FJ)FJ)FJ+HL+HL+HL,IM,IM-JN-JN-JN/KO/KO/KO2KO3KO4LN6KL6KL9ML:MK<>;;=:?@;?@;@?;@?;A@;A@;C@;C@9E>6E>6F=6E<5F;5E:4G:2G:2J91K:2M;1O=3P<3P<3Q:2Q:2Q<7Q<7P;6P;6O:5O:5N94N94K61K61K61L72M83M83N94M:4L:6J;6I:5H94H94G83F72F72D50D50D50E61E61F72F72G83H51H51G51G51G51G51E61F72G83F93E82E82B71B71A60A60?5,?5,>4+=3*<2)<2)<2)<2):0':0':0'9/&9/&8.%8.%7,&8*'7)(5*(5*(4)'4)'2(&2(&/'$.&#.&#-%")$ (#(#'")$ )$ )$ )$ )$ )$ )$ )$ '"'"'"'"'"'"'"'"($#&$%&$%&$%&$%&$%&$%&$%'%&'%&'%&'%&'%&'%&'%&)%&)#%*$&+%',&(,&(+%'*$&)#%,&(,&(,&(,&(,&(,&(,&(,&(.#+.#+/$,/$,0%-1&.1&.2'/2'/2'/2'/2'/2'/2'/2'/1'0/%0.&3/'40(50(5/'4.&3-%2/'4/'4/'4/'4/'4/'4/'4.(4.(2,)2-*3-*30*41)44*54*58,8:,9=-:?/KU?KU?KU@IYBJ\BK\EM\GNZFOUFMRBLOBKNCKMBJM@JM@JO?LQANTBPUCQP@KO?JO?JO?JN>IN>IM=HM=HM=HM=HN>IN>IO?JO?JO?JP@KSAQSAQSAQU@QWBQ[ER]GT`HU`FQeJSjOXpRZtU[sTZqRXrOVsKVsKTqLTpMQpPQrSPxUQ}VOVOXPYRVPSMQJRJUEpU{Zz^kUx\NjSKU@??,03$+- )(%%#$!#                """!""#$&'%(*)((*,+('%''((**-.025 7!@ +A +A +A +?*=(:&6$7%4#0!-+**+(%%%&')"*#' ' '!'!&#&#&#&#     #%!&'(())(&%#$$&&'')+.+ ( % % '%( + .0/- , - * + /- * - >Mc s(13q)U @< AFMJA=?*E/J&S&a,[&T$Z/d%8V&Q W ` c#e*j-s2l,f-k5p9o6q3q3l -o/t0y.|+}({'z(v(o'f%c(g 0i%4l%7i$6^+c#1d(4a#0h .y&6.B*@)@0FLL?NK?MMAMKBKJCIIBHF@DC>BA=?><>=;=:@@>@A:E>8F=6F=8F;5F;5G:4G:4H92J92L92M:3P<3R;3R;3Q:2Q:2S<6S<6S<6R:6R:6Q95Q95N94K61K63L74L74M85M:6O:7N;7K<7J;6J;8I:5H96G83G85F72C41C4/D52D50E63E61F74F74F42F42F42F42G53E63E63D63F85F85F85C84C84B73B73A60@5/@6-@6-?5,?5,=3*<2);1(:0':0'9/&9/&8.%8.%7-$7,&6+'5*(5*(3)'4)'2(&2(&2(&/'$.&#.&#-%")$ (#(#'")$ )$ )$ )$ )$ )$ )$ )$ '"'"'"'"'"'"'"&"($#&%#($%&%#($%&%#($%&%#)%&'&$)%&'&$)%&'&$)%&)%&($%*$&+%'+%'+%'+%'*$&)#%,&(,&(,&(,&(,&(,&(,&(,&*,"*,"*-#+-#+.$,/%-0&.0&.1'/1'/1'/1'/1'/1'/1'/1'0,$/.&3/'41)61)6/'4.&3,$1/'4/'4/'4/'4/'4/'4/'4.(4.(2.(2.(2/)3/)31)43)44*58,8:,9;-:>.;A/=C1?D2@C3@?1@?1@A0@C1?D2@I4CL5EM7DN6DP8EQ;GS=IT>JT@IT@IT@IYBLZCK[FOZFOZFOUDLQAKNAJNAJM@IL?IK>HN>IP@KSCPTDOP@KO?JO?JN>IN>IM=HM=HM=HM=HM=HM=HN>IN>IO?JO?JP@KSCPTBRSAQTBPWBQZFR^HTaIV`FQdHTlNXrS[uV^vU\vR\vQYtLUsKTpKRpMQoPNtRPxUQ}VQVPWRYUXSUNSJUIYFsRY`qU~cPqYMZGAA114%*.!()%'#&"%!"                     !"""$##"#$'($'))&%)++*)'(())+,-.0146 ?!+@ +A!,?!+> *:(7%5$4%1%."+ '''(%$$$%&("*#' ' '!'!&!&!&#&#  "%!#%&'('&%%%&&''')*,-*% ""$ "&* ./., + - * , / 1 .4 G` qt le`TF/ 7 B!F$B < 8<!>&F+K $S$_)Z "RX(O J O [e$d$h)n1m0b'])b2c5a4d5f6`/p;&B}!:o(b ^bn*j'c#^$^'`*c.e.f,j"0j"0h+l#.v*6v*4~*"6(>2G3E0?.<$/p%j'a)T!*K!+C"+B!*D'C)D$1@$0:$06"-1 *.'.%-$+!* ((&' +!+!)* +!,#+")!'!%,EL*EL,EL*EL,EL*EL,EL*EL-FM,GN.GN-HO/HO.IP0IP0IN1HN2JN2JN3KO5JO6KP7JP7JN7IM8JN>EA>D@=D?>M?=J<9I;:H:7G98F85E76E74E76E74E76E74E76F66J88I77G55C33B22C33D44D65H:9E:8E:8D97B75@64@64?53?6/?6/>5.>5.=4-=4-<3,<3,8/(7.'7.'6-&6-&5,%5,%5,%2)$2)$1(#0)#0'".'!-& -& /("/(".'!-& +$*#)"&!)$ ($!($!($!($!($!($!($!&"&"&"&"&"&"&"&"'# '# (""'# (""'# (""'# '!!&"(""'# )##($!*$$)%$)%&)%&)%&)%&)%&)%&)%&)%&+'(+'(+'(+'(+'(+'(+'(+&**#**#++$,+$,,%-,%--&.-&..'/.'/.'/.'/.'/.'/.'/.'/,&0,&2-'3-'3.(4.(4/)5/)5,&2,&2,&2,&2,&2,&2,&2,&2-'3.&3/'41)62*75*86+98,::,;:,;;-<<.=?.>@/?A0@A1>?/<@0=A1>D2>E3?G5AJ6BK7BM9DM9BO;DPGQ@FRAGUBHYDMYDMYCOWCNWCNTCMTCMRBLN>HN>HO?IO?INAJNAJOBLQALM=HNJP>JQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KP@KRBOSCPSCPTDOTDOUEPVEOXDO^GQcITkMYqQ\wS_yS^zQ_yQ\uMUrNRqMOqMMsOOxRQ|TTVWY[XZYXZVYP\M`NdIyQTZxXlTt_N^MEK=::..."$%'*!' '' ""!!                        !"############$$%%&((*+++****+--.146!8#8&9'8'8'6)6!*6!*5!*/ '+'($$!! !#& )#)#*#*#)")")#(#!! !     "%$#"%&%%&)+,(' # "      ! $ & & ) ) * + .2 14 :K^"n"q i c ]RC 7966 5 8 ; ;"?$I'K "I M T Z "[ #Y#KPV\i%r+p+g'e*Y&S&U,T0R,Z0g!9r"=y >x7o+j (h*d+\#W^!h'l*h(f'i,m#0p$1w&5x$4p+k(i!,e*0d(0f1r$>},L2T4V2P)?%2&.t#V#K&-C(1N>?N@?M?>L>=K=5.>5.=4-=4-<3,<3,8/(8/(7.'7.'6-&6-&5,%5,%3,&2+%2+%0)#/(".'!-& ,%.'!-& -& ,%+$*#*#'"($!($!($!($!($!($!($!($!&"&"&"&"&"&"&"&"(# (# (# (# (# (# (# (# '"'"(# (# )$!)$!*%"*%")%&)%&)%&)%&)%&)%&)%&)%&+'(+'(+'(+'(+'(+'(+'(+&*)$*)$+*%,*%,+&-+&-,'.,'.-(/-(/-(/-(/-(/-(/-(/-(/,&2,&2,&2-'3-'3.(4.(4/)5,&2,&2,&2,&2,&2,&2,&2,&2.&3.&31&43(64)75*87+97+99+::,;:,;;-@/?@/?A0@?/<@0;B0G6@H7AH7AK:BK:BL;AN=CP?EQ@FTAEUBHYDMYCOWCNWCNVBMVBMSBLSBLO>HN>HN>HO?IM@INAJNAJOBKO=IO=IO=IP>JP>JQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KRBOQCPQDNQDNREOTDOVEOXDO\GPbHSjLXpN\uQ]yP^zP^yO[uMUrNPqMOqMMuONyQQ}SUTWW\X]Y[YWZQ^OcPjLUˆX]\rXydQ`REMC:@533''*+- *((####!!!                          !!""%%#########$$$%%&(,-------.../025 6!6%6%4%4&5 )5!*3"*2#*- )+ ('&"#   #$ )#)#)")")")")"("! !     !##" ! %%%%'(++' $ "          # $ % ' * / 3 6 =FUc!p%n !c Y NC7 .962 238 !='D)J !P !O O QU[ !^'SQW c'r-z2{3y 6q5g3a2] 2W!1R-V-]0l6n4l.f (e+f0[,Q!Q^"j)o*j%h$g'j!,q%1z*7'7w/l(d(Y%)Q&-M$4R&?[%Gm'L/V<];U7F7>(-j!K>&;+>(@&<&:&2%+#*$,#1"4!3!0 *!%  !'%('')*.+1'1#/ -,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL-FM-FM.GN.GN.GN1HN1HN3GN4HO5IP5IP6IP7JQ7HP8IQ9JR:KS=KT=KTB>;C?GB?LA?N@=N@=N@=O@=O@;R?;R?;R=8R=8U<8U<7W;7W;7W<5W<5X=6X=6W;7W;7V:7T;7S98R:8K65L76M9:O;P=?N>?N>?N@?N@?M?>L>=K=5.>5.=4-=4-<3,<3,90)90)8/(8/(7.'7.'6-&6-&5.(3.*1,(/*&-($,'#*%!)$ )$ )$ )$ )$ )$ (#(#(#($!($!($!($!($!($!($!($!'# '# '# '# '# '# '# '# &!&!&!&!&!&!&!&!'"'"(# (# )$!)$!*%"*%")%&)%&)%&)%&)%&)%&)%&)%&+'(+'(+'(+'(+'(+'(+'(+&*)$*)$+*%,*%,+&-+&-,'.,'.-(/-(/-(/-(/-(/-(/-(/-(/+%1,&2,&2-'3-'3.(4.(4.(4,&2,&2,&2,&2,&2,&2,&2,&2.&3/'4/'40(53(64)75*85*87+97+99+::,;;-<<.=?.>@/?@.<@.DS@FU@GU@GXCLXBNWAMWAMUALUALT@KRAKN=GO>HN>HO?IO?IP@JNAJNAJP>JP>JP>JQ?KQ?KR@LR@LR@LSAMSAMSAMSAMSAMSAMSAMSAMRBORBORBMSCNTDOTDOUDNXDO[FOaGReIUlLYrNZvM[wM[wMYuMUrNPsLOsLMuMNyQRRUTWV^W^Z\ZX\UcUmZwYӏbӕdʕig|`kVgWHREEA>GB?LA?N@=N@=N@=O@;O@;Q?;R?9T?:T?:U>8V=8X<8W;7W<5W<5Y>7W>9X<8V=8U<8T<8S;9Q<9K65L87O;R?AR?AO?@O?@N@?N@?M?>M?>L>=K=5.>5.=4-=4-<3,<3,:1*:1*90)90)8/(8/(7.'6/)61-50,3.*1,(.)%,'#*%!)$ (#(#(#(#)$ )$ )$ )$ ($!($!($!($!($!($!($!($!'# '# '# '# '# '# '# '# &!&!&!&!&!&!&!&!'"'"(# (# )$!)$!*%"*%")%&)%&)%&)%&)%&)%&)%&)%&+'(+'(+'(+'(+'(+'(+'(+&*)$*)$+*%,*%,+&-+&-,'.,'.,'.,'.,'.,'.,'.,'.,'.,'.+%1+%1+%1,&2-'3-'3-'3.(4,&2,&2,&2,&2,&2,&2,&2,&2.&3/'4/'40(53(63(64)74)76*86*88*99+::,;;-<>-=>-=?-;@.F4@I5@I5@L8CL8AM9BP;DR=DS>EU>FU@GWAMWAMV@LV@LT@KT@KS?JS?JN=GN=GM=GN>HO?IO?IM@IP@JP>JQ?KQ?KR@LR@LSAMSAMSAMSAMSAMSAMSAMSAMSAMSAMSAMQANRBORBMSCNSCNTDOUDNWCNZEN_EPcGSjJWoKWqKXsJXsKVtLTqMQrKNrKLuMNyOQQTSWV^W_Z][Z^Xh[wd΃fnqܣvǗsjq\mZKUG8=/,1"./+)*&%%$#"                          !!""""""""""##$$%%'*+,,,---//--,-././ 0!1#2'2!)3"*3$+.!*+ ()'%$"# "#!" !"& & (!(!(!)")"("$!# "           ! ! ! $ %&$ "    !")-5 ANV Y Y\#VM A82., ,19 = = = = B P%U%U$S"U Y !_%d+Y"TZ!e'r+u,v-v0u5s6j1]'Z'^.^.X(\)a,^)U"P!Q%O&N!X!g(u!1v0k'a!^#_ )]'n(3z,:w$4n+g(^%T$S!*R$/S$6_$8*?5H:H9E6?1<$2$\)N#49!.$'!'&(+ - ..*(# !  "!$#'#+!* )!)$*')'% %" ",EL,EL,EL,EL,EL,EL,EL,EL+DK+DK+DK,EL,EL-FM-FM.GN0GM0GM0GM1HN3GN4HO4HO5IP5HO6IP8IQ9JR:KS:KS;IR:IPIK?JL@LLBLMDMLDMLGMMEIJHJIHJIIIGGGEFECDCAEA>KA?LA=NA;NA;O@;O@;Q@9R?9U@;UA:V?9V?9V=6U<5W<5V;4X?:W?;W>:V>:U=;S>;R=:R=:L76M98P<=Q??R@@R@@O?@N>?M?>M?>M?>M?>L>=L>=L>=K=63>71>71=60=60<5/<5/;4.;4.:3-:3-92,92,81+81+70*70*72.61-4/+2-)/*&-($+&"*%!(#(#)$ )$ )$ )$ *%!*%!($!($!($!($!($!($!($!($!($!($!($!($!($!($!($!($!&!&!&!&!&!&!&!&!'"'"(# (# )$!)$!*%"*%")%&)%&)%&)%&)%&)%&)%&)%&+'(+'(+'(+'(+'(+'(+'(+&*)$*)$+*%,*%,+&-+&-,'.,'.,'.,'.,'.,'.,'.,'.,'.,'.*$0+%1+%1+%1,&2-'3-'3-'3,&2,&2,&2,&2,&2,&2,&2,&2.(4.(4/'40(50(50(53(63(64(64(65)76*88*99+::,;<+;?-;?-;@.F2>G3?I3@J4@L6BM7CN9BP9CR;ET=GW=FU>FW?LW?LU?KU?KT>JT>JR>IR>IMHO?IO?IO?IP>JQ?KQ?KR@LR@LSAMSAMSAMSAMSAMSAMSAMSAMSAMSAMSAMR@NR@NQALRBMRBMSCNTCMWCNZEN]FPbFRgGTjIToIVqHVrJUtLUsLQsJNsJNuKMxNPPVQXU^X`[a\^a[l_|k؋owz٥w|gvaP\J>O@9@1,3$2 0-+- ))(&#"                          !"""""""""""##$$')**+,---0/-,,,--+,-/!0%0'1 (1")- )+ ((&%$"#!"!$!"  !!%%' ' (!)")"*#(#'"% #!              " $%# !      &, 09 FR!X$WP J D <4. , .0/4 ; = < < ? F Y*U%NQ Z%a)b(`'Q S["e'q*w.t+g%X#T$N HN \ ,a#0]+d /g 0c+["Y ]%_'\#^#g+t#2s 0j(_"\$\ (Q_ )o%2r!0p,o,l,d)V$Q'Q!/Y#1k!0#1,79C-74@.>.d(K06 -! !#%(*+-*%"  !$"(%+#.!,*))!)"&$ ,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL-FM-FM.GN.GN.GN/FL0GM0GM0GM3GN4HO4HO4HO4GN5HO7HP9JR9JR9JR:HQ:IP:IL;R?;N:9O;:O==P>>P>>P>>N>?M=>L>=L>=L>=L>=K=63>63>71=60=60<5/<5/;4.;4.;4.;4.:3-:3-92,92,81+81+72.61-4/+3.*1,(/*&-($-($+&"+&"+&"*%!*%!*%!*%!*%!($!($!($!($!($!($!($!($!($!($!($!($!($!($!($!($!&!&!&!&!&!&!&!&!'"'"(# (# )$!)$!*%"*%")%&)%&)%&)%&)%&)%&)%&)%&+'(+'(+'(+'(+'(+'(+'(+&*)$*)$+*%,*%,+&-+&-,'.,'.+&-+&-+&-+&-+&-+&-+&-+&-*$0*$0*$0+%1+%1,&2,&2-'3,&2,&2,&2,&2,&2,&2,&2,&2.(4.(4/'4/'4/'4/'41&41&42&43'54(65)77)88*99+:9+:=-:?-;@.KV>KT>JT>JS=IS=IQ=HQ=HO;FMHN>HO?IP>JP>JP>JQ?KQ?KR@LR@LR@LSAMSAMSAMSAMSAMSAMSAMSAMQ?MR@NR@LQALRBMSCNTCMTCM[FO]FPaEQeGSiHSlHTnHUqITsKTrJRrIOrIMuKOzMPOUPWU^Xa]d^aa\lb}oލrw봍Фvn]jWIZIAH92;*#6$ 4" /-/ **)'#"!                       !!!!!!!!!"""#$$&'()*+,,-/.-,+,-,+,-- .#.%.&.&+'*&'%$##"!"!$#"" !  !$$&' (!)")"*#-%,$*"& %!            ! $$#      "&.5= HPT O F:4 1-( ( -0 7 9; 958B L$X+R#H K W%_*^'X"HP\$e)t/} 5y2j*KCDGT"`$,e&/d",j(2h$/c'] c#k)j'` b&e*m-m+e%^"Y#X&JV"d)i)o+v0v"2o!/n(3`"-U!.R+T"f#+4*51=,=*\ "G'7**%& '()*))' !#"&#+'.%3"0+)*)'%,EL,EL,EL,EL,EL,EL,EL,EL-FM-FM-FM.GN.GN/HO/HO/HO.GN.GN/HO/HO1HP1HP3GP4HQ3GP4HQ6HR7IS9JT9JT8IS7HP8JN;JM;JM;JM=KN=KL?JL@JKCMNDMLGMMHLMHLMIKJIJLIIGMEBNE@NE>OD>OD>QD>RCR@>Q??P>>O==N<63>71=60=60<5/<5/;4.;4.<5/<5/;4.;4.:3-:3-92,92,61-40-3/,2.+1-*/+(/+(.*'-)&-)&,(%+'$*&#)%")%")%"($!($!($!($!($!($!($!($!)%")%")%")%")%")%")%")%"(# (# (# (# (# (# (# (# '"'"(# (# )$!)$!*%"*%")%&)%&)%&)%&)%&)%&)%&)%&+'(+'(+'(+'(+'(+'(+'(+&*)$*)$+*%,*%,+&-+&-,'.,'.+&-+&-+&-+&-+&-+&-+&-+&-)#/*$0*$0+%1+%1,&2,&2,&2,&2,&2,&2,&2,&2,&2,&2,&2.(4.(4.(4.(4/'4/'4.&3.&30%31&42&43'55)76*87)88*9=,<=,HN>HN>HO=IO=IO=IP>JP>JQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KS>MQ?MR@LR@LSAMSAMSBLTCM\GP^GQ`FQdFRhGRkGSnHUoITsKTrJRrIOrIMuKOzMRNWOYS_Yd]g_da_ja{m߉nq}š嶘Ġoi[iWMWF>G4-?,&:'#3/0,,)(&"!                       !!!!!!!!!!""###&%%&'(*++,,+**+,-,++,-",#+#+#*&($&$#""!"!#$#"#!"  ##%&' )"*#,#1'0&.$*!($        $%%!   !%3:B J LJ E;.* ) &% % +/ 7 ;>; 66? GO#J C D L S"V!S I MW"e*r0w 3t2k,RJP]"(i*2l)2h%.e"+f#,e$,c )b&g)o!.m)c a&a(d&d$`"\"V"S$M T$[%`%j*t2u"4q00Ao&7Z1O*I!P k!)$//o%U !K%G(?&41/+*'%# !$#(%.(1'6%3-)(((%,EL,EL,EL,EL,EL,EL,EL,EL-FM.GN.GN/HO/HO0IP0IP0IP.GN.GN.GN/HO0GO1HP3GP4HQ2FO3GP6HR7IS9JT8IS8IS7HP9KO8LM9KO9KM9KM;JMIKEPRDNODLNEKKEKKFLLJNOMONNIFPICPICPIAQHARGATGATG?TE>UD5Q=4Q=6VC?UCAUCCRC@TB@QB?SA?R@>SAAQ??O==M;;I99J::K;;K;;I;:I;:I;:J<;J<;J<;J<;J<;H:9H:9H:9H:9H:9H:9H:9H:9I;;J<>I==G;;E99C98E;:C;9C;9B:8@86?75=85<74>63>71=60=60<5/<5/;4.;4.<5/<5/<5/;4.;4.:3-:3-72.40-40-3/,2.+1-*1-*0,)0,)/+(/+(.*',(%+'$*&#)%"($!($!($!($!($!($!($!($!($!)%")%")%")%")%")%")%")%"(# (# (# (# (# (# (# (# '"'"(# (# )$!)$!*%"*%")%&)%&)%&)%&)%&)%&)%&)%&+'(+'(+'(+'(+'(+'(+'(+&*)$*)$+*%,*%,+&-+&-,'.,'.+&-+&-+&-+&-+&-+&-+&-+&-)#/)#/*$0*$0+%1+%1,&2,&2,&2,&2,&2,&2,&2,&2,&2,&2.(4.(4.(4.(4.&3.&3.&3.&30%30%32&43'54(65)77)87)8:,;=,<>-=A/=B0>F1@G2AI3@L4BM5BP6CQ7DT8FU9EY;GW;GW=JTHN>HNJP>JQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KQ?KS>MS>MS?KR@LR@LSAMSBLVBM]HQ^GQ`FQbFRgGRiHSmIUoITsKTrJRrIOrIOtJNzKQNWOYR^Xd^i`e`_iaylއlm{Öˣãԯ}witbVaPFO<5E2+>+%6#01-,*(&$#                       !!!!!!!!!!!""##$"$%&()**++***+-- +++**!*!)!*"($'#%##!" "!"##"#!"  "#%&' )"*#,#2(2'0%,")&# "      !$%$ !     % 6=D I H C ;3'% & &$ $ )-/8B!C"?9 7 ; CC? = @EK NMJQ_(i+j*g)d(^'Y!b!'u/7~7?v-6k"+e&\ b!'g&,e$*i#+l#,k(c"a%]#]] ^ ZT P T'T'V#W!a'l"1n$3k.y&8k0X*P+P,Q(W^hjb"Z"X%](_&X!G ? 71)$#! "!%#*%0)2(9'5"-)')''*CJ*CJ(AH(AH(AH(AH*CJ*CJ,EL,EL-FM-FM.GN.GN/HO/HO-HQ-HQ/GQ/GQ/GQ/GQ0FQ0FQ5IT5IT5IT6JU7IU8JV8JV9KU7JP7LO8KQ9LP9LP;MO=LO>LO?MPALNCMOEMOFNPGOQJORKONPOKSNJSNJSNHUNHTMGULGVKEVICUH@TE>TC>M==L<;J<;J<;J<;J<;J<;J<;J<;J<;I;:I;:I;:I;:J<;J<;J<;J<;I==I==I==I==I==I==H>=H>=F<;D<:C;9@;8>96=85<74;63;62;62;62;62;62;62;62;62<73;62;62:5194083/72.61-62/21/0/-10.54265343110.0/-/.,.-+,+)+*()(&('%'&$)%")%")%")%")%")%")%")%",(%+'$)%"'# '# '# )%"*&#)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!($%($%($%($%($%($%($%($%*&')%&)%&)%&)%&)%&($%(#'+&,*%,(#*'")'")(#**%,+&-)$+)$+)$+)$+)$+)$+)$+)$+'!-(".(".)#/)#/*$0*$0*$0*$0*$0*$0*$0*$0*$0*$0*$0*'2*'2*'2*'2,&2,&2,&2,&2.&3/'41&42'52'53(64(64(65(97)89+:=,<@/?C1?G2AI3@K3AL4BP5DR8EU9GW8GW8GU9GVJP>JP>JQ?KQ?KQ?KR@LR@LSAMSAMSAMU@OW@PWANWCOWCOXDPXDOXDOYDM[DN^DOaEQfFQiHSlHTmISlGOnIPrKPrIOrGNvIP|JSMWP_Uc[f`fcejeukgjtȞƦߺ|ugvdX_MCM:3D1+?,(9%$5!"1!0 . +)''%"!                          """"""""%&&''((('''''''')'''&%%%&"&"&#&$&$&$'''%&$%""   !!!"$' *#.%0#1$0#/", ($ #      !"" #       &0= B D B<864 ! #$" ! % (+.02 5 79<:=<?CB? <GFKU#a'b'Y Q e&f$k 's#,y(1x(1t$-l!(i$)d#'g),k/1i(,_!a i )c(^#_ e%h(a%X#T$U(P&R%Q#S#T$S%X$e(f+Y*M'J&K)J$DCE"E$M%f,'6!1-n+K520$%"& *$)#&#$"%"(#-&/%/4%1 &( #%*&*CJ*CJ(AH(AH(AH(AH*CJ*CJ,EL,EL,EL-FM-FM.GN.GN/HO-HQ-HQ/GQ/GQ/GQ/GQ0FQ0FQ4HS4HS4HS5IT6HT7IU7IU7KT6JQ5MQ5MQ7LQ8MR9LP;MQ=LO=LO?MPBMQCNPEOQFPQGQRJPPPPNQPLQPLQPKROJROJUMJUNHULGSJCUHBSF@SD?TE>UF?VGBTFERFFRFFRFFQEEQCBOA@OA@M?>M==L<=H>=G?=D<:D<:A<9@;8>96=85<74<74;62;62;62;62;62;62;62;62<73<73;62:5194083/72.62/43121/0/-10.43154232010.0/-/.,.-+-,*+*()(&('%('%)%")%")%")%")%")%")%")%",(%+'$)%"($!'# ($!)%")%")$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!($%($%($%($%($%($%($%($%($%($%($%)%&)%&)%&)%&)$(*%+)$+(#*'")'")(#*)$+*%,)$+)$+)$+)$+)$+)$+)$+)$+'!-(".(".(".)#/)#/*$0*$0*$0*$0*$0*$0*$0*$0*$0*$0)&1)&1)&1)&1+%1+%1+%1+%1.&3.&31&41&42'52'54(64(64)95*:8,:;-<=/>A0@D2@G2AJ3CL4BN6DS8GU9GX9HX9HW8GW;IVJP>JQ?KQ?KR@LR@LSAMSAMSAMVBNV?OW@PWANWANWCOWCOXDOXDOYDMZEN^DOaEQeGQgGRjITlHTkGQmJQoJQqJOqHNsHO|JSMWQ_Uc[f_ebdjevl؀hhsȞȧ߻qnbhVLTA:H5/A.*;'&6"#3!1!/!,*)(($"!                           """"""""%%&&''((''''''''''''&&%%&"&"'$(%(%(&*))'&$%"# !  !!!"$' )"-$/"/"0#/", )&$%#   "##! $      *2= @ @ <4. , (  "# $ & ' (' ( *, . 0 26A @<896 641 8 DOTSNL Z[_ck$m&j%g#n'-k)-k*.l+/i'+c#`b"e*b'f(m.n/e)]&Y(S&N$M#J!I I H!L Z#_%X(Q&M(L*D'8!-.4"G#m,*7&4#68c *C6 +%,#,#)#'"%"(#,&.$- 1$/&'%+ .+*CJ*CJ(AH(AH(AH(AH*CJ*CJ+DK,EL,EL-FM-FM.GN.GN.GN,GP,GP,GP,GP,GP,GP.FP.FP0FQ1GR3GR3GR4HS5IT5IT5IR3LQ3LQ3LQ5MQ6NR8MR8MR:MQ;MQ=LO>MP@NQCNRDOQEPRHPRMQPOQNOQNOQNQQOQRMTPMTQLSNJRMITJHSJESHDSHBTICTIESIHRHIPFGOEFMCDNBBNBBNBBK@>L>=K=0?A0@C1?H3BK4DN6DR7FU9HV:IX9HX9HW;IV:HU;HU;HT:GS9FQ9FQ9FN8DN8DN8DN8DM9DM9DM9DM9DL:FL:FM;GM;GNK==L>=K=:7=96<85<85;74;74;74;74;74;74;74;74<85<85;74:6395284173062/32021/10.10.21/10.10.0/-10.0/-/.,.-+,+)*)')(&)(&*&#*&#*&#*&#*&#*&#*&#*&#+'$*&#*&#)%"($!($!($!($!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!($%($%($%($%($%($%($%($%$ !%!"&"#'#$($%*&'+'(+&*(#)(#*(#*'")'")(#*(#*(#*(#*(#*(#*(#*(#*(#*(#*(#*& ,'!-'!-(".(".)#/)#/)#/)#/)#/)#/)#/)#/)#/)#/'$/(%0'%0(%0(%0(%0(%0*$0*$0,$1,$1-%2-%20%30%31&4/'40*8.*82,:4,;8-;;/==/>@/?E3AH3BL6CO7ES8GV:IV:HV:HV:HV:HU;HT:GT:GS9FQ9FP8EO7DN8DN8DN8DM9DM9DM9DM9DK9EK9EL:FL:FM;GM;GNNY>OW?MX@NWANWCOWCNWCNZENZEN\EO_EPaFOeGQgGRgGRdEMgHPiJPjJOmHOpINyKUMXP]TaZe^ecdkhxpۅnlzƖ̣ƥݻĩw|hafQLU@=K65C-/?),9#&7 &4#1 .,++%%"!                           !!!!!!!!!!!!!##$$%%&&&&&&&&&$&&&'''( ( )#*$+&-(/*0 +2"/1$.*''$%""   "#$%' ) **+, , , + + ,!+ )'''(''%#%')'%" !       $,2 34 3 /' $ ""' ,. -*!!  "#' ) - 96.,-2786;@CI OS&[&,d)+c''b&&`&%`&%b&&e%&f$&i"&m%)n!'k$r#)w*0r%+d$VT Y$^'Z#O M Q!Q$M#J!E@<::EKMKO!P&G%94%."0Dl &'#4?x5O7%#-$-#-"*"'!$!%")%,$.#-!*!+ 1"9"BB*CJ*CJ(AH(AH(AH(AH*CJ*CJ*CJ+DK+DK+DK,EL-FM-FM-FM+FO*FQ*FQ*FQ+FQ+FQ-EQ-EQ.FR.FR/ER0FS2ES3FT3FT1GR0KR/LR/LR1LS1LS4MR5LR8MR8MR9LP;MQK=M?>L>=L>=K=:7>:7=96;:6;:6;74;74;74;74;74;74;74;74=96<85;74:63952841730730320333333222000//////000000000///---+++***))))(&+'$+'$+'$+'$+'$+'$+'$+'$*&#*&#*&#*&#)%"($!($!'# )$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!($%($%($%($%($%($%($%($%$ !$ !%!"'#$($%)%&*&'+&*'"('")'")(#*(#*'")'")'")'")'")'")'")'")'")'")'")& ,& ,& ,'!-'!-(".(".)#/)#/)#/)#/)#/)#/)#/)#/'$/&#.%#.%#.%#.&#.&#.&#.&#.*$0*$0,$1,$1-%2-%20%3.&3-)7-+9/+90,:3-;6.=9.<:.D2@I4CM6FP8FS8GT9HU9HV:HU9GU9GT8FS9FR8ER8EP8EN6CN6CM7CM7CM7CM7CL8CL8CJ8DJ8DK9EK9EL:FL:FM;GM;GP>JP>JP>JQ?KR@LR@LR@LUAMX=NX=NV>LW?MV@MWANVBMWCNYENZEN\EO_EPaFObGPdFPeGQaCKdFNfINhINkHNnIPvKU}MYN]SbWe\fbemi{rވqvΟШƦ׷zlglWR]ECP88H/2D+/=$(;"&6 #3 0.,+&%$#                           !!" """" !          !!""##########%$$%& & '!'!*$+%,'.)0 +2"-3#02%/+((%&##  "#$%%%'''()+,- . -,+**+++(&()*(&# # #!  $(+ ()) &#   " % #$( ,. -(" ! !"% ( * . 00, +/369889 @ KPN!MWZZ!X !U"!U"!X ![!g%)k$*k 'h$l#*r-2j)-\#QN N O!J C E J!O&M%K$H#C!?:9BEFDGN#J$>=(4#0= Zz*6n0N 9 *"$',"+!'!% # $!'$)#.%-",07AP!W"*CJ*CJ(AH(AH(AH(AH*CJ*CJ*CJ*CJ*CJ+DK+DK,EL,EL+FM+FQ*FQ*FQ*FQ+FQ+FQ-EQ-EQ.FR.FR/ER0FS2ES3FT3FT2HU/JS/LR/LR/LR1LS2MT4MR5LR7LQ8MR:MSK=:K=:L=:L=:L>=L>=L>=L>=L>=L>=L>=L>=N@?N@?M?>L>=K=:7>:7>:7>:7<;7<;7<85<85<85<85<85<85<85<85=96=96<85;74:63952841653444555555444111///000111111000///...,,,***)))))'+'&+'$+'$+'$+'$+'$+'$+'$)%"*&#*&#*&#*&#)%"'# &")$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!($%($%($%($%($%($%($%($%%!"%!"%!"&"#'#$($%)%&)$(&!'&!('")(#*(#*'")&!(&!('")'")'")'")'")'")'")'")%+& ,& ,& ,'!-(".(".(".(".(".(".(".(".(".(".&#.$"-$"-$"-$"-%"-%"-%"-%"-)#/)#/+#0+#0,$1,$1/$2,&2+)7+*8++7.,90,:3-;5-:7,:<.=@0=D2@I4CM7DP8FR7FS8GU9GU9GU9GT8FR8ER8ER8EQ7DN6CN6CM7CM7CM7CM7CL8CL8CI7CI7CJ8DJ8DK9EK9EL:FL:FNJP>JQ?KS?KWLV@MWANVBMVBMYENYEN\EO\EO`ENaFOcEOcEO^CJ`ELcHMeHMhHMmHOuKU|NYN\RaWd\ebenj|sߋs|ÌԥԫŤӵ{pkr]ZcKKT;>K05E*/>%)<#'7!$3 0-++&&%$!                         "##$ $$$#!          !!""#######"#$$%& '!("(",&,&-(.)0 +1!,2"/3#.,)*''$# ! "$$$$####&')+,--,-,,-+-)((***' % %&&$!  #$"   ! $ $&'(, - *' $! # % ( + ./0--002 3 ;;BM X&Y'M FNRTRO"P# U#"Y##k-0m(-j!(g%h#(e'*\$%P T'N#K I EA CJ#J#J#J#G#B!=87?A?=BH"H$? <#1- 5 E X o |$s.b+M#>2(#! +"*!&!# " #!%$(#+"+,3=Kb's/*CJ*CJ(AH(AH(AH(AH*CJ*CJ)BI*CJ*CJ+DK+DK,EL,EL*EL*EP)EP)EP)EP*EP*EP*EP*EP.FR/GS0FS1GT1GT2HU4GU2HU.KS-KS/LT/LT1LS1LS3LQ5LR7KR7LQ9LR:MS;M>9M>;L>=L>=L>=L>=L>=L>=L>=L>=OA@OA@N@?M?>L>=J<;I;:G<:F::E;:E;:E;:D<:D<:B=:B=:?:7?:7>:7>:7<;7<;7<;7<;7:97:97:97:97:97:97:97:97;:8;:8:97986875764653653555777888666222000111222111111000...,,,+++***))',(',(%,(%,(%,(%,(%,(%,(%)%")%"*&#+'$*&#)%"'# &")$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!($%($%($%($%($%($%($%($%&"#&"#&"#&"#&"#'#$'#$'"&% &&!('")(#*(#*'")&!(% '&!(&!(&!(&!(&!(&!(&!(&!(%+%+& ,& ,'!-'!-'!-(".(".(".(".(".(".(".(".&#.$"-##-$"-$"-$"-$"-%"-%"-(".(".)#/)#/+#0+#0,$1+%1*)7(*7)+8,+9-+8/+93+:5*89+:=,LV@MV@MUALVBMYENZFO\EO\EO`EN`ENbDN`EN[AJ^EKaHLcHMfGLlIOtLU|NYN\Q`Vc[dadnj~tߍwǑ٪խƦдwtzebiQQX>AM05D)0>%)<#'9 $5 /-**''%$!                       ! " #$ $ & & & & $!    !!"""""""!#"#%'!(")#)#-'-'.).)0*1+1-1!,- **''$$!! "$$$""!! !"$)*+,,..--,-+)),,*& & &()'%!!% ' !%#"       $ #')**)' % !  "$'+.01. .003 3 =AK!T&Z'Z'Q$Q VXU!O!!J" L$"R&%Z()k04i&-g (h!)d#)[#&Q!!N "W*P$K J"H!BAD CCD B ?:54;A"=!:<B$@$:7!.(,14?M"S %Q $H"A":$2"+%(!& # " " " $#'"&(+6BVw.*@*CJ*CJ(AH(AH(AH(AH*CJ*CJ)BI)BI*CJ*CJ+DK+DK,EL,EL*EN)FN*EP*EN*EP*EN*EP*EN/GS/GQ1GT1GR2HU2HS3IV3IT/JS.KS/JS0KT2KR3LS4KQ5LR7KR8KR9LS:MS;J?=L>=J?=L>=J?=L>=J?=PBAMB@N@?K@>L>=H=;I;:G<:D<:D<:D<:D<:B=:B=:B=:B=:>96>96>:7>:7>:7<;7?;8=<8:97:97:97:97:97:97:97:97<;9;:8:9788686766466655557678:89;679124/10013333222111000...---+++****)',(%,)$-(%,)$-(%,)$-(%,)$)$!)&!,'$+(#,'$)&!(# '")$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!)$!($%($%($%($%($%($%($%($%'#$'#$&"#&"#&"#&"#&"#% $$%% ''")(#*(#*'")% '$&&!(&!(&!(&!(&!(&!(&!(&!(%)# )%)$!*& *%"+'!+&#,(",&#,(",&#,(",&#,(",&#,#"*""*#!,#"*#!,#"*$!,$!*&#.&#,(".)#-)#/*$.*$0)&1))5(*6*)7++7-+8.*81+94)97*;9+:?.>C1AF4DJ5FL7FM6FT9HT8GT8GS7FS7FR6DR6DQ7DO5BO5BO5BM5BM5BL6BL6BK7BH6BG7BG7DH8CH8EI9DI9FJ:EJ:GJ:EK;HK;FM;IM;GNLU>NUAMUAMVBMZFQ[FO\EO\EO^DO_DM`DP`DP[AL]CL`GMbGLfGLiINsKSzOXNZR^Wa\dbdnkwߎyȓګ֮ĥҴ}wkfmUUZ@AK14C(-<&):$'7 &2!.+)('&%"!                 ! !##$ $ $ $ $ #!     !"""""""!#"$&'!(")#*$.&.(.(.(0)0)0*/)0 *,&)#%" ! !#$&#$!!  #%))*+,+*)(.,)*++(& ''*--+(', + * &"      "%) ( &$# %  !$%),./- - /378 :@FGH KPY '_ (^!(W %L CBH P"$b.2^#)]&b#+a&,U#&O#$S&)Q'J!EF!F"?;;<===;6327 ;#:#8"9%=';%36#-)*"( "$ 09 ? AB#C'B);&4"+'#!!" $!'""$*7G\! 54M)BI)BI)BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ+DK+DK,EL,EL,EL*EL,DN,EL,DN,EL,DN,EL/GQ/HO0HR0IP1IS1JQ2JT2KR1JQ1JQ2IQ3JR3JR4KS6JS8JT8JT9JT9JT:KSLU@NWBOXBOXEOYEOYFPZGPYGPYJQYJQYKRXKRXNSYNSYOTZPSXRQVRRTRRTRRTSQTTPQTPQUOOTNNSNKSKIRJHQGFOECMCAMD?LC>KB=LA=KB=K@K@CB>DC?DC?EA>D@=B>;A=:@<9?;8?;8>:7>:7=96>96=96@<9@<9@<9@<9>=9>=9>=;>=;;;;;;;<<<;=<;;=8:967937827:27:37:37:269267269457013013/10/10//////..,/.,2-)1,&2*'/*$1)&/*$2*'1,&.&#,'!.&#,'!.&#,'!.&#,'#*%")%")%")%")%")%")%")%")%")%"($!($!'# '# &"&"($%($%($%($%($%($%($%($%&"#&"#&"#&"#&"#&"#&"#&!%'"('"('"('"('"('"('"('"('"('"('"('"('"('"('"('"(%")$#)%")$#)%")$#)%")$#)$!(#"($!(#"($!(#"($!(#"($#)$#)$#+$#)$#+$#)$#+$#)$#+$#)%"+%")%"+%")%"+%"+(%0)&1)%3*'2*'2-'3.&5.&56+;7*<9,>=.A?0CA2EC4GG4GN7IP8HR:JU:KV9KS7FO3BM1@M1@N2AP4BQ7DO8BN7AL7@J6AF8ED:ED9GD:EE9GE9EE9GE9EJOS>OS>OT?NT?PU@OU@OUAMYCPZDP[CP[CP\DQ^DO_ER_ER`FScGUdIReGOdEJhEIlHLsHO~LUOXU\Y]_`kf{t։u~Œ֪ҭæݹǪv}lbiVPWB=K31B-,8%'2"%/$-"-"+ '$%"                                !!            !#"%')+!,"-#,"+#*")!*"+#-%0%0%1"0!.,*)(&&%%%##"   !!""#$%%&(*,--.,*)'(*,01454 0* $      ! " $$) ) ) ( ) )),4 4 1 0 2 7>A?IQ"S!NIINTU S!R#N #K!H GO"%O!$Q $P#P#N #N #N!&E#D#A!?;9769:<;;9746 3!0../1!0"/!- *(()* .!/29E!Q*R*K$>.+(%" "%$)1"; M"e+9'E)BI)BI)BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ+DK+DK,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL/HO/HO0IP0IP1JQ1JQ2KR2KR2IQ2IQ5IR5IR6JS6JS7IS8JT9JT9JT:KU:KU=KV=KV=KV>LWAMYBNZDNZDNZEO[EO[GOZGOZJQ[JQ[JQYKRZMQZNR[NR[PSZRSWSSUSSUSSUSQTSQRUQRUQRTPQSONSMMQLIQIGPHFNFDNFCMCAMD?MD?LC>LC>KB=KB=KB=QHCPGBOFAMD?KB=JACD?CD?CD?CB>BA=@?;?>:@<9@<9?;8?;8?:7?:7>96>96@<9@<9@<9@<9>=9>=9>=;>=;;;;;;;;<>;<>:;=9:<59:38;38<19<38<27;27:27:269269124013021021000/////-0/+3.*4-'2+%1*$1*$1*$2+%3,&.'!.'!.'!.'!.'!.'!.'!,'#)%")%")%")%")%")%")%")%")%")%")%"($!($!'# '# &"($%($%($%($%($%($%($%($%&"#&"#&"#&"#&"#&"#&"#&"#'"('"('"('"('"('"('"('"('"('"('"('"('"('"('"(%#(%#($#($#($#($#($#($#($#(#"'#"'#"'#"'#"'#"'#"'#"'$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)(%0+%1+%1+%1,&2,&2.&5.&54):5*;8+?:-ALW>LW>LWAMYAMYCMYDNZEO[EO[FNYGOZIPZJQ[JQYKRZMQZNR[NR[ORYRSXSRWSRWSRWUSXUSVUSVUSTVRSUQRUOQTNNRLLQKKRIJQIGQGEPFDPFDOECOECNDBNDBNDBRHFQGEPFDOECMCALB@J@>IA>FB?ED@ED@ED@DC?BA=@?;?>:A=:A=:@<9@<9?;8?;8?:7?:7@<9@<9@<9@<9>=;>=;======<<<<<<<=?<=?:>A9=@7;>5:=5:>3:@5:>49=49=38<48;37:23523523512422211111110.3/,3.*1,(0+'/*&/*&0+'0+','#,'#,'#,'#,'#,'#,'#,'#*&#*&#*&#*&#*&#*&#*&#*&#*&#)%")%"($!($!'# '# '# ($%($%($%($%($%($%($%($%&"#&"#&"#&"#&"#&"#&"#&"#'"('"('"('"('"('"('"('"('"('"('"('"('"('"('"(%#(%#($#($#($#($#($#($#($#("!&"!&"!&"!&"!&"!&"!&"!&$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)$#)(%0(%0*$0+%1,&2,&2-%4.&52'83(95)=7+?:-A!<:865488777787,*) ( ' ())('%$$%%&'&+7B"I%H!E:94.&!""#%&)0 = O"Z()BI)BI)BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ+DK+DK,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL/HO/HO0IP0IP1JQ1JQ2KR2KR3JR3JR5IR6JS6JS7KT8JT9KU:KU:KU:KU;LV=KV>LW>LW?MX@LXAMYCMYDNZDNZEO[FNYFNYIPZIPZIPXJQYMQZMQZMQZOR[RRZTSYTSYTSYVSZVTYVTYVTWXSWWRVXRVVPRUOQTNNULOTKLTJITJHSIGSIGRHFRHFQGEQGESIGSIGRHFQGEOECNDBMCALDAIEBGFBGFBFEAED@CB>@?;?>:B>;B>;A=:A=:@<9@<9@;8?;8A=:A=:A=:A=:?><>>>>>><<<<>==>@>?A;?B:>A9=@7<@8=C6=C7<@6;?5:>5:>59<59<45945745734644433333343140-4/+2-)0+'/*&/*&0+'0+'-($-($-($-($-($-($-($-($*&#*&#*&#*&#*&#*&#*&#*&#*&#*&#*&#)%"($!($!($!'# ($%($%($%($%($%($%($%($%&"#&"#&"#&"#&"#&"#&"#&"#&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'$"'$"'#"'#"'#"'#"'#"'#"'#"'"!&"!&"!&"!&"!&"!&"!&"!&#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"('$/(%0*$0+%1+%1,&2-%4-%40%61&72&:4(<7*>8+?:-A;,?D1DG2CJ3EL5GO7GQ6GQ4FP3EO3BN3BN4AL4AK5AI5@I5>E5?B8C@8E@8E@8EB7EB7EB7EB7EB6DC7EE7FG9HI;JJB+39(.5&+1"'0!&/ '.&*"'%"                                                   ""#$%'((+!+!+!+!,","-#/"3 $4 "3!2 1/...-+)'$#!      !!!%)++,++)(+-0356770- ) $        "#% ' * ++, . 3 79?>BEKL KHJIGGEDCBBCF!H#J $M %N%K '?<;9754397644678,*) ) (()'('%$$%%&$"%,6?"B!DED@7,% !$$$& , 7>)BI)BI)BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ+DK+DK,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL/HO/HO0IP0IP1JQ1JQ2KR2KR3JR4KS6JS7KT7KT8LU9KU9KU:KU;LV;LVLW?MX?MX?MX@LX@LXBLXCMYCMYDNZEMXFNYHOYIPZIPXIPXLPYMQZMQZNQZQQ[RRZRRZSS[UT\UTZWT[WUZWUZWUZXSYWRVWQUWQSVPTVPRVNLUMKUMKTLJTLJSKISKISKISKISKIRJHRJHQIGPHFOGEOGELHGLHGKGFKGFIEDFBAD@?B>=C?>C?>B>=B>=A=?=>>>@>>@<=?=>@>?C=AD=@E=@ED7<@6;?69>6:=67;67;67956866855755565351.50,3.*1,(0+'/*&0+'0+'-($-($-($-($-($-($-($-($+'$+'$+'$+'$+'$+'$+'$+'$+'$*&#*&#*&#)%"($!($!($!($%($%($%($%($%($%($%($%&"#&"#&"#&"#&"#&"#&"#&"#&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'$"'$"'#"'#"'#"'#"'#"'#"'#"'! %! %! %! %! %! %! %! %#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"(#"('$/'$/'$/(%0*$0+%1+%3,&4-$5-$50$82&:3';5)=7*>8)6C>6C>6C@5C@5C@5C@5CA5CB6DD6EF8GH:IJMT?NT?NU@OV@MV@MV>LV>KW?LW?LZ@KZ@K[AL[AL]AOaCOcEOcEMdDIhEIoHMtIP~MSSYZ__ad`lcxk΃lvʥ「Өv|u`i^IRK3@?)5:)16',2#(0!&0!(.&+#'& "                                                        !!"#$%%&))* +!+!,","- 1"2 110/...-+)'$#!      #(**,**))-.045666. , ) % "         "$ & ' &(()- / 2 5 @ >@DK$N'L%I"DBB@?@>>=>C!F#H$I%J$H$=987543275422455-+++++((*('&%&'&!"+2:>N%O%M#D 4( "$$#$&,1)BI)BI)BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ+DK+DK,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL/HO/HO0IP0IP1JQ1JQ2KR2KR4KS4KS6JS7KT8LU8LU9KU:LV;LV;LV;LVC?>B>=B>=A=<@?=@?=@>?@>?@>??????A>?A=>@>?C=AD>AF?BG?BG>AFB8=A8;@7:?9:>89=89;78:88:77977787573061-4/+2-)0+'/*&/*&0+'.)%.)%.)%.)%.)%.)%.)%.)%+'$+'$+'$+'$+'$+'$+'$+'$+'$+'$+'$*&#*&#)%")%"($!($%($%($%($%($%($%($%($%&"#&"#&"#&"#&"#&"#&"#&"#% &% &% &% &% &% &% &% &% &% &% &% &% &% &% &#!&#!&"!&"!&"!&"!&"!&"!&"!&! %! %! %! %! %! %! %! %"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'&#.'$/'$/'$/*$0+%1+%3+%3,#4-$50$81%92&:3';5(<5(:<+>>+>A/?F1BJ3EN5HP7JQ9IP5FM5CL4BI3@G3>E4>E4>B5??5@=5B=5B=5B?4B?4B?4B?4BA5CB6DD6EF8GH:II;JMMT?NT?NUAMV@MV@MV>KW?LW?LW@JZ@KZ@K[AL\@L]>M`BNbDNcDJdCJhEKoHMuJQOUTZZ_`ae_nc|l҈o~ǣ淛ʣr}r\h\FSK3C?)6:)15&+2#(0!&0!(.&*"'& #                                                                 !!"###&')* * * * *./..--,,,+*(&$#!           "&**+**)(,-045431, * ' % "             ! " $ #$&') + / / 778;A C!B ??<;;::;<9<@C!E"E!CA9574412042313142-++,,+(()('&%&'& !)16K&Q&P%J!;.#!#&&$%%'()BI)BI)BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ+DK+DK,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL/HO/HO0IP0IP1JQ1JQ2KR2KR4KS5LT7KT7KT8LU8LU:LV:LV;LV?@>?@>?@>???A??A??A??A?>C>?C=>BAF?BI?DJ?DJ?DJ>CI>EM>EM>CI=BH;@F9>D999;99;99;97884362/40-1-*/+(/+(.*'.*'-)&-)&-)&-)&-)&-)&-)&-)&,(%,(%,(%,(%,(%,(%,(%,(%,(%+'$+'$*&#*&#)%")%")%"($%($%($%($%($%($%($%($%&"#&"#&"#&"#&"#&"#&"#&"#% &% &% &% &% &% &% &% &% &% &% &% &% &% &% &#!&#!&"!&"!&"!&"!&"!&"!&"!& $ $ $ $ $ $ $ $"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'%#.%#.&$/&$/(%0(%0*$2+%3,%5,%5.%8.%81%92&:3';4'98)<;*<=,>B/BG2EL5GO8JQ:JO7GM6FJ4AG3?D2>C3>C3>B5??5@=5B=5B=5B?4B?4B?4B?4BB6DB6DD6EF8GG9HH:IL;KL;KQ?MS>MS>MT?NU?LV@MW?MW?LW?LW?LZ@KZ@K\@L\AJ]BK]AM\=L_AMbBMbCIdCJiDKpGMwJQPWU[[]`^f^pc̀n׍p•ơ߳ġp|q[h]GTL5EA-99(05&+1"'/ %/ '-%*"&'!#  !                                                         !!!!$%')))((++++****))('%$#"                %(*+++**,.24421/) ' ' % # !            $&' ) * , . - .0 2 5759765567979=AA@>;6332200/0/11200/( ()*('&% '&$##$#$"'. ?H!K"H!>2(%''&&&&%%)BI)BI)BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ+DK+DK,EL,EL,EL,EL,EL,EL,EL,EL,EL,EL/HO/HO0IP0IP1JQ1JQ2KR2KR4KS5LT7KT8LU8LU9MV:LV:LV;LVA@>A??A??A??A>?C>?C>?DAH?DJ@EK@EK?CL?CL@GO?FN?CL>CI::<99;99965373040-2.+0,)/+(.*'.*'-)&-)&-)&-)&-)&-)&-)&-)&,(%,(%,(%,(%,(%,(%,(%,(%,(%,(%+'$+'$*&#*&#)%")%"($%($%($%($%($%($%($%($%&"#&"#&"#&"#&"#&"#&"#&"#% &% &% &% &% &% &% &% &% &% &% &% &% &% &% &#!&#!&"!&"!&"!&"!&"!&"!&"!& $ $ $ $ $ $ $ $"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'%#.%#.%#.&$/'$/(%0*$2+%3,%5,%5.%8.%81%92&:2&:3';5(:7*;:,=?.@E2EI6IO:KQA5?>3A<4A<4A<4A>3A>3A>3A>3AB6DC7ED6EF8GG9HH:IK:JL:JS>MS>MS>MT@LU?LV@MW?LW?LX@MXAKZ@K[AL\AJ]BK]BK]BK\>J^@LbBMcBKeBIiDKpGOwJQQZU\Z]_^e^rdуmےrƗŝٰozq[h^HUN8ED0;8'/4%*0!&/ %.&-%)!&'!#  !                                                        "$&(((&&())))(((''&&%$##                %()+++**+-2342/-& & & $ " !            !#% ( ) * ..0013656322246748<===:6422100//-.0110.,% % ' &&% # ! %#"! !  !! #& 2:B C <4+(**'&##!  )BI)BI)BI)BI)BI)BI)BI)BI(AH(AH(AH)BI)BI*CJ*CJ+DK+DK+DK+DK,EL,EL-FM-FM.GN/HO/HO0IP0IP1JQ1JQ2KR2KR3JR3JR6JS6JS7KT7KT9KU9KU:KU:KU;LV;LV>LW>LW?MX?MX?KW?KWAKWBLXBLXCMYDLWDLWFMWFMWFMUGNVIMVJNWJNWJNYLN[LN]MO\NP]QP^RR^SS_SS_SQ\TR]UR]VS\WT]XU^[U_\W^\VZ[UWXRVVPRUOSUOQVPTVPRSMQTNPTNRUOQUOSUOQTNRTNPWNQXORYPSWQSUOQQKMLHIIEFGEFGEFEEEEEEDDDCEDBDCBDCAACA@EA@EA@EABFABGABG?BIBK@DMBFOAHPBISBISBISBIQDHQCGP@DM>CIC;C?>C=2><2=;1::0980=80=91>:2?=2@>3A?4B?4BD8FC7ED6EE7FG9HI;JMNT?NV@MV@MWANYAOZBO[CP\DQ[AL[AL\@L\AJ\AJ\AJ^@H^@J`@M_?L_>I`?HeBIlDLsHQyJRMWT[\_`]d[qaԆoxǗŜڶæ~ktjT`XBNL8CE4<:+05&+.$* )!)!( &$#"!                                                                   !"$&'''(**(&%&'(&&%$#"! ! "!!           !!&&$$& (+,///..--,(%$ # !            "#&( ( () + .12.///-169="; :75554310//012..-+* ) ( % & % &((%$# " ! " !!"!%"$## "  ! " % +32.,272/(# !! )BI)BI)BI)BI)BI)BI)BI)BI(AH(AH)BI)BI*CJ*CJ*CJ+DK,EL,EL,EL-FM-FM.GN.GN.GN/HO/HO0IP0IP1JQ1JQ2KR2KR3JR3JR6JS6JS7KT7KT9KU9KU:KU:KU;LV;LV>LW>LW?MX?MX?KW?KWAKWBLXBLXCMYDLWDLWFMWFMWFMUGNVIMVJNWJNWJNYKMZLN]MO\NP]QP^RQ_SS_SS_SQ\SQ\UR]VS^WT]XU^[U_[V]\U\[UYYSWXRVVPTUOSUOSUOSSMQSMQTNRUOSUOSUOSUOSUOSWNSXORZQTZQTXORSMONJKLHIHFGHFGFFFEGFDFEDFECEDCDFBAFBAFBAFABGABGBCH@CJ@CJ=@G=AJ>BK@DM@GQAHRBISCJTCJTCJTDHQCGPAEN>BKE==E;=B?>C=:2=92:80;7/<80=91>:2?=2@>3A?4B?4BC7EC7ED6EE7FG9HI;JMLT@LU?LV@MWANYANZBO[CP[DN[AL[AJ\AJ\AJ\AJ\AJ^@H^@H`@K_?J`?Hb>HfAIlDMsHQyJTNXS[Y]_ZdYt`؋o{“˚Ǡܹĩ|jsjU\WDJI8>D399*/4%*-#))!( '%##"!                                                                    !#$&'('())'%%%&'&&%$#"!                !!%%%$'(+,//..--,*%%$ # !             !!& & % & ) ).-,,00.047; 9965443300,-+.,.+,)* ' ( % % $ % &%$# ! ! !   ! !%!%!& %#" ! #***.5@ B!<.#")BI)BI)BI)BI)BI)BI)BI)BI(AH)BI)BI)BI*CJ+DK+DK+DK-FM-FM-FM.GN.GN/HO/HO/HO/HO/HO0IP0IP1JQ1JQ2KR2KR3JR3JR6JS6JS7KT7KT9KU9KU:KU:KU;LV;LV>LW>LW?MX?MX?KW?KWAKWBLXBLXCMYDLWDLWFMWFMWFMUGNVIMVJNWJNWJNYJNZJNZKO[LP\NP\OQ]RR^SS_RR\RR\TS[UT\WT]XU^YV]YV][V\[V\[V\YTZWRXUPVSNTRMSRMSRMSRMSSNTTOUUPVVQWWQUWNSYNT[PV[RWZQVVPTRMQQLPJHKJHKHHJGHJFGIDHICGHCGHCDHCDICDICCKCCKADKADMADM>BK>BM?CN>EO@FRBHTBJUCKVDKUDKUEITDHSBFO?CL=@I>F<=C?>D>=B<<><:;;:887565343143143143110.0/-0/-/.,.-+-,*,+),+)/+(/+(0,)0,)1-*1-*1-*2.+1-*1-*0,)0,)/+(/+(.*'.*',()+'(*&')%&)%&*&'+'(,()'#$'#$'#$'#$'#$'#$'#$'#$'"(&!'&!'% &% &$%$%$%$%$%$%$%$%$%$%" %!$ $ $ $ $ $ $ $"!&"!&"!&"!&"!&"!&"!&"!&"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'##-##-##-$$.%%/%%/&$1'%2($3($3*#5+$6,%7,%7,%7-&8.'9/(:1*<4+<9.?1B?2CA3D@4B?3A=2@:2=82<71;71;7/<7/<80=91><1?=2@>3A?4BC7EC7ED6EE7FF8GI;JMKW?LX@MYANZBO]CN]CN\@L\AJ^@J^@H^@H^@H^@H^@H`@K`?Jb>Hc?IgBJnDNsHRyJTNXRZYZ^YfYybs鹿ė͟ɦݻìy}hoiTYVCGH89B448).3$)-#)( '%###"!                                                                   !#$&'('(''&$$$%%&%$#"!                 !!$$%%')-.//..,,)($$#" !            !  % % $ $ & '))*-111125984321210.,))'( '*))'' % % $ ! " " # # "        %&&&$ $  !#'/;G#V+N$:(   !)BI)BI)BI)BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ+DK+DK,EL-FM.GN.GN/HO/HO0IP0IP0IP/HO/HO0IP0IP1JQ1JQ2KR2KR3JR3JR6JS6JS7KT7KT9KU9KU:KU:KU;LV;LV>LW>LW?MX?MX?KW?KWAKWBLXBLXCMYDLWDLWFMWFMWFMUGNVIMVJNWJNWJNWJNYJNZKO[LP[NP\OQ]RR^RR\QQ[QQYSRZTS[VS\WT[XU\YV]\W]\W]\W]\W]ZU[VQWSNTQLRSNTRMSRMSSNTTOUUPVWRXYRYXNVZOU[PV\QW\SX[RWWQUUPTMKNKKMKKMIJLGKLFJKFJKFJMFGLFFNEEMEEMCFMBELBENAEN@DO@DO>EO?EQ@FRBHTCKVDLWEKWELVFJUEITCGP@DM>AJ=@I??G==E:;@;=C?>D?>C==?<:;;:887565343143143143143132021/10.0/-.-+.-+-,*1-*1-*1-*1-*2.+2.+2.+2.+3/,2.+2.+2.+1-*0,)0,)0,).*+-)*+'(*&'*&'*&'+'(,()'#$'#$'#$'#$'#$'#$'#$'#$'"('"('"(&!'% &% &% &$%$%$%$%$%$%$%$%" %!$ $ $ $ $ $ $ $"!&"!&"!&"!&"!&"!&"!&"!&"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"",##-##-$$.$$.%%/&$1&$1'#2($3*#5+$6+$6,%7,%7,%7,(9-):0);2+=5,=9.?;.@1B=2B=2@:2?82<63<52;52;60<7/<80=91><1?=2@>3A>3AB6DB6DC5DD6EF8GH:IL;KO=KT>KU=JV>KW?LX@MYBL\BM]CN\AJ\AJ^@H^@H^@H^@H^@H_@H`?Ja@Kc?IeAKjBKoEOsHRzHSMZQYWY_Xj[~fxʠƦٻ¬s~wbkePUTACG77@226'*2#(,")( '$"#"!                                                            !"$%&'&'%%%$####%%$#"!        !!"      !!##$%(*,-..--++( '$"" !                      % % % % % % & & )-1321145422101/+*('& & & ''''& % % $ "  !           $$&%%#$0= L']-W(B /!   )BI)BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ+DK+DK,EL,EL,EL-FM.GN.GN/HO/HO0IP0IP0IP/HO/HO0IP0IP1JQ1JQ2KR2KR3JR3JR6JS6JS7KT7KT9KU9KU:KU:KU;LV;LV>LW>LW?MX?MX?KW?KWAKWBLXBLXCMYDLWDLWFMWFMWFMUGNVIMVJNWJNWJNWGNXGNXJNYKOZLP[MQZOR[ORYPPXQQYRRZSTYUTZVUZWV[XV[\W^\W^]X_]X_[V]XSZUPWSNUUPWTOVSNUSNUSNUUPWWRYYRYZOW\OX]PY]RZ\RZ\RZYRYXSYOMRNMRNMRLMQJNQIMPHMPHLOIIQIISFIREHQEHQDGPCGRBFQCGS@FR@FR?ES?GTAIVCKXEMXFLXFLXGKVFJUDHSAEP?BK>AJAAI>>F::B::B>=C@?E?>D>=B::<888666444222111111222555444444222111000////.,3/,3/,3/,3/,2.+2.+2.+2.+40-40-3/,3/,2.+2.+1-*1-*0,-/+,-)*,()+'(+'(,(),()($%($%($%($%($%($%($%($%(#)'"('"('"(&!'% &% &% &% &% &% &% &% &% &% &#!&!$ $ $ $ $ $ $ $"!&"!&"!&"!&"!&"!&"!&"!&"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"", #, #,!$-##-$$.%#0&$1&$2&$2'#4($5*#5+$6+$6,%7,(9+(9-):1*<3*=4+<7,=7,=;0@;0@;0>91>71=52=52=41<5/;6.;7/<80=;0><1?=2@=2@B6DB6DC5DD6EE7FH:IL;KNKW?LZ@K[AL]AM]BK\AJ\AJ^@H^@H_@F_@F_@F_@H`?Ja@Kd@JfBLlDMpFPvHSzHSN[RZZ\c\p_Ѓix澤гyjzqYf_JQQ>@D65=115&)1"',"* )!'$!""!                                                              "$%%%%#$$$$#""$$#"!        ! " " #    ! ! " !"#$&)*,-. . , , * * ' $" !            !"## $ $ $ % % $$$& )/3421132 200/--,% # " " # $&'# # # # " " " !           "##$" #-8G#W(U&E!6("   )BI)BI)BI)BI)BI)BI)BI)BI*CJ*CJ*CJ+DK,EL,EL,EL-FM-FM-FM-FM.GN.GN/HO/HO/HO/HO/HO0IP0IP1JQ1JQ2KR2KR3JR3JR6JS6JS7KT7KT9KU9KU:KU:KU;LV;LV>LW>LW?MX?MX?KW?KWAKWBLXBLXCMYDLWDLWFMWFMWFMUGNVIMVJNWJNWJNWFMWGNXJNYKOXLPYMRXORYORYPPXPQVQRWRSWTSXUTYVUZVUZZW^\W^\W^\W^[V]ZU\XSZWRYXSZWRYTOVSNUSNUTOVVQXXQY[PX\OX]PY]PY\QY\RZZSZYTZTOUQPUPOTOPTLPSKPSJORJOSJMTKKUILUHKTGJSFIRDHSDHSCIUBHTAGU@FT?GTAIVDLYFN[GMYGMYHLWGKVEITBFQ@CL?BKBBL>>F;;C::B>=C@?E@?E?>C::<99966644422222222222266666655544433322222211/51051.40-40-3/,3/,3/,2.+40-40-3/,3/,2.+2.+1-*1-*1-.0,-.*+-)*,(),(),(),()*&'*&'*&'*&'*&'*&'*&'*&'(#)(#)(#)'"('"(&!'&!'% &% &% &% &% &% &% &% &#!&!$ $ $ $ $ $ $ $"!&"!&"!&"!&"!&"!&"!&"!&"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'!"'!!+ #, #, #,##-$$.%#0%#0%#1&$2'#4'#4*#5+$6+$6)%6+(9+(9-):-):0);2)<4):4)::/?80?80=60<41<31<31<41<4.:6.;7/<80=;0><1?=2@=2@A5CA5CB4CC5DE7FG9HK:JNKY?JZ@K\AJ\AJ\AJ\AJ^@H^@H_@F_@F_@F_@F`?Ja@KeAKgCMmENqGQvHSzHTN[T\^`icwgՈlv縚ڴƨtybtgO]XCJM:>B44<005&)2#(.$+!*"( $!!!                                                              !##"##$%%%#"! $$#"!       ! ! ! !     ! ! " !! %'),-, - - + + ) ' % # !           !#% % % # $ % '%&%',03411 1 30 1 1/.+*(!  ! # %'(" " " ! ! ! ! !           !!!!  # *2<HG>3+$!  )BI)BI)BI)BI)BI)BI)BI)BI*CJ+DK+DK+DK,EL,EL-FM-FM,EL,EL,EL-FM-FM.GN.GN.GN/HO/HO0IP0IP1JQ1JQ2KR2KR3JR3JR6JS6JS7KT7KT9KU9KU:KU:KU;LV;LV>LW>LW?MX?MX?KW?KWAKWBLXBLXCMYDLWDLWFMWFMWFMUGNVIMVJNWJNWJNWFMUFMUGNVHOWKOXLQWNQXORWNQVNQVQRWRSWTSXUUWVVXVUZZW^ZW`YV_XU^XU^YV_ZW`ZW`YV_WT]TQZQNWPMVQNWSPYWPX]RZ_OY]PY\OX[PXZPXYRYXSYVQWSRWRQVQRVNRUMRULQTLQULOVKNWKNWILUHJVGIUEIUEIUEKWDJVAIV?GT@GWBIYDK[FN[HNZHNZIMYHLXFJUCGRACO?BKCCM??I;;C::B=;;;99966655544444444466666666655555555555555362162/51.51.40-3/,3/,3/,40-3/,3/,3/,2.+2.+1-*1-*3/02./0,-.*+,(),(),(),(),(),(),(),(),(),(),(),())$*(#)(#)'"('"(&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'$"'!$ $ $ $ $ $ $ $"!&"!&"!&"!&"!&"!&"!&"!&"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'"!'!"'!!+"+ #, #,##-##-##/$$0%#1%#1'#4'#4($5($5*#5)%6+(;*);+(9,(9/(:/(:0'80'86.=6.=6.=60>41<31<31<31<4.:5-:6.;7/<:/=;0><1?=2@A5CA5CB4CC5DD6EG9HK:JM;IS=JTIY?JZ@K\AJ\AJ^@H^@H^@H^@H_@F_@F_@F_@F`?Jc?KeAKhDNnFQqGSvHUzHTN[V^cdqil؋oqxⲛѬpqYo_GWQLU>LU?MV?MVAKUAKUBJUCKVCKVDLWDLWELVFMWFMWFMUGNVIMVJNWJNWJNWHLUFMUIMXJNWKOXMPYNQXNQXOOWPPXQRWSRXTSYUTYVSZWT[ZW`YV_XU^WT]XU^ZW`\Yb]Zc[XaYV_UR[QNWRLVRLVTNXVNY\R]]Q[\PZZPYYOXYOWXQXXQXWRXURYSRXRSXORYNSYKRXKRZLPYMPYLOXJMVIKWHJVFJVEIUIMYEKWBHT@FTAGUCIWFLZHN\HN\JNZIMYHLXFJUCGRBDP@CLCCM??G;;C::B<C>=B;:?98=76;77977977955766866866866866677777753453462351240140/3/03/.3/.3/.3/.2.-2.-1-,1-,2,,5//3-/1+-/)+.(*-')-').(*.(*.(,.(,.(,.(,.(,.(,.(,)$*)$*(#)(#)'"('"(&!'&!'&!'&!'&!'&!'&!'&!'&!'&!'!$ $!$ $!$ $!$ $#!&"!&#!&"!&#!&"!&#!&"!&"!'!"'"!'!"'"!'!"'"!'!"'"!'!"'"!'!"'"!'!"'"!'!"'!!+!!+!!+"",#!,$"-$"/%#0%#0&"1&"1'#2'#2($3*#3)%4+(9+(9+)7,(7.'7.'7/&7/'65-<6.=6.=5/=5/;41<41<41<5-:7,:8-=9.<:/=;0><1?<1?A5CA5CB4CB4CF5EH7GL:JO:IRIZ>J[@I]?G^@H_@F_@F_@F_@F_@F_@F_@F_@H_@Ha@KdCLiEOlFQrHRvHSzHSNWX\gexlɅp֏qߗqߝz籗̧ܱ{}lnUkZATM7CF37A12>006'*3$)0!&.$-%*"&"!                                                            #%'''%#! ##"!     #" " !         ! ! " " "#&(*++* * ) ' & % $ " ! !            ! # """!!!!# & )+++,0230 ..0 3 0 0 /.+($ " %$# " " # $ $  ! !  !             " " " ! ))(&&&))&>J&>H'?K'?I(@L(@J)AM)AK+CO+CM+CO+CM+CO+CM+CO+CM/GS.FP,DP+CM,BO-CN/ER0FQ0FS2FQ3FT3GR4GU4HS6HV5IT5IR3JR4KS4KS7KT7KT9LS9LS8KR8KQ9JQ:KRKSCLUDKUELVELVFMWFMWGNXIMVIMVIMVIMVIMVIMVIMVIMVIMVIMXIMXKMZKMYLNZNNZOO[OO[PN[QO\QO\SO]TP^UR]XR`WT_WT_WU`WU`XVaZWb[Xc\Yd]Ze]Wc]Wc]Wc]Wc\TaZR_XP]WO\XR`VR`VS^WQ]WQ[XQYXQYXQYXQYVPZSQ\RR^PR_ORaLRbLRbPT`PR^OQ]NP\MO[KMYJLXJLXHJVFJUEITEIUEIUFJVHLXHLXLO^KM\HJWEGTCERBDPACOADM@CL@CJ@CJ@CH@CH@DGBCGBCH?=H?=J?=H?=H=;F;:B98@87?98>87=76;76;76;88:::<::<98>98>96=85<74;6495295387286177157156045/35/17.15,-5,-5,-4+,3*-3*-3*/2).1(-1'/1'/1'/1'01'01'21'0*#**#**#**#*+$++$++$++$+*#**#*)"))")(!((!(' '&!''")%")'")$!(&!(# '% '# '#%!%#%!%#%!%#%!% !&!& %$$ % !&!&!"'"'!"'"'!"'"'!"'!"'" +# +# +$!,$!,%"-%"-&#.)&1+%3+%3+%3+%3+%3+%3+%3'#1($2)%3,&4-'5.(6/'60(55*86+96+97,:9.<:/=:/=;0>9,=:,=:-?:->;.?;.?;0@;0@A5CA5CB4AD4AG5CK6EO8HP:GR;KS;IVD_?D`@EdAEc@D`@E_?D^?E^?E^@H]BIZ?F]BIbDLfENjEMpGOyJRMRVYb`tioonjnΔoҝ}֭ҰƧ{su~adHaP7JI1>F18@,.:')7'*7&,5$*2!'-$("                                                        "####"###""! !  ! ! ! ! ! ! ! !      "$')++*)%"!       !"             ! ! ! $ % ' ( ),,20/- + + , , (' & ' ' ' &&" " " !     $$#" !                    %## ( /56 5 &>J&>J'?K'?K(@L(@L)AM)AM+CO+CO+CO+CO+CO+CO+CO+CO.FR.FR-EQ,DP-CP.DQ/ER/ER2ES2ES3ES4FT4FT5GU6FU6HT5IT3JR3JR4KS6JS7KT8KR9LS8KQ8KQ9KO:LPKQDKSFJSFJSGKTGKTHLUHLUIMVIMVIMVIMVIMVIMVIMVIMVIMVJLYJLYJLYKMZMLZNM[OM[PN\PN\PN\RN]SO^VO_WP`XQaVR`WSaVT_WU`XVaZWb[Xc\Yd\Yd]Wc]Wc^Vc^Vc\Ta[S`[P^WO^TR`SR`TR_TQ\VPZVPZVOWVOWVNYUOYSP[QP^OPbOReMRfMRePSbQS`PR_OQ^NP]LN[LN[KMZIKXIKXHJWGIVGIVHJWJLYJLYLN]JL[HJWEGTCERBDPADMADMADKADKADIADIAEHAEHAEFCDIB@MB?PB@NB@NA?L?=J=;F<:E:9A98@87=76<76;87<::<:9>;:B:8C:8C98@96?85>74=63:7297287077076/66047.37.16,-6,+6,-5+,5*.4)-4)/3(.4)14)14(24(24(44(44(63)4,"+*#**#*+$++$++$++$++$+*#**#*)"))")(!((!(' '' ''")'")&!(&!(% '% '% '$&#%#%#%#%#%#%#%!%!"'!& %$$ %!&"'"'"'"'"'"'"'"'!"'# +%+& ,& ,'!-'!-'!-(".+%1+%1+%1+%1+%1+%1+%1+%1(%0(%0+%1,&2-'3.(40(50(55*86+96+97,::.<;/=;/==/><+>=,?;,?<-@;.?A5CA5CB4AD4AG5CK6EO9FP:GQ:JRC`=Ca>Bd@Bd@Ba>B^>A^=D^?E^@H]BI]BI`CHbCIfCJlDLtJNQTWXd`mcyilllƔsȜͬǪyrly[w`D[P5HH0=F/7A+.;')9&*6%+4#)1 &,#'"                                                       ! ###""##""! ! !  ! ! ! ! ! ! ! ! !   ! #%',,-*&$!      "! !                ! $ & * +-.1/-+ ) ) * * % % $ % & ' % %" ! !      #" " !                    !" ( 28: : &>J&>J'?K'?K(@L(@L)AM)AM,DP,DP,DP,DP,DP,DP,DP,DP,DP,DP-EQ.FR/ER.DQ-CP-CP1DR2ES3ES4FT4FT5GU6FU5GS4HS3JR5IR6JS6JS7KT8KR8KR9JQ9JQ9KO:LPKQCJRFJSFJSGKTGKTHLUHLUHLUHLUHLUHLUHLUHLUHLUHLUHLUIKXJLYJLYKMZMLZNM[OM[OM[PN\PN\RN]SO^VO_WP`XQaVR`WSaVT_WU`XVaZWb[Xc\Yd\Yd]Wc]Wc^Vc^Vc]Ub[S`[P^XP_TP_SQ_TP^SP[UOYUMXWMVVLUSLTSMWQNYQO]QP`ORcNSfNSfQTeRTcQSbPRaOQ`NP_NP_MO^LN]KM\JL[IKZIKZJL[KM\LN]LK[KJZIHVFESEEQDDPDDNDDNDDLDDLDEJDEJDEIDEIDEIDEJECPFBQGCRFBQEAOD@NB?JA>I<9B;8A:7>96=97<:8=;9<<:?<;A<;C<9B;8?:7>96=:5<:5;8188268267159058/28/27.17-.6,+6,+6,+5+,5+,4)-4)-6+16+36*46*46*46*46*65+4.$,,&*,&*,&*+%)+%)+%)+%)*$(*$()#')#'("&("&'!%' ''")'")&!(&!(% '% '$&$&$&$&$&$&$&$&$&"&!"'!& %$$ %!&"'"'"'"'"'"'"'"'!"'# +& ,& ,& ,'!-(".(".(".+%1+%1+%1+%1+%1+%1+%1+%1(%0(%0+%1,&2-'3.(40(50(55*86+96+97,::.<;/=;/==/>=,?=,?;-><.?;.?<1?@5CA5AA5AB4AF6AI7CL:FO;GP:GQ;HT:GV;DZB^>A^=D^?E^@H`AIdCJhCJjBJkBHrEJ|NPYXb^oguh{h~ginuÛȨ}tka}oQkZ>TL1BF.;D-3@*-;')8%)5$*3"(/$+"&!                                                         ! "##"! #"""!    ! ! ! ! ! ! ! ! "! ! "#$&(,,,)&#       "#" ! !             # & * ,.//., * ( ( & & $ $ $ $ # # # $                               ! ' /6 8 : &>J&>J'?K'?K(@L(@L)AM)AM,DP,DP,DP,DP,DP,DP,DP,DP*BN+CO-EQ.FR/ER.DQ,BO+AN1DR1DR2DR3ES4FT4FT5ET5GS4HS2IQ4HQ5IR6JS6JS7JQ8KR9JQ9JQ9KO:LPKQCJREIREIRFJSGKTGKTGKTHLUHLUHLUHLUHLUHLUHLUHLUHLUIKXIKXIKXJLYMLZMLZNLZOM[OM[OM[QM\RN]UN^VO_WP`VR`VR`US^VT_WU`YVaZWb[Xc\Yd\Vb]Wc^Vc^Vc^Vc\Ta]R`ZR_UQ_TP^TQ\UOYUMXTMUUKTUKTRKSSKVRLXRN\QP^PRaPSdQTeSThSTfRSgQRdQRfPQcOPdOPbOPdNOaLMaKL^KL`KL^LMaMN`KJZJIYHGUFESEEQEEQFFPFFPFFPFFNFFNFGLFGLFGKFGKGFLGCQGCRHDSHDRGCQFCNDALC@K?;D<9@;8?;9>;9><:==;@<;A<;A<9@;8?:7>97<:5;:59937937937824:149039039018.-8.-7-,7-,6,-6,-5*.5*.6+16+16+36*46*46*46*45+4.(,.(,.(,.(,-'+-'+-'+,&*+%)+%)*$(*$()#')#'("&("&'"('")&!(&!(% '% '$&$&$&$&$&$&$&$&$&"&"#("'!& % %!&"' #( #( #( #( #( #( #( #("#($!,& ,& ,'!-'!-(".(".)#/+%1+%1+%1+%1+%1+%1+%1+%1(%0)&1,&2-'3.(4/)51)61)65*86+96+97,::.<;/=;/==/>=,>?,@>-?<.?B^>A^?D_@F_AIbAHkCKnCJqGKuHK}MMWSc\k`sewfyeybgs|â|wj~|_uqSkdG]S8KI.=C,6B+1?),:&(6#'3"(0%-") %!                                                         ! """! ! """! !    ! ! ! ! ! ! ! ! ""#$%&')+,*)&"       "##" "            " $ ' +./-, + * ( ' $ $ #"# # ! ! ! !                                & , 26 7 &>J&>J'?K'?K(@L(@L)AM)AM,DP,DP,DP,DP,DP,DP,DP,DP*BN+CO-EQ.FR/ER.DQ,BO+AN0CQ1DR2DR2DR3ES4FT5ET4FR3GR4HQ4HQ4HQ6HR7IS7JQ7JQ9JQ9JQ;JOKQ@KQBIQEIREIREIRFJSGKTGKTGKTGKTGKTGKTGKTGKTGKTGKTGKTHJWIKXIKXIKXLKYMLZNLZNLZNLZOM[QM\RN]UN^VO_WP`UQ_UQ_US^VT_WU`YVaZWb[Xc[Xc\Vb]Wc^Vc_Wd^Vc]Ub^Sa[S`YS_XR^WQ[WOZVNYWMVVLUUKSSLTSKVSMYRN\SQ_SRbRTcRSeSThRSgRShRSgQRgQRfQRgQRfPQfOPdNOdLMaLMbLMaLMbMNbJIYJHVIGUHFTHFSHFSIGTJHSJHSJIQJIQJIQJIQJIOJIOJIQFCNGCQHDRHDRHDRGDOEBMDAJB?HA>G@=D>;B=;@=;@><7;<6:;59<6:;57=47=45=34=34<23<2191/91/9018/08/07./7.16-05,15,15,15+35+35+35+35+32,02,.1+-0*,0*,/)+/)+.(*,&(,&(,&(+%'+%'*$&*$&*$((#)(#*(#*'")&!(&!(&!(% '% '% '% '% '% '% '% '# '#"(!"' !& % % !&!"'"#("#("#("#("#("#("#("#(#"($!,'!-'!-(".(".)#/)#/)#/+%1+%1+%1+%1+%1+%1+%1+%1)&1)&1,&2-'3.(4/)51)62*75*86+96+97,::.<;/=;/==/>>-??,?>-?=/@=1?<1?<1?;3@>6A>6A>7?@6?B8AE9CIB_?B_@E`AFbCIfCInCJuGJ|NPSQZTaWi[o^o[u^v_w_k{œzvk{x[mkNbcFZZ=OM2AF,7A*2@)/='*9%'4!%1 &.#*&#                                                                   !!  !       ! ! ! ! ! ! ! ! "#$%&''()+)(%!       !$%$##"           " $ ' ( +,* * * ) ( ' ##""!                  " ( , / 2&>J&>J'?K'?K(@L(@L)AM)AM*BN*BN*BN*BN*BN*BN*BN*BN*BN+CO,DP,DP-CP-CP,BO+AN0CQ0CQ1CQ2DR2DR3ES4DS5ER4FR3GP3GP4HQ5GQ6HR6IP7JQ9JQ9JQ;JOKQ@KQBIQDHQDHQEIREIRFJSFJSGKTGKTGKTGKTGKTGKTGKTGKTGKTHJWHJWHJWIKXKJXLKYMKYNLZNLZNLZPL[QM\TM]UN^VO_TP^UQ_TR]US^VT_XU`YVaZWbZWb\Vb\Vb^Vc_Wd_Wd^Vc_Tb^Sa]U`\T_[S^ZR]ZPYYOXXNVWMUUNVUMXUO[VP\UQ_USaTScRTcQRfQRgQRgQRgQRgQRgQRgQRgRShPQfOPeMNcLMbLMbLMbNLaKHYKIWJHVJHVJHUKIVLJWMKXLJULJULJULKSLJULKSLKSLKSGDOHDRIESJFTJGRIFQHENGDMFCLEBKC@IB?FA>E@>CA>EA?DA?DA?D@>C?=B@;??:>?9=?9=>8:>8:@78?67@67?56?54?54<42<34;23;23:12:129039037.37.37.37.37-57-57-57.36026025/14.03-/2,.1+-1+-/)+.(*.(*.(*-')-'),&(,&**%+*%,)$+)$+(#*(#*'")'")% '% '% '% '% '% '% '# '$#)"#(!"' !& !&!"'"#(#$)#$)#$)#$)#$)#$)#$)#$)$#)%"-'!-'!-(".)#/)#/)#/*$0+%1+%1+%1+%1+%1+%1+%1+%1*'2*'2-'3.(4/)50*62*72*75*86+96+97,::.<;/=;/==/>>-?@-@?.@>0A=1?=2@;3@:4>=7A=7A>7?>7?B8AD:CH=EJ=FP:FR;ET:CV;BZ=B[>C\=B^>Ac@Dc@DaADaADaBGbCHdEJhEIrHJ}MMVT_YeXiYmYr[nVv]zb|fvĝsn}hwz[kgKZ]APY=LR6DI/:D*3@)/>(+;%'7#%3 $/$+ ($"                                                                            ! ! ! ! ! ! ! ! ! "$%''''( )(&#!     !$%%$$#!             # $ & ' ' * * * * * ) % #!!!                ! # & * - &>J&>J'?K'?K(@L(@L)AM)AM)AM)AM)AM)AM)AM)AM)AM)AM,DP+CO*BN*BN+AN+AN,BO-CP/BP0CQ1CQ2DR2DR3ES4DS4DQ3EQ4FP4FP5GQ5GQ6HR7HP7HP;JQ;JQKQ>KQ@KQAHPDHQDHQEIREIRFJSFJSFJSFJSFJSFJSFJSFJSFJSFJSFJSGIVHJWHJWIKXKJXLKYMKYMKYNLZNLZPL[QM\TM]UN^VO_TP^UQ_TR]US^VT_XU`YVaZWbZWb[Ua\Vb^Vc_Wd`Xe_Wd`Uc_TbcYdbXaaW`_U^]S\[QZXQYWPXXP[XP[WQ]XR^VR`US`USaTScPQePQePQeQRfQRfQRfQRfQRfRSgQRfOPdMNbKL`KL`KL`ML^LIZLHWLHWLHWMIWOKYPLZRN\NJXNJXNJXNKVNJXNKVNKVNKVJFTKGULITMJUMJUMJULITKHSJGRIFQGDOEBKC@IC@GC@IDAHGDKFCJFDIECHFAGD?ED?CC>BA;=A;=C:=B958>58>58=47<36<36<36;27;27;27;27;27;27;27;27:469358247136025/14.03-/1+-1+-0*,0*,/)+/)+.(*.(,,'-,'.+&-+&-*%,*%,)$+)$+&!(&!(&!(&!(&!(&!(&!($!($#)#"("!'! &! &"!'#"($#)$#)$#)$#)$#)$#)$#)$#)$#)%"-(".(".(".)#/)#/*$0*$0+%1+%1+%1+%1+%1+%1+%1+%1*'2*'2-'3.(4/)50*62*72*75*86+96+97,::.<;/=;/==/>?.@@-@?.>>0?=1?=2@;3>;5?=7A;8?=8?=8?@9@B;BG=EJ=FQC\?D]>C^?DcCFbBEbBEbBEdDGfFIhHKkIJxOMUP^Xf[kZmVqXtYtYcmtȝŚoar|\kuVehIXZ>LU9GR6BN3J&>J'?K'?K(@L(@L)AM)AM(@L(@L(@L(@L(@L(@L(@L(@L-EQ,DP*BN)AM*@M+AN-CP.DQ/BP/BP1CQ1CQ2DR2DR4DS4DQ3EQ3EO4FP4FP5GQ5GQ7HP7HP;JQ;JQKQ>KQ@KQAHPCGPDHQDHQEIREIRFJSFJSFJSFJSFJSFJSFJSFJSFJSFJSGIVGIVHJWHJWKJXKJXMKYMKYMKYNLZPL[QM\TM]UN^UN^TP^TP^TR]US^VT_XU`YVaYVaZWb[Ua\Vb^Vc`Xe`Xe_Wd`Uc`Vae[ddZccYbaW`_U^[T\ZS[YQ\ZR]YS_YS_WT_WSaVR`USaTSaQPbOPbPQcPQcPQcQRdQRdQRdRSeQRdNOaLM_KL^JK]JK]ML^LJXMIXMIXMIXNJXPLZRN\SO]OKYOKYOKYOKYOKYOKYOKYOKYMIWNJXOKYPMXQM[PMXOKYOLWLHVKHSIESGDOEBMEBMEBMEBMLIRKHOJGNIFMHELIDJHCIHCGC=AC=AB<@D;>C:=C:=B958>5:=49?6;?6;?6;?6;?6;?6;?6;?6;<6:;57:489358266025/35/12,02,.2,01+-1+/0*,0*.0*.-(.-(/,'.,'.+&-+&-*%,*%,&!(&!(&!(&!(&!(&!(&!($!(%")#"("!'"!'"!'"!'#"($#)$#)$#)$#)$#)$#)$#)$#)$#)'!-(".(".)#/)#/*$0*$0*$0+%1+%1+%1+%1+%1+%1+%1+%1*'2+(3-'3.(4/)50*62*73+85*86+96+97,::.<;/=;/==/>?.@?.>@/?>0?>2@=3><4?;6==8?=8?=8?>7>@9@D:BG=EJ=DR=DUC\?D^?D_@EbDFcCFcCFdDGeEHgGJiILmII~UQ[TbWiYlYpWtWwZ|_mx—ʡ×uexuTenM^fGV\>JS7CS8AO4=L18F-1C*.?),<&)8"$5!#1"-")%"                                                 !"!!                           ! ! ! ! ! ! ! !  #%&&%%''%$"      ! $&'&&%$"!              " " " " # # " " ( +**)& # "                              " &>J&>J&>J&>J&>J&>J&>J&>J)AM)AM)AM)AM)AM)AM)AM)AM)AM)AM*BN*BN,BO,BO-CP-CP0CQ1DR2DR2DR3ES3ES5ET5ER4FR5GQ6GQ7HR7HR8IS:HQ:HQ;HP8<=6=<6:;4;:3:;4;;4;:3::3::48<6:=7;>8<7158269299378187156/65/35.54.23,32,01*11+/2+23,3.)0-(/,'.+&-*%,)$+(#*(#*'")'")'")&!(&!(&!(&!($!($!("!'! & % %! &"!'#"(&%+&%+&%+&%+&%+&%+&%+&%+(".)#/)#/*$0+%1,&2,&2-'3)#/)#/*$0*$0+%1+%1,&2,&2-*5-*50*60*61+71+73+83+83(63(64)74)76*87+98,:9+:>-=>-=?.>=/<=1==3>;3><5=;4<<5<=6=A7?C9AGCZ?D[@E]@D^AEZ=A]>C_AC_AC`@AdDElJKqNL{SKXM`RdThTnTsYx^y_kxɡØyo`qtSdjKZcEQZ?HV;BT9>O49H/2C*-?),='*:$'6"$1"+ &$#"                                         "                           ! "##! "#$&'((%%$!       "$()&%$#!              '$!   ! # '' ' ' & % $ $ ! !                                  &>J&>J&>J&>J&>J&>J&>J&>J)AM)AM)AM)AM)AM)AM)AM)AM)AM)AM)AM*BN+AN,BO,BO-CP/BP0CQ1CQ1CQ2DR3ES4DS4DQ4FR5GQ6GQ6GQ7HR7HR:HQ:HQ;HP7?=6><5=?8@>7>=6==6=>7>?9=@9@A:A929:3;:3;;4<:3;92:7086/74-53,41*20)1/(0/(00)10)10+2/*1/*1.)0-(/,'.+&-*%,*%,*%,)$+)$+)$+(#*(#*(#*'$+%$*$#)#"(#"($#)%$*&%+&%+&%+&%+&%+&%+&%+&%+'$+)#/)#/)#/*$0+%1,&2,&2,&2)#/*$0*$0+%1+%1,&2,&2,&2,)4-*5/)50*60*61+72*72*75*85*86+96+98,:9-;:.<:.<9+::,;:,9:.::0;;1<:3;:3;?8?B8@C9AE:BH;BJ=DN?FQ>DW>BY>CZ?D[@E\AF\AF]CF_BF\?C^AEaCEbDDeEFiJHrPOzTQ[R_RdWhXn[t^{ems{q{br{ZkoN_eET^@LY;ES8?O49S8=N47G.1C*-@*->(+:$'7"'1$+ &$#"                                             !                           ! "##! "#$%''(&$#!     ! $'**&%$#!                 &$!   ! # $& ' & % $ $ ! ! !                              &>J&>J&>J&>J&>J&>J&>J&>J(@L(@L(@L(@L(@L(@L(@L(@L(@L)AM)AM*BN+AN,BO,BO,BO.AO.AO/AO0BP1CQ1CQ2BQ3CP5ER5FP5FP6GQ9GR9GR:GP;HQ;HP;HP=HN>IO@IP@IP@IPAJQAHPCGPDHQDHQEIREIRFJSFJSFJSFJSFJSFJSFJSFJSFJSFJSHJWHJWHJWIKXLKYLKYMKYNLZMKYNLZOKZPL[TM]UN^UN^TP^TP^SQ\TR]US^WT_XU`XU`YVa\Vb\Vb^Vc_Wd`XeaYfdYgdZedZce[dc[fa[e]ZeZXeWVdVUcZYiYXhWVfTScSRbRQ_SQ_RR^TT`RU^QS_QT]QS_PS\PR^PS\OQ]OR[OQ]OR[OQ]OR[OQ]OQ]KMYJLXJJVHJVKJXKMZPO]PR_QP`NP_PO_NP_POaNOaPOaNOaKL^KM\LN]LN]MN`NOaOPbOPbOPdNOcLMbKLaJK`IJ_JK`JK`KL`KL`LMaLM_LM_ML\KJZJIYIFWHFTHFTHDRGCQFBPEAOGAOF@LF@LF@LF@LD>JBDD?FE@G@8CA9DA9DB:EA9D@8C>6A=5@80;7/:5-83+62*52*52*52*52-42-41,30+2/*1.)0-(/-(/-(/-(/-(/,'.,'.+&-*%,*%,*'.)&-(%,'$+'$+(%,)&-*'.(%,(%,(%,(%,(%,(%,(%,(%,)#/)#/*$0*$0+%1+%1,&2,&2*$0*$0*$0+%1+%1,&2,&2-'3,)4,)4.(4/)5/)50*61)62*76+96+97,:8-;:.<;/=<0>=1?;-:;-:<.;<0<<2;>4=>4=?5>E;CF;CH;BL=DN=ER>GS>EU>D\BE^AE^AE^AE]CF]CF]BG]BG[AD`CGeGIgIIkLJsQO|YW_Yg\j]naseyjpztyciuV^kKXeER^>KX8CT6@R4(+;$*7"'0#*&##"                                                            ! "##""#$%&&'%%$"!  "#%),-'&%$"!                ! %#!    ! # % % $ $ # !                           &>J&>J&>J&>J&>J&>J&>J&>J(@L(@L(@L(@L(@L(@L(@L(@L(@L(@L(@L)AM+AN+AN+AN,BO-@N-@N.@N/AO/AO0BP1AP1AN4DQ5FP5FP6GQ8FQ9GR:GP:GP:GO;HP=HN>IO?HO@IP@IP@IPCGPCGPDHQDHQEIREIRFJSFJSFJSFJSFJSFJSFJSFJSFJSFJSGIVHJWHJWIKXKJXLKYMKYMKYMKYNLZOKZPL[TM]UN^UN^TP^TP^SQ\TR]TR]VS^WT_WT_XU`[Ua[Ua]Ub^Vc_Wd`XecXfdYgdZebZea[e_\g][hZYgVXgTWhVYlUXkSViRSeQRdSRbSRbSR`SUaSUaRT`RT`QS_PR^OQ]OQ]OQ]OQ]OQ]OQ]OQ]OQ]OQ]OQ]LNZJNYIKWHLWJLYLP\PR_PT`QSbPSbQRdPSdPQcORePQeNQdJM`IO_JObKPcMReNSfOThOThQVlPUkNRkMQjLPiLPiMQjMQjMQjMRhNSiOTjQSjPRgNPeNQdMNbLMaNLaML^LK]LK[LI\MIZNGWNGWNGWMFVKDTHBPF@NE?KF@LF@JE?IE?IE?IGBIHBLICMIANIANJBQJBOJBQH@MG?NF>KA9H@8E=5D;3@91@80=80?80=4.84/63.52-41,30+2/*1/*10+2/*1/*1.)0-(/,'.+&-+&-*'.)&-(%,(%,(%,(%,)&-*'.(%,(%,(%,(%,(%,(%,(%,(%,*$0*$0*$0*$0+%1+%1+%1+%1*$0+%1+%1+%1,&2-'3-'3-'3,)4,)4.(4/)5/)50*61)61)65*85*86+98-;:.<<0>=1?=1?@2?@2?@4@B6BB8AC9BD:CF;CF;CH;DMR4J&>J&>J&>J&>J&>J&>J&>J'?K'?K'?K'?K'?K'?K'?K'?K'?K(@L(@L(@L*@M+AN+AN+AN,?M,?M.@N.@N/AO/AO1AP1AN6DQ6DO6DO7EP7EP8FQ9FO:GPGN>GN?HO?HO@IPCGPCGPDHQDHQEIREIRFJSFJSFJSFJSFJSFJSFJSFJSFJSFJSGIVGIVGIVHJWJIWKJXLJXMKYMKYNLZOKZPL[TM]UN^UN^TP^TP^SQ\TR]TR]UR]VS^VS^VS^ZT`[Ua]Ub^Vc_Wd`XecXfcXfaYd`Zd^[f][hY[jWZkSXkRWjPWjOViOThOTgQTgSTfTVeTVeTVcTVcSUbSUbRTaQS`QS`PR_QS`QS`QS`QS`QS`QS`QS`QS`MQ\JQYKOZHOYKO[LR^QTcQWeSVgQWgSViPUhQTgOThPRgNSgJQdJQcKReLSfNUhOViPVlQWmRXpQWoPVpOUoOTqOTqPUsPUsOTrPUrQVsRWtSWtSWrRVqQUnQSlQSlRRlRRjQQiQRgSQiSOfTOeVNcVNcUMbSL^PI[NGYLEUKDTKESJDRJDPJDPLFPMGSNHTLDSMETNEVNFUMDULDSKBSJBQG>OE=LB9J?7F=4E;3B:1B:2A60:6185074/63.52-41,31,31,31,30+2/*1.)0,'.+&-+&-+&-+&-*%,)$+)$+*%,+&-+&-+&-+&-+&-+&-+&-+&-+&-+&-+%1+%1+%1+%1*$0*$0*$0*$0+%1+%1+%1,&2-'3-'3-'3.(4,)4,)4/)5/)50*60*62*72*73(64)75*87,::.<;/==1?=1??3?@4@A5?C7AE9CF:DH=EIT5;Q49P38O4;P5J&>J&>J&>J&>J&>J&>J&>J'?K'?K'?K'?K'?K'?K'?K'?K'?K'?K'?K(@L)?L*@M*@M+AN,?M-@N.@N.@N/AO/AO1AP1AN5CP6DO6DO6DO7EP8FQ9FO9FO;ENGN?HO?HO@GOCGPCGPDHQDHQEIREIRFJSFJSFJSFJSFJSFJSFJSFJSFJSFJSFHUGIVGIVGIVJIWKJXLJXLJXMKYNLZOKZPL[TM]UN^UN^TP^UQ_TR]TR]TR]UR]UR]UR]UR]ZT`ZT`\Ta]Ub^Vc_WdbWe`Xe^Xb\Yd\Zg[ZhXYkTYlQXkOWlNVkMUjMUjMTgOThRUhUVhVXgUWfUWfTUgTVeTUgTVeSTfSUdSTfSUdSTfSUdSTfSUdSTfRUdNU_LU\KR\JS\LR^NVaRXfRZgTZjSZjSXkQXjQVjOViOThNUhLTgJUgMUjLWkOWlMXnPXoNXqQXrOYtOVsMVsOUuMVuPVvOXyPVxOXyRXxSYyTZzUZzTYwSXvRWtSWtSWtUVtUVrUVrUVrXUpZTn\Tl\Tl\TkZRiXPeVNcUN`RK]RK[QJZQKYRLZSMYTNZUO]OFWPGXQH[QHYPGZOFWNEXMDULCVJARG>QC:K@7J>5F<3F<4C;5?:5<:5<94;83:7296185075074/63.52-40+2/*1.)0-(/,'.+&-*%,)$+)$+*%,+&-,'.+&-+&-+&-+&-+&-+&-+&-+&-,&2,&2+%1+%1*$0*$0)#/)#/+%1,&2,&2-'3-'3.(4.(4.(4-*5.+60*60*61+72,83+83+84)75*86+98-;;/==1??3A@4B>2>?3?A5?C7AE9CG;EIFS?H[AL`DPeEPgFQjDQhELcCDaCA^BA[AB[AD\CF^EI_FJeLOkQTsVXz\Zb`lhvp~uwyn~v^lhN[[?KT9@V9>U79U79S57P16K.2I,1H-4J/6H-4F+2C)2C*0B+1@)/<%+8#(/")$"!                                          ! "##########""  "$$%)+00*)('%$##!!         ! ! !     ! !       "                                   &>J&>J&>J&>J&>J&>J&>J&>J&>J&>J&>J&>J&>J&>J&>J&>J&>J'?K'?K(@L)?L*@M*@M*@M-@N-@N/AO/AO0BP0BP2BQ2BO5CP5CN6DO6DO8DP8DP8EN9FO;EN;EN=FM=FM>GN>GN?FN@GOCGPCGPDHQDHQEIREIRFJSFJSFJSFJSFJSFJSFJSFJSFJSFJSFHUFHUGIVGIVJIWJIWKIWLJXMKYNLZOKZPL[TM]UN^UN^TP^UQ_TR]TR]SQ\TQ\TQ\TQ\TQ\ZT`ZT`\Ta]Ub^Vc_WdbWe`Xe[UaZWbZXfWYhVYlSXlOWlMXnNYoMXnNVmNTjOThOTgRUfRUfUVhUVhUVjVWiVWkVWiWXlWXjVWkVWiVWkVWiVWkVWiVWkUXgPYbMX^MV_LV_NW`OYcS[hT^jU\lT]lT[mR[lRYlOWjOUkNVkMXlLYlMXnMYoNYoMYqNXqMYsNWtLWsLUtKVtLUvLWwNWxNX{NVzNX{QY}RZ~S\}U[}TZ|TZ|SYyTYyTYwUXwVYxVYxVZwYYu]Yt^Xr_Ys_Zq^Yp\Wm[VlZUiYThYUfXTcXTbXTbZVd[We^Xf[Re[Re\Sh\Sf\Sh[ReYPeXObWNcUL_QH]MDWI@UF=PE;6=:5<94;7295074/62-42-4/*1.)0-(/,'.,'.-(/.)0/*1,'.,'.,'.,'.,'.,'.,'.,'.,&2,&2,&2+%1*$0)#/)#/)#/,&2,&2,&2-'3-'3.(4.(4/)5/,7/,71+72,82,83-94,95-:7,:8-;:/=<1??3AB6DC7ED8FC9DD:CFGK@HNCKPCLSCM\HQ_JSfKTkKVoKWoIVpFRnFOhFGdFDaED^DE_EH`GJaKNcMPoVZtZ]}`bfdmkvr{~krYohM`aBRW7DR3;S38P22Q31P22M/1H+/E(-D)0G,3F+4D)2B(3C)2B+3A*2=&,8#(.!($!!                                               ! "#####""""" !#$%(+00+*)(&%$$""!       ! " ! ! ! !                                            '=J&>J'=J&>J'=J&>J'=J&>J'=J&>J'=J&>J'=J&>J'=J'=J'=J'=J(>K(>K)?L)?L,?M,?M.AO.AO/AO0BP0BP1CQ2BQ2BO5CP5CN5CN6DO7CO8DP8EN;EO;ENEM>EM?FNAENBFOCGPCGPDHQDHQEIREIRFJSFJSFJSFJSFJSFJSFJSFJSFJSGJSFHUFHUHGUIHVIHVJIWKIWLJXMKYNLZOKZPL[RN]SO^UN^TP^UQ_TR]UR]TQ\TQ\TQ\SP[SP[WT_ZTb[Uc\Vd]We^Xf^Xf_YgXTbXVdXWgVWiUXkRWkPVlNVmQ\rRZqPXoNTjNSiMRfORePSfTVkTVkUWlVXmVXmWYnXZoXZoVXmVXmVXmVXmVXoVXoVXoTYmQXhOYeNWfMVeNWfQZiT]nV_pV^qU]pT\qS[pQYnPXoOWnOWnOYrNZrNZrNZrMYsMYsMXtMXtKVtKVvJTwISvJTwIVyLVzMW{MW{NX|QY~RZS[S[U[TZ~TZ~TZ|UY|UY|VZ}VZ}WZ{YZy]Zy_Zx`[y`\w`\w_[v^Zs]Yr_[t^Zq^Zq]Zo^[p_\qa^sb_te`wh_zh_zi`{h_ze_ye\wb\v`Zt]WqZTnUOiQKeNHbMGaLG]EAPEBMF@LC@ID>JA>GB?5@B7EE9EG;IHK*=K*=K)L+>L-?M-?M-?M-?M.@N.@N/AO/AO0BP0BN1AN1BL4BM4BM6BN6BN9CM9CM?:A;6=A:BHAILEMNFQSIRXNY]Q][KX_M[dR`iWem]jqalucoveo|hq}fl|cg{^`xZZtUSsPNpOJoPKlOIiLHhLHkOLoVRv\[z`_ijpqz{zk|jSecKYY?JQ6?O27M04L.0J.-H+-E+.G*.D*-C(-B',B',A&+>#*@%,D)0F+2E*1@'+="'7!$-($"!                                                          # ! # ! # ! # ! " " ! $ " $ # ! """ # $()++*(&%%&&'%$$###!                ! !                                             ':H':H':H':H':H':H':H':H':H(;I(;I(;I)L,>L-?M-?M-?M-?M.@N.@N/AO/AO0BP0BN2BO2CM4BM5CN6BN7CO9CM:DN=DN=DN?CL@DMADMBENDDNDDNDGPDGPDGPEHQEHQFIRFIRGJSGJSFIREHQDGPDGPEHQFIRGJSIGUIGUJHVKIWLJXMKYNLZNLZMKYNLZNLZOM[QO]RP^RP^SQ^UO]UO[VP\VP\UR]UR]US`US`TR`USaTScTScSUdSUdTVeTVeSVgSVgSViRUhRUhQTgQShQShRTkRTkQSjQSjPRkPRkOQjMQjNRkMSkNTlOUmPVpQWqRXrSYsSXuSXuSXvSXvSXvSXvSXxSXxPUuQVvRWwSXxTYyUZzV[{W\|V[{V[{UZzUZzTYyTYyTYySXxOUwOUwMVwMVwMUyMUyLVyLVyIVyIVyJV|JV|JX}JX}KYLX~OW|QV|QV|RW}RW}SX~SX~SX~V[V[V[V[V[V[V[W[[^]]]]^^^^_______^`_`_`_a`a`babacbcbebdcedceeddfdfbfad_d^a\aZ_[_^^z_]s_[r\Zp[WnYWlXUhWVfWTeUTbSQ_OO[KIVEEQB@K@>I?9E?7B=5@;4<9297156026022,.2,00+10*4/)5/)7.'7,(7'*3&+1&+1'*1'*1))1*)1*)1,)2.(20(33)24*56*47+76,52/634967<87?98@;:B?>FDAJFCLMGSTNZYSa\VdaYhe]lk`psbtvcvzgz~mquwxq}oxjp}dgy_^vZWsVRrUOpTPmTOlSOmTPqWVw_]efjjtw|~ns^mdLZ^DOT9@L25J-1I,.G+*F*)D*-C(-C(-B',A&+A&+@%*@%*>#(A&+C(-E*/D).A&+="'9 $-($"                                                         "#$ $ # # # # # # # ! " " # # $ $ $ ! ! ! ! ! ! ! ! # # " # $&'),+)''''(((%%$$##!               ! !    ! !                                  ':H':H':H':H':H':H':H':H':H':H':H(;I)L,>L-?M-?M-?M-?M.@N.@N/AO/AO0BP0BN2BO3DN5CN6DO7CO8DP:DN:DN=DN=DN?CL@DMADMBENDDNDDNCFODGPDGPEHQEHQFIRFIRFIRGJSFIREHQDGPDGPEHQFIRGJSIGUIGUJHVKIWLJXMKYNLZNLZMKYNLZNLZOM[QO]RP^RP^SQ^TN\TNZUO[UO[TQ\TQ\TR_TR_TR`TR`SRbTScSUdSUdSUdTVeSVgSVgSViRUhRUhQTgQShQShRTkRTkQSjQSjPRkPRkOQjMQjMQjMSkMSkOUmPVpQWqQWqRXrSXuSXuSXvSXvSXvSXvSXxSXxQVtQVtRWuSXvTYwUZxV[yV[yV[yUZxUZxUZxTYwSXvSXvSXxOUwOUwMVwMVwMVwMVwLVyLVyIVyIVyJV|JV|JX}JX}KY~LX~PX}RW}RW}SX~SX~TYTYTYV[V[V[V[V[V[V[W[[^]]]]^^^^_______^_^_^`_a`a`a`bacbacdcbdcdbedecfdgchch`haf_g^e`eefffgdddfccc}eb}cc{b`x_`u_]s[\pYWlSTfRQcON`KGXKDTHBPE?KA;E>9@<7=;6:5045064/63-71+70*8/)7-)7**4(+2(+2**2*+0*+0+*0+*0/,31,31,33,34-56,47-64/611;46B:#(>#(>#(?$)@%*C(-D).C(-?$); %8#,'#!!                                              !               #%%"    ! ! ! ! ! ! ! ! ! ! ! # # " # $&')/.+)))))))((%%$$"!!                   ! " " !                                             &9G&9G&9G&9G&9G&9G&9G&9G&9G':H':H(;I(;I)L,>L-?M-?M-?M-?M.@N.@N/AO/AO0BP0BN3CP3DN5CN6DO7CO8DP:DN:DN=DN=DN?CL@DMADMBENDDNDDNCFOCFOCFODGPEHQEHQEHQFIRGJSFIREHQDGPDGPEHQFIRGJSIGUIGUJHVKIWLJXMKYNLZNLZMKYNLZNLZOM[QO]RP^RP^SQ^SM[TNZTNZTNZSP[SP[SQ^SQ^SQ_TR`SRbTScRTcSUdSUdSUdSVgSVgSViRUhRUhQTgQShQShRTkRTkQSjQSjPRkPRkOQjMQjLPiLRjLRjNTlOUoPVpPVpQWqRWtRWtRWuRWuRWuRWuRWwRWwRWuRWuRWuSXvTYwUZxUZxUZxUZxUZxUZxTYwTYwSXvSXvRWuPVvPVxNWxNWxNWxNWxMWzMWzKUyIVyJV|JV|JX}JX}KY~LX~PX}SX~SX~TYTYUZUZUZV[V[V[V[V[V[V[W[[]]]]]^^^^______^]_^_^`_`_a`a`_`ab`cadadbeafbfbgbf`g`g_h_h_h_h`heggghhhhhhiiijijghghfgefcd`b{]_x\\vUSkVShURgRO`MKYGEPBAI?QCFYKMbRTiXZqaayffolrovr{wz}~wqozmynxozozr|t~w|}ws~lr_sbK_U=MT9HO3?G,3B(+@&)@&'?%$>$%=#&="'="'#(@%*A&+A&+@%*="'9#6!+%"!!                                                #"                $&%!             # # " # $&')//,+++**+)))&&%%###"!                     ! " " !                                                &9G&9G&9G&9G&9G&9G&9G&9G&9G&9G&9G':H':H(;I(;I)L,>L-?M-?M-?M-?M.@N.@N/AO/AO0BP0BN2BO2CM5CN5CN7CO7CO:DN:DN=DN=DN?CL@DMADMBENDDNDDNBENCFOCFOCFODGPEHQEHQEHQGJSFIREHQDGPDGPEHQFIRGJSIGUIGUJHVKIWLJXMKYNLZNLZMKYNLZNLZOM[QO]RP^RP^SQ^SM[TNZTNZTNZSP[SP[SQ^SQ^SQ_SQ_RQaSRbQSbRTcRTcSUdSVgSVgSViRUhRUhQTgQShQShRTkRTkQSjQSjPRkPRkOQjMQjKOhKQiKQiLRjMSmOUoOUoPVpRWtRWtRWuRWuRWuRWuRWwRWwSXvSXvSXvSXvTYwTYwTYwTYwUZxTYwTYwSXvSXvRWuRWuRWuOUuOUuOUuOUuMVwMVwMUyLVyKUxKUxJWzJWzKW}KW}KY~LX~PX}SX~SX~TYTYUZUZUZV[V[V[V[V[V[V[W[[][^[^\_\^]_]_]_\^\^\^]_]^^_^__`^b^b^b_c`d^e^e^g\dZfZe[g[f\h\g^g`eadbecfdgehfjgkgkhlhlhlgkeicgcf[\{]^z^_{^`wZ[pQRdJIYDCQ@>K@=H=:E:7@93=60:4.:2,80-4/.3/.4/.30.3/.3/.3/.3/.30/410532765:87<9:>8;D?FYELhPUrZ_}bgjoruwy{z|{~~{{{|{rxhr`xnXodMa[@SS7FQ5CL1:E*1A'*?&)?''>&$<$$9 #9 $9 $9 $9 $9 $9 $:!%<#'=$(=$(=$(;"&8#5 1*&#"                                                  #"!               "%%                 # # " # $&')////,++)+*))((%%%%%$$$##                  ! ! ! !                                                 %8F%8F%8F%8F%8F%8F%8F%8F%8F&9G&9G&9G':H(;I(;I(;I*L,>L-?M-?M-?M-?M.@N.@N/AO/AO0BP0BN1AN1BL3AL4BM6BN6BN8BL9CM=DN=DN?CL@DMADMBENDDNDDNBENBENBENCFOCFODGPDGPEHQGJSFIREHQDGPDGPEHQFIRGJSIGUIGUJHVKIWLJXMKYNLZNLZMKYNLZNLZOM[QO]RP^RP^SQ^TN\TNZUO[UO[TQ\TQ\TR_TR_RP^SQ_RQaRQaQSbRTcRTcRTcSVgSVgSViRUhRUhQTgQShQShRTkRTkQSjQSjPRkPRkOQjMQjJNgJPhJPhKQiLRlNTnNTnOUoQVsQVsQVtQVtQVtQVtQVvQVvSXvSXvSXvSXvTYwTYwTYwTYwTYwTYwTYwSXvRWuRWuRWuQVtNTtNTtNTtNTtNTvLUvLTxLTxLTxKUxLVzJWzKW}KW}LX~LX~PX}RW}RW}SX~SX~TYTYTYV[V[V[V[V[V[V[V[Z^Z^[^[_\^\`]_\`[][_\^[^]^]`^_]`ZaYaZbZb[c[c\dZeXcWdWdVeWeWfWeXeZb[a\c^e_f`gahbidkelfmgngngofmem]baedhdiaeX\uQSjKNaGFVEDRCAN@%(>&&<$$;##7!7"7"8#8#9 $9 $9 $;"&;"&:!%9 $7"41.)%"!                                               ""!              ! $"                      # # " # $&').////,*)**)(''$&%%&%&%&%# !     " "                                                             %8F%8F%8F%8F%8F%8F%8F%8F%8F%8F&9G&9G':H':H':H(;I*L,>L-?M-?M-?M-?M.@N.@N/AO/AO0BP0BN/?L0AK2@K3AL4@L5AM7AK7AK=DN=DN?CL@DMADMBENDDNDDNADMBENBENCFOCFODGPDGPDGPGJSFIREHQDGPDGPEHQFIRGJSIGUIGUJHVKIWLJXMKYNLZNLZMKYNLZNLZOM[QO]RP^RP^SQ^UO]UO[VP\VP\UR]UR]US`US`RP^RP^RQaRQaQSbQSbQSbRTcSVgSVgSViRUhRUhQTgQShQShRTkRTkQSjQSjPRkPRkOQjMQjIMfIOgJPhKQiLRlMSmNTnNTnQVsQVsQVtQVtQVtQVtQVvQVvTYwTYvTYvTYvSXuSXuSXuSXuTYvSXuSXuSXuRWtRWtQVsQVsMRpMRpMRrLRrLRrLRrLRtJStLTxKUxLVyLVyMW{KX{LY|NX|OW|QV|QV|RW}RW}SX~SX~SX~V[V[V[V[V[V[V[V[Y_Y_Z^Z`[_[`\`[`Z]Y^[^Z_\_[`\_\`W_U`V`VaWaVcWcVdVdVdVdTeTeTeTeVdXdYcZd[e\f]g^h^h`jalcnepfqfqfqfq_jbkclckbh\bX]zTZrJLaHK^FGYCBP?=J;9D85@63<64983764764754954945:25<25>48A7>H=DNCKVJR]NVaNYm^kcpkvq|s}uy|{zz||~}}}}{zzz|}}xn}c|qUneI`_AY\J,6D&.?$)=$'<$$8#"5 6 6!6!7"8#8#9 $9 $9 $8#7"6!31.+(%!!"                                           !!                              # # " # $&')-/0//-)(*)((&&%%%%'%'%'&& " "   $ $ ! !                                          %8F%8F%8F%8F%8F%8F%8F%8F%8F%8F%8F&9G&9G':H':H(;I*L,>L-?M-?M-?M-?M.@N.@N/AO/AO0BP0BN.>K/@J1?J2@K3?K4@L6@J6@J=DN=DN?CL@DMADMBENDDNDDNADMADMBENBENCFOCFODGPDGPGJSFIREHQDGPDGPEHQFIRGJSIGUIGUJHVKIWLJXMKYNLZNLZMKYNLZNLZOM[QO]RP^RP^SQ^VP^VP\WQ]WQ]VS^VS^US`VTaRP^RP^QP`RQaPRaQSbQSbRTcSVgSVgSViRUhRUhQTgQShQShRTkRTkQSjQSjPRkPRkOQjMQjIMfHNfIOgJPhKQkLRlMSmMSmQVsQVsQVtQVtQVtQVtQVvQVtTYvTYvTYvTYvSXuSXuSXuSXuTYvSXuSXuRWtRWtQVsQVsQVsLQoLQoLQqLQqKQqKQqKQsKQsLTxLTxLVyLVyMW{MW{LY|NX|NV{PU{PU{QV|QV|RW}RW}SX~V[V[V[V[V[V[V[V[Y_Y_Y_Z`Z_[`[`[`Y^Y^Y^Z_Z_[`[_ZaT_S_T`T`UaTbUcSdVgVgUfTfSeSeSeRdYgYgZh[i\j]k]k^l]k_maodresftftftbpao`l^k^g\e[c\bKPmJNgHJ_CFYA@P<;I87E75@86;86986976;76<66>47@37B39E5=J:CR@L\HSeO\oUbuVdhvk{rtsrs~tvt}t}x~~{wvwxvutswy}~{vh|^vpRjgG^`@W\;PY8IW7FN.;I)4B$,="';"%7!#4 13 5 6!7"8#8#9 $9 $8#7"6!41.,)'%!!"!                                                                            # # " # $&'+-./0.-+'))''&%%%$ & & & '''''% "    " % %" !                                      $7E%8F%8F&9G&9G':H':H':H&9G&9G':H':H(;I(;I)L,>L-?M-?M,>L,>L,>L-?M-?M.@N.@N.@L0@M0AK2@K3AL4@L5AM7AK7AK=DN=DN@DMAENCFODGPGGQGGQADMADMBENBENCFOCFODGPDGPDGPDGPEHQEHQFIRFIRGJSGJSJHVJHVKIWKIWLJXLJXMKYMKYMKYNLZNLZOM[PN\QO]RP^SQ^UO]VP\XR^YS_WT_VS^SQ^RP]RP^OM[ML\PO_RTcUWfSUdQSbRUfRUfRUhQTgPSfOReOQfNPeRTkRTkQSjQSjPRkPRkOQjMQjKOhJPhKQiKQiLRlMSmNTnNTnKPmLQnMRpNSqPUsQVtRWwRWuPUrQWqQWqRXrRXrSYsSYsSYsQWqQWqRXrSYsSYsRXrQWqQVsORqORqNSqNSqNSqNSqMSsMSsLUvLUvMUyMUyMWzMWzNX{NX{OW|QV|QV|QV|QV|QV|QV|QV|TYTYTYTYTYTYTYTYU]U]U]V^W_W_W_X`X_X_X_X_X_X_X_W_T`SaSaSaSaQaQaQaQaPbQcOdPePeQfQfSeTdUeVfWgXhYiZjYiZj\l^naqcseufvfvfvdtbrcoanambkX`V\|PUrIOgEG\ADW@AS?AN=>C;:?87=77?8;D9=H8>L7>N=EX>I_COgJXrTb]lethwqqqqppq}q}r|s}s~tvwwwvuusssssvwz|~}}~}|}{wr|czZqnNeeC[^=RY6JT2CQ/?G%3D$/?!):$7!3233 5"7!$9#&:$':$'9#&8"%7!$6 #3 /+(%# %$$#!                                                                          ! " " # # $%&'(++../100/&'))))((&()('& $ # $ $ $ $ $ $ $ " !                                      $7E$7E$7E%8F%8F&9G&9G&9G&9G&9G':H':H(;I(;I)L,>L-?M-?M,>L,>L,>L-?M-?M.@N.@N.@L0@M0AK2@K3AL4@L5AM7AK7AKJ;?K=CQ@GWAI^@KaLWsN\yTc[kashzk~monnoon~n~o~o~q}rrsuuvrrppppppstu~y{~}~}}||zxyywrm{a|xXmmKccBW\9MW5FR0@N,:E$/B#+> (:$7!4 33 4!5"6 #7!$8"%8"%8"%8"%6 #5"2/+(%$%$$#!                                                                  ! ! # # $%&'(*+..///.-'&())(((()))(& $ # $ $ $ $ $ $ $ " "                                       #6D#6D#6D$7E$7E%8F%8F%8F&9G&9G':H':H(;I(;I)L,>L-?M-?M,>L,>L,>L-?M-?M.@N.@N.@L0@M0AK2@K3AL4@L5AM7AK7AKPW6IR1BM+;J(6A!,@!)='9#7!4 3 3 4 "3!3!3!3!4 "6"$6"$3!2 0-)'$#&%%$!                                                        "                " " # $%&'),//0/,+)&''()(('))))(& $ # $ $ $ $ $ $ $ " # !                                               "5C"5C"5C#6D#6D$7E$7E%8F&9G&9G':H':H(;I(;I)L,>L-?M-?M,>L,>L,>L-?M-?M.@N.@N.@L0@M0AK2@K3AL4@L5AM7AK7AK)=':$9#7!4 3 3 4 "3!10013!5!#00.+)&%$&%%$!                                                                      " # # ! ! !            ! ! " # $%&(-///.,( ' % &('(('&)***('% $ $ $ $ $ $ $ $ " " !                                              "5C"5C"5C#6D#6D$7E$7E%8F&9G&9G':H':H(;I(;I)L,>L-?M-?M,>L,>L,>L-?M-?M.@N.@N.@L0@M0AK2@K3AL4@L5AM7AK7AK;BL;BL>BK?CLADMBENEEOEEOADMADMBENBENCFOCFODGPDGPDGPDGPEHQEHQFIRFIRGJSGJSHFTIGUIGUIGUJHVKIWKIWKIWKIWLJXMKYNLZOM[PN\QO]QO\TN\TNZTNZTNZROZROZQO\QO\PN\QO]PO_PO_NP_NP_OQ`PRaMPaMPaNQdNQdORePSfPRgQShPRiPRiPRiOQhNPiNPiNPiKOhLPiKQiJPhJPhJPjJPjJPjJPjLQnLQnMRpMRpMRpNSqNSsNSqMSmMSkNTlNTlOUmOUmPVnPVnOUmPVnQWoRXpRXpQWoPVnOUmRSoRSoRSqRSqPTqPTqPSrOTrQVvQVvPVvQWwRXzRXzPYzQY}QV|QV|QV|QV|QV|QV|QV|QV|RW}RW}RW}RW}RW}RW}RW}PX}O[N\N\O]O]P^P^P^P]P]P]P]P]P]P]P]R_R_R_Q_Q_Q_O`O`O`ObObObNcOdOdOdMdMdNeOfPfQgRhRhRhRhTjUjVkXmYnYn[p\q\q]r^s_s`tatexhyizizgybt]p[l\kYhWfVg]ncugyg{jjh~f~f~fffkklkj~j~k~j}jzj{j{j{kzk{k{jzl|l|l|k|k|i|k{k|n}p}s|u|w|y|{}||~|{~zzxxxwxwutqlyds]fNd_GUWL,>L-?M-?M,>L,>L,>L-?M-?M.@N.@N.@L0@M0AK2@K3AL4@L5AM7AK7AK:AK;BL>BK?CLADMBENEEOEEOADMADMBENBENCFOCFODGPDGPDGPDGPEHQEHQFIRFIRGJSGJSHFTHFTHFTIGUIGUJHVJHVKIWKIWKIWLJXMKYNLZOM[PN\PN[TN\SMYRLXRLXPMXPMXPN[QO\OM[QO]QP`QP`MO^LN]NP_OQ`MPaNQbNQdNQdNQdOReOQfOQfPRiOQhOQhNPgNPiMOhMOhKOhLPiKQiJPhJPhIOiIOiIOiIOiMRoMRoMRpMRpMRpMRpMRrMRpLRlLRjMSkMSkNTlNTlOUmOUmNTlOUmPVnQWoQWoPVnOUmNTlSTpSTpSTrSTrQUrQUrQTsQTsQVvRWwQWwRXxRXzSY{QZ{QZ{QV|QV|QV|QV|QV|QV|QV|QV|RW}RW}RW}RW}RW}RW}RW}PX}NZM[M[N\N\O]O]O]O\O\O\O\O\O\O\O\R_R_R_R_Q_Q_Q_O`O`O`NaObMbNcNcOdLcLcMdNdOePfQgQgRhShTiUjVkWlXmXm\r\r\q]r]r]q^r^rcwdxg{h}g|dyaw_sbs_p\p^rcwg|i~imjiggfgjijkj~j~i}j}j}iyiyiyhyixhwhwhwk{j|j{h|h{h{h{h{l|n}q{r{u|w|y|z|}{}y}y|x~w~v~vvxwtsnyfq\kUy\F[V@ML6BF.;C)6A%1>".> *;%;%9#8"6!40.0/.----.++*)'&%%&'%$" !                                                                                   $ & & % # #              ! " # $&/000-+ ' & ' ()*)(('()))(&$# " " " " " " " "                                         $7E$7E$7E%8F%8F&9G&9G&9G&9G&9G':H':H(;I(;I)L,>L-?M-?M,>L,>L,>L-?M-?M.@N.@N.@L0@M0AK2@K3AL4@L5AM7AK7AK:AK:AK=AJ>BK@CLADMDDNEEOADMADMBENBENCFOCFODGPDGPDGPDGPEHQEHQFIRFIRGJSGJSGESHFTHFTIGUIGUJHVJHVJHVKIWKIWLJXMKYNLZOM[PN\PN[TN\SMYQKWPJVNKVOLWPN[QO\OM[QO]RQaQP`LN]KM\LN]OQ`ORcORcNQdNQdNQdMPcMOdMOdOQhOQhOQhNPgNPiMOhMOhJNgLPiKQiJPhJPhIOiHNhHNhGMgMRoMRoMRpLQoLQoLQoLQqLQoKQkKQiLRjLRjMSkMSkNTlNTlNTlOUmPVnQWoQWoPVnOUmNTlSTpSTpSTpSTpQUrQUrQTsQTsRWuRWuQWwRXxRXzSY{QZ{R[|QV|QV|QV|QV|QV|QV|QV|QV|QV|QV|QV|QV|QV|QV|QV|OW|MYLZLZM[M[N\N[O\O\O\O\O\O\O\O\O\Q^Q^Q^Q^Q^P_P_P_N_O`NaObObPcPcNcKbKaLbMcNdOePfPeShTiTiUjVkWkXlXm]s]s^s^s_t`t_t_tezf{g|h~g}e{czawcwbvaubwf{gf~c|ghihhhghhjkj~j~i}j|i{hxhxgwgwgvfufuetgxeyeydydydydxexgzjzmyozrytytyvyyy{y{y{w{w|v}u~uwuqn{hr_hR_KpR?RK:DE1<@*6>'1>$/=!-; );%;%9#8"5 3.+-,--,+))((''&%%%&''& " !   !                                                                                  $ ' ' % $#   !         ! " # % .000.-+ * ( )*+,+)((((('%#" ! ! ! ! ! ! ! !                                            $7E%8F%8F&9G&9G':H':H':H&9G&9G':H':H(;I(;I)L,>L-?M-?M,>L,>L,>L-?M-?M.@N.@N.@L0@M0AK2@K3AL4@L5AM7AK7AK:@L:AK=AL>BM@BNACODDPDDPACOADMBDPBENCEQCFODFRDGPFFRFFPGGSGGQHHTHHRIIUIIUGESGESHFTHFTIGUIGUJHVJHVJHVKIWLJXMKYNLZOM[OM[PN\RN\QM[OKYNJXMKXNLYPN[PO]OM[PO]RQaQP`KM\JL[LN]OQ`QRdORcPQeNQdMPcLObLNcLNcOQhOQhNPgNPgMOhKOhLNgJNgKQiKQgJPhJPhIOgHNfGMeGMeMSmMSmMRoLQnLQnLQnKPmKPmLPkLPiNPiMQjOQjNRkPRkOSlQSlPTmSUnQUnSUnQUnRTmQSlSUnSTpSTpSTpQUrQUrQTsQTsRWuRWuRXxRXxSY{SY{R[|RZ~OW|OW|QV~OW|QV~OW|QV~OW|QV~OW|QV~OW|QV~OW|QV~OW~LXLZMYLZNZN[N[N[N[N[N[N[N[N[N[N[Q^Q^Q^Q^Q^Q^P_P_P_N_O`NaObObPcNcK`KaLbMcNdOePfPeTiTiUjVkVkWkXlXm^r_s`tatcvcwdwexj}i~i~f~g|c{ay`xbzaxcxczf}g~c|az^y`{dhigfehhi~i~i}i}i{i{fxewewcwbvauau`tavavav`w`v^w`v`vdxexhwlvmvpwqvsvxzyyzx{wzv|v|t}ttrn}jydnYbKwYCgM:MI5@A-8='3<$1=#.<"-; )9%:&:$8"5 2,*++--,*(&''&&%%%&&%%$ !    !                                                                                 ! $ % % # # !    ! " !        ! " # % .0010., ) ))+,,*)()((('%#" ! ! ! ! !  ! !                                                     %8F%8F%8F&9G&9G':H':H':H(;I(;I(;I(;I(;I(;I(;I(;I,>L,>L+=K*L,>L-?M-?K0@M0AK2@K3AL4@L5AM7AM7AM;AO;AM>BN>BN@BO@BOCBPCBPACPACOBDQBDPEDREEQFESFFRGESHFSIGUJHUKGVJFTIETHDSHFTIGUIGUJHVJHVKIWKIWKIWMKYMKYMKYNLZOM[OM[OM[PN\MLZMLZMLZMLZMLZMLZMLZKM\ON^MO^MO^NP_OQ`OQ`OQ`PRaMN`MN`OMbMNbMNbMNbLNcLNcNPgOQhMRhMRhLPiJPhIMfGMeIOeHObHNdGMcHNdIOeKQgLRhLRhMSiMSiMSiMSiLRhJPfJNgNNhPMhQMhPMhQMhPMhQMhPMhSOjSPkVRmWToXToWToVRmTQlSSmRTmSUnSUnRVqRVqSWtSVuRWuRWwQWyQWyQW{QW{OW{OW|QYPYQXPYQXPYQXPYOVNW~OVNW~OVNW~OVNWLUKVNVMXPXP[Q\Q\MZN[M[N\O]P^P^R_N[O[O[O[N[N[N[M\P^N_O`O`PaPaOaNcOdNdMcMcMcMcMcLbRgRgShTiUjVkWlXk\m_pararaqasewizk|i|gzezexdyezd|d|d}e|e~ffggggghhfiiggg~g~i~i~i|i|bu`u[sXrTrRrRrTsUnXnWpWqXrZt[t\t^s`tdthtluovqvsvrtttxvyu{tzr}q}ptrn}ft[iOv`DlZ?`P7LN6DI1?D,9B(5?%0<"-;!*8%7$5 3211010/.-+**&&%%$$$#!!                                                                                      "%%#                        ! #'-03331.++))&&$ $ $ ***))('&                                                       %8F%8F%8F&9G&9G':H':H':H(;I(;I(;I(;I(;I(;I(;I(;I);I*L,>L-?M-?K0@M0AK2@K3AL4@L5AM7AM7AM;AO;AO=@O>AP?AP@BQBAQCBRACPACPACPBDQDCQEDRFDRGESGESHFTJFUJFULEULEUKDTHDSIETIGUIGUIGUJHVJHVKIWKIWLJXMKYMKYNLZNLZOM[OM[NM[ML\KM\KM\KM\KM\KM\KM\KM\LN]MO^MO^NP_NP_OQ`OQ`OQ`ON`ON`OMbOMbMNbMNbLNcLNcNPgNPgMRhMRhKQiJPhHNfGMcIOeHObHObGNaHObIPcKReLSfLSfLSfMTgMTgMTgKReJQdJOcPMhQMhRLhQMhRLhQMhRLhQMhTNjTPkWQmXToYSoXToXRnVRmSSkRTkRTmSUnQUpRVqRVsSWtSXxSXxRXzRXzRX|RX|PX}PX}PYPYPYPYPYPYPYPYNWNW~NWNW~NWNW~NWNWMUMUNVMXPXP[Q\P]P]O]O]O]N\L]N\N]N[N\N[N[N[M\M\M\O]M^N_M`N`N`OaMbNcMcMcMcMcNdNdNdRgShTiUjVkWlWlYm^oapcrcscsdsixk|izgzfyexdwcwdybye~ce~c~fdf~df~egeg~eg~ec~c~c~d|d{eyeyez_t\tWsTrPrLsLsOtTnXnWoWqXrWsXt[t[s_sbrgrjsmtotqtsuttvtwsxryp{o}nol}gw^oSyfHl^>cY:YP5HN3BJ/>E*9A'4>$1<"-;!*7&6#42000./..,+*))%%%$###!!                                                                                          ""                          ! #'.03432.++))'&%$ $ *,))((&&                                                   %8F%8F%8F&9G&9G':H':H':H(;I(;I(;I(;I(;I(;I(;I(;I'9G(:H);I);I+=K+=K,>L-?M*L,>L-?M-?K0@M0AK2@K3AL4@L5AM7AM7AM:@N;AO=@O>AP?AP@BQBAQBAQ@BOACPACPBDQDCQEDRFDRFDRFDRGESIETJFULEUKDTJCSGCRIETHFTHFTIGUJHVJHVJHVKIWLJXLJXLJXMKYMKYNLZNLZMLZLK[JL[JL[JL[JL[JL[JL[JL[LN]LN]LN]MO^MO^NP_NP_NP_NM_NM_LMaLMaLMaLMaKMbKMbKPfKPfLQgLQgKQiJPhHNfGMcIOeHObHObGNaHObIPcKReLSfKReLSfMTgMTgLSfKReJQdJOcLLfNKfOKfNKfOKfNKfOKfNKfTPkTQlVRmVSnXToWToWSnVSnRRjRTkRTmSUnQUpRVqRVsRVsTYyTYySY{SY{SY}SY}QY~QY~QY~QY~QYQY~QYQY~QYQY~NV}NV{NV}NV{NV}NV{NV}MV}NWLWMXMZOZO\O\O^Q`O`N_M^L]J]J[J[K]M\M\M\M\K]K\J]K^I^J_J_K`K`LaLaMbMbMbNcOdPeQeQeThThUiVjWkXlYmZn`qbsdueueudvi{m~izgyewcwbvcwcxbydcdcc~bc~b~c}b~c}b}c}b}c|b}`|_|^z^y_w^u]t]tZqXqTpQqMoJqKrMrTnWmXnWoWqXrYrYrYq\p^qbqfqhqkrlrqsqqrprntnvmyl|kj{ew]oSyiInb@c[7[U4QM2EI1?E-:A)6=%2;#09",8!)4%3"0.,,+,,++*)('&$###"! !                                                                                                                       ! #'.23432.++**' & & & % ++((''%%                                                  %8F%8F%8F&9G&9G':H':H':H(;I(;I(;I(;I(;I(;I(;I(;I(:H);I);I*L*L,>L-?M-?K0@M0AK2@K3AL4@L5AM7AM7AM:@N:@N&3;#09",8!+7 (3$2!/,*)))((''&%%$"""! !                                                                                                                      ! #'.23442/-.++) ) & ( ( **''&&$$                                                   "! %8F%8F%8F&9G&9G':H':H':H(;I(;I(;I(;I(;I(;I(;I(;I,>L+=K+=K*L,>L-?M-?K0@M0AK2@K3AL4@L5AM7AM7AM9?M:@N@O?APA@PA@P?AN@BO@BO@BOCBPDCQECQECQECQFDRHDSIETKDTJCSIBRFBQHDSGESGESHFTHFTIGUIGUJHVJHVJHVJHVKIWKIWLJXLJXKJXJIYHJYHJYHJYHJYHJYHJYHJYJL[JL[JL[KM\KM\LN]LN]LN]KL^KL^KL`KL`JM`JM`JLaJLaHMcINdIOeJPfJPhJPhHPgGOdIOeHObHObGNaHObIPcKReLSfJQdKReLSfLSfKReJQdIPcINbKMdLLdLLdLLdLLdLLdLLdLLdQQiQQiQQiRRjRRjSSkTTlTTlPRiQSjOSlOSlPToQUpPUrPUrUZzTZzTZ|TZ|RZ~RZ~RZRZSY}SY}SY}SY}SY}SY}SY}SY}RX|RX|RX|RX|RX|RX|RX|PX}NZM[N[N\M\N]N]N]K]K]K^K_L_L`KaKaH^H^J]H^H^H^H^G^G^G`G`EaH`FaGbIaLaOaPbQcRdTfUgUgVhVhWiXiYjZk[l[l]q_ratauaucvgzj~h|e{dzbybyaybz`{a_^~]}]}\|[{[{[{[{[{ZyYxYxXwWxVwVxUuSsTrSoRlRmRmPmNkLkJlImHoLoSmWmWmWmXmVnXmXnXnYm\m]l`mamdkflgigefbjdpgtiwfucv]oUxhJlcBa_:[\5TW.LO,DF);A)6>&3;#09",7 *7 *6'3$1 /,)(''%$$###""!!                                                                                                                      "%.25442/. /..+ + ) * ( ))&&%%##                                                    !##!  %8F%8F%8F&9G&9G':H':H':H(;I(;I(;I(;I(;I(;I(;I(;I-?M,>L+=K+=K);I);I(:H'9G*L,>L-?M-?K0@M0AK2@K3AL4@L5AM7AM7AM9?M9?M;>M@O@?OA@P?AN?AN?AN@BOBAOCBPDBPECQECQFDRHDSIETKDTJCSIBRFBQGCRGESGESGESHFTIGUIGUIGUIGUIGUIGUJHVJHVKIWKIWJIWIHXGIXGIXGIXGIXGIXGIXGIXIKZIKZIKZJL[JL[KM\KM\KM\KL^KL^KL`KL`JM`JM`JLaHMaGLbGMcHNdIOeJPhIOgHPgGOdIOeHObHObGNaHObIPcKReLSfJQdJQdKReKReKReIPcHObHMaKMdKMdLLdKMdLLdKMdLLdKMdPPhOQhOOgNPgPPhPRiRRjRTkPRiNSiNRkOSlOSnOUoOTqOVrSYySYySY{QZ{QY}QY}QY~QY~SY}SY{SY}SY{SY}SY{SY}SY{TZ~TZ|TZ~TZ|TZ~TZ|TZ~RZ~R[P\P\O]O]O]O]N]L[J\K]L^M_MaNbNbH^H^H^H^H^G_G^G^H_G`HaFbGbGbHcJbNcPcQcRdSeTfTfTfTfUgVhWiXiYjZkZkYl[p]q\r]p^sbvd{dzbzbx_w_w]x`x]z\|X|X|X|X|W{W{W{W{VzVyUxTwSvRuQtRvRvQuQsQqOoPnPnNlMlLkIkIkImJnLnSmVlVkVkVkWlXlXlYl[k^k_j`jbicifhhfhbg_japesdq_nZlTvfKj`A`\:UZ6RX2KS+EM'L,>L-?M-?K0@M0AK2@K3AL4@L5AM7AM7AM8>L9?M;>M@O@?O@?O>@M?AN?AN@BOBAOCBPDBPDBPECQECQGCRHDSJCSIBRHAQFBQGCRFDRGESGESHFTHFTHFTIGUHFTHFTHFTIGUIGUJHVJHVJIWHGWFHWFHWFHWFHWFHWFHWFHWHJYHJYHJYIKZIKZJL[JL[KM\IL]IL]IL_IL_IL_IL_GL`GL`FKaFLbGMcHPeHPgHPgHPgGOdIOeHObHObGNaHObIPcKReLSfIPcJQdKReKReJQdIPcHObGNaKPfKPfMOfKPfMOfKPfMOfKPfNPgKPfLNeJOeLNeLQgOQhOTjMRhNSiNRkNTlNTnOUoOTqNUqRXxPYxPYzPYzPX|OY|OY}PX|SY{SYySY{SYySY{SYySY{SYyU[}U[{U[}U[{U[}U[{U[}U[}T\S\R[P\P\P\P\O]O]N^N^N^O_M_M_M_J^J^J]J]J]H^H^G^I`HaIbIbJbJbKcLcReSdSdTeTeTeTeTeTdTdUeVfWgXhYiYjTiUkWmVnWlWn\s^v^v[u\tXrXrWtYtWuUyTyTyTyUzUzUzUzTyTySxRwPuOtNsNsPuOtOtNtNrPrPpPqKlKlJlIkIkJlKmNnSlTlVkVkWkVjWiYi\k^j`ibiehfgeghfmemak_m`qbp^iT{bLpaHh]@^V8RU3KU2JT.CM'L,>L*L,>L-?M-?K0@M0AK2@K3AL4@L5AM7AM7AM8>L8>L;>M;>M=?N=?N@?O@?O>@M>@M?AN?ANBAOBAODBPDBPDBPECQGCRHDSJCSIBRHAQEAPGCRFDRFDRGESGESHFTHFTIGUGESHFTHFTHFTIGUJHVJHVIHVHGWFHWFHWFHWFHWFHWFHWFHWGIXHJYHJYHJYIKZJL[JL[JL[IL]IL]IL_IL_IL_GL_GL`FM`DJ`EKaFNcHPeHPgHPgHPgGOdIOeHObHObGNaHObIPcKReLSfIPcJQdJQdKReJQdIPcGNaFM`KPfKPfKPfKPfKPfKPfKPfKPfKPfJOeINdHMcINdJOeLQgNSiMRhMRhMSkMSkNTnNTnNUqNUqOXwOXwOXyOXyNX{NX{NX|NX{QZ{SYySYySYySYySYySYySYyW]}W]}W]}W]}W]}W]}W]}W]V[V[T\T\S[R[R[R[S_R^R^P^O]N\N\L\K]K]K]K]K]J]J]H^K`JaKbKbLcLcLcMdTgTeTeTeTeTeSdSdScScTdUeVfWgXhXiPfPiRjRlRkSlXpZtXrVrTpSoRnRpRpQqQvPvQwRxRxSyTzTzSyRxQwPvNtMsLrLrNtNuNuMtNsOsOsPrJlKlJkKjLkNlOmQmSlVkVkVjWiYiZh\fajcheggfifidkdmctgtcq`r`t_nZcMqZBbY@]U9RO2HO/DO0BN->F&5?!-9",7")5 )4&3%3%3%3%4&2$/!+(&%$ !!!!""""""!!                                                                                !!    !!"""                           "$-/33430/ 000//. . , ( & $ # # " ! !                                                 #%#    &9G&9G&9G&9G&9G&9G&9G&9G(;I(;I(;I(;I(;I(;I(;I(;I+=K+=K+=K+=K+=K+=K+=K+=K,>L,>L,>L,>L,>L,>L,>L,>J0@M0AK2@K2@K2>J2>J4>J4>J8>L8>L;>M;>M=?N=?N@?O@?O?AN@BO@BOACPCBPDCQECQECQDBPDBPEAPEAPG@PG@PG@PEAPFBQECQECQECQECQECQECQECQECQFDRFDRGESGESHFTHFTGFTML\IKZFHWDFUCETDFUGIXIKZFHWFHWGIXHJYIKZJL[KM\KM\GJ[GJ[EJ]EJ]EJ]EJ]EJ^DK^DJ`DLaDLaEMbCNdDOeDOeFNcIOeIPcIPcIPcIPcIPcIPcIPcKReJQdIPcHObGNaHObIPcIPcJOcJOcJOcJOcJOcJOcJOcJOcHMaHMaINbINbJOcKPdLQeLQeIOeJPfLRjNTlNUoOVpOVrOVrLUtLUtKVvLWwMWzMWzKX{NX{OXyQWwQWwRXxSYySYySYyTZzTZzTZzTZzTZzTZzTZzTZzTZ|Y]Y\Y\Y\X]X]X]V^T\T\R[R[R[P\O[O[Q_P_O^O^N]N]M\K\N_M`M`LaMbMbMbNcQcQcQcQcQcQcQcQcVhVhUfUfTeSdRcPdMfMgNhNjOkQlRmRnSoRpQnQoQoQrRsRtKrLuNwNwLuMvPxT}KtKtKtKtKtKtKtKtKtJsJsLsKrKqKqLqJlJkIjJiLjOkSlTmNfTiYlZl[i^hajglhikhnfofperesdvd{ew`pYlS{fMt]EgS:XL4NM3LL3HM2EK0?G-:B(3>$/;!*8#*4!%2%2%3 &3 &1$.!++)&$"     !"""#!                                                                            ! ! "! " " " " ###'&&%%$$#                           ' * . /2333- . ///. , + )' $ " !                                                     !!!! &9G&9G&9G&9G&9G&9G&9G&9G(;I(;I(;I(;I(;I(;I(;I(;I+=K+=K+=K+=K+=K+=K+=K+=K,>L,>L,>L,>L,>L,>L,>L,>J0@M0AK1?J1?J2>J2>J4>J4>J8>L8>L;>M;>M=?N=?N@?O@?O?AN@BO@BO@BOCBPCBPECQECQDBPDBPEAPEAPG@PG@PG@PEAPFBQECQECQECQECQECQECQECQECQFDRFDRFDRGESGESHFTGFTLK[HJYEGVCETBDSCETEGVGIXEGVFHWGIXHJYIKZJL[KM\KM\GJ[GJ[EJ]EJ]EJ]DK]DK^DK^CK`DLaDLaBMaCNdCNdDOeDOcGOdHObHObHObHObHObHObHObJQdJQdHObGNaGNaHObIPcJQdJOcJOcLNcJOcLNcJOcLNcJOcKMbINbKMbJOcLNcJOcLNcKPdIOeJPfLRjMUlNUoOVpNUqLVqKTsKVtKVvLWwLVyKXzKX{KXzNWxOXwQWyPYxRXzQZySY{QZySY{QZySY{QZySY{QZySY{SY{X\Y[Y[Y[X[X[W\W\V[W\U]U]T]T]U^U^S_R`Q^Q^P]P]O\N]P^N_N_NaN`OaOaPbRdPeRdPeRdPeRdPdVhThUfSgTeQeSdOdJdHfJfKiLiMlOkOmOlLlLlJlLlLnNpMqJpJrMuMuMuNvOwQyJsJsJsJsJsJsJsJsItItJsIrKrJqKqKpLoLmLkLjMiPjUjVkQeVh[k`k`hchhimjngoeqcrar^q]r[rZsXoSygKq`Eh[@aT9XM3NH/EH/DF/AE/J2>J4>J4>J8>L8>L;>M;>M=?N=?N@?O@?O?AN?AN?AN@BOCBPCBPDBPECQDBPDBPEAPEAPG@PG@PG@PEAPFBQECQECQECQECQECQECQECQECQECQECQFDRGESGESGESGFTIHXFHWCETACRACRBDSCETEGVEGVEGVFHWGIXHJYIKZJL[KM\GJ[EK[EJ]EJ]DK]DK]DK^CK^CK`CK`AL`BMaCNdBNdBNdDOcGOdHObHObHObHObHObHObHObIPcIPcHObGNaGNaHObIPcKPdMPcMPcNOcMPcNOcMPcNOcMPcMNbLObMNbKNaLMaKNaLMaJLaIOeIQfKSjMUlNUoLVoKUpKUpKTsJUsJUuIVvIVxJWyJWzJWzMWzMXxNVzNYyOW{OZzPX|OZzQY}P[{QY}P[{QY}P[{QY}QY}WZXYXYXYWZWZV[V[V[V[U\V]V_W`W`W`V_T`S_S_R^Q^P]O^O]P^P^N_O`O`PaOaPeOePdOePdOePdOeSgRgRfQfQdPeQdNdGdEeGeHgJiIjLjKkIiHiGhEiGhGkHlHnJpIqJrMuOwOwMuKsJsJsJsJsJsJsJsJsHrHsHsGrHrIqJpKpLoNmNlPiQiSiViYiWe]gbkfkghifmdqeqar^q[nWmQjO|gLygKtdFj_BaW:YQ4RM0LG-FD+AB)*5<(16%-3"(0%.!3 $1 ../ / - *)(&$"                                                                           ! ""! ! " $%&'(((('&&&$                           $ & ( *+++*-.//..-)' $ " !                                                      !!!   !&9G&9G&9G&9G&9G&9G&9G&9G(;I(;I(;I(;I(;I(;I(;I(;I*H0>I0>I1=I2>J4>J4>J8>L8>L;>M;>M=?N=?N@?O@?O>@M?AN?AN@BOBAOCBPDBPDBPDBPDBPEAPEAPG@PG@PG@PEAPEAPDBPDBPDBPDBPDBPDBPDBPDBPECQECQFDRFDRGESGESFESGFVDFUBDS@BQ@BQ@BQACRBDSEGVEGVFHWGIXHJYIKZJL[IL[DJZDJZDI\DI\CJ\CJ\BJ]BJ]BJ_AL`AL`BMaAMcBNdBNdCNbFNcGNaGNaGNaGNaGNaGNaGNaHObHObGNaFM`GNaHObIPcKPdMPcNOcNOcNOcNOcNOcNOcNOcNOcNOcMNbLMaKL`KL`JK_IL_IOeIQfKSjLTkKUnKUnJToIUoITrITrGTtHUuHUwIVxHVyHVyJWyJWyJWyKXzKXzLY{LY{LY{MZ|MZ|MZ|MZ|MZ|MZ|MZ|OY}TYUXUXUXTXTYRYRYQXQXQZR[R^S_T`UaT`T`S_R_R^Q^P]O^N\L]M^M^N_M_O`N`NdMeNdMdNdMdNdMdPeOfPeNeOdNdOdLeFeEeGfFhHiIjJjJlGhEiDhDhEiEkFlFmGoGoHpLtPxOwKsFoIrIrIrIrIrIrIrIrGrGrGrFrGqFpIoJoIlLkNjRjVjZj\k_iejhijjkfldl`l\m[kT~lRyiMueGm`Bf\@'<>%8<%5;'39(27&.5$,2#(/ %-!, / .,,--+(&&$#!                                                                              ! "##! ! # $&(**)((''&&%!                            ! " %%%')+,/0/..)' $ " !                                                           !  &9G&9G&9G&9G&9G&9G&9G&9G(;I(;I(;I(;I(;I(;I(;I(;I*J4>J5?K8>L8>L;>M;>M=?N=?N@?O@?O>@M>@M>@M?ANA@NBAOCAODBPDBPDBPEAPEAPG@PG@PG@PEAPEAPDBPDBPDBPDBPDBPDBPDBPDBPDBPDBPECQECQFDRFDRFESEDTBDSACR@BQ?AP?AP@BQ@BQDFUDFUEGVFHWGIXHJYIKZHKZDJZCJZCJ\CJ\CJ\CJ\BJ]BJ]@K_@K_@K_@M`@LbAMcAMcCNbDLaEL_EL_EL_EL_EL_EL_EL_GNaFM`FM`FM`FM`HObIPcKPdOPdQOdQOdQOdQOdQOdQOdQOdOMbOMbNLaNLaMK`LJ_KI^IJ^IOeIQfITjJUkJTmJTmHTnGSmHSqFTqFSsGTtFUvGVwGUxGUxHVyHVyHVyIWzIWzJX{JX{JX{JX{JX{JX{JX{JX{JX{JX{KW}NWOVOVOVNVNWLWLXITJVJWKXKZL[M\N]Q_Q_Q^O^P]N]N]K\J[I\I\J]J\I^K]J_JaHbJaHbJaHbJaHaLcJcLbJcLbJcMcJdFdDfEgFiGjIkJlImGkEjDiDiEjElGnHoGoFnGoJrNvMuIqDmGpGpGpGpGpGqGpGpGpGpGpFpFpEpHoIoGiKiPjVj[k_kakfkpkqgocm]jWhQ{fLqeJk_Ba^@\\;XV5PP/JK*EG&AB$J4>J5?K8>L8>L;>M;>M=?N=?N@?O@?O=?L>@M>@M>@MA@NBAOCAOCAODBPDBPEAPEAPG@PG@PG@PEAPD@OCAOCAOCAOCAOCAOCAOCAOCAODBPDBPDBPECQFDRFDREDRDCSBDSACR@BQ@BQ@BQ?AP?APCETDFUEGVFHWGIXHJYIKZHKZCIYBIYBI[BI[BI[BI[AI\AI\?J^@K_?L_?L_@LbAMcAMcBMaCK`DK^DK^DK^DK^DK^DK^DK^EL_EL_EL_EL_FM`HObIPcLQeOPdQOdROdQOdROdQOdROdQOdOLaMK`NK`MK`NK`LJ_MJ_JK_JQdJRgITjITjJTmISlGSmFRlESpESpERrFSsETuFUvFTwFTwFVxFVxFVzGWyGW{HXzHX|HXzHX|HXzHX|HXzHX|HXzHX|HX|IVJUJUJUIVIVHWHWETETDUDUDWEXFYFYK]K]K]J\I[I[IZGZFYDYEZD[E\E\F]F\D^C_D^C^D]C^D]C^F_E_G`F`HaGaH`FcDdBfCfDgFhFkGkFlFkFkEjDkDkFmGnHoFnFnGoIqJrIqGpDmFoFoFoFpFpFpFpFpFoFoFpEoEoFnGnHnGiLiQiXk]laldjjjtfs]kTdKs`Dj]>^Z9VX6OR/EP-AL*;G&7B!2>.9*6)4)7!-:$0;%19#/6"-5!,5!*4#+3"*0!(/ '-#-#-#-!-*('))&$                                                                                    "#$$$% &'(*++*)))(''&$!                               "%(*,,,,(' $ " !                                                 &9G&9G&9G&9G&9G&9G&9G&9G(;I(;I(;I(;I(;I(;I(;I(;I);I);I);I);I);I);I);I);I*J5?K5?K8>L8>L;>M;>M=?N=?N@?O@?O=?L=?L>@M>@MA@NA@NB@NCAODBPDBPEAPEAPG@PG@PG@PEAPD@OCAOCAOCAOCAOCAOCAOCAOCAOCAODBPDBPECQECQECQEDRDCSBDSBDSACRACR@BQ?AP?APCETCETDFUEGVFHWGIXHJYHKZCIYBIYBI[BI[AJ[AJ[AI\AI\?J^?J^?L_?L_@Lb@Lb>MbANaCK`DK^DK^DK^DK^DK^DK^DK^DK^DK^DK^DK^FM`HObJQdLQeRPeSPcTOcSPcTOcSPcTOcSPcMH\MJ]NI]MJ]NI]NK^OJ^MK`KPdJRgITjITjISlHRkFRlEQkDRoDRoDQqERrDStETuESvFTwEUyCUyCU{DVzDV|EW{EW}FX|FX~FX|FX~FX|FX~FX|FX~FX~GVGUEVEVEVEVDWDW@U@UAVAV@W@W@WAWGZG[FYFYEXCYBXAX@WAXAX@YAYBZBZ@[?[=[?Z=[?Z=[?Z=ZB\@]C]A^D^C`E_Ca>`>b?b?e@eBgCgCiEjCjCjCjCjBlDnEnGmHmJoInHnGmGmHnHnHnHoHoHoHoHoHoHoGnEoDnFnEmFmIlLlPmVl\l_lajbgidnXjNw_AgW5XR/MN*DM'>K$6G!.E*B(>$9 74/+- 0%0%.#+"-$0%0%/$-$+"+"+",#-"-*''))&#                                                                                    "#$$&))*++,,,,++***&%                               " %&****(' $ " !                                                 &9G$:G&9G$:G&9G$:G&9G$:G(;I&J3?K5?K7?L8>L9?M;>M=?N=?N>@O>@M?>L=?L?>L@?M@?MA@NB@NCAODBPDBPEAPEAPEAPEAPG@PEAPCAOCAOCAOCAOCAOCAOCAOCAOCAOCAOCAODBPDBPECQECQFCTDCSBDSBCUBDSABTACR@AS?APCDVBETDEWDGVEHYFIXGJ[GJ[BIYBI[BI[BI[AJ[AJ[AI\AI\?J^?J^?J^?L_@K_@M`@LbANaBJ]BJ]CJ]BJ]CJ]BJ]CJ]BJ]DK^CK^DK^DK^FM`HObJPfLQeSPeTOcTOcTOcTOcTOcTOcTOcLG[LG[MH\NJ[OK\QJ\RK]OL_KPdJRiITjITjISlGSmEQkCQlCQnCRqCRqBRsCStBUvDTvBTxBTxBV{CU{BV{DV|DX}EW}DX}EW}DX}EW}DX}EWDX}EWDWDUCVCVCVCVCVAVAVAXAXAXAX@W?X@W@WCYBXBX@WAW?V?V?V>V>V>V?W=X>Y>Y?Z:X9X:X9X:W9X:W9X>[=[?\?]A^@^B^A_;]8^9_;`=b=c>d>eBiBiAh?h?iAkBlClEnGoJpFnEkBkFlHqGmEnGnEnGnEoGnGnGnGnGnFmEmFlGlIjRnYm^mbkfifffaj^hNucAbU4SJ(CE":B3B.@(>$<";!8642/&$%%#$)-"-",!*!***,!- - *(())&$                                                                                 ! "$%&***++++,***))((&%!                                         "$''''('&" !                                                !! "8F!8F"8F!8F"8F!8F"8F!8F$:H#:H$:H#:H$:H#:H$:H$:H)J;=J?>L?>N@=NA>OA>OB?PB?PB?PDARDARDARDARDARDAREARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARCBTCBTABVABTABVABT@CV@CTBEX@FVBEX@FV@EX@FV@EX?FXCJ\BJ]BJ]BJ]BJ]BJ]BJ]BJ]BJ]BJ]BJ]@K]BJ]@K]@K_@K]@K]@L\BK\@L\BJ]@K]BJ]@K]AI^@K_CK`DLaEMbGOdHPgJOeSPeVNeVQgVQgUPfSNdQLbOJ`PK_OJ^PI[OHXPIYSJ[UM\SO`OTjJQkEOhCMfAMgCOiCQlDSpBSo@Sq@Ss?St=TtT}=T}?V@WAXAZBY@Y?W>V>V?WAYBZBZAY?W\=\;^:`;a;bfh?h?j@kAl?j@kBkBmDmDoFoEpFoEoEnDoEnDnDmDmDiHlIoFmDkDjKkSn\m`gfdldpcn]fRaKrX;WP0EC#8:/9,8+3&.2#2#2#2 2"33!0$  "#%()- - - . . . / .".%,$+%("& #"!                                                                           "$& & % $ ...-,,**()*+('%$%$$""                                      ##!!$($ % $ !                                                            !!!" !#$$$#!  !!##$##! !8F!8F!8F!8F!8F!8F!8F!8F#:H#:H#:H#:H#:H#:H#:H#:H(;I(;I':H&9G&9G':H(;I(;I':H':H':H':H':H':H':H':H*I;=I?>N@=N@=NA>OA>OB?PB?PB?PC@QC@QC@QC@QC@QC@QC@QC@QDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARCAVCAVABVABVABVABV@CV@CV@EX@EX@EX@EX?FX?FX?FX?FXAI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\@L\@L\@L\@L\@K]@K]@K]@K]?J^@K_AL`BMaEMdFNeGOfJOeQMdUMdTOeTOeSNdRMaRJ_OJ^QI^QJ\PIYPIYRJYSKZVN[TP_NSiJQkEOhCMfAMgAOjBQnBSoBSq?Ts?St=TtT}>T}>T}>T}>T}>T}>T}>T}?U~?U~?U~?U~?U~>T}>T}=T}>W?X@XAYAY@X?W>V=U>V@XAYAX@W>U;U8W8X8X8X9Y9Y:Z:Z:Z;[;Z;Z<[<[=\;]:]9_:a;bh>i?j@k@k>j?k@kAlBmCnDoDoDnDnDnDnDnDnDnEnGlJnJpIoFlFjMkTkblcddZgVhRdMy\CkW<]N1EE)7;-5(3(1'.$* +!+!,!,!.!/!2"/ &""!$%(),,---..-!+$)$(#% #!                                                                                      # $'' ' & ---,,*)(()()('%$%%$#"!                                           !&$ % $ "                                                                $%&&&%"!   !!!!"#$$#""!8F!8F!8F!8F!8F!8F!8F!8F"9G"9G"9G"9G"9G"9G"9G"9G(;I':H&9G%8F%8F&9G':H(;I':H':H':H':H':H':H':H':H);I*I;=I?>N@=N@=NA>OA>OB?PB?PB?PB?PB?PB?PB?PB?PB?PB?PB?PDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARCAVCAVABVABVABVABV@CV@CV@EX@EX@EX@EX?FX?FX?FX?FXAI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\AI\?K[?K[?J\?J\?J\?J\?J\?J\AI^AI^BJ_CK`DLaEMbFNcHMcNLbPKaSK`SK`SK`RK]QH[OHXQHYQHYQIXQIXRLZTN\VP^TQbLRhGQjEOjCMhBMi@NiAPmARnARp>Sr>RsV?W@X@X?W>V=U=U=U>U?V?V>U=T;T8W7W7W8X9Y9Y9Y:Z:Z:Z:Y;Z<[<[<[;]:]9_;aj?j?j=i=i>i?j@kAlBmCnDnDnDnDnDnDnDnEnJoKqLqKqHnJlOjVick_^WOTEpS>eO:[I2OC+C>#4:,3%0#0%.$+!&&&(*,- /!.) '&%%%''((***++*(!&!$"                                                                                   # %''' ' ,,+++))(()()('&&&&%$#"!!!                                    $$ % # " !                                                           %'(('&$#    !!"!"#$## 7E 7E 7E 7E 7E 7E 7E 7E"9G"9G"9G"9G"9G"9G"9G"9G(;I':H&9G%8F%8F&9G':H(;I&9G&9G&9G&9G&9G&9G&9G&9G);I);I);I*I;=I?>N@=N@=NA>OA>OB?PB?PB?PA>OA>OA>OA>OA>OA>OA>OA>ODARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARCAVCAVABVABVABVABV@CV@CV@EX@EX@EX@EX?FX?FX?FX?FX@H[@H[@H[@H[@H[@H[@H[@H[@H[@H[@H[@H[@H[@H[@H[@H[?K[?K[?J\?J\?J\?J\?J\?J\AI^AI^BJ_BJ_CK`DLaEKaFK_MJ_NI_PH]QH[QH[RGXRGWRGWRGUSHVQIXSKZSM[SO^TP_QRdKQgGQjEOjBNh@Ni?Oi@Ol@Qo>Qq=Rq;Rr;Rr:Rt:Rt9Sv9Sv:Rt:Rt:Rt:Rt:Rv:Rv:Rv:RvU~>UV?W?W>V=Ui>ii?j@kAlAlCmCmCmDnDnEoEoFoIpJqKrLrLpNoTm[k`gXVLBgC4SA/I?,B:';6!24*3&0#-"-#*!&!!"%(+ ,!0#.#.#* )&%%&&&&&&&&&&%% #"                                                                                     "$''( ' *)*(()(())((((((''&%$#""#"!                            !$ $ # "                                                        '()))'%$ !  !""" !###"" 7E 7E 7E 7E 7E 7E 7E 7E!8F!8F!8F!8F!8F!8F!8F!8F':H&9G%8F$7E$7E%8F&9G':H&9G&9G&9G&9G&9G&9G&9G&9G(:H);I);I);I+;H,I;=I?>N?>N?>N@?O@?OA@PA@PA@P@?O@?O@?O@?O@?O@?O@?O@?ODARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARCAVCAVABVABVABVABV@CV@CV@EX@EX@EX@EX?FX?FX?FX?FX>FY>FY>FY>FY>FY>FY>FY>FY>FY>FY>FY>FY>FY>FY>FY>FY>I[=J[=J[=J[>I[>I[@H[@H[@H[AI\BI\BI\CJ]CJ]DI]FH]KH]NF]NEZNEXQFVRFTSERTFSTHTUIUUJXSM[RN]RO`RQcOReIQhEQkDPjAOi@Ni?Oi?Nk?Pn=PpU>U;S:U;Vg>gh?h@iAjBkClClDmEnEnFoGoGpEoHoIpLrPqTpYn_lZ^PLo@6O7(;7'48(34$.1 *2(0&.$,#)"%! !"$&*!-#0%/%/$,#+ '&%%%########## !                                                                                    "$%& & '%&''''(((&''(()(('&%$##$#"!                            " "                                                               '))*)(%$!! !"""#" !!!6D6D6D6D6D6D6D6D!8F!8F!8F!8F!8F!8F!8F!8F':H&9G%8F$7E$7E%8F&9G':H%8F%8F%8F%8F%8F%8F%8F%8F(:H(:H(:H);I*:G+;H.:H/;I3=I3=I6I:>I?>N?>N?>N@?O@?OA@PA@PA@PA@PA@PA@PA@PA@PA@PA@PA@PDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARCAVCAVABVABVABVABV@CV@CV@EX@EX@EX@EX?FX?FX?FX?FX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX;FX>I[=J[=J[=J[>I[>I[@H[@H[@H[AH[AH[BGZBG[CH[CH\FG[KF\MEZMDWODUPDRRDQVFQVFPYISVJTWMXUO]RO`QPbMPcJPfEOhBPjAOi@Pi?Oi>Ok>Om;Nl;Po;Op9Pr9Pr8Pt8Pt7Qt7Qt8Pt8Pr8Pt8Pt8Pt8Pt8Pv8Pv9Py9Py9Py9Py9Pz9Pz9Pz9Pz9Pz9Pz9Pz9Pz9Pz9Pz9Pz9Pz9Pz:Q{:Q{;R|U=V8S~9T:U;V;V:U9T8S8R8R7Q6P6P7Q8R7R6U6V6V6V7W8X8X8X8X9Y9X9X:Y;Z;Z9[9\8^9_:`;a;`9`8_;a:b;c:d;eh?i@iAjBkBkBkClDmDmFoFoGoHqFpFpIpLrRrVqZl`gRRxF@Z9,>2",4%*7(+5&+0!&1&/&-$)"& ! !%(!,#-$.%.#-"*('%%%!!!"!                                                                       # # % # # #$$%&''''$%&'()))('&%$$$##"!                                                                                                  !'()))(%$!"!""##"!!"! 6D6D6D6D6D6D6D6D 7E 7E 7E 7E 7E 7E 7E 7E&9G%8F$7E$7E$7E$7E%8F&9G%8F%8F%8F%8F%8F%8F%8F%8F'9G(:H(:H);I*:G+;H.:H.:H3=I3=I6I:>I?>N?>N?>N@?O@?OA@PA@PA@PBAQBAQBAQBAQBAQBAQBAQBAQDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARCAVCAVABVABVABVABV@CV@CV@EX@EX@EX@EX?FX?FX?FX?FX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX=EX;FX=HZOk=Nl;Nl:On:No8Oq8Oq7Os7Os7Ou7Os6Ps6Ps6Ps6Ps6Pu6Pu6Ow6Ow6Ow6Ow6Ox6Ox6Nz6Nz6Nz6Nz8P|8P|8P|8P|8P|8P|8P|8P|7O{8P|8P|:R~;SV7R8S9T:U:U9T8S7R8R7Q5O4N4N5O7P7R6U5U6V6V7W7W7W8X8X8X9X9X:Y:Y:Y9[8\9];^<_:`:`9^8_:`9a:b;cI:>I=?N?>N?>N@?O@?OA@PA@PA@PCBRCBRCBRCBRCBRCBRCBRCBRDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARDARCAVCAVABVABVABVABV@CV@CV@EX@EX@EX@EX?FX?FX?FX?FX1E1!+.!4$%7))1%)+%'!' % "#$%**)&&$$$                                                                 ! #%&&""!!"%()+*)('&%%##"!                                                                                           !$&'(((&$#""""##$#   6D6D6D6D6D6D6D6D 7E 7E!8F!8F"9G"9G#:H#:H&9G&9G&9G&9G&9G&9G&9G&9G&9G%8F%8F$7E%8F&9G(;I)I:>I:M<>M<>M>@O>@O?AP?AP@BQ@BQACRCBRC@QC@QC@QDARDAREBSEBSEBSFCTFCTFCTFCTFCTFCTFCTFCTB@UB@UABVABVABVABVADWADW=BU=BU>CV>CV=DV=DV=DV>EWDT@CTBDSCETFESFEUGESHAQIAPLAONBNQDMUFMXGMYHN]PWZPYSP[NP_INbCNd>Lf=Mge?g?f@gBiCjCjDkCjCjDkElFlGmHnFoIsJtKrNpVpZmS\JIu;2Q:+>6%/3 $2#/$*&)&%&# !"$$$$$$$""!                                                                        "#%#!  #&('()))('&$$$$#!                                                                                   #%*+**)(''$%&''&$"!!""##$$6D6D6D6D6D6D6D6D 7E 7E 7E!8F!8F"9G"9G#:H&9G&9G&9G&9G&9G&9G&9G&9G&9G%8F%8F$7E%8F&9G(;I)I:M<>M<>M>@O>@O>@O?AP?AP@BQ@BQACRBAQC@QC@QDARDAREBSEBSEBSFCTFCTFCTFCTFCTFCTFCTFCTCAVCAVABVABVABVABV@CV@CV>CV>CV>CV>CV=DVDT@CRBDSDCQDCQFDQFDRGCQH@OK@NMAMOCMRENVGNXIPWJQ[PXVPZQP^JP`FNc?Mgf?g?f@gBiCjCjDkCjCjDkElFlGmHnHoIsJtLrMoUpYkRYHEp=2P;->8$/4&1#-&'&%$% &$ !"#$!!#!!                                                                               !$" "%''(())('&$$$$#!                                    !                                             "$)**)))''$%%&&%$##!#"$#%$6D6D6D6D6D6D6D6D6D 7E 7E!8F!8F"9G"9G"9G%8F%8F%8F%8F%8F%8F%8F%8F&9G%8F%8F$7E%8F&9G(;I)M;>M;>MAP>AP?BQ?BQ@BQBAQC@QC@QDARDAREBSEBSEBSFCTFCTFCTFCTFCTFCTFCTFCTCAVCAVABVABVABVABV@CV@CV?DW?DW?DW>CVM;>M;>MAP>AP>AP@BQBAQC@QC@QDARDAREBSEBSEBSFCTFCTFCTFCTFCTFCTFCTFCTDBWDBWBCWABVABV@AU?BU?BU@EX@EX?DW=BU;BT:AS9@R8?Q;CV;CV;CV;CV;CV;CV;CV;CVEW@FVBETCERDDPECNEBMDALF@LF>IJ>JL@JOCMRFPTHRVJVTLWTNZPN\KN_GNaBNd>Nh9Mh6Ml4Mk5Mi5Mg5Mg5Mg5Mi5Lk5Ll5Ll6Mo6Lq6Ls6Ls6Lu6Lu6Lu5Lu1Jr/Kr/Kr/Kr/Kr/Kr/Ks/Ks/Ju0Kv0Kx1Ly1Ly2Mz2Mz2Mz2Mz2Mz2Mz2Mz2Mz2Mz2Mz2Mz2Mz3N{3N{4O|4O|5P}5P}4Q}1P~1P~1P1P1P1P1O1O2P2P2P2P2P2P2P1P4S3S4T4T5U5U6V6V8X8X8W9X9X:Y:Y:Y;[;[9[:\:\;]:]:];^9^:_;`;a`9/G:);8".4'2'/&(&%#'!' &#  !!                                                                                                  "#%%%'((('&%%%%$"                                       !#$#                                        #&''())))#$#####"$$%%&&''6D6D6D6D6D6D6D6D5C6D6D6D 7E!8F!8F!8F$7E$7E$7E$7E$7E$7E$7E$7E&9G%8F%8F$7E%8F&9G(;I)M;>M;>M;>MAP>AP?APBAQC@QC@QDARDAREBSEBSEBSFCTFCTFCTFCTFCTFCTFCTFCTECXECXBCWABVABV@AU>AT>AT@EX?DW>CV=BU;BT9@R8?Q8?Q:BU:BU:BU:BU:BU:BU:BU:BU;CV;CV;CV;CV;CV;CV;CV9DV5DW5FZ6EX6EX:EW;GW>EW?EUBETBDQECPEBMDALF@JF>IF?GL@JNAKQEOTHRUKVTLYQM[ON^IL_EMbAMe=Mg9Mh5Lk4Ml2Mk3Mh3Mf3Mh3Mh3Lj3Lj3Lk3Lk6Mo6Lq6Ls6Ls6Lu6Lu6Kv5Lv/Kr.Lr.Lr.Lr.Ks.Ks.Ku.Ku.Ku.Ku.Kw/Lx/Kz0L{0L{1M|1M|1M|1M|1M|1M|1M|1M|1M|1M|1M|1M|2N}2N}3O~3O~4P1P1P1P1P1O1O1O1O2P2P2P2P2P2P2O1P4S3S4T4T5U5U6V6V8X8X8W9X9X:Y:Y:Y;[;[;[<\:\;];]:];^;^:_;`M;>M;>M;>M;>M;>MAT=@S>CV>CV=BUGOBKQDMSGQUKVTLYQM[NM]JM`DJ`?KcL8>L9?M9?M9?M8>L9?M9?M:@N:@N;AO;AO=@OBAQC@QC@QDARDAREBSEBSEBSFCTFCTFCTFCTFCTFCTFCTFCTFDYFDYCDXBCW@AU?@T=@S=@SDR>APAAMB@MDALF@JG@HJ@IJ@IQDMSFOUISWMXTN\PN\KL^EL_?J`b>b@eAfAfBgDhEiEiFjEiEiFjGkHlImJmJmJjNmPmRnXoUhITp;>Q91><-4=(->%)?$)<#'7"2!, *!) &# !                                                                                                               ##$#!"$&'(''&&''%$"!#"                                   " ! !    $''&%#!                                        !#&(*+,'&$##$%'--/.0/ 1 / 6D7D6D7D6D7D6D7D4B5B5C6C6D7D 7E 7E!7D!7D!7D!7D!7D!7D!7D!7D&9G%8F%8F$7E%8F&9G(;I)L8>N9?M9?O9?M8>N8>L9?O9?M:@P:@N;AQ=@O@BQBAQBAQCBRCBRDCSDCSDCSEDTEDTEDTEDTEDTEDTEDTEDTGEZDEYCDXBCW@AU>AT=@S:?R:?R;@S;@S:AS:AS:AS;BT:CT9BS9BS9BS9BS9BS9BS9BS9BS6?P6?P6?P6?P6?P6?P6?P4?Q6CV4CV7DW7DU;CVDT@CR>@M@@LB?JE?IG@HHAHJ@HLAISFOTIQVLUVN[SO^MN`GL`CKb;Ic9Jf6Kh3Ji1Lj/Ll/Ll/Lj0Kh0Kh1Jh0Kh0Kh0Ki1Ik1Ik4Lp4Lr4Kt4Kt4Ku4Ku5Ju4Ku0Lt/Lt/Lv/Lv/Lv/Lv/Lv/Lx-Jv-Jv-Jv.Kw.Jy/Kz/Kz0L{1M|1M|1M|1M|1M|1M|1M|1M|0L{0L{0L{1M|1M|2N}2N}1P3R2R2R2R2R2R2R2R1P1P1P1P1P1P1P1P3S3S4T4T5U5U6V6V8X8X8W9X9X:Y:Y:Y9[9[9[:\:\;]:]:];^9^:_;`c>b?e@f@fAgCiEiEiFjEiEiFjGkHlImJmJmJjMlPnRnXoViJUs<>S=5D@0:@+0A(,?&*<#'5"1 - +* ($"                                                                                                               !!!#! "$&'(('&'''&$"!""!                                   !      %((&&$ # ! !                                         !#%(+,-*'%$$%'(..0!/ 1"0 !2#0 !5B6B5B6B5B6B5B6B6C7C6C7C6C7C6C6C8C8C8C8C7C7C7C7C!7D!7D"8E"8E%8F%8F&9G'9G)9H*:I,9I-:J-:J/;K/;K/;K1:K2;J3:J4;K4;K6P7>N8?Q8?O9@R9@P:AS;AQ=@O>@O?AP?AP@BQ@BQACRACRACRACRACRACRACRACRACRACRABV@CV@CV@CV@CV>CV>CV>CVN7>N9@P9@P8?O7>N7>N8?O9@P8AR3>P3>R6>S7?R:?R;AQ>AP?ANDBMEBKFCJHCIJDHLCHNCGNCIZPXXP[UO[OM[JK]EJ^AHb;Id8Ie5Jg2Ih0Kh/Jg-Kg,Jf,Jf0Ih0Ih1Hh0Ih0Ih0Hj/Ij/Il1Kp1Kp1Jr1Jr/Kr/Kr/Kr/Ks+Hr,Iu-Jv.Kw.Kw-Jv,Iu+Gv/Kz/Kz/Kz/Kz/Kz/Kz/Kz/Kz/N}/N}/N}0O~0O~1P1P2Q/N}/N}0O~0O~1P1P2Q2Q2P2P2P2P2P2P2P2P/M0N1O2P3Q4R4R4S6V6V7W7W8X8X9Y9Y7W8X8X9Y9Y:Z:Z8Z5Y3Y3Y4Z4Z5[5[6\7\7^8_9`:a;b;be>e?f?f@gAgBgBgEjEjGkGkJkJkKlImFjHmMnRpTmRbLS}JIiG;SG5EF.;C)2@'-9"(2%- / .- )'#"                                                                                                                   """#$%&&$#"!                                      " " &&*)*(*' ' " "                               !""!    "%')*+*******-!-!/$/ #1 &1"%3"(2#&6B6B6B6B6B6B6B6B7C7C7C7C7C7C7C7C8C8C8C8C8C8C7C7C 8D 8D"8E"8E%8F%8F&9G'9G)9H,9I,9I,9I.:J.:J/;K/;K1:K2;L3:L3:L4;M4;M6;N6;N5P7>P7>P8?Q8?Q9@R9@R:AQ=@Q=@O=@O>AP>AP?BQ?BQ@CR@CR@CR@CR@CR@CR@CR@CR@CR@CT@CV@CV@CV>CV>CV>CV>CV;BT;BT:CT9BS9BS8AR6BR8AP:BO9AN9AN8@M8@M7?L7?L7?L9AN8@M7?L6>K6>K7?L8@M9@P6=P5=P7>Q9>QeP7>P8?Q8?Q9@R9@R9@PAP>AP?BQ?BQ?BQ?BQ?BQ?BQ?BQ?BQ?BQ?BQ?BQ@AS@AS?BS?BS?BS?BS=CS=CS;BR;BR;BR:AQ9BQ8AP8AP8AP9AN:@L:@L9?K9?K8>J8>J7=I8>J7=I6Qf>e?f?fAgAgBhBhEiFjHiIjIjJkKkJlJoInMnPnUkTdSZUQvREaQ>RM5EH.9@)1:%,3(/$,.+*'&$"                                                                                                                     !!!"""""!                                        # %'())))(& $ "!                           #$%$!   "%'(),++*)(('++!,"-#.$/ %0!&1"'6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B8C8C8C8C8C8C7C7C 8D 8D"8E"8E%8F%8F&9G'9G(8G+8H+8H,9I,9I-:J.:J.:J09J1:K29K3:L3:L4;M4;M4;M4;M4;M4;M4;M4;M4;M4;M4;M6=O6=O6=O7>P8?Q8?Q8?Q9@P:@PAP>AP>AP?BQ?BQ?BQ?BQ?BQ?BQ?BQ?BQ?BQ@AS@AS?BS?BS?BS?BS?BS=CSJ7=I7=I7=I7=I6AP?ANGIVGIUIISJJTKJRLKSMJSLKSNNXLNZJL[FL\BJ]=I_9Ib7Hd4If1Hg1Hh0Ih/Hf.Ge.Ge.Gf/Fh/Fh.Fh.Fh.Fj.Fj-Gj-Gj.Jo.Jo.Jq.Jq-Kq-Kq-Jr-Jt.Kw/Kz0L{1M|1M|0L{/Kz.Jy.Jy.Jy.Jy.Jy.Jy.Jy.Jy.Jy+Jy+Jy,Kz,Kz-L{-L{.M|.M|/N}/N}0O~0O~1P1P2Q2Q/M/M/M/M/M/M/M/M0N1O2P3Q4R5S6T5T6T5U5U6V7W7W7W8X5U5U5U6V6V7W7W6X6Z4Z4Z5[5[6\6\7]8^9_:_;`c>c?e>f?f?gAgAgBhBhEiEiGhHjIjIkJjKkMoKnNmPlUkVfY]ZV{VIeTAUN6FG-8>'18#*2'.#+-*)('%#                                                                                                                          !!                                       " $&()))))(& $ " !                               !#%&$"  ! !#$&'(++*)('&&** +!,"-#.$/ %/ %6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B8C8C8C8C8C8C7C7C 8D 8D"8E"8E%8F%8F&9G'9G(8G(8G(8G)9H+8H,9I-9I.:J.:J.:J09J1:K29K3:L3:L4;M4;M4;M4;M4;M4;M4;M4;M4;M5P8?Q8?Q8?O9?O:@N:@N:@N;AOAP?AP?AP?AP?AP?AP>AP>APJ9=I9=I9=I8N9?O:@P;AOAPCFUCGSEGTEGTFHUFHUGIVGIVIMYFLZEK[BK\>I]:I`7Ia4Hc3He1Hg1Hh0Gg/Ff/Ff/Ff.Ee.Eg-Eg-Ei-Ei,Fi,Fi,Fk,Fk-Ip-Ip,Jp,Jp,Iq,Iq*Jq*Js.Kw/Kz0L{1M|1M|0L{/Kz.Jy.Jy.Jy.Jy.Jy.Jy.Jy.Jy.Jy+Jy+Jy+Jy,Kz,Kz-L{-L{-L{/N}/N}0O~0O~1P1P2Q2Q/M/M/M/M/M/M/M/M1O1O2P3Q4R5S6T6U5S5U5U5U6V7W7W7W5U5U5U6V6V7W7W6X6Z5[5[6\6\7]7]7]9_9_:_;`c?d?e?e@f@fBfBgCgChFhGiHhHhIiJjLiLjLmMlNkQjVjXh\`^YYLjTBXL5EB+5;$.5 '0%-"+-*)('%#                                                                            ! !                                                                                    ! # %'()***)' & $ $ !                                 !#%&$"  " !#$&''))((''&&(()*+, -!-!6B6B6B6B6B6B6B6B5A5A5A5A5A5A5A5A8C8C8C8C8C8C7C7C 8D 8D"8E"8E%8F%8F&9G&9G&8F(8G(8G(8G+8H,9I-9I-9I-9I.:J09J09J29K3:L3:L3:L3:L3:L3:L3:L3:L3:L3:L3:L5P7>P8?O9?O9?M9?M:@N:@N;AO;AOAP>APJ:>J9=I9=I8N8?O:@N:BOc?d?d@e?f@fAfBgBgChEgFhGhGgHiHhKiKiLjLiLjMiRjWk[h]a^\YNlUCYK4FA)6:#-4&0%.#,.+*'&$"                                                                              ! ""!                                    !!      !""! !                                        " $%&)**+*)' & ' % " !                                 #$%$!  #!"#$%&&&&&&''''&'()*+, , 6B6B6B6B6B6B6B6B5A5A5A5A5A5A5A5A8C8C8C8C8C8C7C7C 8D 8D"8E"8E%8F%8F&9G&9G&8F&8F(8G(8G)9H)9H+8H,9I-9I-9I.:J.:J1:K1:K1:K2;L2;L2;L2;L2;L2;L2;L2;L2;L3O5>O6?P6?P7>N8>N9?M9?M:@N:@N;AO;AO;AO;AO;AO;AO;AO;AO;AO;AO;AO>@M>@M>@M>@M=AM=AM=AM=AMJ8>J8>J7=I7=I6K7?L7AM9@P9BQ;BR:CT>GX>GX?GZ?GZ>I[>I[?J^?J^?J\=J[;J]9J^7I_4H`2H`0Hb0Hd/Hf0Gg/Ff1Eh1Cg1Cg/Cf+Cg*Dg*Dg*Dg*Di*Di(Dk(Dk,Ho+Io+Hp)Ip)Ir)Ir)Ir)Ir*Iu+Jx,Ky-Lz-Lz,Ky+Jx*Iw+Jx+Jx+Jx+Jx+Jx+Jx+Jx+Jx+Jy,Kz,Kz-L{-L{.M|.M|.M|/N}/N}0O~0O~1P1P2Q2Q1O1O1O1O1O1O1O1O2P2P3Q4R5S6T7U6U4R4T4T5U5U6V6V6V7W7W7W8X8X9Y9Y7Y7[8\8\8\9]9]:^:^<_<_=`>a?b@cAd?d@e@eAfCfDfDgEgFgFgIgIgJhJhLiLhLiJeLeNgTiYl\i^b^\\QqXF^M6JB*8;$.7"+3(3'./,*'%#                                                                                                                          !""!!      "$#!!"                                          ! "#()***)'(*' % $ % #                     "#$#  #""#$%%&##$%&'((%&&')**+6B6B6B6B6B6B6B6B5A5A5A5A5A5A5A5A8C8C8C8C8C8C7C7C 8D 8D"8E"8E%8F%8F&9G&9G&8F&8F'7F(8G(8G)9H+8H,9I-9I-9I-9I.:J09J1:K1:K2;L2;L2;L2;L2;L2;L2;L2;L2;L3O5>O6?P6?N7>N8>L9?M9?M:@N:@N;AO;AO;AO;AO;AO;AO;AO;AO;AO;AO=AM>@M>@M=AM=AM=AM=AM;AMJ7=I7=I6J7=I6K5?K6@L5AM6BP7CS8DT8CU>I[=J]=J]>J`>J`=La=Lc=Lc;J_:K_9I`7I_4H`3Ia0Hb/Ib/Hf/Hf/Ff/Ff0Dg1Cg2Bf0Bf+Cg*Dg*Dg*Dg*Di(Di(Dk'Ek+Io+Io)Ip)Ip)Ir)Ir)Ir)Ht)Hv*Iw+Jx,Ky,Ky+Jx*Iw)Hv+Jx+Jx+Jx+Jx+Jx+Jx+Jx+Jx,Kz,Kz-L{-L{.M|.M|/N}/N}/N}/N}0O~0O~1P1P2Q2Q2P2P2P2P2P2P2P2P2P3Q3Q4R5S6T7U7V4R3S4T4T5U5U6V6V7W8X8X9Y9Y:Z:Z:Z8Z8\8\9]9]:^:^:^<_=`=`>a?b@cAdBeBeBeCfCfDgEfFgFgHfHgIgJgKhKhLiMhIbKcNfUkYl\i^b][^SuXHbN9LD,:=%29$-8#,7"+/ 0-*'$"                                                                                                                  !!"!##"!       #%#""#                                             ! "))*+*)((** ' ' & % !                    !"#"  $""#$%%%!"#$&())%%&'()**4@4@4@4@4@4@4@4@3?3?4@4@5A5A6B6B6A6A7B7B8C8C 8D 8D 8D 8D!7D!7D#6D#6D#6D#6D%7E%7E%7E%7E%7E%7E&6E&6E(5E)6F,8H.:J/;K.:J-9I,8H1=M.:J+7G+7G.:J0N2>N1=M2>N3?O5AQ8AP5K6>K7?L8@M9AN9AN7?L7?L8@M8@M9AN9AN:BO;AO9?'49$-6!*3'/ 0,*''&$                                                                                                                          """          !""#                                            "$&())()) + * ) & $ !                             !!#%&()('&%%&'(&&&'(*,-4@4@4@4@4@4@4@4@3?3?3?4@4@5A5A6B6A6A6A7B7B8C7C 8D 8D 8D!7D!7D#6D#6D#6D#6D%7E%7E%7E%7E%7E%7E&6E&6E(5E)6F,8H.:J.:J.:J-9I,8H1=M.:J+7G+7G.:J/;K/;K-9I1=M1=M0K6>K7?L8@M8@M9AN7?L7?L7?L8@M8@M9AN9AN:BO8>L8>L9?O8@M9@P:BO:AQ:DP9BQ6BN5AO4@L4@N4BM5CP7CQ5>M5>M5>M5>M5>M5>M5>M5>M6?N6?N6?N6?N6?N6?N6?N4@N7ER4DS2DR2DR2CS4EU5FX7H\6G[6H^7G`6H`7Hb8Ic8Ic8Ie4Hc4Hc3Hc0Hb/Ib-Ia-Ia-Hc-He-He-Fe-Fe-Ch/Ch.Bg.Ai+Ci*Di(Di(Di(Dk'Ek'Ek'Ek'Gn'Gn(Hq'Hq(Ir(Ir)Ju)Ju*Kx)Jw(Iv'Hu'Hu(Iv)Jw*Kx(Iv)Jw)Jw*Kx*Kx+Ly+Ly+Ly-L{-L{-L{-L{-L{-L{,Kz,Kz.M|.M|/N}/N}0O~0O~0O~1P/M/M0N0N0N1O1O1O3Q3Q3Q4R4R5S5S5T6T5U6V6V7W7W8X8X8X8X9Y9Y:Z:Z;[;[;^;^;^;^;];];];]=_=_<^<^<]>_?`@b@b@bAcAcDcDcEdFdEbFdGbHdJeMfMfOgRfReReTgYh[f]`^[\PtWGbP:OG0@A)6=&08#,5 ),-)'$$#!                                                                                                                     """"!         !"""                                       !#%'))()) , * ) & $ # !                        $"#$%%&&'&%%%%&'%&&'(*+,4@4@4@4@4@4@4@4@2>3?3?4@4@5A5A5A5@6A6A7B7B8C7C7C7C7C 6C 6C"5C"5C"5C"5C$7E$7E$7E$7E%7E%7E%7E%7E&6E'7F*7G,9I,9I,9I,8H,8H/N3?M4=L4>J5?K5?K6@L6@L6@L6@L5?K6@L6@L7AM7AM8BN8BN8BN8?O8?O8?Q8AP8AR9BQ9BS7CQ8DT6DQ5BR4BO4AQ3CP4DS5ET3@P4@P4@P4@P4@P4@P4@P4@P5AQ5AQ5AQ5AQ5AQ5AQ5AQ4AQ1DR/ES.DR.DR.CT0EX1FY2G\2G\2F^4F^3G`3Gb4Hc4Hc5Hf4Gg4Gg3He0Hd/Id-Hc-Hc+Ic*Hd*Hd+Fd,Ed+Cg,Bg+Ah+Aj*Ck(Dk(Dk(Dk'Ek'Ek'Dl%El&Fo&Fo&Gr&Gr'Hs&Is'Jt'Jt)Kx(Jw'Iv&Hu&Hu'Iv(Jw)Kx(Jw(Jw(Jw)Kx)Kx*Ly*Ly,Mz,Kz,Kz,Kz,Kz,Kz,Kz,Kz,Kz.M|.M|/N}/N}0O~0O~1P1P1O0N0N0N0N/M/M/M3Q4R4R5S5S6T6T5T7U6V7W7W8X8X8X9Y9Y9Y:Z:Z;[;[;[<\;^;^;^;^;^;^;];]>`=_<^<^=_>`?a@bBaBbCbCcEcEcFdGcEaEaHaIbJcLdMdPeSfTdTdVfYh\e]`^[YOtWGdQ;RJ3ED,:?'49$-5 )**&$ !                                                            !               ! " ! !     !                              """"###"!          !"!                                          !#&())** , + * ' % $ "                    ! ! " ! '%%%%%%%&&%$$%&&%&&'()**3?3?3?3?3?3?3?3?2>2>2>3?4@4@4@5A5@5@5@6A7B7B6B7C7C7C 6C 6C"5C"5C"5C"5C#6D#6D#6D#6D$6D$6D$6D$6D&6E'7F*7G*7G+8H+8H,8H,8H.;K,9I+8H*7G+8H,9I,9I-:J0=M0=M/N2?O3AN4=L4>J5?K5?K5?K5?K5?K5?K5?K5?K5?K6@L7AM7AM7AM8AP5AQ5AQ6AS6BR6AS5BR5BS5BR7DU5ET4DT2DR2CS3ES4EU4EU2BR2AT2AT2AT2AT2AT2AT2AT1@S1@S1@S1@S1@S1@S1@S0AS,CS*DS*DU*DU+EV+DX,EY/E\/E\0D]0D]1E^1E`2Fa2Ec2Ee4Gh3Fg2Fg/Fe.Ge,Gb*Hb*Hb(Fb(Fb(Ec)Cd)Cf)Ag)@i(?h'Cj'Cj'Cj'Cj&Dj&Dj$Dk$Dk%En$En%Fq%Fq%Hr%Hr&Is&Is)Kx(Jw'Iv&Hu&Hu'Iv(Jw)Kx'Iv(Jw(Jw)Kx)Kx*Ly*Ly*Ly*Ix*Ix+Jy+Jy+Jy,Kz,Kz,Kz.M|.M|/N}/N}0O~0O~1P1P1O1O0N0N/M.L.L-K4R4R4R5S5S6T6T5T7U6V7W7W8X8X9Y9Y9Y9Y:Z:Z;[;[<\<\:]:]:]:]:]:]:\:\=_=_<^<^<^>`?a@bAaAaBbBbDbDbFbFcD`DaG`HbJbKcLdOcTdTcTcVeZf[d\_]ZYNvVGfQ=VK4FE-;?'47"+3&,+&#                                                                     ! ! " " !    ! ! ! ! ! ! ! " " " " ! ! ! ! ! ! ! !                            !!!!"""!!          !! !""!                                  #%')*) * + ( ' % " "                  ! "#"&$$%%&&&%%$##$%%%%'())((3?3?3?3?3?3?3?3?1=2>2>2>3?4@4@4@4?5@5@5@6A7B6B6B6B6B5B5B!4B!4B!4B!4B!7D!7D#6D#6D#6D#6D$6D$6D'7F'7F'7F'7F*7G*7G+8H,9I,9I,9I+8H*7G*7G*7G,9I-:J2?O2?O1>N1>N1>N2?O4AQ5CP5>M5?K4>J4>J4>J4>J4>J4>J4>J5?K5?K5?K6@L7AM7AM5AO4AR4AR4AT2BR2AT2BR1@S0AQ3DV2ET1DU0CR0CT/ES0EV0EV0BV1BV1BV1BV1BV1BV1BV1BV/@T/@T/@T/@T/@T/@T/@T,AT&AT$CU'DV'DV)DW)DY)DY*BZ+C[-B]-B].C^/B`0Ca2Ca2Bc2Dh2Dj0Dg.Ee,Ec+Fc(F`'G`&Ea%D`%Da%Bb%Bd&@e&?g&?h%Ah$Bh$Bh$Bh$Ai$Ai"Bk"Bk#Dm#Dm$Ep#Fp$Fs$Fs%Gt%Gt(Jw'Iv&Hu%Gt%Gt&Hu'Iv(Jw&Hu'Iv'Iv'Iv(Jw)Kx)Kx)Kx(Gv(Gv)Hw*Ix*Ix+Jy+Jy,Kz-L{-L{-L{.M|/N}/N}/N}0O~1O0N0N/M.L.L-K-K3Q3Q4R4R5S5S6T5T7U6V6V7W7W8X8X8X9Y9Y9Y:Z:Z;[;[;[<\<\<\<\<\<\<\<\>^>^=\=\=\>]@_A`A_A`A_BaC`DaF`F`D^D^F^G_J_KaLaMaVbVaUaWcXdYbZ]ZXXPwWHgP2>2>2>2>2>2>2>1=1=1=2>2>3?3?4@4?4?4?5@5@6A5A6B6B6B5B5B!4B!4B!4B!4B 6C 6C"5C"5C"5C"5C#5C#5C'7F'7F&6E&6E(5E*7G+8H,9I+8H,9I,9I*7G)6F)6F+8H-:J2?O1>N1>N0=M1>N2?O4AQ5CP3?M5?K4>J4>J3=I3=I3=I3=I4>J4>J4>J5?K5?K6@L6@L5AO1AQ0AS1@U/@R/@T.?Q.?S-@Q0BV-BS,AT*AQ+@S+BR,CU-DV,AV.@V.@X.@V.@X.@V.@X.@V,>V,>T,>V,>T,>V,>T,>V)?V!@TBU"BW$EX%DY'CY&BX'AX'AZ)A[+@[,A\-@^.A_0A_0@a0Bh/Ai.Bg+Bd*Cb&D`&D^%E^"D_"D_!Ba#Ba"@d#?d">f">f#Ag#Ag#Ag#Ag#@h#@h!Aj!Aj"Cl"Cl"Eo"Eo#Er#Er$Fs$Fs&Hu%Gt$Fs#Er#Er$Fs%Gt&Hu%Gt%Gt%Gt&Hu&Hu'Iv'Iv'Iv&Et'Fu'Fu(Gv)Hw*Ix+Jy,Kz+Jy+Jy,Kz,Kz-L{-L{.M|.M|/M/M/M.L.L.L.L-K2P2P2P3Q4R4R4R4S5S5U5U5U6V7W7W7W7W8X8X8X9Y:Z:Z:Z;[;[;[;[;[;[;[;[<\<\;Z;Z;Z=\>]?^>\?^?^?^A^A^D^D^B\C]E]F^I_J`KaM`T_T]S^T`WaW`X[XVUMtSDeL8QE.B?'79!.3&/"1 /*'#!                                                                        !!!"$ $ % % % # " !!!!!!!!!    ! ! " " " " " ! !                 ! ! " " " !             !##"! ###"!                                        $& ' & % $ #   " " !                ! " "  "$&()#"!!!!"#$%'))'%$2>2>2>2>2>2>2>2>0<1=1=2>2>3?3?3?3>4?4?5@5@6A5A5A5A5A4A4A 3A 3A 3A 3A 6C 6C 6C 6C"5C"5C#5C#5C&8F%7E%5D%5D'4D)6F+8H,9I*7G+8H,9I*7G(5E(5E*7G.;K/J2>J1=I0J2>J3?K3?K4@L4@L3AN/@R.@T.>U,>R,>T+=Q+=S(=P+@U)@R(>S%?P'=R&@Q'@T*@U)=U)=U)=V)=U)=V)=U)=V)=U)=V)=U)=V)=U)=V)=U)=V&>V>SBUBX!DX#CZ#CZ#AY$@X&@Y'?Y)>Y*?Z,@[.?[.?[/?`/>e-?g,?g)?d(A`$B^$B\#C\!C^ D^B` A`@c!?c =e =e#Ag#Ag#@h#@h!Ah!Ah!Aj!Aj!Bm!Bm!Dn!Dn"Dq"Dq!Fr!Fr$Fs#Er"Dq!Cp!Cp"Dq#Er$Fs#Er#Er#Er$Fs$Fs%Gt%Gt%Gt%Ds%Ds&Et(Gv)Hw*Ix+Jy+Jy)Hw)Hw*Ix*Ix+Jy+Jy,Kz,Kz-K-K-K.L.L.L/M/M0N1O1O2P2P3Q3Q2Q4R3S3S4T5U5U5U6V6V6V6V7W8X8X8X9Y;[;[;[;[;[;[;[;[;[:Z9X9X:Y;Z<[=]<[=Z>[>[A[A[B\B\B[C\E[F\H^I_J^L_R]R[Q\S^U_U^VYVTOGnM>_F2M?(<;#37,4'1$0/)&"                                                                             !!"$ % & & % $ # "           ! " # # # %$ $ # # " "               ! ! " " $ "               !!"!!%%%$"                                        # $ #"!    $ $ # " !         ! !  !"$%%""!  !""#%'))'$"2>2>2>2>2>2>2>2>0<0<1=1=2>2>3?3?3>3>4?4?5@5@5A5A5A5A4A4A4A4A 3A4A 6C 6C 6C 6C 6C"5C"5C"5C%8F%7E$6D$4C%5D)6F+8H,9I*6F,8H-9I+7G(4D(4D+7G.;K+8H+8H*7G*7G+8H,9I-:J.;K3?M3?K2>L2>J1=K0I2>L1?J2@M2@K3AN1AP-@Q+@S*?R)>Q(=P'=R&S'=R&R&?U'=T'=U'=U'=U'=U'=U'=U'=U&Y*?\+>\,?],?_+?d+>f(>c'?c%?`#@^!@\!@\ B^B^ A`@a@c?b >d=c"@f"@f"?g"?g @g @g @i @i!Bm!Bm!Bm!Dn"Cp"Dq"Dq#Er$Er#Do"Cp!Bm!Bo"Cn#Dq$Ep#Dq#Do#Dq$Ep$Er%Fq%Fs%Fs$Cq%Dr&Es&Gt'Hu*Iw+Jy+Jy*Fv(Gv)Hw(Hw)Ix*Ix+Jy+I{,J|,J|,J~-K.L/M/M0N/M0N0N1O1O2P2P1P3Q2R3S3S4T4T4T5U5U5U6V6V7W7W7W8X<[<[X?Y@YAZ@Z@[A\A\C\F\G]I^K^M^P]P\P[R]U^U\UWUR}LBgH9X@.F:%87!.6 ,6)5&/-(#                                                                              "# % % & & & % # "         ! " $ $ & & % % $ # " " !              ! ! ! ! !               !!"&&%$"                                     " "" !     # " # " !                !"!  !"#%')'%",81=3?0<0<4@3?/;1=1=/;/;/;/;1=1=-:0=2@2@0>.</=0>1?2@3A4B4B3A2@1?3@0>0=1>4A6B5A3? 6C 6C"5C#5C$4C&3C&3C'3C*3D*3D+4E+4E,5F,5F-6G+7G-9I-9I,9I,9I,9I,9I,9I,9I.:J1:I0K-:J-=J0=M,L%M'AP#?M8I9J&@Q'S ?T ?T!?W!?W$@X$@X&A\&A\'A\'A\'@^'@^'@^'@^#>\$?]#@`#@`#@^"A^!@] ?\=\=\<^<^<`<`<`e>g>g?h?h!@l Al!@n An?l?l>j?h>j @i ?k!Aj!@l!Aj$Co$Dm"Am"Bk"Am"Bk$Co&Co&Co&Co"Cn!Dn!Dn$Ep(Ds)Et-Hw,Hw)Ix)Ky)Ky+Kz.J|/K}.L~-L{,J|+I{+I{,J|-K}.L~2P0N.L0N3Q4R3Q0O3R2R2R2R2R2R2R2R4T0P0P5U5U2R2R8W:W9V8T7S7S8T9V:W:X9V9V9U9U:WX>W=V?U@V?X?Z=[>\A\C\G\I]L[M]L\K[M[O[S[UYTS{TNrLA_=/H:)<<*86"-1$1!*-*#                                                                         ! " # %%%% # "            !##&' & ' & # !                                   !!""!!"!                        ! !        ! !" "!&# (4-9.:+7,80</;*61=1=/;/;/;/;1=1=,:/=2@2@0>.</=0>1?2@3A4B4B3A2@1?2@0>0=1>5A6B6A4?7C7C"5C"5C$4C$4C'3C'3C+2D+2D,3E,3E-4F-4F-6G-6G-9I-9I,9I,9I,9I,9I,9I,9I09J1:K0M,I;I6C5F!;L#8K$6J%4K$4K$4M!5M"6N 9O9L:L9N9N9N9N9O9O7O7O8P9Q9T:U ;V e>g>g?h?h!@l!@l!@n!@n>l>j!>j!>h!>h"?i"?i#@j#@j#@j&Cm&Cm$Ak$Ak$Ak$Ak&Cm&Cm'Bm&Cm!DlElDn#Fp(Eq*Er(Cr(Ds$Ft#Hu#Hu&Hv*Fx*Fx,Hx)Hw(Gv'Fu'Ew(Fx)Gy*Hz-K+I}*H~+I.L0N.K+J/N.N.N.N.N.N.N.N4T0P0P5U5U2R2R8W6S7Q6O5N5N6O7Q8S8S7R7Q6O7Q8R:U;V;V:T$)A2XQ‡ILhX2Σmo%(滽m7BnIL ppu|#Yi*usX]ŗ__B`{QOqΈNPi@#KV!l|>|~|Y]XF2F@4IA4JB5KC6KC6MD5MD5OC3NB2OC3OC3PD4RE5R?1Y?2b@4nB5}E6H8G9F7G:G9E:G;G>G?H@E@FLCLDKEICIBD>B=A;A:@:??-?/?/>.>,=+<+<+?+?+=*=*=*>+?,@/?6>5=2?1B3D3D4D4?0A2F8H;H9oA2T8*C3&=5295495473271160050-50-72/72/72/61.61-50,50,41,//-.0-//-//-0/-0/-2.-2.-5,-4+,4*+3)*7(+=.1E69P:0U?1^A3jC4xD6E4E5C3C4A4A4B7D:E@<@6>/@.?-?-?-?,?-@-@,@+A-A+@*A)@*A,>-?/>.>.>,=+<+<+?+>*=*=*=*>+?,@/@5>5>3>1A3D4C4D5A2C6F8I;G:l@3S9*B4)>63:6595484382271161.61.72/72/72/61.61-50,50,41,//-.0-//-//-0/-0/-2.-2.-3--5,-4*+3)*5)+<-0C47N8:d>=vEAJINLTVajl}r{{ou[[QHuOCiOFeOG_PH_RN_[Yfnot~ojkY][LVSJXSZVRaXQa/.,/.,0/-10.40-40-51.51.72.72.72.72.92,92,92,92,91.80.7/-7/-7/-7/-80.91/80.80.80.80.80.80.80.80.6.,5-+5-+5-+4,*4,*4,*4,*5-+5-+5-+5-+5-+5-+5-+3.*2-'1.'2/(30)30)41*41*52+63,63,63,74-85.96/96/:7.?8.@:.B<0D>2G?4H@5H@3H@3I@1I@1K?1K?1K?/L@0MA1NB2MA1QA1YB2dC2qC3|C2B2A0<-:+;.=2@6D:F=D>CE@FBGBFDFCEAD?D;@:?;@=@@@A=@;@5=.@-@-?,?-?->,@,?-@-@,A+A,?*@*@+>->.>.>.=+=+=+=+>,>,<+<+=,=,?+?.A6?5>3>2A4C5D5C5D8F;I=J=G;h@4Q:,B5,?74=77<66:4494183072/72/62/62/62/51.52-41,41,21,.0-,1-.0-.0-//-//-0/-2.-5//4..5,-4*+4*+9-/>24I56[97l?9|E@IDOM[`fvmw}}u~fmTVMEvLAkMAeOFcQHcMH^NK\[[eqty|xzlfiXZ[MVSLZU[ZT`[S`.-+/.,/.,0/-3/,40-40-40-61-61-61-61-81+81+81+81+7/-7/-6.,6.,6.,6.,7/-7/-80.80.80.80.80.80.80.80.5-+5-+5-+4,*4,*4,*3+)3+)6.,6.,6.,6.,6.,6.,6.,4/,30+30)30)41*41*52+52+52+52+52+63,74-85.85.96/96->7-?9-@:.B<0E=2E=2F>1F>1G=1G>/H<.I=/I=/J>.L@0JA0KD2NE4UD4^D3iD2sB1~A/?-9)9'9*<-@3E8HDCACBCDCCDBC@C?A;@:?;@>@A@B=@9@3=-@,@,@,>,?,?,?+@-?,@+@*@+@*@)?*>,>.>.=-=+=+<*<*=+=+<*<*<+>,>-?-A6?5>2@4B6C8C7B7F|F:b@4L:.A7-@85>96=77<74:5294183083062/62/62/32.52-21,21,12--2.-2./1./1.00.00.10.10.5106005//5,-4+,6,-:01D22T71c;3qA7{E;HDRU_lis}yx}ow`fQRLEyL@pL@hPEgQFfLC^GBVMLZ^^fjnquyxx}wzvwzokoa`bTWYLTTL]WY]V]]V^------.-+/.,0/-10.3/,40-3/,3/,4/+4/+4/+4/+6/)6/)4/,4/,3.+3.+3.+3.+4/,4/,50-50-50-50-50-50-50-50-3.+3.+2-*2-*2-*1,)1,)1,)4/,4/,4/,4/,4/,4/,4/,4/,41,41,41,41,41,52-52-52-52-52-63.63.74/85096196/<5-=6,?8.@9/B:/C;0C;0C;.D:.D:.F:.G;-H<.I=/J>0I@1JG6MH5RG5YF5bE3jD1uB/}>,;):):*=,B2F8J=I?GBDCDBEBBBAA=@<>:?:<<>?>B>C:A5?0?-?,?,?,>->->-?->.?-?,?+?,?+>*>*>,?.>->->-=,=,=,=,=,=,=,<,>->.?.B4A4@1@3A7C9B8A7C;H?LCJ@tE;Z>2E9-<5+@93@85?75>63=52<4194083/62/43/43/23.32.12-12-02--2.,2.-2.-2./1./1.00.10.3205105104..2,,4+,7./=/.N5.Y9.e=1n@3sB;yKKZegpzxu{ks_dTTOGLBwNAmNBhMAeJA`GBYGFXKKWMPU]cc`fbbia`f\Z`TW[MUXMXXP^YV`WX`WZ,,,,,,.-+.-+/.,0/-3/,3/,2.+2.+3.*3.*3.*3.*5.(5-*3.+3.+2-*1,)1,)2-*3.+3.+3.+3.+3.+3.+3.+3.+3.+3.+2-*2-*2-*2-*1,)1,)1,)0+(3.+3.+3.+3.+3.+3.+3.+3.+41,41,41,41,41,41,41,41,41,52-52-63.74/85085085.;4,<5+=6,>7-@7.A9.A9.A9.C9/C9-E9-F:.G;/H<.J>0HA1JG6IH6NG5VF6\E3dC2n@0v>-{<+;);*=,@1F5J:J=H@EAFAE@CA@>>?:<;<:;<=@=C=C8@2>,?,@,?+?+?->,>,?,>-?,?,>,?+>*>)?*>+>->->-=,=,=,<+=,<+<+<+<-=,>/?.B4A2@2B5C9C:B:A;A9I@NGNEoG=S?4A;/96-@93A75?74>63<4194083/74/43/43/34/23.23.02-02-.3--3/-3/.3/.3/02/02/11/11/21/32032040/2.-1-,4..8.,G4-O4)X8+`<0e?6mGFyYdku||w|nudh[[RMLB~OArL@hI=cH>`HB^ECX@BO;@FBGJDMJJQJJQIIQFKQEOUIVWO^YS`YS`XU++++++,,,---/.,/.,0/-0/-1-*1-*1-*1-*2-)2-)2-)2-)2-*2,,1++1++1++1++2,,2,,1++1++1++1++1++1++1++1++2,,2,,2,,1++1++1++0**0**3--3--3--3--3--3--3--3.+41,41,41,30+30+30+30+30+41,41,52-63.74/74/85085.:3+;4,<5-=6.?6/?6-?6-?7,B8.B8.E8/E9-G;/H<0J>2H@3HE6GF4KE5QD4XC2_B2f?.n=,v=,|:*9);*=.B2F7F8FF>E>D@C?@@>>::;:<.>.=->-=.?.?-?-?,>*?*>)>+>->-=,=.=.<-<-<-=-;,<,.=0?/C2B1A1B6C:CCC793@72>71=60:5/94.83/63.43.43.34/13.13..3-.3-.3--3/-3/-3/-3/.3/.3/02/02/00.11/22021/0/-/.,2.-4/,?0+D0)K3)T8-Z<4dFFu]js~tzmpceVSLCK?qI_FB]DBW?AN;?H:BE>HGDMHGQIGQHJRGNVKUXM^ZOaYNaXO++++++,,,,,,.,-/.,0/-0/-1-*1-*1-*1-*2-)2-)2-)2-*2,,1++1++0**0**1++1++2,,0**0**0**0**0**0**0**0**2,,2,,2,,1++1++0**0**0**2,,2,,2,,2,,2,,2,,2,,2,,3/,30+30+30+30+30+30+30+41,41,52-63.63.74/85085092,:3+;4,<5->5.>5.>5.>5,B8/B8.E8/E8/G:1I=1J>2I?3FC4FC4JB5OA4TA2\@2b>0j<-q<.w9*}8)8(:,=/B4B5F:E;F>G?G@FACAB@;;;;>;B;D:D4@->(A-A-@,@.@.?-?->/>.@.?.?->+?*>)>+>->->-=,=.<-<-=-=-<.<.<./>1?1D2C1B4C6C;D>D>EAPL[Te\f]u_T[UIGMACI?<92?82>71;6094.74-63.43.43.34.24/13./4..3-.3-.3--3/-3/-3/-3/.3/.3/02/02///-00.22022010.0/-0/-3/,8,,;,)C0*K70S<6^IHtbnzƄzrxikWWIDE=nG^CAY@CV@DP>EKGQRKWUQ^WU`XS_UR^TT^SY_S^[LaZJaZJ,-/,-/,-/,.-------.-+.-+/.,/.,1-*0,)0,)0,)/+(/+(/+*/+*/+*/+*/+*/+*/+*0,+/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+1-,1-,2.-1-,1-,1-,1-,1-,1-,1-,1-,0,)1-*2.+3/,3/,3/,3/,3/,3/,3/,3/,3/,40-51.62/74/80-92,:3-;4.=4/>5.>5.>5.?4.?5,B5-C6.D7/F90G:1F<2G?4H@5J@6P?5T>3X<1^90b6+m9.t8-|8+9,;/=0?1>0A3A4C8E:G=G>E?C@@?BADAE>D8B1A.B,A.@-?,>.=-=->.?/<,=,<->-=,=+=*>*<+<+=-<,<,<,:-;-=/3@2A5A4E5D4E9I>G@D>EAMGZRf_qfsh~rdjj^V^SIQFLLBJF=B>5<8/95,74+63,33+43.34.14-14-02-/1,,1+,1+-2.-2.-2.-2./1./1./1./1.02/02/11/11/11/11/11/40/4+0;/3A32C4/J;6]OOymyϐكtzjn_bZ[LItHBdA>]>>X?BUAIVLU\U`bbqnn}xv|rulyoguh_k_W_P[ZF`ZDc]G,-/,-/,-/,-/------.,-.-+/.,.-+0,)0,)/+(/+(/+(/+(.*).*).*).*)/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+0,+1-,1-,1-,1-,1-,1-,1-,1-,1-,1-,0,+0,)1-*2.+3/,3/,2.+2.+2.+2.+2.+2.+3/,40-51.62/80.91.:2/;4.=4/>50>50=4-?4.?4.A4.B5-C6.E80G:2H;3H>5H>5L=6O>6Q=4V;2Z90_7/h70p7.w7-9-9.<1<1=1@3A3B5D8E:FF8C2B-B-C.B-@.?-?-?->.>.=,>,=-=,=+>+>*=,<+=+<,<,<,;+;-<-2@6A7B6G9E7Ga[C,-/,-/,-/,-/,-/,.-------.-+.-+.-+-,*/+(.*'.*'.*',+),*+,*+,*++)*+)*+)*+)*-+,-+,-+,-+,-+,-+,-+,-+,,*+,*+-+,-+,-+,.,-.,-.,-.,-.,-.,-/-./-./-./-./.,0,+0,+1-,2.-2.-2.-2.-1-,1-,1-,1-,1-,2.-3/.40/51.80.91.:2/;30=31=4/=4/=4/?40?4.A4.A4.C60D71F93G:4H;5J;6K<7N=6P;6S:5V72[6.c60k6.t5,}7/9/;0<0<1?3@4@3@3C6D8E:D:F@H@IBI?E:C3B.A.B/A.?.>->->->/?0<-=-<.=.>-=,<+=+<*<*<,;+;-<-:-;-<0<0<2>3?4A8C:D9J=H;H>KDKFLGSM`Vsgqz{wsocqbXcUNRDMN@HI;DD8@@49;.46+/1&01)01)/0*/0*./*./*//-//-//-.0-//-//-//-//-//-//-00.00.00.00.00.00.00.1/26+97+98/4;63HE>_^Yzz|DŽ}{|}}wq~n}n~~o~y|{j{i\hTVV>[W:]Y>-.0-.0-.0-.0-.0-.0.......-+.-+-,*-,*.*'.*'.*'.*),*++)*+)*+)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+-+,-+,-+,-+,.,-.,-.,-.,-/-./-./-./+*0,+1-,1-,1-,1-,0,+0,+0,+0,+0,+0,+1-,2.-3/.40/91/:20;31<41=31=31=31=4/>3/>3/@2/@3-A4.C60D71E82F93H94I:5J;6L:6N94Q83T50^72e60o6/x8/90:/<1>1?4?4?2?1A2B5D7E:G>H@JAI>F:B5A0@.A-A-?->,>,>,=.>.<,=,=.=-=,=+=-<,;););+;+;,;,;-;,;/<1<1>5@7C:DJCLIQL]Vj^oyzxm{jbm]SZJQUFKO@EI:@D6;=057,13(01)/0(./).-(.-).-)/.,0/-/.,/.,/.,/.,/.,..,/.,..,0/-//-0/-//-//-//-//-2-17,:6*83-1961HJ?bfX{z}|k|iXfOSV;YU8ZV9+/2+/2+/2+/2-.0-.0......------.-+-,*-,*,+),+),+),*+,*+,*++)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*++)*+)*+)*,*+-+,-+,.,-.,-/-./-./-./+*0,+0,+0,+0,+0,+/+*.*)/+*/+*/+*/+*0,+1-,3/.40/901:20;31<42=32=31<20<20=20=2.?1.?1.@2/A30B5/C60D63C84D95E:6G96H94K84N50X72_60i70r7/}:1<1>2>2@6?5?5?3@3C5C6E8E;G=H>G=D8A5?0@/@-@-?.>-=,<,=/=/<.;-0->0-?1.@2/A4.?4.@51@72@93A:4B94C84F74H5/Q51X5/a6/l8-u9.0=1?5>5?5?4B4B4C4D4B5D8E:E;B7?4>1>0?.?+=,=,<+<+<.<.;-<-<.;-;,<,;+;+:*:*9):):+9*9-9-<1<3?6A8CHCNJVR`Zper}~~yup{jdp\]iSR^JJS@BK:>E5:@29<134,22*1.)/,'/))0**1++2,,1++1++1++1++1++0,+0,+0,+1-,1-,1-,1-,/.,/.,/.,2,.8*75(13+(56&EK1\gGudyťέɭʰ˱Ȭ{wrdx]Q_EMQ6QQ5RQ5,03,03,03,03./1./1./1./1/////////////.,/.,.-+.-+/-..,-.,--+,,*++)*+)**()+)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)**()*()*())'()'(+)*+)*,*+-+,.,-.,-/-./-./+*/+*/+*/+*/+*.*)-)(,('0,+0,+0,+0,+1-,2.-40/40/:12;23;23<34=32<21<21;10<1/<1/>0/=/.>0->0-?1.>3/=60;60;83<94=:5>93@72C60G4.O4+Y4+d5+n8,x:-;.;.<4<5>3@3A2B1A2@0>1@4B7B9@6>5=2?2?-?->,=+;*;*<-<-;.;.;-;-;.:-:,;,9)9):)9(9*9*~8,~8,<1=4@7B9E>IAKFMFIAH@JFSO]Xhb{ny~wxnjxadr[ZhQQ]IITCCL;>D60-?1.=2.>3-=6.<719919:2::2;81?6/C2+J1,T2)^3*h6+o9-v<.{;/=2=3?2@2@3@1?1=/2B6C7B7?4>2>1>/=.=-=,=,=,=.>/<.<.2>5@6C:F=JBMEOGICIDPJ\Th`uiu}zytog~bby]\pUUgON]HGRA@I8=A388.85.50,3+)2()2()3)*4*+2),0**0*,2)*2),2),2),2),3*-3*-1+-1+-0,-0,-0,-1+/4)/4*+4-%46!?F%T`8m|Qgtz~z{Ĉːəǝƚ~xvolfZnSJZ?FL2FJ/FH0/0+.0+/0+01,01,01,12-21-32.43/43/62/51.41,3/,4/,50-50-4/,3.+2,,1-,0,+0,+.,-.,---/--/,,.++-*).))+.)/.)-/(/.)-/)-.)-.*+.*+/+*/+*-,*.-)--+-.)./*./*------.,-/-./.,0/-2.+2.+2-*4,)5-*6.+8/*:1,:1*;2+=4-=4->50>50>50=4/<3.;2-=2.<1-<1/;0.=/.>0/>0/@1.B/)B1)<3*96-58-47.66.;2-@-)G)'O''V)&[.(a5,f<0m?0yA0@/A1B3@3=0;/8-;/=.A1B2C2A0>.;,;0:2;1=0?0?/?.?.@1?0>1=0-v>-v;-}?2};/?4D9H?LAMBOCNELITPcYqa}jq||r{nuhia_[zXYtUZnSVeNOXEIK=B?6@93:0.5+*3')3'+3'+1&*/)--)*-(,-')/&+1&,3&-3&-4'.4'.3(02(00)1/*1/*1/*0/)-1++0-(//#A./0*01+01+01+12,12,21,32-43.43.74/74/63.52-50,50,7/,7/,6.,6.,3.+2-*0,+0,+0,-/-./-0--/-,1+*/)*.)(-.)//(//(//(//)-/)-.*+.*+/+*/+*.-).-)./*./*./)./*.....0....../.,/.,1-*3.+5-*5.(7.)8/(:/);0*<2)=3*>5,>5,>5.>5.>5.=4-<3.<3.=2.<1-;0.;0.=/.=/.>0/@1.D/*F/)C2+@3+=4-<3,;2->0-A,+F*)K)(P*'V-)\3-a91g=/pA/xA-A0@2?4=3:2;19..@0A1A1A/?1;2;2<2=0>0@/?/@.@1>/=0<.;.;,:,<,w9,w=1p;-m9+r?.r?.q9*u:,=1@5D:H=J@MAOCMEJHTRf]wfpwu}mvdi^`YZY{XZwXXoSRaJMVCEI;AA7;8350-3*+2)*1(+.(*1(+0',0',0',1&,3&-4'04'04'03(02(10)1/*1-*3,+3,+12-12.-0,)--%8:,SXBox]iolnpppw{xwy||{xuqnh{eYjWMZHFM;@D3;>-12,12,12,12,23-23-43.43.54/54/85085085074/72.61-80-80-7/,6.+4/,3.+2,,1-,1-./-.0.1/-0--/,,.+*/+)./(/1'//)-/)-/)-/)-.*+.*+0,+0,+/.*/.*/.)0/*0/*0/+//-///0./0./0/-/.,1-*2-*6.+70*90+:1*<1+=3*>4+?5,?6-?6-@7.@7.?6/>5.=4-=4-=2.<1-;0.;0.;0.;0.<1/?1.D1+G/+J.+L,-O+/N*.J*/G*.D,,A.*B-(F-(O.)Y0*c2-i4,k:,o;-w;0=4<6<5:4:4<2=2>2?3A2A3B5C5?2=/>1>.>/>,=.=,;.<,:-:*;,<)~=+z=+|>1x<1u;/t@29:,23-23-34.34.34.45/54/54/650761961:72:72961940940:2/91.91.80-50-4/,4..4..3/03/01/01/20.1..0--/-+.0)02).0*.0*.0*.0*,/+,/+*1-,1-,0/+0/+10+10+10+10,11/1111/010.10.2.+3.+3.*92,92,;2+<3,>4+@6-@6-A7.B8/A8/B90A8/A81@70>5.>5.=2.=2.<1/;0.;0.<1/=20?1.B3.F1.M-.T)0X&/W%.Q&/K(.D/.>1+<2)@2)H/(T/)`-*e.)i9/k;/u<3}<6;8;9;7:6>8@8B9B9C7B7A7A5@1@/?.?.>-<,;+:+8*8*9*9);)}<(z=(x>*@1z7.x8.x<1u;-v>/{A3{@2B7D:G=I?I@KBNDPHQJZQe[rb}gmv|~yrolihgfeggde`}_\v[QgPL]JBP?9D62:/.4*,/(-*%5%&8#(8#(7$(4%(3'+2),0,-,*+++-*+-(,-',/',/%-/(,-.*+1++0+'.+"88,PUAiqYvc{hyh|il}mykzmrtq}p}p}s~v~x}x|x}zzwuqnje|bWkRN[GEG9?=097*45/45/45/560560560761761872872;83<94<94<94<73<73<41<41;30;3083072/61.61.5106216213122011/00./1-.2,04+.4+.4+.2,.2,,2,,2,,3/.3/,3/,3/,21,21,32-32.32032032032051051.61.61-;4.<5/=4-?6-A7.B8/E8/C9/D:1D:1E;2D:1C90B8/@5/@5/>3/>3/=2.=2.=20=20>31>31B41F21N02U,4Z(3Y'2S(1L,1D20<5-97+<6*D3)N1)Z/)^/)f:1j;3s<7z=:<:<;;;::;7>8A8B9C:C:@9@7B2C1@0>/<.;.9-8-6+7+8+:+<+z=*w>*x>*9-z0'8/?4u5+q5*|B6}C7E:GJ?JBLDOGUJ^NfQmYr]ybiu|~}w}p}l{lxkxmulpgl~dcqX\hRSZHIK=B@4=6,9/&7*$9''9%'6&'4&&1'&.((,+),,*)+()+*)+*)+***,**,+),-)*,#$2*'50*86*BC5UZFfpWn}^teqbuexiwkshtiwkznxlwmxnys{u{w|wyuzwwtsomhd{_WkPN\EDE7>:/84)560560671671782782872872983:94=:5>;6>;6>;6>95>95?74?74>63=52;63:5294194184184395484373243151240/6-06-.6-06-.4..4..4..4/,40-40-40-51.32-32-43.43.43/431542540841850940:5/=60>7/@7.A8/C90D:0G:1H;2F<3F<3F<3F<3E;2C90B71A60@51@51?40>3/>31?42@53@53A62D52K25Q16V.6U-5R/5K12D52?80=9-?9+C7)I6(S2)X2)]2+d3,l50v64}77877766~75}:4}<6}>5?9@8?9A8A3A1A1?0,~<,5*3,MEYQA8|90F;K={G:zJ<|L>}M?MBPEUJ\LwiOupRrXu]ub|iszz|~yvpoppp~pzmvkm}bht\`hSWZGPM>H@3B6*@/'=+'<*(8*'5*(2*'/,',-'+-(+-(,-(-,*/+*3)*4(*6'*6((3($<3,E>4IG8QR@]bKgqVjyZn]k\l]pbqeodoerfumrjqitnxrzvyvyvvtwvurokjfc|^UlON\ECD6@9/:3)671782782782893893983:94:94;:5>;6?<7?<7?<7@;7@;7B:7B:7A96@85=84=84<73<73<73<74<74<74;639529338308/09/.8/080.80.80.61.61-61-61-52-52-63.63.74/74/540540841952:63<94=84@93@70A8/C90D:0G:1H<0I=1I=1J=4J=4J=4I<3F<3D:1B8/A7.A81@70@72?61?61@72@72A83@64A75C86F87H96J86J86H94E80E8/E9-F8+I9,I9*L9+R6*Z/&d/'n3-z6398;9;:=;A>@:=6<3:3<4=7@7?5@3>2>2<1;0:/;/:.;.~<.=/=/(+A&+E$+C&(F5-LC4VQ>[YD`bJgmQiwVj{Wl[gWfWl\oananbrfskojoirnwtyxxwuvssuvsrnlicb{[TmMM]CHI;E<3?6-7827828938938939:4:94:94;:5<;6?<7@=8@=8@=8A<8A<8C;8C;8C;8B:7?:6>95>95=84>95>95>95>95=85<73:51;30:0.:0.91.91.91/91.91.72.61-61-63.63.63.74/74/74/540651952;83<94?:4B;5B;3A8/B:/C9/E;/H<0I=1J>2J>2K>5K>5J=4J=4F<3E;2C90B8/B92B92A83@72@72A83B94B94?82@93B;5E<7G<6I<6M<5N;4M6.N6,Q6+Q6+Q7*R8+P9)V6'g5*r6,~;3@9D@HDJGLFQJLDD;;07-7-91<4<5=7<6;5;5;4<3}=3z>3z>3z>3}=3;3936331)&?;}zhcH@K@xH:pLjV>oV@vZE_LfP|qQvUs\k^__T\Q[R\ouyxυ|Î~}xvrtuuussrn|jwyapnWiaNbRBWD5S;/O4-M1-I0,D/*@/(;.&7.'6/'90):/)=.+A,+F)+H(+K'+H)'TB4YQ9B?:D?;D?;E@8E>8D=7B;5B;5B;5B;5B:7B;5A:4A:4A83A83A83@72@64>71>71>71<71<71;60:5/85.85.74/74/961961961:70<71=82A:2B;1C:1D<1F<2J>2K?3L@2N@3N@5N@7N@7L?6K>5I<3H;2E;2E;2B90A8/@91?80?80?80@93@93<5/MD=M@:K:3T@9R62Q0+_<6[4-^6._4+\0'^/%e6,m=1r<0I=G;I?KAF>>7=6D;NDPEVJYKOBA5;0>69888553274>8?6u<1uA4s?2t;0y906223,1&,HIcaFDYUzvVOF=8?>9>=8>=8A>9A>9B?:C@;D?;D?;FA=E@8E>8E>8E>8E>8D=5C<6C<4D;4C:1B92B92B92B92A83A83@93@93>71<71;60;6096/85.74/74/96196/96/:70<71>:1A:0B<0C;0E;/I=1J>0L@2L@2N@3N@3N@5N@7M?6J=4I<3H;2E;2E;2C:1B90@91@91@91@91A:4A:2C:3I81K/+V.,j76t:9{;;ECD?H@IAH>JBOHPLOGD7B4B6C8>37-7-=0C5?0@0E3G6F6H:NEKMGL@D8;78=:>8y=3r<0|H;KA>8++(.9DKWLNOM@=A?`\YQ@5TDyaIe[@`\?khIulOwfJcKcNfXa[XZCN.E'D(H*I0N5N?RLZR^T]U]Zbbielinlqprttvwxw|}y{vyqukseoal_lanT_LUHQDKFIk79HT1-M0*H1+J6/K81K:2O>6UE8[O5cZ9gaAifEnrOz]zbt^r_p_p`q`udwdwdwfsixrzxyx~}zzromhhd`y[TmMNaERSCVPDVOE8938938939:4;<6<=7?>9@?:@?:@?:C@;C@;C@;C@;D?;D?;FA;FA;FA;E@:E@:E@:G@8F?7JA:I@9H?8G>5F=6E<3F<3E;1D:1D:1D:1D:1D;4D;4D;4C<4?80?80<71;60:5/:5/94.94.96/96/:5/;7.>7/@9/B90C;0E;1F<0I=1K?1M?2M@0NA1M@0P?5M?4L>3K=2I<3H;2E;1D:0C:1C:1A:0A:0?;2@<3@<3D;4SEI?MAOBRJURPSLKA4B0@0?1;.7+8+=/E6>+7$:'>-A/C2C:029BDLKRMRKLA>71{8/v6,z1*0-378@?:A@;BA5G=3F<2E;1D:0D:0E;1E;2D;2E<3E<5E<5@91?80=82<71;60:5/:5/:5/96/96-;7.;7,?8.@:.C;0D0K?/M@0M@0M@/M@0O?2O>4L>3K=2J<3G:1E;1D:0D;2D;2B;1@<1@<3A=4B>5F<3Q81X+&;?U`UeVfVcKO40:/>0B3F=JGCH?@B7F5B3@3?3>3B4D6G5B/<);(<(:(6&3(979=8>7<=BJLTSXS?74*-%61HKPWBQ4@;9/*9484F@]UXKWFwW@xdI~pSoQfJcKm[uiUWFP>J/?@.;D/AF/QJ._T8g`CokN||`rv}qzq|s|szozm}ouzsqh|c]tXSlNPdHPXCVWEWXH671671782893:;5<=7?>9@?:BA/K?1M@0M@0NA0O?/O?0O?2N=3N=3J<1I;0G;/D:0D:0D<1D<1B;1@<1A=2A?3B?6K=4[6.t42MS^iN_AQ7E'+2)8(:&=)A3E=??<;?5B4@2?2@5C9H;J<>/?/=+;)9):,;/=1GAEA@?998MCTLUMKJ@B5>374.9.3+;494A9[PUC{N9bIjP`FZFdTpdmhFKDDHIKJLIMLSDM:I7H4G1F4L:R9V:X;X;Z<]?_AbCeEiEkDlDmCoDoDqCoHpBhJmOpKhPk]rcs[c@D`&$Q+"V@3VO=JL7AC-RJ3eYCujV{gyýþyvi{e\sYTmORfJPZBTYCV[G560560671782893:;5=<7>=8@?:@?:C@;DAGB>GD=GD=HC=ID>IE2I=1G=1G=1F<0F<0E;1E;1D;2C:1A:0A:0@91@91=82<71;60;60;7.;7.;7,<8-?9-A;/D0L?/M@0NA0NA0O?/O?/O?2N=3M<2L;1I;0G;/F90C9/C;0B<0B;1@<1@>2A?3B?6N;4j94GEZ_XbDQ9F4;,+2'8%:!: =&@.;2817,:-9-7,:1B8E;E:>2?0<,6'6)>0D;G=:-A6F?DB?A;>470095IBULPG?92002771(=/."814,7/h\l\WCZCV?Q=[LjagbSTEK>F<@>>B>HBPMWWORDM;G6F2F/D2G7N9S:T:V;W=\?aCeDkh?j@l@n>n=l=8A>9C@;DAHC?HC?GD=HE>ID>ID>JF=JF=MF2@@4N:1o2/KKTV?D16031/2)2!9#=!== ?#;%7%6)8-6,4,81@:C<@6B7A4?@HE>HE>HE2G=1E=2D;2C:1C:3A:2A:4@93?74<73<71>7/>7/<8/=90>:1A:2C<2D=3H@5I?3L@2MA1NA0P@0O@-O?/L>1L>3K=2L;3J91I81F70C82A8/>:/=;/<=/?=0@>/B?0S9,=7][ZY86/*2+/%3#:&C*G,F'B&B&=#:#9*;0:07.<4C9=46,4.84GH?E:D9H9I7G:I?NCUAV?T;T:U:Z;^HHLC4J@4KA5MC9LB8F=4B90E<5C:5@93?74@85?75<74<42C:5B94A96>95?:7>:7?;8@<9B?:D@7G@6J@4L@0O@-O@+L?,F@2E>4H;3J84K65M47K79H::C>:7807;->B1>@+:8#C;$eB.j\KA7,6)7+6'8&=+9$<&@*A)=)9&6%7%6'7)8*<.@2B4B2A1>,=,<,=/C4F8>12&9+9*9+9-7-6.4/2-.,/-1,2,5*7):);(:&34 8'8'6(B5SINCSK\W]ZPR>C8??G@FCD@A>9<3:/;/;0L@KCFC>?I;GEQDQDRDU@VHH>HH9H?:F=8B;5D:8A96?74?74@85@85=85;62=4/=4/=52<74=96>:9=<:>=9B?:D?9G@6J@4M@0O@-P?+L?,A@.?@2E<5H96J67J47F37C47A<9<;6==1E?1J:*P6%dA.J:PB;-2#6&:'7$9%>*;%<(?+@-=,9*6(7)9):*9);+>.A1B/@.?,:(<+E6H9?18+6)7+7,9.;-8;1:-<-=.E5L?NEGC?>?B?F@JCJCLDPFTBS>S>XBaFhCi?i@jBpFvJzK{HxGsJoRt]z`{XvOpFkDkDhIf\ojtsGHysΰų~/.,0/-10.21/43/540762761:94::2<<4>>6@@6BB8CC9DD:IF=IG;JH;LI8MJ7NL7NL7OL9KI:NKBTRS_^fihxmmlkkh`YiYQ\OGRH@KH>GG=EE93>:1=9083-94.;60<92=:3>;4?<5@<3E>4G?4I?3L@0O?0P?/P?-L?,<;':=*>.<-:-->-<,?-8(>.L=G:6*2&9.6,6+8,:.:/8.6/3,0-.+.+1)2'6&8"7!8$5#9'>/=.6)9,A7<5>8EAKIJJCC?ACCCAD?B==4:.8*:*;+8)D8NEIE@@>ABIHPAG@ICOGTEU@U?XA_DfCiCkFpIwK{L|JzBtDtHqNt[|bWvEcMmVw@\G^yy{g@;{pױξ/.,/.,0/-10,21-32.54/650880991;;3==5??5AA7BB8CC9HEQPL^]bmlzzz{urke_{YSmTLdMEZG@PB;2?=1@<1?;/A;-F?/H?.K?/M@/O?0O?/P>0L?/B=*?>,@=.A:0A:2@93>95<94=84F85P41X,+k)+067A=A6.7(:(?-?,9&8#;&:&<)>,@/>/=0=1>2?3=29.8*9+:,:,9*;,;-B4E9>31'2(9/5+4*6-7-7.6,3,1*0,.+/)0(2&4$6 5204$<.=/9.=2D:5-60;5D@MIKIC?=8@9A8>4UbqӍh93qK@wmң10,10,0/+0/+10,21,43.54/77/880991;;3==3??5AA7DA8IE:LF:NH:PJ:RK9RM:SL:QK=OJDVTUfdqwxÏƎ{wpmid_[~UPnNJaKGXEBM?=B;7895296/85,85,671783891;;1>3M?4L>5I:3C82?82<948;47<59<3@91H3.Z1/w78>D=G8<;0<+@.A/@-<);'>*8$:'<+=.<-;.<0=3?6>3:/7,7,8+8+8+7+A5C88.1&3)7-5+4+3)4-6,5,5+1*/*/,/*/)0'2#4!541/2"6)9-:0?6E=F>@7<5@9KDNGE>;1=1<0CBLIUJYFXCYC]@_BdElJsNzO|LyHvDrN|PzHoJlVtWsQiG_H]XhHEl/*jbΕɿȾȿ65143.32.10+10+21,32-43.66.77/880::2<<2>>4@@6B@4JD8ME8OH8RK;TK:TM;SL*F@*G?*H@+IA,IB0IA4HB6HA9H?:L=:L::G77@65:65574181/907<574+C0)]82~BAGG?@44;/<+?-?->,>*?+?-8%9(:+9-9,:.:0<4>5;4918.8.9/8.6,7-C9@70&,#7/<42*3,2(2+3*3+2+/*-*/*.)0)1(4$5"6 57#3#3$3&5)8,<1?6YQRJHAC;E1:*;(:*:):(:+>0A3A6<3<6A=EEGHIMLPBF@CCIKTNYJZF\F_A_BaEiJpNwOzNxLvMwOvMtOsWy_{UoG^VkScdq삆_bMLhe΍<94;8185052+41*41*52+63,74-85.96/;81=:1?<3A>5C?4JB7MC7PG8SJ;WK;UL=UK?SJCSJK]WcnlŚڟꢩ뙛啘ݔ֐ʉzyrqfc~XVkPN\IGRFCLCBJ??K==G;:@;9:<94?;/C=-E@,F@*FA+EB/EC4CC7BC;AC>AAAE;CG=FG@HGDKFGLCHK?HG>GBCHAA=4K:0fF;PFJ@?58->/>,>*?+@,@-?-<*8'8)9*9,8-8.91;5:4:3818192:2706/<5>5912(4*;2<33*1*1'1*2)1)/)-(,(-)/)1)3(5'6%7!7 9%8%6%4%4(7+8.7/NGXPZSQIG>D9@7>/<*<&<(:'9(;*>0A4D;@7@:FCIHHGGJIKFHBDDILSQZO]L]K`D^DaFfIlNuOxOxPwUwTuTvYx]{\wSkJ_YjWfO]^kNYV`V`Y`cdǀ|橦@=6=:3:7074-52+52+52+63,74-74-96/;81=:1?<3@=4B>3JB7MC7RF8VJ:WK;XL?:6@<1A>/C@/CB0BC3BD7?D=>D@)>'<&;%9&9*2D9A9E?KHLIGDEEHGIICDEHMSSZR\O^OaH^G`GdIiNrQxRyTzTtZw`~`}VqNgQiZm]lftP^XfSaZhO^S^\]roؘB>5A=4@<3>:1<8/:6-84+73*62)62)73*84+;60>93A<6E>6I@7MC7RF8UI9WJ:XK;ZLA[NHTIMXR`gd|~ʗ㞪쩫蟡ڙҍtrhe]ZXR~XQzYQvVOnMH_C?M?:@?;:B?8>>4@B5BE:?D=:CB>FHAKTFUjUe~eqlrwuwo~_j[eX[WWWQNDA3:(;(<*=*?,@.@-?-=,;,6'6(6*7-7-8/91838495:693616183:3C<=670@7[Rlc]T?63)2)2*/)*&(%(&+(-+0,2+1'0#1"4$:(;&<(<)<*:,9+8,7-@881GAc^XQB<@;4*:&<$<&<&:(:+<0>2>4C;PJXROJ?:?:HDHGGEJKPTRWNVKXL\RfOfKeJfMlQsRvRvXwYvYu\x]x[sXnVjeuYg_m^lIXIXTeXefggeˎ赲C?6B>3A=4?;2=90;7.:6-95,73*73*73*84+:5/=82@;5D=5H?6LB6QE7TH8VI8WJ9YK>ZMEUJNWQ_eby{ɔ⛦뢣㘘،ɀuqiec^`W`V]TVPtMIbFCTBAIAAC<<:AB=FEACD?A?@DBEOMRXVcfgtt}}||q`uYkWbQXIG@99<7<7>9B=C=B[O@66,+#)#-)/-,+((0.4/616.3)2&2%6&:';'<(:(9*7)5)4(9/5-=6PJTQLHB?1(;(=&<';'9(8(:,:/>4B8OFWPRID=C;HCLHJFMLSRTWPVNVOZVfUhSiRkRmSqStSuLlTs\y`{[uUnRiTeWfTb]h]hR^Wc]iV^`_\W}کEA6EA5C?4A=2?;0=9.<8-;7,84+84+73*84+:5/=82?:4C<4G>5JB7ND8RF6TG6WG7YIBZEJpW]cssz{vpcTnG^L\IR=>60:+=)='<);):);*<,<-<-<.6*8.<1?5A8>7<3:4714.3-93A;E?B<=5<44,4+7-2', 6*G:K>@64--),*,,,,*,*)/+2.5.4+1(1'3'7(:):(:);*:*8+8,4+<4:5<7ONYWEE3/;,<(;*:)9)8(8*8,=3A6JAUKRGG>D:G>KDICLISPSTPSMSNWXdZh[pZrVnRlQlQpFjOtY{ZyVqTkWk\mYh[hbmbk`ginjm^_]W~MFlf×߹IE9HD8FB6D@4B>3@<1?;0>:/:6-95,95,95,:5/<71>93@;5E>6I@7LD7OF5RE4UE5WG8WI>XMKXNW^Zqppԕ革ꗖ⌋ׂ}yumpgf`_ZYXQQuGGcA>Q=5DH8BT=C`@EnCJOU]dgxlnoiaXxIg;U3HAPEO<<81@2A,;$6"5$5$5&7(8+;-/?0@3@36*LBJE50GFZ\IKA?2F9OBPDH7/=6.=6.=60>71@93?:4C>8EA8KC8NE6QD3RE2VF6VH;ZMGVMR[Whlk~Β㚦铕⊌نу{umkde_aY[RQsNHbWFY_CQmBLEMMTU][bZhTpSvTuPnJcCY9J/?9EDMHK?<>6G:I4?)>+=-<->/?0B4D7E:E9B7>5;26-5,3+3*1*4-7.90807/6.5,/&5+7+2#1"9)>-;)<-D7JAD?64*-*-/26755301,0*/,0-0+8191:1;2<0=0?0>17+WLaZ;6;:PQFHPQ<4:/8,9,:-<.;-;,:-<.A3H9I;D6@2>0F3;18/4,3*4+4,6-81<4=4<3905-5,7-.$;0=.1"-7&=):&9'8):/=9@@<>37,/,.+**)+(/,448899757473717-6*5(5&5(PEmcHA42CC>BVVA<>48.6+:-/=.9+<-?0A2A2@.=.<-C6D9H?PGRLOINLON^cagitnzduVjQiVoVsVqWn]nmxujsWb_m^m`or}΀|uhzjujXRM:aUGpgݿSM=RL4D=3B;3A:2@93A:4A96@;7A@;CC;IE9MG7OG2RF0UF1UH5WK?RHFXR^jg}Ēژ礧흤蛢晞⒚ۋ҆ʃ„ymczXiQ_MYIRAI>A>>A*9$2:&4%1'51<<=@7=37-1-.--/.439:;=9=2603011/1*2(1%3$1$=1j_TL95@?:=RSJHC=:36.8.;0<0=/;*?-@.?-;*;(;+<,>0>2D8LBPHNFLINLaeafhro{hxZkUj[r[r_sbqkt}vy\detk|bujwĔ|jiUIQSK>PJH@:C7F7J7J4G/C,@-SED<97>=DC@@8953C9D8C8A5>29,6)2'2(3(4*5,5.4.4.4,B7<16,6,9-9-5)1%8(1 1!9(8'4"7%C07&8*6,5.3/53:9?>LKHFBB>=<=7:26,1+1)/,./.1+4*5)7(0!.dY]S@:DC;;MMRQHE;66/8.9/;-:+<,@-A.<)8%9&<)?.7)7+>1G:K@IAIBJEa_^`djnwku]iXe^matdthpnrnspyxaqXfӭ`hPEQ9RT?kaUXO@WP@WN?UN>TK2G?2H>2F@4GC:GE9JG8NI6RJ5UJ4UJ4VK9XNDULMZTbkh{~Ñט禢줩שׁޘӦ˴ixN]FTAM=I=G>E@E@D=A==FB;4D;E<1)JEKICE>B;?;;<9B;?7D;MAK>=06)9,7+6,5-2*/*/+2/5.A58+1$2&9+;-7&2234!3"3"3%5'5)0&2)5)6*4(3&3'4)2)3.5233/2-2-4.5-3+/+,/-5.9,7(4%-3"XHYN;3NI41HHOPJJC@;6808,9+<+<*;(9&;(<)=)=+<,8,;0=1?3?3@4@5A7japic_mjqqadgmpykzhxgoeigjmnnomow{~_liwgpuapQJY:MQ8snZͶYPAXO@XO@VM>UL=TKC@DAFLAC5:,9+7*7+6-4-2.3/5384=2:-5)4&4'5'3"28$8"8%:&:+:,7,3*3.5-7+7)6&4"4!4"2$2&0+.,,-,/-2.3+.,-0.2.4*5'8'9'?.*D5>1F>VPB?BAUVRRKHC>=59.9+8(;*;(:'<)>+?-@/>.:,;0=0>1?0?1B3C5i\mdb[kfolbaklsxo~n|kraf\`cfnpwxuwy~Ydcpcn򨩲vk^rON_;SZ;us\ĸ\PB[OA[OAYM?XL>WK=VJ?>A>C>D>FB;?9<686696;6HA;15+A5K>H:=/8)6)7)7,6.507195=92*3*5*4*4*6)9*>,3!34!5"7)7)2(,%@;>8=3<.9)7$7"7#7%3$/&.'.*.-//./,)0+5-5,3&4%9&>*A/1 SE;0A;C?JITUUTSQOMJCC;<28+6&7&7%7&:'<*>-=,=,:,;/<.=/=.?0C4E7\Qg]aYlgpma`fgjqP^^kjqhmcgfioquwruouQ]Zham힡lz`YmHOd=W`Aww]\PB\PB[OAZN@YM?YM?XL>XL>UI;TH:SG9RF8RF8RF8RF8PF:LE;KGKDJDCEADABC@E>F>F?F:>?@EDA<61>:ZYAB@C=@:=8997<8A8E;:.2(/9(8)9)8.:/8091;7>80+1*3,3,4-6.8.;/6(:);+;,:.:0;685C@@<@7=19*9%:&;%<(7'1%1%1(3,1,/*2*5,7+7)5'7%;(>*;(<,^PF<3/.,@@WXusrojg^YPGA75(. 8'8(8&;)<,=-=,<-;.<..B3F7MA`Wa[pltr`a]a]dFTXeirkohlmpqvsvosgnJXRb]k攖jtYUjCSh?\gEy|_\PB\PB[OA[OAZN@YM?YM?YM?WK=VJH=HBI>@@?IE>82,C??=@@8;76715,4&5"7#:%=)8&4&5'8,:09/8->1;-8'7%9'<)<):(>-:*>2C:/-::245653;6C>KCQISHTHUG?0?.<,=->-?.?/>0<.<.<.=,<,=.A3D6LAbXc]nlrr`c`e_givmznvdhbfmqu{v|ks_jGWK]Zh≍sy]]rI^uIhwPfȿ㽻ݺ޼[OA[OA[OAZN@ZN@YM?YM?YM?XL>XL>WK=VJQI>QI>SK>UL;XM9XM7YL9XM;WK?ULGYSWe^nnjut~}ȋόԍՍӐӋʃ~x{rtlnohib{XxOqAf8W5N:HBEHBLBMBIEEG?I>JCHCCA>ID;44,I@LFBA?=;;<;@=E?G2A5A5A6G8A1;(9&<)=*<*8&:+7)0'C<2/?A/2*,1/5.81908.5*2&1#E5A2=.:*9)9+:,:,;/=0>/<.<+<,>/A2SGg^c_jinochjqnxn{r~pufkgntzu~nugpZfHYH[Wf܀kq]oZy`rխӧѨҫկֲں[N>[N>[N>[N>ZM=ZM=ZM=ZM=YLUL=XLJ@KBHEDG?I?JADFDA=HB:/7,OFB<=8641051>8E;F9D59(:(:*:'8%9&:':&9&:):,9+7+5+3+3-*+*--3.4172738587;7<9>8A8D7F5H5E*5-2124/6-8*;+=,5&8*;/=2>4=4>5A6J0/..46663-7.90:1;1;0:0;/L?F:@19*6)6(7*8*;-=/>0=/<+<+<.=0KAdZc^kiosinrzuepoytyosovxt}eobnTbH[DYQav{zk{fhṷݿԶˮǤÔɚ˞ˢΨӱٻ[N>ZM=ZM=ZM=ZM=ZM=YLVJ>XL>YN=B;E?FAEBCF?H@I@AGDA583/,*&/*:3C9C6>/;*;)<):';(<);'8%5$7%8)7*5*3*3)2*33688<4:-2(-(-+1-3)0&1)6,?*A 9/"0(.,10/1,3+5)6*6+90=6>7:4715092H=KYM=WMCWLHXNOZPX]Ub`Yi`]rggjmprrtxw~Ɋlj~~xpprjZGRB<>DE><>:>=A@CCDHBICH?>@9?6>3,7%:'<);(9%9&:':(:'9(6(2$."/%7.=593611.++()&(&(&(&*!)".'7)>!;61%6"+"*+---*',(2/6264666512./,,/,92:191SK"+#F>.&.(<7E@:7/*.*51<7>4<.5)3&5*;.;08.bXZOC:6,:/8-3'6*0%2&2&4%6':*<.=1:0C;\Wppsvx|yq|zwu{vzt|r|kxds^nJ\E\F[FVgkzm}f~cjw|vzqyo|rvuwyç͹˹ZM=ZM=ZM=ZM=ZM=ZM=ZM=ZM=XK;XK;XK;YL]P@[OC[NFYNJZPQ\SX_U^^Xfa]tedkinluqzċď}tlosgV}=E7.6.=5A;?:@:A===;<<>>ABEBFBFBC<7=4<1;/:,:+A5JAG@A=6351@9C89+5#8';(=*=*;(;(:(9(9(6&2%2%5*8.80912'1&/&-',(-*.,./*-%+$.'7%;730/-82;)0'+-//1*-:>7=4:26/40325872-;582E?E?/+2."51?:E@=83-2,60:1:.9*5'5(9+<0<29/cYXN@84+91:06,9/5+4*4*5)6)5(6(6);0B9YTljqtx||uzww}v}u}o{hvaq]nK]D\F\IYfhwobu\x]ckppmp]l]h\g^k_qeyi|ktv|}Ƿȿüμŵ\L<\L<\L<\L<\L<\L<\L<\L:>:?=B@EBEABB?;4909+9*8(9*?3F9674;7C=OEH<3#9(:';)=+=,<+:)9)7)2#/#4*=3?6914+6'6&2%0%.%-&,(,),-(+'/)6%:733%7/:4@5@9B:C5>-726;3=6=8<7=6<2;19.6*6);/@6TMgeorz~{zyzyun|cu\oYmI^AZF\LZaazeZnQhOmRtX{]}^x\qX`zM_PaUeYn`ug}jmrtxyyz~ĺȹƷ[K;[K;[K;[K;[K;[K;[K;[K;ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<]K=]K=]L<^M=^M;^O<^O<^O<^Q@^Q@]OB[OC\NE[NF\OI[OO^P_bTmdY{g^ohzu|{zxtcMlHRCBC?F=IEAHBDA@@;?6<19+:*9)8*>0D:<731;9A?D?SLUJ:+9)7$7%;)=,=,9*8)4&2&2)9/>7>65./&6)7)4*2(.).),),+*,',(1*9'<";=%A8J(6,:MY]iNZ;GD=:<9:5807-6*4&3#5#6$8&;,9=9?9@8?5<2:.9-9,=1NHc_no|}vwzzvm{bt[nThG\=VDZO\[ZhRomG_sB\yCdzIl}PtVvXrXoWmZl\obuh{loqpqtuvvvwz|{|ŸƸ[K;[K;[K;[K;[K;[K;[K;[K;ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<]L<^K<^K<^M=^M;_N<^O<^O<^O<^N>^N>\O?^NA]OB^PE^OJbNYcPdcTqeY}lexrwv}‰΂wlYwE_FTINMNLHG>EC>BB?C?GAJDIDFB??9A7=/:+:*9)8*;.?6FA=;BBAA;6JBXLK>@28(3#8(<-:*7)8+0%3)8/;4:5600+,'0+2,10203536585:.5-6/=1C.F*G,N4R:M3?>K\ihvUdCS@R3D3A3>6<99834*/$2*.(72YT\ZXVA?HFB@<7706-8-9+7'5#8#9$:(=-;,6)7.=5NGEA501->9@:815120215283:2:/9.:.6*8+IB_Ynl}~t|v~z{tl|auZpQeH]>VEZS]VR[Bbb<\p?[vCfyKn~QtVxZy_wayexhzm|qrrporttttrtw{xxZJ:ZJ:ZJ:ZJ:ZJ:ZJ:ZJ:ZJ:ZJ:ZJ:ZJ:[K;[K;\L<\L<]L<^K<^K<^K<_L=^M;_N<^O<^O<]N;]N;^O<_O?_O?`P@aQAbPFeLPeM]aOebUsh`to{t}qvˌڃteuQd?P7H@NIQGJA@B?6@5;-8(9(9)8*:-;3IE??=>782/A:ZPh[PCA35%6'9+9+7+8,0&6-;4;440/,-+--484;3=2<1=1=0<1>1A2B5K5N1N.O1X>_3HN[_l\kTcO_DX8JAQ:G2:/22-8-;+:*:/2(JBkcLGPK;9;9LJ@<707--9)3':/D;GAC=722.;7:62.2-,-,,./3171:1<1>26)4)B:XRjh|}u}w{zriy^sYoOcK`@XF[U_SNyT:^`8`sEa|InSvY{]~`gll}m|o}ponllqqrroprtvtwįξʬZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:]L:^K<`J<^K<_L=^M;_N<^O<^O<^O:_P;`O;aP>aP>aP>aPK/B7KAO@I?CBBCCABAE@E?FAFCFBB@<>5>39+7':)<*<,=1?7=:9903/24294MElah[QCD>63;7UQF@918-:,9(9(=)?'<&;&=*7(3(=4LFGAE@963073510+1-,/+-./1/4/81;1>29.3(;2NHa^yzyz|zo|euZoVlK`Ja@WEYT]MGpM1\^6_rDf~Nu[chjnsttr}pnmllnnoolknrttwǯϽ̼ɥ[J8ZK8[J8ZK8[J8ZK8[J8ZK8[J8ZK8[J8[L9\K9\M:]L:]L:^K<^K<^K<^M=^M=^O<^O<\O<`Q>aR=aR?bQ?bQ?aP>aO;bL?kMKjLTeO\dWkkexu}|xzƄ~uzmoZ[FL4E:N@Q?LAJEIBF<@?D>C>C@ABAA=>8=4?1;+8(<,?.@1A7C=7485..30:60'5)UGwj[PC7<0;07*6+:0708263320112365<%5#8"8!8 75452 9'B)G'J)M5\Fh`s^jUbP]P]KY>L0;=F6;/..(4';(?&=%9'8+VJ;2?8412/C@WSHA916*6(5%5$:(<(:&7%9*4&1%?5RJIAHB;62.411/-+22,/+.+-++-*1*4,8,=12(7.IB\Xww~}}wkz`rWlSiD\G^;UAVQZICfF-X]5Zm?b}Jt\glnrvzwr~m|i}ggikmmlhijosrxƩ˵¶ğ]K7\K7]K7\K7]K7\K7]K7\K7^L8]L8^L8]L8^L8]L8^L8]L:]J<]K=^L>\L<\L<[N=]P?^SA`SB_R?`P@bQAcRBdQBdNAdLBkKLhKPeO[f[lnkx{Ђyrsjfa`MWAO=JBLEOAK=E>F;B;?:=;:<9;6:09,6&A0<,6(A5F==57285715.6-8*<*:'6%;0SLZOE98*>.B3:-2*GB//6;7>-8BM(3&2)2)2'"*'/'/&),7!.&7,@!9Vp+B\l^iYcT\OWGM>@64=7@7>16&1!5#:';)8-7/E?;7316454DCLHKED;:04)5(4)5*1=3_Ysqxh{_t\sVnMeHc[BY^i?;\C-S[6\tBgMw]}cgjnonm~l}i|h}feflmlk~gfgimrv|¤|]K7]K7]K7]K7]K7]K7]K7]K7^L8^L8^L8^L8^L8^L8^L8^K:\K;^L>_M?^N>[N=[N=\Q?^RB_SC]QA]OB_OB`NDbPFcOHeMIiLNgNTeSag_tnoy~ǣxy|}uoid^cQZGRJSLVGP@J/8(8);.:3IE017<6A.aP@`P@]P?\O>[O?[RC[QE[QG\OG\OI_PMcQOfTTgTVgTXgV`h\plisv|ɊΘҠĪ}π䃊~zsmfiU\IQHOIRGQAK=E7=7:89<7?7?4=0=-=-<+:,B6H?;20):26/6.7,8,7(8&9&:*4-4.A9OCH:5%2#@2>5HD025;6?1=BP.;)0#&$'13-/''&%12()79*0(0295,>2A5<17-1)+#& $/*EC::,,35AB^]?:C;A9=39/=4@8@;@<=;>;A?>>::?=IDB9<45,2+1-311202020201/00.1-4-9->24%8+;0[Tzw|qdxZrUoOkIfA_?\GbTg@Hu83XF2U_<_wEfNrZu^t_xc{g{gyfyfycxbybya|bzczf{h{h{e{a{`}``jnstwuynolQcW@OL2A>^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^L8`N:aP<`Q>]P?ZN>YOCXPEXOH[QO_UTbXYeX_iYcl\fk^hl`llctokrty~ȅ֌܎ԟЭ³y{ށ|{ttdgX\OTIPDM?G-=0F:RGH?5.1)9181;0=1;-6'6&8+5-2+=4NBK=:,8*B66->:/0052:4>JVFO>E38$&/1,,22**/.9926+18?DLWbKUA9=897897838192@:MHUSMNB@7295KIMLQRYZRQYV51>6B9@7?5B9C<@;?@8=9=?C:?58>=MJ93603+3,4.30210102/201/0/.0-4-8-?36'5(9.VO|yyn~cvXoPjHfCb=\B^MdZh25k90\M8[eCc{KjPsYt\u^wbyezfwdvawav`x`x`{azczfzgzfzbz`z]|]~_gntsuqtiidPbTCRK8G@^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M9]K5_M5`P9_P;\O>ZN@XOFXQKYPQ`W\g`hnfsshysg{sg}qgolpprvv|zЄ܊ᓎ֠ulnsuovksmmlhi_`SWGM3=16*4'6*3,70=5E9F9B3A2>20&720/-0,23;LTW^Z_OS.103,-EE66,,,-=?1426bh=B)1-4&*;=AE7:379=7;/043;;GFSS`cilek^a@>E@^[hgopjjKK=;40>7D5<4:1415;-7,6.8,4,390`T>cjIf|MkSt\u_v_xcycxbu`u`u_v_w_x`{azbzd{e|d|`y^yZ{\}^agmpsr{nrjdwd[k^QaT_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N:^L4_N4`N8^O:[N>YOEZSMZTT_Zahbprmzu{u{qzpvpqtrwt|wz~τ؋ږڙɛ~{k]R@NBRIXRXUTRKM?C4:8<9;:9=8@8A6?0>/9,A65+.$I?g\dZUI<26)3):0;06,3)6-1*71;29/>0F5B39+0'4-31-.)-/5BGRW]b\a9<9<+,JK89//35'(%)WY=A9=6:#(+=>BE59,21705).47LNbeindl`i`lbkLLNJ\ZVTMMHF423/ACJJ1.3,3,5,4-4/4/3/02/2.1-0../-2-7-=1;-1$7,C=yv{qhx`rSkEb:\7Z:\HcP`JMf4+YB0_W@cjIf|NkRt[w_x`{dzcv`s]r\s\t]v^w_{azbybzb|b{_x[xYzY{Z~_ekmsus|rupomgxf_P=_P=_P=_P=_P=_P=_P=_P=^O<^O<^O<^O<^O<^O<^O<_N:aP6aP6aO9^O<[OA[RK\VV_Zakgvso}z~|}w{uxvsys}x{~ĄȍΔ͚ƠɭŦmgLF2A4A4B9HDNNJK?C=?;=;;<:@8?5>1<0:0?64,1'I?cVh[eWOB>24)7,905,2+600,4/7/7.>1C4>04%3)/*3/..-.0367@CMRY^FKQW37FJ8>A7<.6*22;=DMS_emsjsaj[gZh\fddZVWT@=104433C@JERKSLJA?7938133.70>0=*7.:;ECHAB1/4-4-5,4-3,4/4002/2.1-0../-2-7-:/>01%7,;5sqth|at\pRjDa7]8^=_NfQ[}96^<0QD1[V@]dEewMjRr[v^ya{dxas]pYpWqXqXt\u]y_x`x_y^z^y\xYxWyV{X_dhloqmxjphleey`_P=_P=_P=_P=_P=_P=_P=_P=^O<^O<^O<^O<^O<^O<^O<_N:cQ9cQ9aP<]P@ZPG\TR_Zaa_mtryx~~yyyuwww|x}ĂąȸоѻЬoT\GG5>0G?WQWVNO@C=?<==;=:=5;19080<5:3=5OEXM]OeXcUL>:-8.914-2,60402-5.<3C7C4:-3%4+-%0-0-4265./24BFX]W\ouDJHMHK;>8?>F8B.8@J_gnwkrdn^g_kco_nZe]]PIJG74/0540.95D?JDIA@86/4/7166'/0<2=+60:>E?A443.5.6-4,3*3,4/4101/2.1-0../-2-7-9.?20%6,61poncx^qZoQjCa9_;`CbTgRWb0'YD3JE/US`P@`P@_O?_O?_O?aQAbRB_O?]M=]M=aQAcSCbRB`Q>dS?aP>]P@^QI[QPZSZeapsqyxz|~}xzrslotwv|ʀʋƖäŵ̰Ϭϥϣѡ˜˜Ѩg]FzgteH?QNccKL?A99;::97561;6815.B;<3I?XKOAdVcTXIG9:/6-7/6/4/0-2,70=4<07)5(7,/$/&/)1-2040516479JNY]NS8=6-92>>HU_aihrgpdmdnao^gSSF@854111/.3194D=B:?7<4908193667<4;4;4<6;59331/3,5.7.5+3+2,2,201203/2.1//0.3.7.?58,6,/&;7XW{mf|]rQhHeDe=d;`OlTd=?P, E:&DF.MM5Z^C[iEcxMqZxbx`t\rYqYlSmRnSoTrXtZu]u[tXtWvXwWvWvUuTtS{[{]z^u[mUb~MXrCSj>?U.?U/>T.[K;^N>`P@`P@`P@_O?`P@aQAbRB`P@_O?`P@bRBcSCbRB`P@fVG_QF\OG^TSaZad`omkvwwy{}}x|qukplonquw|~ӉјΨǸźα֬ۧާݤۤأўǚԼ|dNJw}mVJ`[rpZ[KL?@>>?@;;6664=883?86.>3K@H;]Mo``QH:5)0&6-5-0)5195=7<38.5)4*5*7.5+2+0+0,2,4.5287>@JLW[^b\d]eaiOWJRNV\dhoekY_OT5:-5,6/9(5"-)69CQZ\ddlemfnem\hRZEE<7646355302/62>9>7;4:3818295:69;7:7:797965312,3,6-7,6,2+1,1,201203/2.1//0.3.7.<3=28.1*74Z[s}gz^vWoPiGfAb=cBcQhLVw<8L2#>9#=A(GG/PS8XcA`rJnXu_v]tXqVpTkOkPlQmRpVrXs[sYtXuWuWuWtTrQqRpQnPlNhLbFXu?Ni6F]/@W+@W-@W-@W-YL<[N>^QA^QA^QA^QA_RB`SCaTD`SC_RB`SCaTDaTD`SC^PCbUM\QM[QRcYbkdtqmvuy{y{y~x|nsei`gjnru}}Շٗ٩ػۥϠĚkpn`QG]Umiuu`_JLBDAD>@9:66=:;6A:707,>3=/F8j\i[[MB62(4+6-2,52A>GC=62)1'2'0%4*1).)/)2,7/=4B9-(43DCVX^bZaS[Q[EPFQMW[ektmsW],9(47ELWJSPWW__fdkaiRYCI977175<8;;955160:3;290907183:6<8999997988874402+6-7-8,6,2)0)0,10121302/1//0.3.6.90D9804./._blwcxXsQmNlEf;]=_JfUgDJk<4O>,><';?(FD/HH0Q\U'C]0D^1E_2WJ:ZM=\O?^QA]P@^QA_RBaTD`SC`SC`SCaTDaTD`SC_RB\PDZOMZQVbXcjcsqmvuxzz|w|symrbi]daglrx{ʉݕᤢᶵ۪ӧÞvqqcbWh`qmvt\]LNEGAD=?<<:8<8E?C;:0:/6)1#I;aRk\SE:,4'6+4-42MKZXKF803*4+2(.&,%,%-%1)6,;0?4/'4,:6CBFHEIGNMVQ]VbWa[dfoksV^8=27/4.6+4%2)4>IS_?IAIGLQVZ`X]GM685373;8@>@?=;957282918080717396:7:7;9:7:8:6845.3+6,7-8,6,2)0)/+0/222312010/0.3.6.8/F<913.,,fjygtdyVqLkHj@c7Y?^RhYeCBeC7ZO;HF1AC-LG3FD-LU6Sc>btLlUpXnRkPiKgIhJhKjMkPmToWpVtXsUqSoPjMgJeHdG`D]AWy=Rq8Mi6Lf6Ne7Of8Mg8Nh8Oi:UH8WJ:[N>\O?]P@]P@_RBaTD_RB`SCaTDaTD`SC_RB_RB^QIVMR_Xhnf{tpxtxwxzy{syjr`g[c_gjrv|ƀΓߞ୮份޼׶еƯy{qukrimeoi扄~trfdXYONEEA@:7;7B=E?<3=3B51#0"I;XKN@=/8*6*3*42UUkh]XD>;3;2804-2,1+0)0'/$/$0#9,4'3):5CAEGBG@HEPP[VaVa]hemW_?D;<5738282=9CHSV_5?3;6;ADJOHM;A135195<8<9;9:77370;2;1:09082736475:8;8:8:9;7956/3,7-8.9-7*3)1)0)1-323322011/0.3.6.7/C:701-13jpqzgt_tRmDf?d;c:^Gd[mV[wE>dJ=aYFTO;KI4PI6GE.GP3L\8ZlFf|NmSmRlMhJfHgHgIiLjOlSnVoUtVsUnRjLfKcHaF_FZBX|?St;Pn8Ok:Rl=Wn@ZqCUo?Up=Uo?RE5UH8XK;ZM=[N>\O?^QA`SC`SCaTDaTDaTD`SC`SCbUEaVP^Vcje|yu}yzyxyvyswjrcj[c]ehpv~ǁшљܣݯ⻿þź|yt|tqxkekenga[`[smzu{~yspdcUTIGD?>:<6A;:1C:TJ>26)9,=.?/B1C5@17-2/LM_]WSD?:48170939292:19/9,8+8)(3"@2I>D@;:7;:@9CISV_Yb]f_hSY?C@>?;@CFJLTQYT]U^3:.5.37:a7^7b@dOi\iGFjF:]L<]VCXQ>QJ7OG4ID.DJ.GU2Sc>^sHgMjOjKgGgFfGfHgJiNkRmUmUqUoQjNgKcH`E_F^G\E[~DWxAVr?Uo@YpB]rG^uGZrBXs@Xs@NB2QE5UI9WK;XL\P@^RBaUEbVFbVFaUE_SCaUEfZJh]Yngwup|x{ywxvwpujoah^f_gempx}͉؏֙ҡҪٴ޺̼Ļuoqwnoseezfemj^Yc_ZTg`un|v}wxsjf\WSNHB=6D=;4G=\R;0<07+6(>.D3B3A1A386>>CCB@=7817/7/:393:3;3>5A5E8G6-;%J8L==50+009>AJLUVaZe\dYaLR>@4/5/99?@BHDJ@I>F3;06167<6914-2142095740.,*0,3.3,=5=4=4<3:59565655757576866542.1+7.9-:+7*4&1&1(1,425342211/1.3.6.;34+:520UXpxcnZiK`Hf:b1]6bChMePYj5/^G7XK:UN;YQ>UJ8L@0ID0@F,AO.K[6Xj@bxGfJhIfFeDcBcEeHgLhOiRkSnRlPhNdJaH_F_H_H_H_H]~G]yF]wH`wKcxOczN\tBZu@Zu@JC3MF6QH9TK.E6>-2"7'E7E?973.50;5=5<4=4;4925.4+5)8+<,?-S>G2<):-=2;57443KNLQPUTYY]VXMOC@4+6+5/42141608.63>2;4?8B3>)5(3.9-35759./*+0.515/<4=4=4=4;6:676664635253455411-0(8,:+:+8(4&3$3&4*5052423/2/2,4,6.=4/&>945bgpy[iPcF]Hh=e2]7aGhJ]BFS+#XH8TK:OH6YP?SJ9E@-GF1=C'@J(IU1Sd:_rEe}IgJeHcCaBbCcEeHfMhPiQlPkMfJcIaG`F`H`I^G^F_}G`|Ia{Kd{Mf|Nf~N]xC\y?]zBDB6FD8JF;PG>RH>WI>]M>_O?`Q>aR?`SB_VGbYRgb_ojnso~wqzt|yywppgg`a\_`bfhopyz̄֍ߖ眙蠞ߡڣۤܦܥۥؤեңϢɢƟ|qo|hglc_`fZZlYUsVPUNVORIYPXP[Skdzr|uqus_]PLEAZT712*6*7(7'7&9(;+<.?18.<2?4;05(3':/@590907.7+7):*?,A/=.@4E:G+?*?)?'?&?$<#<#7&8*;,9,6.556<:84:3;4;5:595735435465454535/5,5)8,9*9(9&8&7%6%4&5-4/504.5,5+6*8,:07.:5>@mubqUjKcOi:Z9^?g@cPkIWa$#G+ A8'KD4RL[K>]M=`O;`Q<^SA^VIc[Xhcinlysotpvptppmgfaa]^\\edkjtr}{φٍ易囕ݜٝڞ۞ڝٜ֛ӞҜ͜țƚysm{keid^^e[YkZSqVM|TJTKTK[RXRXRfarjxo~wusgdUSZU2,/%7)7&7%8&8';*;-=/9,9,:,:,9+9+8+8,;1908.8,9*9(:&9&6*80=5@8A9?7<4914->6H@OGQINFC;7*7%8$7)4,//+3)7(:+@*A)A&A#@!<=:98$:);-92:7:<<94:5;4;5:595735235465464716/5,5)9*9*9(9&9&8%8%6%5+3+4,5*5*6(7)7*=14+53TXfr[oIbLhEc@_8[>aNmLb8@Y)%E3'<6(>;,C@1CB0=@-8D.:I,_?bB69.:<1??7DA:KB;OE/>/6(/":.8-7,8,:+:)9&7$5)6,8.:0=3@6A7B8:1@6E;FG=@67+6%6&7,4/03-5+9*<';'=%=#;!:77675#7*;2<7>9<;;94:5;4;59585735236475565616/5,4(8)9)9'8%8%7$7$6%5'4)5*6(6(7(7)8+=22*86lp]lQh>[Kl;\Bd8ZAbWq@Re")Q.*A4+45'56&:;)?>*>=(<@)>E&>FXa4s~Tdw`hSa}LaG`C`?a@c@hEjJkMlNnMkHhHgGhKhKfLdJeKdJcFdGfHfGeFbBcDeEhH25*58-;<4A>7G@:KB;RE.>.8(/!6)5)4(6)9+<+=*;):-:/909/:1;1<3=3D9?9;9894:5;4;59585735447476665726/5,5*8*8(8(8&7&7$6$6$5%6(7'9(9(;(:):+;13.IJowUhE^>_Cf7[A.A@+?=$A@$EF$T]0p~Mr|mjW_{J]~E_Ca@bAfCkJlLmOmOoNlIiIhHiLiLhNgMfLdJdGeHgHhIfGdDgHiIlL-3'36+891<;6B=9G@:MD=QG=SI=SK>UNDZUQa^eigumklkjhb`XVPPQQXY`cfjorux|Ђֆه؊ً֋ыΊщ҉҈ӊӉό͋Ǎ~xnZh}TZlWTc\R\`O[_HfZDzSBJDSRSWRY]dfjllvqunoh~v{~l`?28(;(='='<';':'8(7):/8.8,9+:+:*9)7(9+7+8,7+7*8*<,>-<0=0<2;/:08,7-5*@7@5=49.80;1:25,/%0)2025/8-9+;,<-?.?/@/@/A/?-?.@(8(7+70:6=8=885494:5;6:79585654448485676726/6,5*8*9(9(9&9&8&7&8&8%:&;'=(=(>*=,=.7/<8]d`oPg/=PJ(^\5ySlwo[aK^F`DcBeDjGoNpPoSoSoNlIiIgGiLiLiOhNfJeIdHeIgIhHgGeDiIiKlN+1%.4*470893>:7B=:HA;KD18*4&8)<,:,:,;/;-:/9+5+5(6,;/>4?3?6>37.,#+%-*02391;0<0?0?0@1@1@0=/<-9,9*7.;.:0:3:6;7:665394:5:6:79585654459596776746/6-6*7+8)8)9'8'8%7'9%9$<%=&?'@(@*?.<071HHgqNbHd8ZBl1\9`7WSjWfk29G)+G7:;23830:709;-5:#38BDfc:TwΗǓ}vbeQ`F`BcBgFmJrOrRqUpToNlKhHfFhKiLiNiOgKfJeIfIhIiHiGfCjJkMnP(0#+1'/4-350764<85@=8C>8IE4>1>0@/?.$?%@(@*>-;1:6U[^oGa>_:`8f5b:_GcP`@HT23C54D9=>37B36@51:8+6<"9CP\.}PqŊˎ̒Í}{egQ_E^@c@iDoJsPsSqUoSnNkJgGeEgJhKiNiNfKdIdIeHgJhIiHfEjLlNoQ&.!(0%-2+13.331764:95<;6GD=DD*;'7$4#B2OAN@B47)7)>/;+:*8(7'6'6(8*8+;.;/9-6*7,<1<271888=:A9B4A/<,;,:/;19384857563657265:8;69454476<:869796:7877767465:5:7:8995827/7+8+:*9+;*:*:(:*;(9":"=$>%?(?+=.81<>]fQgHd8[?g.\>h=[]oLU[--G83FB?@7:C49G06F21@9)?D&EV*`t?aˌɋËz{efPZ|@^?a>hCoJrOrRpTnRnNjIfFdDfIhKiNiNfKeJdGeFgHhGhGeDkLmOpR(0!'/"(-&).(.0-3317839:4==5?@8DE@JLKORYVXeZ\s]^}YX[Y^]eennwx؄⌌솇䂂܀ւӃ΀ƁŃɄΆЈӋҌϊŊ}xwozkegf]Xj\Ql\Mh\Lf^Ke_If`Hj`Gr^FrO;TA\O`YYXQTS[\`heYPD<707/:1=/;+9(:&9(:)8)8*5,5,/%3)8,>/@/@-=*9'9)0"WJK?/#=12<07,8->4C5;687899:97877;=<<::8785747575979899::9;9<9<8<7;6:8:9:;9;5907,8+9)9+:):):(;*<)9#=':#49%D3@61,_eWgKb=\3X2Y8cEi[oGQn43N3,C?6ABcAiDnImLlNkOlNiIfDcBcBfIhKfLdJgMhNgKfHeEfEjIkJqQqRrS*0")/#).').(-/,130561782;<4>?7AD=HJGOPTSUaXYkZ\u\Z^]dbkjut~·ߋ鍍년 ؀~Ҁς̅džLJɉ̋ό΍̎Ȋ|x{stkplb`d]Sc`Ob`Ke^Kf^Ki\Il]Hn^Gq]Ey]GYCXFZLVPSSRXY_USLE>9606/909,9(8&8&8(8)7)6*4,5,0'5)9+=-A/@-<*9(8)<.REH<4(:-:,4&=,<+;*;*:)9)8)6(7*8,7,3)1'1(7.<5DG8>/9/:0=.;1<6?5:3622:8EBIFDC?>:7989796858598988788999:9;9<9<7;6:596888;8:59/7+8*:*:*;*;*<)<+<)9$?):%5:'_:2H:/;=0;=2I;:U==Q/.T7/WK5dhEw[p}ǁ}xr^YuETp=\{B_@b@iCmHlKkLiMiMgGeCcBcDgJiLhNgMiOiMiKgGgFfElImLpQoRrS-1"-1#,/&,.)//-11/34/45-9;0<>1@B7EHAKMLQRWUUaVWi\Yt^]fdpnzx΍ߐꐎ튉燄߁|}ȀÆĈĊƌnjɌŌ|v{pujrndci^Xc]Q]bL]bKa_Jg\JmZIp[Hr\Gr\Ez`I{W?R=UDXOVSPTOS><<784716/6.7+7(7&8$8&8'6)5*3,5,3(6(9)<+?-?-<+8(5'J=F:A584627272728596;8;877888:8;8<8<8<8;58475777:7:48/7,8+:+;+<+<+<)<+<)9&@*9$6$;+1'40PT\iK`;U9VA]IfKdOa89f>6U?2G@0;<,86)A4+N7/H+#S<,g]B_t{z{xm\uKHb5Nh8[xB_}?c@hDlGjIhJgLfKdDdCcDeFhKkNkOjNiOiOiMhJgHhHlKoMsVsWuX24&04&01)01+12-23.34.46+9;-;>-?A3DF9IJDMONRQWSS]XVd\Zoda~nlzwÌ֑㔑ꓐ뎋≅ق||~}{vynrfpmack]ZiZSc[N\aKZbJa_Jg\JoYKsYJuZIw[FvVA{Q;Q=XF[PTPGI?A2/5/51605.5+6)8)7$8$8&9'6)6*3,6-6)8'7&:(>+?-;+8)4'UI<18,B45%=+=+8(8'9(:)9)7)6(3'6*3)2)4,:3>7?9=:45596;5;2:397=<@UVbbmjidVQA<634/61717182859697:878898;9<8<8<8<7<5:686797<7<49/9,9*;*;)<)<+=);*<(:'@,8&8';-+"54agUdH\>U>XI_QdQ_UZwFA\F9OB2JC1FC0@=*=6#=2A2QF*nkHfttsx}l[K_:AW0Lc7Wr?_{@d@iCkFiHgGdHeJbBcBdEgHjMlOmQnRjPjNjLhJgGiGmKpOwXvZvZ78(68*66,56.56056067/68+;>-=@-@C.DG4IK>MNFQPNRRRVUSYX]a_lkius}njӕᔑ␍܋ӄā}||~zwszn|relm__j[XiZSjYOfZLa`L_aLd_Li\Kn[LtZKzZK}ZGTAQ=QAVFSHH@:8431-3/5/5.3,3)5(9(8$9$:&:'8)7*5,7-;+:)6%8';+=.;.7,90\T=55+A53$:(?+:):*:+:,;-:-8-7-3*1)1+71<7>:;77475;<8>7=7;7;797:::=:=7;2;/8*:*;*<)<*<(;););(=*8'9*8-0)@CirN^H[EYI[P^U]VWZUgK?SJ9PD4NC1IC-B@'?B#AG#MU.^g.==1==3==5;<4;=2;=/?B/@D-CG.FJ3KL:NOAQQIRRHYWJZZN_^\gerqn{yďяӍϊǃ~yzwyv{w|z}~}y|tzrvksrfhm_^j[VkZRlZPlZNk[Ng^Mf_Mg^Mj]Mn]Mv\M|\MYI^OUGM@I=@78.2+2+516/5.4-2)4'6&;(9$;$;&;':)9*7,9->,;(5#5#9)<.;/7-?7[TIA:0@36&3 <)9'7'7'7(7)7*7,7-<3:293<7>:=9854196<9::8:>@PPbcppheTP=61+40;7=:;7;5:294837373556669697;8<8>7=7=6:8<898:;:>:>7<28TXfpL\J]L\N[SZWV\RaRTG7MJ9SF5M>+?396AM%Nf6lTw\edfkt|mn}\Q`Cg{HiFlGmGjGfGbGcGhJlMoPnPlMiKjJjLsTsUsSrQrOsRwUzZw[u[tZRK;RK;RJ=RJ=RJ=RJ=RJ=RK;UNXQ?YR@[TD\UE\UEb[HaZHaYLbYRe][kaiqftuj{zn|pss|puj{mbre]jc`i`_e_]b_Z^^ZY^YUaZRbZOe[Og[Ki\Kk\Ik\Gm\Hm]Fj^HjbOreTqZJuOBWJ\PZL[LN=F4<,8(8-80411-6/7.7.7.7.7+6)7)8)8)9)9)9+9+8+;,;+>-9(1 2!9*H9=,2#PFJ@F=:7487::::977493=7E>A99/2(0&4);/?3:0=3@7@:>;<999::8:8:8:999797959540516576899:9:9;;>9;99=:A=B;A6?1:)<+=*<(:&:%8&8&A0<-/#/&LJmomoVZLNNOQMUOXO]RaTjSXY/=K8EVa)Poyxs~ahL\mCYdBT]BHP9?D0:=,@C2<@1:>0]sBgHpKoKlGjIiKgJlPmSoSlPmMkJmJmIqLqMrNrPtRvUyYz^{eo\eRWN?WN?WN?WN?WN?WN?WN?WN?XO@YPAYPA[RC\SD]TE^UF_VGd[JcZIcYMcYOf[Uj_]nbdpdhreltgpvirvirsfmm`gg[_bXY^[VZZRYVOWTKXTIXTH\VH^WGcZKcZIf[Ig\Hi]Gj^Fk_Gj_IfaMogTw[MSFVMXORJREI9C0=,9)8,7042306.8.8.8.7-8-7,7+7+7+7+7+8+8+8+:,<.>.9(1 2 :)>.<.:-4*4);0E:OBQCOCF?A;<5;4>7>8:6538788898887:7>9B:@7=49,4'4&7)<-@1@4@6A7?8:787768:6:6<7:89879595:592:3:5;6;8;89999:;;;<=?=A;?6=2;-;+=*=+<);(:&8%:%9'8)5*<5QPee^aMMNLTMYP\Q^S^S_VfQ`_/Sg*^r3zOn|pbjHauBTe;JX7FP7?H59?158-:^tEgHqMpLnHkHkLhKmQnTmSmQkLkHlHmHpJpJpLsQuTxXxXx^nYdSZI]TE]TE]TE]TE]TE]TE]TE]TE[RC\SD]TE^UF_VG`WHaXIaXGe]Je]Hd[Jd[Le[Qf[Uh]Yh][i]]j^^k__k__i^\f[YbWS_VQZVMWTKUQHRNCQMBSOCWQCXRB^WG^WEaYFc[Fg\Hi^Hk`JiaLe`MqeU{^PXN[UXQJEG@A7?10>.:(2 3:&>,>.?08+2(4*<0F9M?ND;6533052:7?<><<<9<6:37366899<:@:7-8+5'4%4%7(;+=.D5C6B8?7:484657969696977779595:3:3;4;6<6;8:999889:<<@>B=?9:17+7(;,<+<+;):(9&7%9&z6#y6%9,F=SOWTPOIFMHSLYP^SaWaW_VePsrFzVn{|[[oaXIaXIaXIaXIaXIaXIaXIaXI_VG`WH`WHaXIbYJcZKd[Ld[Je]Hf^Gf^Ig_Lg^Of\Pf\Rf\Sh]Wh]Wh]Wh^Ug]Te[QdZPc[N]YMZVJVRFRNBPL@PM>TN@UO?WQAYTA[VC]XDaZGd]Jf_LfaMgaQocUw[O[Qb\[XGD=:=8<6:09-8)9*=.>/9-7,8-9-8-8,8,7+7+8+8+8+8+8+9+;,?1>.9'3 38"=)@.?-:+7*5*7+:.?=>8<481625688775713(6'5&6&6&8(:):*A1B4B7@8<5:58687687878868694:4;492:2:4;7:8:89799<:@3B%:F.=F3;A3:=2:=4<=599-?@2<>39<1<@29B/?L2PbNK:NK:NK:PMTQ@VS@XWC[ZF]\H_\Kc`Qi]QpUJ[Ricd`OMCC==:994808+<)A+A+:+7)8*:+9+9*9*8)8)8)8)9)9)9)9);,?1>0:(6"47 =&B-;*;,:,9-8.:0<0;4:<5<3938585848356<594:8:9<86310(5(9(9(:(:(:(8&7&:+;/?3@7>8<8:6977666667484:3:3<3:2;2<5=7=:><=;>=@?1;=28;0;?18A.>K1Pb9780:.>+B*@(;*7(8)9*9*9*9*8)8)9)9)9)9)9)9);,?1=/<)9$65;"A*B.@/;,7*2(4+;0=86:4<7=9>;>;>;=:<587:9>=>=>:63/0'9+=*=*>*=)<(:'8%6%8);0>3=5<7;8;787757585:4;4<4=4>5?7A:A;A>A?@=B??:@8=38-5(5'8(<*<(<)<(:&9'7%6$6%}:)t3!~9*OAYNRGOEVJYN[MZM[M\Q_T`WgW~xXy^r|ZU`B;E,/;%0;*0<.3=24<16<2?1:<17:/:>07@-=J0Oa;bxIkLuQuQtNqNrSpRrQsPrOpKnJpLsOvRyX{Zz]x]qWgO]EXB_MW~GRyBg^Og^Og^Og^Og^Og^Og^Og^Og^Og^Og^Oh_Ph_Ph_Ph_Pi`OjaPjbOjbOjbOi`Oi`OiaNiaNiaNh`Kh`Kh`Ih`IhaGhaGhaGf_Le^Kb[I\WDWR?PM:LI8IH6IH6GH6GJ9GK:HL;IM-@*<$:)7(8):*9*:*:*:*9):):):):):):);,=0=/=,<)8 49 A)C-A/=/6+/%0'6.:8596>;A@CBEBC@A??2276:<>;<9815.5)<->+>+?,>+=(;':'7%8'8+9.80:4=9?;:79595:4;4;4=4>4B7C9C9<3:/8+6(7'8):):(=)<*<):'9(7&6%}6$x3#x5%B2UEWKPCPDZLYMZN\Q\Q[T\U[VbUkbEV`=JS4=G,6?*2=,4>35?66=68?8=B;CF=EG/;9*78*=>0:<17:/:>06?,=J0N`:awHkLuQuQtNrOrSpPqOrNqMpLoKrNuTyX`~az]qUfL_G]E^IaOYIRyBh_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Pg^Oh_Ph_Ph_Ph_Ph_Pi`Qi`QmdUlcTjaRi`Qh_Pg^Og^Mh`MiaNiaLiaLiaLh`Ih`IhaGh`IgaKf_Le^Kb[H\WDUR?PMTPDUOAYL[SSOFE;:75;3=/<)7":)8'9(;*;*;*;*;*:):):):):):):);,;0:.<,>+9#37?'9#;)>0<18.7/<5?==B?DCEDC@?;7501.0,61:6<6:29.8,:+=->+?,@-@-@+>*=*;*:(7(6)5+90?9C><7;5;5<4<5=4>5@5D9D:C;A9?:;685937-8(5'6':)<*:)8&=*<+<*<)~:'|8%{6&{6&y1#8*G8SCPBL=RE_SWLYN[R]T]V\VYT^QaX;EM(6@8A&>G26BE*;:&78(=>09;069.:>06?,+?,@-A,B-@-;*:(7(6)6+8-:3<4=6=6?8A7A9B6@6@5H=E;A8;25/3-1*2+9-;*9+:*:););+<+9'}8(|9(|9(|9({8'y6&x3$w- A4OCMAL@QEUJRG\R\RUMTLZUXSWTgZ]T5IQ*AK(BK,>H/7@+2=-4?14<1HPCZ^PW[JMO:DF.AA'==%:;)>?1;=2:=2;?14=*;H.PbF7>F7=E6BF8AC5@E1HL5MI0RA'|R:ubdX`ZVTHG@>@=>9809+=,=.>-;-;+9+:*:,:+:,:+:,:+:,;.?5B:B7=/6#1125#6(;/A8E?IDJFKHBAEDB>;39/=0?1=0?1>2>0=/=/>.@.?,=*<*<+>,?+?+?,>,@.=-:,8,7+8-908/<2<2?5A7C9C9D9E8B6A4=3:06/5.4,7,:.=,;,;+:*;*<*<,~;*|;){9)y:)x9(w8'u6'w4$4'D7NCK?J>QDTIRGSJXOUOVP]XWRSOcT]W5Xc9_jBZfBIT66C)4@*0:<19<1<@25>+;H.PbMKD6=C5>E5:>-BG1IK3E?%T@'\Ct`WJdZebTSFHGHBD967+:*:,:*9,8)6)6'8+7)7+7)7+8*8,8.3-5/6-3(0"/1 3$A2C7G?LFLGJFFBD@BACA?:;13?3A4A3A4;,:,8-7+6+6,7.:/;/<,;-;,:+;+;+<,};+z;*z;,w9*v8)u7(t6)v4&;1FEI0?C(=@#:<$89';<.8:/9<1=A36?,MKB3?F44>4>4>4?5?5?5>7?;B>D>F=FM@PDSHPGMGIEGBC?A=A=EBC?>7;0=.B0F3I6E4E3B3B1@0}@.{@.|?-;,9,:+;,;,<-;+;+:+9)7)7*8,:/;/;0:/8.9/:.:.:,9+8*7)7(6)6*7+8-9/<0<.<-;,9*:*~9*}:*};+|:,z;,y;,w9*s8*q6(r7)u5)D8H=K?H:IB)=A(;='78(:;-79.9<1=A37@-NK+e>-ZL`S?44+@9YUjgeeRUINMPIAF<@6>4@6D:G=G>JAJAJBJBKCKCKDKESRTTSRROSLSLULUNLHIFEBC@B@C@EBFDIFD@=7<2>2B1D3G4D3B3A3?0>1>0}>/}>/;.:.:.:.=-<-<-;-9*8*8+8*9+:-:.:/;/9-9-:,9,8+8*8*8)8)8(8)9*:,:-;-:-:,9+8*}8)}7+|8+{9+z8,y9-x:-v8+q5*o5)q7+t9+H;IC-B47@-;H.L^8_uFiJtPtPtNrOsTpQnMmLpPwY|az`rXiQZA\EaIeMgMgKhJfLcPY{IRtBi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkaUlbYlbYlbYlbVlbVlcRlcRldQldQldQlcRlcTlbVlbXlbXlbXocUnbRkbQlcRlcRkbQg`Pd]M^WGYSCSM?MJ;KH9GE6EB3@A/=G.BF-QB-b=-E:YROJ.+<9>;TRpnvvdhX^]_UQPFG@C:D=G>GAG?HCJBHDJCJFKDKGKGHHGIHHGGHDHDGBFBBAABBABBCBB@A>A?IGB?;6=3?3@0A0C3@2@1>1<1<0;1;1<1<1=1<3=1=1=/=1=/.9)9(:*:+;,;+;,:+:,9+7)~6({5){5){5)z6)x6*x8,w9,s8*p4)o5)r:-v<0M@KN)?O(J\2_rEk~QexKXj@M_7@Q-6E&7D*=F1=D4:>07;-8:,:;-68-8;0>B47@-9F,I[5[qBeFrNsOsMrOsTpQmLoOsUx\z`s[iQ`HYB^GeMgMfJeGgGhLaNXzHQsAi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkbSlbXlbVlbVlcRlcRldOldOldMldMldMldOldQlcRlcTlbVlbVocUmaSkbSlcTmdUlcTi`Qf_Ob[K^WGXQARLB>@9C?C=C@D?CAD@ECDCADADDFGHIHJIIIGHACADBEBEAA@>=:<:EF<<63:2>4=1=0?1G]/AV-7H$1@!6B*=F5PK8MH5ID1EC.AE*GC(\A,SG\X?A13JN@E=>;GBGBC>>7D=D=D@EAEBECCEDF?C@DBEEEGGFFBC>?BD@C>A=>>>@?C@ECAB8840:4>6=3)=C5$bI3gWxmleYWOOBEBEDGFHHKJKKMKMEEEEFDHEFBD=C?>?=?=B?B?>:937090=2>3>2?2?3=2;393838192;0<.<.<-;/:.:.:.~:-~:-~:-~:-~:/~:/~:/~:/}90}90~80~8.7.7.7.~8,8,~8,}9,|8-{9-z8,x8,x8,x8.x8.w7-v8-v6,t6+s5*q5+m1'r6,n4)m3(o6+m4)q8-I=SHSJRGRHPHQJQKRLTMTK[NcQo_HYU:MV7O_;j~YbxQYoHUjCRg@Mb;IY5CR17D&4>#2:#6;'<>0@B5@@6<>358-39-4:.7:/9=/;?.=B,%Q?)kP=XGNBE=D?WVTTQQPONMMMLJLJUTIG>>=:C@FAB;>4D9D9F=E>EBBD@E?ECFCDCDEEECFDFDFDEAC@B?A>@=@=@=B?D?C<>6:090:/<0<0A2~@3~>4<3:3918190;.<-;,;,;-:,:,:,9-9-9-9-~:/~:/~:/~:/}90}90}90}90}90}90|90|90|90z:0z:0y9/y9/y9/w9.w9.w8/w8/t8.s7-r6,r6,p6+p6+k1&q7,m4)l3(o6+l3(p7,~H>RISLQJPJQLPMQNSOOGSH[K{ePsiPhkLfqQgxT^tMXnGPf?La:K_:K\:GV7CP4>2;=04:03;05;16<0:A,>D*Q[9^mDkRpRpSqRsSsVx^|exakT`I]F]F\E`IaJcLeNdMbK`I^I]LRtBIk9i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTnbTqdTo_Pm]Pm_RqeYog\ldYhbVfbWpl`{xi~{jyizubpiVe`JTT(MB.S@/U8(]7*l=3n70u91~;5@:IBPJXP[R^YTNHEC?DBGCD@@:A;BF@FCEFDFDFDDDDDDEDEEFEECECDBDBD?C>B=B=B=C>E@E?B<>5:18-9,;-@2@1~>2=1:19181:0;.;,;,;,:,:,:.:.9-9-~:/~:/~:/~:/~:/~:/}90}90}90}90|90{8/{8/{8/{;1{;1z:0y;0x:/x:/x:/x:/t8.t8.s7-s7-r6,q5+o5*o5*j1&o6+m4)k2'l6*i3'm7+}G=PIPIPJQLRMSNUPVPWO[P~^OtbNoiQorUlwYfwUQeBK_:EY6DU3EV6GV9GT8ER8?I0*7;*:<.<>0;=/9;.6<25=26<26<0:0=@-=C)MW5Zi@f|MlNnQqRuUtWz`w`nWcL\E\E\EZC_HaJbKdMcLaJ_H]H[}JPqBFg8i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTnbTrdWoaTm_Rk_SkaWlcZle[jf]jf]xtix~r}zg`cNOT>DG2FE1HC0F=,L<,VC4P9+R6*V4*Y5)\6+a9/e=1m=1LBSJVOOKFDBBDCFF@>A?B>D@ECEDEDEDDDEDEDEDEDEDEBGCFBEAD>D>CCA8;18,9+<-@0@1~?0=/:1:/9/:.:-;,;,:+:,:,9-9-9-9-~:/~:/~:/~:/~:/~:/}90|90}90{8/{8/{8/{8/x8.{;1y;0y;0y;0x:/x:/x:/v:/s7-s7-s7-r6,q5+o5*o5*m4)j1&o6+l3(h2&k5)h2&l6*|FG2:A/9=,9=.9=.8<-7;-7=36=56;46<2:<1;=/bxIjLnQsTwWxZ{ar[eN\EZC\E\EZC_H`IaJbKaJ`I^G]JZ|JNo@Ef7haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTrfXth\sg[mcYjaXle]snhzwp~wz{kcfSOR?GJ7EH5BE2BE2EH5KL0A9,A7+@6*F4(U5*qB8OHOKIGGIEIBE@BABBACBEAEAEAEAEDDFDFEFEDEDEDECFBEAF>E=E=E=E=F>A:C;E=B9>39-;..=-;/:-:-;.:-;-:,:,:,9+9-9-~:/~:/~:/~:/}:1}:1}:1}:1|91z:1|91y90y90x8/x8/v7.y:1y:1x90v:0v:0u9/u9/t:/r7/q6.q6.p5-o4,n3+n3+m4+j1(m7-j4*h2(j4*f2'j6+}D;NGNHQJTLUOWPYR[Q{YMv\OkZJ]UBYXDY^HOYA?K3:H/7E.4B+5A+8D.=I3CL7EN9BK6?H5.5<,4:,5<45<56;56;49;0:-;@)GP1Ra:`vGiKoRuVyYy[x`nW`IZ}C[~D^G^G]F`IaJbKbKaJ`I_H^IW|ILpBBf8haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTkaUndZpf\lcZkd\rmg|ľrfcTPQ?FI8>E3;D1:F28E38E38C2:B3/?/>.=-<-;-:-;.:,:,:,:,9+:+9-~8,~:/~:/~:/~:/}:1}:1}:1}:1z:1z:1y90y90x8/v7.v7.t8.w8/u9/u9/s9.t8.s9.r8-r8-q6.q6.p5-o4,n3+m4+l3*j4*h2(l6,i3)f2'h4)e1&i5*{B9MGMHPJTLVOXNYO|\Qs\Nk[L`WFVSBPSBJQ?@I64@,3<+2;*09(09(2;*5>-9B1G4:F2:C25@/3>-1<,3:33954954928919;.;>-;@*CL/O^7]sDiMpSwYyYwYqYfOZ}CX{A\E]F]F^G`I`I`I`I`I_H^G]JUyIJn@Ae9haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlbVj`VjaXkdZkg^upjμzym]_YIKL:@E1;D/>J6=H7=F5;C4;>5:;3983:70?<3E;2Q51c74GH\_`dWZQSOONKMJJGHDEADBDDDFDFCECEBDCBCBDCD@D?E?D.>-=,<,;,;,<-:,:,:,9+9-9-~8.}9.~:/~:/}:1}:1}:1}:1}:1}:1z:1y:1x90x90w8/t8.s7-r8-t8.s9.r8-q8-r8-p7,p7,p7,o6-o6-n5,n5,m4+l3*k2)i3)g1'k7,h4)e1&h4)b0%f4)zA8MGMHPJULXNYOxZOr\Nk^N^WGRPAKN=CJ:9B12:+08)17+17-06,/5+/5)08+2:+4<-9D4;F5=H7-.800621622717829;0:<.:?)?H+KY5[qChLqVw[wYsVgP^IUx@WzB[~F[~F[~F]H_J_J_J_J^I^I]H]JUvIJk@@`7haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlbVpg^ng_lgatqj}ub^\GKM7CH2AI2AI4@G5BD7AA7B=9C97A96;:5B=7G51L-+f66QRfimm\\ZWWSTNNKJHFDDCDFEFEFCECEBDCBCBDCCBC?C>C>DD69A208+/7*6<247058157247025.06,08-19,6A3:E5=J9>K9-,6..400511606718:/:<.:?+WzB[~FY|DY|D\G_J_J^I^I^I]H]H]LStIHhA?]7icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSjcSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUldWibZgd]vsnʵƶibbFEH-DH/CG0FE1GD5F<3C60F42I99A<9B=:F87K65eEFijƓ鬩ӌwp`ZVQROMLGIEHFGJKDF<>>@HJGI>@@@@@A@B>B>@<@;@9C>A9@9A9B8@5:.8*=0>/>.>-=,<+=*<,:+9-9-~8,~8.|8-|8-|8-|90|90|90|90z:1z:1z:1z:1y=5w<4w;3u:2t91q8/p7.p7.o6-m7-m7-l8-m7-l8-m7-m7-i2+m6/p92o81k4-g2*g2*h3+e0(i7.d2)]-#`0&_/%b2(s>6OJPKQJRJ}YMv_QfYITN>DE5>E5:C25@04&DR1WlChRs]w_rWkR[~DXyDTu@Tu@WxCZ{F[|GZ{F^JbNbN^J\}H_K`L^~MSqKFdB=X7icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUldYgd]onjͲcgjKLQ3GJ/EC.GB/H>2I:3L95K<9B87G>?QEE`PP|hgϲſ걨Ƀ{c]WUSSJMCEGFFEIHKKFF>?=?CE????@@@@A>A=@/>.>-=,<+<,<,:+9-9-~8,}9.|8-|8-|8-|90|90|90|90z:1{;2{;2z;2w<4u<3u:2s:1r90n8.o6-m7-m7-l8-l8-l8-l8-j8-l8-l8-k6.n70o81n91l7/i4,g2*e3*c1(d4*_/%^.$b2(^.$`0&p>5JERLXR~XOrVKdRDQJ:>?/:A16A05@03>04<14<15;17:379477577557246116//6./7,.9+1<.4A08E49H58G44E24B1.8/.5..3--2+23+46+8:-9=,7?(DQ3WlEhUt`wbpYgPY|DWxCTu@Tu@VwBYzEYzEYzE[|G_K_K\}H[|G^J^J^{MRmJF_B;T7icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUneVneVlfZed_y{xشğl`gEQX7DG,DC.JD4LD7KA8I>:D:9TJKk__vv꧟eaCDHKVYXUOLFBEBFEFFDDCD=?>@????A@@?A=@:@:@:B:E/>.=-~<,=-=-9-9-~:/}9.}9.|8-{8/{8/}:1}:1{;2{;2{;2{;2z;4x<4t;2q;1r90o9/n8.l8-l6,k7,l8-j8-j8-j8-j8-i9-j8-j8-n91m80m80m80m80i7.f4+c1(d2)a1']-#_0&c4*\-#_0&sD<}PJVP~YQpTI^J?OC7?<-46(2;*0;+1<.2=/4<14<15;17:379479668357257227007/08-.9+0;-2?.6C27E48G48G49F54>33:2/4-,2(/0(13(57*6:)6>'DQ5YmJkZwfwflZ_KWxCWuCTr@Tr@VtBXvDYwEYwEZxF]{I_}K]{I]{I_}K^|JZwKNeHAW@6L5icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSjcSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUneVneVneVneVmg[jkfڴefmLMQ6FH0HJ5KI:HD9D@7PFDj`_㍌ddDBSLUNRIHAHBMJJG?>>>>??>@?@?@?A=A=>9@:C=E?E>A9=5;2<1=0>/>.=/~<,=-=-9-9-~:/}9.}9.|8-{8/{8/~;2~;2|<3{;2{;2{;2z;4x<4r90o9/o9/m9.l8-k7,j6+h6+i7,i7,i7,h8,h8,h8,h8,h8,m;2l7/j5-i7.j8/j8/f4+a1'e5+a2(].$a2(b3)Y* a2(yNE\VvWRiNGWC:I<3@:.:;-8<.08)/:*3;.4??@@B?B?B?B=?;A@9>5=3<1<2=1=0=1~<.=/=/~:/~:/~:/}9.|90{8/{8/{8/|<3|<3|<3{;2z;4y:3y:3w;3n70m80l7/l7/k6.h6-h6-h6-i7.h8.h8.g8.g8.g8.g8.h8.k92h6/f4-g5.i70h70e4-b1*c2+b3+_0(]1(]1(V*!b6-{ULtYRaNHN?8A7.=6,;9-9;.9<139-3;.5;/6<06<07:/58-47.69049238139/39/2:/19.19,.9+.9+/:,0;-3>.6C2:E5Qn>Qn>Qn>Qn>Qn>Sp@Sp@WtD[xH]zJ]zJ_|L_|LZwGRlEAR?6C9+8.gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSicSjcSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVneVofWpgXpgXng]lnmz׹ĥregOMP;GK:FM=GOBJRGz{sþԏdQK:UFXJGC?B?B@B>B>B>A=A6<5/95,;8/8:/57,36+69.5;/7:/69.69.58-57,36+28,19,28.19,19.19,19,19,.9+.9+.9+/:,0;+3>.6A17B2ex\umtlf_RwKBh9KkVsCZwG]zJ^{K_|L_|LVsCNfB;I80;3&/*gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSicSjcSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVneVofWpgXqhYoh^hikmtzƯ}un[ZWFPQCSVK[bZcmdꨐoYWDUERFMAJAG?E?E@D@D>C=BUrDYvH[xJ]zL^{M\yKQn@G_;6B4+4/"(&gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSicSjcSjcSjbUlbVlbVmcWmdUmdUmdUleUmfVngWogZnh\oh^mjekormtzη|ubb_NXZL]cWmwn|}ɸqUGUHUJE;J@G@F>E>C=BG>G>C;>5:2;3>6=5>4>5=4<3~<0<1<1~:/~:/~:1}90|90{8/{8/{8/z:1z:1x92w81v70u6/u6/q6.m80k90j8/j8/i9/i9/i9/h8.g7-f7-g7-f7-f7-f7-f7-f7-f5.j81m;4k:3j92j:0m>4oC8l@5oD;d<2c=2zVJdZyWMbLA>:13814927<54:0/5+25,9<336+25*24)03(13(25*46+47,.6),7)/7*-8*/7*/7*/7*/7*19,08+08-/7,/7,/7,08-08+7?09B14)//%%heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjdVjdVjdXldYlcZmeZmeXmfVg`NjeRnkXol]he\feasqrԶ|qtY_dMbkXr}lצ`XD=KBOEG=C9D;H?I@H@G=G8H8I8G8E5B4B5C5C5C6A4?3>2<1;1;191~:1|91{80z7/z7/w7.v6-w7.w7.w8/w8/v7.u6-q5+n3+l7/i81i81h70h70g6/g6/g6/f5.g6/i70i81h70g6/e4-e3,h3-j5/m80k90j:0i;.i=0kA3gB2jI:dH:v_O~k\xjoRJ=79.4:04:039/39/39/28.28.17-17-36-06,25,/5+14+/5+/4-.5-/4-.5-/4-/4-/4-/4-05./4-/4-.3,.3,/4-/4-/6.1;23=26@58B79D67B45@03>-4?.DQ=WeN[kQPbHEX<@T8BW6Ic>Ke>Kf=Kf=JeOj?UpGYtK\vO]wP]wRWqNHb?;O6%0*&+.$),heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjcYkdZlc\md[meZmfVidQjhSmjWjk[gg_lll~ЯvkqUYaI_kUtoᄍĀwPFNAL?K?J=D8=4?6F:F7J7L:I7F6C2D6G7D7C8~B7|@5~>4<3<1<3}:2}:2z:1z:1y90x8/v7.v7.u6-v7.t8.t8.t8.r6,o5*m4+l7/i81j81h70i70h70g6/g6/e3,e3,g5.h6/j81j81j81k92k60l71k90k;1k;/j>1j@0iD2gH6kP=gRAufSuesrKL<69.39/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4.05//4..3-.3-.3-.3-/4./6/.80/:21=34@66B66B66B45B16C1CP>P]IR`IIW@AO6BP7EU:Jb@Jd?Ke@Ke>Ic6I5&1-',0%*.heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjcYkdZlc\md[meZmfVmhUkiTmjWjk[kkcwwwۿʫyuy`kpZt{iםK4z>4z>4x<4x<4w;3w;3u:2t91t91t91r90r90r90r90o9/n8.l6,k5+l7/j81l71j81k60i70i70h6/g5.g5.f5.g6/h70i81k:3k:3l;4j;3i:0h<1k?2jC4iD2fE2fI7lVAjYGujVm{mEF658-28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4./4./4..3--2,-2,.3-/4..5.+5-+6.-9//;12>24@46B47D38E3?L:ER>CQ:;I28F->L3DT9J_@Jb@LdBKc?Ia=G`9F_8G`9RkDXpL]uS^vVZqTPgK=T8.A.&1-',0%*.heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjcYkdZlc\md[meZmfVniVljUlkWlm]pqiؼǫ}ſ迭nO?P@YKN@D8E:A6F;I?G=@9<4>6B<@;B4e=1f>2hC3iE5fG3cG2cJ6hV@i\IskVozpq_9=,47,28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3-.3-.3--2,-2,-2,-2,.3--4-*4,)4,*6,+7-.:.1=14@25A36C2:G5N4DX;?6s>6r=5r=5r=5p>5o=4n>4m=3l<2k;1j;1i:0i:0j:0n72p62p62m61m61l71i70i70l;4k:3h91e90e90e90e:1d<2fB6cA5cC4dD5dG5dI6bI3_I2^L6eV?jbMrmWor[`L3:(28,28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3--2,-2,,1+,1+,1+,1+-2,,3,,6.+5-*4+*4++5,.8-0;-2=/2=-5@/6A05A-1=)1=)5A-8F/=O5@T8FY=H\@J]?I^=K^>K`?TgG[pQcvZauZYkSJ]G6G4&4%$-*$),"'*heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjcYkdZlc\md[meZlfVjgTkjUlnYorasvmθκƶø̦jWZFWEL;F:FF?B>=:;9;9=<>=?=}@;xA5o?5o?5o@6n?5m>4k<2h<1h<1h<1l<2o83q62p62p62m61l71j81i81h70g80e90e:1d<2e?4f@5dB6^B4aG8cL:dM;cM8`K6]K3]M4]Q9bX?mhRss[nv{eFO:4=*39-28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0*+0*+0*,1+,3,.5.,6.*4+*4+*4++5,-7,.9+-8*0;+4?/5@/4?.3?+3>-3@,7F/9K3@O8BT:GWL=K>K@I@E>?:;7=9>:?9@:zA:uC:qE:qE5j>5n=6o83r73p62p62n72l71j81i81d8/d90c;1d>3d@4cA5cA5_C5ZE4_NnlUtv^|kcmU2>(6B.3;.39/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1+,1++0**/)*/)+0*,1++2+-4-+5-*4,*4,+5,+5,,6+-7,,6+/:,2=/6A17B27B15@04?.2?-4C.:G3=L5AO8DT:JX?L\BTbI\kTcqZ^mXUbPDRA2>0#/%&/,&,,$**heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjdVjdVjcYkdZlc\md[lfZlfVolYmlWjlWgkZflbr{xخr[YDT@Q>RAQBM@D<=5>7?6>8@7}A7wC6tD8sE8q?8q?8s>8q?8q?8q?8q?8p?8sB;qB:o@8m>6l=5j>5m>6o>7o83q73o83m82m82i81h91f:1f;2d>3d@4bB5`C5]A3\@2WB1TG4[S>f^Gi^HbX?ZS9ZS7\W:ZV;XW;kmUsw^u}fUaI&28D03;.4:04:039/39/39/28.28.17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0**/)*/)+0*+0*,1++2+)3+*4,+5-+5,,6--7.-7,,6+.8-2<16A39D69D47B46A10;+2?-5B09F28u@:u@:t?9q?8sA:q@9q@9q@9p?8n?7o>7o>7k92m82l:3l;4l;4h<3g<3c=2c?3^>1dG9cG9T=-N9(M8'@1WQ;PN7KI0OK2]Y>ieJeaDVU7XX<]`CosZzfdlU=I1-9#2>*4-1=)2>*9E/BN8IU?O[GVbN]hWYdTLWI8u>9u@:t?9o=6p>7sA:q?8p?8p?8n?7o>7m>6n=6m>6k<4l=5m>6k?6j?6gA6eA5bB5dG9[A2^G7^I8N=+F7$G8%>6!LL4GK2DG,DD*MM1\[?baC`aBYY=dgJsw^sy_X`I:D,/;%7C/6>16<26<26<25;15;15;15;15;15;15;14:04:039/39/39/27127127116016016005/05/.3-.3--2,-2,,1+,1++0*+0**1**1*)0))0))0)*1*+2*,3+.5--4,.5-07/4;39A6?F>BJ?;F8:E57B14?.3?+6B.F2v?*u>*vB-yF3xG6q?4n<3q<4tB9sA8o?5qA7xH>n>4m>4m>4k?4l=3j>3l=3j>3g?5gA6gA6gC7eC7cC6`C5^D5bK;UB1ZI7`S@RG3C;&E=(FA+AE,BH.AE*<@%?B%NN2_`AijKaaEnqTvzagmSJO94<%4=(=F38>28>48>48>47=37=37=36<28>48>47=37=37=36<26<26<25:449349349338238238227105/05//4..3--2,,1++0*+0*).().().().().(*/)+0*,1+160/4.,1+,1+/4.6;4=BK:4.8/.5..5.-4-gdUgdUheVheVheVheVifWifWifWifWifWifWifWifWifWifWkeWkeWlcZmd[md]mf\mg[jiWkmXimVjoYjs`hthm|wڻּҼyvR2f>2f>2e?2b@4bB5`C5_C5_C5[D4ZE4WD3XI6OB/\T?oiSc^HMK4IG0IK3>D*?H-@F*48>47=37=37=39?58>48>48>48>48>48>48>47<67<67<66;56;56;55:45:438238216005//4.-2,,1+,1++0*+0**/)*/)+0*,1+-2,-2,05/.3-+0*+0*-2.2718=9;B:@K=@M;@M;=J68E13@,1?(0>'4.:0-7//6/.5.gdUgdUgdUheVheVifWifWifWifWifWifWifWifWifWifWifWkeWldWlcZmd[md]mf\mg[jiWkmXinWiqZgs_drejytܿչйѾϼзvavWChI5hI5mL9pOA.:>-;>39?59?58>48>47=37=37=38>48>48>48>48>48>48>48>49>89>89>88=78=78=77<67<66;55:449338227105//4./4.-2.-2.,1-+0,+0,,1--2.-2.,1-,1-,1-,1-.210513764;4;G9=L9@O<@O:8F71?2-9--7..5--4,fcTfcTgdUheVheVifWjgXjgXifWifWifWifWifWifWifWifWldWldWlcZmd[md]mf\mg[jiWkmXinWiqZgs_bpcgxrڽѵ˴˺ѽͻsucz]K}^LtUCaD2W:(Y<*[>,X=*`E2`E2`E2_F2`G3`G3`G3]H3\K7\M:\M:YL9XM9UM8RL6QL6NL5QQ9ikS|gmqXSY?FL2>G,48>48>48>47=37=38>48>48>48>49?59?5:?9:?9:?9:?99>89>89>88=78=78=77<66;55:4493382382/40.3/-2.,1-+0,+0,+0,+0,+0,,1--10.21/32/32/32-4-3?17F3=L7@O:?N7M:MJ9BC3=@5;A7;A7;A7:@6:@6:@69?58>48>48>49?59?5:@6:@6:@6;@:;@:;@::?9:?99>89>89>8:?9:?99>89>88=78=77<67<6495273162/40-2.,1-+/.+/.,0/,0/-10.21.23.23-12+1-+9*/@-6H2;M7=O7A6>A6>A6=@7=@79?59?59?5:@6:@6:B7:B7:B7;@9;@9;@::?8:?99>79>89>7;@:;@9;@:;@9:?9:?8:?9:?98?87=94;4382160/4..3/.3/.21.21,2.,2.+2++2*,4))6%$6)=!2F+8L1;O6;M5;M5;M58J29K3;M5H&DK*FM+DN)MX0KW/FQ)CM(OV4^cC`cDZZ>YY?[YB_ZD_ZF_XE\UBXQ>UN;KF3GD1DA0A?0@>1>>2??5?A6E=8B:7A97A87?45=03;.28.160.40/51-7/-9-.;)0@&6G'7M';V+;X,ZUA[VB\UB\TAZR=YQ6:@6:@69A67B47B46C26C2:B79A69A68@58@59A69A6:B7:B7:B7:B7:B7;C874>63=40>-3C)9M*BY/Ga1Op;Ln;Li=Fa>BY?[S>\T?YS=VP:QL9MH5GD5DB5CA5?A6=>6:@6:@69A67B47B46C26C2:B7:B79A69A69A69A6:B7:B7:B7:B7:B7:B7;C8F;C<>E>9C;6@74B19I/BV3Pg=XrB^J[}JWtHMhECZ@9O:6G54E28K5/9./6.,3+YgMZhN\hP^jRblTdnVhmYinZklZklZmj[liZnhZnhZog\oi[mgYkhYkg[kg\jf]jf[hfZfgWfgUafP_hUdq`p}tѾ˸ŲüĸƸ˿ɉlPJ0RM0TM0TM0TN.UO/UP2UP2TP3SO2PO3ON2QM2ON2OM4LO4LN6JP6JO8GO7JS8GP3FO2HR0LS2NU3U[7[cZT>XR6:@6:@69A67B47B46C26C2;C8:B79A69A69A69A6:B7;C8;C8:B7:B7;C8;C8=E:>F;=G<=G?>H=>I9@H9?G8?E9?D==D=9C;6@74B19I/DX5Ri?[uEYzEWyFTqEIdA>U;3I40A/.?,6H2@R8K^BReGSgKOcGAX>6I31;007/-4,YgMZhN\hP^jRblTdnVinZjo[mn\lm[nk\mj[nhZnhZph]oi[mgYkhYjfZjf[ie\ieZhfZfgWghVafP^gTdq`p}t}пɶıþʾöʊmQK1TO2VO2WP3TN.UO/VQ3VQ3UQ4SO2ON2NM1QM2ON2OM4LO4LN6JP6JO8IQ9LU:IR5JS6NX6QX7RY7[a=ckDbsyosxZZ_APP8NN6NI5LG3NG4QJ7VN9XP;XR6:@6:@69A67B47B46C26C2;C8;C8:B79A69A6:B7;C8;C8;C8;C8;C8;C8F;=G<;E=:F<F7=E6>D8=B;:A:7A95?64B19I/BV3Ne;Uo?St?Qs@Ol@E`=9P6.D/,=+,=*1C-:98876677766554/.//002235435I[l|}ufTMLMOQMN[qxfZVZZ[.//0344466668888776666778888888855544433666666643334455555678899>?@BEEFFGGHIIJLJKNU^is~µº|bLA@>=<:98866635221--//0011565546:DTcq{}xo`QLLLPQLGM^juxzwk`WT]]]--./013433444466443333445555555533222111444444444444455555667899<=?@BCCCDDFGHIJIJMRYbju}ŹľtZE<@@?>=<9864423110-,--//013554247=NYensyzuk_TOLNNMJGGKM]`b`ZWUX^``,,../03322333355332112333333333322221110333333334444444445567888;<=>@AAACCEFGHJHJINV\dnv{;ºoSA9@A?><9874432200.--..001123342148GOX`emy|wnd[RLOLIHHE@;BDJJIKOV^``++,-//0011112222221111221111111122211100333333334443333344567788:;<=????BBEEGHJHHGKQX_fnv|ƵsWC<>@>=:98644311...----..0001220/24?DKTZdu~tmcVLKIGEFD?;:>DGGJNU^aa++,,./00111122222110011200000000222110002222222233333333445667889:;<>>>>BBEEGIJIFFJOT\bjqw}ѿu[GC;97644321/...----..00/02210038;CKS^tzriWIEGDCC@@>GKQUSRTY^aa,,,,--..//1000/////////0///////////0011211111111012333333333456789:;=>>>??BCDFGFGHJPTX^bmt|ȷ~jVILJB<976343110/,,----////001111144;ACJ]ytj_ZLHA>?ALUbnvrlg_W[`c,,,,--../.00////....///////////////0001111111111001233222222345689:;=>>=??ABCEGHHHLOQVZ_hpwIJmZNLKE@=841220//.../-//////0011111259>@@ACDEFHIJLNQT^eoxözmbSQKE@;510/..../0/////./.0/0////27639Hb{}kXSYZ++++--..--.--,,,,,,++***,,,,,,,,,,,,,+++,--..////00000/.////01349:;<==<<==??@ABCDCDEGHKNX_ir}~tj\VNE?<7600.///1211111/1/202000028516G`z{gTQUV,,,,..//../...-----,+***++++++++,,+++***,,,-..////00//.-00/01234::;<=<<;=<>>?@A?@@@ABCFHQXalu~ypd]RJB>:9321//012111110001111///28535E\uwdQMQR,,,,....//////../..-,++*+++++++++++***))++,-..///////.-,00001244:;;<=<<;<<>=>>?>=;;<=>@CGOYdnx~~~xjdZQIC><6430112422222000110000016544AWq{q_MIJL.,...../000000/12110/,++++++++++++-*,))(*+,,-.//--//.-,,12223456;;<<=<;;<<===>?=>=<99:;?CJT^hov{~~|||}ztgb\UNG@=8853223420022222331100014444?Tm~vlZJFFF/./000123446543455432100..--,+*).././...//-.--..--.//02224568::;==>>>=<;=<<;=>>@BB<9546;@GOV[afmy{~vpvvv}}|rnha[YZVOIB@:53331/---/13344320////10//000112344776555776632000//--+))./////..//..........//135578:;<=>>>>>=<<=<;;==>@DFC@=<;>AFKPV\agpxwwpmrrquumd^YYZXRMEA;5321.100013444320/-,,220-8SoxqhYMF@;1111224455888776887643211/0/-,++/1////..00///000//000/12679:<=>???@@?>===<;;;;922333455679::999:998544433110.--020000//110011111111123399;<>@@ABABAA@>>==<;;<=?BFMTXWQKD><@HT`eiku}}zxzxxuv{{rlhfgd`\QLB92.,-58874320,+*(''%(.10.8Piv{y|}yz}}}~~}|}zuneWNE?94445557788;<<<<<<<;;876656632101244422223333223333335566;<=?ABECDDEDCB@@>>====>>BFNUZYSLD<98556677889:=>>>>>??>=;:998898745466664444444533444455889:=>@ACDGHFFFFECBA@@?>>?@@ADKQVURKD?=?CISX]dlv}~}}}~|y~|{z|}wu~zvmh`WPHB@=<852/,++,-/34663???@@BBA@==<<<<<<;99889888866665566775589:<=@@ACDGHIIJJJIFDBAA@@??@@A@ACFHJJHEEEFIILRZdnz~ثurqrv|qtÿzwpkg^XPHCA@;842..036:>AECFLV[`gijlgflonnrsoorwyxususnibTMHE?778889::;>=>>>>=<:;::99999766666777569;>><<;:8877999:<=ABCDFJKLNNNNLKIHEEBA@???@@?>>AABCDDFEEEDDEEEEEDCCDCBBBBAA@@><;;9877999:<>ABCEIJLLNNNNMJIHEECB@@@@AACIKVjt{yr|Ǿгye`kuwñkHTMHJKKOU[cginzztrppquwwwsxzy~zrmh`TNRVV8889;@BCEFIKMMNMPMLKIHEDCCAA?@@DSRiĚģ{vzͻƔ}jhuǦr]XWQB:?LVaehq~wxurrvyzzzpg^TPRXY7789;=@ABBDDDDEEGGGFFFHHLKJIHGFEDDEEDEEE@?=<;:::99;;?@CDFFJKMMMMOOLKJGEDDDB@@ABFQXɝ˱ľȧwx~մ|hXPG?;AQ_go|}z||zz}sh]SPPVW6678:@@CDEEGGGGHIIIKLLKLKLKJIGGFFEEDCAA@@=<;;;;;ACDFHHGHIIJJMMMLMMNMNMJJIHGFDDCCA@??<<<<<<@ADEHKMNPPOOOOMLIFECBAA??@@NoĻҦӯhisyʺte\[\\^55555689<=@BDFGHHHHJJKKNMMMMMMNNMMKJHGEDCCAA@?<<>><=>ACDHILMNPOOLLKLJIFCA>=?>?@BDGJLOOLFEHJKMKHC77>>:CežɻŒͻyrp{wv01356788:;=?ACDEHHHJKLMNKKKPWYVROMHFGHFBDA??@@=;===<=>=>BDGJMOPLA?EHJJFCA<=EJPdŷ˶sʳ/0124577::<>@BCDIIJLMNNOKNT_imlk`YOHHGE@C?<<=>>=89;<=>?@EGILOPPL<:>ABC??@?AFHKMOOPLB?@AA@><=FPXkĽȾǾhqɺ11001245789;=?ADILNPRRSQOVfw{pi_UNKE?;9988678;>?BCGJKLMMLLMLIC?<879@HZwžlɾ64311234678:<>@BJMORTTSRQZlxnf]VMD>;;75468CAKfĿҿ@=:75556779;=?@BJMRVWXWTS^pyj`XRONKF@??@ACCBB?><;AGPY_ccef_jĺ߾BA@><:876678;>AEIMRUWXZ[TXg|th]XXYVMC??B>@B?<:>AFUelwŷƭCBA?=;:97778:=@DHLQTVWYZUWeyuic``]VMFBA:999:<>@EILORUWWXX^p}upf_YQGA=HT`nºƿȱhNMLJHFDC?>===>@?CEKNQRVVZV[l~{md_YRNW_m¶¾YnQPOMKIGGBA@???A@BEKMPRUUYUZi||somijyȾΩuRaSRQOMKJIEDBA@AA@ACIMORUUWRXj}¿¿ģjIXuVTSPOLLJHFEBBACACDJMOQTUUQWj~ǿþӤ`ERkXWWUTRRPMKKHHGHFGGJNRUUVXUZk{ʺͿ¾aJMsYXXVUTSRNMLKJJJIGHLORSVTXUYk{ջĿv^NSu\[[YXWVVSRQOOOOMJJMPSVVTWVZkyľƻlYOWw\\[ZYYXXUTSRRRRPLKORTWWWVU\jyƺ»ĽǽjUS\y\\[[ZYYYWVUUTUUSOOQSUXYXUU\hu|~пľs]^hɿ[[[ZZYYYXXWVVWWXQQSUXXYXWUYenu~~xrloκƼܴqoyŲ[[[[ZZZZYYXXXYYYSTUXYZZYYUX_djsyzz}ysnioɴþ¿̿ٽ{Ļ[ZZZZZYYZYYXXYZZVVXYZZZZ[WW\^bjqttx}}zzxt|òüʾĤ~ʿZZZZZZZZXXXYYZZZZZZ[]^\\YWWXZ]``gjprxžǵȹо}~zy|ZZZZZZZZXXXYYZZZZZ\]]^\\][[YZ\_^aeknuǽͻɺÿ¿зuxplhgkqy|ź\\\\\\\\ZZZ[[\\\\\]]]^^\_]\[Z[]\]beiq}εɿü˧nhmt{}xq`_aenu}Ʒ[[[[[[[[ZZZ[[\\\]]]^^^^^^^][\[\[^bdgozſ߿ƾÒo_\dltvromlou{Ʊ[[[[[[[[ZZZ[[\\\]^^^^_^^^^^\^]^^bccelx¹Ⱦ㼃b\[fntxywyxz|ϼZZZZZZZZZZZ[[\\]^^^_^_^^]]^__`abeeabht{}ɾɾ½Ĵºy^`anv{~}|}¬ZZZZZZZZZZZ[[\\]^`^_^_^^^_`aaaadhgcbjv|ǽɺıɽp\_fu}׼[Z[Z[Z[Z[Z[[\\]]^^^^^^^\`aabbaabkjedkx}żͻһľñѿעfXZbt~|}˶]\]\]\]\^]^]^]^]]]^\\[]^`_`bcdddkhefnxĹŸ¿żվ؍\S\gw}~}|}~|]]]]]]]]^^^^^^^^\^_^[[\^_]]_`bceigegnyĺ¼׿€XR[esxw{}}|||{{{}~|}}}|}vcS]]]]]]]]]]]]]]]]^_a`]\[[[[\\_cfggghls|½¼ߥuXU_frutx{{yyyxyy|zz{{{{{}yoQ@2^^^^^^^^^^^^^^^^^`a`]ZYXX[_beilklloryƿǺþIJ·׈k\[cjstuwyzwvwvxx{zzzzzzz|~tiPC8^^^^^^^^^^^^^^^^]_`_\ZXXY`gnsssqoprvzɻƴrb`cfktuvxyxuuuvwx{zz{||yy{}{rd[Q________________^_`^[YZZ_hrz{{zvqrtwz~ü˸Ѻɳ͠fY_cfktwx{zvsrstvw{zyz|{xxz{~|uog________^^^^^^^_aaa^[[\_ks}}{xssx{~Ū½úй͵}^Q[]ejrvy{xsppqqtuyxxyzyxxy{xple________^^^^^^^_cca]Z\_aty~yywwx}Я¼ѶbYJUXciqvz|xrnnnortwwwxywvvwyz~~{ri_\V\^``___ab_]]acb`da]^[Zesyz~}xrltvѸؽǻƹ̿щPEDMZ[cqxxtrqlmnortuuttvwvvut{{zumbXS??>[^```_`ab`_`bcb`f_\^admvw{}xqklnu|Խʶʹƽ¶wL>=GPX`nuvtqpkklmprsstuuutrqpnlhbXNF@@@@Y[^^^^_`a`_`aa`^b\[ckqvyyyxne`jr}˹·ǻқkO>;FHQYgrtqmkiiikmnpquutrpmkjea[ULEA>CDEWZ\^]^_a```aa`_\ZZbjqvxzwsmb]alx˼úɾÇeZHALFLSblpnkighhjkmoptsqojged`]WRMLNOMNOUW[\]]_a_`aa`__^V_ntxxxysj`[_jvξįثwdaTKPGGLZfmmlhfggijlnotsnjfca_ZXSPORWZUUURUXZ[\^``aaa``ba^jy}zxvsjc[]hvŴ||x¸İȋj]]XQOIDGS^gjjggffgikmmqojgc`_^\[WVUY]^ZXXNQUWXZ\^abba_afhnu|{wvpja^_ep}uwszĽ̮ƻ۱j^XUYULI@AKXbfhfecceghiknlhda_____]]]`cc\ZZJMQTWY\^dedb_aglwyxtrtlbZ_fmv~fldl|{꺾ȽɔSXTOYSEG=@IS_egecabcefhilkfca```^^_`adff]\]DFJPRW]_`a`_bgoswz|ypg`\`foyqhcflsŻaGAKROB;CC=8:<>>Xswhaa``achjklnkhghhfdedcdffebceh25;AGKRVXYY^ciorrj`WTW\alr{~ykc`bm¿āNH628>A?AETpj_]_abfklmmolihiihgfddeghfdgil-38P^yoa^`cejopoooligiiihfedeghgeiil+.48>BHKNNOW_fggb[QNR[eluz{|~md\YcvľݹkGG;8:953Bfve``cgmrrqpolhfhiiigfefhiifjkn(+/37<@CIHKR[ab`_ZTT\gpv{~wu}yke][dtTCD>B@:69P}{g_^ciossqonkgeghiifddeghifjlo&(-137:AHOSXZ\^dku{tldcbefilnqyઃ_H;;IUQTWdwrYT\_bimlkiigeccgihgiiiggflmpor--,,/1349<@EKQUV\^fpz{unic]]agmprrz{ľ¿ʂfUG;8ANHSg\HN[_chljhgfddcehkkjiiihghlossu200012349;?DIMRSX\dnzyrmkic\Zagosuwv{ȽѾžαw\OJF@==AQnlKALW_dikigdebcdgjlmnjjjhgimpwvv76655566;=@DIMQRVYakuzrmjijfa_dintz}ĹϸúDzgSPNIB?AM^xuR?BOVbeijiebcbfgikmnojkjiijnrxvv?====;;;?@CFKNQRYZ_gq{~zy{||zvrmjkllkgfgjnv|̸ƱTMSM?9ANlwnQ<9AOWcejkieaccijlllmnmmmlkmrs|{zDDDCCCBBDEGJORTU\\\air{ytoprvwwtsrmljkmooonmklou}Ͽ̾ƾʶNKPLEGWi}|XG96:=JWehllicaaflmnlkkmpqppoqtw~{yIJIIIIHHIJLNRTXY][\^dnx}}uokijmmmlkjghhknqqppopsw~ξʫӸ¹ȷTCBHXn|nuu[;45=<9CUgilmjfbchlonlijjsssrrswzwutRRRRRRRRUVWXY[\\baabekquz||umec`__^^abegikkmmjjrquͽ·ǿͽX=8V~h\YTH?:@<:<:AR]gpoljiglmolmkmmqqrrtvyz{oeWWWWWWWWXYY[\]^_dcccfjnprtvvsmgb^ZYWXX\^ccfgijkjfowξ»ķѷ`S^zjaTJF?95:A=:=:@R^gqpnkkhmnmmkklmpppsuxxxndZ]]]]]]]][\]^_`aaeeddefhhijkkifb_ZWURQSWX^^acgikieq{ȹzysz|[?AA?:6659@=9=9@Q`isrpmmkpqonlllnpppuxyuq_VOaaaaaaaa_``abcddeffggfffhhhhgedc]ZVRPPTUWY[]adffgow̹ʻvsN/-3:=;::<9?<9<9?Pajtsroompspommnpqrty{wmeZRMccccccccccddeffffghiiihgjiihhhhhd`[VPNNNPRTVX[]_cip»οŹu{]D2$-059<=::9>;8;8>Pbkutsqqorrrpmmpstvx{zqdY\UQeeeeeeeeefffgghhghijjjjjjihhhhijfb^XSMKIKLLNPQST\_d|Ƚµû}t~~yrU;/00346<@?<78>:7:7=Obkuutqrprsrpnpsvy{zxqg]X_WRggggggggggghhhhijjjjiiiiihhhhhhhfeb\WPLIIGGGHIHJRY\i÷ǽǿ}xxkVJ=624568=CEC@;7=:7:6=Nakuutrrpqrqporuy~zqf_]^aYRhhhhhhhhghhhhhiimljihgghiiiihhhhgfeb\UPMEDDDBBBCJTUYes̽ļ~|{{yaE68><3-17BGHB?;7=96:67244HZWMDA=:>;:;4;Pclusrprqpqrrsv{xj`^afhd[Tiiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjhhggd^UOIEB@?>>=BA@HMR|żоù~|{yxwuw]X_ZI64=>:BIET¾ñ~}zzwvutv~lL6=Lee]PE?=:8;89=6?=;7:79=7<:8:68>7;L_itttrspnmpw|zriZ\aegghfcYRiiiiiiiikkkkkkkkllllllllllllllllonkllkgd^YSMKGE@=BQbͼ~{{{zxxwsporv{f`E>?J_keXM@67==:78:68>79I[erssrspmosxzsi`Y^egfeghaXQiiiiiiiikkkkkkkkllllllllllllllllomklmlifb^XROJIA;4356:<>>Q^kppqssx|xk`]]\`acedb`^]RIiiijjkkkjjjjjjjjkkkkkkkklllllllnqommqolhfp{~zpeTFCMSU]lnu~ó~~~~~~~}}}}|{{{{{zyxxxxttssrqoojomklim}~toolfQKEDEGGE?<97:<;96566:<==MZflnqutzwnc\\\Z_abdca_][PFiiijjkkkjjjjjjjjkkkkkkkklllllllnromkklljjx}`ODFHFLVPRVY\aemɺ~~~~~~~}|}{{{{x{yyyxxxvsssrqoomjolhkhl|yidd\NEA=:999877666:;<;:888:<@CG@Shƶ~~~~~}}}}zzyyxvvtwuustsrrqqponmljhlifhei{|sk`VPJ@43200259::531334489;;CO]ipwywqfZX\]]^`````_^]UJAhhhiijjjiiiiiiiikkkkkkkklllllllljjkkuθy_K@;>==;;:9:?EQcȼ~}~~}}}}}}zyxxwtsrtsrqrpppoonnmlkigkhehbfzxrk^RKC920110//0249;=<;631.01279::?K[hqwwsg^UW[[[]____^^]]UJ@hhhiijjjiiiiiiiikkkkkkkkllllllllpnlt}^KCAA@BABCA;BGLfʿ~}}~~}}}}}{ywxutsrqrqpnpmoooonmljihfkhcebexzqhZI?>90/6455420016:=><721,.0168:::54344676431/..26::841*,-.47::6DWhswrk[XTTWZ[Z^bb^\_`^SF=iiiiiiiiiiiiiiiikkkllmmmmmmmmmmlgogLGEGHILKBGQ`|ɼ˿~}|||||||z{{zwuusrnommlllljllknonligecd_^b^`p~rdQ>:6534457777541//.1489844...-24897DWhtwpgYWTTVYYY[__\[^^^RF;iiiiiiiiiiiiiiiikkkllmmmmmmmmnnleyҼ`QDDJLKIDTk꾱~~}}|{{}}{{{{zxtqronllkljjjjijjnmmmmifcda]_c\_s}~p^O?42012445777655200.026788943/,/1566DYkwwl_WWTTVXYYZ]_]]_^ZNA6iiiiiiiiiiiiiiiijkkllmmmmmmnnnnmjζfMFHKHDPjȰ~~}}|{{~~|{{{zxroomlkjhiiihhhhhmljijjfaea]abYayviWI@:80/34556676643311./0257;<972-./244E]r{wfUSTSSTUVVW[]\^_\WI=1gggggggggggggggijkkllmmmmmmnnoonqʶ}YGFFCAb鶤žɽ~~~~}|{{{|||{zyywnmllkhhhihhgggghkhfgihebcb_]]Vb{taNA=;993356675464333211../036:<=:500/112Gbw|q\JOQQQQQSSW[]]__ZRA6+gggggggggggggggijkkllmmmmmnnoppnlzűeMGFGJzԵŸ~~~~}|{{{|{{zyxwunlljiihgggffffffhhggghgfae^\`aiuXE<9;8536576655321211111.../0367<:8542100HeutfRBKNPPNNOQVZ]^__VN;0&gggggggggggggggijkkllmmmmmnnopqohmuZPS[c귨³~~~~}|{{{{{yxwvvsnjjjjhhhgfffdddfghiihijlgkbaoxtnC548841255544443/.0...00100/01349:;::62/2IcmfWI?HLNNLLMOUY[]^\QG6+"gggggggggggggggijjjllmmmmlmnonomkm|bX]m|Ǽ~~~~}|{{{zzxwvuuqmkjjiiihgfgffffffjmkjjmolodczyb>3474/2932201244.,/-////100///0079<=;82-2Jch]OFAHKNNKJLNTWZ[]ZNC2)hhhhhhhhhhhhhhhhjjjllmmmgjnohfsպq_brףþ~|{zzwvwwwwvuqnliihhgggfgiihgeehjmkjiikgjdv~R7443332211302/1//././///0//..///136897534DW[PE@BIKKKJJLOUY\]]WH;%&$hhhhhhhhhhhhhhhhhhjklmmmijmjgl~̴kY_tĤ¼ÿ~|~}}zzyxvvuvtttromlijhihggeeghjjjkklkkkjjigkguK6333222111100///////////0/....//./1466656CPRIABEJJKKIHIJSX\][TC6&'%hhhhhhhhhhhhhhhhhhjklmmmmkmjkwɰuktדνù~{zzzzxxwwutttrrrronlkljljkiihggfghikkljihkjiffljuE5222111011100/////////////.--./.++-/24678?EC;8>DJJLKIGFGRX]^ZP=.&'%hhhhhhhhhhhhhhhhhhjklmmmnlllpDz跔ż|ywuvvvvusrrqooonkjjimnmllkiiljhfffhfjfefhifcchisp94211100011100///..........----.-*)*+.1456:<8228>DEKJKGHFSX`^ZL9)&%#hhhhhhhhhhhhhhhhhhjklmmmlknot·ĝü|wsrsqssrrrponmlkjiijnppmmliilkheeeedfccdddb_^ejr[32211100011100///........--,,,,-,,+**+.0225651158=@FHJIKKT[caYJ6&$$"hhhhhhhhhhhhhhhhhhjklmmljkloṣ}xspppqqqqpooonmkhhhloqppmljihgeedefd^acdc`]]]bmsvF43222111011100///---------,++++,,.,***+-.-045433379@BGHMMU\d`XG4$$$"hhhhhhhhhhhhhhhhjjjklmllllkkly򫏪zuqqpqqqqqppqpnlijjnorppnljiddcddcc_Z_ghc^[\]]nt|c263333222111100///--------,,+**+,+-+**++,-,/26775424:=ADJLT\c^UD2#&&$hhhhhhhhhhhhhhhhjjjklmllomjgfrت}wtsqqsqqqqpsqomljmooqommihffddb`]\WT[fibZZ\ZXksuU&83443332211100///--------,++**++,+)*++,--,.2699760259<@FJR[a\QB/"*(&hhhhhhhhiiiiiiiikkklmnmmqkkkjpytssrrtsuutqsqqqpnookmlllhgcc^dcTNM@WPKO]ieVX]ozd=-245444333333211101100////,,,,,,++.--,--..+-059=??753129BIOV]YLLGDDM\b`YdssX:/7666655555554433322211100..--,,++**)))*+,.-.049?B;:7436<@LSYWL=1+,+*hhhhhhhhiiiiiiiikklmmnmkmijkiqߨvuvyxqnqtsoqxnmmkljljggggec`^bUZ`RCEFABA<84235DKQQH<2...-gghhhhiiiiiiiiiikklmmmmjkijjhmvuuw{}xkb{sqsogdgiiigfffebb`__[ZWXO\ocMII>?@<:;99887778888888899988877654320//--,++,--,,,,.034;=@@<7426:@B?81--.-ffghhijjiiiiiiiilllmmmmjkiigbgͳz}taWY[X```_```]\\\YXURQNQi|mSF><<71-,.-ffghhijjiiiiiiiilllmmmmjjhhfchteb\^\\]]^^\YWWVUSPNMP`fUEA>>==999:::::;;;::999;;;;::::87431/....,,++,)$)28;;;;89;<<71../.\]_`beghfhhhjkklkjmlmjhffgfbcr˼VXUSWWUUTTTSQRPPMKHGJFA=>DFDMKFCO^`ZY[___\XUKGDA@>??<::99777:998899:::9:;<=>87775321./--.067;;<;;<==:?DDC@7.-,)YZ\]abggggiiklmmljklkjhehggfjySTRQUUTTSSQQQOPNMJHEGEA?BFJJKKRY]WSSUVZ[\\ZYRPKHCAB?=::97766:998899:::::;<=<=<<<<:98743039BGOLLFB<;:=DJLKH<3++(YZ\^acghiikklmnnlkkkkjhehedgoPRRRTUTUTSQPQOPMMJIFHECBFIOQPUgwpXLNPQTUWX[\YVQMGDC?=::97766::9999::::::;<><@?@@A??>>9649BPX^[WMC964==<>>@???=9649DR[YWTI>30.6@KRSOA610-YZ\^bdijmlnmnnpomkjjiihfga^dp}þQTVWTUVVUSONQOOLLJJILIJNQR[csZPNNLNQVXXVSPLIGC=::97766;;:99:;;;;;;<=>=;:<<>=>=:7549BNUSQOE9.,,1@ABCCDDCBCCDE??@BEHGFGGEGGGHEFCDECB>=;::??>>=<?@?>=?BDDD?AFHHA835553100022211001/0////..,+*)(.6:BIMOWdot{yaKDJGHQd}|gWNRQQ//000122333333331100001100000000..---,,,-------.+--./011334456779;=?@ABBCCAAABCD>?ACDEECCAABDEFCEBCDDB@?;::@?????@@@AA@A@A>?>>>=<===>?@@>>>ADCDACFIG@946654211122211001/0////..-,*))-48>EJNTalr{u[HCFGHNYok[SSRQ../000112222222210////0100000000.---,,,,-------.-./00112333456678:<>?@@@@@???@ABAABCCCBA<:;=@DFDC@BBDCA?;:;=@A@@=@@???>@?@@AA?@@>>>>====>><<==??A?>>ACDCDFIJG@:577644322222121110100///./.,**-259?EIO[fmw}~mVEAAFHHK[tzi[SUTS-..//00011111111//....//00000000---,,,++......./000112222234556679:<==>>=><==>@ADEDDDBA?999<@EHFDABDCB@?;:;>AB@@=@@@>???@?@@@@@?>>>===<<==<<<>>?A?>@BCCBFJLKF@:789775433222221122211000010/,+,027;AEHR_isy}wfRE@@EFCBL^ny}zobYTWVV---./0/0//////////....//00000000..---,,,////////11111222223345665689:;;;:::;<=>@GHGFEDB>;::=BFJIGDDEBA=<::>>?>?????>>>?>>>=======<>>?BA@@ACBACHLJE>95987654432333222222221100211.,+./59=@BKZgpx{sdTGBABAABFKPcfif`[XXYWW,,--.///.......-..-,,-..........----,,,+........111111111223455545677999999:;<>AGHGFEC@><;;=@FJJHEFEC@>:;:<@CC@>?@???>>?>??>?>>?>>>>===<=<<<<=>?BA@BCCBAAINNG?;69776443433433223333322111220.-..448BCB@GMQQQQUWYYX++,-..//---------,++++,,++++++++,,,+++**-------.1110000011234455345666678889;<>@EFEDCB?==:9;=BFFFFFEDC@>:;>=>=????>?>>>>===<<<=;<<>=?CBABCCCCFQXXRIC?9776543333433333333333220121/../0038BBA?BHMQQRVXZYX++,,,.//--------,++**++,********,,,++***,,,,,,,,/000000011233455234555558888:=>?CCBAA@><<988:=BBFEFGGFCB;;>BDD@>AA@@@??>>@??>?>>>>>==<<==<<<<>>?DCBCCDDEP[ef_UMI987644333443433333333322/0220///,,07ACDEQW^`_^^_[ZZ---.----..-,,,+++++++++,+++++++++++,,--.--------,-./////////012402344555455679:<969889;=?>AACEGGEC@BDEDBABA@?>==>?<=<>===><<=<<<:;=<<=>@AAEDEIGDEMZfqsrj^QLF>85433344421112222111122111110+/34;Omznb[IB>>BIU`q}yuk_ZZ]------,-.-,,++++****+++++++++++++++,,,----------,,-.//....../01201244554444568:;>>=>=;9777799<<=@ABDEFEDDEFGFCBBCB@???>>=>===>>=<=<<<;;<<===>@ABGEGJIGLTdq~|sfXNIC=:841333210001211111122111110+-25?Vrytn_ZUW^gvteXX[-----.-----,+***+***))))++++++++**+++,,,,,,----.,,-....-----./01012334444444679:;;<=;:7666579;<>>>?<=<=>=<=<<<;;<:;<<<>?ACDJHHKKLS`sqcRNID@;611100/////0//////0000000/++/6E^z~}~{hVWY........--,,*****))))(((*************++++,,,,---+,----,,,,,,-./0123433343323467899:;:98576689:<>????ABDEGHJIFBA@AA?>>>=><======<;;;;;;;;;<<>@CDELHGJLQ]j{mZUOID=7310/---./........///////-,*-6Jf|fVUV////....---,,+++***))(((*************)))*++,,---+,,,,,+*++++,-/00234332222112356689:99857677:<>>@???@CCEEGHGDA?@@@?>=<==<;<<<<<<;::::::::<=?BDFHKHGLPXfvue_ULF@:810-,++-.-----.-.././///-,)+6LhzbTTU0000////...---,,+++*)((())))))))**)))(((***+,,--++,,++*),,+,-./01134322121001244579:987555689<>=?>??BBCDBDEEB?>>??==<<<<;<<;;<;;::9::999<@ABA@>@BB@>=???>=;;<<;;;;;::;99:99988<=@BEIKMIHJS]h{xrh]TLD?740+(()+)))))***++,,,,,+))-6Hc˽s]OML/0//000/000///.-.--,+*))))))))))))(((''&()*++-..,,++*)((----./013344321111///0123679::86212369<;==?@@@?=<>BCB?>>>======><<<;:;;;:;:;;:::>>@CFJMOIIP\hu~ypg]RIA850+(()*)**)))))**++,,,+)*-6F`|nZLJH00011121233211//00/.,-,,,,--,+))))()))**++,--.//--,-./..-,-./112445554322110/001/1368762-)').5;;:;=????@?>=<;:;9@<8>>;?;?DHLMONLTcq}ztneXK?90+'''&))('&&&&''(()***)+-/?\z|kZRIA0111221233443200//...-,,,---,**()((())**++--////......-.-..//023555554332100//01//234320,*)*-39=AAA@?=:;9<>@AAA?;;<=>@?@@>=<;;:<9=;9??9:=@DHJMOMJTfw{woaVIA80*)((('''&&'''(()**++-.,-:Xx{jZMD>222233334455542100/./.,---.--,*)('))))**,,.../////../.--.001134566776544210000111/.,+***,.--.024:;;=<<::<=>?AABC?=>>>>==;<::;<==><;@BBCBAA@@??><;:8899;<=>@78<;>A@BDGIIKNPQZer}}vg]PD:4/*%##$%'),*++,,,-,*+++8Uq|k[G=755566666778999774433321112210/.-,+++,,,,////11222222111145467889::;:985533222233420,('(,257631//:;<=<<;:;>ABCC@@BC@><;98678:<=>>908?55BCEGIJJLOU^fmry~qhZK@6/*'%&&'(+,++++**))#*06CZp}{k\E:46677887789:;;;997765654444543310----.../000122333344454567789::;<<<<;976554334556521.-/158997622235678767:<>?@?AAAA?<:98789;<=><53MYA9FKGJLMMPU\ipruu|}thZM@6/+****,----,+)('((3>GRbqy|l\D93788899899:;<<<;;::98887777776533///000111122334444456989789::<=====<<:87877667786788988988989996//369;;=A@=<:<=@?@>><;:;:;<==<;91=l[DLNIMPQSUZdqxvsmkotwk]OC:210//////.,*(&$&5CQYbmw{{m]I<688999:99:;<===<<;;;::99899998753001111121133344445589:;;8:9;<=>>>>==<;989987789989;<<<<;6666789656;@DHJLQLD;779<<=<;;;<=>>>=;963)?}hHKHLQSVVZ_fqvsk_TQRoyynaRD;410//../0/.,)(')BQ^elu{~|m]OC<:::::;<<<<==>???@@@??>>=;;;;:;::8887677777655544666778:;:<<>?@@@@@?><;;;989888995D@:@60<4640/6==DNPVYOA;>98537>?==>>?@??A@@@??>>>>>=<<;:999988997766654466677::<;;=>@@@@@@?=<;;;:99999:::8/.7:;EDHIHJOPODBBC>77=C?@EGFHNKG@87=>=+(9KLO@A`Y@Ta[\hlfccfaXC.'(*05?LRTUZbeilptvx|yvqkea_aTLHDF710168:>EOZafrymaSPO999:<=>???@@@@??AAA@@@@?A@?>=<<;::::;;;<887655446657799;;<=??@A@??>=<;;:::::;<<;E33ALV]`BIMORUPLAB@?;78=E>7:>ACC09DKMKA786103?@AAAAAA@@BBBAABAACBA@>=<;::;;;<<<9887655566778:;<<=>?@@@@?>>=<:;:;;;<<=><8+;UUVVK4:>BFJC?BFB@?>BDGB<;<:639987=JTX?4-6HPB4;/98F]XWWdpofcmuUF><@C=7B<7642383568:=?@CC@?ACGJQTWUVcfY1018>@DFJT`k||tldXWX7789;=>?AAAAABAACCBCDDCCCBA@==<;;;;;;;;;9998766577788;;<=>?@@A???==<;;::<<;<=??=64M^NA7'28:=AE??=;9:;=GE@98CMSDMTUK@53493;9A[UNbj`ZdpmF<;>DIJILD:7414:9:;;===<<;;;:::99876677789;<=?>?@AA???=<;;;99;<;<>??;9GZXD94,28::=@;87:97:BEE>?<66>DG:AFD?;409IUP?2071=.847hlWZVQ[jgSE><>BHPWOD;62/279::;=?CD<>?@@>=@ACCCDEDDFFFFEDCCBA@AAA@?=<<<:::988778888:;<=??@A@@@?===<;:89:;:;=>@:2KT?101229===?;768648@C@BA<8:CDA@@7,$',1,057542347377?aeVLVdcRBE?>@??EMJ?86526;::888;=?@@ACDCCCIDHMMXa^kqo]C6AUe}źxsojih66666778;<=?ACDEEEEFFGGHGGEDDDCCCDBA>==;::::97777789::<=@?@AA@@?>>=;98788:;==>?9=]Z8/2/3:CGFBB=:9;:7=648G?:997:?CA?;::;<@???@A@BDOVLBVif^`hppf\Y~ʿ{urrpn12357888:;=?ACEEHHHHJKLKJFDFIID?EC@ACB=9<:978774:999::;;8647:>8;B@8;BjK76768=9<@A=967678<@BBA>=<=CF>299997642./1257:;:34886BSNS\]P>8?@C@><:;;LKF>;EDDD@<=BFA;:=DIKNNQROOZg]EV^[u\rɺ}{}./2456779:=?ACDEHHHHJKMMJIJPUXTOID?=>?=;:977888644579:<=??@@@@??@@<96434<;=?:6AJP;26:79>;AB@?:;:<=ELNG???@CCDFB>>BFC?@BFJKHGJR]`XOFDDI\jGyƲ./0134669:<>@BCDFGHIJLLLIKR^hmkhYQG@>=<:::7789:93469:;<<>??@????;=<:75427981+.:E:219<78<;=AA><:<<<99<>>LG629668::8630..12687859>=69A<>EKJC?CCDB=:8:;8DNI@>BHA@CGE@?ADCCFIKLJBDHN[bWEMV@Gyy@{Ͻ../0124589;=?ABCEFHJKMLLJP]lzuk_SLE@?=>=::999884,)07=67:??98;:<>@>==>?=989::9;;BE>129546776310./02465204<=9=D56;DMKC=@A><:89;4?HHB@FN??BHHB@AACFIMOLH?JOIMWWOKN>b9Kwƹ00//0134789;=?AAEFHJKMLKJTdxwmd[PJGB=75655789;<<=?>:889;<<9317>=8;<@A@<;>8:<=<;<=?>:778887AC813754346551////024541/269:?EF@<@KNE;=<<;9:BIJFCC@BEJNOLHDNPHJVWQGHXH/j53200123678:<>@@DEHKKMLKLWi~~vkeZTKA<:765567:<>@?@ABABA?=:766789<408BG?4;>??89:99::<>;9889867C@0,7<2322332/-/.014565733358:;::::>AA<?BCGJKLKJJWlyqcVNGCB?=:99;=@@ABCCCCA;=@DGHHGH=:FPJ?8>>>?@@?<8899889;::889:76<>924;<311121/-,-/13567798644787NXZQGD@><<<:9;>AD@@FIHGIFBDLQOLKDDFINOOPUTTY]\SJYWO^NVVYc=:7422234468:<=>BCFJKLKIJXmyi]UPMJGB=::<>@BCDDDEBCHQ[acb_XJHSXLA?B@A@AA=77888678;77789986A838==952000/-,,-/245778787679744Nd`OA;9>><;99<>DAEKLGEHICEMSROOHGGINQRTTZ``VNQZ]fPXSZOS\r>=<:8643223469<>@CFIJKLNIRd~reZRQQOH?:;?>BEDBCFKUeqruwo_[XWWNA:;<=?@@?=;6667789889:9668:C=7@[l]?322/*((+-021014:;<<<:987@8GcXB@4:<<<::<>>CPXO??HHGJPRNKLROKJMQRRXYY\][XVeY_^IITXfg?>=;9765333458;=?BEHIJKMJQb{qe^WVTPICAA<<>BCBA@B@816I[@6+)-/,(04663226:;<:975495=PTLB1;=<;98::>BOWRDCHLJMSTPNOVUSRRSSSLT\`[URTWT]]RW]V`\AA?=;987443458:<>BDFGGIJKP^uum`]ZWRKD@5EWcsz{vpcTGLI=6:==<;:;<<<<68<:7439AEB=<4472,6GK@4-,,,**/2541137:::;:884<:<;:6555579;>@DFEEGIMNZpymg`ZXQG>58=@CO]glnoiaXI;3AE<8@A;655578;<@@@?=964.-.3:<855,)7B?4.FIH<-#'/-/2310/079:<>?@@6LJ5GZIA<;::::99<>FOPHCCHFJPRMKKX[aaXOMNLOSRTZcifbbegjjh^F]HGFDB@=<8766679:>ACEDEFHMMWkukea[QHFCBEMU[ZTSTPJC9/9DH?>GI?>=<>?BDEEB>;653314798765/57219>;7Wa;;PFP<:89:<;;:FEIPRNKLZ^fh]PMOSRQR\giee^^jskeneGV{KJIGEC@@;:9888:;?BEFEEFHLKSixupg__WPOSTPHAAEEEA;6JIB89AD?EEFEFGGG>;8434468<=<9557.;=1-7=:98:=@<3,,+*+/489777776555PmH4C>VA>86:<>=9=;:9:9;@CEGGFFHKHRgymcXQMIA>>AEJKGDAVH<68;98:<;:874243333568==;876433346=>92:415<=73---/49;9200112131=jT9@:RJC:68;<=;?@?;;;<>>DLPNLNaahohZU[[_bk}v\ekbjiQUgONKJGFDD@@<;9::<@DFGGFHHIGQhf]RJB><=@CFJJGC@SD9>D@85CDCA>96223455444B<6699518119847C786535:?LHB><72,+),/14570.d]@D;MRH;689;:<@A<89GKIIJa^dnk]X^adhnnpxaXhQTaOPNNKKIHCCA@>?>@CEGIJJJKNLTh~iNFA==>@@==F;DE1JKC>;<=;@A<9A;B@3OC?;888:;E=FVBBURKC=998;;:<>?@>:;=>??BCimbkobksonka\cnwuyYccr_ZsPOOMLKJJGFECCCCCCFGIKKKKMMWi{s[FDA?>>>>><8?AC<9WB>;9669;H;5AKH=86776579=2354469>3345772,@>=<977773/.../.,055349>A1S;ACJTUSOJC<86777:<>==:;<==?CE\galpafjP^jhcfouroQZazmd`wPPONMMLLIHGFFFFFEGIKLLLKLMVhy|sfXH>DDEDB@>>?:?EA6>ZA@=:899898:89;>0133468;6:;;::;8C@@=99:;<711131/257757;>;<^F3.@Wurj^PA5.888;<==<;<<<;>BFM`apt`]]FXikhmqsogJR]tjhg|PPOONMMMKJIIHIIIGIILMMLLKKUet~}snf\NA;;CGIIGB>=B>@I>2CUDA?>?@DF=859==;<:;;;88898412341/0696339>8775457:=8458:98>;879<<:>:>C/:255;CKQSTU??<=>??><<<=<=ADLbcnr``_imndbmuvk_GKZyruwOOONNMMMLLKJJKKLIIKLMMLMKLS^jt}{tnhibXOA85:BHLMIE?>CCAI;4ILB?;<@EGG888998:;;=<;86652.+/3642.352..5:0033579<866:>AAAGA;9<=<8:70C2?/*15898521EA=:99::;=><<<>ASgcjncjnnrpfgtungZHHWNNNNMMMMLLKKKLLMIJLLNMMNMLOW_foy|vpke_^UNJ@64:@FJKHD??AFAH:7OB=615>EFD9:::89::9::97533**-.123577988755*-1468;=58;=>=>AJGA<998929@D0.46379:;;:;LF@96678;=>=<<<=KdckoirueotooxtebTHDQvNMMMMMLLMLLKKLMLJJLNMMMMOMMRX]fqwz}}ytomie_OHEGB:6:>BEFEC?@@GAG9:U>8/*/:CC>;;<:;<;8578753323684-((+-)&),* "(,0135669=>:759HKE=636846C82 8614456657YRH@;;<<9;==;99:>>ACDBC?@?><7:<;99:::962./7=961+(&&&&!"')!%""+-*,266661.,/9:9S"+F..<535;;8bZC6:83602246:<=:C\psxyqzwuvtrkd^JEFFgMMMMMMMMKKKLLMMMLMLMNOOOPONNPSUX]dilqz}tlosgV=76=A?@A=;<>BBBB<=<;::AJGA65@C958;==;;:99622588921/-,-..*%$'%-2)'-/*:742/0282;8EE/2"5?E=326::9559<<9cX@49:6954456566;BYlqx|uzwwvuoha]KDFIfüLLLLLLLLJJJKKLLLLLKMNOOORQPNOPQRTY_clw~}vosuhQ=66=DEB?=::=@BAB;99989?FD97;COH39:;==<:972/4=?946620.-,,,(')%%/459:5-2/.-../40=6;mC//:@A<75566668;<<;`T<0;>;==<=<;966;@Tgoz{zyzyunc\YIAFLazzKKKKKKKKJJJKKLLLKKLMMOOOQQOONNOOPTY^hu|{zxtcMHCCFIHEA@<<>ABA@?<9:98>D<3;ADSU:977;==984229>>5/6742..,,*'(*'"%8(,M]N<:)*-020+(072CsV>G=<:87643568;<9:=?@?<:99=Ncn|}vwzzvmb[TG=DO[hmsyz}KKKKKKKKJJJKKLLLLKKMMNOOONNONOPONPTYerwv}wlYEFIMLGEECB??ADDB?A=::98;?F=BA;JXK@838<:78038;:60,02123355.-/1.*,4:3>\hUC@3336984/2.7Y\XAHB<76897589:=;67=NE51>@852258::9:68I_n}~tvz{tlaZQH>ESV[bpvy~ƺJJJJJJJJJJJKKLLLKKKLMNOONNOOOPQPLMOU`otqvteQ?7@IGABCCC@@BDDB?@;8998:;I?=72AZhPA56997806;;4/--4432110112551.1>3N_\TOD8A:2/28;::2JkLP;;L@77<<:;;:<>93:DGC72;:22,,.37:<>64BXj|uw{zri^YOK@FUST`s|²KKKKKKKKKKKLLMMLKJKLMNOOOPOPPPPNKKNTapvsuqeR>/7A@?BCAA@?ACB@>>97:<<=?=90/49MlhQ<::76847961/1120-+&# '+/1,*3BC_gUJJA1@7-(.8?@?:Y]GD6;UF98:99=?<;=73=LGE937501,+.148;>93;Nayyz|zoeZVKJ@ETMM^r~JKJKJKJKJKJLKMLLKKKMMOOOQRRQQPOLMLOWeu|xz~umZF4:@?AEB>@BA>=?;80=6/.4;?=98V;?42CWH96655:<:7941?RIH;241-2,+++-148=27I\w~}}wk`WSDG;AQIF]m}ͿKKKKKKKKLLLLLLLLJKLLLNPSSRPQRQNLKKO[k{yrjaMA=BEA=>;;:;<;:96A<6AF=787568<:6;SZE8>B:2G/67-B(&))"'',!&,!V+\^YTOG>6=@>615:;87E;365DLKD:4545<9/(-9CHPE700211/0000259=2>=_sxh_\VMH<>B^?C[tKKKKKKKKLLLLLLLKKLMNNNQRSQOONPOMLNS_o~xy|ui^QGJLG@<9:9<=<:;88;:I076.?%$%)+*((+$%%;2?#haZVNA;=7BG=/'&'-:TH54=WGGA93677=95248?EJA600200010/0149=3<=^vsd\YTLD=BJS=C\vo_LLLLLLLLLLLLLLLLKNPPPOORQQOOPQTTTV\iv}~sfUIHIGA=778H0561B.)#$1-'&1(7*(2Q;Y^UNLE:7>5>A<71+&$/E:,3A^?CA=9=@@@=>A>:?IB<521310000/0149>48;[z|qdZUOIA?GT@8F_wcOAMMMMMMMMMMMMMMMMLNPQPNOPOQUXXY\^`ckt~y{tdXOID?<679<@@@?9>=FRH5198;=;66852=NK:8B6>/024JF>3$/,2*/92+8DWK<@B>9879889@MUMB79KMQYRY5>B@?BC@?89?:5>M963343200/0//048?659V|yncXPHC=BMZ29Me{bRGMMMMMMMMMMMMMMMMKMPPONOQPW`fhggglpv|ulnuvsmh_SG<7569<@AA@7@:;R\M;979>=64637=EFBA>070-,3LWZO.0,E6,,=12b=)-&;A7397/4;GS`ie^@E^hojK=4>DC><:45-,.,,9J333354420//./037?828N|~ulaUJ@;:DPW.>Tj|wkaNNNNNNNNNNNNNNNNLNNONOSTZbmuuqpptw|~kRNRXXTK?489:=@A?>9A5.IgdU<63:;63617;9>FB9043-)/BR]\99+J8/3'%W=96(=B5,10)4Lbid``bLN\VMH43AKOJ@:6.2-*')0>J133544430/.-./27=;17Cy{qh`SE:7:HPJ4BWj|xPPPPPPPPOOOOOOONPPOOORVZgoz~|wuvy}gFAABHNJ?=;;<@?><:?41IcheO>4795260477>C>43/3.-06@MYFQ3F8A5,.F77#;9<>7.*2=M_mja[Z\dZW@143CJRSJ?983.00*.;CA144543440/.-./27:>17;stha\RD78=NQ9GWWN@=<===;98<:=OX]ecL:894264258.@_nkd^_c_Z]PJ7/509DJI@6476'02+0>?4356433440/.-./279?066pnc^ZQC9;CTR0DES]suqkLNPPOOOQROMMQSRQSPPQQSaqx|zsow|¨]ztHQcK?9;:76;85BUahgdda^SF841/39DB?<9896744465313575322210/./037?86/;X{mf]QHD=;OT=,:FM^ix~rjUUTKNPPPOPQRPOPRSRPVQOTZ`kwy}|upoqw~Ǽ|}V`rZK?>?;66=8?6>KH]o`H5065059=<8545752002458>JW^\]aOJN\heYO5-,/(")9Q\defe\RE<665326>>;:889:977776323676211210/./037<=817Zsg^WPGA=BQL<29AGScrui]WWWWLNQQQQRSTSRSTTSPUQQYdmu{{~|signu}ĮnQ]mu`JBA>96=;A77>=Fji[B24625AG=212041./27=B-4DV^ZSQEFM[kmWS?AGQZXG657;@@=978988779::;:::853678620/0221000368F93,fygdVLH@7?RYCCOFCGDUctyqifefghiHJNOPPRTRSTTSRRQMXfptwz{yrgcgr|ƶ{urmotfXOEA:;BE<=B10IXN=8634Uk]D;;842100//0943:CEB@EPVV]eW?;53229HV536AJH;159<<;:77;;:98767:;::;96378973101332010367C711jqg_RD?;:G[VEJYOIIEP\l||tnklnqopoEHKMNOQSSTTTSSUVVeuyyyywrjcep~úytkkna`sz~sdUID>69=?BC@72L_WD:87999:9988(3@ID;7:9IVY]_S?@?@FLQTU3..7<:4049842244<=<;87448989975378:72001443111369<70@nkcTJ>77@O\GFLVQJGDJUcs~xroprurssBEIKLNPRUVVUSUZ]gpxyxwuohfgmxonefm^cZgu|}xj\SH=D;G\;<76>DBAA8>CB=877:9:;>AEG-;JL=009ALVZ\YL>459?BD@>301761-12970,033===<:9665556652179:7411145421136;4:2UpcZKH:16CMP5GKNQJ@DFO[jx~ywwxztuuCFHKKMOQWXXVUW^cruvsrupgaels|~xacXZcVbMUaly|paTGOBGW,14>E>27EE935;=<=;954584bp[PFH=27GJB+HKHPJ@FCJUdr}}|{{|~xyzBDFGHIMOQRSVYbjoqtywpga_bhpz|og_ZYVUVRYX[kzuu_PEZ7267779;mbUKO:9?@PI$+8DLICDIHKS]kv~~~}{?ACEEGKMOQSV[clopppmfa^\djr{yme^[ZVTTT[XXfrx~ugUZ2/77788;;=99::9988;98899:968=@A?<94>HOQNC77874/+)(+*)&#!$)-27<9:;;:975345676559999988653455677=45Tf[ILE@8>NL8)36;@B@DIDPbovz~~9>6/:878::97568:=@AB:@EFHG@766740-+*''%#!#*279;9:;;9875345666548998877654566778=28l]Q>K;B8AW@".456;>=@EFa~}58<>@BEJLMQW^gnomg^WUX_cns|yp`ZY\^[VRT[YXclpy}zk<8;:;:::98:658>>8/65469<=;::99:;<=DEA=C7<=<;:875@@=98;:5/022/-+,-.////-.((+068859:;:986444577665899998788:;==>==7<]`PA==J\1479:=ADHGJS^egfaYQOS^iow|vjWQU^da]WNUTR\bhqyq|sx\;5;==<;;9757:::8:==@A>848<::;;:9556;>??>7,+-0310000110/-,*..0367659:::986455677666788988799<=?@@?<7HgNH8B197SW2)7237;:8DcǮ014568=>EEHP[bb`^XTT]isx|qfVQW_ed`[R[YU[]bmzrxY[D5::<==;:86038;;;;<;CKH=45;999988776?@@>;:U^G>:85:GP@2593358;74BONB77>;:876688;;967<<788:94/,,/13455352586447<899:8764557898778:9;:::;9:=>??=8<]QH8?.>=]L-8B74029DVtú|0/-.038:=@ELRX\^XY]enx}xoe]\\\^_``^OT\`YQS\hYD77:=;9:9:8855/38>@@=990WK/=<8;:9876547;><78>CB9242--275679:77;<:88777999:99987689;;97899:::;<9=:49D@1_WK=328E[G43?B6+.18Jn˾v{0/../3686699988887645059=A@<98BHMRUWY]dnx|}|vpjd^]bb_\Z[\\`WRUXVPO><87667778886535369?@<647+<]ubhx}44112346;>AFJOQSVZalw||~}{vnfa]Z[ab_\YYZ[VQQX[TG?2556556878896636687:>?;84U<8B5==889:97636324:>?=4565237>IQQUFFBCC=622Fk_Wcr{88666678>@CGKNPRUX_is}}||~zwsne_[ZYZ`a_\[ZZZTQQVSH:41355335989::8757;:68;=;79\=5A3:?::::;:873117<>;77;<615BMxq`J827@9977677767788877777:==;;8:;<<<;;;=8980@iNHEIPUVZKJDCC@BGUgcPSal{=>===<==BDGJLOQRWZ^enyywvwz}~}ytrkf_[ZZZ[^_^]]\\Y^UMI@8225654246;9;;;:979>;559<;7?[I:@63<97777777<:9<>=849<:8>PbphT=14;=;;:98775666788776888;>><<8:;;<;::<9;96>TfLJLNSW\aGJF>36Mf}`JFP_jzABBCCCBCFHJMNQRSZ\]ahqz~{sommoqssokia_\Z[[\\\]^__`]Y_OB;723576434579:==><;9;@<538<:59NTBB?1<<97679;;DA?>=;88897;J\dc=848AE=4;;99887767688776768;>><<8;;;;::9>7=92Pk]PKJMT]ejKH?75GofTEBDJXh|CDEEGGFGHJLNPQRTYZY[aksx{}|wnigfghiigb`]\Z[]^^]]]]]]][WTE97866664447766:<<=;;:A>;;=99989:9:88889877668:==<;9;;;;;::?5=8/\zXYQMMWahnTH9;Pt~}bD<=DECPe{KKJJJJJKNOPQRTUU[ZYY]afjnpsspjb]`_]ZZYZZ[[\\\\]^beZOW\Z[NF<88841677777678899998;;>9129<955:CKH=2PJFEIHD=78::979=EA9204;?:=@@><9:8889999945678999;99=ABA?:<=<::88ACCNdsNNNNNNNNOPPRSTUV[ZYY[_bdegiif`[X[ZVTTTVWZZ[\]^__ag[SVXRRIC=98743688878777777888:<>912:><:44;EOQOFA<;>>:588888:>B@=9447<@@@A?:8786678899:9::;;;99:;>:23:>>?824<963369<@785447;=DCB?:8676667799::;;<;:989<@B?:77;<<;:979669FSWPIMSY^aa_eroRSPLC<98;A?978988877888889;?>9338=@?:757:<:72248<>=84126877365668::ABB@<:88677889:;9::;::99<@CA;667;;;;:879=55EPMLQPUZ^aaag`A>BFFA===9@><@BLbw{vZZZZZZZZZZ[[\]]]^_`aa`_^```__``a^ZUPMKKKMOQSWZ\\`]U[idOC=:988:647=B;;:98:<;:533554365489830599:::87:;?@><:976678::<:;<==>=>@BB=757:;<;:9878@43GQNNWUXZ\]`ahkS@2:;=???;:9?=;?AKbx|x\\\\\\\\\]]]^^___`abbbaaaa````ab_]XRMJHHJKMOQTVUXUPWhfXSA<98:>B@;78999988999999;?=<965;AB@;724;=6479;;;:579==:309==>=<:868;>=<;;8778:;<=>?AAAA@B?@=8558<<<<:9766:39OYROVY[Z[\_`gx|`E;;<=<@Jax~y^^^^^^^^^^^____`abbb``aaa````aaa_^[WRMIHHHJKLMONPQNRYWT[KA97;>@<:78:9:::9::::::;===<849ACA=6/06:56;@BB@?27:><855<>>?>=;:78898:=?:99:;;=>BCCBA?=><:8678::=<<:976635BUWPPZYZ\\[\[bb`SG?=>?=?BFGD>98><:>?J`wy________^_____``dca`_^^`aaaa``a`a_^[WRMLFGHHIKKJJPOLKEJ[SF;7;=<7:89;;;;;:::::::;;:<>937?9;><87?@@@>=;:7659?C<;;<<=>@DDCA?;897856:<:8=<<<:86618GSPLR_WY[]]\Y^XM@AGE=78>EJIC>:8>;9>?I`wz```````````````_```````aaaabbbbb__^_]XPLIHEDEGGEJKDJQFKkhVGA@=;;356778;=<<<<;;;<27;:7579A;646?@AB@;:7668:<==?AAB@@HEA;53129;9::;;<98999863-AOMLQUR\\UTZXWgTQKKH@=?89==>;;9::::::::;?BB=611256;AEIJKBEB;9=?=?>>==>@?=<<>???>@=:87898<<<@>Hbzy```````````````__^^__```````````a`aa_\VRKIFEEFDCE>GK?@\tWdeTFGB97:::98668777788835630/13ACGLLJFDBC?;?AAA;:87667:;<;;:;;<;;;98764;FNJHOSROTSV]Y[l}xXDJZqoeUIC@<9<:>>>???>?BDFFIMPSPMIGCAAEC>;=BFIEEBB@@@?;9:;;<;;:9778:;;:89:::987766789<<<;9:9:;:;;98675DHKHIOTTQTQS\_h~hRO`rtiXLEBA=8;9>Z`?4@YjeRIMIF@>@DGGJJJJKKKKSTSRSSUULIECBCEFID=<>BDGDBA?>>>>;:::=<<;98889:::;99:988888889::;::98878989:85579HIIIKRWXQURV`bgzriYRZiv|i[LDDCA=9;8;B@H^u{t````````bbbbbbbabbbbbccdddccbbbbcbbccb`]WSMJHEBAGFB=EYO.<>TpvdX]UPGCDGGGHJHJJKKKHGHGHHGFBABBCBAAIB;=?@AC@@><<;;<<=<=====<<;99876989:;=<>99::;;;::9765556689845:;:;8;B@F[qzs````````bbbbbbbbbbbccdddddddccbbcabcdc`_[WQLIGCCFE@FPH94CAKbqmaYQLDBDEB@CCCDCDEDAADGIJIGAABBA@===?<;:9889:<======<<=<:986699999;<=9::;;<;;88654445268635:@PNNQVXUROTT\f[KKNZgryzl]VH@BFD=:;<8DDDEEECD?@BEGFB>B@>=>@CEA84:>=CB<<==9IgxlYOBBDFHJKKEEFHFDCFDEEDCB?=BCCDDFFECB@????BB>979=>>??=;9889;<<<;:::::::::::9988777888989888887866551643648ISSRRPQQRTT[c_UV_~xojgbYRD>:;>B@>89::=?BE_rvm```aabbbaaaaaaaabbbbbbbbcccccccbbabcfgedchigc^ULJ>?PXNEDWTQPNMLLUI>=CFB>DDFEEB@?CCCEEFFFECBA@@@BDC>:9:<<:989;<;;;:::9999::::999999999::99999888766661743637HRSQPQPQSOS[eikqxtnfa_\VPF@;:=@>=:;;<B@87=79;@IPX[^THCDGD@ABDFFEDDDDDEEFEEDDDCBBBCEEB>:89;@@>=:98:;;;;::::99::::::99999888;;:;::::887765551642637GPPPQRSUVW[^birwwe_YUVVTRID>;<>=;<=<<<>@CWi|}qg```aabbbaaaaaaaabbbbbbbbcccccccbda__acefftzcTGEC=97645BOOIGEB@ABCEEEEEDDEEEEEFEFEEEEFACEB>9;=;::;:;:::999::::::::9:999887::9::99:766543341742426DNNQTUWY[Y\ZUX^YKHEBADILNKHEA?><:<<;;;<>@Pav}~|pfaaabbcccbbbbbbbbbbbbbbbbccccccccadfcdmcQIEDFEECBBCEE48=DOWQCGFFFFFDDEDEEDDDEEFEEDEFE?@CCA===>?>=<;:;::::9:98::::::::::99877889998988665434342632415BMMPTVXY\\[WSSQI@<;99;>BEHHGFC@><:9999;>@L^s}{yneaaabbcccbbbbbbbbbbbbbbbbcccccccb`adgpμmYLEDJHFC>;87<;57G\`WQONMJHEDDDDCCBCCDDDEDEFE@@BCC@;9=>>=<;;<:::99989::::::::::99887889888777665543231741404AMMPUXYZ\^WPNJB:8776558:86678;64567:HG>@@ABB@@@CA@AB@:8=>>>=<=<:99888889999::::=<;:98776778787726984223072-0/2>OPQRY_YNEEC@<;::886656669=CGIGC?422359Rl~yuux{|{}~qdXccccccccccccccccbbbccddddddddddddnͻjQJCB>:9<8>EPhձcWSJCGFIKF>=C??@@AA@?A@@BCA;8=>>>=<<<:99898889999:;;;<<::9867788888886789742314/.2.0>JRXXVRJ?AA@><<;:977766679:J_veCHVXOFEFFDC=>??A@A@@@BEDB<9<=>>=<==99:99888::;;;;;<;;998867888889889888874121-04-0DPVYTJC<6;;<=<<;:998777789;?CEGGF>:42037:>Qmxurrtvwwx{}{{}|weWLcccccccccccccccccbbccddddddeeeegkmQHJID@F`ײdDSURHHMJ?>>?@@@AA>@CEEA=;<=>>=<==99:99888;;<;;;;<9999876677788888;757884152.23*2N\WNC<:;<8:;<=;99988989999:=?BEHIC?830148=<<===<==:::99888<<<;;::;78776666788888889645774123011*6UYN?769;<9;;<<:8799899:9999:;>CEGEB;62135:Suponnnnnpptxzz||wlRC8dddddddddddddddccbbccdddddeefgggnİgPKMOR{ҏdKUXG?JCCBBBBBAACDDA=;<;<===<==:::99888<;;::989777877677777777776556765262045=SG>558:769;:9987689899999999:;>ABDC?;64347Txwhkkmmkklnswz{||sfI;/dddddddddddddddccbbccdddddeefghhitƱnWQVbmoWURMJGEEDDCBACEEC=;;<<=<=<<==:::99888;;:987777888888877778887678878;=8<65CLIM9659;7458876666779899988988789;:;>=>>=<<<<:::99888::987666898899987777777758;:9:>C@D<=VdWL:89<:55<654335676778777798877788?BEDA<64;Vr|vmfadhkkhgikqtwxzvj[>/%eeeeeeeeeeeeeeeeddddceef`ekleeqԹtdk}`DKOGCDHIHGGHIGEBBCCCA?><;;9:9877767788765378877666567876433589:;=ABIH_kxJ9::99988776655454545444454433446;=@BDB@>?QekbXTWceffeegjptvwwqbO0+)eeeeeeeeeeeeeeeeeecdcdefdhjkglиqak龀PNLKJD=?FFJLIFCDGDCB@><<<::::9877678886547887776633568889679;;>@DHPRfuL999988877776655544444444543333468:=@BBBBCP]`WOPUbdeeccdenrvwtm\I1,*eeeeeeeeeeeeeeeeeecdcdefhijkkwʱyp{̝KQK@GYT?DHKIB?AFBBBA@>>><<;;:9999999986578786776555678::;;:@BDELRQIFLT_bdca`_`kpuvqgTA1,*eeeeeeeeeeeeeeeeeecdcdefijkmqDZOPYNDEAFIG@<>B@BAA@@@?===<=<<;;;;:988787677677:977779:?>=>CEGGJV\kq=787776667776655533333333332222344467:=@ACGIE?@FNX]`b`_^^ipuuncM:/*(eeeeeeeeeeeeeeeeeecdcdefgimpuʽܛbKLPJADGE?:;?>?AABBCB?>>===>=>=<;;:::76666777;:9999:?@ABDD?????>??@?><<<<<86666788789:@FKOTW[]`eotrgXB2-)'eeeeeeeeeeeeeeeeddcdcdffikmnrwQ]PLKKIE?;=>?@ACEE????????BA?==>>=8766778889;>@AACENVWSOORVYlvm>B;99988877776655522222222110//012454455676:=ABB@??CGLOTX\bkqmbR>//,*eeeeeeeeeeeeeeeeddcdcdfflllkl{rYTQRQMD=>?>@ACDE??>?????BB@>=>>>8788889:;>@BCA@BGS^^XSSWVWmw}a2D;::999887776655522222222100//0012345567768@@??A@@@??>>98:;;<<=?>GG=981QNIKYeaUX`slI9><;:::99999987776665544441111110054434455247=AEGJB@>=>ENU[bhdWF930/.eeeeeeeeffffffffeededeghnlnrt|u\\\WSFDDDCBA?@>>@?=>A????>>=><=>??AABGAGI=786LKGDM[aaYgwy`D;C><<<;;;;;;;::9997776665533221100110001235457;AFJFEB??BHLX_dbVG;5310eeeeeeeeffffffffeecddeghlmotu}뿃ZS]]RF?>BFG?<>>?=>=>?AACCCCDKBISG;=AEHE@BN`jaqzmO<=F>>>>===<>>===<<<:999888755432100...../0164114;BHKKIEA?ACQX^^TH>8554ddeeeeffffffffffeecddfgimmost|ҐRLKJNPK@7MDBDC;8=????>>>?@BCCCDEDIBTi^KGKDHFBAIYemxv_C;@C???>>===?>>>>>>><<<;;;::8865421100//0122530027=BKMMJE@?>IOUVPG>:765dddeefffffffffffedcddfgimnqsryϷvWIILOGBBEIJKKABBBBBCCFGGGGHGGHHd~rXLMEFHGFGNUwznUBAA>>??>>===>>>>>>>>>>>===<<;:987544221001221111257;GLOOKFCAEIOPMF?9754ccdeefggffffffffddcddfgimnqspxѻu]^UD:<>=EEEFGGGHKMMLMMLLLQkqYLGFFHJJGIMxsdRIJE=????>>>>==>>>>??????>>>===<;:9884321000001123334?FLONKHGDGKMJE?9654ccdeefggffffffffddcddfgilmrsqyʏ^OLHJJJKKLLMNOOPONNNOTfo^OKFIILNMIPXmf\VTQJC@AAA@@@?>>>??@@@@@@??>>>??>>==<<976421//001222119@HMONLLGILMKG@;754ddefffggfffffffeeededfgikmrtq{Ǿ܎PBHHMMNNOOPQOOOONNMMNR\YIFLJNOQSNMZje^YZ[UNIBBBAAA@@???@@BBB@@@??>>>@@@@?????=;86433222222466=FLOMMMJKMNNHB<865fgghjjjkggeedeefegghffddgloopпONLJNNNNOONOMNNPOOMLPOJFHKMNXWQMVccZYYZZXUQNFDA?>>?A?@@AABBBBA@@?A@BAB@BBDDEBAA?=;864579;@GMVXVTRONOLQVWWTJ?730ghhiklllhhffefegfgghgfffilpswɿMOKJOOOOOOPPMNNQOPMMPNJIIMPRVX]de^XVUVUVUTRQLJFC@?@A>@@ABBCCBAA@@AABBBBBCDEFGHFGDB?=>>=>CMYapniaYRLKOV]__\SF52/ghhjkmlmjjhhfgfhfhgggfffijmt|ɾ߆JMKKNOOPPOPOMNNPOPNNQNLLMPUY[btx_QQPQOPPQSTSPLHDBAA>@@ABBCCBBAAAABBBBBBCDFFJKJKIGECEC@BIVgr}thZOGENW`efbXK963ghhjlnmnlljihhgighggfffggfhq}ż߅JMMMNOPPPOONMNMONPOOSPORSU[cru_WONKJKNQSTROKGECC>@@ABBCCCBAAAABCCBBCCEFGGHHIHGEDDC@BIXiuzyqdUIA?HR^egcXI;74ghhjlnnonmkjhhhighffeefghfgq}ľKOOPNOQQQONMMNMONPOQURSXXYakx_PNIGGJNPRPNKIGEE>@@ABBCCCCBAABCCCCCCDEFGEFFGFEDBAA?BIVeotsl`PD==CN\cfbVG52/--./..////------/..--../--------+++**)))))))))))$%%&'()),,-../0.002445665532334512456897:9:;>?@@LLKIIDBAA@??@><7/..-----,,-,*)*,-//.,+++++***+,/65213344028;92*&244210--///.-,,,---------,+*+19<6/.---,--,+-+*)*,-/..,++++****+,/55313445268;:3*)354321..///.-,,,----------+*+07:=AILVj}uie___ftoYLJZaa,,-.--......,,,,..----./........,+++****+++++++*''())**+,,,-.//...0245331111/01211223220-+.26:=>EFGFFEDD@?@@@=;5.--,--,,--,+,**+-...++++,,++,,+.653245558;==;4,,476410/////.-,,,--------/.-++/4679@DM`vvkecc^\ey|lXML[``+,,-,-------++++--,,,,--........+++***)),,,,,,,,+))**+++++,-../---.022111/.//.00244321/-)'*-38<>CCCCDCCA@?@@@=93-,,,,,,+-,+*+*)*,..-++**++**+,--65246877:4.-56742100///.-,,-........00/-,-12137;DUlyphgf^VZfqxwvoaTLLY]^--+,-.,-,,++++)),,++++,,--------++***))),,,,,,,,,,,,,-----../01/-,.//00....-./01655531/,))*,28=?BCBBBA@>?<>>>:50-,,,----.-,+,+**,.---,,,,,,,,-..44137987;?C@;2-+3553210////..---........000.,,/...13;Kewmhe`YXWUcba\TMMPVXZ,,++,-,,++****(*++*))*++++++++++****)))(++++++++,,,,,,,,,--./00.,+,-..../--./.016656320-+)*,15:=@AA@A>?<<;===82,,,++-,,,-,,,+*)*+---,,,+,+++-,/.42259::;9@GE=4/-354310/////..---/////////00/-,.,-)+06Fd~rhc`^XOFJJJIFEIOSSU++,-,,--****))))*,++++,,++++++++,,,+++**-------+,,,+++++,,-.//0.+,-./--,../-/023645422.,,*)*.278<>>>@?@>::<<;6/)---,..--..--,**)+--,..----,,/.0/2116:<==AJRQI>763210/./.../..---////////./0/-,-,+))-4Fjƽqgc_]WNHEGHIHGKMONO++,,-,--****)))*,++**++,********,,,++***,,,,,,,,,+++++++,,-../00,+,-...,/.//11234454220-.*)(,/45:;>?@AA@;;;;:4-(--,..--/...-+*)+---,.----...//112146;>>ALT\]TIA?2210.-..../..---////////-.00.--,,)*06Hnƶnda^YVPKRUWXUTSSLJJ///---++,,*)))((*******+***********++,,-,,,,,,,,)*+,,,,,,,,,-.//-,-./....,-./0124565310+.-+,/010348:=>?@?AA>81.,.-,.--./,,--,+**++-,,,--///03254549>@>AGR_fhd^SFB=5/,+,+..---,++........////////032/6OyƷtd]XUV\bnx|uoh_PFDG////---+,+))(((())))***************+++,,,,,,,,,,+)*+,,++++++,-./.././00-...-.0235566420/0.--.1113358:<==@@A>82--.-.---..,,-,++*,++,,,+--//11267697<@BAFN\foomeZMA=741.,)--,+,+++........///////14733:T|¸qjjhmvyqeTC>C/////---+++*(''')+++****,,,,,,,,++,,,------....,++,----,,,,,-./.../01///0...01345676652.0.,//001343368::@@B?:3../..---/0--..-,++**,+----002348:9=;>DFGMVgqz{wobUD@;84.+&))****----------.......29943>Y|û~~{iT>:>000000..++**''')+****)))+++++++++++++,,,,----...*+,,,,++++++,-.//011111////-.0123456643020//0/114421257:>@A>:50.---,,,..,,.-,+-,))++,,-,/1157:<<@<>CILV^oyxj]JF@:60,()()()),-,,,,,,,,-------1:811?Xz|iO;89222200..--+**)))+++**)))+++++++++++++***+,,--...*+++++*)****+,./101221000.../0/034566440200/112265533568;=>=850/--.-,,//.-/.-,,,+***++,.01469=@?A=?ELQ]hw}qeRLC:62/-)(('(*,-,,,,,,,,-------1:5+,8QpxdI989333311//..,+++**,,,+*)))********++***)))+++,--..**++**)(++*+,-./2212210/0/--./..1234444/1//-./015554444458:;7410.+,,++..--.-,,++**))+*--1368CJRZer}~uj\SJ@:521,*)')*+,++++++++,,,,,,,.71(&1Gdy{r]E65533331111////,,++.--,+**)***********)))((**+,--..*****)('++++,-//23342110///.--./00345320.+++,-..4533212014796522--,+**--..--.-,,)))(**,,1479>AFFA@FOXbnywna[QIC;64/,+'))*,********+++++++-2-%!&;Wm}{tkWB3001111////...--+,,-,,+,+********,*,*,))((')*+),+,,****)('',***+,-.112210////..,-..-.11221/+,)*+-./2322311//2677421/.-,,,./../.--,,++**+*,.256:=BEGCDJT`iuyob]UOHA83..,)))*+,*,*,,,,-------//+%!%8Qgtz~z{xofS?2/0+++,,,--.///.,,,--,+,,++--//.-.+/-/---++***)+)**---.,-++*)*+*,*+--000/.-.-/..//.))*--..-)''&(,000/1330/-/.1220.,02100/..1010/.--+3.)---2/49?ABCEIPYajq|{ui_XUSNE=63.*)++*-*,)+,--..001110-+(#*@Xgusvwvu{}|{~}~|umcUF=3.*+++,,,-..//.-,,,,,,+*++-.0/1/.-////--++**))**)*.0..,,*+*()()*)*,,...-...-..../.*)++-,--+)(')-1//-024321./.011/122200//.1/0..,,,,1-+..*,15:=@ACEHR]fpw}vi`ZXXSJC;73-+*+*+,,,,-00001113311-)%,B]iolnpppw{xwy||{uneWH;3-,,,,--..//000/.---,+,+,,..10/././/----++++**)**+-///-,**+*+*+*+,--../.--.-..../.+++-/./.,*(()*-,,-046544222323552/1./,.,.,-*,)++11//11.-58=?AACFHQ\ent{}xmea``]VPE?92,))((****+./..0001102.'"*A[ikjjnnmqx|zxvvuwyy}ytmcUF:2,--...///01122100/..--,..000210/.0....,,*,,+++++,/10..++*,,+,+--.//0/10..../../0....0/./..+))()*)//368976889977751/..-,++***))((*1..1-/327:=?@BDHJQ[bgmv|~yoigege_[PJ?6/*(%&((((+,-+---///-++'",AYchhilmkmrtqppsvxxxzwqjbRG90*///000112234443311000/..011210/.0....,,,.,,,,,-.00000..-./--.///11210/////..0011112432110-+*))))137::;;:7889::97210/..--+++++***-'/4+*67:<>?BDGJNQY]biu|~}wpllkmlgdXRH=4,&$'''&&()*(***,,,*$'**5FW^ebeikhiknlmnsuwwuwtoh_PE7/)0011222234566655443232111343212/0.0....,---.--../120100/0/./001233332010110/12332256655220-+)())+,047776546598983110/..-,,,,,,,,*,EQ80;=:<>?BEJLORX]biszz|~yvpoppppmkb\SG>3*''('('''(((*****($,48@KVZ]\]bedefmjinrvvvtvrkf^OE6/)122233344567777777654433344432300.0....-----..//001234430/001011444331/.10211223456766640/-+,*+*&'-389:;>:633477532210//.../////+8fyTDJQVW[WW\aabfkjintxwvsvrlc[MC;3-22333444567888888887655455555310..../...--...///01234453////01225544320/2232234423576654.,++*+)'*,39@DGFJD;0--145765543333333331&;zc@@:<=>>@ELPQU\^_\[\ux|~}xvrtuuussrnjaWNB5/--,*(&''))+++++'476;DEJKB506885248614200231,IaDUvOBHLG74683--0500366:EMLD;8:830;A8+.DWNM=?\Q5DI@?IOJKNX[ZNEDHINNRZ^]]bilnqrtww}{yusolln_UQKI9-*+/126859AEO]b^__``dddfirxx}zohd[MECDE3334679:::;;;;;;;;;:::87:9856331111144440010//..///.//00101120105432321011002334<.3GW`fb>?ABJRSK4001.++/6+$'-/2:2BLRRL>1/,*-7GW[I391K]?JLCEOQJNYbZQIJNMHOKJLMKLPX[]acehkkjjimpsv|tllr]2',45-)1936?DTeidiedcehijv~ymbYMGCFI223468:;<<<<<<<<<<<;;999<98753210012235510210////-.,..0/0.0/00/024323110221134531&?`efcO0/03=GH@753333465/)(((&(7=>CLMJB>7..+449PC9IPFFTdhKDCDHKLMSMIHGFLRVXXZ]_beiklmooqophmphkrscD$"3=7-3CVgyþveYOJBCG00123578::;<==>>===><<:;:88543211100112100112100..,--//000/000//23210/0/001123644E_bQF;+'%! &.21,--,18;:20,')0;=-6?BA>705BLG9027(/"1,/\\CC?=LabTKF@>>BMWRMGFFDGNSTVW\aekehjlnnliradnnmonjL8-+2:AUn~k[RNGHH00001345789;<>??=>>>==<<:99763332210101111212211/---.//0010000-/110/0.////001241/KVD63/)!#! #%%)-,,1:<674/+08=7--+&%+14*+,,,,-+%&&,.7UqSB:I[_TIMD?<87ALNKHHHEGMPRRUX]agjlpsttsomaejktzt~~waA/7J\v˺qbWSPOO11101123678:<<=>>><=;;;:;;:;;=?=7532212213243431///01223532100-/13231102////0/0,7[Y6*+%#&*,'&&##*00.4<;50/.09A<,$(.,*++'*+,,*)(%*0)-56`YBAZbRFJD=<94,.4HEDHIGINUVTTUZ^chknopqspjmsh`swx{}xgXQw©xh_ZYXV/0115444565799;;@><;87889:;CMPOE>44598405534554254657789:7640-+,2434579::0-1+#$.\A,)+'&+$&*))&%%')*.2421,,,/481&+*+--./-,-,,*))(& ''(5ICKWZRC?GFDA93//0@CC?AGIGQQRUVUZdkjggmsyzyutqjjwivxm}\mʸxoksmk/00232324557798;>><966588=ER`jj`K?:89:8586445552//2469:9:9640-+,.25677779611*%.:B-#&'$%*%(+-,*())*)+.1/.,(+691+)+,.-/./--+++)('$'#%**&/BFJJLPTSSXahiijpvz{xsotz{vpkkhfotHsŮ~,-.//0214246689:=;;87779:BSfxi\RKGEA<;7432310-.02345344300/-,'*/03421452,',9C0$ ')$"&&)-/.--/..+++--,-(.=:*&.,+,././,-++)'&"!$#'/.),758AIJCACA?=4.**+)8EE@AIPGIOTUUX_fikpw{|zttqt|vcmw\^{;pι,,-,-./001355789<;99888;>Lbz{mdZPHF?730/./013211/-/.//0/0/*,.02354451++6AA.((-,&#&&),//01232.*+,,*,-493'(/+*--.,,*,+)(&$ $./.2:-05@II?8984/+*+-&3@C@DLUEEMUWWX^cfmry|{yqzzpnuujfgUq3@m,,++,,.//0133578::::9::=DUq~naXMB82/,,1311/+*),+,/02434532244531./8DG<0+./-)'*$'+.-.0363/,,++++58.&)-++)-,,+**,*)'#!")-06=>759DG>110/,*+-0-2:?BHOVECLUYXY]_dlsz|yvr|zoltsi_]hE*bÿȿ1..++,-../022464888;:;ACFHKLKGBA40;F@5-/,*+,--*')*,-.154311220/551(*23**'*)))(()))('%! %%%%(+./GPSI>97/*&('(*04;7:CHGJKHDISZ]]`^afluxxwwuvx{wk_jf]kY```d|630-+++,--/11343778:;61//037=@DHR\cjnmhaWE?IL<1.0/--./+&(++--/142222443/:/*/551,)'()))(())))'&$#"%$&)++*+G\YF72-)'&%&*/299?HIDEGIDHSZ\^a^`dirxyztw~}qgimlt^fah^^]o5431/-+*))*+03667789:;AHM`~zvn_M@:845:=>BHTj~~je[WQD3((**,.--,,'(*--/1345631133<607RcT6))*)&%&(+,+'#"$(&()*,+,-81A^Q<;*&$&&(+024;JRJ::DGEKTWVX\ffeflsvvwvuxxsnjugmlXXeege63420.-,***+/255667889>EN_ɻtbTIC:=A?@ERcukbXG9/))%%&('(((%(-235559779==<;:97/(+>O6,##)-+(./1.)&%&''((*))(/-6JQH?((&''((,/48FPI=;CHFLRWVVZfhikmqtulsy{uniefbhh^ci^_W}65420.-,++*+/2445786670+)')))*,--.*.1587341.-3;?<54,+-' *:>6-)*,,,)+..+(''()()**+,+457NWE/,(*))(*,36AKG>:>DCIPTSSWdhprnllpjt{yqkkmhhmkgnm_WFf9864310/-,,,/1356775458>KWqŶucQDBCEJUdxxgUHPO<12,$"$$&(+-/676653.,('(-441--",60%77/.*)(,4895431-*(&(EcA2CBV<4.+-//.+-022..-69?GLILNcgtzujiosqnnxsbmmo}|hjX:Gg=<=;978743323467;;972015?F^·zi_YRIA><=<<521I?735640....+*'&**()*,./321/-,*)&%%&)*$&%'1<@=71.-.3:==631/*(%$$1_L5?=SH=3..00/*-.-*(+,028BHFILefr{xkjrrsqtydt|uw|U><:878543122369::72025=E]˾rcXNHC>:7774/,-E<7=C@9398852,)'((*,...,71,,--)%( !('"%0&*,./39>KFB==:611/..+*)(!YS:C;MQE6/./-+,-.)%&).)+1:@ABE_`jwuiemttprsyqfP9?U@@?><;:;76532224:9865449DMb˼x]TMIGEEDA=B4;<)EIEB??>;9;7;A>0),+,-**+/.5+$&+-&!""%')&))*(&')).2322453/,-.,(%"HN3I1HPJ@60,++*(&())+,,0133457ai_jqdmyzxoijnoo{lwpuQ:8ZA@@>=<;:654322248986547:EMcͽbMFCACCDFC?D;?=1PFDB?;987?54>A5,+*+--./342-)&''"$"%&+,,*.-+)&"!"$&+,-/23.-..*'''.51>P?AVRH>5.+(*(')+-/.,0010135\d[flalx~|rf`fpxw~dpnkO;;\BAA?>=<<987555579;97657:CNb̽oQLDA?ACDFC=A@?86WCB?<8666A1+5>:/))),.0159*****)*,!!"))(%;83.)$"#%$&'*-//)+-,&%&*/ E0;?IUTQMC;2+&&%&'*-,,,/./.047Q]Ygm`gq^kqmgiqwuu]hm`H=A]BBA@??>>;:98888:;<;9768;BK`~ҽxaKJCAACEFFF>@D<1:YBC@=9788;.(/76/())./0178+*,,-../()+,.065@<71*%&%('%%(,,**,+)'%(*(,PCIHHG0.,--./0...,,.36AX]lrcegvzvhfq{|sjW]h]IIPfȽAAA@@???>>=<<==>>>>;979;?GWn{xqfWNHEBBBEGIJHC>D4,@FA=;;=?<:*(*('&((),..../02/027751*/2214=D62/,)'(($$(,255681(&)**&+)'>>>====<<;;;<=<:::@BEGIJDD=B/,F<84018;95((*'%&'&&),++++-+-347788;<>ADFHE522/-*+,&*/24456<71,)'*)'/8>/.66-.01100/?:1*)(**-/0/++.0AZ^isnzpyysv}onb[Ya{zkfhuǿ>=====<<=<<;;<=?>>><<::=CHOXbirR<@CC>>E<:=@CHIH>963/08D16..;3',%')(%&'('(($"%.531.+)(((*).7>;616+*--'(/24652/,,211K#>&(7@7**174.)&*.0.XO:,/-'*%&&%'*.10;Wpv||{z||xsn\\[Vkzmfcjw|vqorvuwyļ========;;;<<===?===;<<>@CFJQX^ft}E..5;::==<>AEFFC741/,+5A@=3198+#'(**(((((&%%*.01'&&'(*,/-+.7;730/8;0+/1->=:64357-52??+.1:@8-,01.*'(+02/YN8+10,/+**))(()09Tjt|}}}{vqn]\\Yhwob\]ckppm]]\^_eiktv|}<<<<<<<<:::;;<<<====;<<>?BEEB?40+*(*3<>647=E<#(')+,+)))##*361+'&%%%&()-+/6:7337:@@BC>7<;973112,949jA-,7<;6.-+*'%').111YM3(363687621.*)/6Mer~|uom^Z\ZaeZQORX]^\XMPUY`gjmrtxyyz~;;;;;;;;:::;;<<<==<=;<<<@@BCEFIO_m{lRB?=<;;>?ABEJYdq}w_TNNH><>>BCGJIF?97/+*)*.6A;BA6BL>2(#(-*)+%)/450+'+,00568:56=CFGNRM?KivdSRDA><93*$*(2TZV?F@70--+'##$(-,).5GA0-9:1101232/..*+BYl|~|upe]VZ]RB65-(()*-3E?>8/:P[C3%'+++,&-440,+-8;=<==<>ABKNNOX_H[lkc_XJQG:2--+*/(BcGK99J<0-/+)(&%)-)'/;A=2.76.--,/11112)):Rh}}ysoc`X[_N:8EISY]`gllmoponllqqrroprtvtw8888888888899:::<<<=;<<<:;;>>>>37Q@1-,(()'&&*((4FA@6031+-/-///112.(2H^z|uol`aWY]G16DN[chjnsttrpnmllnnoolknrttwɽ8888888888899:::<<<==<<<>=???>;?KT\kzo[LENQLJIF@DCCAA=841+(,.17=45.06')GjP700*+00232126<5888754529BGJM\hsjb]]YL;F;.('(&%'+J281/@SA1*(%$((&%*&%5JAB6.1/+2/.-+**,,1(.BXwzrli\^UVZC-5?J\glnrvzwrmiggikmmlhijosrxķ777777778888888:<=><<=?AB?@ABBABLP[lsf`WOJLOKEFB?=:960,&0,(5=5251.-**'%0LO9*.3-*B/;>8M3222'*//&)7.7@9pBlic\WM@4771&!#')-/?7144CHE;0)()*/,#$/;?F=0*,134111..--/0%13Yq{tsnecY[Yi;-6BM]cgjnonmlihfeflmlkgfgimrv|777777778888888:;>?>==?BCABBDFHINTatǶ}odcZRSVPJE?<:874/,+-(,64170-*(&&%'.;D@@?>?CEGGIMOTVX`pIJzmi\QORQKE=:97740--+,6?2)2/.,,(&&*-.9C:%#25D2;?=P;0&'3/'%2)900<]Ief\TRI;49,251-)# *C:,5B]:;93/48;<;;?>:=D94,+-1222210.---2%+0Twxrokf_\bgH3299999999999999998:<>?>CEHOTY_cfhlt§|{tg\TPMGB;877641.*-0:G?.)1101-'&+-+4B=,*6-:05:>VOE8&1,2*.961?LbUCDFA=987312:HSN@25ILRZQV169759<;@==C?8=J30+,.0112210.---3'(.Oy~vojfb\^dh508CKPY\^befdaa```acfgfb`]]_gntsuqidTK@;;;;;;;;;;;;;;;9559;>@FKQ\hsy{}־sokmli`WMB=;887750/)301HQC00-/31*'*,0599322&2/02;T^_S13-E6,-?46hB14*=E:7=;03;FSclka>@[gpjK;07<;5411;76843IMS\__ccb``___`abded`^Z\^agmpsrnjd^T<<<<<<<<<<<<<<<:448:>EMTapɴ{]@BIRURMC:<;98860/,6+$?\ZI2))00,)-*12/053+'-1.-5GWba<<,K9/5()YA=:#+>E9275.7NenlilkLJZTMF2/A<62;DSessjghfdVT=043@EKLA73137>=7:EHB/--,-,/02210.---/0%,5q|tpja]^_f[601@EMR[^ada]YWXX\]_`_^^\YWVX_dhloqmjhe`========<<<<<<<:99<@GRamTG50?QVOC?=;:5100535EMOXU>-.1-,00-.374-%+%--25/4F]\uJMC`s@pT?2>K>?FB8Jgwrngkone]IG404.5?DA8//16/<=6:EA4..-,*,/11210.---.2%,1oxqoja_`bgW'3/@@???AB?==ACB>?>@IPZpþgFge?NcLA9:95161.;3?KAVTI9/-///-,040)(,$&)-00149N]S=<`qkmka\`ZKBA>9>H_irpmnogS@511.14=:740136<;;<;93/,..++,,02321/...5,,&7W|rheed`ld? &.5CEMZb`\YYSRSTXZ][XWXWWUTS[]^[UMC>./.;>@@@?@AB@?@BCB@GFGSaodwmJ[p[L@>@;64838.3@;M`Q:)&--)1573.)**.+++,,.27@L[bdeiWRVdok_T:5695-6CZdlmnmhZE74350/297431256;::9951,,-,,+,,02321/...32.*4[}zvoifbcchV8##(/8AJX_]XVTOPQRVX[YXWWWTQRQPNLF?6/+---<>AAAABCDCBCDDCCMMRbtkp`GUiu_LDD@:6:6:0,3/8\[M6(+-,2>C6)''%*))),/49(3CXba[[PQWets]B54<>94EWSW_fkiYI7158;510320013689978840+--,,)),02321/...090..bwxsmlf]_fgJ4,'(/0?;5221001367797864.+,-,,))+/2321/.../<1.,jtyqkjcY^heB7;1-3-6>LUXRPKIJKMPTWVXUSPMJHGDA=8667888:8:>?@@BDBCDDCBBIRh{¿yqkiei~rdYNE@77=?335#";K@/***2UhX>320-,+)'$$#,')5AGGHP[aahm_D<788=CS_?;;DOMA31589973021002345888975/,-.-*)))-2321/.../:0-3pzttmfdc^dm[>=F;46.38FNSRMJHHILOSVUVURLKHFFB?;8:=@C?=?58;=>?ACCDDDCCEPc|tqeeg[[mu{ypcTG?:6;1:J2),./151-/M]S?4103221/,+)"2>@:;@CS_bfhYC>;CJTY]^:53:A?822562000.44323333888975/,-,+*(((,2321/...131-Cuuqifa^bdiiF:74..2>HMOKGFGHJNRUUUQNKHEFGEDA?@BGGB@@259;<>@BEFFECEJYwqoeejY_T`nvwsfWNB6=4=R00+(.33136>C@71//33335586%8=5+0>JUaedaR@//9@HJIF;66<9424054.*,.,54435555777864.+.-+*&&(,2321/...3+50Xxni`fb]bheY/7:;>800,.6@GJIFDBEHLORSRPNJHFHHHHGFHKONB@@369<=??AFGHFIMUfgfZX_P]FMXcrzwj\OBI=@O"''.6-"'7?7.0554442.+)+,->2)-2543NQUY]XO@++/24686>;?B>539379/+.1/44446666655451-(,++(&$&*022//,,.4&95gyic]he]ah]F#8:6?9-1'(1:EIJHCBCEHMPQPMJIGFHIGFGIKMNNC?B68;>>>>?>?BGR_n~|l`ZUPNOIPPSdr|qs]LAT1**('&(+.1.240('/500.+)*,/.4:<;4,&7BLSVRI:*(,./236>?????<<78;9656:4345553456443/,),*(&&%%&-/0.,+*,0.5@uqjciZ^gckW# '4<91//&%.8DKNJFB@BFJPQLHGHJIHGJIGGJHGC<=B46>=;?B.17:;<=<<=6+%&,/359<;==;:776757;<><;4545553267551/,())'%%$$%')*((()+2*6plh[l\dZbqR)*+'&)*()&4Td`SLGC?@@EJMNMHHGKKLJKJFGHGFBDEH*-47:;<<<=DObrĿp`YTQIFELY[\gklsvs~{a2)('&%&')*.*')..(!))()++*)-/0/1133<;934781').1567:9;;<<:::667;>?;84545553477652/,**((&&$$$%('((()+1.Jwh^_f[acle=!.'',.+$$$0Mr|mWJEC@ACJLOONIIHLLNMLJGHHIGDHIL'+169:===>DQeuhZTROHDBDRWYdjlqnhv{~`2(('''''()/.,++*)(++,+**,-002/0,-*754.012,%)0589;>>@?<<9752219:;9756667677776:::740-****((&(&""$%(*-16[oa_`fb_c`H34=761+".Pq}eQE@@DJPSUSNJGEJKNNKIIHJIHELNQ!%+.1456=fgd[g\h[oU-3?:961)&*?azeP@?>CJORTRNIFDIKNNKJGFHGGDLOR!"&(-13458@KYes}żzgXQMLKIHGF;AOYXT[`eP<0/1/+(&())*,,%),//-*')"J?#1/(+)('&&&&).20,-4;889987=<:75455789:;<<<;:::950,+)+))(*)#'#%36,egb\XYcioQ3,6<813.&(=_w~nRB?>ADILNONIDBBIKLJMNKHEEIJQRS"#'(,01247=GTakuȼp`SOKKKIHGEGCFLPSX_SE90/0,(&&())*,,')+-/-*().E<(-,&,+**)))(*,,)'(.5G>9:=;78765588789:;<<;:98885/+*****)+)$)%'/2=gd[W[`deL>2/02:=./5E[p}}x^E=B@@CHKLMMGCBDJLNMOMKGFEILQRS"#&)-//-017ALWaitſrcXQLKJJIHGEI?=DOSTS<741/.+(&$&')*,,(()+--+('=:5/(+&)))*))('-,**+/38=978<<@C;AKUUL>42222568878:;<<<;877774/,+++++)+)&*$$+'0Ti`UV]fda9620,)+/#,B_t{z{xmK58B?@DGIJLKDCDFKNONOOMJHHKMVWX&&)+-..+--39DNW]do~ÿpcZSNKJJJKJIFA;=FPPIA//10.+))$$&')*,-)'&(+-+)'I1,4%++('()))('*)),379:59;;:9=@VbjdQ<3/1112567889;<<<<<:87774/,**))+)*(',&'-"4gd\UX_d_ZA9210*#*Hfttsx}[:07?@@CFHGHJBBEHMOQRPNLJGGKOXZZ(*,.00/+--.4>FNRS]lĺ|l_XSOLLLLKLKKGA=AFH@83-//.,)(($$&')*,-+)%'+..,0T5+5$(+)*+,----*)+17:745>=;;9:::72/***)*())(*'*-)Cr^[Y[^]WU?941-'##.==:<9:::72/)))(('&()()**8Xp\]\[ZVRR795+%6T\edfkt|m\C0,1;=DBDFFFFGCFKMOOQRQOPLJJNQ^]\0369;;630--29?EDCDOaxxnaYSPOPNNNNNOOONMSE82-(),0/-,*(%%""$')*,--(!!(./-3IM95.(,+*)+.13=<;;;:85554:J[c_92.1=@;2534444779:;<>==::999961.))('(''&+%+)'Kmf^\WSSRQU87/$#=VoqhYYcd_C8-*,07>FCEFGFGGFINOONOQTSSPNNRU`_]369:;;953224;>DA>>HTh~xne^TPMLMOONOONONNLLHHFGGGGGGJMPPMKJLTUSQORUZ[[Z;;=====;<=>?@DEEHHLR[it{{rjieb^YUROOKKIGHFHOTJBJPLL=4,(-01-/....+))))))+++,+-( !*/.+-08>9,#F@<;?@>:47::7437>9/(&)/3037:;99::::9775501569::;>;9:=;61)+*(&%&&0-#&JooZNOMOORTS/)PoyxsaLCBB90,210302>BHKKGIKJPSSPMJJILMNPRUY^e\R????????@AACDEFGJIMOU]dhlprrmg_YVROKIHHGKIIHGFGIMTMFMOJE90,),020....--,++++++++,..( )..-*)0:BCC?;5478637898779:74,'&)-14678776::<:9755523568899;;==;62-+*+)(&%%')*5PeaMLMPQSSVQ/*3On|pbHB;7751-/442303>EHMLHHLKQTSQLHHHJJLQTXX^YSIEEEEEEEECDEFGHIGJHJLQUY[]^__\YSQMKHCBCCBGEFFHHJLMUPNUQE@71/++,//.--.-,,++++++++,0.( &,.0+(*09?D63027<<<<:7689::-+'%%(+.568744599997755334668998:<>=91+(,++)(&%&#%,=OTOFHLPSWWVPFVn{[<$+/20.0/.3413/3=GJONJJNNTUSPKIHILLNSX[WXJE>IIIIIIIIGHHIJKLJHGILOPRSWWWUTQPNMJFB@>@?AACDGJLMQUOQ\XD:860-)*./-,---,,++++++++,1.' ").-+**+./254248<8658751('&&&()*147855678886644422478879:<=;2+'(*))(&$#%*#':HGGLJLORVVWT_xtY8%.33245-2312/2:::<>@@CFHKQQJRc`MC=940+)+++)*++**)))))))),10(" &-*,,-.004<<988885<9::<61(((((((&&+/378867666443332257:<;=<<:5-((*))*(&%$%-"%:IFGNLLNNRUWWfzjH4&&*.34430-1201.170.+*(*()****)))))))),1/)$"*./,*(+08:<=>>>=<8:>>>6/'+***)('%%)0357877555444457:;>?=?:83-('(*()(&'%$%)!*ANGEJNMMMQTWWX^ZB,%*.2126960++11/0-0;ILQQNNSRQPOKJLORXZ]]WOEBMGBOOOOOOOOOOOPPPPOPOOOOONNNKKIIGGGLKID?:86669:;ACECA?26<;91.)-++,+(''%'+.049;7554444479<;=<;93/+('))()*)'(&%$#%2EKCDLMNQQTUVUE=4,*,3668;=<6/**01/0,0:HLQQNOSPONMLKNTX`a]ULGEIOIBPPPPPPPPOPPPPPQQUTRQPOMMNLLLIIGIKLKHD?<:44779:::>DA<:5>SOE:53/)")'(*****))))))),0.,+#'#)01./5=BDEC?70.,1662.,+-+,--+***(()+09>755454559:;9:653-('')*)&*+*)'%&&#*8CB=ESLNRTVVTQ;(&242.16=90+,.--++*,+,+,+,.5:7/##(/8?DFHAD>3/010120//..,**+,++,,.-,,+-0/225799986430/.,,.,,+***,*)))(''$'7C?>DIGJOOPXROT59BB6)*4GQTF7*#"(0112+.<98666655-13%'C`JZbSHHD6+*,*,))'+)+)+*,.-/-(" $27?FGFB@AA:1/14334200/..*+)*++**.-+*+-./.0033434,,-++,.//,-,+++,+*,*)()&10(#$'./13,/<:876534-30%9ON5L_^UOHA1-++-/0044445557;>>=<>@DHGGEB?==B?70.03643310..-,,+,,-+++))*,//0/./..,+*)()*+-/0.-,****+,,,**())8=?:<865311/1+-LS4+9UgeUNPA<646:=>AABBCCDERTROLLLNHFB@@@BDF@722134333010//....----**+*+-.//--,,+**))()*,---,+*)+++,--+*)++;<=;?FMOMQPQYW[dQ@0(0?NVE:.),--,+--04-.8FJPPNOTQMLPYa`XQAEIMMKJLPIBQQQQQQQQSSSSSSSUYYYVVRRQQQRTVXXXURQRRQPMGC?;963/.---:RJ+9;Rnvh^_QF@:=>A?CBDCFDGGHIHGDDBBABABB@>?G?6330032111011111311/1//--,,*+)..-/../.)(*+,+,+,+)())))*,,*))-0@<<=CHMNIORU\PFG-)(2EQK@7-&*140-,--04-,5BFNOMOTQLOU\`[QHBGMMJGGLNHAQQQQQQQQSSSSSSSSXVVRROOMMMOQRTVVUSSTUTQOKGA<963.+*+9LH<9E@I`ppe\ND?;?>>9?=@?A@CCDDFHHIIHCDEEA>::F<324101/0101344334331300..-,)**..-....-))**+*+**,*)((**),-+)*/3B?=@FIJIINOVZJ7109CJOL>/-$!*5963..-15-*2=BKMMOURPQWZYRJEHIKKJHFIMG@QQQQQQQQSSSSSSSSVTTRQOOMMOOQRTTTTSSSUTRPMIC>851.*(,GXA3NE>BB>7==@ABCEFCDEEGFC?DCA>>?@CB80463/2/001334522220000,-..--,,//.,***(**+--,,+,-,**)),(+-+)*06GB@DIJGGNNKMSD2,9ITQE=84&)587520.15-)1;CMNNQSRUX[ZUNHDNKHIJKEEMG@QQQRRSSSRRRRRRRRSSSSQQQQRRRRTTTTPQWWVTSTSQMC=82),$3WmeWOEEGHKKMMEEDEB=<<89>==??:300232232333120..-/...----////000....,,,,--,,,..--,+*+',)(+)-=HJGHHJKLMKNQH:7;YQHC@;51&##'0563--.//.,(;FRUQSSUZeeYKGHGIKMNMKHGLD;QQQRRSSSRRRRRRRRSSSSSSSSTTTTTTTTSRUVZZXVWYYTOH=40%)=GB=?VTQOMMJJTG>:@A;499=>BDEEFDDECDDDA@?>===??<600/0023433110.-,,-,,,----////00000000000///..//.-,,++&,)(+(,>ILJJLMNOGHKPPLQTMG?:::74-)')/2200010/.,*9DRRSRSV^eaTIFFEIJLNMKIILB9QQQRRSSSRRRRRRRRSSSSSSSSTTTTTTTTTPPRY\YVW`ijibVJ<.(./(*3015:BJPRYNE?BC@:;<>@CFFFDDDDEECCBB?>===>@?<51-,-21211110.,,,,,..--//////00000///1100////..--,+**&+)'*'+=IIJLMNPPOPONQUYUB:6369880-**.0/.2220/0-)5@MNQRUW``WLEEECHJKMLJHHJB8QQQRRSSSRRRRRRRRSSSSSSSSTTTTTTTTWTRSWZ[]]ix~rgN>210,,4+**)+/11BJOKDBCF>?>@CDDDDDDDDDBCBA>><<=>81,+-010/1//.-,,+,,----//////000////.1000////---,+**)&+(&)&*ILQTWZa[NECEECHIJKJIGJJ@7QQQRRSSSRRRRRRRRSSSSSSSSTTTTTTTTX\[YX]hpwkS?75225<950,+*(*8HKGIIEBBABAAAADFFFDDDCBA>====>:;=93-./0/.-/--.--,,,+--////111111100//.11000////..-,+++(-*(*'+;GHJLOPRQMOJBDHA3/.++.379652//.,,45540/-)1:GKRVY[`WICDGGFIJKKJIHIIB8QQQRRSSSRRRRRRRRSSSSSSSSTTTTTTTTUZ\Z\g|rT?8312332348:9(/6AO[VIJFFDBB?ADFFFCCCCAA@=<<==89:970/.//.----.,,,,++-,////11111100/...///...--..-,++**(,)')&*9GHJLONOQNLFBB?6,+*((*-1475422/-,35521.-*/7DMSYYYYOCAEFFGIIIIIHGJI@9QQQRRSSSRRRRRRRRSSSSSSSSTTTTTTTVVXZ^jȲz]I:1/675453303214H_dZSOKJGDABDFFEEDBBC@??<<==:::::4/+/.-,,,,-,,,+--..//1111111100/.--..---,,,--,,+*))',)&)%)8GHJLNOONNGA=:1+)+-,+)++-457751,-022120.)+5CLV[YVPI@BFFFHJJJJIIHJI@7QQQRRSSSRRRRRRRRSSSSSSSSTTTTTTTV^_ajƵbG7224577976571+6Rim\WSNKHDCFFFEEDBBCB?>><<==9:;:6-&/.-,,,*-,,,+-,..//111111110/..-,--,,,+++--,+**))',)&(%(8GIJMOOMLD:462+*20120.,-,359973,-.0101/.+*4AMV\XUIC>BFDDGJJIIIHHLIA7SSSSSSSSSSSSSSSSSSSTTUUUUUUUUUUWZ]nǵiF-/01530299:75FjpZQOLIHGKF>@JI@@@@>><;9>99985.*0/.-,+*,+--,.---0000111154321/..--------+/21-**+(.)#&%(6JKJJMQI>5520/00033410/.++-2664..+..-/./+&1CR]_WRDD@@CFGFJNNJHKLMKB7SSSSSSSSSSSSSSSSSSSTTUUUUUUUUUUY]jŲcK3/./23597?EPgϨ{]USMEFEHKF??E??@@>=<9<;9:;61-0/.-,+,,+--,.---0000122243210.----------.011/,**(*%$($&5ELROKD:/1000111345521/.,+.045421/.-+++-,(3EU`bYPDC@@BEEEGKKHGJJMJB7SSSSSSSSSSSSSSSSSSSTTUUUUUUUUVVZ_xĴlE7,.478:9K_v֟aDKYULBBEFDD?@??@?=::::<<72.00/.-,----/..-//11222244210/.-,,--------10000.+()'#&*#&>?>???==9:=?>95210/./,----/..-//223222440//.-,++,,,,,,,,2/-.//+'+($() (EVRG:3.-.)*./210043321/..+,,.146884.'%$&''8PdniXEA@??@ABBCGIHJKHID<0SSSSSSSSSSSSSSSSSSSTTUUUUUUVVWW]oŭbB57998Xzۢc@DNRI=;@=>?@???=;<@@>95312101./////.0///3332433300//.---........2/-.00-*++(((!-LRH8.,-.1-./00/-.021///.,++,-.25785/(%$%$%;WkrgQ=>>>>>>@@DHJJLLGE?9.SSSSSSSSSSSSSSSSSSSTTUUUUUVVWXX]m͹rO;:=BGsQ:FJ<7D>??@>>>=\ml_K9<;==;;<>CGJKLLCB83*SSSSSSSSSSSSSSSSSSSTTUUUUUVVWXY^kzï}[FCKZdːYDEFAA??@@>=<DHJLMK@;4/&SSSSSSSSSSSSSSSSSSUVVWUUUUVWZ\^erz˷bNLWn}qGHJ;@@>>=<;;>>>;523654543011//100///11210//.00/////.--------.14320485;22JZMA11250+,3+*)((*+,))******,+-,,,-+01443.'$*B[aXKA:;>==<:>?GKOPRN?6*.,VVVVVVVVVVVVVVVVVVYZ\[ZVQSW[_lïvUIUowFA??=846:77:762677875431322110/..-....,*+/11000//,,./11120101/1026=ASesr<.///...----,,+++......../.----./023666411>II@67:@?@><:;5-0.VVVVVVVVVVVVVVVVVVYZ\[ZVUTW[cwԿy`Zi:2-39@@B?=989DLSVTK8.-0.VVVVVVVVVVVVVVVVVVYZ\[ZVVUW]iм}ޭn?@K@8:6;?=946<;<:;998844433221000/.--.22111000320///11641235326@IVoz_,,.---,,,---,,+++----------,,,,--,,,-.1232571+)/4<=A@?;::ENVXSI4(,.,VVVVVVVVVVVVVVVVVVYZ\[ZVTTY`mпȉP;<@<7;?=;78;;<==<;;;66655554432110002221110043100012654556326?MWorL(,.---,,,---,,+++--------,,++++,,.-++,--/-/0-))-/58=@?=>?GQZZSG4%*,*VVVVVVVVVVVVVVVVVVYZ\[ZVTUYamĸٓWFE;:<>?>:99<==;<;;;8666655565421112322211110001245648:;86349?R[ne:*-...---,---,,+++,,,,,,,,,+****+,..+++,,+*+//.+-,/38:=>@@>:79:9::::<88888888:975455633222111/01345554U^kU(..///...----,,+++,,,,,,,,++*))*++--,,,,+,+,/1210.-.358:?BITZXPA0%,,*VVVVVVVVVVVVVVVVVVYZ\[ZVYWWZbx˖[D@>AB@<57687768888888888;:86556733322111234553214>GH?97:;;U^fI0.00///..---,,+++,,,,,,,,+**))**+++,-,-.,+-136441+-0257=?ITZWM@/#,,,VVVVVVVVWWWWWWWWWWZ[]\[W[WY`gviK:@GA:=223/.-145788::98:9998777223443323199-(';702>JD7?851.+.26DKTRK<2,,-,VVVVVVVVWWWWWWWWWWZ[]\[WXVYaiyЦiB2**-364349857>4444333356677655;17@3&(+,.*%%2AKETaS9%(3244433324433322243332221//.-,+**((((()*+0.++.4<@=:73-+*,=DMMH<4/..-UUVVVVWWWWWWWWWWWWZ[]\[WXVY`hwټy<6559;6-&@:8:80-133332222455554436/?SH403*-*&#,:FQ\^F.%+1355443335444444466655544220/.,++**))*+,,/-**.19:=;;61,('5;CEB;40//.UUUVVWWWWWWWWWWWWWZ[]\[WXWZ_et̿ҼaC559<73259:;;111111136666654332MfZ@43*+++(*/6[^V=.,.-35544333444444448887776654321/....-,,-..----116499<:6/,*.472-.-,TTUVVWXXWWWWWWWWWWZ[]\[WXWZ_cr̽нscKLC2(*,*222233337::9986659SgX?2,+++.,**.\WM;663-455544443344445599998887776543220/.-,,,,,-01222-137:7410-06:962---,TTUVVWXXWWWWWWWWWWZ[]\[WWVZ_dsǹдxG850222334468:::98767;LTC40+../2/,1:RKF@A>935777666544455666:::99888998877665320.-..//01332-*-277422/16:973..-,RRSTVWXXWWWWWWWWWWY[]\[WVWZ`guøw7)//334455687998765458A<,(.*./220.;NIECFGB;8455666775556677799:89787:9:9989989420.//11..+*)%!+165552356850--.-NOPQUVWXUUVVVWYXWX[]^[XUUVZ]gɽr53/-111122442556766564-'&*+)0/)(4CD>?BDFEB>;3100125666664444768576879787:9<=:9840..001/-)&''+,1489;967<;<;4,,+(MNPQSTXXVVWWWXZYXX[]^[ZVWV]bnĸp32.-//1122442256766551-'(+,++*3<@<:9=>ABBA=<643012466666442276655667777789:;?>;75336764-)*/1;;=>?=:89>?=:9555566666442277666677777789;;BA?;:89<>;71/3=BJJHE@:528=DGJF>5..+MNPRTVYZZZ[ZZZ\[YY[\][ZWUPU`tɾl0000./223232224466878320237><<88878666644228766667887788:;=9989==;71/5?EEFEA;4/,28BGKG>30/,MNPRTVZ[\[\[ZZ][YYZ[\ZZWVPT`tɿm1223./33422122446689:56677=DbsyoZA8653479;<:;8::9:666644228876678888889:;<=<;7768;:961/3;??@@=6/+*-4@EJF<1**' testfdsafdsafdsafdsafdsafdsafdsafdsafdsafdsaaaaaaaaaaaaaaaaaaaaaaaaaaaafdasewqrqqqqqqqqqqfdasfwqetqwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfdsafdsafdsafdsafdwqrewqf `a_name c_name ?@4 4b_name   nested_name a_name c_name ?@4 4&xCharacterShortInteger Float  String  Integer Array* Float Array(*P   8 HDF4_REF_NUM. HIMAGE_VERSION! ? @IMAGE_SUBCLASSIMAGE_INDEXED @IMAGE_COLORMODELRGB H IMAGE_MINMAXRANGE 0PALETTEX H IMAGE_MINMAXRANGE @IMAGE_SUBCLASSIMAGE_TRUECOLOR @INTERLACE_MODEINTERLACE_PIXEL H PAL_VERSION! ? 8PAL_COLORMODELRGB @ PAL_TYPE DIRECTINDEX H PAL_MINMAXNUMERIC H 95 MPW? X@  YA! ZB" aI) bJ* cK+ dL, kS3 lT4 mU5 nV6 u]=% v^>& w_?' x`@( gG/ hH0 iI1 jJ2  @IMAGE_SUBCLASSIMAGE_TRUECOLOR(   #? A:\Mp1D String2D float array2D int array3D int arrayArrayOfStructuresVdata with mixed types4D int82D 8x92D int8x9SNOD@ 1Ph  !"#$%&')*+,-./013456789:;=>?@ABCDEGHIJKLMNOQRSTUVWXYhttp://www.hdfgroup.org/http://www.hdfgroup.org/HDF5/http://www.hdfgroup.org/products/hdf4/http://www.hdfgroup.org/hdf-java-html/index.htmlhttp://www.hdfgroup.org/products/http://www.hdfgroup.org/hdf-java-html/hdfview/index.htmlThe HDFView is a Java-based tool for browsing and editing HDF4 aSet the bounds of library versionsUse H5Ocopy() for copying datasets or groups (important for largview a file hierarchy in a tree structure http://www.hdfgroup.org/hdf-java-html/hdfview/UsersGuide/index.hHDFView allows users to browse through any HDF4 and HDF5 fileSet link creation orderShow and modify dangling linkscreate new file, add or delete groups and datasets http://www.hdfgroup.org/hdf-java-html/hdfview/UsersGuide/ug01intHDFView allows a user to descend through the hierarchy and navigtest stringtest stringtest stringhttp://www.hdfgroup.org/hdf-java-html/hdfview/UsersGuide/ug01intThe content of a data object is loaded only when the object is stest stringtest stringtest stringhttp://www.hdfgroup.org/hdf-java-html/hdfview/UsersGuide/ug02staHDFView editing features allow a user to create, delete, and modtest stringtest stringtest stringhttp://www.hdfgroup.org/hdf-java-html/hdfview/UsersGuide/ug03objThe HDFView graphical user interface (GUI) is simple and easy-totest stringtest stringtest stringhttp://www.hdfgroup.org/hdf-java-html/hdfview/UsersGuide/ug04treHDFView was implemented by using the JavaTM 2 Platform, which istest stringtest stringtest stringhttp://www.hdfgroup.org/hdf-java-html/hdfview/UsersGuide/ug05sprThe GUI components have the same look-and-feel for all machinestest stringtest stringtest stringhttp://www.hdfgroup.org/hdf-java-html/hdfview/UsersGuide/ug06imaHDFView uses conventional folders and icons to display groups antest stringtest stringtest stringjhdf-2.9/samples/tst0001.fits0000644000175000017500000012430012050301075016620 0ustar sylvestresylvestreSIMPLE = T / Standard FITS file BITPIX = 8 / No. of bits per pixel NAXIS = 2 / No. of axes in matrix NAXIS1 = 123 / No. of pixels in X NAXIS2 = 321 / No. of pixels in Y EXTEND = T / There may be FITS extensions BLOCKED = T / The file may be blocked CDELT1 = -2.3 / Coordinate increment CRVAL1 = -73.3 / Coordinate of reference pixel CRPIX1 = 12.0 / Reference pixel in X CTYPE1 = 'PIXEL ' / Coordinate type of X axis CDELT2 = 7.1 / Coordinate increment CRVAL2 = 300.1 / Coordinate of reference pixel CRPIX2 = -11.0 / Reference pixel in Y CTYPE2 = 'PIXEL ' / Coordinate type of Y axis OBJECT = 'Ramp 8-bit' / Name of image ORIGIN = 'ESO ' / File was prepared at ESO-Garching DATE = '19/08/92' / Creation data of this file COMMENT This test file was created by P.Grosbol, ESO (pgrosbol@eso.org) COMMENT Simple 8-bit ramp pattern for testing of FITS readers END   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;jhdf-2.9/samples/data40x10.txt0000644000175000017500000000235112050301076016767 0ustar sylvestresylvestre0 1 0 25 25 0 50 40 -31 -51 1 10 -19 34 4 2 49 44 -35 -56 2 15 -7 37 19 3 48 37 -24 -51 3 17 1 38 4 5 44 34 -30 -56 4 19 9 39 12 6 41 41 -26 -51 5 20 12 39 13 8 35 46 -24 -53 6 21 15 40 36 9 31 45 -31 -55 7 22 17 40 5 11 23 44 -34 -51 8 23 19 40 35 13 13 42 -30 -52 9 23 19 40 1 14 8 36 -28 -55 10 24 20 41 15 16 -1 44 -24 -59 11 24 20 41 29 17 -6 46 -34 -50 12 25 20 41 28 19 -16 36 -33 -53 13 25 20 41 28 20 -21 36 -35 -58 14 25 20 41 11 22 -29 41 -30 -56 15 26 19 41 11 24 -37 35 -27 -55 16 26 19 41 13 25 -40 41 -27 -51 17 26 19 41 14 27 -45 34 -32 -56 18 26 19 41 30 28 -47 34 -35 -59 19 27 18 42 11 30 -49 40 -32 -55 20 27 18 42 20 31 -50 37 -30 -58 21 27 18 42 1 30 -49 34 -31 -50 22 28 15 42 1 28 -47 33 -29 -53 23 28 15 42 36 27 -45 39 -24 -57 24 28 15 42 9 25 -40 35 -30 -57 25 28 15 42 39 24 -37 37 -28 -52 26 29 13 42 9 22 -29 37 -30 -58 27 29 13 42 17 20 -21 46 -23 -58 28 30 9 42 18 19 -16 35 -29 -51 29 30 9 42 34 17 -6 41 -29 -56 30 31 6 43 12 16 -1 44 -32 -54 31 31 6 43 28 14 8 44 -25 -60 32 32 2 43 1 13 13 37 -32 -54 33 33 -2 43 35 11 23 41 -32 -56 34 34 -6 44 12 9 31 43 -33 -60 35 35 -10 44 24 8 35 42 -36 -53 36 37 -16 44 3 6 41 42 -30 -55 37 39 -19 45 17 5 44 38 -36 -53 38 43 -17 46 32 3 48 39 -32 -54 39 49 3 47 21 2 49 41 -36 -51 jhdf-2.9/samples/Roy.nc0000644000175000017500000000766412050301076015727 0ustar sylvestresylvestreCDF0 lonlatref_time sourceCOADS CMR5 DATASET DATA_TYPE MONTHLY MEANS COORD_SYSTEM GEOGRAPHICALCOMMENTQmonth since 1980-1-1 00:00:00, Latitudes: 32.0, 36.0 Longitudes: -140.0,-136.0Platform_Types All Platforms lon  long_name longitudeFORTRAN_formatf6.1units degrees_eastlat  long_namelatitudeFORTRAN_formatf6.1units degrees_northref_time  long_namereference timeFORTRAN_formati10unitsmonthsSST  long_nameMean Sea Surface Temperature _FillValue?units degrees CtrimmingALL instrumentunknown bucket implied bucket SST_obs  long_name1Number of Observations of Sea Surface Temperature _FillValue?units number_of_obstrimmingALL instrumentunknown bucket implied bucket SST_var  long_name0Variance of Sea Surface Temperature Observations _FillValue?unitsvariancetrimmingALL instrumentunknown bucket implied bucket  BBAsA xADDAu*BB$B@BlBBh5xBCF?AA$AGAS3AAABAB#7BQBQw@AwSAp[AA(BBBB8BC%BjBT@@Az,AzAHIAB(B BBDBJBB CA@A}YA|AAHBBAB(B CKCSB@A5A|AAffAAAB0AAeB4 B@A A[AwwA~AAAB BBTvAQB}@A3AAPuArAAA`BApB(w@ܵWB/AA`A'bA34ANAABBPB(8+Bv(B(BAAAAAB ABB<BtBBCA AAE~AABdB`B0B<CgBrB qC>A0AAPuAAnAABBB(#CBڷC8[A@A66AS2AAdBBABB]CKwBBƼAPAshAw+AQAAAABCؚB֐CWCA`Atd7AxAՀAxB<BLBTBlCBRBBbkApA{At""AALBAB$BtCbBCCDC$AAzAAbANAAAB<ByA^BoQC+AAuAmAdAcBAABBkfBI&CҞB"lAAA AA2AAABBVBeOB CC{AAP#AsAA AB A ABLaCƇAm#B7AAZAAA^AAAAB% AB)[ClAAJRAA%AABABBKOCE`.BBыAAAPAkA'B B,B BDCUB>BCiAAmAA5A=qB BBB Bž2BCYBBAAu\A\ARA AAAACD.]A´lBAAsAtNAA8AAPAAB4ADdB *B@AA}AvffA~A+AAAABB$BfCCλAAm AffgA(A{Z6AAApAACB=oB(BEEAA|AA5ADDBB$AACBlB'WBKbAAlA A>ApBA0AAC AZA1B}M>}M>}M>}M>}Mffffff>O>O>O>O>O"A"A"A"A"A"A"A((((((((((((((qjq,.-            !      *&&!  3#"   -) -'%(#  !3)         ($*" ('!&*'#$#"&    -(* !$)        ! !$")*  #'*,(&# % # "2% 0+,0)#$! !!# #'      , &*)(!- *,#$24/$ $  1.,/#2;;+24I(1%*;A:<848141'2.  "(  #%&&( !     ( $  #"  21+*!$   "#<0#! *3IEB6D?N8-6CIKJL>??A-66=1%   %$5#*+'&'$!"1/!    ")     %'$ )+& "#   : 8=+>3A.,3254?D94L;>J.LG;0:8/3E14+,1    &#0(A,%-0!/*$$.""     &&1-#$+'"$,   '% -$+    ,(:" .5A6","6+*)7!6 ,6987"9.   <  ! 0,++#( &4." )*:?+);4@A&)081BB2&/-3$,6:A[UVUCXTDL+OUAF>HCJG1N$#R](G.$&6'%*364=:-(,&7.%&3.>/''0;!$!!)%') >+*!%" 9+170#53')-  -1(%!$ ##>FE?8<*$&-*&G7>0.<=?**% =+!"-;,>@9A?E,.1-,*,+-'B97  !%03+5<%+('*' $ F/#G<:@B?5-0$4&(&$"'C>B=:;;3=4,&)    (9 6'B-K8J;G6)B*@6/GBR\X]OaWXVYX[\^^D??A@NCJll9BDG$L4  /6M/N1+IBH@GFD @5;5&-3/1'-90()) %''&$)+.$#1 ,60$.414-$4+(ID=B9?&9.;209*&=5& 0''')&%*12""  "/?%0'))"0,3'46?='03HL-,&%=7,(7,- ! /561&)=57D@3<25*E/!,*80+10(&:=8) ($+),$*"##28/+"  ,=538013/>D5/0%A().;12+   -?8A92.81B Z:K9dx|_ok^V]QdWT`NT>|{EFBC?GDE@?85-1CRKS]R +"9(((/HB296DH=:(>=A1;>5!* +'+FNR+H#!,5-/')% $/<7,-"(,BJNX+rWb}{fcbwdUXT]_~D?8]KICJEGGBE?:7475O`MY1bim^iMZT[\7+27B*D3-\AB0@<;6DC072"0!M.1;,2:!6=30$+)"& "%41&+.,DFI8)#"93UJXCGQG=hbl>ge]YYMPLMTNF7>-*$(+/J4.!J .(($  ;<:+2/1=9.BBL?>GNR7akXexbY~Wd^__cs[]]UEZ?LHIGCEEGA@B<@:95RQMGBcb]ds_]^c`^[]*/#-JIG-@*L/?@;E:(-"8!0,+%7,. /@#*S8&HAVRUQ`yR{|g]xoY^d[VGMKGANQ;JEC:>;95:<684)INKffkorjqbmh^ao_ke1S#)4H>:3]GAI5$87:9IHF;H?5%2/!(' .(A1+336I+1,"&19A0 %404-28)afcigje`\XUo;d~mj[WjYeK=.64HILA??6/$QEN.&;*.'-15%))AH ./@8AG<4P43EMGRM@Fuy^_lcfghQ{PXkhMF@?NKD>:D603648..+EN?VG:D8ENM>JM7WOI24?LSTHAML.M-*.1'3*%1-7.8701/+()=5)!)6;870_oH{rld_KUJM:Sh5cRY^|fdYF-@H@CIED#568VE=-?V82:-*4(3955& ' 0<"95,!=)>2FUN[Ta_\~~yfe^mso{zojzlq[]eJTONEA>:9904956/QB%lylsvwokjnidechcegg%W 3a1EBOG?FHJBJZHbII5C;1-8<3/B;;M8%.+91%,471)A0% =DPEIN631=9BN,JZo_l{~yuXc|~yxw}}vjlBY\NRPNHB=97:0.441,JMZxt2nlueqhpkvfmctj_2-VC8'9(75 f+kt{2vxWjzs`di[LjdUUSHI:9IS17/;B?;;2-62*6GECH6;2E@F9(/5 '741<$H: $R:YVQPWRM8RWQfSntumrrpxrw}y}frroidSkZULSULMFN?:7<24D=48XT6svqnklnqgf_tcealcc]h4T,T'NH-HK@PWWkLZNGMK@A;UWTl5EGXTEMGDCXAUR[`F;4NF/:6FA4'21:,B>G941_ca1.I19$9[^^[M::< 4Jo&zpr[`u5fkhfKOiZdH011H)7PLLUDBVb%5#* #:815,415M9L[I_P;FcS`Qajlnwi~vwfiN}daY^SJIKF?>?>3:5AD95VmGx/mghjspox`:`h_odfZhZ+N84WNeKNUTNSOD>QHSWOXT<\dIG\VZTQ_ZUPN0RM>>8?1.8.>1+.FM,D0(0QRnlGL2A$HHJ;[fgg^U]RK(,r~_zWgsufUVxZ]P:Bt9WOkG:7-Y5M5963 "eZaKgDsG=]P/='F/  ==8G< ,!(82 [P+RV*ujiZFfn~}T{sel}jhb`XSRRIC?HA<:<5H;8G8:$ghf\^aeaddfa_]YVXV0YB'SKSSOP APNMIZ(A7:?TKDtB|V[^3FMBddWRNOUNP538278Oi2fL;S0'F7t>zVJFJH74HNNQgVGL^c]?'.kt$T:&_trpqcr}ӆwС}r_^_]XVKrHD?KF@>?26<6%J?hca`aZ_lbbd`bX3MS`MIBAGBQMGy?tU[AObctugLBOP_TKXFQMH4I2??D7W3pnga`U7/7gD__wpTSX[^XSKDEBJei]T?7vRQ;yaHpgKC@3|SNB5ApX.LIa,WmUBI ^TRLUYSSNPG>/34HKHQG80$+ 'V]`RUQJFMTirzetZ{`dnfk^ZUULFMLGRSA<=?4>*$Q=?hf_jhe\P'P@N)e/IMNYISKLBJg@^]\Y[b[\ZZqwwxDjPG@E^`ZFIJV?NIAFX,_SmrpumEpgTs8q{tofgt|ve76QJeZR6M0:PXmocnWQXGdgOeYImolaafl}[G84:jB\]NL>h[^[HX@=, <:WNHKLC6;UYsugK6FGkS+uFnyN‡{d{V[nTfxrnOIKLNRVPDAE979-%O? /5cjK$!/,J4.*35@N>^NZNR_QPMNLBBNX(e\igtsUl}Bjf{Gl_bRjeFFMQb^_DUx~wvotSLnse}~jztsmnMVi^VOFMJRU{hYwusG$`.4GxqivMWYZ<9Mwm@.U|bUfacmje?0$64DYLKJSpibb`KDL?XeXXxuu]wn|fr[e~|ctoSXVmTTICBB;65/G+=7Z1598$76!B )%JG?62XPMZW^]Xk^UPMQAPB;DS```by~uP,>>@gjn]glcjqINlc~tvyUrxxoa|ry1V`B_S]TOZb[f]3s{QYf`Ap[Z^zB8!=XcOQdT%&:"MW]\A9!Efuo܋Αqc\ottpoffahlRMUWPPKWeP@@"IMJBHUEA66A>69>/mc\_VaWSSFmA2>^A6>"tsxuv}\oap}}zxa͡na}}yybYqj]rx{FGOxXTeWz?M:OQf]i=WU>D7P8I=S*DOVN|Fk^NY>NC4SIajѶtھɑxvsqXMsniv[G`A=Pv>eNdefbRw}NWbym׸\YUt)\RlbqvұϙVvZ:^\\t8hSPVȣڵͨwip\u}~xyR]NColYKE;1Pckż6|wmvs|~WfvseVV_TIOZI{̼u~K_ShӰi|tP?4vnVyٿϠzbo˔ɖ~wz~xwiinmi~}rų۞ѼӘ'ͱȧ㧫mjk~pxfaưZͩ4mA|5iҁiX.\N^IJ\tRG/jeqմɨӡ`_{|}~nefmbk~z¼`̭ğϽ⻺eéʫӡombP3x+uL?8^/xqkklIUUyʦsOOF|w`XɁ|óⶩvyx~{qvzkzmh}~Ÿ²rqyfrŽAH*SnjygHz}0R>*Zw\Ӫ`U~ZtomíPO\bTrg۾vݐѳԮb{wzy}r`^k~x|Ӿ'NjϾزβih~Ѹ۸s|pKAfV\5X_LJkvl\K@'7#EJg:PVzigZnTIUkճؿѻ쒜òƦùİv~tmP]h|~}¹Ǿ Ɏá;LשakzeLSgOMJj`D} ! KkjR}xhh^a{mwn]\gWi`njqQqklݶ̩ɨ׾䌧Ѷ~ry`jʫ̸ƴɮڌֺôĄ?pVkg"Nfg]@k`dgw(K3M7fNeEcpmbhXe}aopsQQsy_fDqmswiۨîvȽߜм߫޺â׿u=VvWC`|w|e\~^_BB8Rl%bknNZTX_e G~uxʢ]Ezvj~ܙ{ȷīyrɼQϽ̻ܽծġo}z3z"q3^7&\;T-X=XmH .uhUim+B\RSH>WDabU@F G9 rt[wksʽ{UxadBm,ݺp݃нӿȰߋ^~fñp~qgqOS&.ZBG5?]_4UTkr`F ?+Bakkf{d͟ɏw޻_Fbek`k@mduR~F;8XgrKB4gjN.X Fgg`زñ-ҮөAԾľ̫sWyz`jls\Sp|@XE86HK8jYGoYIiHLR(9JGPurUqٛҹϠܱԋóį˾kǷӶ^PfsvqI_baoNTBFi-|[qdU1H_l@o^F HrW~ȭ\ӡùЯѳʵ©uɷ÷{6w8j~nr^}RTpQ?BN2_URGTb2[2faV!an}0̹{ؽ˸K4z@xqkdNSU`;QOCGd0"^_q!HAlTpfbidrQwɕsƶ|ȭкݱڭ٨~s`T|dZoVt^v(X71Z_Pgss0qʶ{½ػîC0Jut[x~cC5<2 1+;U.idSpzmtebVhs}swtй߼ζ@-&z[m*M~6`W5/DXKs| ck}~}{axԱȪ|{¤Ľ¹ztŗwE[ >{3:y2Xcu-5W3#ZZV84hWU:T\i-KBvzZ~yq{zرī`fɪbbɽhe~i8'{SoDxoBOCVmuiQ#dZ2:W .R~M?c\ywv~{Jr̙Խpnzsu~q|bX?wu|?q4 7Gx}]gvwrxrϮķ~}pbrXchhhc}cqWf&TNHJjZaRaoqomzy}kcLVsתþë|iskuxV|~zR(/^T.0rt}=ev \fp?]5riR_zr[ִͺSjrhkRX_n~Y\HLu{wuqE{%q?0gfΠ0d8bq ˬ־˴nyNqb=srioBdTYQ4ljBXF>ltVToFb&Cc~gT'dzyιվReBejrE|yJj(isfU`flmAh~'G]uJGYbc)yvĉByoujzpG]hVr ka8vZ{`li>b#FgEKbtEswv߸εzktcxCgW5jxw}g$mdVipIZH]3=sdlpܾ޼Ѽͤ˲;~{gsy_kurn{dzdzthJxbydxx{~tĹݷԿѲ}CiepxqW*xt{{j{>{~xesȼ߻btnyswp]al:lt2`d{y?,rmpixfr#PH.i>[٥Űoq4{jgyg{wxyw[l^]RkC{sarlAfTtp#sݿ{ljmuycvjh]ovqxdl2a\t]u[{oYt}u˽w龺ϪgdJ\hsqbfvt`u9&lyhtQafylìnxfF`tv\yip}gmwzu#oy`gpgh|#Dy\{|s`rguqkh}O~fnc|i^Sds[h~7oly}mqYpyW u|@SywgyQf?٭ܪyqyvswwx3uZr<m5dkݮajmz rqfnz{7n|o+p|s#J…٢ˮRxeJfng{~ov uowca}lwyzǫڿϹӯ[xsvup{~dw212@S{\x{}ym¸٫ѸƯ˸ʺXy\LJS^o:ro]ϩ˖l侣S{ʳw{Y~akq_hWwk~~ʫ̵Ě޴@Vjayjitsd}oh}񫹵յʦ˱﵉ ųT:pp u|j[|vz{d|xsѩԾ𳢳T6cK9$&hRhCNylsp|wz}̲ƤϴpҰuŞK~ysjp>n>{y fUAvyfy{zswЫp˽ɩ\wóo}ch}Fyu|.{AhEdv}`d~}t|~yxfy}kqͼն%epXTlxq k~|_J~|g<w~xw~xeeji)yvۻtx1mz|}_^sut:2A;>dxzzZ2gqUhgo}s~|KzBR𮢛˩ags*|mymItnSP,Xt~jOm~~wuo}tl|sbz~{|yƍɩ귴Mivx?|qzU3czU|}x7]rxr~kpUi}~}xutk}1xxxom[hykq|ͯùۤZulu;6-;}_er|AQ<[nuz 1}y~z{txuol_h|vj~xuplnq}oNxtJjxp-LE|aUq~:}ptzmex|{gHz{pujsuvnqC rzxmqp}~Zz[VaԨ?~to{}nXuQX/}8]Hbv~zd{sxn8hc|~b}~}vjn!}xyyxe*}uzwpVxz~}gsRn׵ӿhv~9lfc[w_Erxcl%-[]yp"wibchIdpqwwAqz~ovettydud^|^yuVnx|zvzpp{lzɰ4LOnȿƸn}Hy}6MiVF0XtKmo\{}y;}yteprvtiU_x||~vpxh{b}q³Ȱږʻ~cmttq]:neZLUzn|a3c}&}zQrT~.y|s|y{sn}}w}GuɔĜȚPzv&n~x|}lj_Blzgw{u~y~txxtu~py}z{}|xu+}忪ҼofJiwDvl#Zsnv~P|zmugy|xvo|t}fb~r~i~oo}uz4zѾɶȹŮ}bm3%UsxzXah3IyHy}|pyhrxxg^asi{zZVr}v{}x1}~nvr׍Jukiah9v}My0zZ)oiwla2u|kuM5noXPfink{t}x|^Jqr`qp_|yw/k|׶x@_oz{0`xVfm}{iiqHC Jxn"L}g{%}(tmo|xhvwonbzr]w`t2jf|}ـe}y0zzrZ#y`WD|l`Q~wzZsnZx||~^}prwn`fMrwVowBorvvobLkwdxwa:wļХ|B M)A9*o~Spnuuv+sppNjUhzwry~tn~~Haxto}prmJSUGziVuܺϩrUyZ}ke~c|~uzfPuw~l9l~quok{kFVVyw{yrhyPetvotwPyue2wwqmoQVƴevct}Yp|_|gztn{x}ylDduddxxHD`bw|rS|PdmqWySrZx{H{x'Yֹzv|_[H yP)sJm3Z~Jiazq~{||ff@T[(Bwv|aVqt~}0z{{hxa~F.~CA~}hŀԹʬZlyctip{{lqP|{Yz1C[xl@c:QkShLe{{~t~~zu~pwje\Gl{.ˠ$ypJ{|lO>tmk}~tzsxmyslmfjt8+V^bOqnyt~pxz|qy~|{rjc|Djʶۼ⺝hcU\peup'aTvmfyb}D{x{m|{:R"juzzvvqwiv}judv½ӹJZDymuZ~wbx.uy|{zx_y^^qyhƼ_@xyaWj]8tٸͻyy~L~nf{V$zm={{lJn}wygu{tTx{{~ux|q*zʇü4Ph{㾠ӵ^wv~c}bqoZu{w{|{MqhT}xzg{{Ͳə̕}u{MvamϏȬ_vոײ|q__Ixyf|qozx|e{skyYn}UtZ_dŸŇq{bj~E {q|ʳ߱կú{vlWzhVxOL4{o}y~C~re_oX|~j8U̫ӵ~Z}$^dFt|ɯ|~~lmXJ 31kx{w'{}k¾ſӲʒxeyӺýҹ`R.yr{~~ps[ZxqJmŹϹf|̴׵ãƩK_j/yu{dv|qc*9?ddɶȫٝny~D֛ȹ廩Wgeasksx2D!ah#fյݧyeη˲±ƶ~kLR{JiZrrmҲ˨ǟxɿپЯ*{Dva5Ȓɖ˳yz̪ܿǴش}ⱨЊwx|t}|?{Rsճp}̲˓êݫͷ\jͷᝄkjjzʑlox­ԭʧʠʒϺƬ'<ڕvcX1stug$mQoux~ȷºɴȼФ!4ͺ̓zEuw{q`P[wz½пԓηsδԻVwpǮª]T]uRPӨÞκͽϴŹJobUofQϝͼx}ϮŹ7XIJolկԺĶjF]!ﶳδڳ~ʹi㻞^K{rqȵȷĿN2k0ïpгw=kcqls¹ʹο±~cEb,iկ׼ȪyҺ͍§e®ºήd+WbҳξԼͺ˅RvΔǿθдRVYʴӲץ·rlju竱Žȸ̨yu N~űమŲz䗄සδ·ξ¾;ߠߚզ}sќ쐣nĻÿíżVy洖ۿh0ý֙a4uóĭķĻŵkgeβɯӳnծƪ靯ٻʰ}˲ԓt}wЁXjݺشɿǾδ ־r{ej}ֳűjxoǭ赸ܺżĈԴپKmӰsswִͱpvzpY86Ü߸ʴ޲߼իܽǷ攰vΔ_rҼͫvqqxow˰ĻشᵦۺǦޘx}Ѯit|o]_(ηõŠ۵Ȱew[ͰǬ'{lxM=Zþ߽Ҫ‹屏ǿԻz̫FtUвbei,Ҳ½ěȿŮ̆ƿܻɰx˟wM4Vj̮~uSïȭwmӭgHyxѰvrreƉáumw|ƹƱدQvl[tsϪw`clL}~owqqk`ȴ®n9̣vepmmieV|}ҩŶùӹF}wOYeyqqA^mPYVw{zŮz۾{n}{zqYnzhogwuldeSo|dıxhЛDȓȰc,{rsm\_lKh$u͹ߴ΋qki}}iopcmy[hQbV0rpXϷӻn["pЈ|~uxgwkpmZR|rVUKpjnBGau}ֳƴtiwynxx{wqj_m}|j{{q(<]_z=xҿξijfuu~sooZaqti;dGfSmyubu|w˵ŰʬkwYSf{xwtqetjxRmd6CV]{g{]cYomJVMgvεأȺpxfKz®y|stxsmnjY]p(\`%Tp`|U;uq|JVk}wtϸģκioz~yhwypcrh{Rt[aiNeOEORQR}^kȹȝ{˹űneRsqtutlk}pY]pr6WuXlSroI9usLVPstyzĹǸ»|pcXV{frpizf]PfZhnpqp{~Ҡҕy`i|sz{kn]Zg_pwFerӠhmRa~w~rzodbf`~o˿lQj`~c\:wqqrmfaebs»yySk^|y|JcsnkklmiQX~yoOv\_~vHQn|ibvkh^T}ffS\CVQX_9qzhom|piprdW~zs|xqwKQZGL[}kuzsjeaxyi~KO]TRUX @x]olY_ncKLOH\N<'_m~}VrtBA4cCFX_|myMUeM-2np{D{IigpX[7#CFzv;]zK_[^W^9*`GNjH#j@H\jgC.JL,?.B:ESG:4+%2"5F//FE;TNW!%2=7"NJJPc $ 46M8K6FAHH<+-Q#NOH/95gDX9JGM>8759;O2MMLL2,@SLZY"1KJ`[g7[2VVCLH9,KF /&>?=9%78DMB- $$-%B,?-'  U  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~,.-PAL_BROWSE_SEP_21-30_1987.HDFdata_set=AVHRR Pathfinder data_product=Land 10-Day Browse granule_size=0.350 geog_flag=g day_night_flag=D granule_version=1 THIS IS A DISPLAY PRODUCT ONLY! NOT FOR RESEARCH PURPOSES This is a browse product for a Pathfinder AVHRR Land 10-day composite data set. These data are subsampled every 8th pixel of every 8th line from the original 8km data set. The data are flagged as follows: ocean-1, interrupted-2, missing data-3. This image contains the Normalized Difference Vegetation Index (NDVI) with higher values indicating increased vegetation. It also contains a thermal channel in which 16 bit data has been rescaled to 8 bit data and in which temperatures equal to or below 273K and equal to or above 315K are flagged (as 4 and 254 respectively). Browse data are meant to aid in selection of full resolution data products. THIS IS A DISPLAY PRODUCT ONLY! NOT FOR RESEARCH PURPOSES Pathfinder AVHRR Land products are produced by the AVHRR Pathfinder Processing Team at Goddard Space Flight Center. To request PAL data sets contact the Goddard DAAC User Support Office: DAAC USO NASA/GSFC Code 902.2 301-286-3209 301-286-1775 (fax) daacuso@eosdata.gsfc.nasa.gov begin_date=19870921002125 end_date=19871001224757 satellite=NOAA-9 old_producer_granule_id=PATHFINDER_AVHRR_LAND_SEP_21-30_1987.HDF producer_granule_id=PAL_BROWSE_SEP_21-30_1987.HDF Di8UIi>{2GROUP = BROWSE_HEADER DATA_CENTER_ID = "GSFC DAAC" DATASET_ID = "AVHRR PATHFINDER LAND 10-DAY MOSAICS" IMAGE_ID = "158492" GROUP = LEGEND UNITS = "NDVI" COLORBAR = (4,255) DISCRETE = ( 4 , "< -.05", 121 , "-.05 to 0", 128 , "0 to .055", 135 , ".056 to .111", 142 , ".112 to .183", 151 , ".184 to .255", 160 , ".256 to .319", 168 , ".32 to .399", 178 , ".4 to .487", 189 , ".488 to .655", 210 , ".656 to 1", 1 , "ocean", 2 , "interrupted area", 3 , "missing data" ) END_GROUP = LEGEND GROUP = GRANULE GRANULE_ID = "987" START_DATE = 1987-09-21T00:21:25Z STOP_DATE = 1987-10-01T22:47:57Z BROWSE_TYPE = "FTP_Only" SENSOR_NAME = "AVHRR" SOURCE_NAME = "NOAA-9" CAMPAIGN = "AVHRR" DAY_NIGHT = "D" PROCESSING_LEVEL = "3" PARAMETER = ("CLOUDS","REFLECTIVITY","RADIANCE","VEGETATION") COMMENT = "QC_COMMENT=Bad scan lines appear in northern Canada, southern South America, east Africa, northwestern Australia, western Russia, two in China and one in Mongolia. Missing scans in southwest Canada and eastern South America appear|PROJECTION=INTERRUPTED_GOODE_HOMOLOSINE|NORTH_LATITUDE=90|SOUTH_LATITUDE=-90|EAST_LONGITUDE=180|WEST_LONGITUDE=-180|PARAMETER=NDVI" GLOBAL_GRANULE = "Y" GROUP = RANGE_LOC NORTH_LATITUDE = 90 SOUTH_LATITUDE = -90 EAST_LONGITUDE = 180 WEST_LONGITUDE = -180 END_GROUP = RANGE_LOC END_GROUP = GRANULE END_GROUP = BROWSE_HEADER END 2GROUP = BROWSE_HEADER DATA_CENTER_ID = "GSFC DAAC" DATASET_ID = "AVHRR PATHFINDER LAND 10-DAY MOSAICS" IMAGE_ID = "158492" GROUP = LEGEND UNITS = "degrees K" COLORBAR = (5,254) DISCRETE = ( 5,"273 deg K to 315 deg K", 1,"ocean", 2,"interrupted area", 3,"missing data", 4,"temp < 273 deg K", 255,"temp > 315 deg K" ) END_GROUP = LEGEND GROUP = GRANULE GRANULE_ID = "987" START_DATE = 1987-09-21T00:21:25Z STOP_DATE = 1987-10-01T22:47:57Z BROWSE_TYPE = "FTP_Only" SENSOR_NAME = "AVHRR" SOURCE_NAME = "NOAA-9" CAMPAIGN = "AVHRR" DAY_NIGHT = "D" PROCESSING_LEVEL = "3" PARAMETER = ("CLOUDS","REFLECTIVITY","RADIANCE","VEGETATION") COMMENT = "QC_COMMENT=Bad scan lines appear in northern Canada, southern South America, east Africa, northwestern Australia, western Russia, two in China and one in Mongolia. Missing scans in southwest Canada and eastern South America appear|PROJECTION=INTERRUPTED_GOODE_HOMOLOSINE|NORTH_LATITUDE=90|SOUTH_LATITUDE=-90|EAST_LONGITUDE=180|WEST_LONGITUDE=-180|PARAMETER=CH4" GLOBAL_GRANULE = "Y" GROUP = RANGE_LOC NORTH_LATITUDE = 90 SOUTH_LATITUDE = -90 EAST_LONGITUDE = 180 WEST_LONGITUDE = -180 END_GROUP = RANGE_LOC END_GROUP = GRANULE END_GROUP = BROWSE_HEADER END DRIG0.0RIG0.0jhdf-2.9/samples/apollo17_earth.jpg0000644000175000017500000022531112050301075020145 0ustar sylvestresylvestreJFIFJFXX AppleMark            }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzw!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzPP! ?w;l'M;"bK_3Mr^HF}I N5` hγtFg 7_waҶN:5kZC_CgymV ~7ciֵf[[XLm[?)1g}Wu,r\ϝt<Wu:WMHd6M$ `y@c_WI[[ֲiƒ|p9+mWľқEѵqoC<6w!@~Qy>(IPr]Ͽ_:YŨo<j .jkQHٖv[uT}0nʜ'+)ҧJQJ1Z/>V9ݽKPW#Oi6M$=x9OGUq_ z3Xu ԛA"K;kIh`dn' $WxD<^AjwOG MOAGp#1Ip)֥ð!?6{5.>Q9O[>-OWSHt>ce@rqny.Fq}vE孤!_}*߈qfԣ-?T:O{L~ɾƜtmgG 6g$cWuî//2\Re/'p0q^i_w!ͺ=?"YVnr--;>c@#Œddu MCWηUV3c6vz6iNg}-ccOW:ej;kѲ#c|3Ŗ`vn4b:^ty. xGDӴ i.| TƇ%0p}i T/*۫憲fO<lnjG%6 ʻp ݗ I&# Ou"!/V3?-70b4 3q_~#m`_x4xmʹ8DV\gc|iG;Yz,Cݮ;nɭxruCy @T2vFg W@~!=- MVty`'Y@r9$ xxRg=Yӹ:h +ŤItv7 MD==3ĚM#x%t6Hk d*,P*>8F5ГOn_ؽeV}[d,kIbS C B{60iڞ-$OŹQ+@yjU:loß_WP<_; bm.?3ΗoV0 K>6|aЯؒS Xr&C*@IN}͵nc7Qm!B  ^:qɛOrŏ7]G"tP ?x']?_VX\#Jw#jtu ۉO֛y5S AppleMark    % #!,!#'(***.1-)1%)*(  (((((((((((((((((((((((((((((((((((((((((((((((((((  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzw!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz" ?Kߓڢ :cAr8P0i t fx`CsLRcQ%8搑ר4`='H.&`Oֆ8֘;pP9TB;ҁ9sH8JRH!0Ɯz~|ަNװ41O#Қ~cJs9)9BR80xҎ"9=:A '5=Maw84YW)3⺋_xC.QOyWS=68ۼ#5iT}]7nzUC z_4dhV-Mi–i'I3sV 6.tu S/5x* d䴟ӣJ$Dߟ^*}XEUB2QN(0ɖg?[)[} ׵Y6 i4_Y_x"7("rWma̍ gυ> .(F 0F:PFI9x$aue2lݏ+48T穨J3A 4`zJ2:Ry#0nF)G~!6`szV8H+bҊSyc5@(PAZ?/R1v~^9(B:Tr:u4)9ixNF=v'iRbO pQ(ھtK:KϿS@<~<ԈiiFzSyҔ` 7|QxKrM i˃1ȥ -@ H@QV4s@ t(\ 8]\_ߚQ)ARfHÓ!NiW `ʀ y$KQb>Vbx {kѼjcҡpzkx+@y}Be2>U=A? <ȉN(-"TRݜLUt&/bz{}k{ŎCP0OA3(hb7+7@Һㆧ37ROdT~hƯxpF]52Km*9W%.;uRiw0ogry{sQVĭ48tURJ{fhXo"] 7ӷ_5ZK=[\\.Rpcեe]vd7>/od.:IT;tHҸI.|J\8TRI!$ddO_1_)TEyp2TiTXD:T2:F#皽ka#AmRe%`x"昗W d!I@ \UkH3.d9qS$W%~.s5laF5,LS;-(wzUIq]3ck0H`|!61TKeIp'5#-$SȒ"2*n$YLcI!r+xm!WIsGb}c;|sn+]3Ht;w ^HcǥWr *8%"G3 7""v ߊiMlAUF@ؤwd>=;`McuotW'%D}r9">m\|RC$ gL2 niG-,lNoiEFC!=+>OYxh^zJ[3>lH\ջTD > f+eF޸S՝1g`]sXg]R]O/d4*}cU֩ӯJ+>Qԣ(r~wj\$rHA'j21@\ zA'iw} 8(zRrњvSrTrAqڐ囯oʩL|R|vIٷޕltVg.w?%3ԀĄFzch-BK ^qX_L..Ĉ>qf@hAg)bZ49!i|EuK*%=V(fH [;fkCP|TI w5W:tzlbi.I/9hV+2HxvEsz"<~S~UԶTMt Wi gZb#`H,Oӷ`AǷ;j=1,;Ss6s?.+22 @|m]L*FG#5,0JbQ=!Q7vt䑘F. ?N,1K .q>n[kXYڥ=zՙm[G,RJr0GLch#RQvl6 3a;Sy4dp=9-12a |>vE+VkTcY=DITASM2ʇN;>!1J4H$qn:qHpuŲ*ȡ;|xl)֦- >s ӽ8l)R.'TA :1X^u}8WE=n1>ګIqn cJԣB`'B@jh╷[P*pCuz wZuk(*ڡa_o'?Jt;ČG2 ܎Zن6Ӥ/B|aޥ]Qw4daA'YFzX!ӨzCX;܄"#=bsI[o'#5=$Տ|7}HHCAH:^fD9O'5k L[R gQ<5ԏ8$.8ր>L8eޜ'ѱr:&є0tNqAx?n[wFsJFw OJURNs{Ӝ@sKdA"[ʔF8ҞF:aBƝ)=OqǨO:~F3\QpR돭DA$IH`RcؤWsȧ1*8XE0>QH }(=*@4)M,B#8Z*æ)ڕy=ZcMO\i'Jh$6)B=qֆ) F"I#>RLCx1pp 7ȥ#ϧj`(NZi? F#= p2HBT k{ HEy^*[vH6՘V3%M,ܞv ^4uh@eN}p+-[f÷9@WGvnďz[ ZWj2" "p}08ǵk۪oX`?ăUZYhKT<}jF"]árԯ*STVSd:2ek9NGbsZ$Em~#Xhhبm b,Vq}bSZ&Bc8yv@;Uf?2S('ԭԴoc ᙘvnOSP磳*4ӵ_\>ZfB!l/v5X=/-؟ʛ-B!r2v} m dIbxUޔM#ݷ6UmO.G@W",N֥vХOu$@U9(NW-T$P˂4+GmYGe9\fW PQzՆ,5 ˎOe>լdȔtԢWѻ1'0}6^s-Hi$fRp2 3]LѤcB ϧ}xvp@`##1VՎ{OM̶Ba'x8kfT 8?JG-0\ŪY! $d=א2{7Z}ΝE(lєGBP]su8IѸ{ĄV%a(\GxǨOξ{VR6[9nԃMhuiJ:`U\ vSr|+F0kzRKYb&)d T{jc%{T%>$Tfbq;g$}iRw5]lݥ \f#Vf@ӌzXuROMYE "K}[< @`t폯J/C4KKnʧ~${,3*$xp+Tbh#[Un؅#T3qN"%|?:PL*|ănބut' ;r{UvV:PjT ji1 A5s4KBݝm7+ּsgkE2rq@xsqKYH}:STMgqƟO~B+u]asBs I-8 ϧ`vVA\Za dJ8qǸ)%ܭ;uUyTIn;1z CֆFoOۊV$20}%}ϭBKEQ xq֮eh.ܑ#SsAu9=} Iu0gbdE> `b]x.Ob. q;{~P SЩss"NxŽS!YP䌁9#'bF~bqHd㡺5i  UQ,H'q?犣5כ>bB$qPc`b@WYWMdF;T2$E@UdP`,oT@A 3ߊKYbt n$Ӂ֚FE(1@ i(恉4׮is5gH`S@9'뎴3s9ӽ=O{b>xQd2s ~F2p)1Pj8<jV{t wSj:%STd# ʴd&Uk^[5UmzTX>Π0)$ @8>H^I?`R{t8  sֵ*Fya:t3-A?}GO a6Nyoy'8$KlNGn:Mxp>U+pYr+" g9c ;;CX۹Wi!L޹BKR}*@5>T7~&p]$j:336v~TaBtמp~ФɻPp{W.y׫T$Z$N=[5B[RF:3\̅9m: RkNZ,>R7˿8yߙHێ23P=4a:*Ci-dJ͌rq:Yy&(N7 =3V+fcͪ)lt*{Ade9 gV, P.YkNEyGPv? wFJ|Z1^K3Q1Źdc~+j -F/aĞUKY%>%SA_SW>콑lāWp Ti%HmQsҢPr)o=}3P+. h7x'ѽxMkq'y"Isgx3?|f^^rspUT ؜ 4풤@Ȭ22y5Z=M Hnsnw|=ƭ3obx)h|$DGBy#dTjKQRe)égZNͲiEhhO2;T22z5-a.KiǠ~Ubb,rGWJ.4{4ڔC eOj\Zp%`No8C?$IlERw@C^7 ]LvyŔϣ9\#QeQT_a{ KWlK?f2 ׆aҊhO0+3-y`qdzc u_HyTc[K 7ln3+@RUŽ~S*iTI#Yx~Nɕx^ uuT;p3~9qwd"Ƃ y\|2rW}Ų^2Ψ]C} `0Ji +" sU0 )OBZhoC}.l- t8ӃNzw4RGޠq^}ii,~쟔"|cHڐZ^+䌚(j\dv{P8ޜN# g!G$ޘ GQCRHȧci=L'~{X NI4>tz oz6 g9䚐|=Kj nli}'SWmv\\D^6RH29r[Ā*|}?ϥO0鶱A f8ʁԟ%1:·5Er/|̫L6ԳgTBGN}Cwʄqr6Пʩj) 'WZ=j_ԃU%Si$Lߏz{䜞rMVG O5ϡvyXc!Fwu}OZy3aץ2Gb G~#J~T=#a֚YC1ԒC!;Ҟ,e6Te|D܄HwCQt8Nx%~a?)Ρ׏SC@rp<`ޕ;o哴g9ພc#q$,O~}rn'iT9C9^?9DG}Ryִa-LI9G@3 Y7,lxNdc=WA0韕Cڅ-BğOBFn 0@8lqߺu=s P/`9_]ŧs@Cv0y扮2.-b<m㷯z>2Fжps낪i2=Hm8st>Y|HZ&$qN:פ2uxB(;|QJZtswPip;_;QPyih tmv:z~_ʫD ^m̖9,ghs{~uxIPPHT13+pkƭIӕ'ur=Ǧ:R҅{XhiO'fHހg=h9Qp{ʺaL+!gsӏ9 2Yb(뫵fE>~``;MEYkn"LS[PPm`}yW+ϯLzZ%>7푳`$۴۳c;ҫ^̶12 dp:g楤Ƥi3`~;}@X9Qc2YDfu˅QR~K8!KuHfzêÞ3ҵ%}Dhr_l:]$bDOvU;#~^*]>)Ēn+g%v'.:D#|y0}+B @(ypp6*Y 4JD&P+g}΍=zޭ\MuԵE!#ӅNGaI#I$5glC?ZK.O1BWCY@.$gP@4ZcΞ$DkUӎAH3{c,*ʤN-I׸}jK-r3>:;rTUYvx?49j] hn;^V-nAxRGS?Z.lQ*$ n ֺ <ZZV_=#rvcF LKR[éi.o#v0rkF7mJ--+%ŵpn*K2(nĖp!By+.5ݝמ1wq32 A!u9 .gdR{ 18%)e;gמ2*J.- i#AyDpw`nKĚxA%ݫbA[uQ u`H<~h.AYIo.^K$G$e s9Yzm\axjI.?@I'N^*k{qd2)9ޥdKwP ]q'8=z)"(!̛.&\xtLi%N}IW'b5@a6j[oT.ǗzƐHԜ o b{!@8X.7]IȒ7.s qK1kaFD2-)_0w?\zcc^DJ]D0*TPzDw;i7'<7 #Mݫ/%I.`A Сx8ֹ?"Hp8sZFJKBYdW{Gקt8 p}럷Pfvlc̒H p)J*Z0Z"%-, <}~,ѳ~ y\q|cݵ<$GIsE;}8l\&l"\ 7w 䞠*,7Mkw5¯aTi ʏ<}\=KUx)+}j(f1m<ڻZXS 8M~wK!9 `oYW]݌p8^7qҌdڮjVfS⼶PGa ץ-!h֖J :qzqwQۙ*ƟqO==kRū :IxYnQ7lVu{x[!@-kbN̞9%n@nsGOҸˏܛJc\%RWlIPp oJ箦d_1>FN3 {I44jC0ϖ ;]4אָu A6};W=2N<? zϿѵ*]n^R"34ipP7 ZkxjRҧ7agIf@@ OEg]z_$sfct<ׂ1LdYGm'޶/Pc|:$zd7lKocâ3jG$IT+!e`gidノS5R0B$S8<Ͻx  VԭG3x mHNsts]sYpr9ZIiIR 'q;qek2k63hBES3#1Z=3^hڍM`tIcv 7gGe5ʗI!vk5LX ۂ g8ktxd;fvw`t'&wN󟈳a aV`rx'>[!$MKdg2vI8䞹Iռ/tyn 3I(EL81sՃ72H.." '7*^L 6;6]Vא3D̖I-V5Abpxu+[-:tޖR T; 74[hH}l3nyPzQiks%ݢDDj\c,UTu#4ZѽIo 1b|twyθ[N\l ҤJ Ŏ1r-x QD .Ha3O[yay8\{w^Jv~&𥍾.LfC2O=NkdQkI Qi[b1:8?;d8ݐ0u+Ộ϶ZM*O;@S׃]X_sh 1??&we0NH^ rrN}_mi*,MijRQHWX k |4O2@Jvӌwenw:ͽŋmGtʹ;CCa,#&vHp8kКK+h5jF/9w{8"  fOWZUݍY]Yʗ џCV}ݻZ]2e[kCUtErp=H0^k״h˾\s4}@:u«3%mu!_GFx5Uy$lY#ڮG-\|t g8,[{8j|שUKB qoTHsKd mTx>U :W#= 7=Zm!TZiDHFIňS{WMii=n"hg ԏj+C%m*GV̗qnڸkoCDhK@3#vGOӏVFS2=WmHO 1{ZMz{0/^OZ6-a+ CcyKm.t?@3TKE/ =O]V}s{-,.f T\mTF]H-/5ܱ@ 'A܎{V\6SFEEsli50}?NWjp^tKDP%wwLnIgY9Ҽ/ W%맷 o'zM=;z6R Q7 * On5ȴچjh;pc$cc1 +re"!dc?hjm+hCmCU@thM[Ag[jzM}K uspk&e4w,OYPBG^~P}8CrB,K$X7,ybe20u|6;*M"Yn+71Tnv5xb10@=Oqǽj WOԭm&\a!: 7=0qUaxy.V=b ;s.1v 3Ju&n6YVԋĐi@%0m2[{KC#nPra]Omy,[¸KFbp6cgk}Mk 1 .\xxjOڮ豍2*OSe5s7>դRg[h*ƣs1+ShM A!on6ƀ?*Mo65vEp"Jv998>!maily5/6"S[%g$U(`1]lS֬xLFk X-f|aQ}lq\c^M%7vQ>X#P g1H>f# `HbXg޺e֙6KKW$(\@VEi0|&{"ayO)P˹ShZ:]luc{ @ȄeQ܁֗I^70A#KAçD1ew{Wjk(-Iڠ.ᴑ;+KS,ZMOmX ٺqLx$9vWN5ity~(∐GIc0sFee2rOsqz3$m%m/.LO`fb$=l YjSsmp]'O:[_W2۳sNyioXU.Ecs0F}1c5[ +xؖfnId*{qq޸Ȥ[$n 'u8g1tg1.6; 8T`4 j\Y ,$6c$ Jk+:gh'@U{w=<Y___K~`9_$BBN{g^.Qgi|s +TQ!xZ4^y@{V-楡_kIb$q7 6h /4m'e{±GtUVds-u{KɄsp=ncg\gu`$ Zny"ͦY6{GԮśY\s(n c?>.$l.%i;9vqڹnV(D L[sִnJNONGo=b&EHfnbdnyO<@ٶ^䜷 %ӯXV GNjSJ"H$qPfut,!N }: %T}@[=VÙ,Sy^Xa{~j8ZDTne>?>2rL#]l"+xnȤ$H09 ni 8 qcU>}.إng8eQ4-~Oz,-g4'¼C| %cqS/ӹ}d7oc򑌌(E/]#vP3? ?mC$SDd 0v89?U:f :pAK`Iy ĤCRI٤,FOץt#;\ylbKl}k:U~j2Dm e <P8ʩ̬GCtXg'ٖF8'bS&s*I$?s{>[O368Y7${]Ӱzv{%ab'gT=9c>:oа䝣U_@mx}¾_ bW:5Ytb.-.nSUrĒ{\"ks{t*&F!pGߨڵK6cjlrHU{T]=:x~QA6;9~ >0NI隵㛇ƵgR1r<˃p3cV|Ei%޽ٳIo*JQṞ?%2[7\M(E !\TcU@vM[QvFe0sl. @AsT6aۉcX3t!qND4;ƅ%=y;5j6vzdy2.#^(e$MΕED#me&(F.3m qtZ4iWF.a~=~ ku ﴍe.qt>.E6aUo(y<'(NQj[%7$HGlrqJɳmrgYa2ؖ/(`v(Ɠ]]Aoo"%vXoqa"CZ]iFC<_9<Dұ)YX+>!UWtݿ#3ڱO}iy<-Hv9\d mިoj4I:yCue$)4`|vSj=vN46F6˜)+)[  ZL w|Qw't{mi *QoD 5r["X' gV"ژ:gܙhe'!?\gdKm73d7[/#i$Xo-."`RLuϸoSTm*PH."ed0۲OeʁLPDao1g59j0Q ѹW_Zkjectք,#X$+dy޳VAer63y7*r#p>A9lc%vT:lԆDŐgqcJ}PƑvFO== ̓2w~x5$rwj倆^><݄3i犣̽ZR$K"aPx)uȉ ;187MLγ4l;>L׳fڃcwYAB& g `O/#,2:Ka[EPܐ|` &=+ >gu*z)pT.',Ӗ22A@*c$P\Z$|$E8UDY az-ʹw6_h st`P93 =q4Bbw3{⳥kyeT I<q~y-՜Orw~N:c#K\9P۲39+!@##͊n-ji8>Gp"Q . V'l:ic3,DpqsJwk:ϱǩo9r1`:c?֢teU&!CmLOb@t+tx%HOAbjz-OdƲFÓ>~|,Rifʓƻy-+=sTk(])#+Hqvdoyg uE ăYWrH,9iG1$6/O^UҸfE%$eGjbq.YUs,9\؄ڹ=8$3pJƓ>a8PXjIt?~BQgҮ's zN4Ŏh DsՇn2?JYxNbkf<~yUbzvQ87ڻgI KvĒ:?V0>(IrZd G<ߜtI*21ʁ=zvV|!jw k4Ď@2g_ FSY:[\ ]/Mkȳʹ{yb6cNz4 kA{ P$' ,**98Œ>Cmh! =ۤx Vܦ@aeش?xF<^6+52L!ȑXw>{J6\-(QJ2\չ$Rc}"F\&O4.W@+~4m8 р.$rN2z~yӻl%pҫ*=)gT3w]r,Wg(ū0MHŧݱx06*;3S(ROaeM0 QZsFew'~jͫڥH"%69'g^rMK.5[mey%< RqvRkwqA wj)Wfx2{TK>m{|dV5K9Òy^}c:oYqfF|LypF!F# ]B6qt ^q1[k$6Wwmqk7$\;j\0B9cO[//.eX#idi=a-gx\U~V=Vf$eb8f d It&JM&q:]:@Jzzumzݣ,023?Su{ +=+M$6"FY-= aHc'5N=J RiXd xf\Z[4Ry olo1N8OKt]:;i!- β~tz&\\IS唌Xz]R-D=*GiTq<zVղX\ckhX`ytL=zf0\\x&:[5ub3#zsN븕9Yt+ #'zϭ^ӯ#v"8~oM8%3+K+J"g,A=~= ,L)y"Hf$ֹr)_V,_ ͦ<_i.b^Xmlñ?yՆ$nc{?1Brfl{w,VW#<$Cyg@;n1^w LO kzQd\~hV3Ȱm>rՇs8?5B{KUYP ~ xjpNG18g GRV2a`j 'S:෷Ktģz[ wog3/9ڝ$b?1n`<ᒪpU?z #VI9r;A]{+.P+3qN@ԑT;n76qXJiʣ+8/I?lN@@䎔JH= qM qr1Rh9i@p##$q~pA g>/ƿ3 2 lB0WHNAVwVf71HJpddQ؃{0r2 \i9;)dB1 NH45/ckuq48| I(6~xo;VBI|ܹ废=G,F޽kc𽶲b$u!\(;4Sh[L'$n{HbLʍswT+v 7dqc&e-'7U;qwCqefIfH|QGXYA Ucڷln4ɼ%۴D=Oʱ!!qJ=*6#dP|QzxrdqJyuIx6'u\oVK _|Id9kz0<R麥;:*pޟzɵJ-ϽwWeC?;KUY̱C#$Áp~kGd/%qer8ZpPcw8@ 29ϿJ*ye%8zTGX;`pOLb͑ZF( jx؍KWA,pY`x^kSi1+Yؕl}y"E=L|yP| r݆+1sdtGn!8 [us%ʢH潘pT_o^wW7WkejI˟g$z+iZv$^ar!R70 v##U|cVgʹŦZ4ԏbN1M{F/rOQdEі9Yڏ+N,a\2DAS#[mn&[X3ZK>XئI*{tc:M*h-,\^9S;l=ΓZVP:[B1rwf01ׁx>|MrκOrKŹ_,`H\׮rhI4 Dcʬ$mhf)?8yf%27ςdmG2=Fpt#p:wu4mR+x%c8xbG<9ЮMIku$Gu?6m篤5mMs;~g'u$5D?gflrw` 0:Mc{ccAڄ6烒;t/ҵYu[+&i 2:V'ծbf]CHi$$ JJ܎Tu.#0uwW^Cu*%g,AjpCL۩fϭkY\:[E*;'J[=˱{]AfIF ss6ەc00aW9Sĉ5չig9$=kBkϳ(!“Đ5z0q{wSKHC?Ҹ_]E#m<1B#N{sEXuJ9^) TfRҸWQLk(Dq;vK7r ޥg ֬ɒo6I)\:v=(HfX3g?a3V2v$n/5$X#ha.1Vыl;"kۯ~;z$R'ʎZ)![nmc)nR2y^{;WWhҹ=X#446'ׯRjŚI2 YK nЂz ƇpKes,RG¯;{נBmi)ܒ y׿ac2.c`}3Z3E:՘ U 6?3P(W'N q$G v,נ\!\2qߚVofg7cB0_Y**gBǃޤXbga 3ƶt=R +dACo"4F`G\uN56-}eux*e'%Xc>)t TP+`Weې#8OݷrkO2I:HBrqRD#meEB=zE1mmvzڜcvM+(b3X ;[\ lПbK`v9힇4[D++I%pT1n:"H I1ǘ@?ҩ Wk_&dϹYsm$esR@d=IԖrxQKbnɬdo( Zp%^YAw1^jSMM vZKG. 9 13)9~u-qD9d<?zӺm%vi8IjQ,[B']C,׾YUݑsgNemI뚩qaa8 }g5p]r B9?.(A${} E,(Ucu4nBm;os޺n/25$Pk<WQZGCQH_z/KjWID\u?y=3Ӛ?6s+Buח+s&yCne(ﴀyn?SC˖V|ǯßJZMܷ'^Ҋ9=g#1.D,NK{Z:M0$0Č1ʨHK>5Y(1kyJ`އW5OuY#?Lxr[ vn> u5Ɛ[#M n^O1I]Iz5F/YONzWLmN=H\uԡipyWn&KS%'5麶qIkpEiR$v5]Gb\Hji椤l6b028-imrŬ hT>Xa z<7RE]CA ؋:5|WmPN1Vm/ohU FX`s9ƧYIֶ$*Cns9ssJI+df>P7c_:^1d k 8 `#s+('zҔ Xr9"Vϝ#֗pF; 'SEkK,YT8>RnCG~1]ozRѸ<ⲹcc<f.Op?jsKW5tkxhԻ:?ɭ6;I#ǍO=5xd@Y#F@l5 w 7A"]zJEH<@dIzJ׶m!3@F!k+N$;BJ czkT-Y&RQ^aJo܊X.|rPUݖ#ޱ5խ'xݥIBsUя,LTr#&kGS{Tr-*eIV+BJzuz֤ZrF\R3ߵ.̱ؗe$#O^G`xu;(öztcqڭKo[+Ѩj]ѤC*%'?T+y*ӏR֠w4g!A& [H9=jr-(q;rUΧ ;,zzwQ\rYBA“qի- zY1 #w֕v5;Q{}?Zϸ{nͽmʦ20:̥#G[ ]14K=rAϥd}7rGL~F 屽EOn#9'sO r?*2o"sYdnzC?=9Mi$J ˂BzdsJЀdPӾk&t]DDt]Noxǧhv< '8%b| xUj[Վi*6諱fJT,=(t1wrBO)Js rz)Z|F[t"#+nBq׭e[Ptg} řZ)Xp}=~DBSU"#!_v;sڟ-'b])C|9ȫɾBB}!69=@㷞"#0*8RQ2#4M_'=)ШT$TU-ă;u0@gUa8VWO=<Ѷg߃JULS l@ڥ~FI HX<Ґv?wSRdO3hPK>ՐU'c H9;=m4+Nəʄa1MfKmkx܎Qr8=GxP<{[z>P۫#b!62FGt4o{~paD˞Z:~͊HI> w <ʠ'0@`b`PQϏf");<|ҬPSOufh 4^d]< qURؘr@Ս+twQVF;ֵK*KC*|zcXgn^kL"36ĭ UbNIc{__Ztݮ<<~OyųDK$+c%snj+Hݔ`1v+y.$>k3> OkqB#H,@獿j[^ͨ_+l7Wb Ȱ1;}F?qj_C Uפ5kYXI qr-{#zaD09huy92ɼ7eԉDnf8N³l5gjwY\|ŸOeIzUq9,0yF8+wz򳒹va,K"m I>桁$ [p*GrCZ$nC9WՏI+_܎R1$wPUׯsΫ =V*1\z3Iלήjn,gq׶=jcC#޴NRZ4_Ƴ8]\L )Owc.WMR8P2*1 ^R_9JXle3,+-ip@O8'=En r?3ַŽM{vR6Fݷfk&GQ™N5~|Dn=:Q$QYzi {zW?asǾ* Ysv#IA֣uPsd{j|OB@XuAYg5"J6>]=+>u9Z"9d/.%GӽAypfMԷ z8g#R3Q E*|>mn!zt3{hTY>yshygo4:1-Hs8xn 9Sչ'<=i-e.Fܣ UiĦbs(noʭ; MN*hh~s*ރte  PTwzPBj:a^6OU#=M4KAvNqՐ@|c֥Ϻ+˂tP"΅eezo$`~u"t5 &qQiϑ(<Ȓ;KC(@Iq&oҬ=hPf8P0hNU' k's&9D! E^rFOLYF@ЈFK4ꑤ%faö2y$e:TG4a8x t[J&y,0qǥ e="i;IfaZڜmm!f#B {,K,bɐ ^I+v.@&--3(,N8P?JcXpN4ߵȈ1 sԛXNNocZ/(PIauQ=+I&fH0=a}14me0 Uۉ dN=k.x C"A?֮E"B'qCHMLdP].:^n>^~!hmQE)ָkڼ76pP?9C{lF] z7V^?k$!9ϧZtIrN5,s=j ZY szJZlEMBEIsT##6쓃Ov󚅏R'#UF%ܣN#tE۩S,{$u< ]"I=]YSD?r),9R:9"rsXJњt>/I5x5%T_&175o{lUal`[I ۄ/,cE2C#G+qc=P|Z ZC$69푟Z,m:kt](),! qodRw'cD9tZ$-ga=ǢؽsS,j7>b ?^1=6w4I;W$1 8[rNgK%"$`z ?u0,JP>F2:+ jvx<&8jDZxsz$elY,dv$ٹ^O9?x}iC"g^&@Wv1z*גX+uZn%y#Jy%QoV?s>#\Ւ{*B4J *`|'s@fhɧ1Xpj'I4Ѥ+MN+zv'a<^;+hUsuiQIH3Hc?[Dz@W4gP칈1wNzfeS% 5$tQu)~l"V;K~ #P&[dm+=_ɴZ/;u}=@AzHm ix'*zs#oOknSzwAloNH8%9qT:`$KxHC$q zۥmiZm՝'aych\:!E}e8DIwFP ӀWLeRyCkkGFc1؋MJ 0͐ʜ1t, RbY_,I }jn[ۡm@(' u9;Z^"|= G$x`bʠV<55drI XrЯ$ʫ=ȫKV) FI鑚+銰Dnı)MBʋZ[BHK^1Rn%r{Ip6ޤ[a,w/JTcu6;lq#,2F )+[hI)G׮y_OE4#aݛ(,NMI&A$NUՈ#2 }*A2*tzrH}V-x 98'[xX:=tkX7;pNqsֲZO-?8$=1U"sK65t UΙ")U"[p8٭ZRM/6:ԛd#qGFr7ٵ{"Ȳ+J7׬_M.l:?J~yZqMN|crWx¶ݗ۞Rhy<;gr= %XG Ոy+Ten kydQ7G\{Vi&4JnWy'*r M5bQba玜c -E=գ[~cuzm]e+mݶm#+n:_ƪJ7 $?ʻ2{(m$6E%>8p;X[-qIə`r~$6|uSc s|8z+vg例vKiy*m9)>Wn].wD[w!r98#8~HQΓW:fd^+^E&|7=pFsXisCUA(yNhm=PH3ޜʬ9=*ˡD?)$ruUԽFYGEb`XprZ2an!<Sn g͢=#¯&gk)$DT}y^9簎F'a\1=+ƕbtPz<^W][gk [&$$'1O9\4Ѽ%uK绒+vXC@>֛ijhyvӣ&p@|AϦN;TSS!vKn8Bū3ۓBy흉542ޔq֍t=ĖAFHr${cqj Nz&i+7NRsp=M[wtlT#?w ۷#jc W?T֗*Jm@h$oE<˒3px#-a>Sқͅ_R$+ij)#˸G2Oʭ9pvwNnl0NP!CSr~U-Śh0ی$z=s՘=PЮ5=^[n^+B4i0cQn9>kZJ\Z:ƊͲ@8OЊtgY$cIsҽmoj)5h@Kx#yuSũ:]Cg\ yFk{-,ZCNrrsר `kz=ϧ2|]rA{Z:2$eOFk[' AlB pAҳɝq+=آ]]Dm[̹@Cr1Ӟ+sI1_hN??ΜUL1̸W8݋ >NVN0[s_ ̾Id | t:\G60d#n睭Ytۂ'YiO>K8xC%tZ#ҥQi O[## }; c𝞣`~ì@R4Ӟk}XݼQ :* OנhZJYD/ (@o0es'{ ( :sПWX×?eafqO &.}n"18e2Sz}<*f+A0QrsxrjvDKn' |={yHlnfFߨ<i(L֝ !|0ά,Ksְ P(,2JtݞgA8-]$B8<Ҹ߇$,q F7EP?7q$T72\ K{fY?iem""޻B$ 'pHsIu[̐d~X8,!x#< R⑼)|mY~QpO]I{3|0-tXno>1OGLuC)GFAb?[$GUf&"Mgsx.$O !YS,,Xpl㰫M+7PSopUuRT$gz ?E,s#۝`ׯY1ѣP*,tv/kΈg[ܰ_%7+y⨅ ^i(/*$E;TpRqبFԣe1|>R@єv/@*kX$sG|Fs޵gp><Iy$WKA9Ϧ=i&-^Zz\L-$'rOeI4gv73ǥk]BC{e|oа{+!Wn-4 $JnǥcҘe{8m- )r$?v:za@2Ӻ|ĕqrO;khڸ-)Rqw[-̀AHi l q5bZs '/2{ic .G\?:w+PY-6! @ 9I#:ZNA8^N=j-#Wo༏RAyw`d{ &fV/s?*yAs~Tۊۇ,88ăyrr90=bOդ2\^Y"A8y4е% %OCQXj,sYLapm9"ZM'.lufls-e%#űu |KqDN6<gZz1 XkgU;[-K,jFG%ۆ 9gA)pFao xqדU6V?wn,h t<)w@yO8?.PM]ώ13V RTWpU&amd1*G!Sdy0x`AO)#z\>ۮyVKn5^yKhWSEP[W!-qgW[~6՝bb1Z?2mx{m\@ܹ_vpeq84oqӡbqq5H-YHr bmr NCaHr3=s֥ib1x?9\<{T4K{uHeH{4d`8 tuyFl|͸ 6+ޱ)#mBG$ʙCp:Hخ6M%!§zlz5!c5RLqnѭt *F#[ zHg}|Ҥ1,ENsGPyrMyXy~al]'vAO|$Q*Kq~@jO6gke #Vs?$7+3yԷӬYeK~#K 䞢_ 7h.M72k{`XK|x#kW$w)<$429[^,rkx%bǧ^"hcHu9"IVA$+D泵-";[T#r!U>`TD| RE#1I @Ϩ[VfalA++7'=?WIk+ۙ/&b:R7(<Jmj,0 ..ɻ5g J^XC?"&3#wmV92&38Ϸ粂{;}OkVm_DNN{sw #f32pܑij\ O32ާqgq(l)|)w E(W]3_í$6UGdLw ԞJNJ%X_^oq}Z؆d]ۦ q~K˃L1k9 >=ڟki3} */Hs1R>5ڕ8Y4j9`3ڲ|A7ťT;N 96]WV TA !^$;k02̛^<`qQ(; E^#TMQq%ԭykcBkgkc8^||[XyY\"cw~ݫғLk(:(oY̠pXОbZos2d$G,:\2R=A,/QWE`=GJfaC 2 QlVbYL#O_ç ǟn,4rIoDHn]'=Mݘ0rNyI6d`I>`ftU d6ez}j%Q,7܁$vzuⴏ0;k`9TvP%"TE;w/p)_qV ,ׁ);v9+69lVa#WTMN v2lg8io3GIԂ>r18'!H$y5hZUi>=:͕ͬpǵ%Є`9{t0|HR|[Q$Q\}<{--ZgXњRHNyn<5$ƒƲ 7 gjv0`2^R~dus4è^ܭ1|<9䍭n5X[GTR6;0ǭSMAm9K+ @yM[qY֮Vl/kr   !PʦJVLnN^hnYTp]_ gBT;"#*^ju̖W1]@&!ǓםwVBQ0\E`j¸GV^6U񓚐qӮjHx:=Sy"[`=X$099g$C[|HSR53Z T$2nOVY+6CÒyE2(B :o1p]'&Α74)1$=k.JKo%ZG-Cqc[I G'*I4]z{,ri@}z{~>x5K5;-9U:`oO|vBLIֹRY"\ӜsYG %4cٸ:hDiZŎd]00޽G:K{kV9]EFN =ں&Hvac24722qp=k`>5D~zO9wyq'H/LIroakgv[a+wW%r\G)w`p9;1r^İ]J own[VO<#cA5IcPB3;{WjZX4,doȌTizk 3X9;jc+o8-͜F>_GV,>df/ +09TyuU"HԇF@N}@3Xβ1}9al~RHR*7MrMRQ&ݱUr R=h>e+In\ai56arHڬHT|O"]n`d¨_*1'_Ƨմt][KEO,Im)ǒ*\Mq 9uf@G9vqЭ#Zp}:Zq᏷4ِ)۹ѻ$SZ\&OA+UDhdcrOnq]gk}+;V{Kx3SCg۷zȸAC a޶Ñ#^k>$s DeU2<9.$8c1“bαCulɈtZDvw3+{zgh3si #cC4S\4&X Ӟ ,/1u )'ڤ'+A &1QQ#9ߚAڠ 0F&-i%$ T3\#x*nP[RLr[F2ʶs;ɼh22{q9CZ[7 Fb8'8_jkjwTGF0G^<+[}8Bd*ȪOؾյLA3~rIH=[52I]yEsL3ز۲]yJY:[yAH79t;̀q'n94 yPtRj){}QO@}TsJXBn=9*4 By ra/rrc]viNA1<%U`A'{Ϩ䖂nI8 dJ-mUgra?uw*xH ޻/o5>P[#oLrANj]9we'~o t@5<^[]BdKڟXmG~% o-=M| xݽ+r \4(ia© N8'+{Q*Esm>=슙=1G6q۽ R R9Q2&p2>8 \E?P; 8zUM AjWi6'ƂZEHN9Cdٛ z -%Ӯi0c 2UHI'ԋc35+4v u,7Ҝn $_lwx ae2Xuv~uwcڍccn}@^˩Xũٲ8V 23,-JXNH4ZGw`+2!1o8#5KeomQ|B vȐW5|*tY*xegGG_u̙OKQKŻ1mDfi _Bp@Q\߈1>s?iB:8I=Qn \=51u 2/'5í\vV,YJԕUx-l7zmHP ނ@95vKr(t!廴#9ja{i4 }X?(->8]nkˁir^Wgi"$}m儮mE~Tnt^׵kw%앮&sʽ( Sը4ⴚ!텶YZuXd#zv㓞4,tL d|83b7ne)ܣ\WKg]6 \Ƭ)XI\vg ?K+eO|ɲ=:݄]N vk'KdvO*yz<>e򣷖B"0`񕞁Сk˼!y ',XөU5]=ߴ2NVA.s\T"c}c _^b3js*9@'v@ œEek#2Gݐ S֪+c<0vs!x5H$]9u&5t XdqF s>K$%.f8Dhfm`9IVg)$U#Kh.i" cuW#Bޕ˂'y8#ۧzdHM0:8#8\rsҚ\AP9Yw,=j=ZhcUG5\~\o-8UI\.IwXDd$__J8үbdd"|d*̾%q !\3ߊ/DѲq#ʇwBwB~km,ZG{߉`e:ͻB猌u8$w\mwo4` ?hSj.7(`q$fEm@CU+] PngʋsN G Dۀ@\fEr4̇(g5xZᣚ#DaeAۀ9 pCMD CEMČ֒ܤJz~0?ޯx_S L.S)hʺD#OV|Ts_i,/ǔsw={=xyonfgr @sqӌ[;2 Mg` gGsˊD5S \ IA$AZ\iuB9< |4e%+Eh r}4Qɐ+0 aZQpl7.ltyA*#\V5Y٤P[FwhPI !P ^ҨʶBO5XIar2jC[UX:ċzz m;6I9EA#>bx}Ekmݚ )%gK-pG268Gj%)|+5'y PyuYPX4֒dQI%wvb.I ,?a @l}ޕk麬p#'*~ܚCQ), 5ijn Od7BÒ1\~u < #v]\w2PEmV9#CGmVH#ҵBaO_*0oJo@d)Χ&XAeG%ԉ" `ڴ|qm5BfRyϩՂf#$O;Ϟy1UZײxqkg򐎜+5G9{&ZH$I)b[ Iph?Gq֔=)6Om {i./%]2+tOrKc?\Wa]:Fgsmx8(M_3W+){xmI$i+ˎGkLjKPEr:}qR kip8'߯LboGtDљCyFsקZ2=y (䱂D\~һ K@CԂx,#THS^t,YW:oA<B8<>6%,bC,V(qR:ע\hxsrʫI;It/ [JHp<Vaʺe)fsP3r+*\JK6-Ȳ m8zu ZeĢ9Ilr&D,ӜʲQԫjTyc؉ 1ˮ98kSƝa0YK#-s&?,'10qޒJ6-ew4˻ [CF.8I(`8s豽CJF2GqeF7+*[ϯ'𪳏Kn֙6섰@qs<1^mwh 2I>s9zP[If+n2h$w^{X, ncF;4I_1=;fnm零8hm`ʣKT $03ÀK"xrNF{byZ]! &"#L8 7)bzP ,Q ђN9 8GJWԿAm,C8jXj[gm5ffLnBfџZ+!7ew`g96]fݏ;<3 n/f$G=39W[i/5^J1E8kBi>}x2Ei.Y"y\uץS r\[Rk+e*ȱB#cJ2>obmm'׹WiUpOBGEi4Z2|M2#0m>br?^+\\j6b"1 ^"D]HV8*ȷn!( >iI򫔻w42;B#*,!G'^=A"I& S9!X8Q) I<{?(@7Ұ1&_i. 㑑S𰧒w$?]S^ .\(gnxp=.T(^HL6gbH'ajS/ Z91n.߷ߍpҺBZDNl(>rpp;iVйL>5{.G̣=FY'K {GOolX6Lp nÂdws2^$sӑ /!:y$Kk-6s#{1(2x'g:bg*8TW. *T<Lt=w>&m"m#<qFNf fٴGoV54 ˇ=2vAڣe~V)29?֗C-'v B/(nS \ ~5iZ{jv[$;iv\,+w~n瓏^[;'ybQ~Rs=UWMgye+NӠkUїšu"QF6Dy[iuy<9 &%( AW%Ṃ-nշF&9?CϽvfc6[^C2>R3?gm4{qa,푌ՍJJԬhXcuyDUCUyA"OlN[T.dCU-$-Gsk"NNxoU,o|פXKu%M$>D(ia`WkrzsV9-8RBB9n=ϭi C6;X`zjNW؂ UIo"ew$Psjש bFQt?%8a/Vѯ5Haa c#`EZWnɨ'v"-t|tọ̑fH-cmUβ\B y\rQZnƔK-ys \g?\Gy-gU.s3TŻķ_kh{Ap$RĜ#U=*P33ŧpsvV-(:>_}tyk $k0zx^(MwLk46 ixSmq$O8E89#AY^Ew ,#ݳ#.6#8VӓڎKuekc#S&nBG*7sGZ[k[MB[Qn#c 9lCr1߭jMZ-jGGfPdV( q:}3ct67Gf7.'RT$A'#pRH5L˾)]firw*R^\ġ<-qJ+cJmİ995b"5) |XnXʞ$  0vajI5j2FJ)$E6ʎs^? ֬tf-+tV f Y@|ǞNɮyl^fzd`p.{s(y$(䪁?3R׈~ZwٿmN '; g1ƵE9`1_G,15&weoܦbcwpL`87V~צ D"KoF LNKK XqX`,8$T qR"6=\/YSUKײ=@#!Ok67v>3z!-}{o[EèR Ϊ<?_qskKFvU#=xR%+ݫC"{Zs;+GJҸAǷZ^ı.LA?vw xrp)$su)Dn-gح,$Ymu 31Yw@ʌu,xëzw٣C8z9i[F!`q8֝ʆZ.QDxGM}\' H=7`G|[Oш OJeˆ|yk߿5l,`{KliF 2qo\r)+>׼,yswZƿ5(ɂr0WDef?xdUk6Y0\og9##sIn4=^j0[޹yBc, z!*sWT`ҔRPx4(ܾќ.9^i)g='w7&gױAuғN*2ŵʓF̮!wVr%e@=k0k}O>.HF\fgR<O3} *!HGQ[WfS\r҄Rr$7m\JQXQF]Ϸl~UH{ژ'ң?eß)d ʤdm:1'$<}YN+8;3Dkfٵ'HfQ֮+vZwIYV(qsuMw#nvqp_$1"ȎT9NFoK43jWEh^}܍pAkP+컴`"!'WEa uYY+>;2cRXH,%B7Uycq9F[!0Dv7@e*>8z3Z~#Rq ,F3PxkC=R&dRg0r:x~p[:K8OteY܊%@G|zLki˲"QФr83zձ.mq4֏r(YRc=Jdl:+~?NQv8NdZ(B)~\qV-ش}>2"Dq_am[0aR5 _u1O!c'$vdv)/`cL"xwto$ZdKw.F:nZ)n-%1ҀɒIYV3UF,mh ۶`zr_Jfu>%kld-LJk[ #ucrFj5xV5P`tP&dT0DIr(!@'>XYnQcNO@{Ν77/zcUBp|}LL) 6;#p $f@0 YR?)g Uyoq3&~n[y0w*~`0Fyh[ Xd$Jn'3yděrAڼ{G\Wy@)#;I';TZw\ [>hFm'  ǰ=ꅭް]PUHix1}zE#RFonViZ<;xcDr yǜ5敚1;v`dORx.[h$_4RT㓜KQ[$΋ g8'DE*U:Ӽ6N:8rvӍ=45LU [W`pIPu:=gTQӋug|ڀTs}qWl_-ٝ^ )큞c5ľLH ڱ#:sX7XhgF* ^ nd7Ogx$dn6V'FzUGneIu0X*Vl3zziݴNK^yX7n\0ǩROhivx"*##B3ٌʳ y5_q,jOJGPf%$`OXG װf"W- ?&QnwW4ə;{sϥOHj<ѷ$Q'*˨O5g-8D@k(Z-=FuRV)3$ih o$i \ILS >Rm4h֕a  ?*HG\էp?ޘOS;qV/'^3V1\נ7Q{y#X9^b+8dW*#մc6BH!¨8Nkҥ d$}5X+sе BHʑۿc8C6%"Q-%X%^:|tF+SAjxc`r{ZN½hu;XM$ Ny%vAijZ͚P%H $r#:ҵMڵE+x0!q[9pGU$ YXK2RYOd8U8 =kb2asHGŔ[a8vs0G^zKx(H=?*5+ *XE{{8!0RDߙ49LvXp9;/m}9# ҇s0< g=},aT *@r8su6DvB @ǜ#9;G"+;HƳEY-)kqq&T \rGMTPQH c>z'u|9$IBb5hw9 Fpk"rtșQ،UeYKpf2̋Txj k葛}6<ۊ [tz `Y2-hڒPvثn ع{eYy]Fs9Yj>C±GʜɌ'~(IG LI^͹'#9XI~(ac y,q(n-mǁUߩB8>"aA `dF6ey\HѨ]8篷zj)3S$ HH[/юGy=;뒫ā$0qXZj635KŠ5ıɩn&3HNx3lQE%'I7 Z1i ~4E&iqF(Rc@b7ڙ}͞;@R>֭h E8j8zRq 8wNt컩?qr؏?~u灜i#z(%t&^L =JKq698t|DXy8Wz.jm<2 =J54rٜ+MvB]#w:H<{זZ go.ΞTuZ}-i"n|d‡GwpJ[tgdfĶr0v4ZjVd cpǧ.G$"nF9Yr[T~᮴er\XҵmKYns؞ǞEx{*y0 ~3 IE/X/Ll@Ey2)s_{[Ȋh ʣ:Vudž$wZ)%iƻc(w&y$vԩnm~͕2y\|sZb\1vǶ9 TY v̔@LnQ5w DD`JRSb*3\ַbp]įQWbo[%)-&CaLVZwYZS# X$|'OJs^^ĺvetvJ{n{-jWwdrJ8 wq71#Y,V`z=p:5#Vsi/.˃5“$C!r+Wx&Hcn#zc\YQD7"z֥5k <~o bfQo G&^ݓ^kN,1obIv O$OZ_!~[,ҹ#w=qzj ~X@c-ozXjj~1-ˌ;΋+s'Dԍ eF#NV;tO_[\^K÷\3gزu+(I  0cx OP"iֺSvz᳏by >,9j/. g$6 ۸8VҵhI!]!%w6 8$sY:eΡ~q$#8Q/n+-EQ$.o $ryqE7sprҝ5<'«xA,0LLKn NzL|Õ3*CGxBC,k>TD+GW>kXS\ۡ7K`ml ke˂ˈ-Я2Mg:BO faaxҠl5sb6vsK\"~ O8>3P٘mma;辴q h!4U@bܼc]&$1$yws yf9Q_08k@,2.萰m犅Ub, 빛x*HY&VU#8}kUEDK*R(h҅~2IH\ <6pH2ƬЌg;,gZ֤9U$s,w֝ݑ =~ qEs('w4Pzd\`bqG4OZ\RȠQn* 9#$wָGA)exҬO+ڕ[9Wڻ{Mio"lc/޽/iqksHc/[>Yg< 8~֦a[#e#9>~TfX5u;=*[B|x*%8V\˩I4ctyUFd8L۽z`.Fw,L;>+,֗[ḎK;'W|?؅|[2z|Q4 xn<93ZUh9|qjՓɗmK9ջ(>[99>]zݘInQXR3Vn70{b 8OܗG9 Ae|Pαb4[F z':Z4k@,UA)GQá-=Ƌ,2`a3njչhr:8զE&B$`d{ysq]SkWeժk:Iq!%:'}5&59i$ $J4'GQO5t[7, fRZ.&K8V]tRWF+jk k>}|9mm$d\\a8t뚿sej}D*u} ( 霎׵$R r9*V/u{MyN 8,~$Mb! *0֤ Iojw6]Z4,~["'Bnhnُj$&:|id@8AVTq?ZC(2*n˩HʏEybÒpijP6LU)#C$2]LXGgPB^*YKTK*}.lO&'ߧ-,o%',>h$Y.HT Tc՛I9`献Gj`Rj7G'H)1uۊqovʺ4_A[y>tx%r;{wC\"h!Edy8>{(5I#ń*&yPۻwrK6KQiU`urz6\[ py7ͺcmR ?3׾}jAke~$'9=r1xumq:sҢP%tRP0([.]gs*%Hj᧼ϴa?ީMrQl7"ݦ''3M@Ȣ%l`T 2ȁ~l`OYs "1dg#sVp&\]94$ c+E O?cD <2?;\A<?T#2秷O6X,0E1BeyJ͹*=rğz֑c! y!{Ս_T܎]5̅/jV1Gq;\H]ZI)4.sF($@ܤ-8LV}Jq849=i)JCgF1LAۦiߦi{4miCڔ`v7L I9֗3@<7_ҝ qiB}.;i I_Jx4#\<]7q~ի BLVT9ҴU QRGE[,飐FA!/" 1Ҹ? _O+{2?w'8xǽtɨ2?.ek; rV;#8^,.6G vu09S'd<q}+9- F6 ONvԲ@[\{=*&ݘ&9@NYrswX[Q~ᙲq&>u8aZuHY$2+u_[ {SU[Qwahz:ѡ##z'5+߰ nTѹ)D[UˑwZGWҤdN"P 85p ЏUhh2I[C-JDnx]XP#t5b"'?k6rR1R=eRO 8Z<+3Op^&3\#&+&3"Ɨ*OʔJ2o5h9U!j @4ŕeF9Fc @n _:M9}GBShDm Wl{[ hlγ`Kq,͵x[ QHTU(\QZXmk g0SL4*fȱ9,2@R ՞x9>w}( AcP*1SJF:n {cƁAHo=bWRYGfm!A0rsn4帖cfןjHf0uOQ洽嶕vʻ0rG_Z^im^oO F#<{3{!MJ=Ϊ_{U!эJ98<qxs<$Kyz9={).ߘ5& (x3~rAE32lReo:$䝄դ P@:QvfSp?g%|HzMN<̀)'~B(=pEV҄SBӐ zTߜqL HzF3R6A>ۻLQHVHGT$2GN?OH]zK3uOP&mv]>PI.P܎`U$4 P63|9 - =Ќ=oR]oaO=xDjRH#wbK$ޜ X u?=l0|ŀ;K_C2Z]&ܾ\=*-ji`p:닑ú#>CB*l C cW=kQx< OOs-˗'޹WQbkdڄ?/aTTu=yoV[r)GZ>fiI@QEq@}})N'ۭ" bzSGl'#/MsZ F:RxOQ׃L C4@;=Z `3.)I#Hbt&<ҞiP?'zC׎3H1Gn֞^k9s!k-H۽.G8ڋsڼ5arJq>P-NTs=+2t/^iɼYa)b5Oz&q,L,F=~=#ͅԮpYָkMGMף2ںyyg}3Z?uךqSWF-wg  %2&U8=IZo7Fp2kP+D^<#i^*åK[q*pJ8js1VϗsY0V\۷ %)i^cx"VyK1<UzP&@0A~3$sU^Ծ`Z)bWAO0=OT|`}݀L'=pUXv^s4 Q=O֢.{L2wqJC p?US ,9LeyQp*"p[HE,#V7E ;ޣ39Sypx8֠2g SxWH!VQ=PDR[{Uc?B1?TVU_R-;[ VM$z?U.okL',N;g+.['?>=X$YW+02As{Ϊ\`Qq\xm3$8Vj cQmj l5k#8黎ՑyO{!YLC$,I'&MlSz(p4f q>آg>_3s+%x4'WK$mc/he}~OṖ8<0ݵ ֎P.ou T'v# gBZqQy<68}џNi }P | {žQ82xC&2 RbzFIө~ұ{Yj H!6p*8ⴌlۮ*r3ϥd=#P˨ 0h5f_ /|M@V54s\]g3r2x*_-?$uZ,*ڹGŖP8^kׯob氞*ACu \Vy4q\r(=AҗQEHLcnT”^DNѷ4')ČH9;*0p9SG6y 4(bHA@x8i Lm' !{'!)0l?7H#= "h9> NaPP>oN?*qcJp/JJ;RhbE7>dz@&NzPA})9$ m?2;~J f?sH)7CR 3N¸֎PFiq!?hX뚎AwΥml3CɎJY|GҮHY18漌Q[EECXw\FG][@'o_91S+NU@ l1Lf{`|= ԟmmg#x=VQsP+N1iˏVQ}Ir=WA M*[>1$ט. 0p%w#?fMϓjp?T$C^?y{j8y'q,}d˯jl OIף.!=cYמ %!*կOU ܚbRݝ h['pH:eݒd tֹӚ_\R]KQHk%'MCAHz3Xn6q8aLګ8u=/ch֊C(4aG}i0A`ƔqI{0O\u\`{zӏ#4z@ !NqM;sQ`-1'jo;0E\d3H@NOHGJ}l>M4UtTbg$օ$w  LOO*:rǷJD<1~'o1PYI=1M4Lb:R7OR#Gr()?)cwX~% J_J@HFWҚA})8oڣ? >d">L&‘UG jhdf-2.9/samples/misr_am1_metadata.hdf0000644000175000017500000001503312050301076020654 0ustar sylvestresylvestre\e&> NCSA HDF Version 4.1 Release 5, November 5, 2001File Name : C:\WINNT\Profiles\xcao\Desktop\misr_am1_GP_GMP_P106_Metadata.hdf Data Object : Vdata table: PerBlockMetadataCommon Source File : //eirene/scr/EOS-SAMPLER-2/data/misr/MISR_AM1_GP_GMP_P106.subset Created on : Wed Apr 10 09:34:02 CDT 2002 Created from: Java HDF Viewer A``A!4A`A1r A`A!4A`qA1r A`qA!4Aa/1A1r Aa/1A!4AasA1r AasA!4AaA1rAaA">AaqA1ZAaqA">AbB1A1ZAbB1A">AbA1ZAbA">Ab˱A1ZAb˱A">AcqA1ZAcqA">AcU1A1ZAcU1A">AcA1ZAcA">AcޱA1ZAcޱA">Ad#qA1ZAd#qA">Adh1A1ZAdh1A">AdA1ZAdA">AdA1ZAdA">Ae6qA1ZAe6qA">Ae{1A1ZAe{1A!4AeA1rAeA!4AfA1rAfA!4AfIqA1rAfIqA!4Af1A1r Af1A!+AfA1-!AfA!+AgA1-"AgA!+Ag\qA1-#Ag\qA 4Ag1A0$Ag1A 4AgA0%AgA 4Ah*A0&Ah*A AhoqA0Z'AhoqA Ah1A0Z(Ah1AhAhA0_)AhAhAi=A0_*Ai=A hAiqA0+AiqA hAi1A0,Ai1AhAj A/4-Aj AhAjPA/".AjPAhAjqA/"/AjqAhAj1A.40Aj1AhAkA.41AkAhAkcA.2AkcAhAkqA-43AkqAhAk1A-44Ak1AhAl1A,5Al1AhAlvA,s46AlvAshAlqA+7AlqAshAm1A+8Am1A`hAmDA+`49AmDAMhAmA*ִ:AmA:hAmqA*M4;AmqA'hAn1A)ô<An1A'hAnWA)ô=AnWAhAnA):4>AnAAnqA(?AnqA Ao&1A('4@Ao&1A AojA'AAojAAoA'4BAoAjAoqA&CAoqADApA&4DApAAp>A%wEAp>@ApaXA$4FApaX@ApA$dGAp@YApA#4HAp@ ApxA#QIApx@@ApA"4JAp@@Aq 8A">KAq 8@ЦAq/A!4LAq/0AqQA!+MAqQѹAqtXA 4NAqtXtAqA OAq AqAhPAqR`AqxA hQAqx`AqAhRAq`Ar 8AhSAr 86`ArBAhTArBA0ArdAhUArdg0ArXAhVArX0ArAhWAr 0ArAshXAr 0ArxA`hYArx%0AsAMhZAs%As38A:h[As388AsUA'h\AsUKAswAh]Asw^AsXA^AsXqAsA _AsAsA `AsAtxAaAtxAt#ADbAt#ИAtF8AcAtF8Ath@dAthAt@eAt AtX@YfAtXAtϸ@ gAtϸ/At@@hAt !LAux@@iAux Au6@ЦjAu6!4LAuY80kAuY8!Au{ѹlAu{"GLAutmAu"AuX nAuX#ZLAuR`oAu#Av`pAv$mLAv'x`qAv'x$AvI6`rAvI%LAvl8A0sAvl8& Avg0tAv&LAv0uAv'AvX0vAvX'LAv 0wAv(/Aw 0xAw(LAw:x%0yAw:x(LAw\%0zAw\)BAw8%{Aw8)LAw8|Aw*UAwK}Aw*LAwX^~AwX+hAxqAx+hAx+qAx++LAxMxAxMx,{AxoAxo-LAx8Ax8-LAxAx-AxAx.LAxXИAxX.LAyИAy.Ay>Ay>.Ay`xAy`x/+LAyAy/Ay8 Ay8/Ayǘ Ayǘ0&AyAy0&Az XAz X0cAz./Az.0cAzQ/AzQ0cAzsx/Azsx0Az !LAz0Az8 !LAz80fAzژ Azژ0fAz Az0fA{X A{X12&A{A!4LA{A12&A{d!4LA{d12&A{x!4LA{x12&A{!4L& % Block_number Ocean_flagBlock_coor_ulc_som_meter.xBlock_coor_ulc_som_meter.yBlock_coor_lrc_som_meter.xBlock_coor_lrc_som_meter.y Data_flag#Vdata table: PerBlockMetadataCommonRIG0.0RIG0.0jhdf-2.9/test/0000755000175000017500000000000012051203651014133 5ustar sylvestresylvestrejhdf-2.9/test/object/0000755000175000017500000000000012051203651015401 5ustar sylvestresylvestrejhdf-2.9/test/object/H5BugFixTest.java0000644000175000017500000002751112050301057020471 0ustar sylvestresylvestre/** * */ package test.object; import java.util.Vector; import junit.framework.TestCase; import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.HDF5Constants; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.h5.H5CompoundDS; import ncsa.hdf.object.h5.H5File; /** * TestCase for bug fixes. *