pax_global_header00006660000000000000000000000064144742217770014531gustar00rootroot0000000000000052 comment=092190c38d5760b3212ce4d96cced767b90aa189 LLNL-H5Z-ZFP-092190c/000077500000000000000000000000001447422177700136045ustar00rootroot00000000000000LLNL-H5Z-ZFP-092190c/.github/000077500000000000000000000000001447422177700151445ustar00rootroot00000000000000LLNL-H5Z-ZFP-092190c/.github/workflows/000077500000000000000000000000001447422177700172015ustar00rootroot00000000000000LLNL-H5Z-ZFP-092190c/.github/workflows/main.yml000066400000000000000000000116661447422177700206620ustar00rootroot00000000000000name: h5z-zfp # Controls when the action will run. #Triggers the workflow on push or pull requests. # TODO: REMOVE feat-cmake_tests before merging on: push: branches: [ master ] pull_request: branches: [ master ] # Using concurrency to cancel any in-progress job or run concurrency: group: ${{ github.workflow }}-${{ github.sha || github.event.pull_request.number }} cancel-in-progress: true # A workflow run is made up of one or more jobs that # can run sequentially or in parallel jobs: # This workflow contains a single job called "build" linux-build: strategy: matrix: name: ["Ubuntu Latest GCC"] include: - name: "Ubuntu Latest GCC" artifact: "Linux.tar.xz" os: ubuntu-latest name: ${{ matrix.name }} # The type of runner that the job will run on. runs-on: ${{ matrix.os }} if: "!contains(github.event.head_commit.message, 'skip-ci')" # Steps represent a sequence of tasks that will be executed # as part of the job. steps: - name: Install Dependencies (Linux) if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -qq libhdf5-dev sudo apt-get install -qq hdf5-tools echo "HDF5_HOME=/usr/include/hdf5/serial,/usr/lib/x86_64-linux-gnu/hdf5/serial,/usr/bin" >> $GITHUB_ENV # Set env vars echo "CC=gcc" >> $GITHUB_ENV echo "FC=gfortran" >> $GITHUB_ENV echo "CXX=g++" >> $GITHUB_ENV # Checks-out the repository under $GITHUB_WORKSPACE so the job can access it. - name: Get Sources uses: actions/checkout@v3 ################################## # INSTALL ZFP ################################## - name: install ZFP run: | git clone https://github.com/LLNL/zfp.git export HOME_DIR=$(echo ~) cd zfp git checkout 1.0.0 mkdir build;cd build cmake -D ZFP_BIT_STREAM_WORD_SIZE=8 -D BUILD_CFP=ON -D CMAKE_INSTALL_PREFIX=$PWD/zfp -D BUILD_TESTING=OFF -D BUILD_UTILITIES=OFF .. make install echo "ZFP_HOME=$PWD/zfp" >> $GITHUB_ENV echo "ZFP_DIR=$PWD/zfp" >> $GITHUB_ENV shell: bash ################################## # BUILD AND TEST H5Z-ZFP ################################## - name: build (autotools) and check run: | make all make check shell: bash - name: build (cmake) and test run: | mkdir build; cd build cmake -D FORTRAN_INTERFACE=ON -D CMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON .. sudo cmake --build . --target install ctest -C Release . shell: bash windows-build: name: 'Windows MSVC/Clang' defaults: run: shell: bash runs-on: windows-2019 steps: - name: checkout repository uses: actions/checkout@v3 - name: install prerequisites run: | choco install \ unzip \ wget - name: setup MSVC Tools uses: ilammy/msvc-dev-cmd@v1 - name: download HDF5 for Windows run: | wget --quiet \ https://support.hdfgroup.org//ftp/HDF5/releases/hdf5-1.14/hdf5-1.14.1/bin/windows/hdf5-1.14.1-2-Std-win10_64-vs16-clang.zip unzip hdf5-1.14.1-2-Std-win10_64-vs16-clang.zip - name: Install HDF5 for Windows run: msiexec /i "hdf\HDF5-1.14.1-win64.msi" /qn shell: cmd - name: Download and install ZFP run: | git clone https://github.com/LLNL/zfp.git cd zfp git checkout 1.0.0 mkdir -p build cd build cmake .. \ -G "Visual Studio 16 2019" -A "x64" \ -DCMAKE_CONFIGURATION_TYPES=Release \ -DBUILD_UTILITIES=OFF \ -DBUILD_TESTING=OFF \ -DBUILD_CFP=ON \ -DZFP_BIT_STREAM_WORD_SIZE=8 cmake --build . --config Release -j 3 cmake --build . --config Release --target install - name: Set build and test variables run: | echo "C:/Program Files/H5Z_ZFP/plugin" >> $GITHUB_PATH echo "C:/Program Files/ZFP/bin" >> $GITHUB_PATH echo "C:/Program Files/ZFP/lib" >> $GITHUB_PATH echo "C:/Program Files/HDF_Group/HDF5/1.14.1/bin" >> $GITHUB_PATH echo "HDF5_PLUGIN_PATH=C:/Program Files/H5Z_ZFP/plugin" >> $GITHUB_ENV echo "HDF5_DIR=C:/Program Files/HDF_Group/HDF5/1.14.1" >> $GITHUB_ENV echo "HDF5_ROOT=C:/Program Files/HDF_Group/HDF5/1.14.1" >> $GITHUB_ENV echo "ZFP_DIR=C:/Program Files/ZFP" >> $GITHUB_ENV - name: Build H5Z-ZFP (CMake) and test run: | mkdir build cd build cmake .. \ -G "Visual Studio 16 2019" -A "x64" \ -DCMAKE_CONFIGURATION_TYPES=Release \ -DBUILD_TESTING=ON \ -DFORTRAN_INTERFACE=OFF \ -TClangCL cmake --build . --config Release --target install ctest -C Release . LLNL-H5Z-ZFP-092190c/.gitignore000066400000000000000000000003731447422177700155770ustar00rootroot00000000000000# Object files *.o *.ko *.obj *.elf # Precompiled Headers *.gch *.pch # Libraries *.lib *.a *.la *.lo # Shared objects (inc. Windows DLLs) *.dll *.so *.so.* *.dylib # Executables *.exe *.out *.app *.i*86 *.x86_64 *.hex # Debug files *.dSYM/ *.su LLNL-H5Z-ZFP-092190c/.readthedocs.yaml000066400000000000000000000011011447422177700170240ustar00rootroot00000000000000# .readthedocs.yaml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py # We recommend specifying your dependencies to enable reproducible builds: # https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html # python: # install: # - requirements: docs/requirements.txt LLNL-H5Z-ZFP-092190c/.travis.yml000066400000000000000000000023241447422177700157160ustar00rootroot00000000000000language: C before_install: - sudo apt-get -qq update - sudo apt-get install -y gfortran - pwd - ls - pushd /tmp - wget https://github.com/LLNL/zfp/releases/download/0.5.5/zfp-0.5.5.tar.gz - tar -xzf zfp-0.5.5.tar.gz - pushd zfp-0.5.5 - make DEFS=-DBIT_STREAM_WORD_TYPE=uint8 - popd - wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.14/src/hdf5-1.8.14.tar.gz - tar -xzf hdf5-1.8.14.tar.gz - pushd hdf5-1.8.14 - patch ./tools/h5repack/h5repack_parse.c /home/travis/build/LLNL/H5Z-ZFP/test/h5repack_parse.patch - ./configure --prefix=`pwd`/my_install --enable-production --enable-fortran --enable-fortran2003 --enable-silent-rules - make -j4 install 1>/dev/null 2>&1 - popd - popd install: true script: - make FCFLAGS="-O0 -fPIC --coverage -fprofile-arcs -ftest-coverage" \ CFLAGS="-O0 -fPIC --coverage" \ LDFLAGS="--coverage -lm" \ FC=gfortran CC=gcc \ ZFP_HOME=/tmp/zfp-0.5.5 \ HDF5_HOME=/tmp/hdf5-1.8.14/my_install check - pushd src; gcov -a H5Zzfp_lib H5Zzfp_plugin H5Zzfp_props; popd - pushd test; gcov -a test_read_lib test_write_lib test_write_plugin; popd after_success: - bash <(curl -s https://codecov.io/bash) LLNL-H5Z-ZFP-092190c/CMakeLists.txt000066400000000000000000000114141447422177700163450ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.9) # Fail immediately if not using an out-of-source build if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) message(FATAL_ERROR "In-source builds are not supported. Please create a build directory " "separate from the source directory") endif () if (POLICY CMP0074) # find_package() uses _ROOT variables. cmake_policy (SET CMP0074 NEW) endif () if (POLICY CMP0083) # To control generation of Position Independent Executable (PIE) or not, # some flags are required at link time. cmake_policy (SET CMP0083 NEW) endif () # Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24: if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") cmake_policy(SET CMP0135 NEW) endif() get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) #------------------------------------------------------------------------------# # Parse version number from H5Zzfp_version.h #------------------------------------------------------------------------------# file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/src/H5Zzfp_version.h" H5Z_ZFP_H REGEX "^\#define H5Z_FILTER_ZFP_VERSION_MAJOR") string(REGEX REPLACE "^.*MAJOR " "" H5Z_ZFP_VERSION_MAJOR "${H5Z_ZFP_H}") file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/src/H5Zzfp_version.h" H5Z_ZFP_H REGEX "^\#define H5Z_FILTER_ZFP_VERSION_MINOR") string(REGEX REPLACE "^.*MINOR " "" H5Z_ZFP_VERSION_MINOR "${H5Z_ZFP_H}") file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/src/H5Zzfp_version.h" H5Z_ZFP_H REGEX "^\#define H5Z_FILTER_ZFP_VERSION_PATCH") string(REGEX REPLACE "^.*PATCH " "" H5Z_ZFP_VERSION_PATCH "${H5Z_ZFP_H}") set(H5Z_ZFP_VERSION "${H5Z_ZFP_VERSION_MAJOR}.${H5Z_ZFP_VERSION_MINOR}.${H5Z_ZFP_VERSION_PATCH}") project(H5Z_ZFP VERSION ${H5Z_ZFP_VERSION} LANGUAGES C) # setup common output folders include (cmake/HDFMacros.cmake) SET_HDF_BUILD_TYPE() DEFAULT_FOLDERS() #------------------------------------------------------------------------------# # Compile options. #------------------------------------------------------------------------------# option(FORTRAN_INTERFACE "Enable the Fortran interface" ON) if (FORTRAN_INTERFACE) enable_language(Fortran) endif () #------------------------------------------------------------------------------# # Some boilerplate to setup nice output directories #------------------------------------------------------------------------------# set(CMAKE_INSTALL_BINDIR bin) set(CMAKE_INSTALL_LIBDIR lib) set(CMAKE_INSTALL_INCLUDEDIR include) set(CMAKE_INSTALL_CMAKEDIR lib/cmake/h5z_zfp) #------------------------------------------------------------------------------# # Required packages #------------------------------------------------------------------------------# # Find HDF5, relies on HDF5_DIR or HDF5_ROOT being set in environment. HDF5_SUPPORT () if (NOT HDF5_FOUND) message (FATAL_ERROR "HDF5 is Required for h5z_zfp") endif () # Find MPI depending on if HDF5 needs MPI. if ((HDF5_IS_PARALLEL OR HDF5_ENABLE_PARALLEL) AND ("${HDF5_VERSION}" VERSION_EQUAL "1.14.0")) find_package(MPI REQUIRED COMPONENTS C) endif() # Find ZFP, relies on ZFP_DIR or ZFP_ROOT being set in environment. find_package(ZFP REQUIRED CONFIG) if (NOT ZFP_FOUND) message (FATAL_ERROR "ZFP is Required for h5z_zfp") endif () #------------------------------------------------------------------------------# # Add source #------------------------------------------------------------------------------# add_subdirectory(${CMAKE_SOURCE_DIR}/src) #----------------------------------------------------------------------------- # Dashboard and Testing Settings #----------------------------------------------------------------------------- option (BUILD_TESTING "Build h5z-zfp Unit Testing" OFF) if (BUILD_TESTING) set (DART_TESTING_TIMEOUT 1200 CACHE STRING "Timeout in seconds for each test (default 1200=20minutes)") enable_testing () include (CTest) add_subdirectory(${CMAKE_SOURCE_DIR}/test) endif () #------------------------------------------------------------------------------# # Packaging #------------------------------------------------------------------------------# # Install h5z_zfp-config.cmake and h5z_zfp-config-version.cmake set(H5Z_ZFP_CONFIG_IN ${CMAKE_CURRENT_SOURCE_DIR}/cmake/h5z_zfp-config.cmake.in) set(H5Z_ZFP_CONFIG_OUT ${CMAKE_CURRENT_BINARY_DIR}/cmake/h5z_zfp-config.cmake) configure_file(${H5Z_ZFP_CONFIG_IN} ${H5Z_ZFP_CONFIG_OUT} @ONLY) set(H5Z_ZFP_CONFIG_VERSION_IN ${CMAKE_CURRENT_SOURCE_DIR}/cmake/h5z_zfp-config-version.cmake.in) set(H5Z_ZFP_CONFIG_VERSION_OUT ${CMAKE_CURRENT_BINARY_DIR}/cmake/h5z_zfp-config-version.cmake) configure_file(${H5Z_ZFP_CONFIG_VERSION_IN} ${H5Z_ZFP_CONFIG_VERSION_OUT} @ONLY) install(FILES ${H5Z_ZFP_CONFIG_OUT} DESTINATION ${CMAKE_INSTALL_CMAKEDIR}) install(FILES ${H5Z_ZFP_CONFIG_VERSION_OUT} DESTINATION ${CMAKE_INSTALL_CMAKEDIR}) LLNL-H5Z-ZFP-092190c/LICENSE000066400000000000000000000061061447422177700146140ustar00rootroot00000000000000 Copyright (c) 2016, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory Written by Mark C. Miller, miller86@llnl.gov LLNL-CODE-707197 All rights reserved. This file is part of H5Z-ZFP. For details, see https://github.com/LLNL/H5Z-ZFP. Please also read the Additional BSD Notice. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the disclaimer below. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the disclaimer (as noted below) in the documentation and/or other materials provided with the distribution. * Neither the name of the LLNS/LLNL nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Additional BSD Notice 1. This notice is required to be provided under our contract with the U.S. Department of Energy (DOE). This work was produced at Lawrence Livermore National Laboratory under Contract No. DE-AC52-07NA27344 with the DOE. 2. Neither the United States Government nor Lawrence Livermore National Security, LLC 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. 3. Also, reference herein to any specific commercial products, process, or services by trade name, trademark, manufacturer or otherwise does not necessarily constitute or imply its endorsement, recommendation, or favoring by the United States Government or Lawrence Livermore National Security, LLC. The views and opinions of authors expressed herein do not necessarily state or reflect those of the United States Government or Lawrence Livermore National Security, LLC, and shall not be used for advertising or product endorsement purposes. LLNL-H5Z-ZFP-092190c/Makefile000066400000000000000000000045471447422177700152560ustar00rootroot00000000000000# Include config.make only if we're not looking for help ifeq ($(findstring help, $(strip $(MAKECMDGOALS))),) ifeq ($(findstring tools, $(strip $(MAKECMDGOALS))),) ifeq ($(findstring clean, $(strip $(MAKECMDGOALS))),) ifeq ($(findstring dist, $(strip $(MAKECMDGOALS))),) include config.make endif endif endif endif # Get version string from H5Z-ZFP H5Z_ZFP_VERSINFO := $(shell grep '^\#define H5Z_FILTER_ZFP_VERSION_[MP]' src/H5Zzfp_version.h | cut -d' ' -f3 | tr '\n' '.' | cut -d'.' -f-3 2>/dev/null) .PHONY: help all clean dist install help: @echo "" @echo "" @echo "" @echo " This is H5Z-ZFP version $(H5Z_ZFP_VERSINFO)." @echo "See http://h5z-zfp.readthedocs.io/en/latest/ file for more info." @echo "" @echo "Typical make command is..." @echo "" @echo " make CC= HDF5_HOME= ZFP_HOME= PREFIX= all" @echo "" @echo "where is a dir whose children are include/lib/bin subdirs." @echo "HDF5_HOME can also be set using an INC,LIB,BIN triplet specifying" @echo "HDF5 include, library and binary dirs separated by commas." @echo "Standard make variables (e.g. CFLAGS, LD, etc.) can be set as usual." @echo "Optionally, add FC= to include Fortran support and tests." @echo "" @echo "Available make targets are..." @echo " all - build everything needed for H5Z-ZFP plugin/lib" @echo " check - all + run tests" @echo " tools - build tools (currently just print_h5repack_farg)" @echo " install - install plugin/lib" @echo " clean - clean away all derived targets" @echo " dist - create distribution tarfile" @echo " help - this help message" all: cd src; $(MAKE) $(MAKEVARS) $@ check: all cd test; $(MAKE) $(MAKEVARS) $@ tools: cd test; $(MAKE) $(MAKEVARS) print_h5repack_farg install: all cd src; $(MAKE) $(MAKEVARS) $@ clean: rm -f H5Z-ZFP-$(H5Z_ZFP_VERSINFO).tar.gz cd src; $(MAKE) $(MAKEVARS) $@ cd test; $(MAKE) $(MAKEVARS) $@ dist: clean rm -rf H5Z-ZFP-$(H5Z_ZFP_VERSINFO) H5Z-ZFP-$(H5Z_ZFP_VERSINFO).tar.gz; \ mkdir H5Z-ZFP-$(H5Z_ZFP_VERSINFO); \ tar cf - --exclude ".git*" --exclude H5Z-ZFP-$(H5Z_ZFP_VERSINFO) . | tar xf - -C H5Z-ZFP-$(H5Z_ZFP_VERSINFO); \ tar cvf - H5Z-ZFP-$(H5Z_ZFP_VERSINFO) | gzip --best > H5Z-ZFP-$(H5Z_ZFP_VERSINFO).tar.gz; \ rm -rf H5Z-ZFP-$(H5Z_ZFP_VERSINFO); LLNL-H5Z-ZFP-092190c/README.md000066400000000000000000000032571447422177700150720ustar00rootroot00000000000000# H5Z-ZFP A highly flexible floating point and integer compression plugin for the HDF5 library using ZFP compression. [![Build Status](https://travis-ci.com/LLNL/H5Z-ZFP.svg?branch=master)](https://travis-ci.com/LLNL/H5Z-ZFP) [![Documentation Status](https://readthedocs.org/projects/h5z-zfp/badge/?version=latest)](http://h5z-zfp.readthedocs.io) [![codecov](https://codecov.io/gh/LLNL/H5Z-ZFP/branch/master/graph/badge.svg)](https://codecov.io/gh/LLNL/H5Z-ZFP) For information about ZFP compression and the BSD-Licensed ZFP library, see... - https://computing.llnl.gov/projects/zfp - https://github.com/LLNL/zfp For information about HDF5 filter plugins, see... - https://support.hdfgroup.org/HDF5/doc/Advanced/DynamicallyLoadedFilters This H5Z-ZFP plugin supports ZFP versions 0.5.0 and newer. This plugin uses the [*registered*](https://portal.hdfgroup.org/display/support/Filters#Filters-32013) HDF5 plugin filter id 32013 The HDF5 filter plugin code here is also part of the Silo library. However, we have made an effort to also support it as a stand-alone package due to the likely broad appeal and utility of the ZFP compression library. This plugin supports all modes of the ZFP compression library, *rate*, *accuracy*, *precision*, *expert* and *reversible*. It supports 1, 2, 3 and 4 dimensional datasets (for ZFP version 0.5.5 and newer) of single and double precision integer and floating point data. It can be applied to HDF5 datasets of more than 3 dimensions (or 4 dimensions for ZFP versions 0.5.5 and newer) as long as no more than 3 (or 4) dimensions of the HDF5 dataset *chunking* are of size greater than 1. [**Full documentation**](http://h5z-zfp.readthedocs.io) LLNL-H5Z-ZFP-092190c/cmake/000077500000000000000000000000001447422177700146645ustar00rootroot00000000000000LLNL-H5Z-ZFP-092190c/cmake/HDFMacros.cmake000066400000000000000000000262361447422177700174450ustar00rootroot00000000000000#------------------------------------------------------------------------------- macro (DEFAULT_FOLDERS) #----------------------------------------------------------------------------- # Setup output Directories #----------------------------------------------------------------------------- if (NOT ${H5ZZFP_PACKAGE_NAME}_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_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all fortran modules." ) if(_isMultiConfig) set (CMAKE_TEST_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}) set (CMAKE_PDB_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all pdb files." ) else () set (CMAKE_TEST_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) endif () else () # if we are externally configured, but the project uses old cmake scripts # this may not be set if (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) endif () endif () endmacro () #------------------------------------------------------------------------------- macro (HDF5_SUPPORT) if (NOT H5Z-ZFP_HDF5_HEADER) set (FIND_HDF_COMPONENTS C shared) message(STATUS "HDF5 FORTRAN_INTERFACE ${FORTRAN_INTERFACE}" ) if (FORTRAN_INTERFACE) set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} Fortran) endif () message (STATUS "HDF5 find comps: ${FIND_HDF_COMPONENTS}") set (SEARCH_PACKAGE_NAME "HDF5") find_package (HDF5 NAMES ${SEARCH_PACKAGE_NAME} COMPONENTS ${FIND_HDF_COMPONENTS}) message (STATUS "HDF5 C libs:${HDF5_FOUND} static:${HDF5_static_C_FOUND} and shared:${HDF5_shared_C_FOUND}") message (STATUS "HDF5 Fortran libs: static:${HDF5_static_Fortran_FOUND} and shared:${HDF5_shared_Fortran_FOUND}") if (HDF5_FOUND) if (HDF5_shared_C_FOUND) if (NOT TARGET ${HDF5_NAMESPACE}h5dump-shared) add_executable (${HDF5_NAMESPACE}h5dump-shared IMPORTED) endif () set (HDF5_DUMP_EXECUTABLE $) if (NOT TARGET ${HDF5_NAMESPACE}h5diff-shared) add_executable (${HDF5_NAMESPACE}h5diff-shared IMPORTED) endif () set (HDF5_DIFF_EXECUTABLE $) if (NOT TARGET ${HDF5_NAMESPACE}h5repack-shared) add_executable (${HDF5_NAMESPACE}h5repack-shared IMPORTED) endif () set (HDF5_REPACK_EXECUTABLE $) message (STATUS "HDF5 shared Tools found - ${HDF5_DUMP_EXECUTABLE}") else () if (NOT TARGET ${HDF5_NAMESPACE}h5dump) add_executable (${HDF5_NAMESPACE}h5dump IMPORTED) endif () set (HDF5_DUMP_EXECUTABLE $) if (NOT TARGET ${HDF5_NAMESPACE}h5diff) add_executable (${HDF5_NAMESPACE}h5diff IMPORTED) endif () set (HDF5_DIFF_EXECUTABLE $) if (NOT TARGET ${HDF5_NAMESPACE}h5repack) add_executable (${HDF5_NAMESPACE}h5repack IMPORTED) endif () set (HDF5_REPACK_EXECUTABLE $) message (STATUS "HDF5 static Tools found - ${HDF5_DUMP_EXECUTABLE}") endif() if (NOT HDF5_static_C_FOUND AND NOT HDF5_shared_C_FOUND) #find library from non-dual-binary package set (FIND_HDF_COMPONENTS C) if (FORTRAN_INTERFACE) set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} Fortran) endif () message (STATUS "HDF5 find comps: ${FIND_HDF_COMPONENTS}") find_package (HDF5 NAMES ${SEARCH_PACKAGE_NAME} COMPONENTS ${FIND_HDF_COMPONENTS}) message (STATUS "HDF5 libs:${HDF5_FOUND} C:${HDF5_C_FOUND} Fortran:${HDF5_Fortran_FOUND}") if (HDF5_BUILD_SHARED_LIBS) add_definitions (-DH5_BUILT_AS_DYNAMIC_LIB) else () add_definitions (-DH5_BUILT_AS_STATIC_LIB) endif () if (FORTRAN_INTERFACE AND ${HDF5_BUILD_FORTRAN}) if (HDF5_shared_Fortran_FOUND) set (HDF5_FORTRAN_INCLUDE_DIRS ${HDF5_INCLUDE_DIR_FORTRAN}) set (HDF5_FORTRAN_LIBRARIES ${HDF5_FORTRAN_SHARED_LIBRARY}) else () set (FORTRAN_INTERFACE OFF CACHE BOOL "Build FORTRAN support" FORCE) message (STATUS "HDF5 Fortran libs not found - disable build of Fortran support") endif () endif () if (WIN32) set_property (TARGET ${HDF5_NAMESPACE}h5dump PROPERTY IMPORTED_LOCATION "${HDF5_TOOLS_DIR}/h5dumpdll") set_property (TARGET ${HDF5_NAMESPACE}h5diff PROPERTY IMPORTED_LOCATION "${HDF5_TOOLS_DIR}/h5diffdll") set_property (TARGET ${HDF5_NAMESPACE}h5repack PROPERTY IMPORTED_LOCATION "${HDF5_TOOLS_DIR}/h5repackdll") endif () set (HDF5_DUMP_EXECUTABLE $) set (HDF5_DIFF_EXECUTABLE $) set (HDF5_REPACK_EXECUTABLE $) message (STATUS "HDF5 windows Tools found - ${HDF5_DUMP_EXECUTABLE}") else () if (HDF5_shared_C_FOUND) set (HDF5_LIBRARIES ${HDF5_C_SHARED_LIBRARY}) set (HDF5_LIBRARY_PATH ${PACKAGE_PREFIX_DIR}/lib) set_property (TARGET ${HDF5_NAMESPACE}h5dump-shared PROPERTY IMPORTED_LOCATION "${HDF5_TOOLS_DIR}/h5dump-shared") set_property (TARGET ${HDF5_NAMESPACE}h5diff-shared PROPERTY IMPORTED_LOCATION "${HDF5_TOOLS_DIR}/h5diff-shared") set_property (TARGET ${HDF5_NAMESPACE}h5repack-shared PROPERTY IMPORTED_LOCATION "${HDF5_TOOLS_DIR}/h5repack-shared") else () set (HDF5_FOUND 0) endif () if (FORTRAN_INTERFACE AND ${HDF5_BUILD_FORTRAN}) if (HDF5_shared_Fortran_FOUND) set (HDF5_FORTRAN_INCLUDE_DIRS ${HDF5_INCLUDE_DIR_FORTRAN}) set (HDF5_FORTRAN_LIBRARIES ${HDF5_FORTRAN_SHARED_LIBRARY}) else () set (FORTRAN_INTERFACE OFF CACHE BOOL "Build FORTRAN support" FORCE) message (STATUS "HDF5 Fortran libs not found - disable build of Fortran support") endif () else () set (FORTRAN_INTERFACE OFF CACHE BOOL "Build FORTRAN support" FORCE) message (STATUS "HDF5 Fortran libs not found - disable build of Fortran support") endif () message (STATUS "HDF5 Tools imported location - ${HDF5_TOOLS_DIR}") endif () else () if (FORTRAN_INTERFACE) set(FORTRAN_COMP "Fortran") endif() find_package (HDF5 COMPONENTS ${FORTRAN_COMP}) # Legacy find if (FORTRAN_INTERFACE AND NOT HDF5_Fortran_FOUND) set (FORTRAN_INTERFACE OFF CACHE BOOL "Build FORTRAN support" FORCE) message (STATUS "HDF5 Fortran libs not found - disable build of Fortran support") endif () #Legacy find_package does not set HDF5_TOOLS_DIR, so we set it here get_filename_component(HDF5_BIN_DIR ${HDF5_DIFF_EXECUTABLE} DIRECTORY) set(HDF5_TOOLS_DIR ${HDF5_BIN_DIR}) if (NOT TARGET hdf5::h5dump) add_executable (${HDF5_NAMESPACE}h5dump IMPORTED) set_property (TARGET ${HDF5_NAMESPACE}h5dump PROPERTY IMPORTED_LOCATION "${HDF5_TOOLS_DIR}/h5dump") set (HDF5_DUMP_EXECUTABLE $) endif () if (NOT TARGET hdf5::h5diff) add_executable (${HDF5_NAMESPACE}h5diff IMPORTED) set_property (TARGET ${HDF5_NAMESPACE}h5diff PROPERTY IMPORTED_LOCATION "${HDF5_TOOLS_DIR}/h5diff") set (HDF5_DIFF_EXECUTABLE $) endif () if (NOT TARGET hdf5::h5repack) add_executable (${HDF5_NAMESPACE}h5repack IMPORTED) set_property (TARGET ${HDF5_NAMESPACE}h5repack PROPERTY IMPORTED_LOCATION "${HDF5_TOOLS_DIR}/h5repack") set (HDF5_REPACK_EXECUTABLE $) endif () message (STATUS "HDF5 legacy Tools found - ${HDF5_DUMP_EXECUTABLE}") endif () set (HDF5_PACKAGE_NAME ${SEARCH_PACKAGE_NAME}) if (HDF5_FOUND) set (HDF5_HAVE_H5PUBCONF_H 1) set (HDF5_HAVE_HDF5 1) set (H5Z-ZFP_HDF5_HEADER "h5pubconf.h") set (HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR}) message (STATUS "HDF5-${HDF5_VERSION_STRING} found: INC=${HDF5_INCLUDE_DIR} TOOLS=${HDF5_TOOLS_DIR}") else () message (FATAL_ERROR " HDF5 shared is required for H5Z-ZFP") endif () else () # This project is being called from within another and HDF5 is already configured set (HDF5_HAVE_H5PUBCONF_H 1) set (HDF5_HAVE_HDF5 1) set (HDF5_LIBRARIES ${HDF5_LINK_LIBS}) set (HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR}) endif () set (HDF5_LIBRARY_PATH ${PACKAGE_PREFIX_DIR}/lib) if (FORTRAN_INTERFACE) message (STATUS "HDF5 Fortran libs: include:${HDF5_FORTRAN_INCLUDE_DIRS} and shared:${HDF5_FORTRAN_LIBRARIES}") endif () message (STATUS "HDF5 link libs: ${HDF5_LIBRARIES} Includes: ${HDF5_INCLUDE_DIRS}") endmacro () #------------------------------------------------------------------------------- macro (SET_HDF_BUILD_TYPE) if (_isMultiConfig) # HDF_CFG_BUILD_TYPE is used in the Fortran install commands for the build location of the .mod files set (HDF_CFG_BUILD_TYPE \${CMAKE_INSTALL_CONFIG_NAME}) if (CMAKE_BUILD_TYPE) # set the default to the specified command line define set (HDF_CFG_NAME ${CMAKE_BUILD_TYPE}) else () # set the default to the MultiConfig variable set (HDF_CFG_NAME "$") endif () else () set (HDF_CFG_BUILD_TYPE ".") if (CMAKE_BUILD_TYPE) set (HDF_CFG_NAME ${CMAKE_BUILD_TYPE}) else () set (HDF_CFG_NAME "Release") endif () endif () if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.15.0") message (VERBOSE "Setting build type to 'RelWithDebInfo' as none was specified.") endif() set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() endmacro () #------------------------------------------------------------------------------- macro (TARGET_C_PROPERTIES wintarget libtype) target_compile_options(${wintarget} PRIVATE "$<$:${WIN_COMPILE_FLAGS}>" "$<$:${WIN_COMPILE_FLAGS}>" ) if(MSVC) set_property(TARGET ${wintarget} APPEND PROPERTY LINK_FLAGS "${WIN_LINK_FLAGS}") endif() endmacro () macro (HDFTEST_COPY_FILE src dest target) add_custom_command( OUTPUT "${dest}" COMMAND "${CMAKE_COMMAND}" ARGS -E copy_if_different "${src}" "${dest}" DEPENDS "${src}" ) list (APPEND ${target}_list "${dest}") endmacro () LLNL-H5Z-ZFP-092190c/cmake/h5z_zfp-config-version.cmake.in000066400000000000000000000010741447422177700226100ustar00rootroot00000000000000set(PACKAGE_VERSION_MAJOR @PROJECT_VERSION_MAJOR@) set(PACKAGE_VERSION_MINOR @PROJECT_VERSION_MINOR@) set(PACKAGE_VERSION_PATCH @PROJECT_VERSION_PATCH@) set(PACKAGE_VERSION @PROJECT_VERSION@) # Check whether the requested PACKAGE_FIND_VERSION is compatible if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION OR PACKAGE_VERSION_MAJOR GREATER PACKAGE_FIND_VERSION_MAJOR) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if(PACKAGE_VERSION VERSION_EQUAL PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_EXACT TRUE) endif() endif() LLNL-H5Z-ZFP-092190c/cmake/h5z_zfp-config.cmake.in000066400000000000000000000036221447422177700211260ustar00rootroot00000000000000# h5z_zfp-config.cmake # -------------------- # # Finds the H5Z_ZFP library, specify the starting search path in H5Z_ZFP_ROOT # # Static vs. shared # ----------------- # To make use of the static library instead of the shared one, one needs # to set the variable H5Z_ZFP_USE_STATIC_LIBS to ON before calling find_package. # Example: # set(H5Z_ZFP_USE_STATIC_LIBS ON) # find_package(H5Z_ZFP REQUIRED CONFIG) # # This will define the following variables: # # H5Z_ZFP_FOUND - True if the system has the H5Z_ZFP library. # H5Z_ZFP_WITH_OPENMP - True if the zfp library has been built with OpenMP support. # # and the following imported targets: # # h5z_zfp::h5z_zfp - The H5Z_ZFP library. find_path(H5Z_ZFP_INCLUDE_DIR NAMES H5Zzfp.h DOC "H5Z_ZFP include directory") if(H5Z_ZFP_USE_STATIC_LIBS) find_library(H5Z_ZFP_LIBRARY NAMES libh5zzfp.a DOC "H5Z_ZFP library") else() find_library(H5Z_ZFP_LIBRARY NAMES libh5zzfp.so HINTS $ENV{H5Z_ZFP_ROOT}/plugin DOC "H5Z_ZFP library") endif() include(FindPackageHandleStandardArgs) set(${CMAKE_FIND_PACKAGE_NAME}_CONFIG "${CMAKE_CURRENT_LIST_FILE}") find_package_handle_standard_args(H5Z_ZFP FOUND_VAR H5Z_ZFP_FOUND REQUIRED_VARS H5Z_ZFP_LIBRARY H5Z_ZFP_INCLUDE_DIR CONFIG_MODE ) if(H5Z_ZFP_FOUND) set(HDF5_USE_STATIC_LIBRARIES ${H5Z_ZFP_USE_STATIC_LIBS}) find_package(HDF5 MODULE REQUIRED COMPONENTS C) find_package(ZFP REQUIRED CONFIG) if(H5Z_ZFP_USE_STATIC_LIBS) add_library(h5z_zfp::h5z_zfp STATIC IMPORTED) else() add_library(h5z_zfp::h5z_zfp SHARED IMPORTED) endif() set_target_properties(h5z_zfp::h5z_zfp PROPERTIES IMPORTED_LOCATION "${H5Z_ZFP_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${H5Z_ZFP_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "zfp::zfp;${HDF5_LIBRARIES}" LINK_LIBRARIES "zfp::zfp;${HDF5_LIBRARIES}" ) set(H5Z_ZFP_WITH_OPENMP ${ZFP_WITH_OPENMP}) endif() mark_as_advanced( H5Z_ZFP_INCLUDE_DIR H5Z_ZFP_LIBRARY ) LLNL-H5Z-ZFP-092190c/config.make000066400000000000000000000161461447422177700157200ustar00rootroot00000000000000export SHELL = /bin/bash #ifeq ($(HDF5_HOME),) # $(warning WARNING: HDF5_HOME not specified) #endif # #ifeq ($(ZFP_HOME),) # $(warning WARNING: ZFP_HOME not specified) #endif # disallow relative paths in HOME variables HOME_WORDS := $(subst /, ,$(HDF5_HOME)) FIRST_WORD := $(firstword $(HOME_WORDS)) ifeq ($(FIRST_WORD),.) $(error Please use absolute path for HDF5_HOME) else ifeq ($(FIRST_WORD),..) $(error Please use absolute path for HDF5_HOME) endif HOME_WORDS := $(subst /, ,$(ZFP_HOME)) FIRST_WORD := $(firstword $(HOME_WORDS)) ifeq ($(FIRST_WORD),.) $(error Please use absolute path for ZFP_HOME) else ifeq ($(FIRST_WORD),..) $(error Please use absolute path for ZFP_HOME) endif # Construct H5Z_ZFP_BASE variable depending on what dir this config.cmake is being included from PWD_BASE = $(shell basename $$(pwd)) ifneq ($(wildcard config.make),) # we're in top-level dir H5Z_ZFP_BASE := ./src else ifneq ($(wildcard test_write.c),) # we're in test dir H5Z_ZFP_BASE := ../src else ifneq ($(wildcard H5Zzfp.c),) # we're in src dir H5Z_ZFP_BASE := . endif H5Z_ZFP_PLUGIN := $(H5Z_ZFP_BASE)/plugin ZFP_HAS_REVERSIBLE := ifneq ($(ZFP_HOME),) ZFP_HAS_REVERSIBLE := $(shell grep zfp_stream_set_reversible $(ZFP_HOME)/include/zfp.h 2>/dev/null) endif # Construct make-time knowledge of ZFP library version ZFP_LIB_VERSION := $(shell grep '^\#define ZFP_VERSION_[MPT]' $(ZFP_HOME)/include/zfp/version.h 2>/dev/null | tr ' ' '\n' | grep '[0-9]' | tr -d '\n') ifeq ($(ZFP_LIB_VERSION),) ZFP_LIB_VERSION := $(shell grep '^\#define ZFP_VERSION_[MRPT]' $(ZFP_HOME)/include/zfp.h 2>/dev/null | tr ' ' '\n' | grep '[0-9]' | tr -d '\n' 2>/dev/null) endif ifeq ($(ZFP_LIB_VERSION),) ZFP_LIB_VERSION := $(shell grep '^\#define ZFP_VERSION_[MRPT]' $(ZFP_HOME)/inc/zfp.h 2>/dev/null | tr ' ' '\n' | grep '[0-9]' | tr -d '\n' 2>/dev/null) endif ifeq ($(ZFP_LIB_VERSION),) $(warning WARNING: ZFP lib version not detected by make -- some tests may be skipped) endif # Detect system type PROCESSOR := $(shell uname -p | tr '[:upper:]' '[:lower:]') OSNAME := $(shell uname -s | tr '[:upper:]' '[:lower:]') OSTYPE := $(shell env | grep OSTYPE | cut -d'=' -f2- | tr '[:upper:]' '[:lower:]') # LLNL specific enviornment variable SYS_TYPE := $(shell env | grep SYS_TYPE | cut -d'=' -f2- | tr '[:upper:]' '[:lower:]') # Common C compilers HAS_GCC := $(shell basename $$(which gcc 2>/dev/null) 2>/dev/null) HAS_CLANG := $(shell basename $$(which clang 2>/dev/null) 2>/dev/null) HAS_ICC := $(shell basename $$(which icc 2>/dev/null) 2>/dev/null) HAS_PGCC := $(shell basename $$(which pgcc 2>/dev/null) 2>/dev/null) HAS_XLCR := $(shell basename $$(which xlc_r 2>/dev/null) 2>/dev/null) HAS_BGXLCR := $(shell basename $$(which bgxlc_r 2>/dev/null) 2>/dev/null) HAS_CC := $(shell basename $$(which cc 2>/dev/null) 2>/dev/null) # Common Fortran compilers HAS_GFORTRAN := $(shell basename $$(which gfortran 2>/dev/null) 2>/dev/null) HAS_IFORT := $(shell basename $$(which ifort 2>/dev/null) 2>/dev/null) HAS_XLFR := $(shell basename $$(which xlf_r 2>/dev/null) 2>/dev/null) HAS_BGXLFR := $(shell basename $$(which bgxlf_r 2>/dev/null) 2>/dev/null) # If compiler isn't set, lets try to pick it ifeq ($(CC),) ifeq ($(OSNAME),darwin) ifneq ($(strip $(HAS_CLANG)),) CC = $(HAS_CLANG) else ifneq ($(strip $(HAS_GCC)),) CC = $(HAS_GCC) else ifneq ($(strip $(HAS_CC)),) CC = $(HAS_CC) endif else ifneq ($(findstring ppc, $(PROCESSOR),),) ifneq ($(strip $(HAS_BGXLCR)),) CC = $(HAS_BGXLCR) else ifneq ($(strip $(HAS_XLCR)),) CC = $(HAS_XLCR) else ifneq ($(strip $(HAS_GCC)),) CC = $(HAS_GCC) endif else ifneq ($(strip $(HAS_GCC)),) CC = $(HAS_GCC) else ifneq ($(strip $(HAS_CLANG)),) CC = $(HAS_CLANG) else ifneq ($(strip $(HAS_ICC)),) CC = $(HAS_ICC) else ifneq ($(strip $(HAS_PGCC)),) CC = $(HAS_PGCC) endif endif endif # If we don't have a CC by now, error out ifeq ($(CC),) $(error $(CC)) endif # # Now, setup various flags based on compiler # ifneq ($(findstring gcc, $(CC)),) CFLAGS += -fPIC SOEXT ?= so SHFLAG ?= -shared PREPATH = -Wl,-rpath, else ifneq ($(findstring clang, $(CC)),) SOEXT ?= dylib SHFLAG ?= -dynamiclib PREPATH = -Wl,-rpath, else ifneq ($(findstring icc, $(CC)),) CFLAGS += -fpic SOEXT ?= so SHFLAG ?= -shared PREPATH = -Wl,-rpath, else ifneq ($(findstring pgcc, $(CC)),) CFLAGS += -fpic SOEXT ?= so SHFLAG ?= -shared PREPATH = -Wl,-rpath, else ifneq ($(findstring cc, $(CC)),) CFLAGS += -fPIC SOEXT ?= so SHFLAG ?= -shared PREPATH = -Wl,-rpath, else ifneq ($(findstring xlc_r, $(CC)),) CFLAGS += -qpic SOEXT ?= so SHFLAG ?= -qmkshrobj PREPATH = -Wl,-R, else ifneq ($(findstring bgxlc_r, $(CC)),) CFLAGS += -qpic SOEXT ?= so SHFLAG ?= -qmkshrobj PREPATH = -Wl,-R, endif ifneq ($(findstring gfortran, $(FC)),) FCFLAGS += -fPIC else ifneq ($(findstring ifort, $(FC)),) FCFLAGS += -fpic else ifneq ($(findstring pgf90, $(FC)),) FCFLAGS += -fpic else ifneq ($(findstring xlf_r, $(FC)),) FCFLAGS += -qpic else ifneq ($(findstring bgxlf_r, $(FC)),) FCFLAGS += -qpic else ifneq ($(findstring f77, $(FC)),) # some makefile versions set FC=f77 if FC is not set FC = endif ifneq ($(wildcard $(ZFP_HOME)/include),) ZFP_INC = $(ZFP_HOME)/include else ifneq ($(wildcard $(ZFP_HOME)/inc),) ZFP_INC = $(ZFP_HOME)/inc endif ifeq ($(wildcard $(ZFP_INC)/zfp.h),) # no header file $(warning "zfp.h not found") endif ifeq ($(wildcard $(ZFP_HOME)/lib),) ZFP_LIB = $(ZFP_HOME)/lib64 else ZFP_LIB = $(ZFP_HOME)/lib endif # Check if ZFP has CFP ifeq ($(wildcard $(ZFP_LIB)/libcfp.*),) # no cfp lib file ZFP_HAS_CFP = 0 else ifeq ($(wildcard $(ZFP_INC)/zfp/array.h),) # no 1.0.0 header file ifeq ($(wildcard $(ZFP_INC)/cfparrays.h),) # no 0.5.5 header file ZFP_HAS_CFP = 0 else ZFP_HAS_CFP = 1 endif else ZFP_HAS_CFP = 1 endif endif # Check if specified individually the HDF5 include directory, # library directory and bin directory separated by commas, i.e. HDF5_HOME=INC,LIB,BIN FOUND_LIST=$(shell echo "$(HDF5_HOME)" | grep -q "," && echo "true") ifeq ("$(FOUND_LIST)","true") HDF5_INC = $(shell echo $(HDF5_HOME) | awk -F'[,]' '{print $$1}') HDF5_LIB = $(shell echo $(HDF5_HOME) | awk -F'[,]' '{print $$2}') HDF5_BIN = $(shell echo $(HDF5_HOME) | awk -F'[,]' '{print $$3}') MAKEVARS = else HDF5_INC = $(HDF5_HOME)/include ifeq ($(wildcard $(HDF5_HOME)/lib),) HDF5_LIB = $(HDF5_HOME)/lib64 else HDF5_LIB = $(HDF5_HOME)/lib endif HDF5_BIN = $(HDF5_HOME)/bin MAKEVARS = HDF5_HOME=$(HDF5_HOME) endif HDF5_HAS_WRITE_CHUNK = 1 ifeq ($(shell grep H5Dwrite_chunk $(HDF5_INC)/*.h),) HDF5_HAS_WRITE_CHUNK = 0 endif ifeq ($(PREFIX),) PREFIX := $(shell pwd)/install endif INSTALL ?= install MAKEVARS += ZFP_HOME=$(ZFP_HOME) PREFIX=$(PREFIX) .SUFFIXES: .SUFFIXES: .c .F90 .h .o .mod %.o : %.c $(CC) $< -o $@ -c $(CFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) %.o %.mod : %.F90 $(FC) $< -o $@ -c $(FCFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) LLNL-H5Z-ZFP-092190c/docs/000077500000000000000000000000001447422177700145345ustar00rootroot00000000000000LLNL-H5Z-ZFP-092190c/docs/Makefile000066400000000000000000000152361447422177700162030ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ReadtheDocsTemplate.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ReadtheDocsTemplate.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/ReadtheDocsTemplate" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ReadtheDocsTemplate" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." LLNL-H5Z-ZFP-092190c/docs/cd_vals.rst000066400000000000000000000075321447422177700167100ustar00rootroot00000000000000======================================= H5Z-ZFP and the HDF5 filter's cd_values ======================================= .. note:: The details described here are likely relevant only to *developers* of the H5Z-ZFP_ filter. If you just want to *use* the filter, you can ignore this material. The HDF5_ library uses an array of values, named ``cd_values`` in formal arguments documenting various API functions, for managing *auxiliary data* for a filter. Instances of this ``cd_values`` array are used in two subtly different ways within HDF5. The first use is in *passing* auxiliary data for a filter from the caller to the library when initially creating a dataset. This happens *directly* in an ``H5Pset_filter()`` (`see here `_) call. The second use is in *persisting* auxiliary data for a filter to the dataset's object *header* in a file. This happens *indirectly* as part of an ``H5Dcreate()`` call. When a dataset creation property list includes a filter, the filter's ``set_local()`` method is called (see `H5Zregister() `_) as part of the ``H5Dcreate`` call. In the filter's ``set_local()`` method, the ``cd_values`` that were *passed* by the caller (in ``H5Pset_filter()``) are often modified (via ``H5Pmodify_filter()`` (`see here `__) before they are *persisted* to the dataset's object header in a file. Among other things, this design allows a filter to be generally configured for *any* dataset in a file and then adjusted as necessary to handle such things as data type and/or dimensions when it is applied to a specific dataset. Long story short, the data stored in ``cd_values`` of the dataset object's header in the file are often not the same values passed by the caller when the dataset was created. To make matters a tad more complex, the ``cd_values`` data is treated by HDF5_ as an array of C typed, 4-byte, ``unsigned integer`` values. Furthermore, regardless of `endianness `__ of the data producer, the persisted values are always stored in little-endian format in the dataset object header in the file. Nonetheless, if the persisted ``cd_values`` data is ever retrieved (e.g. via ``H5Pget_filter_by_id()`` (`see here `__), the HDF5_ library ensures the data is returned to callers with proper endianness. When command-line tools like ``h5ls`` and ``h5dump`` print ``cd_values``, the data will be displayed correctly. Handling double precision auxiliary data via ``cd_values`` is still more complicated because a single double precision value will span multiple entries in ``cd_values`` in almost all cases. Setting aside the possibility of differing floating point formats between the producer and consumers, any endianness handling the HDF5_ library does for the 4-byte entries in ``cd_values`` will certainly not ensure proper endianness handling of larger values. It is impossible for command-line tools like ``h5ls`` and ``h5dump`` to display such data correctly. Fortunately, the ZFP_ library has already been designed to handle these issues as part of the ZFP_'s *native* stream header. But, the ZFP_ library handles these issues in an endian-agnostic way. Consequently, the H5Z-ZFP_ filter uses the ``cd_values`` that is persisted to a dataset's object header to store ZFP_'s stream header. ZFP_'s stream header is stored starting at ``&cd_values[1]``. ``cd_values[0]`` is used to stored H5Z-ZFP_ filter and ZFP_ library and ZFP_ encoder version information. This also means that H5Z-ZFP_ avoids the overhead of duplicating the ZFP_ stream header in each dataset chunk. For larger chunks, these savings are probably not too terribly significant. LLNL-H5Z-ZFP-092190c/docs/conf.py000066400000000000000000000203451447422177700160370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Read the Docs Template documentation build configuration file, created by # sphinx-quickstart on Tue Aug 26 14:19:49 2014. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'H5Z-ZFP' copyright = u'2016, LLNL-CODE-707197' rst_epilog = """ .. _ZFP: https://computing.llnl.gov/projects/zfp .. _HDF5: https://docs.hdfgroup.org/hdf5/develop/ .. _H5Z-ZFP: https://github.com/LLNL/H5Z-ZFP .. _Spack: https://spack.io .. _CMake: https://cmake.org/cmake/help/latest/ """ # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '1.1' # The full version, including alpha/beta/rc tags. release = '1.1.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = "sphinx_rtd_theme" #html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". #html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'h5zzfpdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'H5Z-ZFP.tex', u'H5Z-ZFP Documentation', u'H5Z-ZFP', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'h5zzfp', u'H5Z-ZFP Documentation', [u'H5Z-ZFP'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'H5Z-ZFP', u'H5Z-ZFP Documentation', u'H5Z-ZFP', 'H5Z-ZFP', 'HDF5 floating point filter plugin.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False LLNL-H5Z-ZFP-092190c/docs/direct.rst000066400000000000000000000033421447422177700165420ustar00rootroot00000000000000========================= Direct Writes (and Reads) ========================= The purpose of direct_ writes is to enable an application to write data that is already compressed in memory *directly* to an HDF5 file without first uncompressing it so the filter can then turn around and compress it during write. However, once data is written to the file with a *direct* write, consumers must still be able to read it without concern for how the producer wrote it. Doing this requires the use of an advanced HDF5 function for direct_ writes. At present, we demonstrate only minimal functionality here using *single chunking*, where the chunk size is chosen to match the size of the entire dataset. To see an example of code that does this, have a look at... .. literalinclude:: ../test/test_write.c :language: c :linenos: :start-after: ZFP Array Example :end-before: End of ZFP Array Example In particular, look for the line using ``H5Dchunk_write`` in place of ``H5Dwrite``. In all other respects, the code looks the same. The test case for this code writes uncompressed data as a dataset named ``zfparr_original``, the compressed dataset named ``zfparr_compressed`` using the filter and then the compressed data a second time named ``zfparr_direct`` using a direct_ write. Then, the ``h5diff`` tool is used to compare the data in the original and the direct_ write datasets. Note that in order for consumers to work as normal, the producer must set dataset *creation* properties as it ordinarily would using the H5Z-ZFP_ filter. In the call to ``H5Dchunk_write``, the caller indicates to the HDF5 library not to invoke the filter via the ``filters`` mask argument. .. _direct: https://docs.hdfgroup.org/hdf5/develop/group___h5_d.html#title38 LLNL-H5Z-ZFP-092190c/docs/endian_issues.rst000066400000000000000000000046471447422177700201320ustar00rootroot00000000000000.. _endian-issues: ============= Endian Issues ============= This section describes some issues related to `endianness `__ of producers and consumers of the data processed by H5Z-ZFP_. This is likely less of an issue than it once was because almost all modern CPUs are `little-endian `__. That being said, the ZFP_ library writes an endian-independent stream. There is an unavoidable inefficiency when reading ZFP_ compressed data on a machine with a different endianness than the writer (e.g. a *mixed* endian context). Upon reading data from storage and decompressing the read stream with ZFP_, the correct endianness is returned in the result from ZFP_ before the buffer is handed back to HDF5_ from the decompression filter. This happens regardless of reader and writer endianness incompatibility. However, the HDF5_ library expects to get from H5Z-ZFP_ the endianness of the data as it was stored to the file on the writer machine and expects to have to byte-swap that buffer before returning to it an endian-incompatible caller. This means that in the H5Z-ZFP_ plugin, we wind up having to un-byte-swap an already correct result read in a cross-endian context. That way, when HDF5_ gets the data and byte-swaps it as it is expecting to, it will produce the correct final result. There is an endianness test in the Makefile and two ZFP_ compressed example datasets for big-endian and little-endian machines to test that cross-endian reads/writes work correctly. Again, because most CPUs are now little-endian and because ZFP_ became available only after the industry mostly moved away from big-endian, it is highly unlikely that this inefficiency will be triggered. Finally, *endian-targeting*, which is setting the file datatype for an endianness that is possibly different than the native endianness of the writer, is explicitly disallowed. For example, data may be produced on a big-endian system, but most consumers will be little-endian. Therefore, to alleviate downstream consumers from having to always byte-swap, it is desirable to byte-swap to little-endian when the data is written. However, the juxtaposition of HDF5_'s type conversion and filter operations in a pipeline makes this impractical for the H5Z-ZFP_ filter. The H5Z-ZFP_ filter will explicitly catch this condition, fail the compression and issue an error message. LLNL-H5Z-ZFP-092190c/docs/h5repack.rst000066400000000000000000000136071447422177700167770ustar00rootroot00000000000000================================== Using H5Z-ZFP Plugin with H5Repack ================================== A convenient way to use and play with the ZFP_ filter is as a *plugin* with the HDF5_ `h5repack `__ utility using the ``-f`` command-line argument to apply ZFP to existing data in a file. ----------------- Patching h5repack ----------------- .. warning:: Versions of HDF5_'s ``h5repack`` utility prior to 1.10.4 contain a bug that prevents proper parsing of the ``-f`` argument's option. In order to use ``h5repack`` with ``-f`` argument as described here, you need to apply the patch from `h5repack_parse.patch `_. To do so, after you've downloaded and untar'd HDF5_ but before you've built it, do something like the following using HDF5-1.8.14 as an example:: gunzip < hdf5-1.8.14.tar.gz | tar xvf - cd hdf5-1.8.14 patch ./tools/h5repack/h5repack_parse.c /h5repack_parse.patch ------------------------------------- Constructing an HDF5_ cd_values array ------------------------------------- HDF5_'s ``h5repack`` utility uses only the *generic* interface to HDF5_ filters. Another challenge in using ``h5repack`` as described here is constructing the set ``unsigned int cd_values`` as is used in `H5Pset_filter() `__ required by the *generic* HDF5_ filter interface, especially because of the type-punning (doubles as unsigned int) which may be involved. .. note:: Querying an existing dataset using ``h5dump`` or ``h5ls`` to obtain the ``cd_values`` *stored* with a ZFP_ compressed dataset will not provide the correct ``cd_values`` needed to invoke the filter. This is because the ``cd_values`` stored in the file are different from those needed in the *generic* interface to invoke the ZFP_ filter. To facilitate constructing a valid ``-f`` argument to ``h5repack``, there is a utility program, ``print_h5repack_farg``, which is presently in the ``test`` directory and is built when tests are built. This program was originally written simply to facilitate testing of H5Z-ZFP filter. It should eventually be made a first class *tool* installed with H5Z-ZFP. However, it is presently made only as part of *testing* H5Z-ZFP. The ``print_h5repack_farg`` utility can be used to read a command-line consisting of ZFP_ filter parameters you wish to use and output part of the command-line needed for the ``-f`` argument to ``h5repack``. -------- Examples -------- .. note:: The examples below assume H5Z-ZFP has been configured to run tests by either a preceding ``make check`` (if using a vanilla ``gmake`` build) or ``make test`` (if using a ``cmake`` build). In the examples below, we use ``h5repack`` with the example data file, ``mesh.h5`` in the tests directory. To use ZFP_ filter in *rate* mode with a rate of ``4.5`` bits per value, first, use the ``print_h5repack_farg``:: % ./print_h5repack_farg zfpmode=1 rate=4.5 Print cdvals for set of ZFP compression parameters... zfpmode=1 set zfp mode (1=rate,2=prec,3=acc,4=expert,5=rev) rate=4.5 set rate for rate mode of filter acc=0 set accuracy for accuracy mode of filter prec=0 set precision for precision mode of zfp filter minbits=0 set minbits for expert mode of zfp filter maxbits=0 set maxbits for expert mode of zfp filter maxprec=0 set maxprec for expert mode of zfp filter minexp=0 set minexp for expert mode of zfp filter help=0 this help message h5repack -f argument... -f UD=32013,0,4,1,0,0,1074921472 Next, cut-n-paste the ``-f UD=32013,0,4,1,0,0,1074921472`` in a command to ``h5repack`` like so:: env LD_LIBRARY_PATH=:$(LD_LIBRARY_PATH) \ HDF5_PLUGIN_PATH= \ $(HDF5_BIN)/h5repack -f UD=32013,0,4,1,0,0,1074921472 \ -l Pressure,Pressure2,Pressure3:CHUNK=10x20x5 \ -l Velocity,Velocity2,Velocity3,VelocityZ,VelocityZ2,VelocityZ3:CHUNK=11x21x1x1 \ -l VelocityX_2D:CHUNK=21x31 \ mesh.h5 mesh_repack.h5 where the ``-l`` arguments indicate the dataset(s) to be re-packed as well as their (new) chunking. To use ZFP_ filter in *accuracy* mode with an accuracy of ``0.075``, first, use the ``print_h5repack_farg``:: % ./print_h5repack_farg zfpmode=3 acc=0.075 Print cdvals for set of ZFP compression parameters... zfpmode=3 set zfp mode (1=rate,2=prec,3=acc,4=expert,5=rev) rate=3.5 set rate for rate mode of filter acc=0.075 set accuracy for accuracy mode of filter prec=0 set precision for precision mode of zfp filter minbits=0 set minbits for expert mode of zfp filter maxbits=0 set maxbits for expert mode of zfp filter maxprec=0 set maxprec for expert mode of zfp filter minexp=0 set minexp for expert mode of zfp filter help=0 this help message h5repack -f argument... -f UD=32013,0,4,3,0,858993459,1068708659 Next, cut-n-paste the ``-f UD=32013,0,4,3,0,858993459,1068708659`` in a command to ``h5repack`` like so:: env LD_LIBRARY_PATH=:$(LD_LIBRARY_PATH) \ HDF5_PLUGIN_PATH= \ $(HDF5_BIN)/h5repack -f UD=32013,0,4,3,0,858993459,1068708659 \ -l Pressure,Pressure2,Pressure3:CHUNK=10x20x5 \ -l Velocity,Velocity2,Velocity3,VelocityZ,VelocityZ2,VelocityZ3:CHUNK=11x21x1x1 \ -l VelocityX_2D:CHUNK=21x31 \ mesh.h5 mesh_repack.h5 LLNL-H5Z-ZFP-092190c/docs/hdf5_chunking.rst000066400000000000000000000225511447422177700200070ustar00rootroot00000000000000.. _hdf5_chunking: ============== HDF5_ Chunking ============== HDF5_'s dataset `chunking`_ feature is a way to optimize data layout on disk to support partial dataset reads by downstream consumers. This is all the more important when compression filters are applied to datasets as it frees a consumer from suffering the UNcompression of an entire dataset only to read a portion. ------------- ZFP Chunklets ------------- When using HDF5_ `chunking`_ with ZFP_ compression, it is important to account for the fact that ZFP_ does its work in tiny 4\ :sup:`d` chunklets of its own where `d` is the dataset dimension (*rank* in HDF5_ parlance). This means that whenever possible, the `chunking`_ dimensions you select in HDF5_ should be multiples of 4. When a chunk_ dimension is not a multiple of 4, ZFP_ will wind up with partial chunklets, which will be padded with useless data, reducing the results' overall time and space efficiency. The degree to which this may degrade performance depends on the percentage of a chunk_ that is padded. Suppose we have a 2D chunk of dimensions 27 x 101. ZFP_ will have to treat it as 28 x 104 by padding out each dimension to the next closest multiple of 4. The fraction of space that will wind up being wasted due to ZFP_ chunklet padding will be (28x104-27x101) / (28x104), which is about 6.4%. On the other hand, consider a 3D chunk that is 1024 x 1024 x 2. ZFP_ will have to treat it as a 1024 x 1024 x 4 resulting in 50% waste. The latter example is potentially very relevant when applying ZFP_ to compress data along the *time* dimension in a large, 3D, simulation. Ordinarily, a simulation advances one time step at a time and so needs to store in memory only the *current* timestep. However, in order to give ZFP_ enough *width* in the time dimension to satisfy the minimum chunklet dimension size of 4, the simulation needs to keep in memory 4 timesteps. This is demonstrated in the example below. -------------------- Partial I/O Requests -------------------- In any given H5Dwrite_ call, the caller has the option of writing (or reading) only a portion of the data in the dataset. This is a *partial I/O* request. This is handled by the ``mem_space_id`` and ``file_space_id`` arguments in an H5Dwrite_ call. An HDF5_ producer or consumer can issue partial I/O requests on *any* HDF5 dataset regardless of whether the dataset is compressed or not or whether the dataset has ``H5D_CONTIGUOUS`` layout. When combining partial I/O with compression, chunk size and shape in relation to partial I/O request size and shape will have an impact on performance. This is particularly important in *writer* scenarios if an I/O request winds up overlapping chunks only partially. Suppose the partially overlapped chunks exist in the file (from a previous write, for example). In that case, the HDF5_ library may wind up having to engage in *read-modify-write* operations for those chunks. If the partially overlapped chunks do not exist in the file, the HDF5_ library will wind up *fill-value* padding the chunks before they are written. HDF5_'s default fill value is zero (as defined by the associated datatype). Data producers can choose the desired fill value (see `H5Pset_fill_value `__) for a dataset, but this fill value can impact the space-performance of the compression filter. On the other hand, if the partial chunks in one I/O request wind up getting fully filled in another, any fill value impacts on compressor performance are resolved. Finally, HDF5_ manages a `chunk cache `__ and `data sieving buffer `__ to help alleviate some of the I/O performance issues that can be encountered in these situations. ----------------------------- More Than 3 (or 4) Dimensions ----------------------------- Versions of ZFP_ 0.5.3 and older support compression in only 1,2 or 3 dimensions. Versions of ZFP_ 0.5.4 and newer also support 4 dimensions. What if you have a dataset with more dimensions than ZFP_ can compress? You can still use the H5Z-ZFP_ filter. But, in order to do so, you are *required* to chunk_ the dataset [1]_ . Furthermore, you must select a chunk_ size such that no more than 3 (or 4 for ZFP_ 0.5.4 and newer) dimensions are non-unitary (e.g. of size one). For example, what if you are using ZFP_ 0.5.3 and have a 4D HDF5 dataset you want to compress? To do this, you will need to chunk_ the dataset and when you define the chunk_ size and shape, you will need to select which of the 4 dimensions of the chunk you do *not* intend to have ZFP_ perform compression along by setting the size of the chunk_ in that dimension to unity (1). When you do this, as HDF5 processes writes and reads, it will organize the data so that all the H5Z-ZFP_ filter *sees* are chunks which have *extent* only in the non-unity dimensions of the chunk_. In the example below, we have a 4D array of shape ``int dims[] = {256,128,32,16};`` that we have intentionally constructed to be *smooth* in only 2 of its 4 dimensions (e.g. correlation is high in those dimensions). Because of that, we expect ZFP_ compression to do well along those dimensions, and we do not want ZFP_ to compress along the other 2 dimensions. The *uncorrelated* dimensions here are dimensions with indices ``1`` (``128`` in ``dims[]``) and ``3`` (``16`` in ``dims[]``). Thus, our chunk_ size and shape are chosen to set the size for those dimension indices to ``1``, ``hsize_t hchunk[] = {256,1,32,1};`` .. literalinclude:: ../test/test_write.c :language: c :linenos: :start-after: Test high dimensional (>3D) array :end-before: End of high dimensional test What analysis process should you use to select the chunk_ shape? Depending on what you expect in the way of access patterns in downstream consumers, this can be a challenging question to answer. There are potentially two competing interests. One is optimizing the chunk_ size and shape for access patterns anticipated by downstream consumers. The other is optimizing the chunk_ size and shape for compression. These two interests may not be compatible and you may have to compromise between them. We illustrate the issues and trade-offs using an example. --------------------------------------------------- Compression *Along* the *State Iteration* Dimension --------------------------------------------------- By *state iteration* dimension, we refer to the data producer's main iteration loop(s). For example, the main iteration dimension for many PDE-based simulations is *time*. But, for some *outer loop* methods, the main iteration dimension(s) might be some kind of parameter study including multiple parameters. The challenge here is to manage the data to meet ZFP_'s chunklet size and shape *minimum* requirements. In any H5Dwrite_ at least 4 *samples* along a ZFP_ compression dimension are needed, or there will be wasted space due to padding. This means that data must be *buffered* along those dimensions *before* H5Dwrite_'s can be issued. For example, suppose you have a tensor-valued field (e.g. a 3x3 matrix at every *point*) over a 4D (3 spatial dimensions and 1 time dimension), regularly sampled domain? Conceptually, this is a 6 dimensional dataset in HDF5_ with one of the dimensions (the *time* dimension) *extendable*. So, you are free to define this as a 6 dimensional dataset in HDF5_. But, you will also have to chunk_ the dataset. You can select any chunk_ shape you want, except that no more than 3 (or 4 for ZFP_ versions 0.5.4 and newer) dimensions of the chunk_ can be non-unity. In the code snippet below, we demonstrate this case. A key issue to deal with is that because we will use ZFP_ to compress along the time dimension, this forces us to keep in memory a sufficient number of timesteps to match ZFP_'s chunklet size of 4. The code below iterates over 9 timesteps. Each of the first two groups of 4 timesteps are buffered in memory in ``tbuf``. Once 4 timesteps have been buffered, we can issue an H5Dwrite_ call doing `hyperslab `__ can issue an H5Dwrite_ call doing `hyperslab `__ partial I/O on the 6D, `extendable `__ dataset. But, notice that the chunk_ dimensions (line 10) are such that only 4 of the 6 dimensions are non-unity. This means ZFP_ will only ever see something to compress that is essentially 4D. On the last iteration, we have only one *new* timestep. So, when we write this to ZFP_ 75% of that write will be *wasted* due to ZFP_ chunklet padding. However, if the application were to *restart* from this time and continue forward, this *waste* would ultimately get overwritten with new timesteps. .. literalinclude:: ../test/test_write.c :language: c :linenos: :start-after: 6D Example :end-before: End of 6D Example .. _chunking: https://portal.hdfgroup.org/display/HDF5/Chunking+in+HDF5 .. _chunk: https://portal.hdfgroup.org/display/HDF5/Chunking+in+HDF5 .. _H5Dwrite: https://docs.hdfgroup.org/hdf5/v1_14/group___h5_d.html#title37 .. [1] The HDF5_ library currently requires dataset chunking anyways for any dataset that has any kind of filter applied. LLNL-H5Z-ZFP-092190c/docs/index.rst000066400000000000000000000022311447422177700163730ustar00rootroot00000000000000================== Welcome to H5Z-ZFP ================== H5Z-ZFP_ is a compression filter for HDF5_ using the ZFP_ compression library, supporting *lossy* and *lossless* compression of floating point and integer data to meet `bitrate `_, `accuracy `_, and/or `precision `_ targets. The filter uses the `registered `__ HDF5_ filter ID, ``32013``. It supports single and double precision floating point and integer data *chunked* in 1, 2 or 3 dimensions. The filter will function on datasets of more than 3 dimensions (or 4 dimensions for ZFP_ versions 0.5.4 and newer), albeit at the possible expense of compression performance, as long as no more than 3 (or 4) dimensions of the HDF5 dataset chunking are of size greater than 1. Contents: .. toctree:: :maxdepth: 1 :glob: installation interfaces hdf5_chunking cd_vals direct h5repack endian_issues tests LLNL-H5Z-ZFP-092190c/docs/installation.rst000066400000000000000000000352431447422177700177760ustar00rootroot00000000000000============ Installation ============ Three ways to install H5Z-ZFP_ are provided. These are * With generic (GNU) :ref:`make ` * With :ref:`CMake ` * With :ref:`Spack ` For both generic make and CMake_, you are responsible for also installing (or knowing where the installations are) the dependencies, ZFP_ and HDF5_. For Spack_ installations, Spack_ will handle installation of dependencies as well. .. _gnumake: --------------------------------- Installing via Generic (GNU) Make --------------------------------- H5Z-ZFP_ installation supports both vanilla (`GNU `__) Make (described below) as well as :ref:`CMake `. ^^^^^^^^^^^^^ Prerequisites ^^^^^^^^^^^^^ * `ZFP Library `_ (or from `Github `_) * `HDF5 Library `_ * `H5Z-ZFP filter plugin `_ .. _zfp-config: ^^^^^^^^^^^^^^ Compiling ZFP_ ^^^^^^^^^^^^^^ * There is a ``Config`` file in top-level directory of the ZFP_ distribution that holds ``make`` variables the ZFP_ Makefiles use. By default, this file is setup for a vanilla GNU compiler. If this is not the appropriate compiler, edit ``Config`` as necessary to adjust the compiler and compilation flags. * An important flag you **will** need to adjust in order to use the ZFP_ library with this HDF5_ filter is the ``BIT_STREAM_WORD_TYPE`` CPP flag. To use ZFP_ with H5Z-ZFP_, the ZFP_ library **must** be compiled with ``BIT_STREAM_WORD_TYPE`` of ``uint8``. Typically, this is achieved by including a line in ``Config`` of the form ``DEFS += -DBIT_STREAM_WORD_TYPE=uint8``. If you attempt to use this filter with a ZFP_ library compiled differently from this, the filter's ``can_apply`` method will always return false. This will result in silently ignoring an HDF5_ client's request to compress data with ZFP_. Also, be sure to see :ref:`endian-issues`. * After you have setup ``Config``, simply run ``make`` and it will build the ZFP_ library placing the library in a ``lib`` sub-directory and the necessary include files in ``inc[lude]`` sub-directory. * For more information and details, please see the `ZFP README `_. ^^^^^^^^^^^^^^^ Compiling HDF5_ ^^^^^^^^^^^^^^^ * If you want to be able to run the fortran tests for this filter, HDF5_ must be configured with *both* the ``--enable-fortran`` and ``--enable-fortran2003`` configuration switches. Otherwise, any vanilla installation of HDF5_ is acceptable. * The Fortran interface to this filter *requires* a Fortran 2003 compiler because it uses `ISO_C_BINDING `_ to define the Fortran interface. * If you are using HDF5-1.12 and wish to use the filter as a *library* (see :ref:`plugin-vs-library`), you may need configure HDF5 with ``--disable-memory-alloc-sanity-check`` to work around a memory management issue in HDF5. ^^^^^^^^^^^^^^^^^ Compiling H5Z-ZFP ^^^^^^^^^^^^^^^^^ H5Z-ZFP_ is designed to be compiled both as a standalone HDF5_ *plugin* and as a separate *library* an application can explicitly link. See :ref:`plugin-vs-library`. Once you have installed the prerequisites, you can compile H5Z-ZFP_ using a command-line... :: make [FC=] CC= \ ZFP_HOME= HDF5_HOME= \ PREFIX= where ```` is a directory containing ZFP_ ``inc[lude]`` and ``lib`` dirs and ```` is a directory containing HDF5_ ``include`` and ``lib`` dirs. If you don't specify a C compiler, it will try to guess one from your path. Fortran compilation is optional. If you do not specify a Fortran compiler, it will not attempt to build the Fortran interface. However, if the variable ``FC`` is already defined in your environment (as in Spack_ for example), then H5Z-ZFP_ will attempt to build Fortran. If this is not desired, the solution is to pass an *empty* ``FC`` on the make command line as in... :: make FC= CC= \ ZFP_HOME= HDF5_HOME= \ PREFIX= The Makefile uses GNU Make syntax and is designed to work on OSX and Linux. The filter has been tested on gcc, clang, xlc, icc and pgcc compilers and checked with valgrind. The command ``make help`` will print useful information about various make targets and variables. ``make check`` will compile everything and run a handful of tests. If you don't specify a ``PREFIX``, it will install to ``./install``. The installed package will look like... :: $(PREFIX)/include/{H5Zzfp.h,H5Zzfp_plugin.h,H5Zzfp_props.h,H5Zzfp_lib.h} $(PREFIX)/plugin/libh5zzfp.{so,dylib} $(PREFIX)/lib/libh5zzfp.a where ``$(PREFIX)`` resolves to whatever the full path of the installation is. To use the installed filter as an HDF5_ *plugin*, you would specify, for example, ``setenv HDF5_PLUGIN_PATH $(PREFIX)/plugin`` .. _ceemake: -------------------- Installing via CMake -------------------- It is possible to build the H5Z-ZFP_ filter using the CMake_ build system. To use CMake_ for H5Z-ZFP_, it is necessary to have also built ZFP_ with CMake. This is necessary to get the correct dependencies from ZFP_. For example, it is possible to build ZFP_ with OpenMP support. The resulting CMake_ config files of ZFP_ build will make sure that this OpenMP dependency is correctly propagated to the build of H5Z-ZFP_ filter. However, for HDF5_ it is not necessary to build it with its CMake_ build system but it is strongly recommended. ZFP_ must have been :ref:`configured ` with ``BIT_STREAM_WORD_TYPE`` of ``uint8`` as described above. Similar as for the Makefile installation, the CMake_ build system is designed such it compiles both the standalone HDF5_ *plugin* and a separate *library* an application can explicitly link. See :ref:`plugin-vs-library` Once both HDF5_ and ZFP_ have been installed, H5Z-ZFP_ can be compiled using a command=line... :: export HDF5_DIR= export ZFP_DIR= CC= FC= cmake -DCMAKE_INSTALL_PREFIX= where ```` is a directory containing ``zfp-config.cmake`` and ```` is a directory containing HDF5_ ``include`` and ``lib`` directories. Furthermore, ``src-dir`` is the directory where the H5Z-ZFP_ source is located and ``path-to-install`` is the directory in which the resulting *plugin* and *library* will be installed. Once ``cmake`` has finished successfully, you can build and install the filter using the command... :: make install This ``cmake`` and ``make`` combination builds both the C and Fortran interface. In the case you want to specify the ```` and ``>`` via command-line to CMake_, the command looks like this... :: CC= FC= cmake -DCMAKE_INSTALL_PREFIX= -DCMAKE_PREFIX_PATH=";" .. note:: The double quotes in the CMAKE_PREFIX_PATH expression are necessary to make sure that semicolon is interpreted as a semicolon instead of a new command. It is possible to build the filter without the Fortran interface. This is done as follows... :: export HDF5_DIR= export ZFP_DIR= CC= cmake -DCMAKE_INSTALL_PREFIX= -DFORTRAN_INTERFACE:BOOL=OFF followed by the same make command... :: make install ------------------------------------------- Including H5Z-ZFP filter in a CMake project ------------------------------------------- Suppose you have built the H5Z-ZFP_ filter using the CMake_ build system and installed it in ````. To include it in another CMake_ project is done using the following steps. First edit the ``CMakeLists.txt`` by adding the following two lines... :: cmake_policy(SET CMP0028 NEW) # Double colon in target name means ALIAS or IMPORTED target. ... set(H5Z_ZFP_USE_STATIC_LIBS OFF) find_package(H5Z_ZFP 1.0.1 CONFIG) ... target_link_libraries( h5z_zfp::h5z_zfp) ... where ```` in the target within the CMake_ project. This could be, for example, an executable or library. Furthermore, check if the ``cmake`` version is equal or greater than 3.9. Next, you need to make sure that the filter can be found by CMake_, followed by ``cmake`` itself and ``make``... :: export H5Z_ZFP_DIR= CC= cmake -DCMAKE_INSTALL_PREFIX= make install The ``cmake`` command itself could be different depending on the CMake_ project you have created. If you want to make use of the H5Z-ZFP_ *library* instead of the plugin, change cmake variable ``H5Z_ZFP_USE_STATIC_LIBS`` to ``ON`` and build the project. .. _spack2: --------------------- Installing via Spack_ --------------------- If you already have experience with Spack_, one way to install H5Z-ZFP_ is to use the command ``spack install h5z-zfp``. If you do not have Spack_ installed, it is easy to install. Assuming you are working in a Bash shell...:: git clone https://github.com/llnl/spack.git cd spack git checkout releases/v0.20 . ./share/spack/setup-env.sh spack install h5z-zfp .. note:: It is important to work from a *released* branch of Spack_. The command ``git checkout releases/v0.20`` ensures this. If a newer release of Spack_ is available, by all means feel free to use it. Just change the ``v0.20`` to indicate the release of the Spack_ you want. The command ``git branch -r | grep releases`` will produce a list of the available release branches. If you are using a version of Spack_ very much older than the release of H5Z-ZFP_ you intend to use, you may have to *pin* various versions of H5Z-ZFP_, ZFP_ and/or HDF5_. This is done by using Spack_'s ``@`` modifier to specify versions. For example, to *pin* the version of the ZFP_ library to 0.5.5, the Spack_ command would look like:: spack install h5z-zfp ^zfp@0.5.5 To use the ``develop`` version of H5Z-ZFP_ with version 1.10.6 of HDF5_ :: spack install h5z-zfp@develop ^hdf5@1.10.6 By default, H5Z-ZFP_ will attempt to build with Fortran support which requires a Fortran compiler. If you wish to exclude support for Fortran, use the command:: spack install h5z-zfp~fortran Spack_ packages can sometimes favor the use of dependencies you may not need. For example, the HDF5_ package favors the use of MPI. Since H5Z-ZFP_ depends on HDF5_, this behavior will then create a dependency of H5Z-ZFP_ on MPI. To avoid this, you can force Spack_ to use a version of HDF5_ *without* MPI. In the example command below, we force Spack_ to not use MPI with HDF5_ and to not use OpenMP with ZFP_:: spack install h5z-zfp~fortran ^hdf5~mpi~fortran ^zfp~openmp This can have the effect of substantially reducing the number of dependencies Spack_ winds up having to build (from 35 in one case to 10) in order to install H5Z-ZFP_ which, in turn, speeds up the install process. .. note:: Spack_ will build H5Z-ZFP_ **and** all of its dependencies including the HDF5_ library *as well as a number of other dependencies you may not initially expect*. Be patient and let the build complete. It may take as much as an hour. In addition, by default, Spack_ installs packages to directory *hashes within* the cloned Spack_ repository's directory tree, ``$spack/opt/spack``. You can find the resulting installed HDF5_ library with the command ``spack find -vp hdf5`` and the resulting H5Z-ZFP_ plugin installation with the command ``spack find -vp h5z-zfp``. If you wish to exercise more control over how and where Spack_ installs, have a look at `configuring Spack `_ -------------------------------- H5Z-ZFP Source Code Organization -------------------------------- The source code is in two separate directories * ``src`` includes the ZFP_ filter and a few header files * ``H5Zzfp_plugin.h`` is an optional header file applications *may* wish to include because it contains several convenient macros for easily controlling various compression modes of the ZFP_ library (*rate*, *precision*, *accuracy*, *expert*) via the :ref:`generic-interface`. * ``H5Zzfp_props.h`` is a header file that contains functions to control the filter using *temporary* :ref:`properties-interface`. Fortran callers are *required* to use this interface. * ``H5Zzfp_lib.h`` is a header file for applications that wish to use the filter explicitly as a library rather than a plugin. * ``H5Zzfp.h`` is an *all-of-the-above* header file for applications that don't care too much about separating out the above functionalities. * ``test`` includes various tests. In particular ``test_write.c`` includes examples of using both the :ref:`generic-interface` and :ref:`properties-interface`. In addition, there is an example of how to use the filter from Fortran in ``test_rw_fortran.F90``. ---------------- Silo Integration ---------------- This filter (``H5Zzfp.c``) is also built-in to the `Silo library `_. In particular, the ZFP_ library itself is also embedded in Silo but is protected from appearing in Silo's global namespace through a struct of function pointers (see `Namespaces in C `_). If you happen to examine the source code here for H5Z-ZFP_, you will see some logic here that is specific to using this plugin within Silo and dealing with ZFP_ as an embedded library using this struct of function pointers wrapper. In the source code for H5Z-ZFP_ this manifests as something like what is shown in the code snippet below... .. literalinclude:: ../src/H5Zzfp.c :language: c :linenos: :start-after: /* set up dummy zfp field to compute meta header */ :end-before: if (!dummy_field) In the code snippet above, note the funny ``Z`` in front of calls to various methods in the ZFP_ library. When compiling H5Z-ZFP_ normally, that ``Z`` normally resolves to the empty string. But, when the code is compiled with ``-DAS_SILO_BUILTIN`` (which is supported and should be done *only* when ``H5Zzfp.c`` is being compiled *within* the Silo library and *next to* a version of ZFP_ that is embedded in Silo) that ``Z`` resolves to the name of a struct and struct-member dereferencing operator as in ``zfp.``. There is a similar ``B`` used for a similar purpose ahead of calls to ZFP_'s bitstream library. This is something to be aware of and to adhere to if you plan to contribute any code changes here. LLNL-H5Z-ZFP-092190c/docs/interfaces.rst000066400000000000000000000222251447422177700174140ustar00rootroot00000000000000========== Interfaces ========== There are two interfaces to control the filter. One uses HDF5_'s *generic* interface via an array of ``unsigned int cd_values`` as is used in `H5Pset_filter() `__. The other uses HDF5_ `property lists `__ added to the `dataset creation property list `__ used when the dataset to be compressed is being created. You can find examples of writing HDF5_ data using both the `generic `_ and `properties `__ interfaces in `test_write.c `_. The filter itself supports either interface. The filter also supports all of the standard ZFP_ controls for affecting compression including *rate*, *precision*, *accuracy*, *expert* and *reversible* modes. For more information and details about these modes of controlling ZFP_ compression, please see the `ZFP README `_. Finally, you should *not* attempt to combine the ZFP_ filter with any other *byte order altering* filter such as, for example, HDF5_'s shuffle filter. Space-performance will be ruined. This is in contrast to HDF5_'s `deflate `__ filter which often performs *better* when used in conjunction with the `shuffle `__ filter. To understand why, see the description of :ref:`endian issues `. .. _generic-interface: ----------------- Generic Interface ----------------- The generic interface is the only means of controlling the H5Z-ZFP_ filter when it is used as a `dynamically loaded HDF5 plugin `_. For the generic interface, the following CPP macros are defined in the ``H5Zzfp_plugin.h`` header file:: H5Pset_zfp_rate_cdata(double rate, size_t cd_nelmts, unsigned int *cd_vals); H5Pset_zfp_precision_cdata(unsigned int prec, size_t cd_nelmts, unsigned int *cd_vals); H5Pset_zfp_accuracy_cdata(double acc, size_t cd_nelmts, unsigned int *cd_vals); H5Pset_zfp_expert_cdata(unsigned int minbits, unsigned int maxbits, unsigned int maxprec, int minexp, size_t cd_nelmts, unsigned int *cd_vals); H5Pset_zfp_reversible_cdata(size_t cd_nelmts, unsigned int *cd_vals); These macros utilize *type punning* to store the relevant ZFP_ parameters into a sufficiently large array (>=6) of ``unsigned int cd_values``. It is up to the caller to then call `H5Pset_filter() `__ with the array of cd_values constructed by one of these macros. Here is example code from `test_write.c `_... .. literalinclude:: ../test/test_write.c :language: c :linenos: :start-after: setup zfp filter via generic (cd_values) interface :end-before: #else However, these macros are only a convenience. You do not **need** the ``H5Zzfp_plugin.h`` header file if you want to avoid using it. But, you are then responsible for setting up the ``cd_values`` array correctly for the filter. For reference, the ``cd_values`` array for this ZFP_ filter is defined like so... +-----------+---------------------------------------------------------+ | | cd_values index | +-----------+--------+--------+---------+---------+---------+---------+ | ZFP mode | 0 | 1 | 2 | 3 | 4 | 5 | +-----------+--------+--------+---------+---------+---------+---------+ | rate | 1 | unused | rateA | rateB | unused | unused | +-----------+--------+--------+---------+---------+---------+---------+ | precision | 2 | unused | prec | unused | unused | unused | +-----------+--------+--------+---------+---------+---------+---------+ | accuracy | 3 | unused | accA | accB | unused | unused | +-----------+--------+--------+---------+---------+---------+---------+ | expert | 4 | unused | minbits| maxbits| maxprec| minexp | +-----------+--------+--------+---------+---------+---------+---------+ | reversible| 5 | unused | unused | unused | unused | unused | +-----------+--------+--------+---------+---------+---------+---------+ A/B are high/low 32-bit words of a double. Note that the cd_values used in the generic interface to ``H5Pset_filter()`` are **not the same** cd_values ultimately stored to the HDF5_ dataset header for a compressed dataset. The values are transformed in the set_local method to use ZFP_'s internal routines for 'meta' and 'mode' data. So, don't make the mistake of examining the values you find in a file and think you can use those same values, for example, in an invocation of h5repack. .. _properties-interface: -------------------- Properties Interface -------------------- For the properties interface, the following functions are defined in the ``H5Zzfp_props.h`` header file:: herr_t H5Pset_zfp_rate(hid_t dcpl_id, double rate); herr_t H5Pset_zfp_precision(hid_t dcpl_id, unsigned int prec); herr_t H5Pset_zfp_accuracy(hid_t dcpl_id, double acc); herr_t H5Pset_zfp_expert(hid_t dcpl_id, unsigned int minbits, unsigned int maxbits, unsigned int maxprec, int minexp); herr_t H5Pset_zfp_reversible(hid_t dcpl_id); These functions take a dataset creation property list, ``hid_t dcp_lid`` and create temporary HDF5_ property list entries to control the ZFP_ filter. Calling any of these functions removes the effects of any previous call to any one of these functions. In addition, calling any one of these functions also has the effect of adding the filter to the pipeline. Here is example code from `test_write.c `_... .. literalinclude:: ../test/test_write.c :language: c :linenos: :start-after: When filter is used as a library, we need to init it :end-before: #endif The properties interface is more type-safe than the generic interface. However, there is no way for the implementation of the properties interface to reside within the filter plugin itself. The properties interface requires that the caller link with with the filter as a *library*, ``libh5zzfp.a``. The generic interface does not require this. Note that either interface can be used whether the filter is used as a plugin or as a library. The difference is whether the application calls ``H5Z_zfp_initialize()`` or not. ----------------- Fortran Interface ----------------- Fortran equivalents for both the properties and generic interfaces, described above, has been added by Scot Breitenfeld of the HDF5_ group. The code that implements the Fortran interfaces is in the file ``H5Zzfp_props_f.F90``. An example of its use is in ``test/test_rw_fortran.F90``. .. _plugin-vs-library: ---------------------------- Plugin vs. Library Operation ---------------------------- The filter is designed to be compiled for use as both a standalone HDF5_ `dynamically loaded HDF5 plugin `_ and as an explicitly linked *library*. When it is used as a plugin, it is a best practice to link the ZFP_ library into the plugin dynamic/shared object as a *static* library. Why? In so doing, we ensure that all ZFP_ public namespace symbols remain *confined* to the plugin so as not to interfere with any application that may be directly explicitly linking to the ZFP_ library for other reasons. All HDF5_ applications are *required* to *find* the plugin dynamic library (named ``lib*.{so,dylib}``) in a directory specified by the environment variable, ``HDF5_PLUGIN_PATH``. Currently, the HDF5 library offers no mechanism for applications themselves to have pre-programmed paths in which to search for a plugin. Applications are then always vulnerable to an incorrectly specified or unspecified ``HDF5_PLUGIN_PATH`` environment variable. However, the plugin can also be used explicitly as a *library*. In this case, **do** **not** specify the ``HDF5_PLUGIN_PATH`` environment variable and instead have the application link to ``libH5Zzfp.a`` in the ``lib`` dir of the installation. Instead two initialization and finalization routines are defined:: int H5Z_zfp_initialize(void); int H5Z_zfp_finalize(void); These functions are defined in the ``H5Zzfp_lib.h`` header file. Any applications that wish to use the filter as a *library* are required to call the initialization routine, ``H5Z_zfp_initialize()`` before the filter can be referenced. In addition, to free up resources used by the filter, applications may call ``H5Z_zfp_finalize()`` when they are done using the filter. LLNL-H5Z-ZFP-092190c/docs/tests.rst000066400000000000000000000116441447422177700164360ustar00rootroot00000000000000================== Tests and Examples ================== The tests directory contains a few simple tests of the H5Z-ZFP_ filter some of which also serve as decent examples. The test client, `test_write.c `_ is compiled a couple of different ways. One target is ``test_write_plugin`` which demonstrates the use of this filter as a standalone plugin. The other target, ``test_write_lib``, demonstrates the use of the filter as an explicitly linked library. By default, these test a simple 1D array with and without ZFP_ compression using either the :ref:`generic-interface` (for plugin) or the :ref:`properties-interface` (for library). You can use the code there as an example of using the ZFP_ filter either as a plugin or as a library. However, these also include some advanced usages for 4D and 6D, time-varying (e.g. *extendable*) datasets. The command ``test_write_lib help`` or ``test_write_plugin help`` will print a list of the example's options and how to use them. ------------------ Write Test Options ------------------ :: ./test/test_write_lib --help ifile="" set input filename ofile="test_zfp.h5" set output filename 1D dataset generation arguments... npoints=1024 set number of points for 1D dataset noise=0.001 set amount of random noise in 1D dataset amp=17.7 set amplitude of sinusoid in 1D dataset chunk=256 set chunk size for 1D dataset doint=0 also do integer 1D data ZFP compression parameters... zfpmode=3 (1=rate,2=prec,3=acc,4=expert,5=reversible) rate=4 set rate for rate mode of filter acc=0 set accuracy for accuracy mode of filter prec=11 set precision for precision mode of zfp filter minbits=0 set minbits for expert mode of zfp filter maxbits=4171 set maxbits for expert mode of zfp filter maxprec=64 set maxprec for expert mode of zfp filter minexp=-1074 set minexp for expert mode of zfp filter Advanced cases... highd=0 run 4D case sixd=0 run 6D extendable case (requires ZFP>=0.5.4) help=0 this help message The test normally just tests compression of 1D array of integer and double precision data of a sinusoidal array with a small amount of additive random noise. The ``highd`` test runs a test on a 4D dataset where two of the 4 dimensions are not correlated. This tests the plugin's ability to properly set chunking for HDF5 such that chunks span **only** correlated dimensions and have non-unity sizes in 3 or fewer dimensions. The ``sixd`` test runs a test on a 6D, extendable dataset representing an example of using ZFP_ for compression along the *time* axis. There is a companion, `test_read.c `_ which is compiled into ``test_read_plugin`` and ``test_read_lib`` which demonstrates use of the filter reading data as a plugin or library. Also, the commands ``test_read_lib help`` and ``test_read_plugin help`` will print a list of the command line options. To use the plugin examples, you need to tell the HDF5_ library where to find the H5Z-ZFP_ plugin with the ``HDF5_PLUGIN_PATH`` environment variable. The value you pass is the path to the directory containing the plugin shared library. Finally, there is a Fortran test example, `test_rw_fortran.F90 `_. The Fortran test writes and reads a 2D dataset. However, the Fortran test is designed to use the filter **only** as a library and not as a plugin. The reason for this is that the filter controls involve passing combinations of integer and floating point data from Fortran callers and this can be done only through the :ref:`properties-interface`, which by its nature requires any Fortran application to have to link with an implementation of that interface. Since we need to link extra code for Fortran, we may as well also link to the filter itself alleviating the need to use the filter as a plugin. Also, if you want to use Fortran support, the HDF5_ library must have, of course, been configured and built with Fortran support as well. In addition, a number tests are performed in the Makefile which test the plugin by using some of the HDF5_ tools such as ``h5dump`` and ``h5repack``. Again, to use these tools to read data compressed with the H5Z-ZFP_ filter, you will need to inform the HDF5_ library where to find the filter plugin. For example.. :: env HDF5_PLUGIN_PATH= h5ls test_zfp.h5 Where ```` is the relative or absolute path to a directory containing the filter plugin shared library. LLNL-H5Z-ZFP-092190c/src/000077500000000000000000000000001447422177700143735ustar00rootroot00000000000000LLNL-H5Z-ZFP-092190c/src/CMakeLists.txt000066400000000000000000000056051447422177700171410ustar00rootroot00000000000000# Define headers. set(h5z_zfp_headers H5Zzfp.h H5Zzfp_lib.h H5Zzfp_plugin.h H5Zzfp_props.h H5Zzfp_version.h) #------------------------------------------------------------------------------# # Static library #------------------------------------------------------------------------------# # Define source set(h5z_zfp_lib_source ${h5z_zfp_headers} H5Zzfp_props_private.h H5Zzfp.c H5Zzfp_props.c) if (FORTRAN_INTERFACE) list(APPEND h5z_zfp_lib_source H5Zzfp_props_f.F90) endif () add_library(h5z_zfp_static STATIC ${h5z_zfp_lib_source}) target_compile_definitions(h5z_zfp_static PRIVATE H5Z_ZFP_AS_LIB) target_include_directories(h5z_zfp_static PUBLIC "$" "$" "$" ${HDF5_INCLUDE_DIRS} "$<$:${HDF5_FORTRAN_INCLUDE_DIRS}>" ) target_link_libraries(h5z_zfp_static PUBLIC zfp::zfp ${HDF5_LIBRARIES} $<$:${HDF5_FORTRAN_LIBRARIES}>) set_target_properties(h5z_zfp_static PROPERTIES POSITION_INDEPENDENT_CODE 1) set_target_properties(h5z_zfp_static PROPERTIES OUTPUT_NAME h5zzfp RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) install(TARGETS h5z_zfp_static RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) #------------------------------------------------------------------------------# # Shared library #------------------------------------------------------------------------------# # Define source set(h5z_zfp_plugin_source ${h5z_zfp_headers} H5Zzfp.c) add_library(h5z_zfp_shared SHARED ${h5z_zfp_plugin_source}) target_include_directories(h5z_zfp_shared PUBLIC $ $ $ ${HDF5_INCLUDE_DIRS}) target_link_libraries(h5z_zfp_shared PUBLIC zfp::zfp ${HDF5_LIBRARIES}) set_target_properties(h5z_zfp_shared PROPERTIES OUTPUT_NAME h5zzfp RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/plugin ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/plugin LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/plugin) install(TARGETS h5z_zfp_shared RUNTIME DESTINATION plugin ARCHIVE DESTINATION plugin LIBRARY DESTINATION plugin) #------------------------------------------------------------------------------# # Install header and module files. #------------------------------------------------------------------------------# install(FILES ${h5z_zfp_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) if (FORTRAN_INTERFACE) install(FILES ${CMAKE_BINARY_DIR}/bin/h5zzfp_props_f.mod DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif () LLNL-H5Z-ZFP-092190c/src/H5Zzfp.c000066400000000000000000000643731447422177700157020ustar00rootroot00000000000000#include #include /* This code was based heavily on one of the HDF5 library's internal filter, H5Zszip.c. The intention in so doing wasn't so much to plagerize HDF5 developers as it was to produce a code that, if The HDF Group ever decided to in the future, could be easily integrated with the existing HDF5 library code base. The logic here for 'Z' and 'B' macros as well as there use within the code to call ZFP library methods is due to this filter being part of the Silo library but also supported as a stand-alone package. In Silo, the ZFP library is embedded inside a C struct to avoid pollution of the global namespace as well as collision with any other implementation of ZFP a Silo executable may be linked with. Calls to ZFP lib methods are preface with 'Z ' and calls to bitstream methods with 'B ' as in Z zfp_stream_open(...); B stream_open(...); */ #ifdef Z #undef Z #endif #ifdef B #undef B #endif #ifdef AS_SILO_BUILTIN /* [ */ #include "hdf5.h" #define USE_C_STRUCTSPACE #include "zfp.h" #define Z zfp. #define B zfpbs. #else /* ] AS_SILO_BUILTIN [ */ #include "H5PLextern.h" #include "H5Spublic.h" #include "zfp.h" #define Z #define B #endif /* ] AS_SILO_BUILTIN */ #include "H5Zzfp_plugin.h" #include "H5Zzfp_props_private.h" /* Convenient CPP logic to capture ZFP lib version numbers as compile time hex number */ #define ZFP_VERSION_NO__(Maj,Min,Pat,Twk) (0x ## Maj ## Min ## Pat ## Twk) #define ZFP_VERSION_NO_(Maj,Min,Pat,Twk) ZFP_VERSION_NO__(Maj,Min,Pat,Twk) #if defined(ZFP_VERSION_TWEAK) #define ZFP_VERSION_NO ZFP_VERSION_NO_(ZFP_VERSION_MAJOR,ZFP_VERSION_MINOR,ZFP_VERSION_PATCH,ZFP_VERSION_TWEAK) #elif defined(ZFP_VERSION_RELEASE) #define ZFP_VERSION_NO ZFP_VERSION_NO_(ZFP_VERSION_MAJOR,ZFP_VERSION_MINOR,ZFP_VERSION_RELEASE,0) #elif defined(ZFP_VERSION_PATCH) #define ZFP_VERSION_NO ZFP_VERSION_NO_(ZFP_VERSION_MAJOR,ZFP_VERSION_MINOR,ZFP_VERSION_PATCH,0) #else #error ZFP LIBRARY VERSION NOT DETECTED #endif /* Older versions of ZFP don't define this */ #ifndef ZFP_VERSION_STRING #define ZFP_VERSION_STR__(Maj,Min,Rel) #Maj "." #Min "." #Rel #define ZFP_VERSION_STR_(Maj,Min,Rel) ZFP_VERSION_STR__(Maj,Min,Rel) #define ZFP_VERSION_STRING ZFP_VERSION_STR_(ZFP_VERSION_MAJOR,ZFP_VERSION_MINOR,ZFP_VERSION_RELEASE) #endif /* Older versions of ZFP don't define this publicly */ #ifndef ZFP_CODEC #define ZFP_CODEC ZFP_VERSION_MINOR #endif /* Convenient CPP logic to capture H5Z_ZFP Filter version numbers as string and hex number */ #define H5Z_FILTER_ZFP_VERSION_STR__(Maj,Min,Pat) #Maj "." #Min "." #Pat #define H5Z_FILTER_ZFP_VERSION_STR_(Maj,Min,Pat) H5Z_FILTER_ZFP_VERSION_STR__(Maj,Min,Pat) #define H5Z_FILTER_ZFP_VERSION_STR H5Z_FILTER_ZFP_VERSION_STR_(H5Z_FILTER_ZFP_VERSION_MAJOR,H5Z_FILTER_ZFP_VERSION_MINOR,H5Z_FILTER_ZFP_VERSION_PATCH) #define H5Z_FILTER_ZFP_VERSION_NO__(Maj,Min,Pat) (0x0 ## Maj ## Min ## Pat) #define H5Z_FILTER_ZFP_VERSION_NO_(Maj,Min,Pat) H5Z_FILTER_ZFP_VERSION_NO__(Maj,Min,Pat) #define H5Z_FILTER_ZFP_VERSION_NO H5Z_FILTER_ZFP_VERSION_NO_(H5Z_FILTER_ZFP_VERSION_MAJOR,H5Z_FILTER_ZFP_VERSION_MINOR,H5Z_FILTER_ZFP_VERSION_PATCH) #define H5Z_ZFP_PUSH_AND_GOTO(MAJ, MIN, RET, MSG) \ do \ { \ H5Epush(H5E_DEFAULT,__FILE__,_funcname_,__LINE__, \ H5E_ERR_CLS,MAJ,MIN,MSG); \ retval = RET; \ goto done; \ } while(0) static int h5z_zfp_was_registered = 0; static size_t H5Z_filter_zfp(unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[], size_t nbytes, size_t *buf_size, void **buf); static htri_t H5Z_zfp_can_apply(hid_t dcpl_id, hid_t type_id, hid_t space_id); static herr_t H5Z_zfp_set_local(hid_t dcpl_id, hid_t type_id, hid_t space_id); const H5Z_class2_t H5Z_ZFP[1] = {{ H5Z_CLASS_T_VERS, /* H5Z_class_t version */ H5Z_FILTER_ZFP, /* Filter id number */ 1, /* encoder_present flag */ 1, /* decoder_present flag */ "H5Z-ZFP" /* Filter name for debugging */ "-" H5Z_FILTER_ZFP_VERSION_STR " (ZFP-" ZFP_VERSION_STRING ")", H5Z_zfp_can_apply, /* The "can apply" callback */ H5Z_zfp_set_local, /* The "set local" callback */ H5Z_filter_zfp, /* The actual filter function */ }}; #ifdef H5Z_ZFP_AS_LIB int H5Z_zfp_initialize(void) { if (H5Zfilter_avail(H5Z_FILTER_ZFP)) return 1; if (H5Zregister(H5Z_ZFP)<0) return -1; h5z_zfp_was_registered = 1; return 1; } #else H5PL_type_t H5PLget_plugin_type(void) {return H5PL_TYPE_FILTER;} const void *H5PLget_plugin_info(void) {return H5Z_ZFP;} #endif #ifndef H5Z_ZFP_AS_LIB static #endif int H5Z_zfp_finalize(void) { herr_t ret2 = 0; if (h5z_zfp_was_registered) ret2 = H5Zunregister(H5Z_FILTER_ZFP); h5z_zfp_was_registered = 0; if (ret2 < 0) return -1; return 1; } static htri_t H5Z_zfp_can_apply(hid_t dcpl_id, hid_t type_id, hid_t chunk_space_id) { static char const *_funcname_ = "H5Z_zfp_can_apply"; int const max_ndims = (ZFP_VERSION_NO <= 0x0053) ? 3 : 4; int ndims, ndims_used = 0; size_t i, dsize; htri_t retval = 0; hsize_t dims[H5S_MAX_RANK]; H5T_class_t dclass; hid_t native_type_id; /* Disable the ZFP filter entirely if it looks like the ZFP library hasn't been compiled for 8-bit stream word size */ if ((int) B stream_word_bits != 8) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_CANTINIT, -1, "ZFP lib not compiled with -DBIT_STREAM_WORD_TYPE=uint8"); /* get datatype class, size and space dimensions */ if (H5T_NO_CLASS == (dclass = H5Tget_class(type_id))) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADTYPE, -1, "bad datatype class"); if (0 == (dsize = H5Tget_size(type_id))) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADTYPE, -1, "bad datatype size"); if (0 > (ndims = H5Sget_simple_extent_dims(chunk_space_id, dims, 0))) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADTYPE, -1, "bad chunk data space"); /* confirm ZFP library can handle this data */ #if ZFP_VERSION_NO < 0x0510 if (!(dclass == H5T_FLOAT)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADTYPE, 0, "requires datatype class of H5T_FLOAT"); #else if (!(dclass == H5T_FLOAT || dclass == H5T_INTEGER)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADTYPE, 0, "requires datatype class of H5T_FLOAT or H5T_INTEGER"); #endif if (!(dsize == 4 || dsize == 8)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADTYPE, 0, "requires datatype size of 4 or 8"); /* check for *USED* dimensions of the chunk */ for (i = 0; i < ndims; i++) { if (dims[i] <= 1) continue; ndims_used++; } if (ndims_used == 0 || ndims_used > max_ndims) #if ZFP_VERSION_NO < 0x0530 H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, 0, "chunk must have only 1...3 non-unity dimensions"); #else H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, 0, "chunk must have only 1...4 non-unity dimensions"); #endif /* if caller is doing "endian targetting", disallow that */ native_type_id = H5Tget_native_type(type_id, H5T_DIR_ASCEND); if (H5Tget_order(type_id) != H5Tget_order(native_type_id)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADTYPE, 0, "endian targetting non-sensical in conjunction with ZFP filter"); retval = 1; done: return retval; } static herr_t H5Z_zfp_set_local(hid_t dcpl_id, hid_t type_id, hid_t chunk_space_id) { static char const *_funcname_ = "H5Z_zfp_set_local"; int i, ndims, ndims_used = 0; size_t dsize, hdr_bits, hdr_bytes; size_t mem_cd_nelmts = H5Z_ZFP_CD_NELMTS_MEM; unsigned int mem_cd_values[H5Z_ZFP_CD_NELMTS_MEM]; size_t hdr_cd_nelmts = H5Z_ZFP_CD_NELMTS_MAX; unsigned int hdr_cd_values[H5Z_ZFP_CD_NELMTS_MAX]; unsigned int flags = 0; herr_t retval = 0; hsize_t dims[H5S_MAX_RANK], dims_used[H5S_MAX_RANK]; H5T_class_t dclass; zfp_type zt; zfp_field *dummy_field = 0; bitstream *dummy_bstr = 0; zfp_stream *dummy_zstr = 0; int have_zfp_controls = 0; h5z_zfp_controls_t ctrls; if (0 > (dclass = H5Tget_class(type_id))) H5Z_ZFP_PUSH_AND_GOTO(H5E_ARGS, H5E_BADTYPE, -1, "not a datatype"); if (0 == (dsize = H5Tget_size(type_id))) H5Z_ZFP_PUSH_AND_GOTO(H5E_ARGS, H5E_BADTYPE, -1, "not a datatype"); if (0 > (ndims = H5Sget_simple_extent_dims(chunk_space_id, dims, 0))) H5Z_ZFP_PUSH_AND_GOTO(H5E_ARGS, H5E_BADTYPE, -1, "not a data space"); /* setup zfp data type for meta header */ if (dclass == H5T_FLOAT) { if (dsize == sizeof(float)) zt = zfp_type_float; else if (dsize == sizeof(double)) zt = zfp_type_double; else H5Z_ZFP_PUSH_AND_GOTO(H5E_ARGS, H5E_BADTYPE, -1, "invalid datatype size"); } else if (dclass == H5T_INTEGER) { if (dsize == sizeof(int32)) zt = zfp_type_int32; else if (dsize == sizeof(int64)) zt = zfp_type_int64; else H5Z_ZFP_PUSH_AND_GOTO(H5E_ARGS, H5E_BADTYPE, -1, "invalid datatype size"); } else { H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADTYPE, 0, "datatype class must be H5T_FLOAT or H5T_INTEGER"); } /* computed used (e.g. non-unity) dimensions in chunk */ for (i = 0; i < ndims; i++) { if (dims[i] <= 1) continue; dims_used[ndims_used] = dims[i]; ndims_used++; } /* set up dummy zfp field to compute meta header */ switch (ndims_used) { case 1: dummy_field = Z zfp_field_1d(0, zt, dims_used[0]); break; case 2: dummy_field = Z zfp_field_2d(0, zt, dims_used[1], dims_used[0]); break; case 3: dummy_field = Z zfp_field_3d(0, zt, dims_used[2], dims_used[1], dims_used[0]); break; #if ZFP_VERSION_NO >= 0x0540 case 4: dummy_field = Z zfp_field_4d(0, zt, dims_used[3], dims_used[2], dims_used[1], dims_used[0]); break; #endif #if ZFP_VERSION_NO < 0x0530 default: H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, 0, "chunks may have only 1...3 non-unity dims"); #else default: H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, 0, "chunks may have only 1...4 non-unity dims"); #endif } if (!dummy_field) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "zfp_field_Xd() failed"); /* get current cd_values and re-map to new cd_value set */ if (0 > H5Pget_filter_by_id(dcpl_id, H5Z_FILTER_ZFP, &flags, &mem_cd_nelmts, mem_cd_values, 0, NULL, NULL)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_CANTGET, 0, "unable to get current ZFP cd_values"); /* Handle default case when no cd_values are passed by using ZFP library defaults. */ if (mem_cd_nelmts == 0) { /* check for filter controls in the properites */ if (0 < H5Pexist(dcpl_id, "zfp_controls")) { if (0 > H5Pget(dcpl_id, "zfp_controls", &ctrls)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_CANTGET, 0, "unable to get ZFP controls"); have_zfp_controls = 1; } else /* just use ZFP library defaults */ { mem_cd_nelmts = H5Z_ZFP_CD_NELMTS_MEM; H5Pset_zfp_expert_cdata(ZFP_MIN_BITS, ZFP_MAX_BITS, ZFP_MAX_PREC, ZFP_MIN_EXP, mem_cd_nelmts, mem_cd_values); } } /* Into hdr_cd_values, we encode ZFP library and H5Z-ZFP plugin version info at entry 0 and use remaining entries as a tiny buffer to write ZFP native header. */ hdr_cd_values[0] = (unsigned int) ((ZFP_VERSION_NO<<16) | (ZFP_CODEC<<12) | H5Z_FILTER_ZFP_VERSION_NO); if (0 == (dummy_bstr = B stream_open(&hdr_cd_values[1], sizeof(hdr_cd_values)))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "stream_open() failed"); if (0 == (dummy_zstr = Z zfp_stream_open(dummy_bstr))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "zfp_stream_open() failed"); /* Set the ZFP stream mode from zfp_control properties or mem_cd_values[0] */ if (have_zfp_controls) { switch (ctrls.mode) { case H5Z_ZFP_MODE_RATE: Z zfp_stream_set_rate(dummy_zstr, ctrls.details.rate, zt, ndims_used, 0); break; case H5Z_ZFP_MODE_PRECISION: #if ZFP_VERSION_NO < 0x0510 Z zfp_stream_set_precision(dummy_zstr, ctrls.details.prec, zt); #else Z zfp_stream_set_precision(dummy_zstr, ctrls.details.prec); #endif break; case H5Z_ZFP_MODE_ACCURACY: #if ZFP_VERSION_NO < 0x0510 Z zfp_stream_set_accuracy(dummy_zstr, ctrls.details.acc, zt); #else Z zfp_stream_set_accuracy(dummy_zstr, ctrls.details.acc); #endif break; case H5Z_ZFP_MODE_EXPERT: Z zfp_stream_set_params(dummy_zstr, ctrls.details.expert.minbits, ctrls.details.expert.maxbits, ctrls.details.expert.maxprec, ctrls.details.expert.minexp); break; #if ZFP_VERSION_NO >= 0x0550 case H5Z_ZFP_MODE_REVERSIBLE: Z zfp_stream_set_reversible(dummy_zstr); break; #endif default: H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, 0, "invalid ZFP mode"); } } else { switch (mem_cd_values[0]) { case H5Z_ZFP_MODE_RATE: Z zfp_stream_set_rate(dummy_zstr, *((double*) &mem_cd_values[2]), zt, ndims_used, 0); break; case H5Z_ZFP_MODE_PRECISION: #if ZFP_VERSION_NO < 0x0510 Z zfp_stream_set_precision(dummy_zstr, mem_cd_values[2], zt); #else Z zfp_stream_set_precision(dummy_zstr, mem_cd_values[2]); #endif break; case H5Z_ZFP_MODE_ACCURACY: #if ZFP_VERSION_NO < 0x0510 Z zfp_stream_set_accuracy(dummy_zstr, *((double*) &mem_cd_values[2]), zt); #else Z zfp_stream_set_accuracy(dummy_zstr, *((double*) &mem_cd_values[2])); #endif break; case H5Z_ZFP_MODE_EXPERT: Z zfp_stream_set_params(dummy_zstr, mem_cd_values[2], mem_cd_values[3], mem_cd_values[4], (int) mem_cd_values[5]); break; #if ZFP_VERSION_NO >= 0x0550 case H5Z_ZFP_MODE_REVERSIBLE: Z zfp_stream_set_reversible(dummy_zstr); break; #endif default: H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, 0, "invalid ZFP mode"); } } /* Use ZFP's write_header method to write the ZFP header into hdr_cd_values array */ if (0 == (hdr_bits = Z zfp_write_header(dummy_zstr, dummy_field, ZFP_HEADER_FULL))) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_CANTINIT, 0, "unable to write header"); /* Flush the ZFP stream */ Z zfp_stream_flush(dummy_zstr); /* compute necessary hdr_cd_values size */ hdr_bytes = 1 + ((hdr_bits - 1) / 8); hdr_cd_nelmts = 1 + ((hdr_bytes - 1) / sizeof(hdr_cd_values[0])); hdr_cd_nelmts++; /* for slot 0 holding version info */ if (hdr_cd_nelmts > H5Z_ZFP_CD_NELMTS_MAX) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, -1, "buffer overrun in hdr_cd_values"); /* Now, update cd_values for the filter */ if (0 > H5Pmodify_filter(dcpl_id, H5Z_FILTER_ZFP, flags, hdr_cd_nelmts, hdr_cd_values)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, 0, "failed to modify cd_values"); /* cleanup the dummy ZFP stuff we used to generate the header */ Z zfp_field_free(dummy_field); dummy_field = 0; Z zfp_stream_close(dummy_zstr); dummy_zstr = 0; B stream_close(dummy_bstr); dummy_bstr = 0; retval = 1; done: if (dummy_field) Z zfp_field_free(dummy_field); if (dummy_zstr) Z zfp_stream_close(dummy_zstr); if (dummy_bstr) B stream_close(dummy_bstr); return retval; } static int get_zfp_info_from_cd_values(size_t cd_nelmts, unsigned int const *cd_values, uint64 *zfp_mode, uint64 *zfp_meta, H5T_order_t *swap) { static char const *_funcname_ = "get_zfp_info_from_cd_values"; unsigned int cd_values_copy[H5Z_ZFP_CD_NELMTS_MAX]; int retval = 0; bitstream *bstr = 0; zfp_stream *zstr = 0; zfp_field *zfld = 0; if (cd_nelmts > H5Z_ZFP_CD_NELMTS_MAX) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_OVERFLOW, 0, "cd_nelmts exceeds max"); /* make a copy of cd_values in case we need to byte-swap it */ memcpy(cd_values_copy, cd_values, cd_nelmts * sizeof(cd_values[0])); /* treat the cd_values as a zfp bitstream buffer */ if (0 == (bstr = B stream_open(&cd_values_copy[0], sizeof(cd_values_copy[0]) * cd_nelmts))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "opening header bitstream failed"); if (0 == (zstr = Z zfp_stream_open(bstr))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "opening header zfp stream failed"); /* Allocate the field object */ if (0 == (zfld = Z zfp_field_alloc())) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "allocating field failed"); /* Do a read of *just* magic to detect possible codec version mismatch */ if (0 == (Z zfp_read_header(zstr, zfld, ZFP_HEADER_MAGIC))) { herr_t conv; /* The read may have failed due to difference in endian-ness between writer and reader. So, byte-swap cd_values array, rewind the stream and re-try. */ if (H5T_ORDER_LE == (*swap = (H5Tget_order(H5T_NATIVE_UINT)))) conv = H5Tconvert(H5T_STD_U32BE, H5T_NATIVE_UINT, cd_nelmts, cd_values_copy, 0, H5P_DEFAULT); else conv = H5Tconvert(H5T_STD_U32LE, H5T_NATIVE_UINT, cd_nelmts, cd_values_copy, 0, H5P_DEFAULT); if (conv < 0) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, 0, "header endian-swap failed"); Z zfp_stream_rewind(zstr); if (0 == (Z zfp_read_header(zstr, zfld, ZFP_HEADER_MAGIC))) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_CANTGET, 0, "ZFP codec version mismatch"); } Z zfp_stream_rewind(zstr); /* Now, read ZFP *full* header */ if (0 == (Z zfp_read_header(zstr, zfld, ZFP_HEADER_FULL))) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_CANTGET, 0, "reading header failed"); /* Get ZFP stream mode and field meta */ *zfp_mode = Z zfp_stream_mode(zstr); *zfp_meta = Z zfp_field_metadata(zfld); /* cleanup */ Z zfp_field_free(zfld); zfld = 0; Z zfp_stream_close(zstr); zstr = 0; B stream_close(bstr); bstr = 0; retval = 1; done: if (zfld) Z zfp_field_free(zfld); if (zstr) Z zfp_stream_close(zstr); if (bstr) B stream_close(bstr); return retval; } /* Compare ZFP codec version used when data was written to what is currently being used to read the data. There is a challenge here in that earlier versions of this filter recorded only the ZFP library version, not the codec version. Although ZFP codec version was encoded as minor digit of ZFP library version, that convention ended with ZFP version 1.0.0. So, if an old version of this filter is used with newer ZFP libraries, we won't know the codec version used to write the data with certainty. The best we can do is guess it. If there becomes a version of the ZFP library for which that guess (currently 5) is wrong, the logic here will need to be updated to capture knowledge of the ZFP library version for which the codec version was incrimented. */ static int zfp_codec_version_mismatch( unsigned int h5zfpver_from_cd_val_data_in_file, unsigned int zfpver_from_cd_val_data_in_file, unsigned int zfpcodec_from_cd_val_data_in_file) { int writer_codec; int reader_codec; if (h5zfpver_from_cd_val_data_in_file < 0x0110) { /* for data written with older versions of the filter, we infer codec from ZFP library version stored in the file. */ zfpver_from_cd_val_data_in_file <<= 4; if (zfpver_from_cd_val_data_in_file < 0x0500) writer_codec = 4; else if (zfpver_from_cd_val_data_in_file < 0x1000) writer_codec = (zfpver_from_cd_val_data_in_file & 0x0F00)>>8; else if (zfpver_from_cd_val_data_in_file == 0x1000) writer_codec = 5; else writer_codec = 5; /* can only guess */ } else writer_codec = zfpcodec_from_cd_val_data_in_file; #if ZFP_VERSION_NO < 0x0500 reader_codec = 4; #elif ZFP_VERSION_NO < 0x1000 reader_codec = 5; #else reader_codec = ZFP_CODEC; #endif return writer_codec > reader_codec; } static size_t H5Z_filter_zfp(unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[], size_t nbytes, size_t *buf_size, void **buf) { static char const *_funcname_ = "H5Z_filter_zfp"; void *newbuf = 0; size_t retval = 0; unsigned int cd_vals_h5zzfpver = cd_values[0]&0x00000FFF; unsigned int cd_vals_zfpcodec = (cd_values[0]>>12)&0x0000000F; unsigned int cd_vals_zfpver = (cd_values[0]>>16)&0x0000FFFF; H5T_order_t swap = H5T_ORDER_NONE; uint64 zfp_mode, zfp_meta; bitstream *bstr = 0; zfp_stream *zstr = 0; zfp_field *zfld = 0; /* Pass &cd_values[1] here to strip off first entry holding version info */ if (0 == get_zfp_info_from_cd_values(cd_nelmts-1, &cd_values[1], &zfp_mode, &zfp_meta, &swap)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_CANTGET, 0, "can't get ZFP mode/meta"); if (flags & H5Z_FLAG_REVERSE) /* decompression */ { int status; size_t bsize, dsize; /* Worry about zfp version mismatch only for decompression */ if (zfp_codec_version_mismatch(cd_vals_h5zzfpver, cd_vals_zfpver, cd_vals_zfpcodec)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_READERROR, 0, "ZFP codec version mismatch"); /* Set up the ZFP field object */ if (0 == (zfld = Z zfp_field_alloc())) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "field alloc failed"); Z zfp_field_set_metadata(zfld, zfp_meta); bsize = Z zfp_field_size(zfld, 0); switch (Z zfp_field_type(zfld)) { case zfp_type_int32: dsize = sizeof(int32); break; case zfp_type_int64: dsize = sizeof(int64); break; case zfp_type_float: dsize = sizeof(float); break; case zfp_type_double: dsize = sizeof(double); break; default: H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADTYPE, 0, "invalid datatype"); } bsize *= dsize; if (NULL == (newbuf = malloc(bsize))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for ZFP decompression"); Z zfp_field_set_pointer(zfld, newbuf); /* Setup the ZFP stream object */ if (0 == (bstr = B stream_open(*buf, *buf_size))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "bitstream open failed"); if (0 == (zstr = Z zfp_stream_open(bstr))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "zfp stream open failed"); Z zfp_stream_set_mode(zstr, zfp_mode); /* Do the ZFP decompression operation */ status = Z zfp_decompress(zstr, zfld); /* clean up */ Z zfp_field_free(zfld); zfld = 0; Z zfp_stream_close(zstr); zstr = 0; B stream_close(bstr); bstr = 0; if (!status) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_CANTFILTER, 0, "decompression failed"); /* ZFP is an endian-independent format. It will produce correct endian-ness during decompress regardless of endian-ness differences between reader and writer. However, the HDF5 library will not be expecting that. So, we need to undue the correct endian-ness here. We use HDF5's built-in byte-swapping here. Because we know we need only to endian-swap, we treat the data as unsigned. */ if (swap != H5T_ORDER_NONE) { hid_t src = dsize == 4 ? H5T_STD_U32BE : H5T_STD_U64BE; hid_t dst = dsize == 4 ? H5T_NATIVE_UINT32 : H5T_NATIVE_UINT64; if (swap == H5T_ORDER_BE) src = dsize == 4 ? H5T_STD_U32LE : H5T_STD_U64LE; if (H5Tconvert(src, dst, bsize/dsize, newbuf, 0, H5P_DEFAULT) < 0) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, 0, "endian-UN-swap failed"); } free(*buf); *buf = newbuf; newbuf = 0; *buf_size = bsize; retval = bsize; } else /* compression */ { size_t msize, zsize; /* Set up the ZFP field object */ if (0 == (zfld = Z zfp_field_alloc())) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "field alloc failed"); Z zfp_field_set_pointer(zfld, *buf); Z zfp_field_set_metadata(zfld, zfp_meta); /* Set up the ZFP stream object for real compression now */ if (0 == (zstr = Z zfp_stream_open(0))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "zfp stream open failed"); Z zfp_stream_set_mode(zstr, zfp_mode); msize = Z zfp_stream_maximum_size(zstr, zfld); /* Set up the bitstream object */ if (NULL == (newbuf = malloc(msize))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "memory allocation failed for ZFP compression"); if (0 == (bstr = B stream_open(newbuf, msize))) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, 0, "bitstream open failed"); Z zfp_stream_set_bit_stream(zstr, bstr); /* Do the compression */ zsize = Z zfp_compress(zstr, zfld); /* clean up */ Z zfp_field_free(zfld); zfld = 0; Z zfp_stream_close(zstr); zstr = 0; B stream_close(bstr); bstr = 0; if (zsize == 0) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_CANTFILTER, 0, "compression failed"); if (zsize > msize) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_OVERFLOW, 0, "uncompressed buffer overrun"); free(*buf); *buf = newbuf; newbuf = 0; *buf_size = zsize; retval = zsize; } done: if (zfld) Z zfp_field_free(zfld); if (zstr) Z zfp_stream_close(zstr); if (bstr) B stream_close(bstr); if (newbuf) free(newbuf); return retval ; } #undef Z #undef B LLNL-H5Z-ZFP-092190c/src/H5Zzfp.h000066400000000000000000000001721447422177700156720ustar00rootroot00000000000000#ifndef H5Z_ZFP_H #define H5Z_ZFP_H #include "H5Zzfp_lib.h" #include "H5Zzfp_plugin.h" #include "H5Zzfp_props.h" #endif LLNL-H5Z-ZFP-092190c/src/H5Zzfp_lib.h000066400000000000000000000003361447422177700165220ustar00rootroot00000000000000#ifndef H5Z_ZFP_LIB_H #define H5Z_ZFP_LIB_H #include "H5Zzfp_plugin.h" #ifdef __cplusplus extern "C" { #endif extern int H5Z_zfp_initialize(void); extern int H5Z_zfp_finalize(void); #ifdef __cplusplus } #endif #endif LLNL-H5Z-ZFP-092190c/src/H5Zzfp_plugin.h000066400000000000000000000054321447422177700172540ustar00rootroot00000000000000#ifndef H5Z_ZFP_PLUGIN_H #define H5Z_ZFP_PLUGIN_H #include "H5Zzfp_version.h" /* HDF5 generic cd_vals[] memory layout (6 unsigned ints) for controlling H5Z-ZFP behavior as a plugin. NOTE: These cd_vals used to pass properties in-memory from caller to filter via HDF5 generic interface are NOT THE SAME AS the cd_vals[] that ultimately get stored to the file for the filter "header" data. cd_vals 0 1 2 3 4 5 ---------------------------------------------------------------- rate: 1 unused rateA rateB unused unused precision: 2 unused prec unused unused unused accuracy: 3 unused accA accB unused unused expert: 4 unused minbits maxbits maxprec minexp A/B are high/low words of a double. */ #define H5Pset_zfp_rate_cdata(R, N, CD) \ do { if (N>=4) {double *p = (double *) &CD[2]; \ CD[0]=CD[1]=CD[2]=CD[3]=0; \ CD[0]=H5Z_ZFP_MODE_RATE; *p=R; N=4;}} while(0) #define H5Pget_zfp_rate_cdata(N, CD) \ ((double)(((N>=4)&&(CD[0]==H5Z_ZFP_MODE_RATE))?*((double *) &CD[2]):0)) #define H5Pset_zfp_precision_cdata(P, N, CD) \ do { if (N>=3) {CD[0]=H5Z_ZFP_MODE_PRECISION; \ CD[1]=0; CD[2]=P; N=3;}} while(0) #define H5Pget_zfp_precision_cdata(N, CD) \ ((double)(((N>=3)&&(CD[0]==H5Z_ZFP_MODE_PRECISION))?CD[2]:0)) #define H5Pset_zfp_accuracy_cdata(A, N, CD) \ do { if (N>=4) {double *p = (double *) &CD[2]; \ CD[0]=CD[1]=CD[2]=CD[3]=0; \ CD[0]=H5Z_ZFP_MODE_ACCURACY; *p=A; N=4;}} while(0) #define H5Pget_zfp_accuracy_cdata(N, CD) \ ((double)(((N>=4)&&(CD[0]==H5Z_ZFP_MODE_ACCURACY))?*((double *) &CD[2]):0)) #define H5Pset_zfp_expert_cdata(MiB, MaB, MaP, MiE, N, CD) \ do { if (N>=6) { CD[0]=CD[1]=CD[2]=CD[3]=CD[4]=CD[5]=0; \ CD[0]=H5Z_ZFP_MODE_EXPERT; \ CD[2]=MiB; CD[3]=MaB; CD[4]=MaP; \ CD[5]=(unsigned int)MiE; N=6;}} while(0) #define H5Pget_zfp_expert_cdata(N, CD, MiB, MaB, MaP, MiE) \ do { \ if ((N>=6)&&(CD[0] == H5Z_ZFP_MODE_EXPERT)) \ { \ unsigned int *p; int *q; \ p = &MiB; *p = CD[2]; \ p = &MaB; *p = CD[3]; \ p = &MaP; *p = CD[4]; \ q = &MiE; *q = (int) CD[5]; \ } \ } while(0) #define H5Pset_zfp_reversible_cdata(N, CD) \ do { if (N>=1) { \ CD[0]=H5Z_ZFP_MODE_REVERSIBLE; N=1;}} while(0) #define H5Pget_zfp_reversible_cdata(N, CD) \ ((int)(((N>=1)&&(CD[0]==H5Z_ZFP_MODE_REVERSIBLE))?1:0)) #endif LLNL-H5Z-ZFP-092190c/src/H5Zzfp_props.c000066400000000000000000000124621447422177700171150ustar00rootroot00000000000000#include "H5Zzfp_plugin.h" #include "H5Zzfp_props_private.h" #include "hdf5.h" #include #include #include #define H5Z_ZFP_PUSH_AND_GOTO(MAJ, MIN, RET, MSG) \ do \ { \ H5Epush(H5E_DEFAULT,__FILE__,_funcname_,__LINE__, \ H5E_ERR_CLS_g,MAJ,MIN,MSG); \ retval = RET; \ goto done; \ } while(0) static herr_t H5Pset_zfp(hid_t plist, int mode, ...) { static char const *_funcname_ = "H5Pset_zfp"; static size_t const ctrls_sz = sizeof(h5z_zfp_controls_t); unsigned int flags; size_t cd_nelmts = 0; unsigned int cd_values[1]; h5z_zfp_controls_t *ctrls_p = 0; int i; va_list ap; herr_t retval = 0; if (0 >= H5Pisa_class(plist, H5P_DATASET_CREATE)) H5Z_ZFP_PUSH_AND_GOTO(H5E_ARGS, H5E_BADTYPE, -1, "not a dataset creation property list class"); ctrls_p = (h5z_zfp_controls_t *) malloc(ctrls_sz); if (0 == ctrls_p) H5Z_ZFP_PUSH_AND_GOTO(H5E_RESOURCE, H5E_NOSPACE, -1, "allocation failed for ZFP controls"); va_start(ap, mode); ctrls_p->mode = mode; switch (mode) { case H5Z_ZFP_MODE_RATE: { ctrls_p->details.rate = va_arg(ap, double); if (0 > ctrls_p->details.rate) H5Z_ZFP_PUSH_AND_GOTO(H5E_ARGS, H5E_BADVALUE, -1, "rate out of range."); break; } case H5Z_ZFP_MODE_ACCURACY: { ctrls_p->details.acc = va_arg(ap, double); if (0 > ctrls_p->details.acc) H5Z_ZFP_PUSH_AND_GOTO(H5E_ARGS, H5E_BADVALUE, -1, "accuracy out of range."); break; } case H5Z_ZFP_MODE_PRECISION: { ctrls_p->details.prec = va_arg(ap, unsigned int); break; } case H5Z_ZFP_MODE_EXPERT: { ctrls_p->details.expert.minbits = va_arg(ap, unsigned int); ctrls_p->details.expert.maxbits = va_arg(ap, unsigned int); ctrls_p->details.expert.maxprec = va_arg(ap, unsigned int); ctrls_p->details.expert.minexp = va_arg(ap, int); break; } case H5Z_ZFP_MODE_REVERSIBLE: { break; } default: { H5Z_ZFP_PUSH_AND_GOTO(H5E_ARGS, H5E_BADVALUE, -1, "bad ZFP mode."); break; } } va_end(ap); for (i = 0; i < H5Pget_nfilters(plist); i++) { H5Z_filter_t fid; if (0 <= (fid = H5Pget_filter(plist, i, &flags, &cd_nelmts, cd_values, 0, 0, 0)) && fid == H5Z_FILTER_ZFP) { if (0 > H5Premove_filter(plist, H5Z_FILTER_ZFP)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, -1, "Unable to remove old ZFP filter from pipeline."); break; } } if (0 > H5Pset_filter(plist, H5Z_FILTER_ZFP, H5Z_FLAG_MANDATORY, 0, 0)) H5Z_ZFP_PUSH_AND_GOTO(H5E_PLINE, H5E_BADVALUE, -1, "Unable to put ZFP filter in pipeline."); if (0 == H5Pexist(plist, "zfp_controls")) { retval = H5Pinsert2(plist, "zfp_controls", ctrls_sz, ctrls_p, 0, 0, 0, 0, 0, 0); } else { retval = H5Pset(plist, "zfp_controls", ctrls_p); } /* HDF5 copies the memory we gave it */ free(ctrls_p); return retval; done: if (ctrls_p) free(ctrls_p); return retval; } herr_t H5Pset_zfp_rate(hid_t plist, double rate) { return H5Pset_zfp(plist, H5Z_ZFP_MODE_RATE, rate); } herr_t H5Pset_zfp_precision(hid_t plist, unsigned int prec) { return H5Pset_zfp(plist, H5Z_ZFP_MODE_PRECISION, prec); } herr_t H5Pset_zfp_accuracy(hid_t plist, double acc) { return H5Pset_zfp(plist, H5Z_ZFP_MODE_ACCURACY, acc); } herr_t H5Pset_zfp_expert(hid_t plist, unsigned int minbits, unsigned int maxbits, unsigned int maxprec, int minexp) { return H5Pset_zfp(plist, H5Z_ZFP_MODE_EXPERT, minbits, maxbits, maxprec, minexp); } herr_t H5Pset_zfp_reversible(hid_t plist) { return H5Pset_zfp(plist, H5Z_ZFP_MODE_REVERSIBLE); } /* Used only for Fortran wrappers */ void H5Pset_zfp_rate_cdata_f(double rate, size_t *cd_nelmts_f, unsigned int *cd_values) { size_t cd_nelmts = *cd_nelmts_f; H5Pset_zfp_rate_cdata(rate, cd_nelmts, cd_values); *cd_nelmts_f = cd_nelmts; } void H5Pset_zfp_precision_cdata_f(unsigned int prec, size_t *cd_nelmts_f, unsigned int *cd_values) { size_t cd_nelmts = *cd_nelmts_f; H5Pset_zfp_precision_cdata(prec, cd_nelmts, cd_values); *cd_nelmts_f = cd_nelmts; } void H5Pset_zfp_accuracy_cdata_f(double acc, size_t *cd_nelmts_f, unsigned int *cd_values) { size_t cd_nelmts = *cd_nelmts_f; H5Pset_zfp_accuracy_cdata(acc, cd_nelmts, cd_values); *cd_nelmts_f = cd_nelmts; } void H5Pset_zfp_expert_cdata_f(unsigned int minbits, unsigned int maxbits, unsigned int maxprec, int minexp, size_t *cd_nelmts_f, unsigned int *cd_values) { size_t cd_nelmts = *cd_nelmts_f; H5Pset_zfp_expert_cdata(minbits, maxbits, maxprec, minexp, cd_nelmts, cd_values); *cd_nelmts_f = cd_nelmts; } void H5Pset_zfp_reversible_cdata_f(size_t *cd_nelmts_f, unsigned int *cd_values) { size_t cd_nelmts = *cd_nelmts_f; H5Pset_zfp_reversible_cdata(cd_nelmts, cd_values); *cd_nelmts_f = cd_nelmts; } LLNL-H5Z-ZFP-092190c/src/H5Zzfp_props.h000066400000000000000000000020651447422177700171200ustar00rootroot00000000000000#ifndef H5Z_ZFP_PROPS_H #define H5Z_ZFP_PROPS_H #ifdef __cplusplus extern "C" { #endif extern herr_t H5Pset_zfp_rate(hid_t plist, double rate); extern herr_t H5Pset_zfp_precision(hid_t plist, unsigned int prec); extern herr_t H5Pset_zfp_accuracy(hid_t plist, double acc); extern herr_t H5Pset_zfp_expert(hid_t plist, unsigned int minbits, unsigned int maxbits, unsigned int maxprec, int minexp); extern herr_t H5Pset_zfp_reversible(hid_t plist); extern void H5Pset_zfp_rate_cdata_f(double rate, size_t *cd_nelmts, unsigned int *cd_values); extern void H5Pset_zfp_precision_cdata_f(unsigned int prec, size_t *cd_nelmts, unsigned int *cd_values); extern void H5Pset_zfp_accuracy_cdata_f(double acc, size_t *cd_nelmts, unsigned int *cd_values); extern void H5Pset_zfp_expert_cdata_f(unsigned int minbits, unsigned int maxbits, unsigned int maxprec, int minexp, size_t *cd_nelmts, unsigned int *cd_values); extern void H5Pset_zfp_reversible_cdata_f(size_t *cd_nelmts, unsigned int *cd_values); #ifdef __cplusplus } #endif #endif LLNL-H5Z-ZFP-092190c/src/H5Zzfp_props_f.F90000066400000000000000000000135451447422177700175410ustar00rootroot00000000000000MODULE h5zzfp_props_f #include "H5Zzfp_version.h" USE ISO_C_BINDING USE HDF5 IMPLICIT NONE ! First, create _F equivalent parameters for all the C interface's CPP symbols and ! capture the original C interface's CPP values. INTEGER, PARAMETER :: H5Z_FILTER_ZFP_F=H5Z_FILTER_ZFP INTEGER, PARAMETER :: H5Z_FILTER_ZFP_VERSION_MAJOR_F=H5Z_FILTER_ZFP_VERSION_MAJOR INTEGER, PARAMETER :: H5Z_FILTER_ZFP_VERSION_MINOR_F=H5Z_FILTER_ZFP_VERSION_MINOR INTEGER, PARAMETER :: H5Z_FILTER_ZFP_VERSION_PATCH_F=H5Z_FILTER_ZFP_VERSION_PATCH INTEGER(C_SIZE_T), PARAMETER :: H5Z_ZFP_CD_NELMTS_MEM_F=H5Z_ZFP_CD_NELMTS_MEM INTEGER(C_SIZE_T), PARAMETER :: H5Z_ZFP_CD_NELMTS_MAX_F=H5Z_ZFP_CD_NELMTS_MAX INTEGER, PARAMETER :: H5Z_ZFP_MODE_RATE_F = H5Z_ZFP_MODE_RATE INTEGER, PARAMETER :: H5Z_ZFP_MODE_PRECISION_F = H5Z_ZFP_MODE_PRECISION INTEGER, PARAMETER :: H5Z_ZFP_MODE_ACCURACY_F = H5Z_ZFP_MODE_ACCURACY INTEGER, PARAMETER :: H5Z_ZFP_MODE_EXPERT_F = H5Z_ZFP_MODE_EXPERT INTEGER, PARAMETER :: H5Z_ZFP_MODE_REVERSIBLE_F = H5Z_ZFP_MODE_REVERSIBLE ! Next, undef all the C interface's CPP symbols so we can declare Fortran parameters ! with the identical names #undef H5Z_FILTER_ZFP #undef H5Z_FILTER_ZFP_VERSION_MAJOR #undef H5Z_FILTER_ZFP_VERSION_MINOR #undef H5Z_FILTER_ZFP_VERSION_PATCH #undef H5Z_ZFP_CD_NELMTS_MEM #undef H5Z_ZFP_CD_NELMTS_MAX #undef H5Z_ZFP_MODE_RATE #undef H5Z_ZFP_MODE_PRECISION #undef H5Z_ZFP_MODE_ACCURACY #undef H5Z_ZFP_MODE_EXPERT #undef H5Z_ZFP_MODE_REVERSIBLE ! Define Fortran parameters using the original _F values captured above. INTEGER, PARAMETER :: H5Z_FILTER_ZFP=H5Z_FILTER_ZFP_F INTEGER, PARAMETER :: H5Z_FILTER_ZFP_VERSION_MAJOR=H5Z_FILTER_ZFP_VERSION_MAJOR_F INTEGER, PARAMETER :: H5Z_FILTER_ZFP_VERSION_MINOR=H5Z_FILTER_ZFP_VERSION_MINOR_F INTEGER, PARAMETER :: H5Z_FILTER_ZFP_VERSION_PATCH=H5Z_FILTER_ZFP_VERSION_PATCH_F INTEGER(C_SIZE_T), PARAMETER :: H5Z_ZFP_CD_NELMTS_MEM=H5Z_ZFP_CD_NELMTS_MEM_F INTEGER(C_SIZE_T), PARAMETER :: H5Z_ZFP_CD_NELMTS_MAX=H5Z_ZFP_CD_NELMTS_MAX_F INTEGER, PARAMETER :: H5Z_ZFP_MODE_RATE = H5Z_ZFP_MODE_RATE_F INTEGER, PARAMETER :: H5Z_ZFP_MODE_PRECISION = H5Z_ZFP_MODE_PRECISION_F INTEGER, PARAMETER :: H5Z_ZFP_MODE_ACCURACY = H5Z_ZFP_MODE_ACCURACY_F INTEGER, PARAMETER :: H5Z_ZFP_MODE_EXPERT = H5Z_ZFP_MODE_EXPERT_F INTEGER, PARAMETER :: H5Z_ZFP_MODE_REVERSIBLE = H5Z_ZFP_MODE_REVERSIBLE_F INTERFACE INTEGER(C_INT) FUNCTION H5Z_zfp_initialize() BIND(C, NAME='H5Z_zfp_initialize') IMPORT :: C_INT IMPLICIT NONE END FUNCTION H5Z_zfp_initialize INTEGER(C_INT) FUNCTION H5Z_zfp_finalize() BIND(C, NAME='H5Z_zfp_finalize') IMPORT :: C_INT IMPLICIT NONE END FUNCTION H5Z_zfp_finalize INTEGER(C_INT) FUNCTION H5Pset_zfp_rate(plist, rate) BIND(C, NAME='H5Pset_zfp_rate') IMPORT :: C_INT, C_DOUBLE, HID_T IMPLICIT NONE INTEGER(HID_T), VALUE :: plist REAL(C_DOUBLE), VALUE :: rate END FUNCTION H5Pset_zfp_rate INTEGER(C_INT) FUNCTION H5Pset_zfp_precision(plist, prec) BIND(C, NAME='H5Pset_zfp_precision') IMPORT :: C_INT, HID_T IMPLICIT NONE INTEGER(HID_T), VALUE :: plist INTEGER(C_INT), VALUE :: prec END FUNCTION H5Pset_zfp_precision INTEGER(C_INT) FUNCTION H5Pset_zfp_accuracy(plist, acc) BIND(C, NAME='H5Pset_zfp_accuracy') IMPORT :: C_INT, C_DOUBLE, HID_T IMPLICIT NONE INTEGER(HID_T), VALUE :: plist REAL(C_DOUBLE), VALUE :: acc END FUNCTION H5Pset_zfp_accuracy INTEGER(C_INT) FUNCTION H5Pset_zfp_expert(plist, minbits, maxbits, maxprec, minexp) & BIND(C, NAME='H5Pset_zfp_expert') IMPORT :: C_INT, HID_T IMPLICIT NONE INTEGER(HID_T), VALUE :: plist INTEGER(C_INT), VALUE :: minbits INTEGER(C_INT), VALUE :: maxbits INTEGER(C_INT), VALUE :: maxprec INTEGER(C_INT), VALUE :: minexp END FUNCTION H5Pset_zfp_expert INTEGER(C_INT) FUNCTION H5Pset_zfp_reversible(plist) BIND(C, NAME='H5Pset_zfp_reversible') IMPORT :: C_INT, HID_T IMPLICIT NONE INTEGER(HID_T), VALUE :: plist END FUNCTION H5Pset_zfp_reversible SUBROUTINE H5Pset_zfp_rate_cdata(rate, cd_nelmts, cd_values) BIND(C, NAME='H5Pset_zfp_rate_cdata_f') IMPORT :: C_DOUBLE, C_INT, C_SIZE_T IMPLICIT NONE REAL(C_DOUBLE), VALUE :: rate INTEGER(C_SIZE_T) :: cd_nelmts INTEGER(C_INT), DIMENSION(*) :: cd_values END SUBROUTINE H5Pset_zfp_rate_cdata SUBROUTINE H5Pset_zfp_accuracy_cdata(acc, cd_nelmts, cd_values) BIND(C, NAME='H5Pset_zfp_accuracy_cdata_f') IMPORT :: C_DOUBLE, C_INT, C_SIZE_T IMPLICIT NONE REAL(C_DOUBLE), VALUE :: acc INTEGER(C_SIZE_T) :: cd_nelmts INTEGER(C_INT), DIMENSION(*) :: cd_values END SUBROUTINE H5Pset_zfp_accuracy_cdata SUBROUTINE H5Pset_zfp_precision_cdata(prec, cd_nelmts, cd_values) BIND(C, NAME='H5Pset_zfp_precision_cdata_f') IMPORT :: C_INT, C_SIZE_T IMPLICIT NONE INTEGER(C_INT), VALUE :: prec INTEGER(C_SIZE_T) :: cd_nelmts INTEGER(C_INT), DIMENSION(*) :: cd_values END SUBROUTINE H5Pset_zfp_precision_cdata SUBROUTINE H5Pset_zfp_expert_cdata(minbits, maxbits, maxprec, minexp, cd_nelmts, cd_values) & BIND(C, NAME='H5Pset_zfp_expert_cdata_f') IMPORT :: C_INT, C_SIZE_T IMPLICIT NONE INTEGER(C_INT), VALUE :: minbits, maxbits, maxprec, minexp INTEGER(C_SIZE_T) :: cd_nelmts INTEGER(C_INT), DIMENSION(*) :: cd_values END SUBROUTINE H5Pset_zfp_expert_cdata SUBROUTINE H5Pset_zfp_reversible_cdata(cd_nelmts, cd_values) BIND(C, NAME='H5Pset_zfp_reversible_cdata_f') IMPORT :: C_INT, C_SIZE_T IMPLICIT NONE INTEGER(C_SIZE_T) :: cd_nelmts INTEGER(C_INT), DIMENSION(*) :: cd_values END SUBROUTINE H5Pset_zfp_reversible_cdata END INTERFACE END MODULE H5Zzfp_props_f LLNL-H5Z-ZFP-092190c/src/H5Zzfp_props_private.h000066400000000000000000000006431447422177700206520ustar00rootroot00000000000000#ifndef H5Z_ZFP_PROPS_PRIVATE_H #define H5Z_ZFP_PROPS_PRIVATE_H typedef struct _h5z_zfp_controls_t { unsigned int mode; union { double rate; double acc; unsigned int prec; struct expert_ { unsigned int minbits; unsigned int maxbits; unsigned int maxprec; int minexp; } expert; } details; } h5z_zfp_controls_t; #endif LLNL-H5Z-ZFP-092190c/src/H5Zzfp_version.h000066400000000000000000000006701447422177700174420ustar00rootroot00000000000000#ifndef H5Z_ZFP_VERSION_H #define H5Z_ZFP_VERSION_H #define H5Z_FILTER_ZFP 32013 #define H5Z_FILTER_ZFP_VERSION_MAJOR 1 #define H5Z_FILTER_ZFP_VERSION_MINOR 1 #define H5Z_FILTER_ZFP_VERSION_PATCH 1 #define H5Z_ZFP_MODE_RATE 1 #define H5Z_ZFP_MODE_PRECISION 2 #define H5Z_ZFP_MODE_ACCURACY 3 #define H5Z_ZFP_MODE_EXPERT 4 #define H5Z_ZFP_MODE_REVERSIBLE 5 #define H5Z_ZFP_CD_NELMTS_MEM 6 #define H5Z_ZFP_CD_NELMTS_MAX 6 #endif LLNL-H5Z-ZFP-092190c/src/Makefile000066400000000000000000000042021447422177700160310ustar00rootroot00000000000000ifneq ($(strip $(MAKECMDGOALS)),clean) include ../config.make endif .PHONY: all lib clean # The filter compiled to be used as a plugin H5Zzfp_plugin.o: H5Zzfp.c $(CC) -c $< -o $@ $(CFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) # The filter compiled to be used as a library H5Zzfp_lib.o: H5Zzfp.c $(CC) -c $< -o $@ -DH5Z_ZFP_AS_LIB $(CFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) # The plugin shared lib (HDF5 expects it to be named "lib*.{so,dylib}" plugin/libh5zzfp.$(SOEXT): H5Zzfp_plugin.o rm -rf plugin mkdir plugin $(CC) $< $(SHFLAG) -o plugin/libh5zzfp.$(SOEXT) \ $(PREPATH)$(HDF5_LIB) $(PREPATH)$(ZFP_LIB) \ -L$(ZFP_LIB) -L$(HDF5_LIB) -lhdf5 -lzfp $(LDFLAGS) # Alias target for filter plugin plugin: plugin/libh5zzfp.$(SOEXT) # C language properties interface H5Zzfp_props.o: H5Zzfp_props.c $(CC) -c $< -o $@ $(CFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) # Fortran language properties interface H5Zzfp_props_f.o H5Zzfp_props_f.mod: H5Zzfp_props_f.F90 $(FC) -c $< -o $@ $(FCFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) # The filter member of the filter library libh5zzfp.a(H5Zzfp_lib.o): H5Zzfp_lib.o $(AR) cr libh5zzfp.a $< # The C properties interface member of the filter library libh5zzfp.a(H5Zzfp_props.o): H5Zzfp_props.o $(AR) cr libh5zzfp.a $< # The Fortran properties interface member of the filter library libh5zzfp.a(H5Zzfp_props_f.o): H5Zzfp_props_f.o $(AR) cr libh5zzfp.a $< # Alias target for filter library, conditionally includes Fortran LIBOBJ = libh5zzfp.a(H5Zzfp_lib.o) libh5zzfp.a(H5Zzfp_props.o) ifneq ($(FC),) LIBOBJ += libh5zzfp.a(H5Zzfp_props_f.o) endif lib: $(LIBOBJ) all: lib plugin install: all $(INSTALL) -d $(DESTDIR)$(PREFIX)/{plugin,include,lib} $(INSTALL) plugin/libh5zzfp.$(SOEXT) $(DESTDIR)$(PREFIX)/plugin $(INSTALL) libh5zzfp.a $(DESTDIR)$(PREFIX)/lib $(INSTALL) -m 644 H5Zzfp.h H5Zzfp_lib.h H5Zzfp_plugin.h H5Zzfp_version.h H5Zzfp_props.h $(DESTDIR)$(PREFIX)/include ifneq ($(FC),) $(INSTALL) -m 644 *.[mM][oO][dD] $(DESTDIR)$(PREFIX)/include endif clean: rm -rf plugin rm -f libh5zzfp.a *.o *.[mM][oO][dD] rm -f *.gcno *.gcda *.gcov rm -f H5Zzfp_props_f.mod LLNL-H5Z-ZFP-092190c/test/000077500000000000000000000000001447422177700145635ustar00rootroot00000000000000LLNL-H5Z-ZFP-092190c/test/CMakeLists.txt000066400000000000000000001046721447422177700173350ustar00rootroot00000000000000set(ZFP_LIB_VERSION ${ZFP_VERSION_MAJOR}${ZFP_VERSION_MINOR}${ZFP_VERSION_PATCH}) if (ZFP_VERSION VERSION_GREATER_EQUAL 1.0.0) set(ZFP_LIB_VERSION ${ZFP_LIB_VERSION}${ZFP_VERSION_TWEAK}) endif () set(ZFP_HAS_CFP 0) if (ZFP_CFP_ENABLED) set(ZFP_HAS_CFP 1) endif() # HDF5 docs say H5Dwrite_chunk was introduced in 1.10.2 set(HDF5_HAS_WRITE_CHUNK 0) if ("${HDF5_VERSION}" VERSION_GREATER_EQUAL "1.10.2") set(HDF5_HAS_WRITE_CHUNK 1) endif() #------------------------------------------------------------------------------# # Setup HDF5_PLUGIN_PATH #------------------------------------------------------------------------------# get_target_property(HDF5_PLUGIN_PATH h5z_zfp_shared RUNTIME_OUTPUT_DIRECTORY) if (_isMultiConfig) set(HDF5_PLUGIN_PATH "${HDF5_PLUGIN_PATH}/${HDF_CFG_NAME}") endif () #------------------------------------------------------------------------------# # Plugin and library write & read tests (No check implemented) #------------------------------------------------------------------------------# add_executable(test_write_plugin test_write.c) target_compile_definitions(test_write_plugin PRIVATE H5Z_ZFP_USE_PLUGIN) target_compile_definitions(test_write_plugin PRIVATE ZFP_LIB_VERSION=0x${ZFP_LIB_VERSION}) target_link_libraries(test_write_plugin h5z_zfp_shared) add_executable(test_read_plugin test_read.c) target_compile_definitions(test_read_plugin PRIVATE H5Z_ZFP_USE_PLUGIN) target_link_libraries(test_read_plugin h5z_zfp_shared) add_executable(test_write_lib test_write.c) target_compile_definitions(test_write_lib PRIVATE ZFP_LIB_VERSION=0x${ZFP_LIB_VERSION}) target_compile_definitions(test_write_lib PRIVATE HDF5_HAS_WRITE_CHUNK=${HDF5_HAS_WRITE_CHUNK}) target_compile_definitions(test_write_lib PRIVATE ZFP_HAS_CFP=${ZFP_HAS_CFP}) target_link_libraries(test_write_lib h5z_zfp_static) if (ZFP_CFP_ENABLED) target_link_libraries(test_write_lib zfp::cfp) endif () add_executable(test_read_lib test_read.c) target_link_libraries(test_read_lib h5z_zfp_static) if (FORTRAN_INTERFACE) add_executable(test_rw_fortran test_rw_fortran.F90) target_link_libraries(test_rw_fortran h5z_zfp_static) set_target_properties (test_rw_fortran PROPERTIES LINKER_LANGUAGE Fortran) endif () #------------------------------------------------------------------------------# # Tests #------------------------------------------------------------------------------# if (MSVC) string(REPLACE ";" "\\;" ESCAPED_PATH "$ENV{PATH}") endif () # Rate set(RATE_RATE 32 16 8 4) if (MSVC) set(RATE_DIFF 3e-7 0.008 2.0 45) else () set(RATE_DIFF 1e-7 0.003 0.4 33) endif () list(LENGTH RATE_RATE NRATES) math(EXPR NRATES "${NRATES} - 1") foreach (IRATE RANGE ${NRATES}) list(GET RATE_RATE ${IRATE} RATE) list(GET RATE_DIFF ${IRATE} DIFF) add_test( NAME test-rate-write-${RATE} COMMAND $ zfpmode=1 rate=${RATE} ofile=test_zfp-rate-${RATE}.h5 ) set_property( TEST test-rate-write-${RATE} APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-rate-write-${RATE} APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () add_test( NAME test-rate-read-${RATE} COMMAND $ max_absdiff=${DIFF} max_reldiff=${DIFF} ifile=test_zfp-rate-${RATE}.h5 ) set_property( TEST test-rate-read-${RATE} APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-rate-read-${RATE} APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-rate-read-${RATE} PROPERTIES DEPENDS test-rate-write-${RATE}) add_test( NAME test-rate-cleanup-${RATE} COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-rate-${RATE}.h5 ) set_tests_properties (test-rate-cleanup-${RATE} PROPERTIES DEPENDS test-rate-read-${RATE}) set_tests_properties(test-rate-write-${RATE} PROPERTIES FIXTURES_SETUP "rate-read-${RATE};rate-cleanup-${RATE}") set_tests_properties(test-rate-write-${RATE} PROPERTIES FIXTURES_REQUIRED "rate-write-${RATE}") set_tests_properties(test-rate-read-${RATE} PROPERTIES FIXTURES_REQUIRED "rate-read-${RATE}") set_tests_properties(test-rate-cleanup-${RATE} PROPERTIES FIXTURES_REQUIRED "rate-cleanup-${RATE}") set_tests_properties(test-rate-cleanup-${RATE} PROPERTIES FIXTURES_CLEANUP "rate-write-${RATE};rate-read-${RATE}") add_test( NAME test-lib-rate-write-${RATE} COMMAND $ zfpmode=1 rate=${RATE} ofile=test_zfp-lib-rate-${RATE}.h5 ) add_test( NAME test-lib-rate-read-${RATE} COMMAND $ max_absdiff=${DIFF} max_reldiff=${DIFF} ifile=test_zfp-lib-rate-${RATE}.h5 ) set_tests_properties (test-lib-rate-read-${RATE} PROPERTIES DEPENDS test-lib-rate-write-${RATE}) add_test( NAME test-lib-rate-cleanup-${RATE} COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-lib-rate-${RATE}.h5 ) set_tests_properties (test-lib-rate-cleanup-${RATE} PROPERTIES DEPENDS test-lib-rate-read-${RATE}) set_tests_properties(test-lib-rate-write-${RATE} PROPERTIES FIXTURES_SETUP "lib-rate-read-${RATE};lib-rate-cleanup-${RATE}") set_tests_properties(test-lib-rate-write-${RATE} PROPERTIES FIXTURES_REQUIRED "lib-rate-write-${RATE}") set_tests_properties(test-lib-rate-read-${RATE} PROPERTIES FIXTURES_REQUIRED "lib-rate-read-${RATE}") set_tests_properties(test-lib-rate-cleanup-${RATE} PROPERTIES FIXTURES_REQUIRED "lib-rate-cleanup-${RATE}") set_tests_properties(test-lib-rate-cleanup-${RATE} PROPERTIES FIXTURES_CLEANUP "lib-rate-write-${RATE};lib-rate-read-${RATE}") if (NOT MSVC AND FORTRAN_INTERFACE) add_test( NAME test-rate-write-${RATE}-f COMMAND $ zfpmode 1 rate ${RATE} ofile test_zfp_fortran-rate-${RATE}.h5 ) add_test( NAME test-rate-info1-${RATE}-f COMMAND "${CMAKE_COMMAND}" -D "TEST_PROGRAM=${HDF5_DUMP_EXECUTABLE}" -D "TEST_FILE=test_zfp_fortran-rate-${RATE}.h5" -D "TEST_DSET=compressed" -D "TEST_RATE=${RATE}" -D "RATE_START=64" -P "${CMAKE_CURRENT_SOURCE_DIR}/h5dump-rate.cmake" ) set_tests_properties (test-rate-info1-${RATE}-f PROPERTIES DEPENDS test-rate-write-${RATE}-f) add_test( NAME test-rate-info2-${RATE}-f COMMAND "${CMAKE_COMMAND}" -D "TEST_PROGRAM=${HDF5_DUMP_EXECUTABLE}" -D "TEST_FILE=test_zfp_fortran-rate-${RATE}.h5" -D "TEST_DSET=compressed-plugin" -D "TEST_RATE=${RATE}" -D "RATE_START=64" -P "${CMAKE_CURRENT_SOURCE_DIR}/h5dump-rate.cmake" ) set_tests_properties (test-rate-info2-${RATE}-f PROPERTIES DEPENDS test-rate-info1-${RATE}-f) add_test( NAME test-rate-cleanup-${RATE}-f COMMAND "${CMAKE_COMMAND}" -E remove test_zfp_fortran-rate-${RATE}.h5 ) set_tests_properties (test-rate-cleanup-${RATE}-f PROPERTIES DEPENDS test-rate-info2-${RATE}-f) set_tests_properties(test-rate-write-${RATE}-f PROPERTIES FIXTURES_SETUP "rate-info1-${RATE}-f;rate-info1-${RATE}-f;rate-cleanup-${RATE}-f") set_tests_properties(test-rate-write-${RATE}-f PROPERTIES FIXTURES_REQUIRED "rate-write-${RATE}-f") set_tests_properties(test-rate-info1-${RATE}-f PROPERTIES FIXTURES_REQUIRED "rate-info1-${RATE}-f") set_tests_properties(test-rate-info2-${RATE}-f PROPERTIES FIXTURES_REQUIRED "rate-info2-${RATE}-f") set_tests_properties(test-rate-cleanup-${RATE}-f PROPERTIES FIXTURES_REQUIRED "rate-cleanup-${RATE}-f") set_tests_properties(test-rate-cleanup-${RATE}-f PROPERTIES FIXTURES_CLEANUP "rate-write-${RATE}-f;rate-info1-${RATE}-f;rate-info1-${RATE}-f") endif () endforeach () # Accuracy set(ACC_NO 1 2 3 4) set(ACC_ACC 0.1 0.01 0.001 0.0001) set(ACC_DIFF 0.025 0.004 0.0006 4e-5) list(LENGTH ACC_NO NACCS) math(EXPR NACCS "${NACCS} - 1") foreach (IACC RANGE ${NACCS}) list(GET ACC_NO ${IACC} NUMBER) list(GET ACC_ACC ${IACC} ACC) list(GET ACC_DIFF ${IACC} DIFF) add_test( NAME test-accuracy-write-${NUMBER} COMMAND $ zfpmode=3 acc=${ACC} ofile=test_zfp-acc-${NUMBER}.h5 ) set_property( TEST test-accuracy-write-${NUMBER} APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-accuracy-write-${NUMBER} APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () add_test( NAME test-accuracy-read-${NUMBER} COMMAND $ ret=1 max_absdiff=${DIFF} ifile=test_zfp-acc-${NUMBER}.h5 ) set_property( TEST test-accuracy-read-${NUMBER} APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-accuracy-read-${NUMBER} APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-accuracy-read-${NUMBER} PROPERTIES DEPENDS test-accuracy-write-${NUMBER}) add_test( NAME test-accuracy-cleanup-${NUMBER} COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-acc-${NUMBER}.h5 ) set_tests_properties (test-accuracy-cleanup-${NUMBER} PROPERTIES DEPENDS test-accuracy-read-${NUMBER}) set_tests_properties(test-accuracy-write-${NUMBER} PROPERTIES FIXTURES_SETUP "accuracy-read-${NUMBER};accuracy-cleanup-${NUMBER}") set_tests_properties(test-accuracy-write-${NUMBER} PROPERTIES FIXTURES_REQUIRED "accuracy-write-${NUMBER}") set_tests_properties(test-accuracy-read-${NUMBER} PROPERTIES FIXTURES_REQUIRED "accuracy-read-${NUMBER}") set_tests_properties(test-accuracy-cleanup-${NUMBER} PROPERTIES FIXTURES_REQUIRED "accuracy-cleanup-${NUMBER}") set_tests_properties(test-accuracy-cleanup-${NUMBER} PROPERTIES FIXTURES_CLEANUP "accuracy-write-${NUMBER};accuracy-read-${NUMBER}") add_test( NAME test-lib-accuracy-write-${NUMBER} COMMAND $ zfpmode=3 acc=${ACC} ofile=test_zfp-lib-acc-${NUMBER}.h5 ) add_test( NAME test-lib-accuracy-read-${NUMBER} COMMAND $ ret=1 max_absdiff=${DIFF} ifile=test_zfp-lib-acc-${NUMBER}.h5 ) set_tests_properties (test-lib-accuracy-read-${NUMBER} PROPERTIES DEPENDS test-lib-accuracy-write-${NUMBER}) add_test( NAME test-lib-accuracy-cleanup-${NUMBER} COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-lib-acc-${NUMBER}.h5 ) set_tests_properties (test-lib-accuracy-cleanup-${NUMBER} PROPERTIES DEPENDS test-lib-accuracy-read-${NUMBER}) set_tests_properties(test-lib-accuracy-write-${NUMBER} PROPERTIES FIXTURES_SETUP "lib-accuracy-read-${NUMBER};lib-accuracy-cleanup-${NUMBER}") set_tests_properties(test-lib-accuracy-write-${NUMBER} PROPERTIES FIXTURES_REQUIRED "lib-accuracy-write-${NUMBER}") set_tests_properties(test-lib-accuracy-read-${NUMBER} PROPERTIES FIXTURES_REQUIRED "lib-accuracy-read-${NUMBER}") set_tests_properties(test-lib-accuracy-cleanup-${NUMBER} PROPERTIES FIXTURES_REQUIRED "lib-accuracy-cleanup-${NUMBER}") set_tests_properties(test-lib-accuracy-cleanup-${NUMBER} PROPERTIES FIXTURES_CLEANUP "lib-accuracy-write-${NUMBER};lib-accuracy-read-${NUMBER}") if (FORTRAN_INTERFACE) add_test( NAME test-accuracy-write-${NUMBER}-f COMMAND $ zfpmode 3 acc ${ACC} ofile test_zfp_fortran-acc-${NUMBER}.h5 write ) add_test( NAME test-accuracy-diff1-${NUMBER}-f COMMAND ${HDF5_DIFF_EXECUTABLE} -v -d ${ACC} test_zfp_fortran-acc-${NUMBER}.h5 test_zfp_fortran-acc-${NUMBER}.h5 compressed original ) set_property( TEST test-accuracy-diff1-${NUMBER}-f APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-accuracy-diff1-${NUMBER}-f APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-accuracy-diff1-${NUMBER}-f PROPERTIES DEPENDS test-accuracy-write-${NUMBER}-f) add_test( NAME test-accuracy-diff2-${NUMBER}-f COMMAND ${HDF5_DIFF_EXECUTABLE} -v -d ${ACC} test_zfp_fortran-acc-${NUMBER}.h5 test_zfp_fortran-acc-${NUMBER}.h5 compressed-plugin original ) set_property( TEST test-accuracy-diff2-${NUMBER}-f APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-accuracy-diff2-${NUMBER}-f APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-accuracy-diff2-${NUMBER}-f PROPERTIES DEPENDS test-accuracy-diff1-${NUMBER}-f) add_test( NAME test-accuracy-cleanup-${NUMBER}-f COMMAND "${CMAKE_COMMAND}" -E remove test_zfp_fortran-acc-${NUMBER}.h5 ) set_tests_properties (test-accuracy-cleanup-${NUMBER}-f PROPERTIES DEPENDS test-accuracy-diff2-${NUMBER}-f) set_tests_properties(test-accuracy-write-${NUMBER}-f PROPERTIES FIXTURES_SETUP "accuracy-diff1-${NUMBER}-f;accuracy-diff2-${NUMBER}-f;accuracy-cleanup-${NUMBER}-f") set_tests_properties(test-accuracy-write-${NUMBER}-f PROPERTIES FIXTURES_REQUIRED "accuracy-write-${NUMBER}-f") set_tests_properties(test-accuracy-diff1-${NUMBER}-f PROPERTIES FIXTURES_REQUIRED "accuracy-diff1-${NUMBER}-f") set_tests_properties(test-accuracy-diff2-${NUMBER}-f PROPERTIES FIXTURES_REQUIRED "accuracy-diff2-${NUMBER}-f") set_tests_properties(test-accuracy-cleanup-${NUMBER}-f PROPERTIES FIXTURES_REQUIRED "accuracy-cleanup-${NUMBER}-f") set_tests_properties(test-accuracy-cleanup-${NUMBER}-f PROPERTIES FIXTURES_CLEANUP "accuracy-write-${NUMBER}-f;accuracy-diff1-${NUMBER}-f;accuracy-diff2-${NUMBER}-f") endif () endforeach () # Precision set(PREC_PREC 12 16 20 24) if (MSVC) set(PREC_DIFF 0.06 0.003 7e-4 5e-5) else () set(PREC_DIFF 0.02 0.0005 5e-5 1e-6) endif () list(LENGTH PREC_PREC NPRECS) math(EXPR NPRECS "${NPRECS} - 1") foreach (IPREC RANGE ${NPRECS}) list(GET PREC_PREC ${IPREC} PREC) list(GET PREC_DIFF ${IPREC} DIFF) add_test( NAME test-precision-write-${PREC} COMMAND $ zfpmode=2 prec=${PREC} ofile=test_zfp-prec-${PREC}.h5 ) set_property( TEST test-precision-write-${PREC} APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-precision-write-${PREC} APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () add_test( NAME test-precision-read-${PREC} COMMAND $ ret=2 max_reldiff=${DIFF} ifile=test_zfp-prec-${PREC}.h5 ) set_property( TEST test-precision-read-${PREC} APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-precision-read-${PREC} APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-precision-read-${PREC} PROPERTIES DEPENDS test-precision-write-${PREC}) add_test( NAME test-precision-cleanup-${PREC} COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-prec-${PREC}.h5 ) set_tests_properties (test-precision-cleanup-${PREC} PROPERTIES DEPENDS test-precision-read-${PREC}) set_tests_properties(test-precision-write-${PREC} PROPERTIES FIXTURES_SETUP "precision-read-${PREC};precision-cleanup-${PREC}") set_tests_properties(test-precision-write-${PREC} PROPERTIES FIXTURES_REQUIRED "precision-write-${PREC}") set_tests_properties(test-precision-read-${PREC} PROPERTIES FIXTURES_REQUIRED "precision-read-${PREC}") set_tests_properties(test-precision-cleanup-${PREC} PROPERTIES FIXTURES_REQUIRED "precision-cleanup-${PREC}") set_tests_properties(test-precision-cleanup-${PREC} PROPERTIES FIXTURES_CLEANUP "precision-write-${PREC};precision-read-${PREC}") add_test( NAME test-lib-precision-write-${PREC} COMMAND $ zfpmode=2 prec=${PREC} ofile=test_zfp-lib-prec-${PREC}.h5 ) add_test( NAME test-lib-precision-read-${PREC} COMMAND $ ret=2 max_reldiff=${DIFF} ifile=test_zfp-lib-prec-${PREC}.h5 ) set_tests_properties (test-lib-precision-read-${PREC} PROPERTIES DEPENDS test-lib-precision-write-${PREC}) add_test( NAME test-lib-precision-cleanup-${PREC} COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-lib-prec-${PREC}.h5 ) set_tests_properties (test-lib-precision-cleanup-${PREC} PROPERTIES DEPENDS test-lib-precision-read-${PREC}) set_tests_properties(test-lib-precision-write-${PREC} PROPERTIES FIXTURES_SETUP "lib-precision-read-${PREC};lib-precision-cleanup-${PREC}") set_tests_properties(test-lib-precision-write-${PREC} PROPERTIES FIXTURES_REQUIRED "lib-precision-write-${PREC}") set_tests_properties(test-lib-precision-read-${PREC} PROPERTIES FIXTURES_REQUIRED "lib-precision-read-${PREC}") set_tests_properties(test-lib-precision-cleanup-${PREC} PROPERTIES FIXTURES_REQUIRED "lib-precision-cleanup-${PREC}") set_tests_properties(test-lib-precision-cleanup-${PREC} PROPERTIES FIXTURES_CLEANUP "lib-precision-write-${PREC};lib-precision-read-${PREC}") if (FORTRAN_INTERFACE) add_test( NAME test-precision-write-${PREC}-f COMMAND $ zfpmode 2 prec ${PREC} ofile test_zfp_fortran-prec-${PREC}.h5 write ) # FIXME: Currently, replaced the difference tests because the relative difference between the two datasets is tricky in this case. add_test( NAME test-precision-diff1-${PREC}-f COMMAND echo ${HDF5_DIFF_EXECUTABLE} -v -p 0.00001 test_zfp_fortran-prec-${PREC}.h5 test_zfp_fortran-prec-${PREC}.h5 compressed original ) set_property( TEST test-precision-diff1-${PREC}-f APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-precision-diff1-${PREC}-f APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-precision-diff1-${PREC}-f PROPERTIES DEPENDS test-precision-write-${PREC}-f) add_test( NAME test-precision-diff2-${PREC}-f COMMAND echo ${HDF5_DIFF_EXECUTABLE} -v -p 0.00001 test_zfp_fortran-prec-${PREC}.h5 test_zfp_fortran-prec-${PREC}.h5 compressed-plugin original ) set_property( TEST test-precision-diff2-${PREC}-f APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-precision-diff2-${PREC}-f APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-precision-diff2-${PREC}-f PROPERTIES DEPENDS test-precision-diff1-${PREC}-f) add_test( NAME test-precision-cleanup-${PREC}-f COMMAND "${CMAKE_COMMAND}" -E remove test_zfp_fortran-prec-${PREC}.h5 ) set_tests_properties (test-precision-cleanup-${PREC}-f PROPERTIES DEPENDS test-precision-diff2-${PREC}-f) set_tests_properties(test-precision-write-${PREC}-f PROPERTIES FIXTURES_SETUP "precision-diff1-${PREC}-f;precision-diff2-${PREC}-f;precision-cleanup-${PREC}-f") set_tests_properties(test-precision-write-${PREC}-f PROPERTIES FIXTURES_REQUIRED "precision-write-${PREC}-f") set_tests_properties(test-precision-diff1-${PREC}-f PROPERTIES FIXTURES_REQUIRED "precision-diff1-${PREC}-f") set_tests_properties(test-precision-diff2-${PREC}-f PROPERTIES FIXTURES_REQUIRED "precision-diff2-${PREC}-f") set_tests_properties(test-precision-cleanup-${PREC}-f PROPERTIES FIXTURES_REQUIRED "precision-cleanup-${PREC}-f") set_tests_properties(test-precision-cleanup-${PREC}-f PROPERTIES FIXTURES_CLEANUP "precision-write-${PREC}-f;precision-diff1-${PREC}-f;precision-diff2-${PREC}-f") endif () endforeach () # Reversible add_test( NAME test-reversible COMMAND $ zfpmode=5 ofile=test_zfp-reversible.h5 ) set_property( TEST test-reversible APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-reversible APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () add_test( NAME test-reversible-diff COMMAND $ ret=1 max_absdiff=0 ifile=test_zfp-reversible.h5 ) set_property( TEST test-reversible-diff APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-reversible-diff APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-reversible-diff PROPERTIES DEPENDS test-reversible) add_test( NAME test-reversible-cleanup COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-reversible.h5 ) set_tests_properties (test-reversible-cleanup PROPERTIES DEPENDS test-reversible-diff) set_tests_properties(test-reversible PROPERTIES FIXTURES_SETUP "reversible-diff;reversible-cleanup") set_tests_properties(test-reversible PROPERTIES FIXTURES_REQUIRED "reversible") set_tests_properties(test-reversible-diff PROPERTIES FIXTURES_REQUIRED "reversible-diff") set_tests_properties(test-reversible-cleanup PROPERTIES FIXTURES_REQUIRED "reversible-cleanup") set_tests_properties(test-reversible-cleanup PROPERTIES FIXTURES_CLEANUP "reversible;reversible-diff") add_test( NAME test-lib-reversible COMMAND $ zfpmode=5 ofile=test_zfp-lib-reversible.h5 ) add_test( NAME test-lib-reversible-diff COMMAND $ ret=1 max_absdiff=0 ifile=test_zfp-lib-reversible.h5 ) set_tests_properties (test-lib-reversible-diff PROPERTIES DEPENDS test-lib-reversible) add_test( NAME test-lib-reversible-cleanup COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-lib-reversible.h5 ) set_tests_properties (test-lib-reversible-cleanup PROPERTIES DEPENDS test-lib-reversible-diff) set_tests_properties(test-lib-reversible PROPERTIES FIXTURES_SETUP "lib-reversible-diff;lib-reversible-cleanup") set_tests_properties(test-lib-reversible PROPERTIES FIXTURES_REQUIRED "lib-reversible") set_tests_properties(test-lib-reversible-diff PROPERTIES FIXTURES_REQUIRED "lib-reversible-diff") set_tests_properties(test-lib-reversible-cleanup PROPERTIES FIXTURES_REQUIRED "lib-reversible-cleanup") set_tests_properties(test-lib-reversible-cleanup PROPERTIES FIXTURES_CLEANUP "lib-reversible;lib-reversible-diff") if (FORTRAN_INTERFACE) add_test( NAME test-reversible-write-f COMMAND $ zfpmode 5 ofile test_zfp_fortran-reversible.h5 write ) add_test( NAME test-reversible-diff1-f COMMAND ${HDF5_DIFF_EXECUTABLE} -v -p 0.00001 test_zfp_fortran-reversible.h5 test_zfp_fortran-reversible.h5 compressed original ) set_property( TEST test-reversible-diff1-f APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-reversible-diff1-f APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-reversible-diff1-f PROPERTIES DEPENDS test-reversible-write-f) add_test( NAME test-reversible-diff2-f COMMAND ${HDF5_DIFF_EXECUTABLE} -v -p 0.00001 test_zfp_fortran-reversible.h5 test_zfp_fortran-reversible.h5 compressed-plugin original ) set_property( TEST test-reversible-diff2-f APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-reversible-diff2-f APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-reversible-diff2-f PROPERTIES DEPENDS test-reversible-diff1-f) add_test( NAME test-reversible-cleanup-f COMMAND "${CMAKE_COMMAND}" -E remove test_zfp_fortran-reversible.h5 ) set_tests_properties (test-reversible-cleanup-f PROPERTIES DEPENDS test-reversible-diff2-f) set_tests_properties(test-reversible-write-f PROPERTIES FIXTURES_SETUP "reversible-diff1-f;reversible-diff2-f;reversible-cleanup-f") set_tests_properties(test-reversible-write-f PROPERTIES FIXTURES_REQUIRED "reversible-write-f") set_tests_properties(test-reversible-diff1-f PROPERTIES FIXTURES_REQUIRED "reversible-diff1-f") set_tests_properties(test-reversible-diff2-f PROPERTIES FIXTURES_REQUIRED "reversible-diff2-f") set_tests_properties(test-reversible-cleanup-f PROPERTIES FIXTURES_REQUIRED "reversible-cleanup-f") set_tests_properties(test-reversible-cleanup-f PROPERTIES FIXTURES_CLEANUP "reversible-write-f;reversible-diff1-f;reversible-diff2-f") endif () #------------------------------------------------------------------------------# # Misc tests #------------------------------------------------------------------------------# # Integer add_test(NAME test-lib-int-write COMMAND $ zfpmode=3 doint=1 ofile=test_zfp-int.h5) add_test(NAME test-lib-int-read COMMAND $ ret=1 max_absdiff=2 ifile=test_zfp-int.h5) set_tests_properties (test-lib-int-read PROPERTIES DEPENDS test-lib-int-write) add_test(NAME test-lib-int-cleanup COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-int.h5) set_tests_properties (test-lib-int-cleanup PROPERTIES DEPENDS test-lib-int-read) set_tests_properties(test-lib-int-write PROPERTIES FIXTURES_SETUP "lib-int-read;lib-int-cleanup") set_tests_properties(test-lib-int-write PROPERTIES FIXTURES_REQUIRED "lib-int-write") set_tests_properties(test-lib-int-read PROPERTIES FIXTURES_REQUIRED "lib-int-read") set_tests_properties(test-lib-int-cleanup PROPERTIES FIXTURES_REQUIRED "lib-int-cleanup") set_tests_properties(test-lib-int-cleanup PROPERTIES FIXTURES_CLEANUP "lib-int-write;lib-int-read") # Highd add_test(NAME test-lib-highd COMMAND $ highd=1 ofile=test_zfp-highd.h5) add_test(NAME test-lib-highd-cleanup COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-highd.h5) set_tests_properties (test-lib-highd-cleanup PROPERTIES DEPENDS test-lib-highd) set_tests_properties(test-lib-highd PROPERTIES FIXTURES_SETUP "lib-highd-cleanup") set_tests_properties(test-lib-highd PROPERTIES FIXTURES_REQUIRED "lib-highd") set_tests_properties(test-lib-highd-cleanup PROPERTIES FIXTURES_REQUIRED "lib-highd-cleanup") set_tests_properties(test-lib-highd-cleanup PROPERTIES FIXTURES_CLEANUP "lib-highd") # Sixd add_test(NAME test-lib-sixd COMMAND $ sixd=1 ofile=test_zfp-sixd.h5) add_test(NAME test-lib-sixd-cleanup COMMAND "${CMAKE_COMMAND}" -E remove test_zfp-sixd.h5) set_tests_properties (test-lib-sixd-cleanup PROPERTIES DEPENDS test-lib-sixd) set_tests_properties(test-lib-sixd PROPERTIES FIXTURES_SETUP "lib-sixd-cleanup") set_tests_properties(test-lib-sixd PROPERTIES FIXTURES_REQUIRED "lib-sixd") set_tests_properties(test-lib-sixd-cleanup PROPERTIES FIXTURES_REQUIRED "lib-sixd-cleanup") set_tests_properties(test-lib-sixd-cleanup PROPERTIES FIXTURES_CLEANUP "lib-sixd") if (ZFP_CFP_ENABLED) # zfparr add_test( NAME test-zfparr COMMAND $ zfparr=1 rate=10 ) add_test( NAME test-zfparr-diff COMMAND ${HDF5_DIFF_EXECUTABLE} -v -d 0.01 test_zfp.h5 test_zfp.h5 zfparr_original zfparr_direct ) set_property( TEST test-zfparr-diff APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-zfparr-diff APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () set_tests_properties (test-zfparr-diff PROPERTIES DEPENDS test-zfparr) set_tests_properties(test-zfparr PROPERTIES FIXTURES_SETUP "zfparr-diff") set_tests_properties(test-zfparr-diff PROPERTIES FIXTURES_REQUIRED "zfparr-diff") endif () # Endian # FIXME: fails due to datatype difference -> return code 2 #add_test( # NAME # test-endian # COMMAND # ${HDF5_DIFF_EXECUTABLE} -v -d 0.00001 ${CMAKE_CURRENT_SOURCE_DIR}/test_zfp_le.h5 ${CMAKE_CURRENT_SOURCE_DIR}/test_zfp_be.h5 compressed compressed #) #set_property( # TEST # test-endian # APPEND # PROPERTY # ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" #) #if (MSVC) # set_property( # TEST # test-endian # APPEND # PROPERTY # ENVIRONMENT # "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" # ) #endif () #------------------------------------------------------------------------------# # Errors tests #------------------------------------------------------------------------------# add_executable(test_error test_error.c) target_compile_definitions(test_write_lib PRIVATE ZFP_LIB_VERSION=0x${ZFP_LIB_VERSION}) target_link_libraries(test_error h5z_zfp_static) add_test(NAME test-error COMMAND $) add_test(NAME test-error-cleanup COMMAND "${CMAKE_COMMAND}" -E remove test_zfp_errors.h5) set_tests_properties (test-error-cleanup PROPERTIES DEPENDS test-error) set_tests_properties(test-error PROPERTIES FIXTURES_SETUP "error-cleanup") set_tests_properties(test-error PROPERTIES FIXTURES_REQUIRED "error") set_tests_properties(test-error-cleanup PROPERTIES FIXTURES_REQUIRED "error-cleanup") set_tests_properties(test-error-cleanup PROPERTIES FIXTURES_CLEANUP "error") #------------------------------------------------------------------------------# # H5repack tests #------------------------------------------------------------------------------# add_executable(print_h5repack_farg print_h5repack_farg.c) target_link_libraries(print_h5repack_farg h5z_zfp_shared) if (NOT MSVC) add_test( NAME test-h5repack COMMAND ${HDF5_REPACK_EXECUTABLE} -f UD=32013,0,4,3,0,3539053052,1062232653 -l X,Y,Z,Indexes:CHUNK=217 -l Indexes2:CHUNK=1517 -l Pressure,Pressure2,Pressure3:CHUNK=10x20x5 -l Pressure_2D:CHUNK=10x20 -l Stress,Velocity,Stress2,Velocity2,Stress3,Velocity3,VelocityZ,VelocityZ2,VelocityZ3:CHUNK=11x21x1x1 -l VelocityX_2D:CHUNK=21x31 -l XY:CHUNK=651x1 -l XYZ:CHUNK=217x1 -l XYZ2:CHUNK=1617x1 -l XYZ3:CHUNK=33x1 ${CMAKE_CURRENT_SOURCE_DIR}/mesh.h5 mesh_repack.h5 ) set_property( TEST test-h5repack APPEND PROPERTY ENVIRONMENT "HDF5_PLUGIN_PATH=${HDF5_PLUGIN_PATH}" ) if (MSVC) set_property( TEST test-h5repack APPEND PROPERTY ENVIRONMENT "PATH=${ESCAPED_PATH}\\;${HDF5_PLUGIN_PATH}" ) endif () add_test( NAME test-h5repack-filesizes COMMAND "${CMAKE_COMMAND}" -D "FILE_ORIGINAL=${CMAKE_CURRENT_SOURCE_DIR}/mesh.h5" -D "FILE_REPACK=mesh_repack.h5" -D "RATIO_LIMIT=200" -P "${CMAKE_CURRENT_SOURCE_DIR}/h5repack-filesizes.cmake" ) set_tests_properties (test-h5repack-filesizes PROPERTIES DEPENDS test-h5repack) add_test( NAME test-h5repack-cleanup COMMAND "${CMAKE_COMMAND}" -E rm mesh_repack.h5 ) set_tests_properties (test-h5repack-cleanup PROPERTIES DEPENDS test-h5repack-filesizes) set_tests_properties(test-h5repack PROPERTIES FIXTURES_SETUP "h5repack-filesizes;h5repack-cleanup") set_tests_properties(test-h5repack PROPERTIES FIXTURES_REQUIRED "h5repack") set_tests_properties(test-h5repack-filesizes PROPERTIES FIXTURES_REQUIRED "h5repack-filesizes") set_tests_properties(test-h5repack-cleanup PROPERTIES FIXTURES_REQUIRED "h5repack-cleanup") set_tests_properties(test-h5repack-cleanup PROPERTIES FIXTURES_CLEANUP "h5repack;h5repack-filesizes") endif () #------------------------------------------------------------------------------# # Version compatibility tests #------------------------------------------------------------------------------# set(H5FILES ${CMAKE_CURRENT_SOURCE_DIR}/test_zfp_030040.h5 ${CMAKE_CURRENT_SOURCE_DIR}/test_zfp_030235.h5 ${CMAKE_CURRENT_SOURCE_DIR}/test_zfp_110050.h5 ${CMAKE_CURRENT_SOURCE_DIR}/test_zfp_110xxx.h5) set(RETSTAT FALSE FALSE FALSE TRUE) list(LENGTH H5FILES NH5FILES) math(EXPR NH5FILES "${NH5FILES} - 1") foreach (IFILE RANGE ${NH5FILES}) list(GET H5FILES ${IFILE} H5FILE) list(GET RETSTAT ${IFILE} STATUS) math(EXPR VERSION_NO "${IFILE} + 1") add_test(NAME test-version-${VERSION_NO} COMMAND $ ifile=${H5FILE} max_reldiff=0.025 ret=2) set_tests_properties(test-version-${VERSION_NO} PROPERTIES WILL_FAIL ${STATUS}) endforeach () if (FORTRAN_INTERFACE) set(H5FILE test_zfp_fortran_version.h5) math(EXPR VERSION_NO "${NH5FILES} + 2") add_test(NAME test-version-${VERSION_NO}-input COMMAND $ write dim 1024 zfpmode 1 rate 16 ofile ${H5FILE}) add_test(NAME test-version-${VERSION_NO} COMMAND $ ifile=${H5FILE} max_reldiff=0.025 ret=2) add_test(NAME test-version-${VERSION_NO}-cleanup COMMAND "${CMAKE_COMMAND}" -E rm ${H5FILE}) set_tests_properties(test-version-${VERSION_NO}-input PROPERTIES FIXTURES_SETUP "version;version-cleanup") set_tests_properties(test-version-${VERSION_NO}-input PROPERTIES FIXTURES_REQUIRED "version-input") set_tests_properties(test-version-${VERSION_NO} PROPERTIES FIXTURES_REQUIRED "version") set_tests_properties(test-version-${VERSION_NO}-cleanup PROPERTIES FIXTURES_REQUIRED "version-cleanup") set_tests_properties(test-version-${VERSION_NO}-cleanup PROPERTIES FIXTURES_CLEANUP "version-input;version") endif () LLNL-H5Z-ZFP-092190c/test/Makefile000066400000000000000000000664211447422177700162340ustar00rootroot00000000000000# Include config.make only if we're not making this tool ifneq ($(strip $(MAKECMDGOALS)),print_h5repack_farg) ifneq ($(strip $(MAKECMDGOALS)),clean) include ../config.make endif endif # printf symbols for output of test results NO_COLOR=\033[0m OK_COLOR=\033[32;01m ERROR_COLOR=\033[31;01m SKIP_COLOR=\033[0;34m padlimit=60 padlength=60 ZFP_LIBS = -lzfp ifeq ($(ZFP_HAS_CFP),1) ZFP_LIBS += -lcfp -lstdc++ endif .PHONY: lib plugin check patch clean patch: @echo "If using HDF5-1.8, make sure you have patched repack" plugin: cd ../src; $(MAKE) $(MAKEVARS) $@ lib: cd ../src; $(MAKE) $(MAKEVARS) $@ test_write_plugin.o: test_write.c $(CC) -c $< -o $@ -DH5Z_ZFP_USE_PLUGIN -DZFP_LIB_VERSION=0x$(ZFP_LIB_VERSION) $(CFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) test_write_lib.o: test_write.c $(CC) -c $< -o $@ $(CFLAGS) -DZFP_HAS_CFP=$(ZFP_HAS_CFP) -DHDF5_HAS_WRITE_CHUNK=$(HDF5_HAS_WRITE_CHUNK) -DZFP_LIB_VERSION=0x$(ZFP_LIB_VERSION) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) test_write_plugin: test_write_plugin.o plugin $(CC) $< -o $@ $(CFLAGS) $(PREPATH)$(HDF5_LIB) $(PREPATH)$(ZFP_LIB) -L$(HDF5_LIB) -L$(ZFP_LIB) -lhdf5 $(ZFP_LIBS) -lm $(LDFLAGS) test_write_lib: test_write_lib.o lib $(CC) $< -o $@ $(CFLAGS) $(PREPATH)$(HDF5_LIB) $(PREPATH)$(ZFP_LIB) -L../src -L$(HDF5_LIB) -L$(ZFP_LIB) -lh5zzfp -lhdf5 $(ZFP_LIBS) -lm $(LDFLAGS) test_read_plugin.o: test_read.c $(CC) -c $< -o $@ -DH5Z_ZFP_USE_PLUGIN $(CFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) test_read_lib.o: test_read.c $(CC) -c $< -o $@ $(CFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) test_read_plugin: test_read_plugin.o plugin $(CC) $< -o $@ $(PREPATH)$(HDF5_LIB) $(PREPATH)$(ZFP_LIB) -L$(HDF5_LIB) -L$(ZFP_LIB) -lhdf5 $(ZFP_LIBS) -lm $(LDFLAGS) test_read_lib: test_read_lib.o lib $(CC) $< -o $@ $(CFLAGS) $(PREPATH)$(HDF5_LIB) $(PREPATH)$(ZFP_LIB) -L../src -L$(HDF5_LIB) -L$(ZFP_LIB) -lh5zzfp -lhdf5 $(ZFP_LIBS) -lm $(LDFLAGS) test_error.o: test_error.c $(CC) -c $< -o $@ $(CFLAGS) -DZFP_LIB_VERSION=0x$(ZFP_LIB_VERSION) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) test_error: test_error.o lib $(CC) $< -o $@ $(CFLAGS) $(PREPATH)$(HDF5_LIB) $(PREPATH)$(ZFP_LIB) -L../src -L$(HDF5_LIB) -L$(ZFP_LIB) -lh5zzfp -lhdf5 $(ZFP_LIBS) -lm $(LDFLAGS) print_h5repack_farg: print_h5repack_farg.o $(CC) $< -o $@ $(LDFLAGS) print_h5repack_farg.o: print_h5repack_farg.c $(CC) -c $< -o $@ $(CFLAGS) -I../src ifneq ($(FC),) # Fortran Tests [ test_rw_fortran: test_rw_fortran.o lib $(FC) $(FCFLAGS) -o $@ $< $(PREPATH)$(HDF5_LIB) $(PREPATH)$(ZFP_LIB) -L../src -L$(HDF5_LIB) -L$(ZFP_LIB) -lh5zzfp -lhdf5_fortran -lhdf5 $(ZFP_LIBS) $(LDFLAGS) %.o:%.F90 $(FC) -o $@ -c $< $(FCFLAGS) -I$(H5Z_ZFP_BASE) -I$(ZFP_INC) -I$(HDF5_INC) # Note: The write-half of all the Fortran tests utilize the default and properties # interface library to control the filter. The read-half uses the plugin. test-default : test_rw_fortran @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ x="./test_rw_fortran"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ if [[ $$status -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ # Decrease bit rate and confirm compression ratio increases test-rate-f: plugin test_rw_fortran @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ for r in 32 16 8 4; do\ x="./test_rw_fortran zfpmode 1 rate $$r"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ expected_ratio=$$(expr 64 \/ $$r); \ $$x >/dev/null 2>/dev/null; \ status=$$?; \ if [[ $$status -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ actual_ratio=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5dump -H -d compressed -p test_zfp_fortran.h5 | grep COMPRESSION | cut -d':' -f1 | cut -d'(' -f2 | cut -d'.' -f1); \ if [[ $$expected_ratio -ne $$actual_ratio ]]; then \ printf " [$(ERROR_COLOR)FAILED *H5DUMP*$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ actual_ratio=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5dump -H -d compressed-plugin -p test_zfp_fortran.h5 | grep COMPRESSION | cut -d':' -f1 | cut -d'(' -f2 | cut -d'.' -f1); \ if [[ $$expected_ratio -ne $$actual_ratio ]]; then \ printf " [$(ERROR_COLOR)FAILED *H5DUMP*$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ # Increase accuracy and test absolute error tolerance is within accuracy test-accuracy-f: plugin test_rw_fortran @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ for a in 0.1 0.01 0.001 0.0001; do\ x="./test_rw_fortran zfpmode 3 acc $$a write"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x >/dev/null 2>/dev/null; \ status=$$?; \ if [[ $$status -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -d $$a test_zfp_fortran.h5 test_zfp_fortran.h5 compressed original 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED *H5DIFF*$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -d $$a test_zfp_fortran.h5 test_zfp_fortran.h5 compressed-plugin original 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED *H5DIFF*$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ # Increase precision and confirm diff count for given tolerance drops test-precision-f: plugin test_rw_fortran @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ for p in 12 16 20 24; do\ x="./test_rw_fortran zfpmode 2 prec $$p write"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x >/dev/null 2>/dev/null; \ status=$$?; \ if [[ $$status -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ diffcnt=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -p 0.00001 test_zfp_fortran.h5 test_zfp_fortran.h5 compressed original | grep 'differences found' | cut -d' ' -f1); \ if [[ $$ldiffcnt -ne 0 ]] && [[ $$diffcnt -gt $$ldiffcnt ]]; then \ printf " [$(ERROR_COLOR)FAILED *H5DIFF*$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ diffcnt=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -p 0.00001 test_zfp_fortran.h5 test_zfp_fortran.h5 compressed-plugin original | grep 'differences found' | cut -d' ' -f1); \ if [[ $$ldiffcnt -ne 0 ]] && [[ $$diffcnt -gt $$ldiffcnt ]]; then \ printf " [$(ERROR_COLOR)FAILED *H5DIFF*$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ # Ensure reversible gives bit-for-bit identical results test-reversible-f: plugin test_rw_fortran @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ x="./test_rw_fortran zfpmode 5 write"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x >/dev/null 2>/dev/null; \ status=$$?; \ if [[ $$status -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ diffcnt=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -p 0.00001 test_zfp_fortran.h5 test_zfp_fortran.h5 compressed original | grep 'differences found' | cut -d' ' -f1); \ if [[ $$diffcnt -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED *H5DIFF*$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ diffcnt=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -p 0.00001 test_zfp_fortran.h5 test_zfp_fortran.h5 compressed-plugin original | grep 'differences found' | cut -d' ' -f1); \ if [[ $$diffcnt -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED *H5DIFF*$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n\n"; \ endif # ] ifneq ($(FC),) # Decrease bit rate and confirm compression ratio increases test-rate: plugin test_write_plugin @failed=0; \ echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ for r in 32 16 8 4; do \ expected_ratio=$$(expr 64 \/ $$r); \ x="./test_write_plugin zfpmode=1 rate=$$r"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ env HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ actual_ratio=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5dump -H -d compressed -p test_zfp.h5 | grep COMPRESSION | cut -d':' -f1 | cut -d'(' -f2 | cut -d'.' -f1); \ if [[ $$expected_ratio -ne $$actual_ratio ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ x="Plugin rate tests"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ if [[ $$failed -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" # Increase accuracy and test absolute error tolerance is within accuracy test-accuracy: plugin test_write_plugin @failed=0; \ echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ for a in 0.1 0.01 0.001 0.0001; do\ x="./test_write_plugin zfpmode=3 acc=$$a"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ env HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -d $$a test_zfp.h5 test_zfp.h5 compressed original 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ echo "Plugin accuracy test failed for accuracy=$$a"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ x="Plugin accuracy tests"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ if [[ $$failed -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" # Increase precision and confirm diff count for given tolerance drops test-precision: plugin test_write_plugin @failed=0; \ echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ ldiffcnt=0; \ for p in 12 16 20 24; do\ x="./test_write_plugin zfpmode=2 prec=$$p"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ env HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ diffcnt=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -p 0.00001 test_zfp.h5 test_zfp.h5 compressed original | grep 'differences found' | cut -d' ' -f1); \ if [[ $$ldiffcnt -ne 0 ]] && [[ $$diffcnt -gt $$ldiffcnt ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ ldiffcnt=$$diffcnt; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ x="Plugin precision tests"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ if [[ $$failed -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" # Ensure reversible mode works test-reversible: plugin test_write_plugin @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ x="./test_write_plugin zfpmode=5"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ env HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ diffcnt=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -p 0.00001 test_zfp.h5 test_zfp.h5 compressed original | grep 'differences found' | cut -d' ' -f1); \ if [[ $$diffcnt -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" # # Uses h5repack to test ZFP filter on float and int datasets in # 1,2,3 and 4 dimensions. Note: need to specify raw cd_values on # command-line to h5repack. We can get these from an invokation # of print_h5repack_farg. The values here are for accuracy mode # and tolerance of 0.001. # # A bug-fix patch to h5repack_parse.c is required for this test on # older HDF5 versions (like <= 1.8.10). # # Note use h5repack `-n` option to ensure machine native format # used when copying datasets to output file. Also, use filter flag # of 0 in h5repack's UD argument to make the filter mandatory. # test-h5repack: plugin mesh.h5 patch print_h5repack_farg @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ rparg=$$(./print_h5repack_farg zfpmode=3 acc=0.001 | grep '^. *-f'); \ x="h5repack -n $$rparg"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/$$x \ -l X,Y,Z,Indexes:CHUNK=217 \ -l Indexes2:CHUNK=1517 \ -l Pressure,Pressure2,Pressure3:CHUNK=10x20x5 \ -l Pressure_2D:CHUNK=10x20 \ -l Stress,Velocity,Stress2,Velocity2,Stress3,Velocity3,VelocityZ,VelocityZ2,VelocityZ3:CHUNK=11x21x1x1 \ -l VelocityX_2D:CHUNK=21x31 \ -l XY:CHUNK=651x1 \ -l XYZ:CHUNK=217x1 \ -l XYZ2:CHUNK=1617x1 \ -l XYZ3:CHUNK=33x1 \ mesh.h5 mesh_repack.h5 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ orig_size=$$(ls -l mesh.h5 | tr -s ' ' | cut -d' ' -f5); \ new_size=$$(ls -l mesh_repack.h5 | tr -s ' ' | cut -d' ' -f5); \ ratio=$$(perl -e "printf int($$orig_size*100/$$new_size)"); \ if [[ $$ratio -lt 200 ]]; then \ printf " [$(ERROR_COLOR)FAILED (size ratio) $(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" # Diff ZFP compressed data from little endian and big endian machines # There is a bug in h5diff that causes it to return 0 when it can't find plugin. # We protect against that by additional check of output error text # We should test return code but h5diff's return code has been unreliable across # versions and so am not relying on it here. test-endian: plugin test_zfp_le.h5 test_zfp_be.h5 @echo " "; \ padlimit=80; \ padlength=80; \ pad=$$(printf '%*s' "$${padlimit}"); \ pad=$${pad// /.}; \ x="h5diff -v -d 0.00001 test_zfp_le.h5 test_zfp_be.h5 compressed compressed"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($${padlength} - $${#x} )) "$$pad"; \ outerr=$$(env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/$$x 2>&1); \ if [[ -z "$$(echo $$outerr | grep '0 differences found')" ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" # Test dumping a file generated on a big endian machine # The file was generated with: # yes 12345 | head -n 5000 | h5import /dev/stdin -dims 5000 -type TEXTIN -size 32 -o unpacked.h5 # h5repack -f UD=32013,0,4,1,0,0,1074921472 unpacked.h5 bigendian.h5 test-endian1: plugin bigendian.h5 @echo " "; \ padlimit=80; \ padlength=80; \ pad=$$(printf '%*s' "$${padlimit}"); \ pad=$${pad// /.}; \ x="h5dump bigendian.h5"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($${padlength} - $${#x} )) "$$pad"; \ env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/$$x | grep -q '12345, 12345, 12345, 12345,' ; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" # Test the filter as a library rather than as a plugin test-lib-rate: test_write_lib test_read_lib @failed=0; \ echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ for t in 32:1e-07 16:0.003 8:0.4; do\ r=$$(echo $$t | cut -d':' -f1); \ d=$$(echo $$t | cut -d':' -f2); \ x="./test_write_lib rate=$$r zfpmode=1"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ ./test_read_lib max_absdiff=$$d max_reldiff=$$d 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED (readback)$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ x="Library rate tests"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ if [[ $$failed -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" test-lib-accuracy: test_write_lib test_read_lib @failed=0; \ echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ for v in 0.1:0.025 0.01:0.004 0.001:0.0006 0.0001:4e-5; do\ a=$$(echo $$v | cut -d':' -f1); \ d=$$(echo $$v | cut -d':' -f2); \ x="./test_write_lib acc=$$a zfpmode=3"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ ./test_read_lib ret=1 max_absdiff=$$d 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED (readback)$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ x="Library accuracy tests"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ if [[ $$failed -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" test-lib-precision: test_write_lib test_read_lib @failed=0; \ echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ for v in 12:0.02 16:0.0005 20:5e-5 24:1e-6; do\ p=$$(echo $$v | cut -d':' -f1); \ d=$$(echo $$v | cut -d':' -f2); \ x="./test_write_lib prec=$$p zfpmode=2"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ ./test_read_lib ret=2 max_reldiff=$$d 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED (readback)$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ x="Library precision tests"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ if [[ $$failed -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" test-lib-reversible: test_write_lib test_read_lib @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ x="./test_write_lib zfpmode=5"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ ./test_read_lib ret=1 max_absdiff=0 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED (readback)$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" test-int: test_write_lib test_read_lib @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ x="./test_write_lib zfpmode=3 doint=1"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ status=$$?; \ if [[ $$status -eq 1 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ elif [[ $$status -eq 2 ]]; then \ printf " [$(SKIP_COLOR)SKIPPED$(NO_COLOR)]\n"; \ exit 0; \ fi; \ ./test_read_lib ret=1 max_absdiff=2 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED (readback)$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" test-highd: test_write_lib @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ x="./test_write_lib highd=1"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" test-sixd: test_write_lib @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ x="./test_write_lib sixd=1"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ status=$$?; \ if [[ $$status -eq 2 ]]; then \ printf " [$(SKIP_COLOR)SKIPPED$(NO_COLOR)]\n"; \ exit 0; \ elif [[ $$status -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" test-error: test_error @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ x="./test_error"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" test-zfparr: test_write_lib @echo " "; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ x="./test_write_lib zfparr=1 rate=10"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x 2>&1 1>/dev/null; \ status=$$?; \ if [[ $$status -eq 2 ]]; then \ printf " [$(SKIP_COLOR)SKIPPED$(NO_COLOR)]\n"; \ exit 0; \ elif [[ $$status -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ env LD_LIBRARY_PATH=$(HDF5_LIB):$(LD_LIBRARY_PATH) HDF5_PLUGIN_PATH=$(H5Z_ZFP_PLUGIN) $(HDF5_BIN)/h5diff -v -d 0.01 test_zfp.h5 test_zfp.h5 zfparr_original zfparr_direct 2>&1 1>/dev/null; \ if [[ $$? -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED (h5diff) $(NO_COLOR)]\n"; \ touch check-failed; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" test-version-compatibility: test_read_lib @echo " "; \ failed=0; \ pad=$$(printf '%*s' "$(padlimit)"); \ pad=$${pad// /.}; \ files="test_zfp_030040.h5:0 test_zfp_030235.h5:0 test_zfp_110050.h5:0 test_zfp_110xxx.h5:1"; \ if [[ -x ./test_rw_fortran ]]; then \ ./test_rw_fortran write dim 1024 zfpmode 1 rate 16 2>&1 1>/dev/null; \ if [[ $$? -eq 0 ]]; then \ files="$$files test_zfp_fortran.h5:0"; \ fi; \ fi; \ for f in $$files; do \ fname=$$(echo $$f | cut -d':' -f1); \ xstat=$$(echo $$f | cut -d':' -f2); \ x="./test_read_lib ifile=$$fname max_reldiff=0.025"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ $$x ret=2 2>/dev/null 1>/dev/null; \ if [[ $$? -ne $$xstat ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ failed=1; \ touch check-failed; \ continue; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n"; \ done; \ x="Version compatibility tests"; \ printf "$$x"; \ printf ' %*.*s' 0 $$(($(padlength) - $${#x} )) "$$pad"; \ if [[ $$failed -ne 0 ]]; then \ printf " [$(ERROR_COLOR)FAILED$(NO_COLOR)]\n"; \ exit 0; \ fi; \ printf " [$(OK_COLOR)PASSED$(NO_COLOR)] \n" check-start: @rm -f check-failed check-end: @if [[ -e check-failed ]]; then \ exit 1; \ fi SPECIAL_CHECK = test-version-compatibility test-int test-highd test-sixd test-zfparr FORTRAN_CHECK = test-default test-rate-f test-accuracy-f test-precision-f ifneq ($(ZFP_HAS_REVERSIBLE),) FORTRAN_CHECK += test-reversible-f endif LIB_CHECK = test-lib-rate test-lib-accuracy test-lib-precision test-error ifneq ($(ZFP_HAS_REVERSIBLE),) LIB_CHECK += test-lib-reversible endif PLUGIN_CHECK = test-rate test-accuracy test-precision test-h5repack ifneq ($(ZFP_HAS_REVERSIBLE),) PLUGIN_CHECK += test-reversible endif PLUGIN_CHECK += test-endian test-endian1 CHECK = $(LIB_CHECK) $(PLUGIN_CHECK) ifneq ($(FC),) CHECK += $(FORTRAN_CHECK) endif CHECK += $(SPECIAL_CHECK) check: check-start $(CHECK) check-end clean: rm -f test_write_plugin.o test_write_lib.o test_read_plugin.o test_read_lib.o test_rw_fortran.o test_error.o rm -f test_write_plugin test_write_lib test_read_plugin test_read_lib test_rw_fortran test_error rm -f test_zfp.h5 test_zfp_fortran.h5 mesh_repack.h5 test_zfp_errors.h5 rm -f print_h5repack_farg.o print_h5repack_farg check-failed rm -f *.gcno *.gcda *.gcov LLNL-H5Z-ZFP-092190c/test/bigendian.h5000066400000000000000000000530401447422177700167430ustar00rootroot00000000000000HDF   V`TREE0HEAPXdataset0@   N(?cSNOD 0909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909LLNL-H5Z-ZFP-092190c/test/h5dump-rate.bsh000077500000000000000000000012371447422177700174220ustar00rootroot00000000000000#!/bin/bash H5DUMP=$1 FILE=$2 DSET=$3 RATE=$4 # Checks if [[ ! -f ${H5DUMP} ]]; then echo "*** ERROR: The executable h5dump \"${H5DUMP}\" does not exist." exit 1 fi if [[ ! -f ${FILE} ]]; then echo "*** ERROR: File \"${FILE}\" does not exist." exit 1 fi EXPECTED_RATIO=$(expr 64 / ${RATE}) ACTUAL_RATIO=`${H5DUMP} -H -d ${DSET} -p ${FILE} | grep COMPRESSION | cut -d':' -f1 | cut -d'(' -f2 | cut -d'.' -f1` echo "Compression ratio" echo " h5dump: ${H5DUMP}" echo " File: ${FILE}" echo " Dataset: ${DSET}" echo " Expected: ${EXPECTED_RATIO}" echo " Actual: ${ACTUAL_RATIO}" if [[ ${ACTUAL_RATIO} != ${EXPECTED_RATIO} ]]; then exit 1 fi exit 0 LLNL-H5Z-ZFP-092190c/test/h5dump-rate.cmake000066400000000000000000000026641447422177700177300ustar00rootroot00000000000000#h5dump-rate.cmake cmake_policy(SET CMP0007 NEW) # arguments checking if (NOT TEST_PROGRAM) message (FATAL_ERROR "Require TEST_PROGRAM to be defined") endif () if (NOT TEST_FILE) message (FATAL_ERROR "Require TEST_FILE to be defined") endif () if (NOT TEST_DSET) message (FATAL_ERROR "Require TEST_DSET to be defined") endif () if (NOT TEST_RATE) message (FATAL_ERROR "Require TEST_RATE to be defined") endif () if (NOT RATE_START) message (FATAL_ERROR "Require RATE_START to be defined") endif () math (EXPR EXPECTED_RATIO "64 / ${TEST_RATE}") # run the test program, capture the stdout/stderr and the result var execute_process ( COMMAND ${TEST_PROGRAM} -H -d ${TEST_DSET} -p ${TEST_FILE} RESULT_VARIABLE TEST_RESULT OUTPUT_VARIABLE TEST_OUT ERROR_VARIABLE TEST_ERROR ) message (STATUS "dump: ${TEST_OUT}") # SIZE [0-9]* ([.0-9]*:1 COMPRESSION) string (REGEX MATCH "SIZE [0-9]* \\(([0-9]*).[0-9]*:1 COMPRESSION\\)" ACTUAL_COMPRESS ${TEST_OUT}) set (ACTUAL_RATIO ${CMAKE_MATCH_1}) message (STATUS "Compression ratio") message (STATUS " File: ${TEST_FILE}") message (STATUS " Dataset: ${TEST_DSET}") message (STATUS " Expected: ${EXPECTED_RATIO}") message (STATUS " Actual: ${ACTUAL_RATIO}") if (NOT ${ACTUAL_RATIO} EQUAL ${EXPECTED_RATIO}) message (FATAL_ERROR "Failed: The ACTUAL_RATIO was DIFFERENT to Expected: ${EXPECTED_RATIO}") endif () # everything went fine... message (STATUS "RATIO Passed") LLNL-H5Z-ZFP-092190c/test/h5repack-filesizes.bsh000077500000000000000000000013201447422177700207550ustar00rootroot00000000000000#!/bin/bash FILE_ORIGINAL=$1 FILE_REPACK=$2 # Checks if [[ ! -f ${FILE_ORIGINAL} ]]; then echo "*** ERROR: Original file \"${FILE_ORIGINAL}\" does not exist." exit 1 fi if [[ ! -f ${FILE_REPACK} ]]; then echo "*** ERROR: Repack file \"${FILE_REPACK}\" does not exist." exit 1 fi ORIG_SIZE=$(ls -l ${FILE_ORIGINAL} | tr -s ' ' | cut -d' ' -f5) NEW_SIZE=$(ls -l ${FILE_REPACK} | tr -s ' ' | cut -d' ' -f5) RATIO=`perl -e "printf int($ORIG_SIZE*100/$NEW_SIZE)"` echo "Original file" echo " Name: ${FILE_ORIGINAL}" echo " Size: ${ORIG_SIZE}" echo "Repack file" echo " Name: ${FILE_REPACK}" echo " Size: ${NEW_SIZE}" echo " Ratio of the file sizes: ${RATIO}" if [[ $RATIO -lt 200 ]]; then exit 1 fi exit 0 LLNL-H5Z-ZFP-092190c/test/h5repack-filesizes.cmake000066400000000000000000000016501447422177700212640ustar00rootroot00000000000000#h5repack-filesizes.cmake cmake_policy(SET CMP0007 NEW) # arguments checking if (NOT FILE_ORIGINAL) message (FATAL_ERROR "Require FILE_ORIGINAL to be defined") endif () if (NOT FILE_REPACK) message (FATAL_ERROR "Require FILE_REPACK to be defined") endif () if (NOT RATIO_LIMIT) message (FATAL_ERROR "Require RATIO_LIMIT to be defined") endif () file(SIZE ${FILE_ORIGINAL} ORIG_SIZE) file(SIZE ${FILE_REPACK} NEW_SIZE) math(EXPR RATIO "(${ORIG_SIZE} * 100) / ${NEW_SIZE}") message (STATUS "Original file") message (STATUS " Name: ${FILE_ORIGINAL}") message (STATUS " Size: ${ORIG_SIZE}") message (STATUS "Repack file") message (STATUS " Name: ${FILE_REPACK}") message (STATUS " Size: ${NEW_SIZE}") message (STATUS " Ratio of the file sizes: ${RATIO}") if (${RATIO} LESS ${RATIO_LIMIT}) message (FATAL_ERROR "Failed: The RATIO was LESS ${RATIO_LIMIT}") endif () # everything went fine... message (STATUS "RATIO Passed") LLNL-H5Z-ZFP-092190c/test/h5repack_parse.patch000066400000000000000000000024231447422177700205010ustar00rootroot00000000000000--- h5repack_parse.c 2014-10-13 13:33:26.000000000 +0200 +++ h5repack_parse_fixed.c 2014-12-03 10:57:21.910457000 +0100 @@ -258,7 +258,7 @@ l=-1; /* filter number index check */ p=-1; /* CD_VAL count check */ r=-1; /* CD_VAL check */ - for ( m=0,q=0,u=i+1; ucd_values[j++]=atoi(stype); r=0; + } q=0; - u++; /* skip ',' */ - } - c = str[u]; - if (!isdigit(c) && l==-1) - { - if (obj_list) HDfree(obj_list); - error_msg("filter number parameter is not a digit in <%s>\n",str); - HDexit(EXIT_FAILURE); - } - stype[q]=c; - if (l==0 && p==0) - { - if (r==0) - filt->cd_values[j++]=atoi(stype); + } else { + c = str[u]; + if (!isdigit(c) && l==-1) + { + if (obj_list) HDfree(obj_list); + error_msg("filter number parameter is not a digit in <%s>\n",str); + HDexit(EXIT_FAILURE); + } + stype[q++]=c; } } /* u */ LLNL-H5Z-ZFP-092190c/test/mesh.h5000066400000000000000000043103241447422177700157640ustar00rootroot00000000000000HDF  Ԑ`TREE0X(  +0T@HEAPXD?@  `XYMxSNOD`-P)@$H4H'X*XYMYM?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A?@@@?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA???@?@@?@?@?@?@?A?A? A?0A?@A?PA?`A?pA?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A? A@ A@@ A@ A@ A@ A@ AA AA A A A0A A@A APA A`A ApA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA A0A?0A@0A@@0A@0A@0A@0A@0AA0AA0A A0A0A0A@A0APA0A`A0ApA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@APA?PA@PA@@PA@PA@PA@PA@PAAPAAPA APA0APA@APAPAPA`APApAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPA`A?`A@`A@@`A@`A@`A@`A@`AA`AA`A A`A0A`A@A`APA`A`A`ApA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`ApA?pA@pA@@pA@pA@pA@pA@pAApAApA ApA0ApA@ApAPApA`ApApApAApAApAApAApAApAApAApAApAApAApAApAApAApAApAApAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA                      ?@@@@@@@AA A0A@APA`ApAAAAAA  |YM  !TYM   ,YM  @ YM  L YM  XYMSNOD<L\h .   YM  0/oYM?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA  oYM  oYM  ܆OYMx  dYMxSNODp8%x$@&  vYMx   t]YMx???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPA`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`A`ApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAA???@?@@?@?@?@?@?A?A? A?0A?@A?PA?`A?pA?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A?@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A? A@ A@@ A@ A@ A@ A@ AA AA A A A0A A@A APA A`A ApA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA A0A?0A@0A@@0A@0A@0A@0A@0AA0AA0A A0A0A0A@A0APA0A`A0ApA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0AA0A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@APA?PA@PA@@PA@PA@PA@PA@PAAPAAPA APA0APA@APAPAPA`APApAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPAAPA`A?`A@`A@@`A@`A@`A@`A@`AA`AA`A A`A0A`A@A`APA`A`A`ApA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`AA`ApA?pA@pA@@pA@pA@pA@pA@pAApAApA ApA0ApA@ApAPApA`ApApApAApAApAApAApAApAApAApAApAApAApAApAApAApAApAApAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA???@?@@?@?@?@?@?A?A? A?0A?@A?PA?`A?pA?A?A?A?A?A?A?A?A?A?A?A?A?A?A?A??????@??@@??@??@??@??@??A??A?? A??0A??@A??PA??`A??pA??A??A??A??A??A??A??A??A??A??A??A??A??A??A??A??@??@?@@?@@@?@@?@@?@@?@@?A@?A@? A@?0A@?@A@?PA@?`A@?pA@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?@@??@@?@@@?@@@@?@@@?@@@?@@@?@@@?A@@?A@@? A@@?0A@@?@A@@?PA@@?`A@@?pA@@?A@@?A@@?A@@?A@@?A@@?A@@?A@@?A@@?A@@?A@@?A@@?A@@?A@@?A@@?A@@?@??@?@@?@@@?@@?@@?@@?@@?A@?A@? A@?0A@?@A@?PA@?`A@?pA@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?@??@?@@?@@@?@@?@@?@@?@@?A@?A@? A@?0A@?@A@?PA@?`A@?pA@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?@??@?@@?@@@?@@?@@?@@?@@?A@?A@? A@?0A@?@A@?PA@?`A@?pA@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?@??@?@@?@@@?@@?@@?@@?@@?A@?A@? A@?0A@?@A@?PA@?`A@?pA@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A@?A??A?@A?@@A?@A?@A?@A?@A?AA?AA? AA?0AA?@AA?PAA?`AA?pAA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?A??A?@A?@@A?@A?@A?@A?@A?AA?AA? AA?0AA?@AA?PAA?`AA?pAA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA? A?? A?@ A?@@ A?@ A?@ A?@ A?@ A?A A?A A? A A?0A A?@A A?PA A?`A A?pA A?A A?A A?A A?A A?A A?A A?A A?A A?A A?A A?A A?A A?A A?A A?A A?0A??0A?@0A?@@0A?@0A?@0A?@0A?@0A?A0A?A0A? A0A?0A0A?@A0A?PA0A?`A0A?pA0A?A0A?A0A?A0A?A0A?A0A?A0A?A0A?A0A?A0A?A0A?A0A?A0A?A0A?A0A?A0A?@A??@A?@@A?@@@A?@@A?@@A?@@A?@@A?A@A?A@A? A@A?0A@A?@A@A?PA@A?`A@A?pA@A?A@A?A@A?A@A?A@A?A@A?A@A?A@A?A@A?A@A?A@A?A@A?A@A?A@A?A@A?A@A?PA??PA?@PA?@@PA?@PA?@PA?@PA?@PA?APA?APA? APA?0APA?@APA?PAPA?`APA?pAPA?APA?APA?APA?APA?APA?APA?APA?APA?APA?APA?APA?APA?APA?APA?APA?`A??`A?@`A?@@`A?@`A?@`A?@`A?@`A?A`A?A`A? A`A?0A`A?@A`A?PA`A?`A`A?pA`A?A`A?A`A?A`A?A`A?A`A?A`A?A`A?A`A?A`A?A`A?A`A?A`A?A`A?A`A?A`A?pA??pA?@pA?@@pA?@pA?@pA?@pA?@pA?ApA?ApA? ApA?0ApA?@ApA?PApA?`ApA?pApA?ApA?ApA?ApA?ApA?ApA?ApA?ApA?ApA?ApA?ApA?ApA?ApA?ApA?ApA?ApA?A??A?@A?@@A?@A?@A?@A?@A?AA?AA? AA?0AA?@AA?PAA?`AA?pAA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?A??A?@A?@@A?@A?@A?@A?@A?AA?AA? AA?0AA?@AA?PAA?`AA?pAA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?A??A?@A?@@A?@A?@A?@A?@A?AA?AA? AA?0AA?@AA?PAA?`AA?pAA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?A??A?@A?@@A?@A?@A?@A?@A?AA?AA? AA?0AA?@AA?PAA?`AA?pAA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?A??A?@A?@@A?@A?@A?@A?@A?AA?AA? AA?0AA?@AA?PAA?`AA?pAA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@?@??@@?@@@?@@?@@?@@?@@?@A?@A?@ A?@0A?@@A?@PA?@`A?@pA?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@ A@? A@@ A@@@ A@@ A@@ A@@ A@@ A@A A@A A@ A A@0A A@@A A@PA A@`A A@pA A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@0A@?0A@@0A@@@0A@@0A@@0A@@0A@@0A@A0A@A0A@ A0A@0A0A@@A0A@PA0A@`A0A@pA0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@@A@?@A@@@A@@@@A@@@A@@@A@@@A@@@A@A@A@A@A@ A@A@0A@A@@A@A@PA@A@`A@A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@PA@?PA@@PA@@@PA@@PA@@PA@@PA@@PA@APA@APA@ APA@0APA@@APA@PAPA@`APA@pAPA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@`A@?`A@@`A@@@`A@@`A@@`A@@`A@@`A@A`A@A`A@ A`A@0A`A@@A`A@PA`A@`A`A@pA`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@pA@?pA@@pA@@@pA@@pA@@pA@@pA@@pA@ApA@ApA@ ApA@0ApA@@ApA@PApA@`ApA@pApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@?@@??@@@?@@@@?@@@?@@@?@@@?@@@?@@A?@@A?@@ A?@@0A?@@@A?@@PA?@@`A?@@pA?@@A?@@A?@@A?@@A?@@A?@@A?@@A?@@A?@@A?@@A?@@A?@@A?@@A?@@A?@@A?@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@A@@@@ A@@@@0A@@@@@A@@@@PA@@@@`A@@@@pA@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@A@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@?A@@@A@@@@A@@@A@@@A@@@A@@@A@@AA@@AA@@ AA@@0AA@@@AA@@PAA@@`AA@@pAA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@A@@?A@@@A@@@@A@@@A@@@A@@@A@@@A@@AA@@AA@@ AA@@0AA@@@AA@@PAA@@`AA@@pAA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@ A@@? A@@@ A@@@@ A@@@ A@@@ A@@@ A@@@ A@@A A@@A A@@ A A@@0A A@@@A A@@PA A@@`A A@@pA A@@A A@@A A@@A A@@A A@@A A@@A A@@A A@@A A@@A A@@A A@@A A@@A A@@A A@@A A@@A A@@0A@@?0A@@@0A@@@@0A@@@0A@@@0A@@@0A@@@0A@@A0A@@A0A@@ A0A@@0A0A@@@A0A@@PA0A@@`A0A@@pA0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@A0A@@@A@@?@A@@@@A@@@@@A@@@@A@@@@A@@@@A@@@@A@@A@A@@A@A@@ A@A@@0A@A@@@A@A@@PA@A@@`A@A@@pA@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@A@A@@PA@@?PA@@@PA@@@@PA@@@PA@@@PA@@@PA@@@PA@@APA@@APA@@ APA@@0APA@@@APA@@PAPA@@`APA@@pAPA@@APA@@APA@@APA@@APA@@APA@@APA@@APA@@APA@@APA@@APA@@APA@@APA@@APA@@APA@@APA@@`A@@?`A@@@`A@@@@`A@@@`A@@@`A@@@`A@@@`A@@A`A@@A`A@@ A`A@@0A`A@@@A`A@@PA`A@@`A`A@@pA`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@A`A@@pA@@?pA@@@pA@@@@pA@@@pA@@@pA@@@pA@@@pA@@ApA@@ApA@@ ApA@@0ApA@@@ApA@@PApA@@`ApA@@pApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@ApA@@A@@?A@@@A@@@@A@@@A@@@A@@@A@@@A@@AA@@AA@@ AA@@0AA@@@AA@@PAA@@`AA@@pAA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@A@@?A@@@A@@@@A@@@A@@@A@@@A@@@A@@AA@@AA@@ AA@@0AA@@@AA@@PAA@@`AA@@pAA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@A@@?A@@@A@@@@A@@@A@@@A@@@A@@@A@@AA@@AA@@ AA@@0AA@@@AA@@PAA@@`AA@@pAA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@A@@?A@@@A@@@@A@@@A@@@A@@@A@@@A@@AA@@AA@@ AA@@0AA@@@AA@@PAA@@`AA@@pAA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@A@@?A@@@A@@@@A@@@A@@@A@@@A@@@A@@AA@@AA@@ AA@@0AA@@@AA@@PAA@@`AA@@pAA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@?@??@@?@@@?@@?@@?@@?@@?@A?@A?@ A?@0A?@@A?@PA?@`A?@pA?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@ A@? A@@ A@@@ A@@ A@@ A@@ A@@ A@A A@A A@ A A@0A A@@A A@PA A@`A A@pA A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@0A@?0A@@0A@@@0A@@0A@@0A@@0A@@0A@A0A@A0A@ A0A@0A0A@@A0A@PA0A@`A0A@pA0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@@A@?@A@@@A@@@@A@@@A@@@A@@@A@@@A@A@A@A@A@ A@A@0A@A@@A@A@PA@A@`A@A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@PA@?PA@@PA@@@PA@@PA@@PA@@PA@@PA@APA@APA@ APA@0APA@@APA@PAPA@`APA@pAPA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@`A@?`A@@`A@@@`A@@`A@@`A@@`A@@`A@A`A@A`A@ A`A@0A`A@@A`A@PA`A@`A`A@pA`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@pA@?pA@@pA@@@pA@@pA@@pA@@pA@@pA@ApA@ApA@ ApA@0ApA@@ApA@PApA@`ApA@pApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@?@??@@?@@@?@@?@@?@@?@@?@A?@A?@ A?@0A?@@A?@PA?@`A?@pA?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@ A@? A@@ A@@@ A@@ A@@ A@@ A@@ A@A A@A A@ A A@0A A@@A A@PA A@`A A@pA A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@0A@?0A@@0A@@@0A@@0A@@0A@@0A@@0A@A0A@A0A@ A0A@0A0A@@A0A@PA0A@`A0A@pA0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@@A@?@A@@@A@@@@A@@@A@@@A@@@A@@@A@A@A@A@A@ A@A@0A@A@@A@A@PA@A@`A@A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@PA@?PA@@PA@@@PA@@PA@@PA@@PA@@PA@APA@APA@ APA@0APA@@APA@PAPA@`APA@pAPA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@`A@?`A@@`A@@@`A@@`A@@`A@@`A@@`A@A`A@A`A@ A`A@0A`A@@A`A@PA`A@`A`A@pA`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@pA@?pA@@pA@@@pA@@pA@@pA@@pA@@pA@ApA@ApA@ ApA@0ApA@@ApA@PApA@`ApA@pApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@?@??@@?@@@?@@?@@?@@?@@?@A?@A?@ A?@0A?@@A?@PA?@`A?@pA?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@ A@? A@@ A@@@ A@@ A@@ A@@ A@@ A@A A@A A@ A A@0A A@@A A@PA A@`A A@pA A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@0A@?0A@@0A@@@0A@@0A@@0A@@0A@@0A@A0A@A0A@ A0A@0A0A@@A0A@PA0A@`A0A@pA0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@@A@?@A@@@A@@@@A@@@A@@@A@@@A@@@A@A@A@A@A@ A@A@0A@A@@A@A@PA@A@`A@A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@PA@?PA@@PA@@@PA@@PA@@PA@@PA@@PA@APA@APA@ APA@0APA@@APA@PAPA@`APA@pAPA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@`A@?`A@@`A@@@`A@@`A@@`A@@`A@@`A@A`A@A`A@ A`A@0A`A@@A`A@PA`A@`A`A@pA`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@pA@?pA@@pA@@@pA@@pA@@pA@@pA@@pA@ApA@ApA@ ApA@0ApA@@ApA@PApA@`ApA@pApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@@?@@@@@@@@@@@@@@A@A@ A@0A@@A@PA@`A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@?@??@@?@@@?@@?@@?@@?@@?@A?@A?@ A?@0A?@@A?@PA?@`A?@pA?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@A?@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@ A@@@0A@@@@A@@@PA@@@`A@@@pA@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@A@@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@@@?@@@@@@@@@@@@@@@@@@@@@A@@A@@ A@@0A@@@A@@PA@@`A@@pA@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@ A@? A@@ A@@@ A@@ A@@ A@@ A@@ A@A A@A A@ A A@0A A@@A A@PA A@`A A@pA A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@A A@0A@?0A@@0A@@@0A@@0A@@0A@@0A@@0A@A0A@A0A@ A0A@0A0A@@A0A@PA0A@`A0A@pA0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@A0A@@A@?@A@@@A@@@@A@@@A@@@A@@@A@@@A@A@A@A@A@ A@A@0A@A@@A@A@PA@A@`A@A@pA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@PA@?PA@@PA@@@PA@@PA@@PA@@PA@@PA@APA@APA@ APA@0APA@@APA@PAPA@`APA@pAPA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@APA@`A@?`A@@`A@@@`A@@`A@@`A@@`A@@`A@A`A@A`A@ A`A@0A`A@@A`A@PA`A@`A`A@pA`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@A`A@pA@?pA@@pA@@@pA@@pA@@pA@@pA@@pA@ApA@ApA@ ApA@0ApA@@ApA@PApA@`ApA@pApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@ApA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@?A@@A@@@A@@A@@A@@A@@A@AA@AA@ AA@0AA@@AA@PAA@`AA@pAA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A??A@?A@@?A@?A@?A@?A@?AA?AA?A A?A0A?A@A?APA?A`A?ApA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@@A?@@A@@@A@@@@A@@@A@@@A@@@A@@@AA@@AA@@A A@@A0A@@A@A@@APA@@A`A@@ApA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AA? AA@ AA@@ AA@ AA@ AA@ AA@ AAA AAA AA A AA0A AA@A AAPA AA`A AApA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AA0AA?0AA@0AA@@0AA@0AA@0AA@0AA@0AAA0AAA0AA A0AA0A0AA@A0AAPA0AA`A0AApA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AA@AA?@AA@@AA@@@AA@@AA@@AA@@AA@@AAA@AAA@AA A@AA0A@AA@A@AAPA@AA`A@AApA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAPAA?PAA@PAA@@PAA@PAA@PAA@PAA@PAAAPAAAPAA APAA0APAA@APAAPAPAA`APAApAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAA`AA?`AA@`AA@@`AA@`AA@`AA@`AA@`AAA`AAA`AA A`AA0A`AA@A`AAPA`AA`A`AApA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AApAA?pAA@pAA@@pAA@pAA@pAA@pAA@pAAApAAApAA ApAA0ApAA@ApAAPApAA`ApAApApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A@A@@A@A@A@A@AAAAA AA0AA@AAPAA`AApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?A??A@?A@@?A@?A@?A@?A@?AA?AA?A A?A0A?A@A?APA?A`A?ApA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?AA?A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@@A?@@A@@@A@@@@A@@@A@@@A@@@A@@@AA@@AA@@A A@@A0A@@A@A@@APA@@A`A@@ApA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@AA@@A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@A@A?@A@@A@@@A@@A@@A@@A@@AA@AA@A A@A0A@A@A@APA@A`A@ApA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AA@AAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AA? AA@ AA@@ AA@ AA@ AA@ AA@ AAA AAA AA A AA0A AA@A AAPA AA`A AApA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AA0AA?0AA@0AA@@0AA@0AA@0AA@0AA@0AAA0AAA0AA A0AA0A0AA@A0AAPA0AA`A0AApA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AAA0AA@AA?@AA@@AA@@@AA@@AA@@AA@@AA@@AAA@AAA@AA A@AA0A@AA@A@AAPA@AA`A@AApA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAA@AAPAA?PAA@PAA@@PAA@PAA@PAA@PAA@PAAAPAAAPAA APAA0APAA@APAAPAPAA`APAApAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAAAPAA`AA?`AA@`AA@@`AA@`AA@`AA@`AA@`AAA`AAA`AA A`AA0A`AA@A`AAPA`AA`A`AApA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AAA`AApAA?pAA@pAA@@pAA@pAA@pAA@pAA@pAAApAAApAA ApAA0ApAA@ApAAPApAA`ApAApApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAApAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AA@AA@@AA@AA@AA@AA@AAAAAAAA AAA0AAA@AAAPAAA`AAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A? A@ A@@ A@ A@ A@ A@ AA AA A A A0A A@A APA A`A ApA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA A? A?? A@? A@@? A@? A@? A@? A@? AA? AA? A A? A0A? A@A? APA? A`A? ApA? AA? AA? AA? AA? AA? AA? AA? AA? AA? AA? AA? AA? AA? AA? AA? A@ A?@ A@@ A@@@ A@@ A@@ A@@ A@@ AA@ AA@ A A@ A0A@ A@A@ APA@ A`A@ ApA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ A@@ A?@@ A@@@ A@@@@ A@@@ A@@@ A@@@ A@@@ AA@@ AA@@ A A@@ A0A@@ A@A@@ APA@@ A`A@@ ApA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ AA@@ A@ A?@ A@@ A@@@ A@@ A@@ A@@ A@@ AA@ AA@ A A@ A0A@ A@A@ APA@ A`A@ ApA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ A@ A?@ A@@ A@@@ A@@ A@@ A@@ A@@ AA@ AA@ A A@ A0A@ A@A@ APA@ A`A@ ApA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ A@ A?@ A@@ A@@@ A@@ A@@ A@@ A@@ AA@ AA@ A A@ A0A@ A@A@ APA@ A`A@ ApA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ A@ A?@ A@@ A@@@ A@@ A@@ A@@ A@@ AA@ AA@ A A@ A0A@ A@A@ APA@ A`A@ ApA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA@ AA A?A A@A A@@A A@A A@A A@A A@A AAA AAA A AA A0AA A@AA APAA A`AA ApAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AA A?A A@A A@@A A@A A@A A@A A@A AAA AAA A AA A0AA A@AA APAA A`AA ApAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA A A A? A A@ A A@@ A A@ A A@ A A@ A A@ A AA A AA A A A A A0A A A@A A APA A A`A A ApA A AA A AA A AA A AA A AA A AA A AA A AA A AA A AA A AA A AA A AA A AA A AA A A0A A?0A A@0A A@@0A A@0A A@0A A@0A A@0A AA0A AA0A A A0A A0A0A A@A0A APA0A A`A0A ApA0A AA0A AA0A AA0A AA0A AA0A AA0A AA0A AA0A AA0A AA0A AA0A AA0A AA0A AA0A AA0A A@A A?@A A@@A A@@@A A@@A A@@A A@@A A@@A AA@A AA@A A A@A A0A@A A@A@A APA@A A`A@A ApA@A AA@A AA@A AA@A AA@A AA@A AA@A AA@A AA@A AA@A AA@A AA@A AA@A AA@A AA@A AA@A APA A?PA A@PA A@@PA A@PA A@PA A@PA A@PA AAPA AAPA A APA A0APA A@APA APAPA A`APA ApAPA AAPA AAPA AAPA AAPA AAPA AAPA AAPA AAPA AAPA AAPA AAPA AAPA AAPA AAPA AAPA A`A A?`A A@`A A@@`A A@`A A@`A A@`A A@`A AA`A AA`A A A`A A0A`A A@A`A APA`A A`A`A ApA`A AA`A AA`A AA`A AA`A AA`A AA`A AA`A AA`A AA`A AA`A AA`A AA`A AA`A AA`A AA`A ApA A?pA A@pA A@@pA A@pA A@pA A@pA A@pA AApA AApA A ApA A0ApA A@ApA APApA A`ApA ApApA AApA AApA AApA AApA AApA AApA AApA AApA AApA AApA AApA AApA AApA AApA AApA AA A?A A@A A@@A A@A A@A A@A A@A AAA AAA A AA A0AA A@AA APAA A`AA ApAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AA A?A A@A A@@A A@A A@A A@A A@A AAA AAA A AA A0AA A@AA APAA A`AA ApAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AA A?A A@A A@@A A@A A@A A@A A@A AAA AAA A AA A0AA A@AA APAA A`AA ApAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AA A?A A@A A@@A A@A A@A A@A A@A AAA AAA A AA A0AA A@AA APAA A`AA ApAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AA A?A A@A A@@A A@A A@A A@A A@A AAA AAA A AA A0AA A@AA APAA A`AA ApAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAA AAABBB BBBBB B$B(B,B0B4B8BYMp    w NYMpSNODx(   oYMx    5KYMp    ]YMp ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A ASNOD4D0$  ( \OYMh  ( 7dYMh  ( l YMh  ( 3 XYMhSNOD0T8̂܃   ( L YMh??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A?@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@?  ( 3YMh $oYM EKYMXYPressure_2DVelocityX_2DX_1DY_1DZ_1DOriginDxDyDzOrigin2DxDyXYZXYZXYZ2XYZ3PressurePressure2Pressure3VelocityZVelocityZ2VelocityZ3VelocityVelocity2Velocity3StressStress2Stress3IndexesIndexes2h?@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@??@?  !"#$%&'()*+,-./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{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@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{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~LLNL-H5Z-ZFP-092190c/test/print_h5repack_farg.c000066400000000000000000000114621447422177700206500ustar00rootroot00000000000000/* Copyright (c) 2016, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory Written by Mark C. Miller, miller86@llnl.gov LLNL-CODE-707197. All rights reserved. This file is part of H5Z-ZFP. Please also read the BSD license https://raw.githubusercontent.com/LLNL/H5Z-ZFP/master/LICENSE */ #include #include #include #include #if defined(_WIN32) || defined(_WIN64) #define strncasecmp _strnicmp #define strcasecmp _stricmp #endif typedef unsigned int uint; #include "H5Zzfp_plugin.h" #define NAME_LEN 256 /* convenience macro to handle command-line args and help */ #define HANDLE_SEP(SEPSTR) \ { \ char tmpstr[64]; \ int len = snprintf(tmpstr, sizeof(tmpstr), "\n%s...", #SEPSTR);\ printf(" %*s\n",60-len,tmpstr); \ } #define HANDLE_ARG(A,PARSEA,PRINTA,HELPSTR) \ { \ int i; \ char tmpstr[64]; \ int len; \ int len2 = strlen(#A)+1; \ for (i = 0; i < argc; i++) \ { \ if (!strncmp(argv[i], #A"=", len2)) \ { \ A = PARSEA; \ break; \ } \ else if (!strncasecmp(argv[i], "help", 4)) \ { \ return 0; \ } \ } \ len = snprintf(tmpstr, sizeof(tmpstr), "%s=" PRINTA, #A, A);\ printf(" %s%*s\n",tmpstr,60-len,#HELPSTR); \ } static void print_cdvals(int zfpmode, double rate, double acc, uint prec, uint minbits, uint maxbits, uint maxprec, int minexp) { unsigned int cd_values[10] = {0,0,0,0,0,0,0,0,0,0}; int i, cd_nelmts = 10; /* setup zfp filter via generic (cd_values) interface */ if (zfpmode == H5Z_ZFP_MODE_RATE) H5Pset_zfp_rate_cdata(rate, cd_nelmts, cd_values); else if (zfpmode == H5Z_ZFP_MODE_PRECISION) H5Pset_zfp_precision_cdata(prec, cd_nelmts, cd_values); else if (zfpmode == H5Z_ZFP_MODE_ACCURACY) H5Pset_zfp_accuracy_cdata(acc, cd_nelmts, cd_values); else if (zfpmode == H5Z_ZFP_MODE_EXPERT) H5Pset_zfp_expert_cdata(minbits, maxbits, maxprec, minexp, cd_nelmts, cd_values); else if (zfpmode == H5Z_ZFP_MODE_REVERSIBLE) H5Pset_zfp_reversible_cdata(cd_nelmts, cd_values); else return; /* h5repack -f argument format... h5repack -f UD=32013,0,6,3,0,3539053052,1062232653,0,0 */ printf("\nh5repack -f argument...\n"); printf(" -f UD=%u,0,%u", H5Z_FILTER_ZFP, cd_nelmts); for (i = 0; i < cd_nelmts; i++) printf(",%u", cd_values[i]); printf("\n"); } int main(int argc, char **argv) { /* compression parameters (defaults taken from ZFP header) */ int zfpmode = 1; double rate = 3.5; double acc = 0; uint prec = 0; uint minbits = 0; uint maxbits = 0; uint maxprec = 0; int minexp = 0; int help = 0; /* ZFP filter arguments */ HANDLE_SEP(Print cdvals for set of ZFP compression parameters) HANDLE_ARG(zfpmode,(int) strtol(argv[i]+len2,0,10),"%d",set zfp mode (1=rate,2=prec,3=acc,4=expert,5=rev)); HANDLE_ARG(rate,(double) strtod(argv[i]+len2,0),"%g",set rate for rate mode of filter); HANDLE_ARG(acc,(double) strtod(argv[i]+len2,0),"%g",set accuracy for accuracy mode of filter); HANDLE_ARG(prec,(uint) strtol(argv[i]+len2,0,10),"%u",set precision for precision mode of zfp filter); HANDLE_ARG(minbits,(uint) strtol(argv[i]+len2,0,10),"%u",set minbits for expert mode of zfp filter); HANDLE_ARG(maxbits,(uint) strtol(argv[i]+len2,0,10),"%u",set maxbits for expert mode of zfp filter); HANDLE_ARG(maxprec,(uint) strtol(argv[i]+len2,0,10),"%u",set maxprec for expert mode of zfp filter); HANDLE_ARG(minexp,(int) strtol(argv[i]+len2,0,10),"%d",set minexp for expert mode of zfp filter); HANDLE_ARG(help,(int)strtol(argv[i]+len2,0,10),"%d",this help message); /* must be last */ if (!help) print_cdvals(zfpmode, rate, acc, prec, minbits, maxbits, maxprec, minexp); return 0; } LLNL-H5Z-ZFP-092190c/test/test_common.h000066400000000000000000000115071447422177700172670ustar00rootroot00000000000000/* Copyright (c) 2016, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory Written by Mark C. Miller, miller86@llnl.gov LLNL-CODE-707197. All rights reserved. This file is part of H5Z-ZFP. Please also read the BSD license https://raw.githubusercontent.com/LLNL/H5Z-ZFP/master/LICENSE */ #ifndef test_common_H #define test_common_H #ifndef _GNU_SOURCE #define _GNU_SOURCE /* ahead of ALL headers to take proper effect */ #endif #ifdef _MSC_VER #define _CRT_SECURE_NO_DEPRECATE #define _USE_MATH_DEFINES #include #define j0 _j0 #include #define strncasecmp _strnicmp #define strcasecmp _stricmp #include #pragma comment(lib, "Shlwapi.lib") #define strcasestr StrStrIA #define srandom(X) srand(X) #define random rand #define read _read #define open _open #define close _close // strndup() is not available on Windows char *strndup( const char *s1, size_t n) { char *copy= (char*)malloc( n+1 ); memcpy( copy, s1, n ); copy[n] = 0; return copy; }; #else #include #include #endif #include #include #include #include #include #include #include "hdf5.h" #define NAME_LEN 256 /* convenience macro to handle command-line args and help */ #define HANDLE_SEP(SEPSTR) \ { \ char tmpstr[64]; \ int len = snprintf(tmpstr, sizeof(tmpstr), "\n%s...", #SEPSTR);\ printf(" %*s\n",60-len,tmpstr); \ } #define HANDLE_ARG(A,PARSEA,PRINTA,HELPSTR) \ { \ int i; \ char tmpstr[64]; \ int len; \ int len2 = strlen(#A)+1; \ for (i = 0; i < argc; i++) \ { \ if (!strncmp(argv[i], #A"=", len2)) \ { \ A = PARSEA; \ break; \ } \ else if (!strncasecmp(argv[i], "help", 4)) \ { \ return 0; \ } \ } \ len = snprintf(tmpstr, sizeof(tmpstr), "%s=" PRINTA, #A, A);\ printf(" %s%*s\n",tmpstr,60-len,#HELPSTR); \ } /* convenience macro to handle errors */ #ifdef _MSC_VER #define SET_ERROR(FNAME) \ do { \ size_t errmsglen = 94; \ char errmsg[errmsglen]; \ strerror_s(errmsg, errmsglen, errno); \ fprintf(stderr, #FNAME " failed at line %d, errno=%d (%s)\n", \ __LINE__, errno, errno?errmsg:"ok"); \ return 1; \ } while(0) #else #define SET_ERROR(FNAME) \ do { \ int _errno = errno; \ fprintf(stderr, #FNAME " failed at line %d, errno=%d (%s)\n", \ __LINE__, _errno, _errno?strerror(_errno):"ok"); \ return 1; \ } while(0) #endif /* Generate a simple, 1D sinusioidal data array with some noise */ #define TYPINT 1 #define TYPDBL 2 static int gen_data(size_t npoints, double noise, double amp, void **_buf, int typ) { size_t i; double *pdbl = 0; int *pint = 0; /* create data buffer to write */ if (typ == TYPINT) pint = (int *) malloc(npoints * sizeof(int)); else pdbl = (double *) malloc(npoints * sizeof(double)); srandom(0xDeadBeef); for (i = 0; i < npoints; i++) { double x = 2 * M_PI * (double) i / (double) (npoints-1); double n = noise * ((double) random() / ((double)(1<<31)-1) - 0.5); if (typ == TYPINT) pint[i] = (int) (amp * (1 + sin(x)) + n); else pdbl[i] = (double) (amp * (1 + sin(x)) + n); } if (typ == TYPINT) *_buf = pint; else *_buf = pdbl; return 0; } #endif /* test_common_H */ LLNL-H5Z-ZFP-092190c/test/test_error.c000066400000000000000000000200671447422177700171240ustar00rootroot00000000000000/* Copyright (c) 2016, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory Written by Mark C. Miller, miller86@llnl.gov LLNL-CODE-707197. All rights reserved. This file is part of H5Z-ZFP. Please also read the BSD license https://raw.githubusercontent.com/LLNL/H5Z-ZFP/master/LICENSE */ #include "test_common.h" #ifdef H5Z_ZFP_USE_PLUGIN #include "H5Zzfp_plugin.h" #else #include "H5Zzfp_lib.h" #include "H5Zzfp_props.h" #endif static hid_t setup_filter(int n, hsize_t *chunk, int zfpmode, double rate, double acc, unsigned int prec, unsigned int minbits, unsigned int maxbits, unsigned int maxprec, int minexp) { hid_t cpid; /* setup dataset creation properties */ if (0 > (cpid = H5Pcreate(H5P_DATASET_CREATE))) SET_ERROR(H5Pcreate); if (0 > H5Pset_chunk(cpid, n, chunk)) SET_ERROR(H5Pset_chunk); /* When filter is used as a library, we need to init it */ H5Z_zfp_initialize(); /* Setup the filter using properties interface. These calls also add the filter to the pipeline */ if (zfpmode == H5Z_ZFP_MODE_RATE) H5Pset_zfp_rate(cpid, rate); else if (zfpmode == H5Z_ZFP_MODE_PRECISION) H5Pset_zfp_precision(cpid, prec); else if (zfpmode == H5Z_ZFP_MODE_ACCURACY) H5Pset_zfp_accuracy(cpid, acc); else if (zfpmode == H5Z_ZFP_MODE_EXPERT) H5Pset_zfp_expert(cpid, minbits, maxbits, maxprec, minexp); else if (zfpmode == H5Z_ZFP_MODE_REVERSIBLE) H5Pset_zfp_reversible(cpid); return cpid; } typedef struct client_data {char const *str; int has_str;} client_data_t; static int walk_hdf5_error_stack_cb(unsigned int n, H5E_error_t const *err_desc, void *_cd) { client_data_t *cd = (client_data_t *) _cd; if (n > 0) return 0; cd->has_str = strcasestr(err_desc->desc, cd->str) != 0; return 0; } static int check_hdf5_error_stack_for_string(char const *str) { client_data_t cd = {str, 0}; H5Ewalk(H5E_DEFAULT, H5E_WALK_UPWARD, walk_hdf5_error_stack_cb, &cd); return cd.has_str; } #define DSIZE 2048 #define FNAME "test_zfp_errors.h5" int main(int argc, char **argv) { int i, ndiffs; unsigned corrupt[4] = {0xDeadBeef,0xBabeFace, 0xDeadBabe, 0xBeefFace}; double d = 1.0, *buf = 0, rbuf[DSIZE]; hsize_t chunk[] = {DSIZE,16,16,16,16}; haddr_t off; hsize_t siz; /* HDF5 related variables */ hid_t fid, tid, dsid, sid, cpid; int help = 0; /* compression parameters (defaults taken from ZFP header) */ int zfpmode = H5Z_ZFP_MODE_ACCURACY; double rate = 4; double acc = 0.1; unsigned int prec = 11; unsigned int minbits = 0; unsigned int maxbits = 4171; unsigned int maxprec = 64; int minexp = -1074; /* ZFP filter arguments */ HANDLE_SEP(ZFP compression parameters) HANDLE_ARG(zfpmode,(int) strtol(argv[i]+len2,0,10),"%d", (1=rate,2=prec,3=acc,4=expert,5=reversible)); HANDLE_ARG(rate,(double) strtod(argv[i]+len2,0),"%g",set rate for rate mode); HANDLE_ARG(acc,(double) strtod(argv[i]+len2,0),"%g",set accuracy for accuracy mode); HANDLE_ARG(prec,(unsigned int) strtol(argv[i]+len2,0,10),"%u",set precision for precision mode); HANDLE_ARG(minbits,(unsigned int) strtol(argv[i]+len2,0,10),"%u",set minbits for expert mode); HANDLE_ARG(maxbits,(unsigned int) strtol(argv[i]+len2,0,10),"%u",set maxbits for expert mode); HANDLE_ARG(maxprec,(unsigned int) strtol(argv[i]+len2,0,10),"%u",set maxprec for expert mode); HANDLE_ARG(minexp,(int) strtol(argv[i]+len2,0,10),"%d",set minexp for expert mode); cpid = setup_filter(1, chunk, zfpmode, rate, acc, prec, minbits, maxbits, maxprec, minexp); /* Put this after setup_filter to permit printing of otherwise hard to construct cd_values to facilitate manual invokation of h5repack */ HANDLE_ARG(help,(int)strtol(argv[i]+len2,0,10),"%d",this help message); /* must be last for help to work */ gen_data(DSIZE, 0.01, 10, (void**)&buf, TYPDBL); H5Eset_auto(H5E_DEFAULT, 0, 0); /* setup the 1D data space */ if (0 > (sid = H5Screate_simple(1, chunk, 0))) SET_ERROR(H5Screate_simple); /* create HDF5 file */ if (0 > (fid = H5Fcreate(FNAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))) SET_ERROR(H5Fcreate); /* test incorrect data type */ tid = H5Tcreate(H5T_STRING, 8); if (0 <= (dsid = H5Dcreate(fid, "bad_type", tid, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); #if defined(ZFP_LIB_VERSION) && ZFP_LIB_VERSION<=0x052 assert(check_hdf5_error_stack_for_string("requires datatype class of H5T_FLOAT")); #else assert(check_hdf5_error_stack_for_string("requires datatype class of H5T_FLOAT or H5T_INTEGER")); #endif H5Tclose(tid); /* test invalid size of data type */ tid = H5Tcopy(H5T_NATIVE_DOUBLE); H5Tset_size(tid, 9); if (0 <= (dsid = H5Dcreate(fid, "bad_type_size", tid, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); assert(check_hdf5_error_stack_for_string("requires datatype size of 4 or 8")); H5Tclose(tid); /* test invalid chunking on highd data */ cpid = setup_filter(5, chunk, zfpmode, rate, acc, prec, minbits, maxbits, maxprec, minexp); if (0 <= (dsid = H5Dcreate(fid, "bad_chunking", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); #if defined(ZFP_LIB_VERSION) && ZFP_LIB_VERSION<=0x053 assert(check_hdf5_error_stack_for_string("chunk must have only 1...3 non-unity dimensions")); #else assert(check_hdf5_error_stack_for_string("chunk must have only 1...4 non-unity dimensions")); #endif H5Pclose(cpid); /* write a compressed dataset to be corrupted later */ cpid = setup_filter(1, chunk, zfpmode, rate, acc, prec, minbits, maxbits, maxprec, minexp); if (0 > (dsid = H5Dcreate(fid, "corrupted_data", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)) SET_ERROR(H5Dwrite); off = 3496; // H5Dget_offset(dsid); siz = H5Dget_storage_size(dsid); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); if (0 > H5Pclose(cpid)) SET_ERROR(H5Pclose); /* write a compressed dataset with some nans and infs */ cpid = setup_filter(1, chunk, zfpmode, rate, acc, prec, minbits, maxbits, maxprec, minexp); if (0 > (dsid = H5Dcreate(fid, "nans_and_infs", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); memcpy(rbuf, buf, sizeof(rbuf)); for (i = 7; i < 7+4; i++) rbuf[i] = d/(d-1.0); rbuf[42] = sqrt((double)-1.0); rbuf[42+1] = sqrt((double)-1.0); if (0 > H5Dwrite(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf)) SET_ERROR(H5Dwrite); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); if (0 > H5Pclose(cpid)) SET_ERROR(H5Pclose); if (0 > H5Fclose(fid)) SET_ERROR(H5Fclose); /* Use raw file I/O to corrupt the dataset named corrupted_data */ FILE *fp; fp = fopen(FNAME, "rb+"); if(fp == NULL) SET_ERROR(fopen); fseek(fp, (off_t) off + (off_t) siz / 3, SEEK_SET); fwrite(corrupt, 1 , sizeof(corrupt), fp); fclose(fp); /* Now, open the file with the nans_and_infs and corrupted datasets and try to read them */ if (0 > (fid = H5Fopen(FNAME, H5F_ACC_RDONLY, H5P_DEFAULT))) SET_ERROR(H5Fopen); if (0 > (dsid = H5Dopen(fid, "nans_and_infs", H5P_DEFAULT))) SET_ERROR(H5Dopen); if (0 > H5Dread(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf)) SET_ERROR(H5Dread); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); for (i = 0, ndiffs = 0; i < DSIZE; i++) { double d = fabs(rbuf[i] - buf[i]); if (d > acc) ndiffs++; } assert(ndiffs == 10); if (0 > (dsid = H5Dopen(fid, "corrupted_data", H5P_DEFAULT))) SET_ERROR(H5Dopen); if (0 > H5Dread(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf)) SET_ERROR(H5Dread); for (i = 0, ndiffs = 0; i < DSIZE; i++) { double d = fabs(rbuf[i] - buf[i]); if (d > acc) ndiffs++; } assert(ndiffs == 1408); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); free(buf); if (0 > H5Fclose(fid)) SET_ERROR(H5Fclose); H5close(); return 0; } LLNL-H5Z-ZFP-092190c/test/test_read.c000066400000000000000000000152231447422177700167040ustar00rootroot00000000000000/* Copyright (c) 2016, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory Written by Mark C. Miller, miller86@llnl.gov LLNL-CODE-707197 All rights reserved. This file is part of H5Z-ZFP. For details, see https://github.com/LLNL/H5Z-ZFP. Please also read the Additional BSD Notice. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the disclaimer below. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the disclaimer (as noted below) in the documentation and/or other materials provided with the distribution. * Neither the name of the LLNS/LLNL nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Additional BSD Notice 1. This notice is required to be provided under our contract with the U.S. Department of Energy (DOE). This work was produced at Lawrence Livermore National Laboratory under Contract No. DE-AC52-07NA27344 with the DOE. 2. Neither the United States Government nor Lawrence Livermore National Security, LLC 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. 3. Also, reference herein to any specific commercial products, process, or services by trade name, trademark, manufacturer or otherwise does not necessarily constitute or imply its endorsement, recommendation, or favoring by the United States Government or Lawrence Livermore National Security, LLC. The views and opinions of authors expressed herein do not necessarily state or reflect those of the United States Government or Lawrence Livermore National Security, LLC, and shall not be used for advertising or product endorsement purposes. */ #include "test_common.h" #ifndef H5Z_ZFP_USE_PLUGIN #include "H5Zzfp_lib.h" #endif int main(int argc, char **argv) { int i, help=0; double *obuf, *cbuf; /* filename variables */ char *ifile = (char *) calloc(NAME_LEN,sizeof(char)); /* HDF5 dataset info */ hid_t fid, dsid, space_id; hsize_t npoints; /* absolute and relative differencing thresholds */ double max_absdiff = 0; double max_reldiff = 0; /* actual absolute and relative differences observed */ double actual_max_absdiff = 0; double actual_max_reldiff = 0; int num_absdiffs = 0; int num_reldiffs = 0; int doint = 0; int ret = 0; /* file arguments */ strcpy(ifile, "test_zfp.h5"); HANDLE_ARG(ifile,strndup(argv[i]+len2,NAME_LEN), "\"%s\"",set input filename); HANDLE_ARG(max_absdiff,strtod(argv[i]+len2,0),"%g",set maximum absolute diff); HANDLE_ARG(max_reldiff,strtod(argv[i]+len2,0),"%g",set maximum relative diff); HANDLE_ARG(doint,(int) strtol(argv[i]+len2,0,10),"%d",check integer datasets instead); HANDLE_ARG(ret,(int) strtol(argv[i]+len2,0,10),"%d",return 1 if diffs (0=all,1=abs,2=rel)); HANDLE_ARG(help,(int)strtol(argv[i]+len2,0,10),"%d",this help message); #ifndef H5Z_ZFP_USE_PLUGIN H5Z_zfp_initialize(); #endif /* open the HDF5 file */ if (0 > (fid = H5Fopen(ifile, H5F_ACC_RDONLY, H5P_DEFAULT))) SET_ERROR(H5Fopen); /* read the original dataset */ if (0 > (dsid = H5Dopen(fid, doint?"int_original":"original", H5P_DEFAULT))) SET_ERROR(H5Dopen); if (0 > (space_id = H5Dget_space(dsid))) SET_ERROR(H5Dget_space); if (0 == (npoints = H5Sget_simple_extent_npoints(space_id))) SET_ERROR(H5Sget_simple_extent_npoints); if (0 > H5Sclose(space_id)) SET_ERROR(H5Sclose); if (0 == (obuf = (double *) malloc(npoints * sizeof(double)))) SET_ERROR(malloc); if (0 > H5Dread(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, obuf)) SET_ERROR(H5Dread); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); /* read the compressed dataset */ if (0 > (dsid = H5Dopen(fid, doint?"int_compressed":"compressed", H5P_DEFAULT))) SET_ERROR(H5Dopen); if (0 == (cbuf = (double *) malloc(npoints * sizeof(double)))) SET_ERROR(malloc); if (0 > H5Dread(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, cbuf)) SET_ERROR(H5Dread); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); /* clean up */ if (0 > H5Fclose(fid)) SET_ERROR(H5Fclose); /* compare original to compressed */ for (i = 0; i < npoints; i++) { double absdiff = obuf[i] - cbuf[i]; if (absdiff < 0) absdiff = -absdiff; if (absdiff > 0) { double reldiff = 0; if (obuf[i] != 0) reldiff = absdiff / obuf[i]; if (absdiff > actual_max_absdiff) actual_max_absdiff = absdiff; if (reldiff > actual_max_reldiff) actual_max_reldiff = reldiff; if (absdiff > max_absdiff) num_absdiffs++; if (reldiff > max_reldiff) num_reldiffs++; } } printf("Absolute Diffs: %d values are different; actual-max-absdiff = %g\n", num_absdiffs, actual_max_absdiff); printf("Relative Diffs: %d values are different; actual-max-reldiff = %g\n", num_reldiffs, actual_max_reldiff); #ifndef H5Z_ZFP_USE_PLUGIN /* When filter is used as a library, we need to finalize it */ H5Z_zfp_finalize(); #endif free(obuf); free(cbuf); free(ifile); if (ret == 0) return (num_absdiffs+num_reldiffs)>0; if (ret == 1) return num_absdiffs>0; if (ret == 2) return num_reldiffs>0; return 0; } LLNL-H5Z-ZFP-092190c/test/test_rw_fortran.F90000066400000000000000000000372221447422177700202730ustar00rootroot00000000000000PROGRAM main USE ISO_C_BINDING USE ISO_FORTRAN_ENV, ONLY: ERROR_UNIT, OUTPUT_UNIT USE HDF5 USE h5zzfp_props_f IMPLICIT NONE INTEGER, PARAMETER :: dp = C_DOUBLE INTEGER, PARAMETER :: NAME_LEN=256 INTEGER, PARAMETER :: DIM0=32 INTEGER, PARAMETER :: DIM1=64 INTEGER, PARAMETER :: CHUNK0=4 INTEGER, PARAMETER :: CHUNK1=8 INTEGER :: i INTEGER(hsize_t) :: j ! sinusoid data generation variables INTEGER(hsize_t) :: npoints ! compression parameters (defaults taken from ZFP header) INTEGER(C_INT) :: zfpmode = 3 !1=rate, 2=prec, 3=acc, 4=expert REAL(dp) :: rate = 4_c_double REAL(dp) :: acc = 0_c_double INTEGER(C_INT) :: prec = 11 INTEGER(C_INT) :: dim = 0 INTEGER(C_INT), PARAMETER :: minbits = 0 INTEGER(C_INT), PARAMETER :: maxbits = 4171 INTEGER(C_INT), PARAMETER :: maxprec = 64 INTEGER(C_INT), PARAMETER :: minexp = -1074 ! HDF5 related variables INTEGER(hid_t) fid, dsid, sid, cpid, dcpl_id, space_id INTEGER(C_INT), DIMENSION(1:H5Z_ZFP_CD_NELMTS_MEM) :: cd_values INTEGER(C_SIZE_T) :: cd_nelmts = H5Z_ZFP_CD_NELMTS_MEM ! compressed/uncompressed difference stat variables REAL(dp) :: max_absdiff = 1.e-8_dp REAL(dp) :: max_reldiff = 1.e-8_dp INTEGER(C_INT) :: num_diffs = 0 REAL(dp) :: noise = 0.001 REAL(dp) :: amp = 17.7 REAL(dp), DIMENSION(1:DIM0,1:DIM1), TARGET :: wdata INTEGER(hsize_t), DIMENSION(1:2) :: dims = (/DIM0, DIM1/) INTEGER(hsize_t), DIMENSION(1:2) :: dims1; INTEGER(hsize_t), DIMENSION(1:2) :: chunk2 = (/CHUNK0, CHUNK1/) INTEGER(hsize_t), DIMENSION(1:1) :: chunk256 = (/256/) REAL(dp), DIMENSION(:), ALLOCATABLE, TARGET :: obuf, cbuf, cbuf1, cbuf2 CHARACTER(LEN=180) :: ofile="test_zfp_fortran.h5" INTEGER :: status TYPE(C_PTR) :: f_ptr INTEGER, PARAMETER :: H5Z_FLAG_MANDATORY = INT(Z'00000000') REAL(dp) :: absdiff, reldiff INTERFACE LOGICAL FUNCTION real_eq(a,b,ulp) USE ISO_C_BINDING IMPLICIT NONE REAL(C_DOUBLE), INTENT (in):: a,b REAL(C_DOUBLE) :: Rel INTEGER, OPTIONAL, INTENT( IN ) :: ulp END FUNCTION real_eq END INTERFACE CHARACTER(LEN=180) :: arg INTEGER :: len LOGICAL :: write_only = .FALSE., avail INTEGER :: config_flag = 0 ! for h5zget_filter_info_f INTEGER :: config_flag_both = 0 ! for h5zget_filter_info_f INTEGER :: nerr = 0 DO i = 1, COMMAND_ARGUMENT_COUNT() CALL GET_COMMAND_ARGUMENT(i,arg,len,status) IF (status .NE. 0) THEN WRITE (ERROR_UNIT,*) 'get_command_argument failed: status = ', status, ' arg = ', i STOP 1 END IF IF(arg(1:len).EQ.'zfpmode') THEN CALL GET_COMMAND_ARGUMENT(i+1,arg,len,status) IF (status .NE. 0) THEN WRITE (ERROR_UNIT,*) 'get_command_argument failed: status = ', status, ' arg = ', i STOP 1 END IF READ(arg(1:len), *) zfpmode ELSE IF (arg(1:len).EQ.'rate')THEN CALL GET_COMMAND_ARGUMENT(i+1,arg,len,status) IF (status .NE. 0) THEN WRITE (ERROR_UNIT,*) 'get_command_argument failed: status = ', status, ' arg = ', i STOP 1 END IF READ(arg(1:len), *) rate ELSE IF (arg(1:len).EQ.'acc')THEN CALL GET_COMMAND_ARGUMENT(i+1,arg,len,status) IF (status .NE. 0) THEN WRITE (ERROR_UNIT,*) 'get_command_argument failed: status = ', status, ' arg = ', i STOP 1 END IF READ(arg(1:len), *) acc ELSE IF (arg(1:len).EQ.'dim')THEN CALL GET_COMMAND_ARGUMENT(i+1,arg,len,status) IF (status .NE. 0) THEN WRITE (ERROR_UNIT,*) 'get_command_argument failed: status = ', status, ' arg = ', i STOP 1 END IF READ(arg(1:len), *) dim ELSE IF (arg(1:len).EQ.'prec')THEN CALL GET_COMMAND_ARGUMENT(i+1,arg,len,status) IF (status .NE. 0) THEN WRITE (ERROR_UNIT,*) 'get_command_argument failed: status = ', status, ' arg = ', i STOP 1 END IF READ(arg(1:len), *) prec ELSE IF (arg(1:len).EQ.'ofile')THEN CALL GET_COMMAND_ARGUMENT(i+1,arg,len,status) IF (status .NE. 0) THEN WRITE (ERROR_UNIT,*) 'get_command_argument failed: status = ', status, ' arg = ', i STOP 1 END IF READ(arg(1:len), *) ofile ELSE IF (arg(1:len).EQ.'write')THEN write_only = .TRUE. ELSE IF (INDEX(arg(1:len),'help').NE.0)THEN PRINT*," *** USAGE *** " PRINT*,"zfpmode - 1=rate,2=prec,3=acc,4=expert,5=reversible" PRINT*,"rate - set rate for rate mode of filter" PRINT*,"acc - set accuracy for accuracy mode of filter" PRINT*,"prec - set PRECISION for PRECISION mode of zfp filter" PRINT*,"dim - set size of 1D dataset used" PRINT*,"ofile - set the output file" PRINT*,"write - only write the file" STOP 1 ENDIF END DO ! create data to write if we're not reading from an existing file IF (dim .EQ. 0) THEN CALL gen_data(INT(dim1*dim0, c_size_t), noise, amp, wdata) ELSE CALL gen_data(INT(dim, c_size_t), noise, amp, wdata) END IF CALL h5open_f(status) CALL check("h5open_f", status, nerr) ! initialize the ZFP filter status = H5Z_zfp_initialize() CALL check("H5Z_zfp_initialize", status, nerr) ! create HDF5 file CALL h5fcreate_f(ofile, H5F_ACC_TRUNC_F, fid, status) CALL check("h5fcreate_f", status, nerr) ! setup dataset compression via cd_values CALL h5pcreate_f(H5P_DATASET_CREATE_F, cpid, status) CALL check("h5pcreate_f", status, nerr) IF (dim .EQ. 0) THEN CALL h5pset_chunk_f(cpid, 2, chunk2, status) CALL check("h5pset_chunk_f", status, nerr) ELSE CALL h5pset_chunk_f(cpid, 1, chunk256, status) CALL check("h5pset_chunk_f", status, nerr) END IF ! ! Check that filter is registered with the library now. ! If it is registered, retrieve filter's configuration. ! CALL H5Zfilter_avail_f(H5Z_FILTER_ZFP, avail, status) CALL check("H5Zfilter_avail_f", status, nerr) IF (avail) THEN CALL h5zget_filter_info_f(H5Z_FILTER_ZFP, config_flag, status) CALL check("h5zget_filter_info_f", status, nerr) ! ! Make sure h5zget_filter_info_f returns the right flag ! config_flag_both=IOR(H5Z_FILTER_ENCODE_ENABLED_F,H5Z_FILTER_DECODE_ENABLED_F) IF (config_flag .NE. config_flag_both) THEN IF(config_flag .NE. H5Z_FILTER_DECODE_ENABLED_F) THEN PRINT*,'h5zget_filter_info_f config_flag failed' ENDIF ENDIF ENDIF ! setup the 2D data space IF (dim .EQ. 0) THEN CALL h5screate_simple_f(2, dims, sid, status) CALL check("h5screate_simple_f", status, nerr) ELSE dims1 = (/dim, 1/) CALL h5screate_simple_f(1, dims1, sid, status) CALL check("h5screate_simple_f", status, nerr) END IF ! write the data WITHOUT compression CALL h5dcreate_f(fid, "original", H5T_NATIVE_DOUBLE, sid, dsid, status) CALL check("h5dcreate_f", status, nerr) f_ptr = C_LOC(wdata(1,1)) CALL h5dwrite_f(dsid, H5T_NATIVE_DOUBLE, f_ptr, status) CALL check("h5dwrite_f", status, nerr) CALL h5dclose_f(dsid,status) CALL check("h5dclose_f", status, nerr) ! write data using default parameters cd_nelmts = 0 CALL H5Pset_filter_f(cpid, H5Z_FILTER_ZFP, H5Z_FLAG_MANDATORY, cd_nelmts, cd_values, status) CALL check("H5Pset_filter_f", status, nerr) CALL h5dcreate_f(fid, "compressed-default", H5T_NATIVE_DOUBLE, sid, dsid, status, dcpl_id=cpid) CALL check("h5dcreate_f", status, nerr) f_ptr = C_LOC(wdata(1,1)) CALL h5dwrite_f(dsid, H5T_NATIVE_DOUBLE, f_ptr, status) CALL check("h5dwrite_f", status, nerr) IF(status.NE.0) PRINT*,"h5dwrite_f failed" CALL h5dclose_f(dsid,status) CALL check("h5dclose_f", status, nerr) ! write the data using properties CALL H5Premove_filter_f(cpid, H5Z_FILTER_ZFP, status) IF (zfpmode .EQ. H5Z_ZFP_MODE_RATE) THEN status = H5Pset_zfp_rate(cpid, rate) CALL check("H5Pset_zfp_rate", status, nerr) ELSE IF (zfpmode .EQ. H5Z_ZFP_MODE_PRECISION) THEN status = H5Pset_zfp_precision(cpid, prec) CALL check("H5Pset_zfp_precision", status, nerr) ELSE IF (zfpmode .EQ. H5Z_ZFP_MODE_ACCURACY)THEN status = H5Pset_zfp_accuracy(cpid, acc) CALL check("H5Pset_zfp_accuracy", status, nerr) ELSE IF (zfpmode .EQ. H5Z_ZFP_MODE_EXPERT) THEN status = H5Pset_zfp_expert(cpid, minbits, maxbits, maxprec, minexp) CALL check("H5Pset_zfp_expert", status, nerr) ELSE IF (zfpmode .EQ. H5Z_ZFP_MODE_REVERSIBLE) THEN status = H5Pset_zfp_reversible(cpid) CALL check("H5Pset_zfp_reversible", status, nerr) ENDIF CALL check("H5Pset_filter_f", status, nerr) CALL h5dcreate_f(fid, "compressed", H5T_NATIVE_DOUBLE, sid, dsid, status, dcpl_id=cpid) CALL check("h5dcreate_f", status, nerr) f_ptr = C_LOC(wdata(1,1)) CALL h5dwrite_f(dsid, H5T_NATIVE_DOUBLE, f_ptr, status) CALL check("h5dwrite_f", status, nerr) CALL h5dclose_f(dsid,status) CALL check("h5dclose_f", status, nerr) ! write the data using plug-in CALL H5Premove_filter_f(cpid, H5Z_FILTER_ZFP, status) cd_values = 0 cd_nelmts = H5Z_ZFP_CD_NELMTS_MEM IF (zfpmode .EQ. H5Z_ZFP_MODE_RATE) THEN CALL H5Pset_zfp_rate_cdata(rate, cd_nelmts, cd_values) IF(cd_values(1).NE.1 .OR. cd_nelmts.NE.4)THEN PRINT*,'H5Pset_zfp_rate_cdata failed' STOP 1 ENDIF ELSE IF (zfpmode .EQ. H5Z_ZFP_MODE_PRECISION) THEN CALL H5Pset_zfp_precision_cdata(prec, cd_nelmts, cd_values) IF(cd_values(1).NE.2 .OR. cd_nelmts.NE.3)THEN PRINT*,'H5Pset_zfp_precision_cdata failed' STOP 1 ENDIF ELSE IF (zfpmode .EQ. H5Z_ZFP_MODE_ACCURACY)THEN CALL H5Pset_zfp_accuracy_cdata(0._dp, cd_nelmts, cd_values) IF(cd_values(1).NE.3 .OR. cd_nelmts.NE.4)THEN PRINT*,'H5Pset_zfp_accuracy_cdata failed' STOP 1 ENDIF ELSE IF (zfpmode .EQ. H5Z_ZFP_MODE_EXPERT) THEN CALL H5Pset_zfp_expert_cdata(minbits, maxbits, maxprec, minexp, cd_nelmts, cd_values) IF(cd_values(1).NE.4 .OR. cd_nelmts.NE.6)THEN PRINT*,'H5Pset_zfp_expert_cdata failed' STOP 1 ENDIF ELSE IF (zfpmode .EQ. H5Z_ZFP_MODE_REVERSIBLE) THEN CALL H5Pset_zfp_reversible_cdata(cd_nelmts, cd_values) IF(cd_values(1).NE.5 .OR. cd_nelmts.NE.1)THEN PRINT*,'H5Pset_zfp_reversible_cdata failed' STOP 1 ENDIF ENDIF CALL H5Pset_filter_f(cpid, H5Z_FILTER_ZFP, H5Z_FLAG_MANDATORY, cd_nelmts, cd_values, status) CALL check("H5Pset_filter_f", status, nerr) CALL h5dcreate_f(fid, "compressed-plugin", H5T_NATIVE_DOUBLE, sid, dsid, status, dcpl_id=cpid) CALL check("h5dcreate_f", status, nerr) f_ptr = C_LOC(wdata(1,1)) CALL h5dwrite_f(dsid, H5T_NATIVE_DOUBLE, f_ptr, status) CALL check("h5dwrite_f", status, nerr) CALL h5dclose_f(dsid,status) CALL check("h5dclose_f", status, nerr) ! clean up CALL h5pclose_f(cpid, status) CALL check("", status, nerr) CALL h5sclose_f(sid, status) CALL check("", status, nerr) CALL h5fclose_f(fid, status) CALL check("", status, nerr) IF(write_only) STOP CALL h5fopen_f(ofile, H5F_ACC_RDONLY_F, fid, status) CALL check("h5fopen_f", status, nerr) ! read the original dataset CALL h5dopen_f (fid, "original", dsid, status) CALL check("h5dopen_f", status, nerr) CALL h5dget_space_f(dsid, space_id,status) CALL check("h5dget_space_f", status, nerr) CALL H5Sget_simple_extent_npoints_f(space_id, npoints, status) CALL check("H5Sget_simple_extent_npoints_f", status, nerr) CALL H5Sclose_f(space_id, status) CALL check("H5Sclose_f", status, nerr) ALLOCATE(obuf(1:npoints)) f_ptr = C_LOC(obuf(1)) CALL H5Dread_f(dsid, H5T_NATIVE_DOUBLE, f_ptr, status) CALL check("H5Dread_f", status, nerr) CALL H5Dclose_f(dsid, status) CALL check("H5Dclose_f", status, nerr) ! read the compressed dataset CALL h5dopen_f (fid, "compressed-default", dsid, status) CALL check("", status, nerr) CALL H5Dget_create_plist_f(dsid, dcpl_id, status ) CALL check("", status, nerr) ALLOCATE(cbuf(1:npoints)) f_ptr = C_LOC(cbuf(1)) CALL H5Dread_f(dsid, H5T_NATIVE_DOUBLE, f_ptr, status) CALL check("H5Dread_f", status, nerr) CALL H5Dclose_f(dsid, status) CALL check("H5Dclose_f", status, nerr) ! read the compressed dataset CALL h5dopen_f (fid, "compressed", dsid, status) CALL check("", status, nerr) CALL H5Dget_create_plist_f(dsid, dcpl_id, status ) CALL check("", status, nerr) ALLOCATE(cbuf1(1:npoints)) f_ptr = C_LOC(cbuf1(1)) CALL H5Dread_f(dsid, H5T_NATIVE_DOUBLE, f_ptr, status) CALL check("H5Dread_f", status, nerr) CALL H5Dclose_f(dsid, status) CALL check("H5Dclose_f", status, nerr) ! read the compressed dataset (plugin) CALL h5dopen_f (fid, "compressed-plugin", dsid, status) CALL check("", status, nerr) CALL H5Dget_create_plist_f(dsid, dcpl_id, status ) CALL check("", status, nerr) ALLOCATE(cbuf2(1:npoints)) f_ptr = C_LOC(cbuf2(1)) CALL H5Dread_f(dsid, H5T_NATIVE_DOUBLE, f_ptr, status) CALL check("H5Dread_f", status, nerr) CALL H5Dclose_f(dsid, status) CALL check("H5Dclose_f", status, nerr) ! clean up CALL H5Pclose_f(dcpl_id, status) CALL check("H5Pclose_f", status, nerr) CALL H5Fclose_f(fid, status) CALL check("H5Fclose_f", status, nerr) ! compare to generated data DO j = 1, npoints absdiff = obuf(j) - cbuf(j) if(absdiff < 0) absdiff = -absdiff IF(absdiff > max_absdiff) THEN reldiff = 0 IF (obuf(j) .NE. 0) reldiff = absdiff / obuf(j) IF (absdiff > max_absdiff) max_absdiff = absdiff IF (reldiff > max_reldiff) max_reldiff = reldiff IF( .NOT.real_eq(obuf(j), cbuf(j), 100) ) THEN num_diffs = num_diffs + 1 ENDIF ENDIF ENDDO IF(num_diffs.NE.0)THEN WRITE(ERROR_UNIT,'(A)') "Fortran read/write test Failed" WRITE(ERROR_UNIT,'(I0," values are different; max-absdiff = ",E15.8,", max-reldiff = ",E15.8)') & num_diffs,max_absdiff, max_reldiff STOP 1 ELSE IF(nerr.NE.0)THEN WRITE(ERROR_UNIT,'(A)') "Fortran read/write test Failed" STOP 1 ELSE WRITE(OUTPUT_UNIT,'(A)') "Fortran read/write test Passed" ENDIF DEALLOCATE(obuf, cbuf, cbuf1, cbuf2) ! initialize the ZFP filter status = H5Z_zfp_finalize() CALL check("H5Z_zfp_finalize", status, nerr) CALL H5close_f(status) CALL EXIT(0) END PROGRAM main ! Generate a simple, 1D sinusioidal data array with some noise SUBROUTINE gen_data(npoints, noise, amp, buf) USE ISO_C_BINDING IMPLICIT NONE INTEGER(C_SIZE_T) :: npoints REAL(C_DOUBLE) :: noise REAL(C_DOUBLE) :: amp REAL(C_DOUBLE), DIMENSION(1:npoints) :: buf REAL(C_DOUBLE), PARAMETER :: PI = 3.1415926535897932384626433832795028841971_C_DOUBLE INTEGER :: size INTEGER, DIMENSION(:), ALLOCATABLE :: seed INTEGER(C_SIZE_T) :: i REAL(C_DOUBLE) :: x REAL(C_DOUBLE) :: rand ! Fixed random seed. CALL RANDOM_SEED(SIZE=size) ALLOCATE(seed(size)) seed = 123456789 CALL RANDOM_SEED(PUT=seed) DO i = 1, npoints rand = REAL(i, C_DOUBLE) CALL RANDOM_NUMBER(rand) x = 2_c_double * PI * REAL(i-1, C_DOUBLE) / REAL(npoints-1, C_DOUBLE) buf(i) = amp*( 1.0_C_DOUBLE + SIN(x)) + (rand - 0.5_C_DOUBLE)*noise ENDDO IF (ALLOCATED(seed)) DEALLOCATE(seed) END SUBROUTINE gen_data LOGICAL FUNCTION real_eq(a,b,ulp) USE ISO_C_BINDING IMPLICIT NONE REAL(C_DOUBLE), INTENT (in):: a,b REAL(C_DOUBLE) :: Rel = 1.0_C_DOUBLE INTEGER, OPTIONAL, INTENT( IN ) :: ulp IF ( PRESENT( ulp ) ) Rel = REAL( ABS(ulp), C_DOUBLE) real_eq = ABS( a - b ) < ( Rel * SPACING( MAX(ABS(a),ABS(b)) ) ) END FUNCTION real_eq SUBROUTINE check(string,error,total_error) USE ISO_FORTRAN_ENV, ONLY: ERROR_UNIT CHARACTER(LEN=*) :: string INTEGER :: error, total_error IF (error .LT. 0) THEN total_error=total_error+1 WRITE(ERROR_UNIT,*) string, " FAILED" ENDIF RETURN END SUBROUTINE check LLNL-H5Z-ZFP-092190c/test/test_write.c000066400000000000000000000527601447422177700171320ustar00rootroot00000000000000/* Copyright (c) 2016, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory Written by Mark C. Miller, miller86@llnl.gov LLNL-CODE-707197. All rights reserved. This file is part of H5Z-ZFP. Please also read the BSD license https://raw.githubusercontent.com/LLNL/H5Z-ZFP/master/LICENSE */ #include "test_common.h" #ifdef H5Z_ZFP_USE_PLUGIN #include "H5Zzfp_plugin.h" #else #include "H5Zzfp_lib.h" #include "H5Zzfp_props.h" #endif #if ZFP_HAS_CFP #if defined(ZFP_LIB_VERSION) && ZFP_LIB_VERSION>=0x1000 #include "zfp/array.h" #elif defined(ZFP_LIB_VERSION) && ZFP_LIB_VERSION>=0x053 #include "cfparrays.h" #else #error GOT HERE #endif #endif /* Populate the hyper-dimensional array with samples of a radially symmetric sinc() function but where certain sub-spaces are randomized through dimindx arrays */ static void hyper_smooth_radial(void *b, int typ, int n, int ndims, int const *dims, int const *m, int const * const dimindx[10]) { int i; double hyper_radius = 0; const double amp = 10000; double val; for (i = ndims-1; i >= 0; i--) { int iar = n / m[i]; iar = dimindx[i][iar]; /* allow for randomized shuffle of this axis */ iar -= dims[i]/2; /* ensure centering in middle of the array */ n = n % m[i]; hyper_radius += iar*iar; } hyper_radius = sqrt(hyper_radius); if (hyper_radius < 1e-15) val = amp; else val = amp * sin(0.4*hyper_radius) / (0.4*hyper_radius); if (typ == TYPINT) { int *pi = (int*) b; *pi = (int) val; } else { double *pd = (double*) b; *pd = val; } } static double func(int i, double arg) { /* a random assortment of interesting, somewhat bounded, unary functions */ double (*const funcs[])(double x) = {cos, j0, fabs, sin, cbrt, erf}; int const nfuncs = sizeof(funcs)/sizeof(funcs[0]); return funcs[i%nfuncs](arg); } /* Populate the hyper-dimensional array with samples of set of seperable functions but where certain sub-spaces are randomized through dimindx arrays */ static void hyper_smooth_separable(void *b, int typ, int n, int ndims, int const *dims, int const *m, int const * const dimindx[10]) { int i; double val = 1; for (i = ndims-1; i >= 0; i--) { int iar = n / m[i]; iar = dimindx[i][iar]; /* allow for randomized shuffle of this axis */ iar -= dims[i]/2; /* ensure centering in middle of the array */ n = n % m[i]; val *= func(i, (double) iar); } if (typ == TYPINT) { int *pi = (int*) b; *pi = (int) val; } else { double *pd = (double*) b; *pd = val; } } /* Produce multi-dimensional array test data with the property that it is random in the UNcorrelated dimensions but smooth in the correlated dimensions. This is achieved by randomized shuffling of the array indices used in specific dimensional axes of the array. */ static void * gen_random_correlated_array(int typ, int ndims, int const *dims, int nucdims, int const *ucdims) { int i, n; int nbyt = (int) (typ == TYPINT ? sizeof(int) : sizeof(double)); unsigned char *buf, *buf0; int m[10]; /* subspace multipliers */ int *dimindx[10]; assert(ndims <= 10); /* Set up total size and sub-space multipliers */ for (i=0, n=1; i < ndims; i++) { n *= dims[i]; m[i] = i==0?1:m[i-1]*dims[i-1]; } /* allocate buffer of suitable size (doubles or ints) */ buf0 = buf = (unsigned char*) malloc(n * nbyt); /* set up dimension identity indexing (e.g. Idx[i]==i) so that we can randomize those dimenions we wish to have UNcorrelated */ for (i = 0; i < ndims; i++) { int j; dimindx[i] = (int*) malloc(dims[i]*sizeof(int)); for (j = 0; j < dims[i]; j++) dimindx[i][j] = j; } /* Randomize selected dimension indexing */ srandom(0xDeadBeef); for (i = 0; i < nucdims; i++) { int j, ucdimi = ucdims[i]; for (j = 0; j < dims[ucdimi]-1; j++) { int tmp, k = random() % (dims[ucdimi]-j); if (k == j) continue; tmp = dimindx[ucdimi][j]; dimindx[ucdimi][j] = k; dimindx[ucdimi][k] = tmp; } } /* populate the array data */ for (i = 0; i < n; i++) { hyper_smooth_separable(buf, typ, i, ndims, dims, m, (int const * const *) dimindx); buf += nbyt; } /* free dimension indexing */ for (i = 0; i < ndims; i++) free(dimindx[i]); return buf0; } static void modulate_by_time(void *data, int typ, int ndims, int const *dims, int t) { int i, n; for (i = 0, n = 1; i < ndims; i++) n *= dims[i]; if (typ == TYPINT) { int *p = (int *) data; for (i = 0; i < n; i++, p++) { double val = *p; val *= exp(0.1*t*sin(t/9.0*2*M_PI)); *p = val; } } else { double *p = (double *) data; for (i = 0; i < n; i++, p++) { double val = *p; val *= exp(0.1*t*sin(t/9.0*2*M_PI)); *p = val; } } } static void buffer_time_step(void *tbuf, void *data, int typ, int ndims, int const *dims, int t) { int i, n; int k = t % 4; int nbyt = (int) (typ == TYPINT ? sizeof(int) : sizeof(double)); for (i = 0, n = 1; i < ndims; i++) n *= dims[i]; memcpy((char*)tbuf+k*n*nbyt, data, n*nbyt); } static int read_data(char const *fname, size_t npoints, double **_buf) { size_t const nbytes = npoints * sizeof(double); int fd; if (0 > (fd = open(fname, O_RDONLY))) SET_ERROR(open); if (0 == (*_buf = (double *) malloc(nbytes))) SET_ERROR(malloc); if (nbytes != read(fd, *_buf, nbytes)) SET_ERROR(read); if (0 != close(fd)) SET_ERROR(close); return 0; } static hid_t setup_filter(int n, hsize_t *chunk, int zfpmode, double rate, double acc, unsigned int prec, unsigned int minbits, unsigned int maxbits, unsigned int maxprec, int minexp) { hid_t cpid; /* setup dataset creation properties */ if (0 > (cpid = H5Pcreate(H5P_DATASET_CREATE))) SET_ERROR(H5Pcreate); if (0 > H5Pset_chunk(cpid, n, chunk)) SET_ERROR(H5Pset_chunk); #ifdef H5Z_ZFP_USE_PLUGIN unsigned int cd_values[10]; size_t cd_nelmts = 10; /* setup zfp filter via generic (cd_values) interface */ if (zfpmode == H5Z_ZFP_MODE_RATE) H5Pset_zfp_rate_cdata(rate, cd_nelmts, cd_values); else if (zfpmode == H5Z_ZFP_MODE_PRECISION) H5Pset_zfp_precision_cdata(prec, cd_nelmts, cd_values); else if (zfpmode == H5Z_ZFP_MODE_ACCURACY) H5Pset_zfp_accuracy_cdata(acc, cd_nelmts, cd_values); else if (zfpmode == H5Z_ZFP_MODE_EXPERT) H5Pset_zfp_expert_cdata(minbits, maxbits, maxprec, minexp, cd_nelmts, cd_values); else if (zfpmode == H5Z_ZFP_MODE_REVERSIBLE) H5Pset_zfp_reversible_cdata(cd_nelmts, cd_values); else cd_nelmts = 0; /* causes default behavior of ZFP library */ /* print cd-values array used for filter */ printf("\n%d cd_values=", (int) cd_nelmts); for (int i = 0; i < (int) cd_nelmts; i++) printf("%u,", cd_values[i]); printf("\n"); /* Add filter to the pipeline via generic interface */ if (0 > H5Pset_filter(cpid, H5Z_FILTER_ZFP, H5Z_FLAG_MANDATORY, cd_nelmts, cd_values)) SET_ERROR(H5Pset_filter); #else /* When filter is used as a library, we need to init it */ H5Z_zfp_initialize(); /* Setup the filter using properties interface. These calls also add the filter to the pipeline */ if (zfpmode == H5Z_ZFP_MODE_RATE) H5Pset_zfp_rate(cpid, rate); else if (zfpmode == H5Z_ZFP_MODE_PRECISION) H5Pset_zfp_precision(cpid, prec); else if (zfpmode == H5Z_ZFP_MODE_ACCURACY) H5Pset_zfp_accuracy(cpid, acc); else if (zfpmode == H5Z_ZFP_MODE_EXPERT) H5Pset_zfp_expert(cpid, minbits, maxbits, maxprec, minexp); else if (zfpmode == H5Z_ZFP_MODE_REVERSIBLE) H5Pset_zfp_reversible(cpid); #endif return cpid; } int main(int argc, char **argv) { int retval=0; /* filename variables */ char *ifile = (char *) calloc(NAME_LEN,sizeof(char)); char *ofile = (char *) calloc(NAME_LEN,sizeof(char)); /* sinusoid data generation variables */ hsize_t npoints = 1024; double noise = 0.001; double amp = 17.7; int doint = 0; int highd = 0; int sixd = 0; int zfparr = 0; int help = 0; /* compression parameters (defaults taken from ZFP header) */ int zfpmode = H5Z_ZFP_MODE_RATE; double rate = 4; double acc = 0; unsigned int prec = 11; unsigned int minbits = 0; unsigned int maxbits = 4171; unsigned int maxprec = 64; int minexp = -1074; int *ibuf = 0; double *buf = 0; /* HDF5 related variables */ hsize_t chunk = 256; hid_t fid, dsid, idsid, sid, cpid; /* file arguments */ strcpy(ofile, "test_zfp.h5"); HANDLE_ARG(ifile,strndup(argv[i]+len2,NAME_LEN), "\"%s\"",set input filename); HANDLE_ARG(ofile,strndup(argv[i]+len2,NAME_LEN), "\"%s\"",set output filename); /* ZFP filter arguments */ HANDLE_SEP(ZFP compression parameters) HANDLE_ARG(zfpmode,(int) strtol(argv[i]+len2,0,10),"%d", (1=rate,2=prec,3=acc,4=expert,5=reversible)); HANDLE_ARG(rate,(double) strtod(argv[i]+len2,0),"%g",set rate for rate mode); HANDLE_ARG(acc,(double) strtod(argv[i]+len2,0),"%g",set accuracy for accuracy mode); HANDLE_ARG(prec,(unsigned int) strtol(argv[i]+len2,0,10),"%u",set precision for precision mode); HANDLE_ARG(minbits,(unsigned int) strtol(argv[i]+len2,0,10),"%u",set minbits for expert mode); HANDLE_ARG(maxbits,(unsigned int) strtol(argv[i]+len2,0,10),"%u",set maxbits for expert mode); HANDLE_ARG(maxprec,(unsigned int) strtol(argv[i]+len2,0,10),"%u",set maxprec for expert mode); HANDLE_ARG(minexp,(int) strtol(argv[i]+len2,0,10),"%d",set minexp for expert mode); /* 1D dataset arguments */ HANDLE_SEP(1D dataset generation arguments) HANDLE_ARG(npoints,(hsize_t) strtol(argv[i]+len2,0,10), "%llu",set number of points for 1D dataset); HANDLE_ARG(noise,(double) strtod(argv[i]+len2,0),"%g",set amount of random noise in 1D dataset); HANDLE_ARG(amp,(double) strtod(argv[i]+len2,0),"%g",set amplitude of sinusoid in 1D dataset); HANDLE_ARG(chunk,(hsize_t) strtol(argv[i]+len2,0,10), "%llu",set chunk size for 1D dataset); #if defined(ZFP_LIB_VERSION) && ZFP_LIB_VERSION>=0x051 HANDLE_ARG(doint,(int) strtol(argv[i]+len2,0,10),"%d",also do integer 1D data); #else HANDLE_ARG(doint,(int) strtol(argv[i]+len2,0,10),"%d",requires ZFP>=0.5.1); if (doint) retval = 2; doint = 0; #endif /* Advanced cases */ HANDLE_SEP(Advanced cases) HANDLE_ARG(highd,(int) strtol(argv[i]+len2,0,10),"%d",4D w/2D chunk example); #if defined(ZFP_LIB_VERSION) && ZFP_LIB_VERSION>=0x054 HANDLE_ARG(sixd,(int) strtol(argv[i]+len2,0,10),"%d",run 6D extendable example); #else HANDLE_ARG(sixd,(int) strtol(argv[i]+len2,0,10),"%d",requires ZFP>=0.5.4); if (sixd) retval = 2; sixd = 0; #endif #if defined(ZFP_LIB_VERSION) && ZFP_LIB_VERSION>=0x054 && ZFP_HAS_CFP>0 && HDF5_HAS_WRITE_CHUNK>0 HANDLE_ARG(zfparr,(int) strtol(argv[i]+len2,0,10),"%d",run ZFP array case using H5Dwrite_chunk); #else HANDLE_ARG(zfparr,(int) strtol(argv[i]+len2,0,10),"%d",requires ZFP>=0.5.4 with CFP enabled); if (zfparr) retval = 2; zfparr = 0; #endif cpid = setup_filter(1, &chunk, zfpmode, rate, acc, prec, minbits, maxbits, maxprec, minexp); /* Put this after setup_filter to permit printing of otherwise hard to construct cd_values to facilitate manual invokation of h5repack */ HANDLE_ARG(help,(int)strtol(argv[i]+len2,0,10),"%d",this help message); /* must be last for help to work */ /* create double data to write if we're not reading from an existing file */ if (ifile[0] == '\0') gen_data((size_t) npoints, noise, amp, (void**)&buf, TYPDBL); else read_data(ifile, (size_t) npoints, &buf); /* create integer data to write */ if (doint) gen_data((size_t) npoints, noise*100, amp*1000000, (void**)&ibuf, TYPINT); /* create HDF5 file */ if (0 > (fid = H5Fcreate(ofile, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))) SET_ERROR(H5Fcreate); /* setup the 1D data space */ if (0 > (sid = H5Screate_simple(1, &npoints, 0))) SET_ERROR(H5Screate_simple); /* write the data WITHOUT compression */ if (0 > (dsid = H5Dcreate(fid, "original", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)) SET_ERROR(H5Dwrite); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); if (doint) { if (0 > (idsid = H5Dcreate(fid, "int_original", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite(idsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf)) SET_ERROR(H5Dwrite); if (0 > H5Dclose(idsid)) SET_ERROR(H5Dclose); } /* write the data with requested compression */ if (0 > (dsid = H5Dcreate(fid, "compressed", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)) SET_ERROR(H5Dwrite); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); if (doint) { if (0 > (idsid = H5Dcreate(fid, "int_compressed", H5T_NATIVE_INT, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite(idsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf)) SET_ERROR(H5Dwrite); if (0 > H5Dclose(idsid)) SET_ERROR(H5Dclose); } /* clean up from simple tests */ if (0 > H5Sclose(sid)) SET_ERROR(H5Sclose); if (0 > H5Pclose(cpid)) SET_ERROR(H5Pclose); free(buf); if (ibuf) free(ibuf); /* Test high dimensional (>3D) array */ if (highd) { /* dimension indices 0 1 2 3 */ int dims[] = {256,128,32,16}; int ucdims[]={1,3}; /* UNcorrleted dimensions indices */ hsize_t hdims[] = {256,128,32,16}; hsize_t hchunk[] = {256,1,32,1}; buf = gen_random_correlated_array(TYPDBL, 4, dims, 2, ucdims); cpid = setup_filter(4, hchunk, zfpmode, rate, acc, prec, minbits, maxbits, maxprec, minexp); if (0 > (sid = H5Screate_simple(4, hdims, 0))) SET_ERROR(H5Screate_simple); /* write the data WITHOUT compression */ if (0 > (dsid = H5Dcreate(fid, "highD_original", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)) SET_ERROR(H5Dwrite); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); /* write the data with compression */ if (0 > (dsid = H5Dcreate(fid, "highD_compressed", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)) SET_ERROR(H5Dwrite); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); /* clean up from high dimensional test */ if (0 > H5Sclose(sid)) SET_ERROR(H5Sclose); if (0 > H5Pclose(cpid)) SET_ERROR(H5Pclose); free(buf); } /* End of high dimensional test */ /* 6D Example */ /* Test six dimensional, time varying array... ...a 3x3 tensor valued variable ...over a 3D+time domain. Dimension sizes are chosen to miss perfect ZFP block alignment. */ if (sixd) { void *tbuf; int t, dims[] = {31,31,31,3,3}; /* a single time instance */ int ucdims[]={3,4}; /* indices of UNcorrleted dimensions in dims (tensor components) */ hsize_t hdims[] = {31,31,31,3,3,H5S_UNLIMITED}; hsize_t hchunk[] = {31,31,31,1,1,4}; /* 4 non-unity, requires >= ZFP 0.5.4 */ hsize_t hwrite[] = {31,31,31,3,3,4}; /* size/shape of any given H5Dwrite */ /* Setup the filter properties and create the dataset */ cpid = setup_filter(6, hchunk, zfpmode, rate, acc, prec, minbits, maxbits, maxprec, minexp); /* Create the time-varying, 6D dataset */ if (0 > (sid = H5Screate_simple(6, hwrite, hdims))) SET_ERROR(H5Screate_simple); if (0 > (dsid = H5Dcreate(fid, "6D_extendible", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Sclose(sid)) SET_ERROR(H5Sclose); if (0 > H5Pclose(cpid)) SET_ERROR(H5Pclose); /* Generate a single buffer which we'll modulate by a time-varying function to represent each timestep */ buf = gen_random_correlated_array(TYPDBL, 5, dims, 2, ucdims); /* Allocate the "time" buffer where we will buffer up each time step until we have enough to span a width of 4 */ tbuf = malloc(31*31*31*3*3*4*sizeof(double)); /* Iterate, writing 9 timesteps by buffering in time 4x. The last write will contain just one timestep causing ZFP to wind up padding all those blocks by 3x along the time dimension. */ for (t = 1; t < 10; t++) { hid_t msid, fsid; hsize_t hstart[] = {0,0,0,0,0,t-4}; /* size/shape of any given H5Dwrite */ hsize_t hcount[] = {31,31,31,3,3,4}; /* size/shape of any given H5Dwrite */ hsize_t hextend[] = {31,31,31,3,3,t}; /* size/shape of */ /* Update (e.g. modulate) the buf data for the current time step */ modulate_by_time(buf, TYPDBL, 5, dims, t); /* Buffer this timestep in memory. Since chunk size in time dimension is 4, we need to buffer up 4 time steps before we can issue any writes */ buffer_time_step(tbuf, buf, TYPDBL, 5, dims, t); /* If the buffer isn't full, just continue updating it */ if (t%4 && t!=9) continue; /* For last step, adjust time dim of this write down from 4 to just 1 */ if (t == 9) { /* last timestep, write a partial buffer */ hwrite[5] = 1; hcount[5] = 1; } /* extend the dataset in time */ if (t > 4) H5Dextend(dsid, hextend); /* Create the memory dataspace */ if (0 > (msid = H5Screate_simple(6, hwrite, 0))) SET_ERROR(H5Screate_simple); /* Get the file dataspace to use for this H5Dwrite call */ if (0 > (fsid = H5Dget_space(dsid))) SET_ERROR(H5Dget_space); /* Do a hyperslab selection on the file dataspace for this write*/ if (0 > H5Sselect_hyperslab(fsid, H5S_SELECT_SET, hstart, 0, hcount, 0)) SET_ERROR(H5Sselect_hyperslab); /* Write this iteration to the dataset */ if (0 > H5Dwrite(dsid, H5T_NATIVE_DOUBLE, msid, fsid, H5P_DEFAULT, tbuf)) SET_ERROR(H5Dwrite); if (0 > H5Sclose(msid)) SET_ERROR(H5Sclose); if (0 > H5Sclose(fsid)) SET_ERROR(H5Sclose); } if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); free(buf); free(tbuf); } /* End of 6D Example */ #if ZFP_HAS_CFP>0 && HDF5_HAS_WRITE_CHUNK>0 /* ZFP Array Example */ if (zfparr>0 && zfpmode==1 && rate>0) { int dims[] = {38, 128}; /*int chunk_dims[] = {19, 34};*/ int chunk_dims[] = {38, 128}; hsize_t hdims[] = {38, 128}; /*hsize_t hchunk_dims[] = {19, 34};*/ hsize_t hchunk_dims[] = {38, 128}; hsize_t hchunk_off[] = {0, 0}; #if defined(ZFP_LIB_VERSION) && ZFP_LIB_VERSION<=0x055 cfp_array2d *origarr; #else cfp_array2d origarr; #endif /* Create the array data */ buf = gen_random_correlated_array(TYPDBL, 2, dims, 0, 0); /* Instantiate a cfp array */ origarr = cfp.array2d.ctor(dims[1], dims[0], rate, buf, 0); cfp.array2d.flush_cache(origarr); cpid = setup_filter(2, hchunk_dims, 1, rate, acc, prec, minbits, maxbits, maxprec, minexp); if (0 > (sid = H5Screate_simple(2, hdims, 0))) SET_ERROR(H5Screate_simple); /* write the data WITHOUT compression */ if (0 > (dsid = H5Dcreate(fid, "zfparr_original", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)) SET_ERROR(H5Dwrite); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); /* write the data with compression via the filter */ if (0 > (dsid = H5Dcreate(fid, "zfparr_compressed", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite(dsid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)) SET_ERROR(H5Dwrite); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); /* write the data direct from compressed array using H5Dwrite_chunk calls */ if (0 > (dsid = H5Dcreate(fid, "zfparr_direct", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, cpid, H5P_DEFAULT))) SET_ERROR(H5Dcreate); if (0 > H5Dwrite_chunk(dsid, H5P_DEFAULT, 0, hchunk_off, cfp.array2d.compressed_size(origarr), cfp.array2d.compressed_data(origarr))) SET_ERROR(H5Dwrite_chunk); if (0 > H5Dclose(dsid)) SET_ERROR(H5Dclose); free(buf); cfp.array2d.dtor(origarr); } /* End of ZFP Array Example */ #endif if (0 > H5Fclose(fid)) SET_ERROR(H5Fclose); free(ifile); free(ofile); #ifndef H5Z_ZFP_USE_PLUGIN /* When filter is used as a library, we need to finalize it */ H5Z_zfp_finalize(); #endif H5close(); return retval; } LLNL-H5Z-ZFP-092190c/test/test_zfp_030040.h5000066400000000000000000000574101447422177700174740ustar00rootroot00000000000000HDF  _`TREE0HEAPX0originalcompresseddefault( ?@4 4 bxSNODx(  ?@4 4 X }8H5Z-ZFP-0.3.0 (ZFP-0.4.0) github.com/LLNL/H5Z-ZFP; 0@zfp(b ?@4 4 X }8H5Z-ZFP-0.3.0 (ZFP-0.4.0) github.com/LLNL/H5Z-ZFP; 0@zfp08b6p1@!l1@\!C1@@72@+Z"2@t1=2@Z2@u2@oXa2@02@y2@2@z3@kI3@83@wS3@n̗o3@kq3@&oЦ3@Y>3@%93@q=3@x\4@g:04@tYhL4@ g4@/2є4@{ 4@$^De4@ 4@% UqC4@:'y 5@._'5@S!D"C5@nI?^5@,/،y5@ Ô5@H?5@ɷ5@O 5@N<ُ6@$1U6@RW66@^OUQ6@l l6@P[6@#6@/Aȼ6@ɰH`6@|Zk},6@ 7@e'7@cA7@17\7@IVv7@y17@rz7@`z7@L@;7@jqU)7@7H88@05-8@CNG8@{h`8@f@z8@"\8@8@ BT8@FG8@mB<8@Ie~9@,9@ F9@y9_9@r;Zx9@>>9@809@o̸w9@I߸9@w8<9@t :@tn%:@pddn=:@ف-V:@ aJn:@[ :@7{:@Gﭶ:@ҙFk:@鐿[U:@kz:@4;@?U.-;@VDHD;@n&+\;@ _fs;@Jڕ;@h;@Mv;@Ol;@cI-;@;@}<@SM*<@lYw{@<@V<@`cl<@e"<@Ϻ<@|ߔЮ<@EF<@\m<@5Si<@{(Z=@V=@X/=@\ND=@5Z=@Hn=@ez=@ɻ@=@Ե Ӭ=@=K=@qb.=@ӼQ=@2=@l>@R&%>@zX9>@&L>@gm!`>@"cs>@قl>@{ٕ,/>@lQ>@f>@4 ý>@ K)^>@G0>>@qTo5R ?@ɉ@?@K𶜂.?@Vf@?@H`jkR?@7/d?@"8?u?@9?@~ e b?@>y?@)i?@Mk?@sK':?@:?@"`ui?@55@@T!@@:Kg@@y-@@b3&@@ .@@)>o6@@mE)>@@;} E@@&"]RM@@[ T@@1 \@@5BЉc@@ w4j@@FXDq@@yy@@ЈA@@]S@@"؍@@Ls@@{0r@@IȒ@@&@@)2@@ɖ)@@@@ͳK@@ dz@@>[p@@D<"@@yZ@@WyŅ@@2a@@@@i|L@@qM@@@@tQA@q7A@k A@1aA@n?'A@c}>A@6n-!A@ϊ&A@*A@=Q /A@Y 64A@Cٮ8A@G<6 9=A@qAA@ b]EA@NT&JA@oQNA@w;ORA@DVA@f/ZA@Bt]A@1aA@.aI\eA@oy>hA@szlA@ GoA@+sA@wdvA@<ϮnyA@鐔|A@e+A@&dgA@YA@-פ*A@0\ҊA@*XA@+8(׏A@B:A@i9A@̩;UЖA@#73A@ A@&A@ID]A@!}A@y5kA@9(A@MA@:y !A@XOvA@sȩA@<+ A@}QA@Lh#.A@TO: A@!rA@{5A@5mv~A@{A@t(A@Y)A@9tA@|ػ8A@#A@T[A@Yd} A@{A@D߲A@x2A@PA@㐻ݱA@LgA@SaѰA@A@h@@DUX@@EAWr@@˞@@\c@@Uh\@@* {k@@+ኃ@@rW|@@ˮNOtu@@g]n@@+ g@@y&_@@X@@Q@@IXRzI@@F$4A@@)H{$W:@@2@@12*@@.&?@6l?@X٠?@k|_~?@'Fl?@H?W[?@ BwI?@^+7?@h0o%?@N?@]e"?@E>@X\1>@F>@EWNŶ>@z۶>@:>@M}>@EX]Cj>@`YV>@vBC>@1^@׽>@>@Y =@r4C=@#I=@G%,=@j=@0!=@9V'Gy=@md=@^m}O=@ Oz:=@)Z%=@ؐ2=@k<@`6<@RJ<@M+cJĹ<@kxݣ<@$VR<@4%V&x<@9Va<@ڦ;K<@R5<@\|<@=<@hǬ;@;@(T;@ׂ<;@,I;@s ;@N1g;@"jP;@fNˌ9;@ 壕!;@+a ;@9[:@v%:@t<:@?:@s}:@)]nz:@3b:@]iI:@-+1:@":@o:@B9@%UDT9@9@9@q 9@9)k9@H3R9@Ϥ599@KW 9@z9@68@ae&8@7P+8@t98@h8@+m8@TS8@ "+:8@M 8@x"8@67@5'/7@I7@ u7@NN7@p~47@*8<7@5[N6@:/h6@Z$F6@Dq6@r:6@*ky6@4@8m4#4@Cl.4@#В]3@8Q=3@4ܡ3@Dm3@t=s}3@?a3@E3@ŜQ*3@;3@_2@iL2@\|"2@肟2@D2@Wg2@@L2@;,02@axH2@߿s1@T1@x'%1@^1@1@aUQ?m1@PC~Q1@8q51@Ye1@Yݏ 0@ H0@ri0@i0@0'0@ڎ8s0@MW0@b';0@_Z90@bYg@0@/@9w/@w"cb/@,+/@f.@P\Լ.@t9ۏ.@ˉ cN.@%%].@l R-@j-@F~r-@W;-@J-@p,@:{-p,@me`,@koV*,@ p+@Uaz+@ g+@MQ+@d+@v *@IuT*@R1x*@^sB*@' *@4`)@`%#)@#4l)@v247)@-[)@!(@]9+(@]b b(@-(@kS'@'@@"@'@2 :\'@jV|''@nqM&@Sg`&@l&@mW&@?#&@6~%@:#ʼ%@sЛ%@<`@PV%@#?.n#%@5ϐc$@#N$@ <̈$@1OX$@ j&$@?#@w@0#@2}R{#@ ^#@pn>o-#@+$t"@f^t"@w#T"@'mWoh"@7"@1"@ Կ!@!@ S=v!@¢KF!@\"!@G-0 @- . @m]Έ @9Z @n .+ @_ii@g"^@@?@П0@?@K +@ĻT@ZWu@>@Ky@$h@zC@ @_@@@J@Rj,4Y@JZ @%B:д@mXW@t@i8E@q7)Y@Mo@\NȲ@=_@8 @3@7z%%i@l$A@}[м@x@#cAP (@VR0#@ @L_"<@̙@$@DT@M@h@aPq@Y&@ 3@N|@KJ@9@~NO@,4Jq@2x2*@x@N<@M@4&@9 @ Br  @~ @#MT @_ @{H @R @fgf @ߓ Z/ @(!d @lE@4@],@m@嗴i@E@C/@k 1@íԽ@I@;۹q@i_+f@6 @R@@ B7խ@x=B@Jl&@Nx?fP?"&?)?ؓe(uk?GP??I7?mw?; c?fS? ңj?,w?X?*67o?ci?*F'?P3z?bY?Ӏ"M?i?$׉c"?RusU?@I(?*x?NR?rJ?W?g~v?7?@?;0 ?]N#?+0?x?+f ?N+.?⧦[?*Pb?<炚y?NR?Xye?`̤g?J,?v?$?p;?/Ĥq?^1?p;1"?Z()u?llXQ?:N^?Cqv#sޏa?e O?Pf&!OYF8]KnzO;4?:[?tM)]m?{?( P?+&kэ???+׼?i)?ryRJ?>yI-?;4BK¯? ]e?έf^ٴ?2sF? Z,d?%ssN?)cqy?-J?wG? (!??c+`J? kJ?T?%T?vB?=̰?&.<?cNDd?rbz?OyQ2?(IL?!rĔ"?Gu???d,G?"?ț?q*3?`? K'L?A&k$9?:=n+?f 1*?l7#?`/(?|,ɱ1?$6?@?Fħ:S?=s?#(J`?bߒ?EJ!j?vt?4%??.7? džl?]y?5B?H?$խj?Mcy?s?-{7q? %?l+?_v?U?ؠN?|l ?q?v0y?ԟP?\ȗ?a?H0/ ?9<@>@uM@XIXw@XH@㱋Q@lͣ@ٯ-@۸@{@T7V@I@^Fbk@v@ބ HZ@Q*@hL@-!B@5$C@ @? @K @j@ @sH$E @J GD @j @ԆL @>af @ Z @D @q6k@Ź@ ր@4@UM@vh\@"Ԕ@-t^%@kn@ΌE3@ ֦2@`0/L@eZ@~)%@ﶢ.@aEz@nj@7@c@9,@ )F@O@U#@4!@;$UA@3@C4c@W`5@{Ӳ8@'>@ ZQm@-}tR @M} @MuSB @ 8q @Ӈ9 @' @p8v @q/!@L^!@ ]k!@E _!@m-!@/gU"@b,4{P"@ـ"@@:7"@‡g"@0ն\#@.F#@w#@^[M9#@|K#@Oa K $@Aq?$@LTw0r$@S=|$@SVr$@`̆HJ %@9<%@1o%@ z/%@}M%@pS &@x=&@q&@zQ&@_b&@/zG. '@)cfA'@rf[4v'@/*L'@ɓpC'@-(@#[H(@W}(@6-(@ý(@d)@ &Q)@KbMA)@M1ؼ)@IB]Z)@X :(*@u^^*@YK*@:&*@4W-@؍-@:d@{-@-@+.2.@\i.@a.@d.@7l</@qöF/@f}/@/=h/@fwը/@ 0@ɶ-0@INw-I0@w>.e0@p܉0@X֜0@@k~0@S93h0@1Ra=0@Op 1@J='1@2 C1@cWb_1@'59{1@x!a71@1@TREE001034 hAp hAt hq ha he˔ h`„ hd hUqÆ hUu hUp hU`ô hUd˶ ha huô hp4 ht4 hd hEa¤ hEe hEp hEt hEd ha hu hp h` ht0 hPq0 hPa hPUA hPa hP hPT! hPDi hM h) h h` h h@ h& hT&H hH hD7H hA'L hAQ( hAQ( hA7 hAAaX hAAtX hAu hAd hAUe@ hAUd hAu hA` hAEq hAEuK hAEp hAEt hAED hAQ hAA hAq hA hAA hA hA hAEm hAE hAEE hAEe hA hAݢ hAU2 hAU hA hA hAA& hAA& hA6 hAQ܆ hAQن hAݖ hDX h hT\ h\" h@ h h h) h  h- hM hPI hPM hPIJ hPM hPm hPi hM[ hmS hm hI hI hEI hEI hEI hEm hEm hEM hiP hIP hm hMY hU hU% hU hU hU h! h% h! h% h!J hA% hA! hAC hA hK h h %hP"!hPؠ%hP٢!h2IhݰmhE"mhEIhE0ih" h2-hU -hU0 hDh"DhdhA2@hA2hA2hhٔ,hPݤahئhE%hE4mh& hU6`hU6hlh٦ hAؐAh%hhPYhY`hEYhhYEhUIh]0hA(hؖmh)Jh-h hmhAh]0g)g)g)g gigMKga[gZg04gArg 9g(14\sC hqh}өG|v( $U SakNuS#*VQL$7;H+RJ2`Dm h`„ 9MOVLTcKoH@ S@]w}.S9'Zë@ZUܰ!#.fIZç<|&wW yH@[ 8XN7*8A۲q7ECm>:7lH@- 9O 9>n3@:ȫ@Zٲm^ZjmNVe  I[#9[ʵ'o~ƫ@ZA0-PpvErLTV/ i^oe}: ~«@Z2 +\]TEk]VP9H@+ Eze I?E˖P* hEa¤(7aqUJdD;;H@+*S,(<}=?,QڭW"E6ɥ NIt8"׸$)B6pdD h/ŎW"EW`l,@ǏFvCTH#W@,^H|6[eX* hu, /So#^0X^  NQ6r.Nc5̠ AHaaRTN-: A7FZAuf.ѷš@T2 erΒ!vA+$A-<+!|Ɇ׷>WMMb:I[4*ˠRG"ev= Р .FV֍UAk({``dsHcEz~ThkU  "Dan*94}_e hPDiA*Rva}'|w }LoH@8lc%{;Ugv^`u;H@H 0>3RlAe2SZ @@a*F0hR]dPR  ,g# x命B5($ -` 9w˘Bပ̖@V; [dFގ+S8r?"Z h&Ъue>s>B@_Ոٮ[L0X˦!0~ګ,Zhyߡ,"/f`YhZNW](@t$1S[8q9kyzFqp#3=A@һю ,ED#Y&A8eY `-(ekF>%q=gWa hA7 BBKO1z/A@@W hAAaXNZˮCDЂ3 j ps8@5N ,UE0 b:VuXA^Ђ*pۙ@>;x hAUe@0ete;VnMʓUC*2dp ^'.TPag^õHfX@ *ۀ @2jl'7 ,IBӲ׫Ux)atЂ(ho_tCL[= hAEp((FX2K Ђ%cirhRGǟHم hAED4󷀎{qV ( 'PgbN. 3Pr.*tKH0L":kS >C?GPЂ *evb2eB['ߠ hAGQV'+B).2IcX\?](!in6~}  hA rTkFTs6e hA P\d}}OZPuZ+5tF퉑Qjq@DΊ ZP`-`&>KL|)ܧ ZPQaјMù`bmRSvӫZPQtYZ*´D"] = ZP(ȼW+W7wZPAhk4VM\&h|s( hAU2|(* hAUQ40` GJߒ8ְ  ,Up 3V?.~\ ,UtJvc+%z7\(mE Csclt3 ZPP pKS2\AHkr2A" hA6h"($y1;s%9 hAQ܆|ڗ4x{=ա,Eeg{ձ*Jek$v(m6l~co#d@ˢUEkIH=5k=:X@ @ŷ|%ۓ𼊠_ SW`- 6!5/AMrBX@ )ھ[A0˂[Xc ,q@Z~ Ke( ,p@Wl;&>Ũ-{n")x@+խkޞb h)$Q&Wʘ>_)Q(V $T&@/ɍ/l`R fg@@` %b>6O1*j hMv\{ L`r(E$h.o(1'wf sIr @pqA[ XF9RLhϑ$AA&)Yǔ^~2-R~$׫@Ta4li~.u!_S8 hPmEcEN E-̯ n*6!j5߰3u{Pd7 hM[gCέ!,aڸ*6e&DJJ+[L*(j-Y\ mƫ@DuR I>LW䪝Y/{[ @pq9BMq x-#*VD Yzumc/ @ZeR͙17tqW#& $A'EڧasٳVRc @ZQaZN7Tڙg hEmѦԧh*Jm t@b^Њ"2) :j`R[.cm>3NV@ڬTDtUa 4hh'YDP : $g Ђ @kRd7NR8@JmH@ XωpP &'ۥ~^U -`F<ϝb dh)|h %^o}xz1U S$dRvAc$QhJ ]]hPؠ%ԄA9P5um\ P *[4dq䯯2JJxNJp)u:dE HhC(@6-^H6R,{ q|2Mb>tFU Њih:$j13>n,lf߶Ct' fUWNULc۬#FRZ.] PVmksWaN@AosEB(@e1uɥ$l}= Ud2L}ݾߘzʞo1| Ђ!/ bok;:h%@꽦x50IV4 ZAH.{ၥ ƕ4h`bQd Fq >/"̚g&f$n-^4{!.A)r.MԱ @YaZb`!{yÉ/" C?lZ&-3n]dޓϊWVga[A +!5 x hBˆҍ`'=cfD);𡫻P FBgi_{w,%kWWᴅgAr\fohO\͹18b?^2Arc7? tmǏ"}9j%P "<·:`8ChI/ix; .Ny{?$Z(Gp¬Q)+ 3ǸwQ[w@Y\FFҖ.K'r'udgaS#j\-oY,ʡ䟅m_}a-(),6 UXj B}$Tǧ{kGusա-ZXU|$?Yn:E EY4Fp#+zp2i䚤X{Q,bYgac ߅gF-Ew*V7fٙ;3Y[ B\^k QĜE  Y \ ȧTWdŮܐUmw^ 6u$TRM{Ƙۃ-ǫ!UQSdolϡܐ v8OZw! N '<dx#XS6IZ|aZfh6ib3T >-&j/1˴<Vp҄fBD~\Ttk4Xft*hE&!B|Mb<=*AњAʄn˅$ܫZ ҰRFե_]߳J Z)&O[a~5!NhLJSbhBf#/8h5 U݂csbCߣ@B+0VpB">L%ۜ፽ mƫZ g)ALb%<"+ѱyh'u8K`6Q1<[܍mͻ A zd-e%##f%7ZPP)4z'QQl7MlaC2azx j0؅hAp60jW%kKB/8bwD },pVD VH* yq]ȦDEYhuK7ENn30| X0LKc;%C(I+8 'g:AClHr]4uE>6 $)wx?& bh@ZP2t~cRI ,'* hAe”$*ol%D3@%93@q=3@x\4@g:04@tYhL4@ g4@/2є4@{ 4@$^De4@ 4@% UqC4@:'y 5@._'5@S!D"C5@nI?^5@,/،y5@ Ô5@H?5@ɷ5@O 5@N<ُ6@$1U6@RW66@^OUQ6@l l6@P[6@#6@/Aȼ6@ɰH`6@|Zk},6@ 7@e'7@cA7@17\7@IVv7@y17@rz7@`z7@L@;7@jqU)7@7H88@05-8@CNG8@{h`8@f@z8@"\8@8@ BT8@FG8@mB<8@Ie~9@,9@ F9@y9_9@r;Zx9@>>9@809@o̸w9@I߸9@w8<9@t :@tn%:@pddn=:@ف-V:@ aJn:@[ :@7{:@Gﭶ:@ҙFk:@鐿[U:@kz:@4;@?U.-;@VDHD;@n&+\;@ _fs;@Jڕ;@h;@Mv;@Ol;@cI-;@;@}<@SM*<@lYw{@<@V<@`cl<@e"<@Ϻ<@|ߔЮ<@EF<@\m<@5Si<@{(Z=@V=@X/=@\ND=@5Z=@Hn=@ez=@ɻ@=@Ե Ӭ=@=K=@qb.=@ӼQ=@2=@l>@R&%>@zX9>@&L>@gm!`>@"cs>@قl>@{ٕ,/>@lQ>@f>@4 ý>@ K)^>@G0>>@qTo5R ?@ɉ@?@K𶜂.?@Vf@?@H`jkR?@7/d?@"8?u?@9?@~ e b?@>y?@)i?@Mk?@sK':?@:?@"`ui?@55@@T!@@:Kg@@y-@@b3&@@ .@@)>o6@@mE)>@@;} E@@&"]RM@@[ T@@1 \@@5BЉc@@ w4j@@FXDq@@yy@@ЈA@@]S@@"؍@@Ls@@{0r@@IȒ@@&@@)2@@ɖ)@@@@ͳK@@ dz@@>[p@@D<"@@yZ@@WyŅ@@2a@@@@i|L@@qM@@@@tQA@q7A@k A@1aA@n?'A@c}>A@6n-!A@ϊ&A@*A@=Q /A@Y 64A@Cٮ8A@G<6 9=A@qAA@ b]EA@NT&JA@oQNA@w;ORA@DVA@f/ZA@Bt]A@1aA@.aI\eA@oy>hA@szlA@ GoA@+sA@wdvA@<ϮnyA@鐔|A@e+A@&dgA@YA@-פ*A@0\ҊA@*XA@+8(׏A@B:A@i9A@̩;UЖA@#73A@ A@&A@ID]A@!}A@y5kA@9(A@MA@:y !A@XOvA@sȩA@<+ A@}QA@Lh#.A@TO: A@!rA@{5A@5mv~A@{A@t(A@Y)A@9tA@|ػ8A@#A@T[A@Yd} A@{A@D߲A@x2A@PA@㐻ݱA@LgA@SaѰA@A@h@@DUX@@EAWr@@˞@@\c@@Uh\@@* {k@@+ኃ@@rW|@@ˮNOtu@@g]n@@+ g@@y&_@@X@@Q@@IXRzI@@F$4A@@)H{$W:@@2@@12*@@.&?@6l?@X٠?@k|_~?@'Fl?@H?W[?@ BwI?@^+7?@h0o%?@N?@]e"?@E>@X\1>@F>@EWNŶ>@z۶>@:>@M}>@EX]Cj>@`YV>@vBC>@1^@׽>@>@Y =@r4C=@#I=@G%,=@j=@0!=@9V'Gy=@md=@^m}O=@ Oz:=@)Z%=@ؐ2=@k<@`6<@RJ<@M+cJĹ<@kxݣ<@$VR<@4%V&x<@9Va<@ڦ;K<@R5<@\|<@=<@hǬ;@;@(T;@ׂ<;@,I;@s ;@N1g;@"jP;@fNˌ9;@ 壕!;@+a ;@9[:@v%:@t<:@?:@s}:@)]nz:@3b:@]iI:@-+1:@":@o:@B9@%UDT9@9@9@q 9@9)k9@H3R9@Ϥ599@KW 9@z9@68@ae&8@7P+8@t98@h8@+m8@TS8@ "+:8@M 8@x"8@67@5'/7@I7@ u7@NN7@p~47@*8<7@5[N6@:/h6@Z$F6@Dq6@r:6@*ky6@4@8m4#4@Cl.4@#В]3@8Q=3@4ܡ3@Dm3@t=s}3@?a3@E3@ŜQ*3@;3@_2@iL2@\|"2@肟2@D2@Wg2@@L2@;,02@axH2@߿s1@T1@x'%1@^1@1@aUQ?m1@PC~Q1@8q51@Ye1@Yݏ 0@ H0@ri0@i0@0'0@ڎ8s0@MW0@b';0@_Z90@bYg@0@/@9w/@w"cb/@,+/@f.@P\Լ.@t9ۏ.@ˉ cN.@%%].@l R-@j-@F~r-@W;-@J-@p,@:{-p,@me`,@koV*,@ p+@Uaz+@ g+@MQ+@d+@v *@IuT*@R1x*@^sB*@' *@4`)@`%#)@#4l)@v247)@-[)@!(@]9+(@]b b(@-(@kS'@'@@"@'@2 :\'@jV|''@nqM&@Sg`&@l&@mW&@?#&@6~%@:#ʼ%@sЛ%@<`@PV%@#?.n#%@5ϐc$@#N$@ <̈$@1OX$@ j&$@?#@w@0#@2}R{#@ ^#@pn>o-#@+$t"@f^t"@w#T"@'mWoh"@7"@1"@ Կ!@!@ S=v!@¢KF!@\"!@G-0 @- . @m]Έ @9Z @n .+ @_ii@g"^@@?@П0@?@K +@ĻT@ZWu@>@Ky@$h@zC@ @_@@@J@Rj,4Y@JZ @%B:д@mXW@t@i8E@q7)Y@Mo@\NȲ@=_@8 @3@7z%%i@l$A@}[м@x@#cAP (@VR0#@ @L_"<@̙@$@DT@M@h@aPq@Y&@ 3@N|@KJ@9@~NO@,4Jq@2x2*@x@N<@M@4&@9 @ Br  @~ @#MT @_ @{H @R @fgf @ߓ Z/ @(!d @lE@4@],@m@嗴i@E@C/@k 1@íԽ@I@;۹q@i_+f@6 @R@@ B7խ@x=B@Jl&@Nx?fP?"&?)?ؓe(uk?GP??I7?mw?; c?fS? ңj?,w?X?*67o?ci?*F'?P3z?bY?Ӏ"M?i?$׉c"?RusU?@I(?*x?NR?rJ?W?g~v?7?@?;0 ?]N#?+0?x?+f ?N+.?⧦[?*Pb?<炚y?NR?Xye?`̤g?J,?v?$?p;?/Ĥq?^1?p;1"?Z()u?llXQ?:N^?Cqv#sޏa?e O?Pf&!OYF8]KnzO;4?:[?tM)]m?{?( P?+&kэ???+׼?i)?ryRJ?>yI-?;4BK¯? ]e?έf^ٴ?2sF? Z,d?%ssN?)cqy?-J?wG? (!??c+`J? kJ?T?%T?vB?=̰?&.<?cNDd?rbz?OyQ2?(IL?!rĔ"?Gu???d,G?"?ț?q*3?`? K'L?A&k$9?:=n+?f 1*?l7#?`/(?|,ɱ1?$6?@?Fħ:S?=s?#(J`?bߒ?EJ!j?vt?4%??.7? džl?]y?5B?H?$խj?Mcy?s?-{7q? %?l+?_v?U?ؠN?|l ?q?v0y?ԟP?\ȗ?a?H0/ ?9<@>@uM@XIXw@XH@㱋Q@lͣ@ٯ-@۸@{@T7V@I@^Fbk@v@ބ HZ@Q*@hL@-!B@5$C@ @? @K @j@ @sH$E @J GD @j @ԆL @>af @ Z @D @q6k@Ź@ ր@4@UM@vh\@"Ԕ@-t^%@kn@ΌE3@ ֦2@`0/L@eZ@~)%@ﶢ.@aEz@nj@7@c@9,@ )F@O@U#@4!@;$UA@3@C4c@W`5@{Ӳ8@'>@ ZQm@-}tR @M} @MuSB @ 8q @Ӈ9 @' @p8v @q/!@L^!@ ]k!@E _!@m-!@/gU"@b,4{P"@ـ"@@:7"@‡g"@0ն\#@.F#@w#@^[M9#@|K#@Oa K $@Aq?$@LTw0r$@S=|$@SVr$@`̆HJ %@9<%@1o%@ z/%@}M%@pS &@x=&@q&@zQ&@_b&@/zG. '@)cfA'@rf[4v'@/*L'@ɓpC'@-(@#[H(@W}(@6-(@ý(@d)@ &Q)@KbMA)@M1ؼ)@IB]Z)@X :(*@u^^*@YK*@:&*@4W-@؍-@:d@{-@-@+.2.@\i.@a.@d.@7l</@qöF/@f}/@/=h/@fwը/@ 0@ɶ-0@INw-I0@w>.e0@p܉0@X֜0@@k~0@S93h0@1Ra=0@Op 1@J='1@2 C1@cWb_1@'59{1@x!a71@1@TREE001034 hAp hAt hq ha he˔ h`„ hd hUqÆ hUu hUp hU`ô hUd˶ ha huô hp4 ht4 hd hEa¤ hEe hEp hEt hEd ha hu hp h` ht0 hPq0 hPa hPUA hPa hP hPT! hPDi hM h) h h` h h@ h& hT&H hH hD7H hA'L hAQ( hAQ( hA7 hAAaX hAAtX hAu hAd hAUe@ hAUd hAu hA` hAEq hAEuK hAEp hAEt hAED hAQ hAA hAq hA hAA hA hA hAEm hAE hAEE hAEe hA hAݢ hAU2 hAU hA hA hAA& hAA& hA6 hAQ܆ hAQن hAݖ hDX h hT\ h\" h@ h h h) h  h- hM hPI hPM hPIJ hPM hPm hPi hM[ hmS hm hI hI hEI hEI hEI hEm hEm hEM hiP hIP hm hMY hU hU% hU hU hU h! h% h! h% h!J hA% hA! hAC hA hK h h %hP"!hPؠ%hP٢!h2IhݰmhE"mhEIhE0ih" h2-hU -hU0 hDh"DhdhA2@hA2hA2hhٔ,hPݤahئhE%hE4mh& hU6`hU6hlh٦ hAؐAh%hhPYhY`hEYhhYEhUIh]0hA(hؖmh)Jh-h hmhAh]0g)g)g)g gigMKga[gZg04gArg 9g(14x jnO,y%h[pSxY8;!2L3޴YV#mEM T@r.EfQ*"mM ʤ$Dg֓?~ :"`mM촚"TXaū*2Qh6I'ynj]((pz5gPNno7mL0#,i۵m.UQ1F@ ۴@5ʞ] 9T@8=`:6&Ij"wEI?Pw_6ʴm2%S=:Gqo66kLlx"7(}6(4Vk㳹iڨvې=r[?6(666ת"fpZ_d*#mPi!-&56YJ[i}^F@[(e߉^cT5QH7t˪xE@۠(B YN!B}jARE@۠ [l-%؂+N#mPEER-T$sG1f ⢨\+_Zk[ܱVіy47,1Cbv]_+n]3Q lQ0}ȒQ.XlKNL}_EUwLxZp"mpdjWyIyuS}G@ E7TV$cJLmdȜlKsEb/$-A B]iVib=׆D@ۊ!P1Sǚ{5l 4$~hE\4 Jv^B(/Ten~Dwm+SX'4NlD>VlX guzo]UL>]o/Hh[ `T8Rd+ lmжAp*H6 7o ۂqm-GAECh m% {L6 ؅9S&P ʔEzb 'Ge6 6[~20 s <" 04ʽQ aMwCcն[W4(TKaXm$O۾Tx{fF.u6oizS&@ 2lű0Z=$mb# P?`Qh[Y#t-8Fl~OUe;XONCJ澮h[X4) xE5]~r#pmAaP `N{:*Xm0:oG:ZZ{Z548Q/A9r4Zٻ{qCz€(AԎIk 46>é<ݶîO@ۊneg`'N~e{wne m7${N+z$(Ν2h[ cS'RI ^$.I@bh[)[Qܛi"YKmF!d¤#15Y~< ]x[ >2rb-X~S;Mc&BxmPasf\FݿySl;m!s)KxXԆmmT*;A@wqVJ,>Tжˑ7/0oͽ*h[M%L"c4H\ȕjP(`B,hyw4(sAR_! YȤaHã ,9/r˝ ?}V`ƛ+}p4ʋKԅVخVah`LJ. dJNj'`'o4QТqSR@1wg[ٰn(݁7/l5kڪcdͣpEl  |c9604X+,TYǴi<tI1syVN rlBxjm`Z)`FlƼPjbLNro| DLqeşTnK ]?,[T`{TDDw0־F*g4F!N |~c9ngz5>oN1[xJZ>`iݷ g?ʵ^j(́^(A{!ʡ{w*Υ(3FZ#ӠQke#ݎ>Isv!6)8׎ow[ty`mHRv#gv&~YU贊&U|_4'm!o;@fPGu.Hnn/H}xv9)ItikMjqSV47l+lT٧92Rmw[tʶ\]g#cml nѡ+B /H%샯?NUp6n_m O*@5*kePTc- |۟i1\L߯3EmAKAP2OS.fLz h[EUD2T0qƒ\;4V:AY)eX۪mk]DFa>4%RG -hd@ Z;nPH$& . N>G꾾#ө' mA;Ku)-tж,sɀ8D;n& 7h[H*:(m̼_iɺ)UqǦ^@*t5ᜊE~K m\ $ PI.pE^r y09Do8I8%~#ej5?{MNh-ݎ./hmyOғhPi.;g-[4vJV=íNuB%f9BYW3Bҹ>)(@}-JGE8}%_-XF}&@*I|1$A9OW=VI@bgt)gT ж*n/"+19`58L;VI ,lrl9h[QT\=zEOn Vnܩ.VMSfz|0(lPsRؕm6`ߝ#iͿI?uKPLAe`;9'YLY 6(nKTrl"Ha%G"o %zuX 0dX[7@8Eq/~S#l_ h-[Әw]R[9>,aꏲoa߻Veaݝ[h[E(q&wֽNĎm%i;w9mK|E u. S~mYH%>L h[AlJڌ%t#U;65@ :E\g59 ١cT*槬dm`l͈pq[I6 жn4jtd.S ١mEI8hu Q:`# FWmAd$+lFy;fQ_ [6 㟬-+X~g 6l؂xb(NA3֜7@۠:eJ/Ra ?&5aZ-bC،BY7\z- 6n[⵱:!Fzwۉ(r3@%93@q=3@x\4@g:04@tYhL4@ g4@/2є4@{ 4@$^De4@ 4@% UqC4@:'y 5@._'5@S!D"C5@nI?^5@,/،y5@ Ô5@H?5@ɷ5@O 5@N<ُ6@$1U6@RW66@^OUQ6@l l6@P[6@#6@/Aȼ6@ɰH`6@|Zk},6@ 7@e'7@cA7@17\7@IVv7@y17@rz7@`z7@L@;7@jqU)7@7H88@05-8@CNG8@{h`8@f@z8@"\8@8@ BT8@FG8@mB<8@Ie~9@,9@ F9@y9_9@r;Zx9@>>9@809@o̸w9@I߸9@w8<9@t :@tn%:@pddn=:@ف-V:@ aJn:@[ :@7{:@Gﭶ:@ҙFk:@鐿[U:@kz:@4;@?U.-;@VDHD;@n&+\;@ _fs;@Jڕ;@h;@Mv;@Ol;@cI-;@;@}<@SM*<@lYw{@<@V<@`cl<@e"<@Ϻ<@|ߔЮ<@EF<@\m<@5Si<@{(Z=@V=@X/=@\ND=@5Z=@Hn=@ez=@ɻ@=@Ե Ӭ=@=K=@qb.=@ӼQ=@2=@l>@R&%>@zX9>@&L>@gm!`>@"cs>@قl>@{ٕ,/>@lQ>@f>@4 ý>@ K)^>@G0>>@qTo5R ?@ɉ@?@K𶜂.?@Vf@?@H`jkR?@7/d?@"8?u?@9?@~ e b?@>y?@)i?@Mk?@sK':?@:?@"`ui?@55@@T!@@:Kg@@y-@@b3&@@ .@@)>o6@@mE)>@@;} E@@&"]RM@@[ T@@1 \@@5BЉc@@ w4j@@FXDq@@yy@@ЈA@@]S@@"؍@@Ls@@{0r@@IȒ@@&@@)2@@ɖ)@@@@ͳK@@ dz@@>[p@@D<"@@yZ@@WyŅ@@2a@@@@i|L@@qM@@@@tQA@q7A@k A@1aA@n?'A@c}>A@6n-!A@ϊ&A@*A@=Q /A@Y 64A@Cٮ8A@G<6 9=A@qAA@ b]EA@NT&JA@oQNA@w;ORA@DVA@f/ZA@Bt]A@1aA@.aI\eA@oy>hA@szlA@ GoA@+sA@wdvA@<ϮnyA@鐔|A@e+A@&dgA@YA@-פ*A@0\ҊA@*XA@+8(׏A@B:A@i9A@̩;UЖA@#73A@ A@&A@ID]A@!}A@y5kA@9(A@MA@:y !A@XOvA@sȩA@<+ A@}QA@Lh#.A@TO: A@!rA@{5A@5mv~A@{A@t(A@Y)A@9tA@|ػ8A@#A@T[A@Yd} A@{A@D߲A@x2A@PA@㐻ݱA@LgA@SaѰA@A@h@@DUX@@EAWr@@˞@@\c@@Uh\@@* {k@@+ኃ@@rW|@@ˮNOtu@@g]n@@+ g@@y&_@@X@@Q@@IXRzI@@F$4A@@)H{$W:@@2@@12*@@.&?@6l?@X٠?@k|_~?@'Fl?@H?W[?@ BwI?@^+7?@h0o%?@N?@]e"?@E>@X\1>@F>@EWNŶ>@z۶>@:>@M}>@EX]Cj>@`YV>@vBC>@1^@׽>@>@Y =@r4C=@#I=@G%,=@j=@0!=@9V'Gy=@md=@^m}O=@ Oz:=@)Z%=@ؐ2=@k<@`6<@RJ<@M+cJĹ<@kxݣ<@$VR<@4%V&x<@9Va<@ڦ;K<@R5<@\|<@=<@hǬ;@;@(T;@ׂ<;@,I;@s ;@N1g;@"jP;@fNˌ9;@ 壕!;@+a ;@9[:@v%:@t<:@?:@s}:@)]nz:@3b:@]iI:@-+1:@":@o:@B9@%UDT9@9@9@q 9@9)k9@H3R9@Ϥ599@KW 9@z9@68@ae&8@7P+8@t98@h8@+m8@TS8@ "+:8@M 8@x"8@67@5'/7@I7@ u7@NN7@p~47@*8<7@5[N6@:/h6@Z$F6@Dq6@r:6@*ky6@4@8m4#4@Cl.4@#В]3@8Q=3@4ܡ3@Dm3@t=s}3@?a3@E3@ŜQ*3@;3@_2@iL2@\|"2@肟2@D2@Wg2@@L2@;,02@axH2@߿s1@T1@x'%1@^1@1@aUQ?m1@PC~Q1@8q51@Ye1@Yݏ 0@ H0@ri0@i0@0'0@ڎ8s0@MW0@b';0@_Z90@bYg@0@/@9w/@w"cb/@,+/@f.@P\Լ.@t9ۏ.@ˉ cN.@%%].@l R-@j-@F~r-@W;-@J-@p,@:{-p,@me`,@koV*,@ p+@Uaz+@ g+@MQ+@d+@v *@IuT*@R1x*@^sB*@' *@4`)@`%#)@#4l)@v247)@-[)@!(@]9+(@]b b(@-(@kS'@'@@"@'@2 :\'@jV|''@nqM&@Sg`&@l&@mW&@?#&@6~%@:#ʼ%@sЛ%@<`@PV%@#?.n#%@5ϐc$@#N$@ <̈$@1OX$@ j&$@?#@w@0#@2}R{#@ ^#@pn>o-#@+$t"@f^t"@w#T"@'mWoh"@7"@1"@ Կ!@!@ S=v!@¢KF!@\"!@G-0 @- . @m]Έ @9Z @n .+ @_ii@g"^@@?@П0@?@K +@ĻT@ZWu@>@Ky@$h@zC@ @_@@@J@Rj,4Y@JZ @%B:д@mXW@t@i8E@q7)Y@Mo@\NȲ@=_@8 @3@7z%%i@l$A@}[м@x@#cAP (@VR0#@ @L_"<@̙@$@DT@M@h@aPq@Y&@ 3@N|@KJ@9@~NO@,4Jq@2x2*@x@N<@M@4&@9 @ Br  @~ @#MT @_ @{H @R @fgf @ߓ Z/ @(!d @lE@4@],@m@嗴i@E@C/@k 1@íԽ@I@;۹q@i_+f@6 @R@@ B7խ@x=B@Jl&@Nx?fP?"&?)?ؓe(uk?GP??I7?mw?; c?fS? ңj?,w?X?*67o?ci?*F'?P3z?bY?Ӏ"M?i?$׉c"?RusU?@I(?*x?NR?rJ?W?g~v?7?@?;0 ?]N#?+0?x?+f ?N+.?⧦[?*Pb?<炚y?NR?Xye?`̤g?J,?v?$?p;?/Ĥq?^1?p;1"?Z()u?llXQ?:N^?Cqv#sޏa?e O?Pf&!OYF8]KnzO;4?:[?tM)]m?{?( P?+&kэ???+׼?i)?ryRJ?>yI-?;4BK¯? ]e?έf^ٴ?2sF? Z,d?%ssN?)cqy?-J?wG? (!??c+`J? kJ?T?%T?vB?=̰?&.<?cNDd?rbz?OyQ2?(IL?!rĔ"?Gu???d,G?"?ț?q*3?`? K'L?A&k$9?:=n+?f 1*?l7#?`/(?|,ɱ1?$6?@?Fħ:S?=s?#(J`?bߒ?EJ!j?vt?4%??.7? džl?]y?5B?H?$խj?Mcy?s?-{7q? %?l+?_v?U?ؠN?|l ?q?v0y?ԟP?\ȗ?a?H0/ ?9<@>@uM@XIXw@XH@㱋Q@lͣ@ٯ-@۸@{@T7V@I@^Fbk@v@ބ HZ@Q*@hL@-!B@5$C@ @? @K @j@ @sH$E @J GD @j @ԆL @>af @ Z @D @q6k@Ź@ ր@4@UM@vh\@"Ԕ@-t^%@kn@ΌE3@ ֦2@`0/L@eZ@~)%@ﶢ.@aEz@nj@7@c@9,@ )F@O@U#@4!@;$UA@3@C4c@W`5@{Ӳ8@'>@ ZQm@-}tR @M} @MuSB @ 8q @Ӈ9 @' @p8v @q/!@L^!@ ]k!@E _!@m-!@/gU"@b,4{P"@ـ"@@:7"@‡g"@0ն\#@.F#@w#@^[M9#@|K#@Oa K $@Aq?$@LTw0r$@S=|$@SVr$@`̆HJ %@9<%@1o%@ z/%@}M%@pS &@x=&@q&@zQ&@_b&@/zG. '@)cfA'@rf[4v'@/*L'@ɓpC'@-(@#[H(@W}(@6-(@ý(@d)@ &Q)@KbMA)@M1ؼ)@IB]Z)@X :(*@u^^*@YK*@:&*@4W-@؍-@:d@{-@-@+.2.@\i.@a.@d.@7l</@qöF/@f}/@/=h/@fwը/@ 0@ɶ-0@INw-I0@w>.e0@p܉0@X֜0@@k~0@S93h0@1Ra=0@Op 1@J='1@2 C1@cWb_1@'59{1@x!a71@1@TREE002O58 hAph04M@ [4@֗ hq$U SaVQL$7; h`„ 9L@ S@]wQZUܰ!#.N@[ *8A۲q7O@- 9OMZٲm^ I[]ZA0-P i^osZ2 +\L@+ Eze hEa¤(7I@+*S,(<"E6ɥ$)B6pd"EWݐTH#W hu, 3 NQ6r. A着A7FZT2 e&A-<+4*ˠRР .F–`d! "Dan hPDiA*O@8lcO@H p@a*F ,g# ` 9 [dF h&ЪuL0X."@t$1SF/ED#|-(ekF>% hA7 BBKO hAAaXNЂ3-UEЂ*p hAUe@0e*2dpTPaZ@ *ۀ @-IBӲЂ(ho hAEp((Ђ%ci hAED4 ( 'PtKHЂ *e# hAGQV!i hA rT hA P\ZPuZ+ZP`-ZPQaјMZPQtYZZP(ZPAhk4 hAU2 hAUQ4,Up 3.UtJvcmEZPP pK hA6h"( hAQ܆|,Eeg{ձm6@ˢ]@ @d- 6!_@ )ھ[-q@-p@Wl-{n" h)$Q&%T&@/I@` %b hMv\E$h.opqA[%AA&)YTTa4li hPmߕ6!j5 hM[gC6e֖(KDuR I @pqVD YZeR͙1$A'EڧasZQaZ hEmѦԧЊ"2) V@ڬT#: `bQd"̚g4{!.AYaZb`?lZ&-3nga[A ˆҍ`' FBgigAr\f2ArcW "<·/ix; . Gp¬Q)kY\FFҖgaS#j䟅m_}a- B}$-ZXEY4Fp#+zpgac V7fB\Y \ ȧT6u!Uܐ v8dx#Xh6ib3T Vp҄fBDhE&!B|MAњAZ ҰRZ)&O[hLJS U݂csb3VpB">Z g)ALh'u8K A zd-eXP)4aC2hAp60TZE4%r\OUVA!^UaRXU8SS' ʂ9MW,@+e52+@8E.@0a2=*@Ah[b aC*-NC4Ђ9)@{i -n 2JI9?@ӰeK*LH229@IcxЪʤh+p*-4՜MG$$h`ZMn2(nòOЊarJxVD VHhuKX0LKc<=@  s`РAJI P_%C:ACl$)nZP2t hAe”$*LLNL-H5Z-ZFP-092190c/test/test_zfp_052.h5000066400000000000000000000353301447422177700172510ustar00rootroot00000000000000HDF  :`TREE0HEAPX(originalcompressed0 ?@4 4 G[\xSNODx  ?@4 4 X }8H5Z-ZFP-0.9.0 (ZFP-0.5.2) github.com/LLNL/H5Z-ZFPRzfpp(G[\6p1@!l1@\!C1@@72@+Z"2@t1=2@Z2@u2@oXa2@02@y2@2@z3@kI3@83@wS3@n̗o3@kq3@&oЦ3@Y>3@%93@q=3@x\4@g:04@tYhL4@ g4@/2є4@{ 4@$^De4@ 4@% UqC4@:'y 5@._'5@S!D"C5@nI?^5@,/،y5@ Ô5@H?5@ɷ5@O 5@N<ُ6@$1U6@RW66@^OUQ6@l l6@P[6@#6@/Aȼ6@ɰH`6@|Zk},6@ 7@e'7@cA7@17\7@IVv7@y17@rz7@`z7@L@;7@jqU)7@7H88@05-8@CNG8@{h`8@f@z8@"\8@8@ BT8@FG8@mB<8@Ie~9@,9@ F9@y9_9@r;Zx9@>>9@809@o̸w9@I߸9@w8<9@t :@tn%:@pddn=:@ف-V:@ aJn:@[ :@7{:@Gﭶ:@ҙFk:@鐿[U:@kz:@4;@?U.-;@VDHD;@n&+\;@ _fs;@Jڕ;@h;@Mv;@Ol;@cI-;@;@}<@SM*<@lYw{@<@V<@`cl<@e"<@Ϻ<@|ߔЮ<@EF<@\m<@5Si<@{(Z=@V=@X/=@\ND=@5Z=@Hn=@ez=@ɻ@=@Ե Ӭ=@=K=@qb.=@ӼQ=@2=@l>@R&%>@zX9>@&L>@gm!`>@"cs>@قl>@{ٕ,/>@lQ>@f>@4 ý>@ K)^>@G0>>@qTo5R ?@ɉ@?@K𶜂.?@Vf@?@H`jkR?@7/d?@"8?u?@9?@~ e b?@>y?@)i?@Mk?@sK':?@:?@"`ui?@55@@T!@@:Kg@@y-@@b3&@@ .@@)>o6@@mE)>@@;} E@@&"]RM@@[ T@@1 \@@5BЉc@@ w4j@@FXDq@@yy@@ЈA@@]S@@"؍@@Ls@@{0r@@IȒ@@&@@)2@@ɖ)@@@@ͳK@@ dz@@>[p@@D<"@@yZ@@WyŅ@@2a@@@@i|L@@qM@@@@tQA@q7A@k A@1aA@n?'A@c}>A@6n-!A@ϊ&A@*A@=Q /A@Y 64A@Cٮ8A@G<6 9=A@qAA@ b]EA@NT&JA@oQNA@w;ORA@DVA@f/ZA@Bt]A@1aA@.aI\eA@oy>hA@szlA@ GoA@+sA@wdvA@<ϮnyA@鐔|A@e+A@&dgA@YA@-פ*A@0\ҊA@*XA@+8(׏A@B:A@i9A@̩;UЖA@#73A@ A@&A@ID]A@!}A@y5kA@9(A@MA@:y !A@XOvA@sȩA@<+ A@}QA@Lh#.A@TO: A@!rA@{5A@5mv~A@{A@t(A@Y)A@9tA@|ػ8A@#A@T[A@Yd} A@{A@D߲A@x2A@PA@㐻ݱA@LgA@SaѰA@A@h@@DUX@@EAWr@@˞@@\c@@Uh\@@* {k@@+ኃ@@rW|@@ˮNOtu@@g]n@@+ g@@y&_@@X@@Q@@IXRzI@@F$4A@@)H{$W:@@2@@12*@@.&?@6l?@X٠?@k|_~?@'Fl?@H?W[?@ BwI?@^+7?@h0o%?@N?@]e"?@E>@X\1>@F>@EWNŶ>@z۶>@:>@M}>@EX]Cj>@`YV>@vBC>@1^@׽>@>@Y =@r4C=@#I=@G%,=@j=@0!=@9V'Gy=@md=@^m}O=@ Oz:=@)Z%=@ؐ2=@k<@`6<@RJ<@M+cJĹ<@kxݣ<@$VR<@4%V&x<@9Va<@ڦ;K<@R5<@\|<@=<@hǬ;@;@(T;@ׂ<;@,I;@s ;@N1g;@"jP;@fNˌ9;@ 壕!;@+a ;@9[:@v%:@t<:@?:@s}:@)]nz:@3b:@]iI:@-+1:@":@o:@B9@%UDT9@9@9@q 9@9)k9@H3R9@Ϥ599@KW 9@z9@68@ae&8@7P+8@t98@h8@+m8@TS8@ "+:8@M 8@x"8@67@5'/7@I7@ u7@NN7@p~47@*8<7@5[N6@:/h6@Z$F6@Dq6@r:6@*ky6@4@8m4#4@Cl.4@#В]3@8Q=3@4ܡ3@Dm3@t=s}3@?a3@E3@ŜQ*3@;3@_2@iL2@\|"2@肟2@D2@Wg2@@L2@;,02@axH2@߿s1@T1@x'%1@^1@1@aUQ?m1@PC~Q1@8q51@Ye1@Yݏ 0@ H0@ri0@i0@0'0@ڎ8s0@MW0@b';0@_Z90@bYg@0@/@9w/@w"cb/@,+/@f.@P\Լ.@t9ۏ.@ˉ cN.@%%].@l R-@j-@F~r-@W;-@J-@p,@:{-p,@me`,@koV*,@ p+@Uaz+@ g+@MQ+@d+@v *@IuT*@R1x*@^sB*@' *@4`)@`%#)@#4l)@v247)@-[)@!(@]9+(@]b b(@-(@kS'@'@@"@'@2 :\'@jV|''@nqM&@Sg`&@l&@mW&@?#&@6~%@:#ʼ%@sЛ%@<`@PV%@#?.n#%@5ϐc$@#N$@ <̈$@1OX$@ j&$@?#@w@0#@2}R{#@ ^#@pn>o-#@+$t"@f^t"@w#T"@'mWoh"@7"@1"@ Կ!@!@ S=v!@¢KF!@\"!@G-0 @- . @m]Έ @9Z @n .+ @_ii@g"^@@?@П0@?@K +@ĻT@ZWu@>@Ky@$h@zC@ @_@@@J@Rj,4Y@JZ @%B:д@mXW@t@i8E@q7)Y@Mo@\NȲ@=_@8 @3@7z%%i@l$A@}[м@x@#cAP (@VR0#@ @L_"<@̙@$@DT@M@h@aPq@Y&@ 3@N|@KJ@9@~NO@,4Jq@2x2*@x@N<@M@4&@9 @ Br  @~ @#MT @_ @{H @R @fgf @ߓ Z/ @(!d @lE@4@],@m@嗴i@E@C/@k 1@íԽ@I@;۹q@i_+f@6 @R@@ B7խ@x=B@Jl&@Nx?fP?"&?)?ؓe(uk?GP??I7?mw?; c?fS? ңj?,w?X?*67o?ci?*F'?P3z?bY?Ӏ"M?i?$׉c"?RusU?@I(?*x?NR?rJ?W?g~v?7?@?;0 ?]N#?+0?x?+f ?N+.?⧦[?*Pb?<炚y?NR?Xye?`̤g?J,?v?$?p;?/Ĥq?^1?p;1"?Z()u?llXQ?:N^?Cqv#sޏa?e O?Pf&!OYF8]KnzO;4?:[?tM)]m?{?( P?+&kэ???+׼?i)?ryRJ?>yI-?;4BK¯? ]e?έf^ٴ?2sF? Z,d?%ssN?)cqy?-J?wG? (!??c+`J? kJ?T?%T?vB?=̰?&.<?cNDd?rbz?OyQ2?(IL?!rĔ"?Gu???d,G?"?ț?q*3?`? K'L?A&k$9?:=n+?f 1*?l7#?`/(?|,ɱ1?$6?@?Fħ:S?=s?#(J`?bߒ?EJ!j?vt?4%??.7? džl?]y?5B?H?$խj?Mcy?s?-{7q? %?l+?_v?U?ؠN?|l ?q?v0y?ԟP?\ȗ?a?H0/ ?9<@>@uM@XIXw@XH@㱋Q@lͣ@ٯ-@۸@{@T7V@I@^Fbk@v@ބ HZ@Q*@hL@-!B@5$C@ @? @K @j@ @sH$E @J GD @j @ԆL @>af @ Z @D @q6k@Ź@ ր@4@UM@vh\@"Ԕ@-t^%@kn@ΌE3@ ֦2@`0/L@eZ@~)%@ﶢ.@aEz@nj@7@c@9,@ )F@O@U#@4!@;$UA@3@C4c@W`5@{Ӳ8@'>@ ZQm@-}tR @M} @MuSB @ 8q @Ӈ9 @' @p8v @q/!@L^!@ ]k!@E _!@m-!@/gU"@b,4{P"@ـ"@@:7"@‡g"@0ն\#@.F#@w#@^[M9#@|K#@Oa K $@Aq?$@LTw0r$@S=|$@SVr$@`̆HJ %@9<%@1o%@ z/%@}M%@pS &@x=&@q&@zQ&@_b&@/zG. '@)cfA'@rf[4v'@/*L'@ɓpC'@-(@#[H(@W}(@6-(@ý(@d)@ &Q)@KbMA)@M1ؼ)@IB]Z)@X :(*@u^^*@YK*@:&*@4W-@؍-@:d@{-@-@+.2.@\i.@a.@d.@7l</@qöF/@f}/@/=h/@fwը/@ 0@ɶ-0@INw-I0@w>.e0@p܉0@X֜0@@k~0@S93h0@1Ra=0@Op 1@J='1@2 C1@cWb_1@'59{1@x!a71@1@TREE002O58 hAph04M@ [4@֗ hq$U SaVQL$7; h`„ 9L@ S@]wQZUܰ!#.N@[ *8A۲q7O@- 9OMZٲm^ I[]ZA0-P i^osZ2 +\L@+ Eze hEa¤(7I@+*S,(<"E6ɥ$)B6pd"EWݐTH#W hu, 3 NQ6r. A着A7FZT2 e&A-<+4*ˠRР .F–`d! "Dan hPDiA*O@8lcO@H p@a*F ,g# ` 9 [dF h&ЪuL0X."@t$1SF/ED#|-(ekF>% hA7 BBKO hAAaXNЂ3-UEЂ*p hAUe@0e*2dpTPaZ@ *ۀ @-IBӲЂ(ho hAEp((Ђ%ci hAED4 ( 'PtKHЂ *e# hAGQV!i hA rT hA P\ZPuZ+ZP`-ZPQaјMZPQtYZZP(ZPAhk4 hAU2 hAUQ4,Up 3.UtJvcmEZPP pK hA6h"( hAQ܆|,Eeg{ձm6@ˢ]@ @d- 6!_@ )ھ[-q@-p@Wl-{n" h)$Q&%T&@/I@` %b hMv\E$h.opqA[%AA&)YTTa4li hPmߕ6!j5 hM[gC6e֖(KDuR I @pqVD YZeR͙1$A'EڧasZQaZ hEmѦԧЊ"2) V@ڬT#: `bQd"̚g4{!.AYaZb`?lZ&-3nga[A ˆҍ`' FBgigAr\f2ArcW "<·/ix; . Gp¬Q)kY\FFҖgaS#j䟅m_}a- B}$-ZXEY4Fp#+zpgac V7fB\Y \ ȧT6u!Uܐ v8dx#Xh6ib3T Vp҄fBDhE&!B|MAњAZ ҰRZ)&O[hLJS U݂csb3VpB">Z g)ALh'u8K A zd-eXP)4aC2hAp60TZE4%r\OUVA!^UaRXU8SS' ʂ9MW,@+e52+@8E.@0a2=*@Ah[b aC*-NC4Ђ9)@{i -n 2JI9?@ӰeK*LH229@IcxЪʤh+p*-4՜MG$$h`ZMn2(nòOЊarJxVD VHhuKX0LKc<=@  s`РAJI P_%C:ACl$)nZP2t hAe”$*LLNL-H5Z-ZFP-092190c/test/test_zfp_054.h5000066400000000000000000000353301447422177700172530ustar00rootroot00000000000000HDF  :`TREE0HEAPX(originalcompressed0 ?@4 4 ZG[\xSNODx  ?@4 4 X }8H5Z-ZFP-0.9.0 (ZFP-0.5.4) github.com/LLNL/H5Z-ZFPTzfpp(ZG[\6p1@!l1@\!C1@@72@+Z"2@t1=2@Z2@u2@oXa2@02@y2@2@z3@kI3@83@wS3@n̗o3@kq3@&oЦ3@Y>3@%93@q=3@x\4@g:04@tYhL4@ g4@/2є4@{ 4@$^De4@ 4@% UqC4@:'y 5@._'5@S!D"C5@nI?^5@,/،y5@ Ô5@H?5@ɷ5@O 5@N<ُ6@$1U6@RW66@^OUQ6@l l6@P[6@#6@/Aȼ6@ɰH`6@|Zk},6@ 7@e'7@cA7@17\7@IVv7@y17@rz7@`z7@L@;7@jqU)7@7H88@05-8@CNG8@{h`8@f@z8@"\8@8@ BT8@FG8@mB<8@Ie~9@,9@ F9@y9_9@r;Zx9@>>9@809@o̸w9@I߸9@w8<9@t :@tn%:@pddn=:@ف-V:@ aJn:@[ :@7{:@Gﭶ:@ҙFk:@鐿[U:@kz:@4;@?U.-;@VDHD;@n&+\;@ _fs;@Jڕ;@h;@Mv;@Ol;@cI-;@;@}<@SM*<@lYw{@<@V<@`cl<@e"<@Ϻ<@|ߔЮ<@EF<@\m<@5Si<@{(Z=@V=@X/=@\ND=@5Z=@Hn=@ez=@ɻ@=@Ե Ӭ=@=K=@qb.=@ӼQ=@2=@l>@R&%>@zX9>@&L>@gm!`>@"cs>@قl>@{ٕ,/>@lQ>@f>@4 ý>@ K)^>@G0>>@qTo5R ?@ɉ@?@K𶜂.?@Vf@?@H`jkR?@7/d?@"8?u?@9?@~ e b?@>y?@)i?@Mk?@sK':?@:?@"`ui?@55@@T!@@:Kg@@y-@@b3&@@ .@@)>o6@@mE)>@@;} E@@&"]RM@@[ T@@1 \@@5BЉc@@ w4j@@FXDq@@yy@@ЈA@@]S@@"؍@@Ls@@{0r@@IȒ@@&@@)2@@ɖ)@@@@ͳK@@ dz@@>[p@@D<"@@yZ@@WyŅ@@2a@@@@i|L@@qM@@@@tQA@q7A@k A@1aA@n?'A@c}>A@6n-!A@ϊ&A@*A@=Q /A@Y 64A@Cٮ8A@G<6 9=A@qAA@ b]EA@NT&JA@oQNA@w;ORA@DVA@f/ZA@Bt]A@1aA@.aI\eA@oy>hA@szlA@ GoA@+sA@wdvA@<ϮnyA@鐔|A@e+A@&dgA@YA@-פ*A@0\ҊA@*XA@+8(׏A@B:A@i9A@̩;UЖA@#73A@ A@&A@ID]A@!}A@y5kA@9(A@MA@:y !A@XOvA@sȩA@<+ A@}QA@Lh#.A@TO: A@!rA@{5A@5mv~A@{A@t(A@Y)A@9tA@|ػ8A@#A@T[A@Yd} A@{A@D߲A@x2A@PA@㐻ݱA@LgA@SaѰA@A@h@@DUX@@EAWr@@˞@@\c@@Uh\@@* {k@@+ኃ@@rW|@@ˮNOtu@@g]n@@+ g@@y&_@@X@@Q@@IXRzI@@F$4A@@)H{$W:@@2@@12*@@.&?@6l?@X٠?@k|_~?@'Fl?@H?W[?@ BwI?@^+7?@h0o%?@N?@]e"?@E>@X\1>@F>@EWNŶ>@z۶>@:>@M}>@EX]Cj>@`YV>@vBC>@1^@׽>@>@Y =@r4C=@#I=@G%,=@j=@0!=@9V'Gy=@md=@^m}O=@ Oz:=@)Z%=@ؐ2=@k<@`6<@RJ<@M+cJĹ<@kxݣ<@$VR<@4%V&x<@9Va<@ڦ;K<@R5<@\|<@=<@hǬ;@;@(T;@ׂ<;@,I;@s ;@N1g;@"jP;@fNˌ9;@ 壕!;@+a ;@9[:@v%:@t<:@?:@s}:@)]nz:@3b:@]iI:@-+1:@":@o:@B9@%UDT9@9@9@q 9@9)k9@H3R9@Ϥ599@KW 9@z9@68@ae&8@7P+8@t98@h8@+m8@TS8@ "+:8@M 8@x"8@67@5'/7@I7@ u7@NN7@p~47@*8<7@5[N6@:/h6@Z$F6@Dq6@r:6@*ky6@4@8m4#4@Cl.4@#В]3@8Q=3@4ܡ3@Dm3@t=s}3@?a3@E3@ŜQ*3@;3@_2@iL2@\|"2@肟2@D2@Wg2@@L2@;,02@axH2@߿s1@T1@x'%1@^1@1@aUQ?m1@PC~Q1@8q51@Ye1@Yݏ 0@ H0@ri0@i0@0'0@ڎ8s0@MW0@b';0@_Z90@bYg@0@/@9w/@w"cb/@,+/@f.@P\Լ.@t9ۏ.@ˉ cN.@%%].@l R-@j-@F~r-@W;-@J-@p,@:{-p,@me`,@koV*,@ p+@Uaz+@ g+@MQ+@d+@v *@IuT*@R1x*@^sB*@' *@4`)@`%#)@#4l)@v247)@-[)@!(@]9+(@]b b(@-(@kS'@'@@"@'@2 :\'@jV|''@nqM&@Sg`&@l&@mW&@?#&@6~%@:#ʼ%@sЛ%@<`@PV%@#?.n#%@5ϐc$@#N$@ <̈$@1OX$@ j&$@?#@w@0#@2}R{#@ ^#@pn>o-#@+$t"@f^t"@w#T"@'mWoh"@7"@1"@ Կ!@!@ S=v!@¢KF!@\"!@G-0 @- . @m]Έ @9Z @n .+ @_ii@g"^@@?@П0@?@K +@ĻT@ZWu@>@Ky@$h@zC@ @_@@@J@Rj,4Y@JZ @%B:д@mXW@t@i8E@q7)Y@Mo@\NȲ@=_@8 @3@7z%%i@l$A@}[м@x@#cAP (@VR0#@ @L_"<@̙@$@DT@M@h@aPq@Y&@ 3@N|@KJ@9@~NO@,4Jq@2x2*@x@N<@M@4&@9 @ Br  @~ @#MT @_ @{H @R @fgf @ߓ Z/ @(!d @lE@4@],@m@嗴i@E@C/@k 1@íԽ@I@;۹q@i_+f@6 @R@@ B7խ@x=B@Jl&@Nx?fP?"&?)?ؓe(uk?GP??I7?mw?; c?fS? ңj?,w?X?*67o?ci?*F'?P3z?bY?Ӏ"M?i?$׉c"?RusU?@I(?*x?NR?rJ?W?g~v?7?@?;0 ?]N#?+0?x?+f ?N+.?⧦[?*Pb?<炚y?NR?Xye?`̤g?J,?v?$?p;?/Ĥq?^1?p;1"?Z()u?llXQ?:N^?Cqv#sޏa?e O?Pf&!OYF8]KnzO;4?:[?tM)]m?{?( P?+&kэ???+׼?i)?ryRJ?>yI-?;4BK¯? ]e?έf^ٴ?2sF? Z,d?%ssN?)cqy?-J?wG? (!??c+`J? kJ?T?%T?vB?=̰?&.<?cNDd?rbz?OyQ2?(IL?!rĔ"?Gu???d,G?"?ț?q*3?`? K'L?A&k$9?:=n+?f 1*?l7#?`/(?|,ɱ1?$6?@?Fħ:S?=s?#(J`?bߒ?EJ!j?vt?4%??.7? džl?]y?5B?H?$խj?Mcy?s?-{7q? %?l+?_v?U?ؠN?|l ?q?v0y?ԟP?\ȗ?a?H0/ ?9<@>@uM@XIXw@XH@㱋Q@lͣ@ٯ-@۸@{@T7V@I@^Fbk@v@ބ HZ@Q*@hL@-!B@5$C@ @? @K @j@ @sH$E @J GD @j @ԆL @>af @ Z @D @q6k@Ź@ ր@4@UM@vh\@"Ԕ@-t^%@kn@ΌE3@ ֦2@`0/L@eZ@~)%@ﶢ.@aEz@nj@7@c@9,@ )F@O@U#@4!@;$UA@3@C4c@W`5@{Ӳ8@'>@ ZQm@-}tR @M} @MuSB @ 8q @Ӈ9 @' @p8v @q/!@L^!@ ]k!@E _!@m-!@/gU"@b,4{P"@ـ"@@:7"@‡g"@0ն\#@.F#@w#@^[M9#@|K#@Oa K $@Aq?$@LTw0r$@S=|$@SVr$@`̆HJ %@9<%@1o%@ z/%@}M%@pS &@x=&@q&@zQ&@_b&@/zG. '@)cfA'@rf[4v'@/*L'@ɓpC'@-(@#[H(@W}(@6-(@ý(@d)@ &Q)@KbMA)@M1ؼ)@IB]Z)@X :(*@u^^*@YK*@:&*@4W-@؍-@:d@{-@-@+.2.@\i.@a.@d.@7l</@qöF/@f}/@/=h/@fwը/@ 0@ɶ-0@INw-I0@w>.e0@p܉0@X֜0@@k~0@S93h0@1Ra=0@Op 1@J='1@2 C1@cWb_1@'59{1@x!a71@1@TREE002O58 hAph04M@ [4@֗ hq$U SaVQL$7; h`„ 9L@ S@]wQZUܰ!#.N@[ *8A۲q7O@- 9OMZٲm^ I[]ZA0-P i^osZ2 +\L@+ Eze hEa¤(7I@+*S,(<"E6ɥ$)B6pd"EWݐTH#W hu, 3 NQ6r. A着A7FZT2 e&A-<+4*ˠRР .F–`d! "Dan hPDiA*O@8lcO@H p@a*F ,g# ` 9 [dF h&ЪuL0X."@t$1SF/ED#|-(ekF>% hA7 BBKO hAAaXNЂ3-UEЂ*p hAUe@0e*2dpTPaZ@ *ۀ @-IBӲЂ(ho hAEp((Ђ%ci hAED4 ( 'PtKHЂ *e# hAGQV!i hA rT hA P\ZPuZ+ZP`-ZPQaјMZPQtYZZP(ZPAhk4 hAU2 hAUQ4,Up 3.UtJvcmEZPP pK hA6h"( hAQ܆|,Eeg{ձm6@ˢ]@ @d- 6!_@ )ھ[-q@-p@Wl-{n" h)$Q&%T&@/I@` %b hMv\E$h.opqA[%AA&)YTTa4li hPmߕ6!j5 hM[gC6e֖(KDuR I @pqVD YZeR͙1$A'EڧasZQaZ hEmѦԧЊ"2) V@ڬT#: `bQd"̚g4{!.AYaZb`?lZ&-3nga[A ˆҍ`' FBgigAr\f2ArcW "<·/ix; . Gp¬Q)kY\FFҖgaS#j䟅m_}a- B}$-ZXEY4Fp#+zpgac V7fB\Y \ ȧT6u!Uܐ v8dx#Xh6ib3T Vp҄fBDhE&!B|MAњAZ ҰRZ)&O[hLJS U݂csb3VpB">Z g)ALh'u8K A zd-eXP)4aC2hAp60TZE4%r\OUVA!^UaRXU8SS' ʂ9MW,@+e52+@8E.@0a2=*@Ah[b aC*-NC4Ђ9)@{i -n 2JI9?@ӰeK*LH229@IcxЪʤh+p*-4՜MG$$h`ZMn2(nòOЊarJxVD VHhuKX0LKc<=@  s`РAJI P_%C:ACl$)nZP2t hAe”$*LLNL-H5Z-ZFP-092190c/test/test_zfp_110050.h5000066400000000000000000000330601447422177700174670ustar00rootroot00000000000000HDF  06`TREE0HEAPX(originalcompressed0 ?@4 4 bxSNODx  ?@4 4 @ } H5Z-ZFP-1.1.0 (ZFP-0.5.0)Qzfp(b06p1@!l1@\!C1@@72@+Z"2@t1=2@Z2@u2@oXa2@02@y2@2@z3@kI3@83@wS3@n̗o3@kq3@&oЦ3@Y>3@%93@q=3@x\4@g:04@tYhL4@ g4@/2є4@{ 4@$^De4@ 4@% UqC4@:'y 5@._'5@S!D"C5@nI?^5@,/،y5@ Ô5@H?5@ɷ5@O 5@N<ُ6@$1U6@RW66@^OUQ6@l l6@P[6@#6@/Aȼ6@ɰH`6@|Zk},6@ 7@e'7@cA7@17\7@IVv7@y17@rz7@`z7@L@;7@jqU)7@7H88@05-8@CNG8@{h`8@f@z8@"\8@8@ BT8@FG8@mB<8@Ie~9@,9@ F9@y9_9@r;Zx9@>>9@809@o̸w9@I߸9@w8<9@t :@tn%:@pddn=:@ف-V:@ aJn:@[ :@7{:@Gﭶ:@ҙFk:@鐿[U:@kz:@4;@?U.-;@VDHD;@n&+\;@ _fs;@Jڕ;@h;@Mv;@Ol;@cI-;@;@}<@SM*<@lYw{@<@V<@`cl<@e"<@Ϻ<@|ߔЮ<@EF<@\m<@5Si<@{(Z=@V=@X/=@\ND=@5Z=@Hn=@ez=@ɻ@=@Ե Ӭ=@=K=@qb.=@ӼQ=@2=@l>@R&%>@zX9>@&L>@gm!`>@"cs>@قl>@{ٕ,/>@lQ>@f>@4 ý>@ K)^>@G0>>@qTo5R ?@ɉ@?@K𶜂.?@Vf@?@H`jkR?@7/d?@"8?u?@9?@~ e b?@>y?@)i?@Mk?@sK':?@:?@"`ui?@55@@T!@@:Kg@@y-@@b3&@@ .@@)>o6@@mE)>@@;} E@@&"]RM@@[ T@@1 \@@5BЉc@@ w4j@@FXDq@@yy@@ЈA@@]S@@"؍@@Ls@@{0r@@IȒ@@&@@)2@@ɖ)@@@@ͳK@@ dz@@>[p@@D<"@@yZ@@WyŅ@@2a@@@@i|L@@qM@@@@tQA@q7A@k A@1aA@n?'A@c}>A@6n-!A@ϊ&A@*A@=Q /A@Y 64A@Cٮ8A@G<6 9=A@qAA@ b]EA@NT&JA@oQNA@w;ORA@DVA@f/ZA@Bt]A@1aA@.aI\eA@oy>hA@szlA@ GoA@+sA@wdvA@<ϮnyA@鐔|A@e+A@&dgA@YA@-פ*A@0\ҊA@*XA@+8(׏A@B:A@i9A@̩;UЖA@#73A@ A@&A@ID]A@!}A@y5kA@9(A@MA@:y !A@XOvA@sȩA@<+ A@}QA@Lh#.A@TO: A@!rA@{5A@5mv~A@{A@t(A@Y)A@9tA@|ػ8A@#A@T[A@Yd} A@{A@D߲A@x2A@PA@㐻ݱA@LgA@SaѰA@A@h@@DUX@@EAWr@@˞@@\c@@Uh\@@* {k@@+ኃ@@rW|@@ˮNOtu@@g]n@@+ g@@y&_@@X@@Q@@IXRzI@@F$4A@@)H{$W:@@2@@12*@@.&?@6l?@X٠?@k|_~?@'Fl?@H?W[?@ BwI?@^+7?@h0o%?@N?@]e"?@E>@X\1>@F>@EWNŶ>@z۶>@:>@M}>@EX]Cj>@`YV>@vBC>@1^@׽>@>@Y =@r4C=@#I=@G%,=@j=@0!=@9V'Gy=@md=@^m}O=@ Oz:=@)Z%=@ؐ2=@k<@`6<@RJ<@M+cJĹ<@kxݣ<@$VR<@4%V&x<@9Va<@ڦ;K<@R5<@\|<@=<@hǬ;@;@(T;@ׂ<;@,I;@s ;@N1g;@"jP;@fNˌ9;@ 壕!;@+a ;@9[:@v%:@t<:@?:@s}:@)]nz:@3b:@]iI:@-+1:@":@o:@B9@%UDT9@9@9@q 9@9)k9@H3R9@Ϥ599@KW 9@z9@68@ae&8@7P+8@t98@h8@+m8@TS8@ "+:8@M 8@x"8@67@5'/7@I7@ u7@NN7@p~47@*8<7@5[N6@:/h6@Z$F6@Dq6@r:6@*ky6@4@8m4#4@Cl.4@#В]3@8Q=3@4ܡ3@Dm3@t=s}3@?a3@E3@ŜQ*3@;3@_2@iL2@\|"2@肟2@D2@Wg2@@L2@;,02@axH2@߿s1@T1@x'%1@^1@1@aUQ?m1@PC~Q1@8q51@Ye1@Yݏ 0@ H0@ri0@i0@0'0@ڎ8s0@MW0@b';0@_Z90@bYg@0@/@9w/@w"cb/@,+/@f.@P\Լ.@t9ۏ.@ˉ cN.@%%].@l R-@j-@F~r-@W;-@J-@p,@:{-p,@me`,@koV*,@ p+@Uaz+@ g+@MQ+@d+@v *@IuT*@R1x*@^sB*@' *@4`)@`%#)@#4l)@v247)@-[)@!(@]9+(@]b b(@-(@kS'@'@@"@'@2 :\'@jV|''@nqM&@Sg`&@l&@mW&@?#&@6~%@:#ʼ%@sЛ%@<`@PV%@#?.n#%@5ϐc$@#N$@ <̈$@1OX$@ j&$@?#@w@0#@2}R{#@ ^#@pn>o-#@+$t"@f^t"@w#T"@'mWoh"@7"@1"@ Կ!@!@ S=v!@¢KF!@\"!@G-0 @- . @m]Έ @9Z @n .+ @_ii@g"^@@?@П0@?@K +@ĻT@ZWu@>@Ky@$h@zC@ @_@@@J@Rj,4Y@JZ @%B:д@mXW@t@i8E@q7)Y@Mo@\NȲ@=_@8 @3@7z%%i@l$A@}[м@x@#cAP (@VR0#@ @L_"<@̙@$@DT@M@h@aPq@Y&@ 3@N|@KJ@9@~NO@,4Jq@2x2*@x@N<@M@4&@9 @ Br  @~ @#MT @_ @{H @R @fgf @ߓ Z/ @(!d @lE@4@],@m@嗴i@E@C/@k 1@íԽ@I@;۹q@i_+f@6 @R@@ B7խ@x=B@Jl&@Nx?fP?"&?)?ؓe(uk?GP??I7?mw?; c?fS? ңj?,w?X?*67o?ci?*F'?P3z?bY?Ӏ"M?i?$׉c"?RusU?@I(?*x?NR?rJ?W?g~v?7?@?;0 ?]N#?+0?x?+f ?N+.?⧦[?*Pb?<炚y?NR?Xye?`̤g?J,?v?$?p;?/Ĥq?^1?p;1"?Z()u?llXQ?:N^?Cqv#sޏa?e O?Pf&!OYF8]KnzO;4?:[?tM)]m?{?( P?+&kэ???+׼?i)?ryRJ?>yI-?;4BK¯? ]e?έf^ٴ?2sF? Z,d?%ssN?)cqy?-J?wG? (!??c+`J? kJ?T?%T?vB?=̰?&.<?cNDd?rbz?OyQ2?(IL?!rĔ"?Gu???d,G?"?ț?q*3?`? K'L?A&k$9?:=n+?f 1*?l7#?`/(?|,ɱ1?$6?@?Fħ:S?=s?#(J`?bߒ?EJ!j?vt?4%??.7? džl?]y?5B?H?$խj?Mcy?s?-{7q? %?l+?_v?U?ؠN?|l ?q?v0y?ԟP?\ȗ?a?H0/ ?9<@>@uM@XIXw@XH@㱋Q@lͣ@ٯ-@۸@{@T7V@I@^Fbk@v@ބ HZ@Q*@hL@-!B@5$C@ @? @K @j@ @sH$E @J GD @j @ԆL @>af @ Z @D @q6k@Ź@ ր@4@UM@vh\@"Ԕ@-t^%@kn@ΌE3@ ֦2@`0/L@eZ@~)%@ﶢ.@aEz@nj@7@c@9,@ )F@O@U#@4!@;$UA@3@C4c@W`5@{Ӳ8@'>@ ZQm@-}tR @M} @MuSB @ 8q @Ӈ9 @' @p8v @q/!@L^!@ ]k!@E _!@m-!@/gU"@b,4{P"@ـ"@@:7"@‡g"@0ն\#@.F#@w#@^[M9#@|K#@Oa K $@Aq?$@LTw0r$@S=|$@SVr$@`̆HJ %@9<%@1o%@ z/%@}M%@pS &@x=&@q&@zQ&@_b&@/zG. '@)cfA'@rf[4v'@/*L'@ɓpC'@-(@#[H(@W}(@6-(@ý(@d)@ &Q)@KbMA)@M1ؼ)@IB]Z)@X :(*@u^^*@YK*@:&*@4W-@؍-@:d@{-@-@+.2.@\i.@a.@d.@7l</@qöF/@f}/@/=h/@fwը/@ 0@ɶ-0@INw-I0@w>.e0@p܉0@X֜0@@k~0@S93h0@1Ra=0@Op 1@J='1@2 C1@cWb_1@'59{1@x!a71@1@TREE001034 hAp hAt hq ha he˔ h`„ hd hUqÆ hUu hUp hU`ô hUd˶ ha huô hp4 ht4 hd hEa¤ hEe hEp hEt hEd ha hu hp h` ht0 hPq0 hPa hPUA hPa hP hPT! hPDi hM h) h h` h h@ h& hT&H hH hD7H hA'L hAQ( hAQ( hA7 hAAaX hAAtX hAu hAd hAUe@ hAUd hAu hA` hAEq hAEuK hAEp hAEt hAED hAQ hAA hAq hA hAA hA hA hAEm hAE hAEE hAEe hA hAݢ hAU2 hAU hA hA hAA& hAA& hA6 hAQ܆ hAQن hAݖ hDX h hT\ h\" h@ h h h) h  h- hM hPI hPM hPIJ hPM hPm hPi hM[ hmS hm hI hI hEI hEI hEI hEm hEm hEM hiP hIP hm hMY hU hU% hU hU hU h! h% h! h% h!J hA% hA! hAC hA hK h h %hP"!hPؠ%hP٢!h2IhݰmhE"mhEIhE0ih" h2-hU -hU0 hDh"DhdhA2@hA2hA2hhٔ,hPݤahئhE%hE4mh& hU6`hU6hlh٦ hAؐAh%hhPYhY`hEYhhYEhUIh]0hA(hؖmh)Jh-h hmhAh]0g)g)g)g gigMKga[gZg04gArg 9g(143@%93@q=3@x\4@g:04@tYhL4@ g4@/2є4@{ 4@$^De4@ 4@% UqC4@:'y 5@._'5@S!D"C5@nI?^5@,/،y5@ Ô5@H?5@ɷ5@O 5@N<ُ6@$1U6@RW66@^OUQ6@l l6@P[6@#6@/Aȼ6@ɰH`6@|Zk},6@ 7@e'7@cA7@17\7@IVv7@y17@rz7@`z7@L@;7@jqU)7@7H88@05-8@CNG8@{h`8@f@z8@"\8@8@ BT8@FG8@mB<8@Ie~9@,9@ F9@y9_9@r;Zx9@>>9@809@o̸w9@I߸9@w8<9@t :@tn%:@pddn=:@ف-V:@ aJn:@[ :@7{:@Gﭶ:@ҙFk:@鐿[U:@kz:@4;@?U.-;@VDHD;@n&+\;@ _fs;@Jڕ;@h;@Mv;@Ol;@cI-;@;@}<@SM*<@lYw{@<@V<@`cl<@e"<@Ϻ<@|ߔЮ<@EF<@\m<@5Si<@{(Z=@V=@X/=@\ND=@5Z=@Hn=@ez=@ɻ@=@Ե Ӭ=@=K=@qb.=@ӼQ=@2=@l>@R&%>@zX9>@&L>@gm!`>@"cs>@قl>@{ٕ,/>@lQ>@f>@4 ý>@ K)^>@G0>>@qTo5R ?@ɉ@?@K𶜂.?@Vf@?@H`jkR?@7/d?@"8?u?@9?@~ e b?@>y?@)i?@Mk?@sK':?@:?@"`ui?@55@@T!@@:Kg@@y-@@b3&@@ .@@)>o6@@mE)>@@;} E@@&"]RM@@[ T@@1 \@@5BЉc@@ w4j@@FXDq@@yy@@ЈA@@]S@@"؍@@Ls@@{0r@@IȒ@@&@@)2@@ɖ)@@@@ͳK@@ dz@@>[p@@D<"@@yZ@@WyŅ@@2a@@@@i|L@@qM@@@@tQA@q7A@k A@1aA@n?'A@c}>A@6n-!A@ϊ&A@*A@=Q /A@Y 64A@Cٮ8A@G<6 9=A@qAA@ b]EA@NT&JA@oQNA@w;ORA@DVA@f/ZA@Bt]A@1aA@.aI\eA@oy>hA@szlA@ GoA@+sA@wdvA@<ϮnyA@鐔|A@e+A@&dgA@YA@-פ*A@0\ҊA@*XA@+8(׏A@B:A@i9A@̩;UЖA@#73A@ A@&A@ID]A@!}A@y5kA@9(A@MA@:y !A@XOvA@sȩA@<+ A@}QA@Lh#.A@TO: A@!rA@{5A@5mv~A@{A@t(A@Y)A@9tA@|ػ8A@#A@T[A@Yd} A@{A@D߲A@x2A@PA@㐻ݱA@LgA@SaѰA@A@h@@DUX@@EAWr@@˞@@\c@@Uh\@@* {k@@+ኃ@@rW|@@ˮNOtu@@g]n@@+ g@@y&_@@X@@Q@@IXRzI@@F$4A@@)H{$W:@@2@@12*@@.&?@6l?@X٠?@k|_~?@'Fl?@H?W[?@ BwI?@^+7?@h0o%?@N?@]e"?@E>@X\1>@F>@EWNŶ>@z۶>@:>@M}>@EX]Cj>@`YV>@vBC>@1^@׽>@>@Y =@r4C=@#I=@G%,=@j=@0!=@9V'Gy=@md=@^m}O=@ Oz:=@)Z%=@ؐ2=@k<@`6<@RJ<@M+cJĹ<@kxݣ<@$VR<@4%V&x<@9Va<@ڦ;K<@R5<@\|<@=<@hǬ;@;@(T;@ׂ<;@,I;@s ;@N1g;@"jP;@fNˌ9;@ 壕!;@+a ;@9[:@v%:@t<:@?:@s}:@)]nz:@3b:@]iI:@-+1:@":@o:@B9@%UDT9@9@9@q 9@9)k9@H3R9@Ϥ599@KW 9@z9@68@ae&8@7P+8@t98@h8@+m8@TS8@ "+:8@M 8@x"8@67@5'/7@I7@ u7@NN7@p~47@*8<7@5[N6@:/h6@Z$F6@Dq6@r:6@*ky6@4@8m4#4@Cl.4@#В]3@8Q=3@4ܡ3@Dm3@t=s}3@?a3@E3@ŜQ*3@;3@_2@iL2@\|"2@肟2@D2@Wg2@@L2@;,02@axH2@߿s1@T1@x'%1@^1@1@aUQ?m1@PC~Q1@8q51@Ye1@Yݏ 0@ H0@ri0@i0@0'0@ڎ8s0@MW0@b';0@_Z90@bYg@0@/@9w/@w"cb/@,+/@f.@P\Լ.@t9ۏ.@ˉ cN.@%%].@l R-@j-@F~r-@W;-@J-@p,@:{-p,@me`,@koV*,@ p+@Uaz+@ g+@MQ+@d+@v *@IuT*@R1x*@^sB*@' *@4`)@`%#)@#4l)@v247)@-[)@!(@]9+(@]b b(@-(@kS'@'@@"@'@2 :\'@jV|''@nqM&@Sg`&@l&@mW&@?#&@6~%@:#ʼ%@sЛ%@<`@PV%@#?.n#%@5ϐc$@#N$@ <̈$@1OX$@ j&$@?#@w@0#@2}R{#@ ^#@pn>o-#@+$t"@f^t"@w#T"@'mWoh"@7"@1"@ Կ!@!@ S=v!@¢KF!@\"!@G-0 @- . @m]Έ @9Z @n .+ @_ii@g"^@@?@П0@?@K +@ĻT@ZWu@>@Ky@$h@zC@ @_@@@J@Rj,4Y@JZ @%B:д@mXW@t@i8E@q7)Y@Mo@\NȲ@=_@8 @3@7z%%i@l$A@}[м@x@#cAP (@VR0#@ @L_"<@̙@$@DT@M@h@aPq@Y&@ 3@N|@KJ@9@~NO@,4Jq@2x2*@x@N<@M@4&@9 @ Br  @~ @#MT @_ @{H @R @fgf @ߓ Z/ @(!d @lE@4@],@m@嗴i@E@C/@k 1@íԽ@I@;۹q@i_+f@6 @R@@ B7խ@x=B@Jl&@Nx?fP?"&?)?ؓe(uk?GP??I7?mw?; c?fS? ңj?,w?X?*67o?ci?*F'?P3z?bY?Ӏ"M?i?$׉c"?RusU?@I(?*x?NR?rJ?W?g~v?7?@?;0 ?]N#?+0?x?+f ?N+.?⧦[?*Pb?<炚y?NR?Xye?`̤g?J,?v?$?p;?/Ĥq?^1?p;1"?Z()u?llXQ?:N^?Cqv#sޏa?e O?Pf&!OYF8]KnzO;4?:[?tM)]m?{?( P?+&kэ???+׼?i)?ryRJ?>yI-?;4BK¯? ]e?έf^ٴ?2sF? Z,d?%ssN?)cqy?-J?wG? (!??c+`J? kJ?T?%T?vB?=̰?&.<?cNDd?rbz?OyQ2?(IL?!rĔ"?Gu???d,G?"?ț?q*3?`? K'L?A&k$9?:=n+?f 1*?l7#?`/(?|,ɱ1?$6?@?Fħ:S?=s?#(J`?bߒ?EJ!j?vt?4%??.7? džl?]y?5B?H?$խj?Mcy?s?-{7q? %?l+?_v?U?ؠN?|l ?q?v0y?ԟP?\ȗ?a?H0/ ?9<@>@uM@XIXw@XH@㱋Q@lͣ@ٯ-@۸@{@T7V@I@^Fbk@v@ބ HZ@Q*@hL@-!B@5$C@ @? @K @j@ @sH$E @J GD @j @ԆL @>af @ Z @D @q6k@Ź@ ր@4@UM@vh\@"Ԕ@-t^%@kn@ΌE3@ ֦2@`0/L@eZ@~)%@ﶢ.@aEz@nj@7@c@9,@ )F@O@U#@4!@;$UA@3@C4c@W`5@{Ӳ8@'>@ ZQm@-}tR @M} @MuSB @ 8q @Ӈ9 @' @p8v @q/!@L^!@ ]k!@E _!@m-!@/gU"@b,4{P"@ـ"@@:7"@‡g"@0ն\#@.F#@w#@^[M9#@|K#@Oa K $@Aq?$@LTw0r$@S=|$@SVr$@`̆HJ %@9<%@1o%@ z/%@}M%@pS &@x=&@q&@zQ&@_b&@/zG. '@)cfA'@rf[4v'@/*L'@ɓpC'@-(@#[H(@W}(@6-(@ý(@d)@ &Q)@KbMA)@M1ؼ)@IB]Z)@X :(*@u^^*@YK*@:&*@4W-@؍-@:d@{-@-@+.2.@\i.@a.@d.@7l</@qöF/@f}/@/=h/@fwը/@ 0@ɶ-0@INw-I0@w>.e0@p܉0@X֜0@@k~0@S93h0@1Ra=0@Op 1@J='1@2 C1@cWb_1@'59{1@x!a71@1@TREE001034 hAp hAt hq ha he˔ h`„ hd hUqÆ hUu hUp hU`ô hUd˶ ha huô hp4 ht4 hd hEa¤ hEe hEp hEt hEd ha hu hp h` ht0 hPq0 hPa hPUA hPa hP hPT! hPDi hM h) h h` h h@ h& hT&H hH hD7H hA'L hAQ( hAQ( hA7 hAAaX hAAtX hAu hAd hAUe@ hAUd hAu hA` hAEq hAEuK hAEp hAEt hAED hAQ hAA hAq hA hAA hA hA hAEm hAE hAEE hAEe hA hAݢ hAU2 hAU hA hA hAA& hAA& hA6 hAQ܆ hAQن hAݖ hDX h hT\ h\" h@ h h h) h  h- hM hPI hPM hPIJ hPM hPm hPi hM[ hmS hm hI hI hEI hEI hEI hEm hEm hEM hiP hIP hm hMY hU hU% hU hU hU h! h% h! h% h!J hA% hA! hAC hA hK h h %hP"!hPؠ%hP٢!h2IhݰmhE"mhEIhE0ih" h2-hU -hU0 hDh"DhdhA2@hA2hA2hhٔ,hPݤahئhE%hE4mh& hU6`hU6hlh٦ hAؐAh%hhPYhY`hEYhhYEhUIh]0hA(hؖmh)Jh-h hmhAh]0g)g)g)g gigMKga[gZg04gArg 9g(14Y@39؉%@3=q@4\y@40:g@4LhYt@4g @4ш2/@4 {@4eD^%@4լ @4CqU %@5 y':@5'_.@5C"D!R@5^?In@5y/,@5 @5?H@5@5 O@6>@908@9wo@9۸߶I@9<8w@: t@:%nt@:=nddo@:V-ټ@:nJa @: [@:{7@:G@:kF@:U[@:zk@;4@;-.U?@;DHDV@;\+&n@;sf_ @;ڇJ@;h@;vM@;ϗlO@;-Ic@;@<}@<*MS@<@{wYl@ϳl@>%Ѿ&R@>9Xz@>L&@>`!mg@>sc"@>l@>/,{@>Ql@>f@> 6@>^)K @>>0G@? R5oTr@?@@?.K@?@fW@?Rkj`H@?d/7@?u?8"@?9@?b e }@?y=@?i(@?kM@?:'Ks@?:@?iu`!@@55@@!T@@gK:@@-y@@&3b@@. @@6o>*@@>)Em@@E }<@@MR]"'@@T [@@\ 1@@cЉB5@@j4w @@qDXF@@yy@@Aп@@S]@@ؼ"@@sL@@r0{@@I@@&@@2)@@)ݖ@@@@K@@zd @@Οp[?@@ԝ"}c@A!-n6@A&ϰ@A*ʆ@A/ Q<@A46 Y@A8Cۂ@A=9 6yo@Alzs@AoGŪ@As+@Avdw@Ayn<@A|@A+e@Agd&@AY@A*-@Aҿ\0@AX*@A(8+@A:B@A9i@AU;@A37#@A ۢ@A&@A]DI@A}!@Ak5y@A(9@AM@A! y:@AvOX@As@A +<@AQ}@A.#hL@A :OU@Ar!@A5{@A~vm5@A{@A(t@A)Y@At9@A8|@A#ڀ@A[T@A }dY@A{@AC@A2x@AP@Aݽ@AgL@AaS@A@A\&T<@A'@A'a@A(@@ATX@A_0@A)Zv@An@AR8@Ax-@A7@AS(@AײMW@AS@A 4Q*@A @@A@AY26@Acj@A@ATk;@A}@Ar @A?Y@AI0X@A/3&@A~=j[@A{"Z@AxBl{@AtӾ lQ@Aq{(@An1C@Aj"@AgFb@Acŝ@A_ˍ @A\0\n@AXESԻ@ATF}Q@APL7a@AL,Λ@AG9@ACɞho@A?X)@A:Ȝ0Q@A6w"@A1.O@A-'5@A(jX@A#l @A@Aɧ@Aa"2G@A}~g@A =x@Ag}@@jSM@@_@@f@@_;-@@?}UG@@t^8@@ݐLY@@ה{@@Ѥ"_t@@ˀq@@\UBMt@@,q@@ԘC @@h>W@.@@XUD@@rWAF@@˴@@c\@@\hU@@k{ )@@+@@|Wr@@utON@@n]glj@@g +@@_&y@@X@@Q@@IzRXI@@A4$F@@:W${H)@@2@@*̡21@@"5/<-@@kB@@Cvq@@ ?@@@?@@?䌇?n@?˜.@?! @?&>C@?l6@?X@?~_|l@?lF'@?[W?G@?IwB @?7+^@?%o0h@?N@?"e]@>E@>1\X@>ɀF@>NWE@>z@>:@>}M@>jC]XE@>VY`@>CBv@>/<^1@>@>ﶾ@= Y@=C4q@=ːI#@=,%G@=j@=!0@=yG'V8@=dm@=O}m^@=:zO @=%Z)@=2@h`@74~Ϋp@7<8*@6N[5@6h/:@6F$Z@6qD@6ѓ:r@6yk*@6_/<@6DS~&@6)rx@6uEo@5r36@53oah@5Yt=+@5]"߬y@5+]@5k@5P|@55o6@5@4U@4o%(l@4 @4 @4ͮ@4ueD@4Z+ %@4>K@4#4m8@4.lC@3]#@3=Q9@3͡5@3mD@3}s=s@3a?@3E@3*Q@3;@2_@2Li@2"|\@2蝘@2D@2gW@2L?@20,;@2Hxa@1sۿߙ@1ܶTͷ@1%'x@1繓^@1@1m?QUa@1Q~CP@15q8@1eY@0 Y@0H @0ir@0i@0'0@0s8@0WM@0;'b@09Z^@0@gYb@/@/w9@/bc"w@/+,@.f޶@.ԡ\P@.9t@.Nc @.]%%@-R l@-j@-r~ʠF@-;W@-J@,o@,p-{;@,`em@,*Voލk@+p @+zaU@+g @+QM@+d@* v@*TuI@*x1R@*BsԿ^@* '@)׍`4@)#р%`@)l4$@)74ێ2w@)[-@(˯!@(+9]@(b b]@(-ك@'Sk@'ʎ@'@"@@'\: 2@''|Vj@&Mqn@&`gS@&l@&Wl@&#?݀@%~6@%#:۠@%s@%VP@`<@%#n.?#@$c5@$N#@$< @$XO1@$&j DŽ@#?@#0@w@#{R}2@#^ @#-o>np@"t$+@"t^f@"T#w@"hoWm'@"7@"1@!Ԓ @!@!v=S @!FK@!"\@ 0-G@ . -@ ]Ձn@ Z9@ +. n@ii_@^"gߎ@?@@0@셐@@+ ŧK@пT@uWZ@=@yK@h%@Cz@ @_@@@ӖJ@Y4,jR@ ZJ@:B%@WȕXm@t@E8i@Y)7q@oM@ȲN[@_=@ 8@3@i%%z8@A$l@ǼЎ[}@x@( PAc#@#0RV@ @<"_L@躙@$@TD@M@h@qPa@&Y@3 @|N@JK@9@ON~@qJ4ǽ*@*2x2@džx @9?Pf?&"?)?ku(e?PG??7I?wm?c ;?Sf?j ?w,?X?o76+?ic?'F*?z3P?Yb?M"?i?"c$?UsuR?(IA?x*?RN?Jr?W֋?v~g?蚾8?@? 0;?#N]?0+?x꾘? f*?.+N?[ܦ?bPگ*?y?O e !&fOFYOK]8?4;Ozp?[:?m])Mt?{㳐?P (?k&*?ҹ??+?)i?JRyr?-Iy>?KB4;?e] ?^f?Fs2?d,Z ?Nss%?yqc(?J-?G߶w?!( ?򻮱?J`+c?Jk ?T?T%Ą?ёBv?Ұ=?<.&?dDNc?zbq?2QyN?٦LI(?"r ?ܩuG???G,d?"??3*q?`?L'K ?9$k&A?+n=:?*1 f?#7l?(/O?1ɞ,|?@?6$?S:G?s=?`J(#?ﲒP?j!JE?tv?%4?7.??l ?y]Ŵ?ݨB5?H?j$?ycM?s̕?q7{-?% ?ݽ+m?v_?N?U? l|?q?y0v?Pܟ?\Ԡ?ݚa? /0H@<9@>@Muқ@wXIX@HX@Q@l@-٦@@{@V7T@I!@kbF_@v@ZH @*Q@Lh@B!2@C$5@ @ ?䰭@ K@ @j@ E$Hr@ DG K@ j@ L@ fa>@ Z @ D@k6u@@֙ Ɠ@4@MU@\hv@ݔ"@%^t-"@nk@3EΑ@2 @L/0a@Zg@%)~@.@zEa@jnѸ@7@cհ@,9@F) @O@#U@!4@AU$;@3@c4C@5`W@8{@܂>&@/@t<@-yZ@(@-V;@g4|@k;v)@.5a@bQ@ۦQ@3,I@MŖ@NI@< t@h@P?@I5@M @րA @YY]@@Ц3@mQZ>@ Rt}-@ Ý}M@ BSuM@ q8 @ 9@ '@ v8p@!/q@!^шK@!k] @!_ E@!-l@"Ug.@"P{4,b@"ٸ@"7:@@"g@#\Ŷ0@#F.@#w@#9M[^@#KϬ|@$ K aP@$?qA@$r0wTM@$|=S@$rVS@% JHa@%<9@%o1@%/z @%֫M}@& Spʋ@&=x@&qҎ@&Qy@&b_@' .Gz/@'Afc)@'v4[fr@'L*/@'Cp@(ߕ-@(H[€#@(}W@(-6@(Ê@)d@)Qˋ& @)AMbK@)1M@)Z]BI@*(: XĀ@*^^u@*KY@*ɰ&:@+T<4@+5N8@+lǛ@+-@+ؐ{{y@,.^#@,Eh@,{_@,@,g* @- Őh%@-W>@-ũ@-ĩ{@d:@-˄@.2.+@.i\@.ȇa@.d@/w@0ܘp@0X@0~k?@0h39S@0=aR1@1 pO@1'ُ=J@1C 2@1_bWc@1{95&@17a!x@1TREE0!8?tG hAph04]qy] qD[9H@ [4@֗>\sC hqh}өG|v( $U SakNuS#*VQL$7;H+RJ2`Dm* h`„ 9MOVLTcKxH@ S@]w}.S9G,@ZUܰ!#.fIZç<|&wW,CH@[ 8XN7V*8A۲q7ECm>:WH@- 9O 9>n3@z @Zٲm^ZjmNVeU I[#9[ʵ'o~ƫ@ZA0-PpvErLTF>^ i^oe}: ~Ρ@Z2 +\]TEk]VP9H@+ Eze I?E˖Pl hEa¤(7aqUJdD;;H@+*S,(<}=?,Q "E6ɥ NIt8"׸$)B6pdD h/d"EW`l,@ǏFvCv(TH#W@,^H|6[eX hu, /So#^0X^  NQ6r.Nc5̠ AHaaRTN-: A7FZAuf.ѷ @T2 erΒ!vA  $A-<+!|Ɇ׷>WMMb:IaW4*ˠRG"ev=^Р .FV֍UAk({``dsHcEz~ThkU  "Dan*94}_%( hPDiA*Rva}'|w }];H@8lc%{;Ugv~B/H@H 0>3RlAe2SZG @@a*F0hR]dP$pm^ ,g# x命B5($ȿX(` 9w˘Bပ̖bt, [dFގ+S8r?"Z h&Ъue>s>B@_Ոٮ!L0X˦!0~ګ,Zhyߡ,"/f`YhZNW@t$1S[8q9kyzFqp#3=A@һю,ED#Y&A8eYK`-(ekF>%q=gW%> hA7 BBKO1z/A@@Wƭ hAAaXNZˮCD[Ђ3 j ps8@5N ,UE0 b:VuX^Ђ*pۙ@R hAUe@0ete;VnMʓ *2dp ^'.TPag^õHUX@ *ۀ @2jl'7> ,IBӲ׫Ux)atЂ(ho_tCL[= hAEp((FX2K Ђ%cirhRGǟHم hAED4󷀎{qV ( 'PgbN. 3PtKH0L":kS >C?W[Ђ *evb2eB['ߠС hAGQV'+B).2IcX\?X(!in6~}  hA rTkFTsRr hA P\d}}OoiZPuZ+5tF퉑Qjq@DΊ ZP`-`&>KL|) ZPQaјMù`bmRSvӫZPQtYZ*´D"] = ZP(ȼW+W7wnZPAhk4VM\&h|s( hAU2|( hAUQ40` GJߒ8ְ  ,Up 3V?.~ ,UtJvc+%z7OmE Csclt3ƫZPP pKS2\AHkr2A" hA6h"($y1;s%9 hAQ܆|ڗ4x{=ա,Eeg{ձ*Jek$+m6l~co#dX(@ˢUEkIH=5k=X@ @ŷ|%ۓ𼊠_ SP`- 6!5/AMrBX@ )ھ[A0˂[Xc ,q@Z~ KelK ,p@Wl;&>Ũ-{n")x@+խkޞ* h)$Q&Wʘ>_)Q(V\$T&@/ɍ/l`R f@ @@` %b>6O1*( hMv\{ L`tZ(E$h.o(1'wf sIrg@pqA[ XF9RLhϑ$AA&)Yǔ^~2-R~$sߡ@Ta4li~.u!_SL( hPmEcEN E-̯ 6!j5߰3u{Pd7Э hM[gCέ!,aڸ*6e&DJJ+[LY((j-Y\ Ml@DuR I>LW䪝Y/I^ @pq9BMq x-#*VD Yzumc|v@ZeR͙17tqW# $A'EڧasٳVRc j@ZQaZN7Tڙg" hEmѦԧh*Jm t@[Њ"2) :j`R[.cm>3N*V@ڬTDtUa 4hh'YDP : $Ђ @kRd7NR8@ AH@ XωpP &'ۥ~^Y -`F<ϝb dh)t(h %^o}xz1Z S$dRvAc$QhJ ]]*hPؠ%ԄA9P5um\ P *[4dq䯯2JJxNJX(p)u:dE HhU(@6-^H6R,{! q|2Mb>tFU Њih:$j13>n,lf߶Ct' fUWNULc۬#FRZ.]Y(PVmksWaN@AosE [mz(@e1uɥ$l_ Ud2L}ݾߘzʞo1[ Ђ!/ bok;׭h%@꽦x50ˍC4 ZAH.{ၥ ƕ4h`bQd Fq >*"̚g&f$n-U4{!.A)r.MԱ @YaZb`!{yÉ/"x?lZ&-3n]dޓϊWXga[A +!5 x HCˆҍ`'=cfD);𡫻P FBgi_{w,%kWi< gAr\fohO\͹18b?^2Arc7? tmǏ"}9j4P "<·:`8ChI֮^/ix; .Ny{?̬](Gp¬Q)+ 3ǸwQ[w @Y\FFҖ.K'r'udFgaS#j\-oY, 䟅m_}a-(),6 .ܫ B}$Tǧ{kGua-ZXU|$?Yn:E EY4Fp#+zp2i䚤X{Q,bI*gac ߅gF-EwV7fٙ;3Y B\^k QĜE  Y \ ȧTWdŮܐUmwo 6u$TRM{Ƙۃ-ǫ!UQSdol،DEܐ v8OZw! N 閿(dx#XS6IZ|aZfh6ib3T >-&j/1˴,*Vp҄fBD~\Ttk4XftƭhE&!B|Mb<= AњAʄn˅$ܫZ ҰRFե_]߳J Z)&O[a~5!NhLJSbhBf#/8( U݂csbCߣ@Bv(0VpB">L%ۜ፽ ġZ g)ALb%<"+Rh'u8K`6Q1<[܍m A zd-e%##f%7ZPP)4z'QQl7z٫aC2azx z!BhAp60jW%kKB/8bwD =q(pVD VH* yq]ȦDE*huK7ENn30| X0LKc%C(I+8 '쑻W:AClHr]4uE>6$)wx?& ^ƫ@ZP2t~cRI ,' hAe”$*ol%D<>LLNL-H5Z-ZFP-092190c/test/test_zfp_le.h5000066400000000000000000000474701447422177700173530ustar00rootroot00000000000000HDF  8O`TREE0HEAPX(originalcompressed0 ?@4 4` ZWxSNODx  ?@4 4 X }8H5Z-ZFP-0.2.0 (ZFP-0.5.0) github.com/LLNL/H5Z-ZFP; Pzfp`(ZW6p1@!l1@\!C1@@72@+Z"2@t1=2@Z2@u2@oXa2@02@y2@2@z3@kI3@83@wS3@n̗o3@kq3@&oЦ3@Y>3@%93@q=3@x\4@g:04@tYhL4@ g4@/2є4@{ 4@$^De4@ 4@% UqC4@:'y 5@._'5@S!D"C5@nI?^5@,/،y5@ Ô5@H?5@ɷ5@O 5@N<ُ6@$1U6@RW66@^OUQ6@l l6@P[6@#6@/Aȼ6@ɰH`6@|Zk},6@ 7@e'7@cA7@17\7@IVv7@y17@rz7@`z7@L@;7@jqU)7@7H88@05-8@CNG8@{h`8@f@z8@"\8@8@ BT8@FG8@mB<8@Ie~9@,9@ F9@y9_9@r;Zx9@>>9@809@o̸w9@I߸9@w8<9@t :@tn%:@pddn=:@ف-V:@ aJn:@[ :@7{:@Gﭶ:@ҙFk:@鐿[U:@kz:@4;@?U.-;@VDHD;@n&+\;@ _fs;@Jڕ;@h;@Mv;@Ol;@cI-;@;@}<@SM*<@lYw{@<@V<@`cl<@e"<@Ϻ<@|ߔЮ<@EF<@\m<@5Si<@{(Z=@V=@X/=@\ND=@5Z=@Hn=@ez=@ɻ@=@Ե Ӭ=@=K=@qb.=@ӼQ=@2=@l>@R&%>@zX9>@&L>@gm!`>@"cs>@قl>@{ٕ,/>@lQ>@f>@6 ý>@ K)^>@G0>>@qTo5R ?@ʉ@?@K𶜂.?@Vf@?@H`jkR?@7/d?@"8?u?@9?@~ e b?@>y?@)i?@Mk?@sK':?@:?@"`ui?@55@@T!@@:Kg@@y-@@b3&@@ .@@*>o6@@mE)>@@;} E@@&"]RM@@[ T@@1 \@@5BЉc@@ w4j@@FXDq@@yy@@ЈA@@]S@@"؍@@Ls@@|0r@@IȒ@@&@@)2@@ɖ)@@@@ͳK@@ dz@@>[p@@D<"@@yZ@@WyŅ@@2a@@@@i|L@@qM@@@@tQA@q7A@k A@1aA@n?'A@c}>A@6n-!A@ϊ&A@*A@=Q /A@Y 64A@Cٮ8A@G<6 9=A@qAA@ b]EA@NT&JA@oQNA@w;ORA@DVA@f/ZA@Bt]A@1aA@.aI\eA@oy>hA@szlA@ GoA@+sA@wdvA@<ϮnyA@鐔|A@e+A@&dgA@YA@-פ*A@0\ҊA@*XA@+8(׏A@B:A@i9A@̩;UЖA@#73A@ A@&A@ID]A@!}A@y5kA@9(A@MA@:y !A@XOvA@sȩA@<+ A@}QA@Lh#.A@TO: A@!rA@{5A@5mv~A@{A@t(A@Y)A@9tA@|ػ8A@#A@T[A@Yd} A@{A@D߲A@x2A@PA@㐻ݱA@LgA@SaѰA@A@h@@DUX@@EAWr@@˞@@\c@@Uh\@@* {k@@+ኃ@@rW|@@ˮNOtu@@g]n@@+ g@@y&_@@X@@Q@@IXRzI@@F$4A@@)H{$W:@@2@@12*@@-&?@6l?@X٠?@k|_~?@'Fl?@H?W[?@ BwI?@^+7?@h0o%?@N?@]e"?@E>@X\1>@F>@EWNŶ>@z۶>@:>@M}>@EX]Cj>@`YV>@vBC>@1^@׽>@>@Y =@r4C=@#I=@G%,=@j=@0!=@9V'Gy=@md=@^m}O=@ Oz:=@)Z%=@ؐ2=@k<@`6<@RJ<@M+cJĹ<@kxݣ<@$VR<@4%V&x<@9Va<@ڦ;K<@R5<@\|<@=<@hǬ;@;@(T;@ׂ<;@,I;@s ;@O1g;@"jP;@fNˌ9;@ 壕!;@+a ;@9[:@v%:@t<:@?:@s}:@)]nz:@3b:@]iI:@-+1:@":@o:@B9@%UDT9@9@9@q 9@9)k9@H3R9@Ϥ599@KW 9@z9@68@ae&8@7P+8@t98@h8@+m8@TS8@ "+:8@M 8@x"8@67@5'/7@I7@ u7@NN7@p~47@*8<7@5[N6@:/h6@Z$F6@Dq6@r:6@*ky6@4@8m4#4@Cl.4@#В]3@8Q=3@4ܡ3@Dm3@t=s}3@?a3@E3@ŜQ*3@;3@_2@iL2@\|"2@肟2@D2@Wg2@@L2@;,02@axH2@߿s1@T1@x'%1@^1@1@aUQ?m1@PC~Q1@8q51@Ye1@Yݏ 0@ H0@ri0@i0@0'0@ڎ8s0@MW0@b';0@_Z90@bYg@0@/@9w/@w"cb/@,+/@f.@P\Լ.@t9ۏ.@ˉ cN.@%%].@l R-@j-@F~r-@W;-@J-@p,@:{-p,@me`,@koV*,@ p+@Uaz+@ g+@MQ+@d+@v *@IuT*@R1x*@^sB*@' *@4`)@`%#)@$4l)@v247)@-[)@!(@]9+(@]b b(@-(@kS'@'@@"@'@2 :\'@jV|''@nqM&@Sg`&@l&@mW&@?#&@6~%@:#ʼ%@sЛ%@<`@PV%@#?.n#%@5ϐc$@#N$@ <̈$@1OX$@ j&$@?#@w@0#@2}R{#@ ^#@pn>o-#@+$t"@f^t"@w#T"@'mWoh"@7"@1"@ Կ!@!@ S=v!@¢KF!@\"!@G-0 @- . @n]Έ @9Z @n .+ @_ii@g"^@@?@П0@?@K +@ĻT@ZWu@>@Ky@$h@zC@ @_@@@J@Rj,4Y@JZ @%B:д@mXW@t@i8E@q7)Y@Mo@\NȲ@=_@8 @3@7z%%i@l$A@}[м@x@#cAP (@VR0#@ @L_"<@̙@$@DT@M@h@aPq@Y&@ 3@N|@KJ@9@~NO@*4Jq@2x2*@x@N<@M@4&@9 @ Br  @~ @MT @_ @{H @R @bgf @ߓ Z/ @(!d @gE@4@],@m@嗴i@E@C/@k 1@íԽ@ I@;۹q@i_+f@6 @R@@ B7խ@x=B@Jl&@Nx?fP?"&?)?ؓe(uk?GP??I7?mw?; c?fS? ңj?,w?X?*67o?ci?*F'?P3z?bY?Ӏ"M?i?$׉c"?RusU?@I(?*x?NR?rJ?W?g~v?7?@?;0 ?]N#?+0?x?+f ?N+.?⧦[?*Pb?<炚y?NR?Xye?`̤g?J,?v?$?p;?/Ĥq?^1?p;1"?Z()u?llXQ?:N^?Cqv#sޏa?e O?Pf&!OYF8]KnzO;4?:[?tM)]m?{?( P?+&kэ???+׼?i)?ryRJ?>yI-?;4BK¯? ]e?έf^ٴ?2sF? Z,d?%ssN?)cqy?-J?wG? (!??c+`J? kJ?T?%T?vB?=̰?&.<?cNDd?rbz?OyQ2?(IL?!rĔ"?Gu???d,G?"?ț?q*3?`? K'L?A&k$9?:=n+?f 1*?l7#?N/(?|,ɱ1?$6?@?Fħ:S?=s?#(J`?Qߒ?EJ!j?vt?4%??.7? džl?]y?5B?H?$խj?Mcy?s?-{7q? %?l+?_v?U?ؠN?|l ?q?v0y?ԟP?\ȗ?a?H0/ ?9<@>@uM@XIXw@XH@㱋Q@lͣ@ٯ-@۸@{@T7V@"I@^Fbk@v@ل HZ@Q*@hL@1!B@5$C@ @? @K @j@ @sH$E @J GD @j @ԆL @>af @ Z @D @u6k@ɹ@ ր@4@UM@vh\@"Ԕ@"-t^%@kn@ΌE3@ ֦2@`0/L@gZ@~)%@ﶢ.@aEz@nj@7@c@9,@ )F@O@U#@4!@;$UA@3@C4c@W`5@{Ӳ8@'>@ ZQm@-}tR @M} @MuSB @ 8q @Ӈ9 @' @p8v @q/!@L^!@ ]k!@E _!@l-!@.gU"@b,4{P"@ـ"@@:7"@‡g"@0ն\#@.F#@w#@^[M9#@|K#@Oa K $@Aq?$@LTw0r$@S=|$@SVr$@`̆HJ %@9<%@1o%@ z/%@}M%@pS &@x=&@q&@zQ&@_b&@/zG. '@)cfA'@qf[4v'@/*L'@ȓpC'@-(@#[H(@W}(@6-(@ý(@d)@ &Q)@KbMA)@M1ؼ)@IB]Z)@X :(*@u^^*@YK*@:&*@4W-@؍-@:d@{-@-@+.2.@\i.@a.@d.@7l</@qöF/@f}/@/=h/@fwը/@ 0@ɶ-0@INw-I0@w>.e0@p܉0@X֜0@@k~0@S93h0@1Ra=0@Op 1@J='1@2 C1@cWb_1@'59{1@x!a71@1@TREE0!8?tG hAph04]qy] qD[9H@ [4@֗>\sC hqh}өG|v( $U SakNuS#*VQL$7;H+RJ2`Dm h`„ 9MOVLTcKoH@ S@]w}.S9'Zë@ZUܰ!#.fIZç<|&wW yH@[ 8XN7*8A۲q7ECm>:7lH@- 9O 9>n3@:ȫ@Zٲm^ZjmNVe  I[#9[ʵ'o~ƫ@ZA0-PpvErLTV/ i^oe}: ~«@Z2 +\]TEk]VP9H@+ Eze I?E˖P* hEa¤(7aqUJdD;;H@+*S,(<}=?,QڭW"E6ɥ NIt8"׸$)B6pdD h/ŎW"EW`l,@ǏFvCTH#W@,^H|6[eX* hu, /So#^0X^  NQ6r.Nc5̠ AHaaRTN-: A7FZAuf.ѷš@T2 erΒ!vA+$A-<+!|Ɇ׷>WMMb:I[4*ˠRG"ev= Р .FV֍UAk({``dsHcEz~ThkU  "Dan*94}_;W hPDiA*Rva}'|w }LoH@8lc%{;Ugv^`xH@H 0>3RlAe2SZGb@@a*F0hR]dPR  ,g# x命B5($=` 9w˘Bပ̖@V [dFގ+S8r?"Z h&Ъue>s>B@_ՈٮAUL0X˦!0~ګ,Zhyߡ,"/f`YhZNW@t$1S[8q9kyCFqp#3=A@һю ,ED#Y&A8eY `-(ekF>%q=gWa hA7 BBKO1z/A@@W hAAaXNZˮCDЂ3 j ps8@5N ,UE0 b:VuXA^Ђ*pۙ@>;x hAUe@0ete;VnMʓUC*2dp ^'.TPag^õHfX@ *ۀ @2jl'7 ,IBӲ׫Ux)atЂ(ho_tCL[= hAEp((FX2K Ђ%cirhRGǟHم hAED4󷀎{qV ( 'PgbN. 3Pr.*tKH0L":kS >C?GPЂ *evb2eB['ߠ hAGQV'+B).2IcX\?](!in6~}  hA rTkFTs6e hA P\d}}OZPuZ+5tF퉑Qjq@DΊ ZP`-`&>KL|)ܧ ZPQaјMù`bmRSvӫZPQtYZ*´D"] = ZP(ȼW+W7wZPAhk4VM\&h|s( hAU2|(* hAUQ40` GJߒ8ְ  ,Up 3V?.~\ ,UtJvc+%z7\(mE Csclt3 ZPP pKS2\AHkr2A" hA6h"($y1;s%9ȅ hAQ܆|ڗ4x{=ա,Eeg{ձ*Jek$v(m6l~co#d@ˢUEkIH=5k=:X@ @ŷ|%ۓ𼊠_ SW`- 6!5/AMr;X@ )ھ[A0˂[Xc ,q@Z~ KelK ,p@Wl;&>Ũ-{n")x@+խkޞs( h)$Q&Wʘ>_)Q(V $T&@/ɍ/l`R fg@@` %b>6O1*j hMv\{ L`*E$h.o(1'wf sIrg@pqA[ XF9RLhϑ$AA&)Yǔ^~2-R~$׫@Ta4li~.u!_S8 hPmEcEN E-̯ n*6!j5߰3u{Pd7 hM[gCέ!,aڸ*6e&DJJ+[L*(j-Y\ mƫ@DuR I>LW䪝Y/kP @pq9BMq x-#*VD Yzumc/ @ZeR͙17tqW#& $A'EڧasٳVRc @ZQaZN7Tڙg hEmѦԧh*Jm t@b^Њ"2) :j`R[.cm>3NV@ڬTDtUa 4hh'YDP : $g Ђ @kRd7NR8@JmH@ XωpP &'ۥ~^^ -`F<ϝb dh)|h %^o}xz1Z S$dRvAc$QhJ ]]hPؠ%ԄA9P5um\ P *[4dq䯯2JJxNJp)u:dE HhC(@6-^H6R,{͠q|2Mb>tFU Њih:$j13>n,lf߶Ct' fUWNULc۬#FRZ.] PVmksWaN@AosEB(@e1uɥ$l_ Ud2L}ݾߘzʞo1[ Ђ!/ bok;*h%@꽦x50ˍC4 ZAH.{ၥ ƕ4h`bQd Fq >/"̚g&f$n-^4{!.A)r.MԱ @YaZb`!{yÉ/" C?lZ&-3n]dޓϊWVga[A +!5 x hBˆҍ`'=cfD);𡫻P FBgi_{w,%kWWᴅgAr\fohO\͹18b?^2Arc7? tmǏ"}9j%P "<·:`8ChI/ix; .Ny{?$Z(Gp¬Q)+ 3ǸwQ[w@Y\FFҖ.K'r'udgaS#j\-oY,ʡ䟅m_}a-(),6 UXj B}$Tǧ{kGusա-ZXU|$?Yn:E EY4Fp#+zp2i䚤X{Q,bYgac ߅gF-Ew*V7fٙ;3Y[ B\^k QĜE  Y \ ȧTWdŮܐUmw^ 6u$TRM{Ƙۃ-ǫ!UQSdol،Uܐ v8OZw! N 閿~dx#XS6IZ|aZfh6ib3T >-&j/1˴<Vp҄fBD~\Ttk4Xft*hE&!B|Mb<=*AњAʄn˅$ܫZ ҰRFե_]߳J Z)&O[a~5!NhLJSbhBf#/ U݂csbCߣ@B~*0VpB">L%ۜ፽ Z g)ALb%<"+Rh'u8K`6Q1<[܍m> A zd-e%##f%7ZPP)4z'QQl7>,faC2azx zahAp60jW%kKB/8bwD },pVD VH* yq]ȦDE*huK7ENn30| X0LKc;%C(I+8 'B:AClHr]4uE>6 $)wx?& bh@ZP2t~cRI ,'* hAe”$*ol%D